PR lto/69133
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jan 2016 11:57:41 +0000 (11:57 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jan 2016 11:57:41 +0000 (11:57 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232552 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr69133_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr69133_1.C [new file with mode: 0644]

index b2423f2..717330d 100644 (file)
@@ -1,5 +1,13 @@
 2016-01-19  Jan Hubicka  <hubicka@ucw.cz>
 
+       PR lto/69133
+       * 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.
+       
+2016-01-19  Jan Hubicka  <hubicka@ucw.cz>
+
        * lto-streamer-out.c (lto_output): Do not stream instrumentation
        thunks.
 
index 0d70904..5331f7f 100644 (file)
@@ -3305,10 +3305,12 @@ cgraph_node::get_untransformed_body (void)
   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 950f6c5..2c49d7b 100644 (file)
@@ -1664,7 +1664,9 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
       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 fc476b9..6f9a2a6 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-19  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR lto/69133
+       * g++.dg/lto/pr69133_0.C: New testcase.
+       * g++.dg/lto/pr69133_1.C: New testcase.
+
 2016-01-15  Jeff Law  <law@redhat.com>
 
        PR tree-optimization/69320
diff --git a/gcc/testsuite/g++.dg/lto/pr69133_0.C b/gcc/testsuite/g++.dg/lto/pr69133_0.C
new file mode 100644 (file)
index 0000000..bd66707
--- /dev/null
@@ -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();
+}
+}
+
diff --git a/gcc/testsuite/g++.dg/lto/pr69133_1.C b/gcc/testsuite/g++.dg/lto/pr69133_1.C
new file mode 100644 (file)
index 0000000..24c477d
--- /dev/null
@@ -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 &) {}
+}
+