aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2005-12-11 04:16:32 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2005-12-11 04:16:32 +0000
commit40805a12e405901308cf4ac839b0e15e15c9c7a1 (patch)
tree550fac8da22e222e4f83bafd10f69af38ff31f7b
parent92aed1cbf42362b47fa6db66122d33278d7a4ea3 (diff)
downloadgcc-40805a12e405901308cf4ac839b0e15e15c9c7a1.zip
gcc-40805a12e405901308cf4ac839b0e15e15c9c7a1.tar.gz
gcc-40805a12e405901308cf4ac839b0e15e15c9c7a1.tar.bz2
re PR c++/25010 (Segmentation fault (infinite recursion in cgraph_clone_inlined_nodes))
PR c++/25010 * ipa-inline.c (cgraph_clone_inlined_nodes): Do not assume that DECL_EXTERNAL functions have no bodies. Tidy. PR c++/25010 * g++.dg/opt/inline10.C: New test. From-SVN: r108375
-rw-r--r--gcc/ipa-inline.c36
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/inline10.C20
3 files changed, 44 insertions, 17 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index c16e947..ceadb23 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -115,24 +115,26 @@ cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
void
cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original)
{
- struct cgraph_node *n;
-
- /* We may eliminate the need for out-of-line copy to be output. In that
- case just go ahead and re-use it. */
- if (!e->callee->callers->next_caller
- && (!e->callee->needed || DECL_EXTERNAL (e->callee->decl))
- && duplicate
- && flag_unit_at_a_time)
+ if (duplicate)
{
- gcc_assert (!e->callee->global.inlined_to);
- if (!DECL_EXTERNAL (e->callee->decl))
- overall_insns -= e->callee->global.insns, nfunctions_inlined++;
- duplicate = 0;
- }
- else if (duplicate)
- {
- n = cgraph_clone_node (e->callee, e->count, e->loop_nest, update_original);
- cgraph_redirect_edge_callee (e, n);
+ /* We may eliminate the need for out-of-line copy to be output.
+ In that case just go ahead and re-use it. */
+ if (!e->callee->callers->next_caller
+ && !e->callee->needed
+ && flag_unit_at_a_time)
+ {
+ gcc_assert (!e->callee->global.inlined_to);
+ if (DECL_SAVED_TREE (e->callee->decl))
+ overall_insns -= e->callee->global.insns, nfunctions_inlined++;
+ duplicate = false;
+ }
+ else
+ {
+ struct cgraph_node *n;
+ n = cgraph_clone_node (e->callee, e->count, e->loop_nest,
+ update_original);
+ cgraph_redirect_edge_callee (e, n);
+ }
}
if (e->caller->global.inlined_to)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5edcf7d..28b6eda 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-12-10 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/25010
+ * g++.dg/opt/inline10.C: New test.
+
2005-12-11 Steven G. Kargl <kargls@comcast.net>
* gfortran.dg/g77/19981216-0.f: Fix for fortran/25068.
diff --git a/gcc/testsuite/g++.dg/opt/inline10.C b/gcc/testsuite/g++.dg/opt/inline10.C
new file mode 100644
index 0000000..086a481
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/inline10.C
@@ -0,0 +1,20 @@
+// PR c++/25010
+// { dg-options "-O2" }
+
+#pragma interface
+
+struct T
+{
+ T *p;
+
+ void baz ()
+ {
+ p->baz ();
+ }
+};
+
+void foo (T *p)
+{
+ p->baz ();
+}
+