diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2016-01-19 12:57:41 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2016-01-19 11:57:41 +0000 |
commit | e9191ad3ab89826936060c5e13800ce6be4f650c (patch) | |
tree | f304db9cdc8550c316d6ea4709de8f5b53d0d35d | |
parent | 150be262b98a8601cbc470c789c5b7b0907ddfb4 (diff) | |
download | gcc-e9191ad3ab89826936060c5e13800ce6be4f650c.zip gcc-e9191ad3ab89826936060c5e13800ce6be4f650c.tar.gz gcc-e9191ad3ab89826936060c5e13800ce6be4f650c.tar.bz2 |
re PR lto/69133 (LTO segfault in lto_get_decl_name_mapping() on 483.xalancbmk with -flto-partition=none)
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
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cgraph.c | 6 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr69133_0.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr69133_1.C | 22 |
6 files changed, 62 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b2423f2..717330d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 0d70904..5331f7f 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -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); diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 950f6c5..2c49d7b 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fc476b9..6f9a2a6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..bd66707 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr69133_0.C @@ -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 index 0000000..24c477d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr69133_1.C @@ -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 &) {} +} + |