aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2016-04-04 17:54:39 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2016-04-04 15:54:39 +0000
commitd27ecc497ca88c0e24dcbd2e9f7c718bfbfe890f (patch)
tree2bbe94b9b2ad465cd2867fcbb69022ccb38e5598
parentc974c96edf3bdb5d95ba997526e92ce834c0aaa1 (diff)
downloadgcc-d27ecc497ca88c0e24dcbd2e9f7c718bfbfe890f.zip
gcc-d27ecc497ca88c0e24dcbd2e9f7c718bfbfe890f.tar.gz
gcc-d27ecc497ca88c0e24dcbd2e9f7c718bfbfe890f.tar.bz2
re PR ipa/66223 (Diagnostic of pure virtual function call broken, including __cxa_pure_virtual)
PR ipa/66223 * ipa-devirt.c (maybe_record_node): Do not optimize cxa_pure_virtual calls when sanitizing. (possible_polymorphic_call_target_p)" FIx formating. * g++.dg/ipa/devirt-51.C: New testcase. From-SVN: r234719
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa-devirt.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/devirt-51.C32
4 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b478b0f..d9ad89c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-04-04 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/66223
+ * ipa-devirt.c (maybe_record_node): Do not optimize cxa_pure_virtual
+ calls when sanitizing.
+ (possible_polymorphic_call_target_p)" FIx formating.
+
2016-04-04 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 0694951..22ece9f 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -2438,10 +2438,14 @@ maybe_record_node (vec <cgraph_node *> &nodes,
{
gcc_assert (!target_node->global.inlined_to);
gcc_assert (target_node->real_symbol_p ());
+ /* When sanitizing, do not asume that cxa_pure_virutal is not called
+ by valid program. */
+ if (flag_sanitize & SANITIZE_UNDEFINED)
+ ;
/* Only add pure virtual if it is the only possible target. This way
we will preserve the diagnostics about pure virtual called in many
cases without disabling optimization in other. */
- if (pure_virtual)
+ else if (pure_virtual)
{
if (nodes.length ())
return;
@@ -3374,8 +3378,7 @@ possible_polymorphic_call_target_p (tree otr_type,
bool final;
if (TREE_CODE (TREE_TYPE (n->decl)) == FUNCTION_TYPE
- && ((fcode = DECL_FUNCTION_CODE (n->decl))
- == BUILT_IN_UNREACHABLE
+ && ((fcode = DECL_FUNCTION_CODE (n->decl)) == BUILT_IN_UNREACHABLE
|| fcode == BUILT_IN_TRAP))
return true;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c9b0205..168b769 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-04 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/66223
+ * g++.dg/ipa/devirt-51.C: New testcase.
+
2016-04-04 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Jakub Jelinek <jakub@redhat.com>
diff --git a/gcc/testsuite/g++.dg/ipa/devirt-51.C b/gcc/testsuite/g++.dg/ipa/devirt-51.C
new file mode 100644
index 0000000..fadf9e2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/devirt-51.C
@@ -0,0 +1,32 @@
+/* Be sure we do not optimize the virtual call into call of the only non-virtual
+ variant. Either keeping virtual call or optimizing to cxa_pure_virtual
+ is fine. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fsanitize=undefined -fdump-tree-optimized" } */
+namespace {
+ struct B {
+ B* self;
+ B() : self( this ) { self->f(); }
+ void E(void);
+ virtual void f() = 0;
+ };
+
+ struct D : B
+ {
+ void f() {}
+ };
+}
+
+struct D e;
+
+__attribute__ ((used))
+void B::E(void)
+ {
+ this->f();
+}
+
+ int main()
+ {
+ D d;
+ }
+/* { dg-final { scan-tree-dump "cxa_pure_virtual" "optimized" } } */