From: Per Bothner Date: Tue, 28 Feb 1995 23:05:01 +0000 (-0800) Subject: expr.c (expand_expr): If non-local variable is expanded... X-Git-Tag: misc/cutover-egcs-0~4861 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7c38c3ad5e0d6123089abf8249641df57aab5f42;p=thirdparty%2Fgcc.git expr.c (expand_expr): If non-local variable is expanded... * 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 --- diff --git a/gcc/expr.c b/gcc/expr.c index cd0472d1cb70..7787593c5c5b 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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);