aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-02-27 18:13:28 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2005-02-27 18:13:28 +0100
commit5591e5f9af6f09455a1f11d8e822785e34647186 (patch)
tree0b34545a616ee8b201346e4bd42a36e316bf09ae /gcc
parentc0d127129367344cefe9efcd3f0f232ce1df3447 (diff)
downloadgcc-5591e5f9af6f09455a1f11d8e822785e34647186.zip
gcc-5591e5f9af6f09455a1f11d8e822785e34647186.tar.gz
gcc-5591e5f9af6f09455a1f11d8e822785e34647186.tar.bz2
re PR c++/20206 (COMDAT broken for C++ thunks)
PR c++/20206 * decl.c (cxx_comdat_group): Put thunks for TARGET_USE_LOCAL_THUNK_ALIAS_P (function) functions into the same comdat group as the thunk target. * g++.dg/opt/thunk2.C: New test. * g++.dg/opt/covariant1.C: New test. From-SVN: r95619
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl.c17
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/opt/covariant1.C47
-rw-r--r--gcc/testsuite/g++.dg/opt/thunk2.C44
5 files changed, 120 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d11e321..36e29ce 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/20206
+ * decl.c (cxx_comdat_group): Put thunks for
+ TARGET_USE_LOCAL_THUNK_ALIAS_P (function) functions into the same
+ comdat group as the thunk target.
+
2005-02-24 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
* call.c, class.c, cp-tree.h, decl2.c, error.c, init.c, mangle.c,
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index d767125..072519c 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -11115,7 +11115,22 @@ cxx_comdat_group (tree decl)
/* For all other DECLs, the COMDAT group is the mangled name of the
declaration itself. */
else
- name = DECL_ASSEMBLER_NAME (decl);
+ {
+ while (DECL_THUNK_P (decl))
+ {
+ /* If TARGET_USE_LOCAL_THUNK_ALIAS_P, use_thunk puts the thunk
+ into the same section as the target function. In that case
+ we must return target's name. */
+ tree target = THUNK_TARGET (decl);
+ if (TARGET_USE_LOCAL_THUNK_ALIAS_P (target)
+ && DECL_SECTION_NAME (target) != NULL
+ && DECL_ONE_ONLY (target))
+ decl = target;
+ else
+ break;
+ }
+ name = DECL_ASSEMBLER_NAME (decl);
+ }
return IDENTIFIER_POINTER (name);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ef1433f..aebf34b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-02-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/20206
+ * g++.dg/opt/thunk2.C: New test.
+ * g++.dg/opt/covariant1.C: New test.
+
2005-02-27 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
* gfortran.dg/e_d_fmt.f90: New test.
diff --git a/gcc/testsuite/g++.dg/opt/covariant1.C b/gcc/testsuite/g++.dg/opt/covariant1.C
new file mode 100644
index 0000000..e57cf4c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/covariant1.C
@@ -0,0 +1,47 @@
+// PR c++/20206
+// { dg-do run }
+// { dg-options "-O0" }
+
+void
+bar (int x)
+{
+ asm ("" : : "g" (x));
+}
+
+struct S { S () {}; virtual ~S () {}; };
+struct T { virtual T *foo (int) {}; };
+struct V : virtual S, virtual T {};
+struct V v;
+struct U : public S, public T
+{
+ bool a;
+ U () {}
+ virtual ~U () {}
+ virtual V *foo (int x)
+ {
+ switch (x)
+ {
+ case 12:
+ break;
+ case 9:
+ bar (7);
+ break;
+ case 10:
+ bar (12);
+ break;
+ case 4:
+ bar (18);
+ break;
+ case 2:
+ bar (26);
+ break;
+ }
+ return &v;
+ }
+};
+U u;
+
+int
+main ()
+{
+}
diff --git a/gcc/testsuite/g++.dg/opt/thunk2.C b/gcc/testsuite/g++.dg/opt/thunk2.C
new file mode 100644
index 0000000..52fcd74
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/thunk2.C
@@ -0,0 +1,44 @@
+// PR c++/20206
+// { dg-do run }
+// { dg-options "-O0" }
+
+void
+bar (int x)
+{
+ asm ("" : : "g" (x));
+}
+
+struct S { S () {}; virtual ~S () {}; };
+struct T { virtual void foo (int) = 0; };
+struct U : public S, public T
+{
+ bool a;
+ U () {}
+ virtual ~U () {}
+ virtual void foo (int x)
+ {
+ switch (x)
+ {
+ case 12:
+ break;
+ case 9:
+ bar (7);
+ break;
+ case 10:
+ bar (12);
+ break;
+ case 4:
+ bar (18);
+ break;
+ case 2:
+ bar (26);
+ break;
+ }
+ }
+};
+U u;
+
+int
+main ()
+{
+}