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
This commit is contained in:
parent
c974c96edf
commit
d27ecc497c
@ -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>
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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>
|
||||
|
||||
|
32
gcc/testsuite/g++.dg/ipa/devirt-51.C
Normal file
32
gcc/testsuite/g++.dg/ipa/devirt-51.C
Normal file
@ -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" } } */
|
Loading…
Reference in New Issue
Block a user