(expand_expr, case *_DECL): If we make a non-local reference from a function with...
authorJason Merrill <merrill@gnu.org>
Tue, 5 Mar 1996 22:16:33 +0000 (22:16 +0000)
committerJason Merrill <merrill@gnu.org>
Tue, 5 Mar 1996 22:16:33 +0000 (22:16 +0000)
(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
gcc/function.c

index 14698eb9cf86d802d157b7e4f2edae4b056cfc5e..890946c51b79745f9f3831179a13224b45d9efa6 100644 (file)
@@ -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);
index cf94c777830217fa4b1330b0301a491a4d54973e..bdbfa541c2935aed5138a052029cc1573c7ead0e 100644 (file)
@@ -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;