]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
expr.c (expand_expr): If non-local variable is expanded...
authorPer Bothner <bothner@gcc.gnu.org>
Tue, 28 Feb 1995 23:05:01 +0000 (15:05 -0800)
committerPer Bothner <bothner@gcc.gnu.org>
Tue, 28 Feb 1995 23:05:01 +0000 (15:05 -0800)
* expr.c (expand_expr):  If non-local variable is expanded,
set FUNCTION_NEEDS_STATIC_CHAIN (current_function_decl).
* expr.c (expand_expr case ADDR_EXPR):  Check for trampoline
using FUNCTION_NEEDS_STATIC_CHAIN, instead of decl_function_context.

From-SVN: r9095

gcc/expr.c

index cd0472d1cb704e30c1fd14b585f58609f766b154..7787593c5c5bc5a22f6049d4065bf53f2c7720c6 100644 (file)
@@ -4148,6 +4148,15 @@ expand_expr (exp, target, tmode, modifier)
 
          /* Mark as non-local and addressable.  */
          DECL_NONLOCAL (exp) = 1;
+
+         /* This is currently too late to be useful, since
+            init_function_start needs to know whether a static chain
+            is needed. However, it would be a useful optimization
+            if we could defer setting up static chains and trampolines
+            until we see that we actually need them due to references
+            to non-local non-static variables.  */
+         FUNCTION_NEEDS_STATIC_CHAIN (current_function_decl) = 1;
+
          mark_addressable (exp);
          if (GET_CODE (DECL_RTL (exp)) != MEM)
            abort ();
@@ -6178,7 +6187,7 @@ expand_expr (exp, target, tmode, modifier)
 
       /* Are we taking the address of a nested function?  */
       if (TREE_CODE (TREE_OPERAND (exp, 0)) == FUNCTION_DECL
-         && decl_function_context (TREE_OPERAND (exp, 0)) != 0)
+         && FUNCTION_NEEDS_STATIC_CHAIN (TREE_OPERAND (exp, 0)))
        {
          op0 = trampoline_address (TREE_OPERAND (exp, 0));
          op0 = force_operand (op0, target);