See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48344 for the original
problem report. The error resulted because gcc's processing of
command-line options within gcc initialization code originally preceded
the processing of target-specific configuration hooks.
In the unpatched gcc implementation, the Pmode (pointer mode) variable
has not been initialized at the time the -fstack-limit-register
command-line option is processed. As a consequence, the stack-limiting
register is not assigned a proper mode. Thus, rtl instructions that
make use of this stack-limiting register have an unspecified mode, and
are therefore not matched by any known instructions.
The fix represented in this patch is to move the invocation of
process_options () from within the implementation of do_compile () to
immediately preceding the invocation of handle_common_deferred_options
() (inside toplev::main ()).
gcc/ChangeLog:
2016-01-14 Kelvin Nilsen <kel...@gcc.gnu.org>
* toplev.c (do_compile): remove invocation of process_options ()
from within do_compile ()
(toplev::main): insert invocation of process_options () before
invocation of handle_common_deferred_options ().
gcc/testsuite/ChangeLog:
2016-01-14 Kelvin Nilsen <kel...@gcc.gnu.org>
* gcc.dg/pr48344-1.c: New test.
Index: gcc/toplev.c
===================================================================
--- gcc/toplev.c (revision 232135)
+++ gcc/toplev.c (working copy)
@@ -1938,8 +1938,6 @@ standard_type_bitsize (int bitsize)
static void
do_compile ()
{
- process_options ();
-
/* Don't do any more if an error has already occurred. */
if (!seen_error ())
{
@@ -2072,6 +2070,11 @@ toplev::main (int argc, char **argv)
save_decoded_options, save_decoded_options_count,
UNKNOWN_LOCATION, global_dc);
+ /* process_options() must execute before handle_common_deferred_options()
+ because handle_common_deferred_options() makes use of variables
+ initialized by process_options() (e.g. Pmode) */
+ process_options ();
+
handle_common_deferred_options ();
init_local_tick ();
Index: gcc/testsuite/gcc.dg/pr48344-1.c
===================================================================
--- gcc/testsuite/gcc.dg/pr48344-1.c (revision 0)
+++ gcc/testsuite/gcc.dg/pr48344-1.c (revision 232374)
@@ -0,0 +1,12 @@
+/* specifying stack-limit-register = r2 is only
+ meaningful on certain architectures */
+/* { target { powerpc*-*-* } } */
+/* { dg-do compile } */
+/* { dg-options "-fstack-limit-register=r2" } */
+void foo ()
+{
+ int N = 2;
+ int slots[N];
+
+}
+