aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-02-08 13:39:33 -0800
committerRichard Henderson <rth@gcc.gnu.org>1999-02-08 13:39:33 -0800
commitacd693d10c5d694eb221071d0b171edbada6202a (patch)
tree7741976eef8dfd7090489ac85cbac76e34a04fc5 /gcc
parent6ffc8580a7098be91a58d8aeca413fc7e2d61def (diff)
downloadgcc-acd693d10c5d694eb221071d0b171edbada6202a.zip
gcc-acd693d10c5d694eb221071d0b171edbada6202a.tar.gz
gcc-acd693d10c5d694eb221071d0b171edbada6202a.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/expr.c2
-rw-r--r--gcc/function.c11
-rw-r--r--gcc/function.h2
-rw-r--r--gcc/integrate.c21
-rw-r--r--gcc/output.h5
-rw-r--r--gcc/rtl.h2
-rw-r--r--gcc/stmt.c2
8 files changed, 35 insertions, 26 deletions
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 <rth@cygnus.com>
+
+ * 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 <meissner@cygnus.com>
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 bb36e4eb..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. */