Commit ecf835e9 by Kelvin Nilsen

re PR target/48344 (powerpc ICE with -fstack-limit-register=r2)

[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
parent 49a1164a
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> 2016-02-16 Jakub Jelinek <jakub@redhat.com>
PR c/69835 PR c/69835
......
...@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -57,6 +57,7 @@ along with GCC; see the file COPYING3. If not see
#include "builtins.h" #include "builtins.h"
#include "rtl-iter.h" #include "rtl-iter.h"
#include "stor-layout.h" #include "stor-layout.h"
#include "opts.h"
struct target_rtl default_target_rtl; struct target_rtl default_target_rtl;
#if SWITCHABLE_TARGET #if SWITCHABLE_TARGET
...@@ -5895,6 +5896,13 @@ init_emit_once (void) ...@@ -5895,6 +5896,13 @@ init_emit_once (void)
/* Create the unique rtx's for certain rtx codes and operand values. */ /* 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 /* Don't use gen_rtx_CONST_INT here since gen_rtx_CONST_INT in this case
tries to use these variables. */ tries to use these variables. */
for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++) for (i = - MAX_SAVED_CONST_INT; i <= MAX_SAVED_CONST_INT; i++)
......
...@@ -310,6 +310,10 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set, ...@@ -310,6 +310,10 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
finish_options (opts, opts_set, loc); 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 /* Process common options that have been deferred until after the
handlers have been called for all options. */ handlers have been called for all options. */
...@@ -417,12 +421,18 @@ handle_common_deferred_options (void) ...@@ -417,12 +421,18 @@ handle_common_deferred_options (void)
if (reg < 0) if (reg < 0)
error ("unrecognized register name %qs", opt->arg); error ("unrecognized register name %qs", opt->arg);
else 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; break;
case OPT_fstack_limit_symbol_: 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; break;
case OPT_fasan_shadow_offset_: case OPT_fasan_shadow_offset_:
......
...@@ -296,6 +296,10 @@ struct cl_option_handlers ...@@ -296,6 +296,10 @@ struct cl_option_handlers
struct cl_option_handler_func handlers[3]; 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. */ /* Input file names. */
extern const char **in_fnames; extern const char **in_fnames;
......
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> 2015-02-16 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/69742 PR fortran/69742
......
/* { dg-do compile } */
/* { dg-options "-fstack-limit-register=r2" } */
void foo ()
{
int N = 2;
int slots[N];
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment