Commit 23700f65 by Alexandre Oliva Committed by Alexandre Oliva

c-decl.c (duplicate_decls): Revert rth's patch.

* c-decl.c (duplicate_decls): Revert rth's patch.  If newdecl
is in a different binding level, get its abstract origin to be
olddecl.
* tree-inline.c (expand_call_inline): Move DECL_INITIAL sanity
check earlier.
* tree.c (get_callee_fndecl): Follow DECL_ABSTRACT_ORIGIN if
DECL_INITIAL is NULL.

From-SVN: r47610
parent 961eacce
2001-12-04 Alexandre Oliva <aoliva@redhat.com> 2001-12-04 Alexandre Oliva <aoliva@redhat.com>
* c-decl.c (duplicate_decls): Revert rth's patch. If newdecl
is in a different binding level, get its abstract origin to be
olddecl.
* tree-inline.c (expand_call_inline): Move DECL_INITIAL sanity
check earlier.
* tree.c (get_callee_fndecl): Follow DECL_ABSTRACT_ORIGIN if
DECL_INITIAL is NULL.
* stmt.c (expand_expr_stmt): Keep last_expr_value non-NULL iff * stmt.c (expand_expr_stmt): Keep last_expr_value non-NULL iff
we're interested in the result. Use it to tell whether to we're interested in the result. Use it to tell whether to
ignore results of enclosed expressions. ignore results of enclosed expressions.
......
...@@ -2019,14 +2019,15 @@ duplicate_decls (newdecl, olddecl, different_binding_level) ...@@ -2019,14 +2019,15 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
DECL_INITIAL, so that we don't accidentally change function DECL_INITIAL, so that we don't accidentally change function
declarations into function definitions. */ declarations into function definitions. */
if (! different_binding_level) if (! different_binding_level)
{ DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
}
DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl); DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl);
DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
if (DECL_INLINE (newdecl)) if (DECL_INLINE (newdecl))
DECL_ABSTRACT_ORIGIN (newdecl) = DECL_ABSTRACT_ORIGIN (olddecl); DECL_ABSTRACT_ORIGIN (newdecl)
= (different_binding_level
? DECL_ORIGIN (olddecl)
: DECL_ABSTRACT_ORIGIN (olddecl));
} }
} }
if (different_binding_level) if (different_binding_level)
......
...@@ -864,6 +864,10 @@ expand_call_inline (tp, walk_subtrees, data) ...@@ -864,6 +864,10 @@ expand_call_inline (tp, walk_subtrees, data)
id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0); DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
if (! DECL_INITIAL (fn)
|| TREE_CODE (DECL_INITIAL (fn)) != BLOCK)
abort ();
/* Create a block to put the parameters in. We have to do this /* Create a block to put the parameters in. We have to do this
after the parameters have been remapped because remapping after the parameters have been remapped because remapping
parameters is different from remapping ordinary variables. */ parameters is different from remapping ordinary variables. */
...@@ -894,9 +898,6 @@ expand_call_inline (tp, walk_subtrees, data) ...@@ -894,9 +898,6 @@ expand_call_inline (tp, walk_subtrees, data)
/* Close the block for the parameters. */ /* Close the block for the parameters. */
scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn)); scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn));
SCOPE_NO_CLEANUPS_P (scope_stmt) = 1; SCOPE_NO_CLEANUPS_P (scope_stmt) = 1;
if (! DECL_INITIAL (fn)
|| TREE_CODE (DECL_INITIAL (fn)) != BLOCK)
abort ();
remap_block (scope_stmt, NULL_TREE, id); remap_block (scope_stmt, NULL_TREE, id);
STMT_EXPR_STMT (expr) STMT_EXPR_STMT (expr)
= chainon (STMT_EXPR_STMT (expr), scope_stmt); = chainon (STMT_EXPR_STMT (expr), scope_stmt);
......
...@@ -4378,7 +4378,14 @@ get_callee_fndecl (call) ...@@ -4378,7 +4378,14 @@ get_callee_fndecl (call)
that `f' is being called. */ that `f' is being called. */
if (TREE_CODE (addr) == ADDR_EXPR if (TREE_CODE (addr) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL) && TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL)
return TREE_OPERAND (addr, 0); {
addr = TREE_OPERAND (addr, 0);
if (! DECL_INITIAL (addr) && DECL_ABSTRACT_ORIGIN (addr))
addr = DECL_ABSTRACT_ORIGIN (addr);
return addr;
}
/* We couldn't figure out what was being called. */ /* We couldn't figure out what was being called. */
return NULL_TREE; return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment