diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-09 11:57:25 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-09-09 11:57:25 +0000 |
commit | 460c5bfa8ec3407a90b6ae377f49d65f122a09cc (patch) | |
tree | 94878a26f84bf31998dfb8a928283307287fcb33 | |
parent | 8d34eb9f4675726c83fc27efad979b6bb9a13da7 (diff) | |
download | ppe42-gcc-460c5bfa8ec3407a90b6ae377f49d65f122a09cc.tar.gz ppe42-gcc-460c5bfa8ec3407a90b6ae377f49d65f122a09cc.zip |
PR c++/61214
PR c++/62224
gcc/
* gimple-fold.c (can_refer_decl_in_current_unit_p): Don't allow
reference to a DECL_EXTERNAL COMDAT.
gcc/cp/
* decl2.c (decl_needed_p): Revert virtual functions change.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@215061 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 5 | ||||
-rw-r--r-- | gcc/gimple-fold.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/devirt-39.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/devirt-40.C | 21 |
6 files changed, 38 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ba64615a82..63620acf86d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-09-09 Jason Merrill <jason@redhat.com> + + PR c++/61214 + PR c++/62224 + * gimple-fold.c (can_refer_decl_in_current_unit_p): Don't allow + reference to a DECL_EXTERNAL COMDAT. + 2014-09-09 Richard Biener <rguenther@suse.de> Backport from mainline diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cdf5481c84b..5c750b9e441 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-09-09 Jason Merrill <jason@redhat.com> + + PR c++/61214 + PR c++/62224 + * decl2.c (decl_needed_p): Revert virtual functions change. + 2014-09-05 Jason Merrill <jason@redhat.com> PR c++/62659 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 77ab5fbdfd1..6c52e53bca0 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1934,11 +1934,6 @@ decl_needed_p (tree decl) if (flag_keep_inline_dllexport && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))) return true; - /* Virtual functions might be needed for devirtualization. */ - if (flag_devirtualize - && TREE_CODE (decl) == FUNCTION_DECL - && DECL_VIRTUAL_P (decl)) - return true; /* Otherwise, DECL does not need to be emitted -- yet. A subsequent reference to DECL might cause it to be emitted later. */ return false; diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index c6aea6529ef..2527d292aef 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -146,7 +146,8 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl) The second is important when devirtualization happens during final compilation stage when making a new reference no longer makes callee to be compiled. */ - if (!node || !node->definition || node->global.inlined_to) + if (!node || !node->definition + || DECL_EXTERNAL (decl) || node->global.inlined_to) { gcc_checking_assert (!TREE_ASM_WRITTEN (decl)); return false; diff --git a/gcc/testsuite/g++.dg/ipa/devirt-39.C b/gcc/testsuite/g++.dg/ipa/devirt-39.C index fbeea126e19..8cd734d77c0 100644 --- a/gcc/testsuite/g++.dg/ipa/devirt-39.C +++ b/gcc/testsuite/g++.dg/ipa/devirt-39.C @@ -1,5 +1,5 @@ // PR c++/61214 -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2" } */ struct Base { @@ -24,5 +24,4 @@ int main() return 0; } -/* { dg-final { scan-tree-dump-not "OBJ_TYPE_REF" "optimized" } } */ -/* { dg-final { cleanup-tree-dump "optimized" } } */ +/* { dg-final { scan-assembler-not "_ZN3Foo5cloneEv" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/devirt-40.C b/gcc/testsuite/g++.dg/ipa/devirt-40.C new file mode 100644 index 00000000000..9c3bdf5e9df --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-40.C @@ -0,0 +1,21 @@ +// PR c++/62224 +// { dg-options "-O2" } +// For 4.9, we don't want to devirtualize f and thus create a reference to g. + +struct A +{ + virtual void f () = 0; +}; + +class B : A +{ + virtual void f () { g(); } + void g(); +}; + +void h (A *a) +{ + a->f (); +} + +// { dg-final { scan-assembler-not "_ZN1B1gEv" } } |