diff options
author | Markus Trippelsdorf <markus@trippelsdorf.de> | 2014-02-04 17:25:38 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-02-04 17:25:38 +0000 |
commit | 8472fa801bfcc8cfcbd8848b0c86c3527a984fe9 (patch) | |
tree | 2dfd80c3d5ad38be932f5fb35f09f90abb05463b /gcc | |
parent | df98e37fb714b93c45f9d0ce38a15c779573f0e4 (diff) | |
download | gcc-8472fa801bfcc8cfcbd8848b0c86c3527a984fe9.zip gcc-8472fa801bfcc8cfcbd8848b0c86c3527a984fe9.tar.gz gcc-8472fa801bfcc8cfcbd8848b0c86c3527a984fe9.tar.bz2 |
re PR ipa/60058 (internal compiler error: Segmentation fault)
PR ipa/60058
* ipa-cp.c (ipa_get_indirect_edge_target_1): Check that target
is non-null.
* g++.dg/torture/pr60058.C: New testcase.
From-SVN: r207478
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr60058.C | 30 |
4 files changed, 56 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index baa8776..68ec962 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-02-04 Markus Trippelsdorf <markus@trippelsdorf.de> + + PR ipa/60058 + * ipa-cp.c (ipa_get_indirect_edge_target_1): Check that target + is non-null. + 2014-02-04 Jan Hubicka <hubicka@ucw.cz> * gimple-fold.c (can_refer_decl_in_current_unit_p): Default visibility is safe. diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 68afeb0..a2682bb 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1573,20 +1573,23 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, { target = gimple_get_virt_method_for_vtable (ie->indirect_info->otr_token, vtable, offset); - if ((TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE - && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE) - || !possible_polymorphic_call_target_p - (ie, cgraph_get_node (target))) + if (target) { - if (dump_file) - fprintf (dump_file, - "Type inconsident devirtualization: %s/%i->%s\n", - ie->caller->name (), ie->caller->order, - IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); - target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); - cgraph_get_create_node (target); + if ((TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE + && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE) + || !possible_polymorphic_call_target_p + (ie, cgraph_get_node (target))) + { + if (dump_file) + fprintf (dump_file, + "Type inconsident devirtualization: %s/%i->%s\n", + ie->caller->name (), ie->caller->order, + IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); + target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); + cgraph_get_create_node (target); + } + return target; } - return target; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e2d5ebc..028b911 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-04 Markus Trippelsdorf <markus@trippelsdorf.de> + + PR ipa/60058 + * g++.dg/torture/pr60058.C: New testcase. + 2014-02-04 Max Ostapenko <m.ostapenko@partner.samsung.com> * g++.dg/tsan/default_options.C: Invert check. diff --git a/gcc/testsuite/g++.dg/torture/pr60058.C b/gcc/testsuite/g++.dg/torture/pr60058.C new file mode 100644 index 0000000..1144137 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr60058.C @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ + +typedef enum {} UErrorCode; +class A { +public: + virtual A &m_fn1(A &, const A &, UErrorCode &) const; + void m_fn2(); + A(); + A(int); +}; +class __attribute__((visibility("hidden"))) B : public A { +public: + B(A &p1) : norm2(p1), set(0) {} + A &m_fn1(A &, const A &, UErrorCode &) const; + A &norm2; + const int &set; +}; + +UErrorCode a; +A c; +void fn1(A *p1) { + A b; + p1->m_fn1(b, 0, a).m_fn2(); +} + +void fn2() { + B d(c); + fn1(&d); +} |