From 38ee6ed95695e80b1669aea25f9cab12996d00e7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 5 Mar 1996 22:16:33 +0000 Subject: [PATCH] (expand_expr, case *_DECL): If we make a non-local reference from a function with DECL_NO_STATIC_CHAIN set, abort. (expand_expr, case *_DECL): If we make a non-local reference from a function with DECL_NO_STATIC_CHAIN set, abort. (expand_expr, case ADDR_EXPR): We don't need a trampoline for a function with DECL_NO_STATIC_CHAIN set. From-SVN: r11461 --- gcc/expr.c | 5 ++++- gcc/function.c | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/gcc/expr.c b/gcc/expr.c index 14698eb9cf8..890946c51b7 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -4678,6 +4678,8 @@ expand_expr (exp, target, tmode, modifier) /* Mark as non-local and addressable. */ DECL_NONLOCAL (exp) = 1; + if (DECL_NO_STATIC_CHAIN (current_function_decl)) + abort (); mark_addressable (exp); if (GET_CODE (DECL_RTL (exp)) != MEM) abort (); @@ -6770,7 +6772,8 @@ 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) + && decl_function_context (TREE_OPERAND (exp, 0)) != 0 + && ! DECL_NO_STATIC_CHAIN (TREE_OPERAND (exp, 0))) { op0 = trampoline_address (TREE_OPERAND (exp, 0)); op0 = force_operand (op0, target); diff --git a/gcc/function.c b/gcc/function.c index cf94c777830..bdbfa541c29 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -4379,9 +4379,10 @@ lookup_static_chain (decl) tree context = decl_function_context (decl); tree link; - if (context == 0) + if (context == 0 + || (TREE_CODE (decl) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (decl))) return 0; - + /* We treat inline_function_decl as an alias for the current function because that is the inline function whose vars, types, etc. are being merged into the current function. @@ -4851,7 +4852,8 @@ init_function_start (subr, filename, line) /* Nonzero if this is a nested function that uses a static chain. */ current_function_needs_context - = (decl_function_context (current_function_decl) != 0); + = (decl_function_context (current_function_decl) != 0 + && ! DECL_NO_STATIC_CHAIN (current_function_decl)); /* Set if a call to setjmp is seen. */ current_function_calls_setjmp = 0; -- 2.30.2