summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-09 11:57:25 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2014-09-09 11:57:25 +0000
commit460c5bfa8ec3407a90b6ae377f49d65f122a09cc (patch)
tree94878a26f84bf31998dfb8a928283307287fcb33
parent8d34eb9f4675726c83fc27efad979b6bb9a13da7 (diff)
downloadppe42-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/ChangeLog7
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c5
-rw-r--r--gcc/gimple-fold.c3
-rw-r--r--gcc/testsuite/g++.dg/ipa/devirt-39.C5
-rw-r--r--gcc/testsuite/g++.dg/ipa/devirt-40.C21
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" } }
OpenPOWER on IntegriCloud