OSDN Git Service

* output.h (current_function_has_computed_jump): Rename from
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Feb 1999 21:39:33 +0000 (21:39 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Feb 1999 21:39:33 +0000 (21:39 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25100 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expr.c
gcc/function.c
gcc/function.h
gcc/integrate.c
gcc/output.h
gcc/rtl.h
gcc/stmt.c

index 6883675..6a6e1ab 100644 (file)
@@ -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
index 4b53a55..5eca5f5 100644 (file)
@@ -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),
index 1b692c1..c9ec569 100644 (file)
@@ -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;
index e5295e9..2a3e823 100644 (file)
@@ -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;
index c001e78..e9c3561 100644 (file)
@@ -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;
index a1cf569..3a34371 100644 (file)
@@ -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 */
 
index bb36e4e..f036a6f 100644 (file)
--- 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.  */
index ab7a5cf..62f880d 100644 (file)
@@ -593,6 +593,8 @@ expand_computed_goto (exp)
 
   do_pending_stack_adjust ();
   emit_indirect_jump (x);
+
+  current_function_has_computed_jump = 1;
 }
 \f
 /* Handle goto statements and the labels that they can go to.  */