]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR lto/69133 (LTO segfault in lto_get_decl_name_mapping() on 483.xalancbmk with...
authorJan Hubicka <hubicka@ucw.cz>
Tue, 19 Jan 2016 11:57:41 +0000 (12:57 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 19 Jan 2016 11:57:41 +0000 (11:57 +0000)
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.
* g++.dg/lto/pr69133_0.C: New testcase.
* g++.dg/lto/pr69133_1.C: New testcase.

From-SVN: r232552

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 b2423f24b611f1ce5ccd876a8990768b0a73e187..717330d16fc072bf63c50f9a58d0ce625b2c9ea3 100644 (file)
@@ -1,3 +1,11 @@
+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
index 0d70904b5e8ceac49eeb966d23010e09827a8285..5331f7f373b23569a8f02fd32eb314fda7e201e8 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 950f6c5c917a2e3cd13abd9f573dac5fd325ff99..2c49d7b0ac533d0e632566989229088e5503594f 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 fc476b96b8062f283585bb5af00e50133481f44c..6f9a2a64c1b912818404a778eb8786ba310aecea 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 &) {}
+}
+