aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2001-12-04 10:34:40 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2001-12-04 10:34:40 +0000
commit23700f650874c9406df42967f0ede7c3f203dc82 (patch)
tree5f796d4a540cf14b9ff9cbc2a69e91812776ca98 /gcc
parent961eacce43e97fa61b625d38480a89927faa64d8 (diff)
downloadgcc-23700f650874c9406df42967f0ede7c3f203dc82.zip
gcc-23700f650874c9406df42967f0ede7c3f203dc82.tar.gz
gcc-23700f650874c9406df42967f0ede7c3f203dc82.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-decl.c11
-rw-r--r--gcc/tree-inline.c7
-rw-r--r--gcc/tree.c9
4 files changed, 26 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a278714..26bed22 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
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
we're interested in the result. Use it to tell whether to
ignore results of enclosed expressions.
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 654e184..3427854 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -2019,14 +2019,15 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
DECL_INITIAL, so that we don't accidentally change function
declarations into function definitions. */
if (! different_binding_level)
- {
- DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
- DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
- }
+ DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl);
+ DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
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)
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 3adbf34..f82c8c9 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -864,6 +864,10 @@ expand_call_inline (tp, walk_subtrees, data)
id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
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
after the parameters have been remapped because remapping
parameters is different from remapping ordinary variables. */
@@ -894,9 +898,6 @@ expand_call_inline (tp, walk_subtrees, data)
/* Close the block for the parameters. */
scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn));
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);
STMT_EXPR_STMT (expr)
= chainon (STMT_EXPR_STMT (expr), scope_stmt);
diff --git a/gcc/tree.c b/gcc/tree.c
index 3cc52c0..87dac2d 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4378,7 +4378,14 @@ get_callee_fndecl (call)
that `f' is being called. */
if (TREE_CODE (addr) == ADDR_EXPR
&& 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. */
return NULL_TREE;