aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1996-03-05 22:16:33 +0000
committerJason Merrill <merrill@gnu.org>1996-03-05 22:16:33 +0000
commit38ee6ed95695e80b1669aea25f9cab12996d00e7 (patch)
tree5dac2507bbc99be1baffaabf877fe301b37600e9
parente115e436ee2b1cac30275826e7bfa6221fa0efa5 (diff)
downloadgcc-38ee6ed95695e80b1669aea25f9cab12996d00e7.zip
gcc-38ee6ed95695e80b1669aea25f9cab12996d00e7.tar.gz
gcc-38ee6ed95695e80b1669aea25f9cab12996d00e7.tar.bz2
(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
-rw-r--r--gcc/expr.c5
-rw-r--r--gcc/function.c8
2 files changed, 9 insertions, 4 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 14698eb..890946c 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 cf94c77..bdbfa54 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;