This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Fix ICE in get_untransformed_body


Hi,
this patch fixes confusion of cgraph_node::get_untransformed_body about thunks
so we do not try to stream them in twice.

Honza

	* cgraphunit.c (cgraph_node::expand_thunk): When forcing gimple
	assume that the node has body.
	* cgraph.c (cgraph_node::get_untransformed_body): Use gimple_body_p
	check.
	* g++.dg/lto/pr69133_0.C: New testcase.
	* g++.dg/lto/pr69133_1.C: New testcase.
Index: cgraphunit.c
===================================================================
--- cgraphunit.c	(revision 232466)
+++ cgraphunit.c	(working copy)
@@ -1664,7 +1666,9 @@ cgraph_node::expand_thunk (bool output_a
       greturn *ret;
       bool alias_is_noreturn = TREE_THIS_VOLATILE (alias);
 
-      if (in_lto_p)
+      /* We may be called from expand_thunk that releses body except for
+	 DECL_ARGUMENTS.  In this case force_gimple_thunk is true.  */
+      if (in_lto_p && !force_gimple_thunk)
 	get_untransformed_body ();
       a = DECL_ARGUMENTS (thunk_fndecl);
 
Index: testsuite/g++.dg/lto/pr69133_0.C
===================================================================
--- testsuite/g++.dg/lto/pr69133_0.C	(revision 0)
+++ testsuite/g++.dg/lto/pr69133_0.C	(revision 0)
@@ -0,0 +1,19 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -O2 } } }
+// { dg-extra-ld-options "-r -nostdlib -flto -flto-partition=none -O2" }
+namespace xercesc_3_1 {
+class XMLEntityHandler {
+public:
+  virtual ~XMLEntityHandler();
+  virtual void m_fn1();
+  virtual bool m_fn2();
+  virtual void m_fn3();
+  virtual int m_fn4();
+  virtual void m_fn5();
+} * a;
+void fn1() {
+  a->m_fn5();
+  a->m_fn1();
+}
+}
+
Index: testsuite/g++.dg/lto/pr69133_1.C
===================================================================
--- testsuite/g++.dg/lto/pr69133_1.C	(revision 0)
+++ testsuite/g++.dg/lto/pr69133_1.C	(revision 0)
@@ -0,0 +1,22 @@
+namespace xercesc_3_1 {
+class A {
+  virtual void m_fn1();
+};
+class XMLEntityHandler {
+public:
+  virtual ~XMLEntityHandler();
+  virtual void m_fn2(const int &);
+  virtual bool m_fn3();
+  virtual void m_fn4();
+  virtual int m_fn5() = 0;
+  virtual void m_fn6(const int &);
+};
+class B : A, XMLEntityHandler {};
+class C : B {
+  void m_fn2(const int &);
+  void m_fn6(const int &);
+};
+void C::m_fn2(const int &) {}
+void C::m_fn6(const int &) {}
+}
+
Index: cgraph.c
===================================================================
--- cgraph.c	(revision 232466)
+++ cgraph.c	(working copy)
@@ -3305,10 +3300,12 @@ cgraph_node::get_untransformed_body (voi
   size_t len;
   tree decl = this->decl;
 
-  if (DECL_RESULT (decl))
+  /* Check if body is already there.  Either we have gimple body or
+     the function is thunk and in that case we set DECL_ARGUMENTS.  */
+  if (DECL_ARGUMENTS (decl) || gimple_has_body_p (decl))
     return false;
 
-  gcc_assert (in_lto_p);
+  gcc_assert (in_lto_p && !DECL_RESULT (decl));
 
   timevar_push (TV_IPA_LTO_GIMPLE_IN);
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]