]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/48344 (powerpc ICE with -fstack-limit-register=r2)
authorKelvin Nilsen <kelvin@gcc.gnu.org>
Tue, 16 Feb 2016 23:12:19 +0000 (23:12 +0000)
committerKelvin Nilsen <kelvin@gcc.gnu.org>
Tue, 16 Feb 2016 23:12:19 +0000 (23:12 +0000)
[gcc]

2016-02-16  Kelvin Nilsen  <kelvin@gcc.gnu.org>

PR Target/48344
* opts-global.c (handle_common_deferred_options): Introduce and
initialize two global variables to remember command-line options
specifying a stack-limiting register.
* opts.h: Add extern declarations of the two new global variables.
* emit-rtl.c (init_emit_once): Initialize the stack_limit_rtx
variable based on the values of the two new global variables.

[gcc/testsuite]

2016-02-16  Kelvin Nilsen  <kelvin@gcc.gnu.org>

PR Target/48344
* gcc.target/powerpc/pr48344-1.c: New test.

From-SVN: r233477

gcc/ChangeLog
gcc/emit-rtl.c
gcc/opts-global.c
gcc/opts.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr48344-1.c [new file with mode: 0644]

index 29302b03d746cecd1c34eec59bd5e192ccf46b38..aec472c9532266b47429f6a199c99b538f1f7254 100644 (file)
@@ -1,3 +1,13 @@
+2016-02-16  Kelvin Nilsen  <kelvin@gcc.gnu.org>
+
+       PR Target/48344
+       * opts-global.c (handle_common_deferred_options): Introduce and
+       initialize two global variables to remember command-line options
+       specifying a stack-limiting register.
+       * opts.h: Add extern declarations of the two new global variables. 
+       * emit-rtl.c (init_emit_once): Initialize the stack_limit_rtx
+       variable based on the values of the two new global variables.
+
 2016-02-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/69835
index ba99487870a2ff2c2590fb0d9168d1a5ded6076f..0fcd9d95e5b412d3a1bd3758591794bb2ed2e78c 100644 (file)
@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "builtins.h"
 #include "rtl-iter.h"
 #include "stor-layout.h"
+#include "opts.h"
 
 struct target_rtl default_target_rtl;
 #if SWITCHABLE_TARGET
@@ -5895,6 +5896,13 @@ init_emit_once (void)
 
   /* Create the unique rtx's for certain rtx codes and operand values.  */
 
+  /* Process stack-limiting command-line options.  */
+  if (opt_fstack_limit_symbol_arg != NULL)
+    stack_limit_rtx 
+      = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (opt_fstack_limit_symbol_arg));
+  if (opt_fstack_limit_register_no >= 0)
+    stack_limit_rtx = gen_rtx_REG (Pmode, opt_fstack_limit_register_no);
+
   /* Don't use gen_rtx_CONST_INT here since gen_rtx_CONST_INT in this case
      tries to use these variables.  */
   for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
index 30874cdee762cdf905708e84cfb78cf043408d0d..b7e52323a21fb0e84c54bb52cc87587788c8fba4 100644 (file)
@@ -310,6 +310,10 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
   finish_options (opts, opts_set, loc);
 }
 
+/* Hold command-line options associated with stack limitation.  */
+const char *opt_fstack_limit_symbol_arg = NULL;
+int opt_fstack_limit_register_no = -1;
+
 /* Process common options that have been deferred until after the
    handlers have been called for all options.  */
 
@@ -417,12 +421,18 @@ handle_common_deferred_options (void)
            if (reg < 0)
              error ("unrecognized register name %qs", opt->arg);
            else
-             stack_limit_rtx = gen_rtx_REG (Pmode, reg);
+             {
+               /* Deactivate previous OPT_fstack_limit_symbol_ options.  */
+               opt_fstack_limit_symbol_arg = NULL;
+               opt_fstack_limit_register_no = reg;
+             }
          }
          break;
 
        case OPT_fstack_limit_symbol_:
-         stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (opt->arg));
+         /* Deactivate previous OPT_fstack_limit_register_ options.  */
+         opt_fstack_limit_register_no = -1;
+         opt_fstack_limit_symbol_arg = opt->arg;
          break;
 
        case OPT_fasan_shadow_offset_:
index fa479d83da52b57687c8adbce7ae5b4584e126ac..1b5cf448a2969cb23a487ed94f1f6bed395be2ff 100644 (file)
@@ -296,6 +296,10 @@ struct cl_option_handlers
   struct cl_option_handler_func handlers[3];
 };
 
+/* Hold command-line options associated with stack limitation.  */
+extern const char *opt_fstack_limit_symbol_arg;
+extern int opt_fstack_limit_register_no;
+
 /* Input file names.  */
 
 extern const char **in_fnames;
index a07182385faf9a11a61154e0665f5231be0a99b4..df83072ae35050f85b488b1d5d4aca59be70605c 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-16  Kelvin Nilsen  <kelvin@gcc.gnu.org>
+
+       PR Target/48344
+       * gcc.target/powerpc/pr48344-1.c: New test.
+
 2015-02-16  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/69742
diff --git a/gcc/testsuite/gcc.target/powerpc/pr48344-1.c b/gcc/testsuite/gcc.target/powerpc/pr48344-1.c
new file mode 100644 (file)
index 0000000..22f3070
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-fstack-limit-register=r2" } */
+void foo ()
+{
+  int N = 2;
+  int slots[N];
+
+}