From: Richard Henderson Date: Mon, 8 Feb 1999 21:39:33 +0000 (-0800) Subject: output.h (current_function_has_computed_jump): Rename from current_function_addresses... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=acd693d10c5d694eb221071d0b171edbada6202a;p=platform%2Fupstream%2Fgcc.git output.h (current_function_has_computed_jump): Rename from current_function_addresses_labels. * output.h (current_function_has_computed_jump): Rename from current_function_addresses_labels. * function.h (struct function): Likewise for addresses_labels member. * rtl.h (FUNCTION_FLAGS_HAS_COMPUTED_JUMP): Likewise. * function.c (current_function_has_computed_jump): Likewise. Update all references. * integrate.c (function_cannot_inline_p): Test current_function_has_computed_jump instead of addresses_labels. (initialize_for_inline): Likewise save. (output_inline_function): Likewise restore. * expr.c (expand_expr): Don't reference addresses_labels variables. * stmt.c (expand_computed_goto): Set has_computed_jump. From-SVN: r25100 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6883675..6a6e1ab 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +Mon Feb 8 21:36:44 1999 Richard Henderson + + * output.h (current_function_has_computed_jump): Rename from + current_function_addresses_labels. + * function.h (struct function): Likewise for addresses_labels member. + * rtl.h (FUNCTION_FLAGS_HAS_COMPUTED_JUMP): Likewise. + * function.c (current_function_has_computed_jump): Likewise. + Update all references. + * integrate.c (function_cannot_inline_p): + Test current_function_has_computed_jump instead of addresses_labels. + (initialize_for_inline): Likewise save. + (output_inline_function): Likewise restore. + + * expr.c (expand_expr): Don't reference addresses_labels variables. + * stmt.c (expand_computed_goto): Set has_computed_jump. + 1999-02-08 Michael Meissner This is being installed only to get it into the repository to help diff --git a/gcc/expr.c b/gcc/expr.c index 4b53a55..5eca5f5 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5603,12 +5603,10 @@ expand_expr (exp, target, tmode, modifier) p->forced_labels = gen_rtx_EXPR_LIST (VOIDmode, label_rtx (exp), p->forced_labels); - p->addresses_labels = 1; pop_obstacks (); } else { - current_function_addresses_labels = 1; if (modifier == EXPAND_INITIALIZER) forced_labels = gen_rtx_EXPR_LIST (VOIDmode, label_rtx (exp), diff --git a/gcc/function.c b/gcc/function.c index 1b692c1..c9ec569 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -148,10 +148,9 @@ int current_function_contains_functions; int current_function_sp_is_unchanging; -/* Nonzero if the function being compiled has the address of its - labels taken. */ +/* Nonzero if the function being compiled issues a computed jump. */ -int current_function_addresses_labels; +int current_function_has_computed_jump; /* Nonzero if the current function is a thunk (a lightweight function that just adjusts one of its arguments and forwards to another function), so @@ -525,7 +524,7 @@ push_function_context_to (context) p->has_nonlocal_label = current_function_has_nonlocal_label; p->has_nonlocal_goto = current_function_has_nonlocal_goto; p->contains_functions = current_function_contains_functions; - p->addresses_labels = current_function_addresses_labels; + p->has_computed_jump = current_function_has_computed_jump; p->is_thunk = current_function_is_thunk; p->args_size = current_function_args_size; p->pretend_args_size = current_function_pretend_args_size; @@ -598,7 +597,7 @@ pop_function_context_from (context) current_function_contains_functions = p->contains_functions || p->inline_obstacks || context == current_function_decl; - current_function_addresses_labels = p->addresses_labels; + current_function_has_computed_jump = p->has_computed_jump; current_function_name = p->name; current_function_decl = p->decl; current_function_pops_args = p->pops_args; @@ -5582,7 +5581,7 @@ init_function_start (subr, filename, line) current_function_has_nonlocal_goto = 0; current_function_contains_functions = 0; current_function_sp_is_unchanging = 0; - current_function_addresses_labels = 0; + current_function_has_computed_jump = 0; current_function_is_thunk = 0; current_function_returns_pcc_struct = 0; diff --git a/gcc/function.h b/gcc/function.h index e5295e9..2a3e823 100644 --- a/gcc/function.h +++ b/gcc/function.h @@ -80,7 +80,7 @@ struct function int has_nonlocal_label; int has_nonlocal_goto; int contains_functions; - int addresses_labels; + int has_computed_jump; int is_thunk; rtx nonlocal_goto_handler_slots; rtx nonlocal_goto_stack_level; diff --git a/gcc/integrate.c b/gcc/integrate.c index c001e78..e9c3561 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -182,16 +182,11 @@ function_cannot_inline_p (fndecl) return N_("function too large to be inline"); } - /* We cannot inline this function it has the addresses of its labels - taken. This can mean that a label in this function was used as an - initializer either statically or dynamically or stored outside the - function. Because labels can not be duplicated, all labels in the - function will be renamed when it is inlined. However, there is no way - to find and fix all variables initialized with addresses of labels in this - function, hence inlining is impossible. */ - - if (current_function_addresses_labels) - return N_("function with label addresses taken cannot inline"); + /* We will not inline a function which uses computed goto. The addresses of + its local labels, which may be tucked into global storage, are of course + not constant across instantiations, which causes unexpected behaviour. */ + if (current_function_has_computed_jump) + return N_("function with computed jump cannot inline"); /* We cannot inline a nested function that jumps to a nonlocal label. */ if (current_function_has_nonlocal_goto) @@ -303,7 +298,7 @@ initialize_for_inline (fndecl, min_labelno, max_labelno, max_reg, copy) + current_function_uses_const_pool * FUNCTION_FLAGS_USES_CONST_POOL + (current_function_uses_pic_offset_table * FUNCTION_FLAGS_USES_PIC_OFFSET_TABLE) - + current_function_addresses_labels * FUNCTION_FLAGS_ADDRESSES_LABELS); + + current_function_has_computed_jump * FUNCTION_FLAGS_HAS_COMPUTED_JUMP); /* Clear out PARMDECL_MAP. It was allocated in the caller's frame. */ bzero ((char *) parmdecl_map, max_parm_reg * sizeof (tree)); @@ -3388,8 +3383,8 @@ output_inline_function (fndecl) stack_slot_list = STACK_SLOT_LIST (head); forced_labels = FORCED_LABELS (head); - if (FUNCTION_FLAGS (head) & FUNCTION_FLAGS_ADDRESSES_LABELS) - current_function_addresses_labels = 1; + if (FUNCTION_FLAGS (head) & FUNCTION_FLAGS_HAS_COMPUTED_JUMP) + current_function_has_computed_jump = 1; if (FUNCTION_FLAGS (head) & FUNCTION_FLAGS_CALLS_ALLOCA) current_function_calls_alloca = 1; diff --git a/gcc/output.h b/gcc/output.h index a1cf569..3a34371 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -389,10 +389,9 @@ extern int current_function_contains_functions; extern int current_function_sp_is_unchanging; -/* Nonzero if the function being compiled has the address of its - labels taken. */ +/* Nonzero if the function being compiled issues a computed jump. */ -extern int current_function_addresses_labels; +extern int current_function_has_computed_jump; /* Nonzero if the current function returns a pointer type */ diff --git a/gcc/rtl.h b/gcc/rtl.h index bb36e4e..f036a6f 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -715,7 +715,7 @@ extern char *note_insn_name[]; #define FUNCTION_FLAGS_USES_CONST_POOL 0200 #define FUNCTION_FLAGS_CALLS_LONGJMP 0400 #define FUNCTION_FLAGS_USES_PIC_OFFSET_TABLE 01000 -#define FUNCTION_FLAGS_ADDRESSES_LABELS 02000 +#define FUNCTION_FLAGS_HAS_COMPUTED_JUMP 02000 /* Define a macro to look for REG_INC notes, but save time on machines where they never exist. */ diff --git a/gcc/stmt.c b/gcc/stmt.c index ab7a5cf..62f880d 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -593,6 +593,8 @@ expand_computed_goto (exp) do_pending_stack_adjust (); emit_indirect_jump (x); + + current_function_has_computed_jump = 1; } /* Handle goto statements and the labels that they can go to. */