aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-inline.c12
-rw-r--r--gcc/tree.c18
3 files changed, 18 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ce3c3b..1714191 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2001-12-06 Alexandre Oliva <aoliva@redhat.com>
+
+ * tree.c (get_callee_fndecl): Move DECL_ABSTRACT_ORIGIN-following...
+ * tree-inline.c (expand_call_inline): ... here.
+
2001-12-06 H.J. Lu <hjl@gnu.org>
* Makefile.in (.po.gmo): Use "-mkdir po" for parallel build.
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 1444edf..6cd1fbb 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -807,6 +807,18 @@ expand_call_inline (tp, walk_subtrees, data)
if (!fn)
return NULL_TREE;
+ /* If fn is a declaration of a function in a nested scope that was
+ globally declared inline, we don't set its DECL_INITIAL.
+ However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
+ C++ front-end uses it for cdtors to refer to their internal
+ declarations, that are not real functions. Fortunately those
+ don't have trees to be saved, so we can tell by checking their
+ DECL_SAVED_TREE. */
+ if (! DECL_INITIAL (fn)
+ && DECL_ABSTRACT_ORIGIN (fn)
+ && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
+ fn = DECL_ABSTRACT_ORIGIN (fn);
+
/* Don't try to inline functions that are not well-suited to
inlining. */
if (!inlinable_function_p (fn, id))
diff --git a/gcc/tree.c b/gcc/tree.c
index c21f913..b60fdc7 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4382,23 +4382,7 @@ get_callee_fndecl (call)
that `f' is being called. */
if (TREE_CODE (addr) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (addr, 0)) == FUNCTION_DECL)
- {
- tree fn = TREE_OPERAND (addr, 0);
-
- /* If fn is a declaration of a function in a nested scope that
- was globally declared inline, we don't set its DECL_INITIAL.
- However, we can't blindly follow DECL_ABSTRACT_ORIGIN because
- the C++ front-end uses it for cdtors to refer to their
- internal declarations, that are not real functions.
- Fortunately those don't have trees to be saved, so we can tell by
- checking their DECL_SAVED_TREE. */
- if (! DECL_INITIAL (fn)
- && DECL_ABSTRACT_ORIGIN (fn)
- && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
- fn = DECL_ABSTRACT_ORIGIN (fn);
-
- return fn;
- }
+ return TREE_OPERAND (addr, 0);
/* We couldn't figure out what was being called. */
return NULL_TREE;