From 1a1d0917518f2e70a04881abd0be4082259243f5 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Thu, 2 Mar 2006 02:20:54 +0000 Subject: [PATCH] re PR target/25908 (vtables with vague linkage is not being marked as vague on darwin) PR darwin/25908 * decl2.c (import_export_decl): Fix ABI breakage on darwin. * g++.dg/abi/key2.C: Add. From-SVN: r111632 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl2.c | 14 +++++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/abi/key2.C | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/abi/key2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a1df2bb9dfc..c092c39e729 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-03-01 Mike Stump + + PR darwin/25908 + * decl2.c (import_export_decl): Fix ABI breakage on darwin. + 2006-02-24 Geoffrey Keating * except.c (expand_start_catch_block): Handle diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 18cdae214f9..9cc95b63006 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1784,9 +1784,14 @@ import_export_decl (tree decl) /* The generic C++ ABI says that class data is always COMDAT, even if there is a key function. Some variants (e.g., the ARM EABI) says that class data - only has COMDAT linkage if the class data might - be emitted in more than one translation unit. */ + only has COMDAT linkage if the class data might be + emitted in more than one translation unit. When the + key method can be inline and is inline, we still have + to arrange for comdat even though + class_data_always_comdat is false. */ if (!CLASSTYPE_KEY_METHOD (class_type) + || (DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (class_type)) + && targetm.cxx.key_method_may_be_inline ()) || targetm.cxx.class_data_always_comdat ()) { /* The ABI requires COMDAT linkage. Normally, we @@ -1825,7 +1830,10 @@ import_export_decl (tree decl) if (CLASSTYPE_INTERFACE_KNOWN (type) && !CLASSTYPE_INTERFACE_ONLY (type)) { - comdat_p = targetm.cxx.class_data_always_comdat (); + comdat_p = (targetm.cxx.class_data_always_comdat () + || (CLASSTYPE_KEY_METHOD (type) + && DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (type)) + && targetm.cxx.key_method_may_be_inline ())); mark_needed (decl); if (!flag_weak) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 26c178be261..5ccb65c5003 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-03-01 Mike Stump + + * g++.dg/abi/key2.C: Add. + 2006-03-01 Paul Thomas * gfortran.dg/logical_dot_product.f90: New test. diff --git a/gcc/testsuite/g++.dg/abi/key2.C b/gcc/testsuite/g++.dg/abi/key2.C new file mode 100644 index 00000000000..40cf1d5a96d --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/key2.C @@ -0,0 +1,16 @@ +// On Darwin, key methods that are inline result in comdat style things. */ +// PR darwin/25908 + +// { dg-do compile { target *-*-darwin* } } +// { dg-final { scan-assembler ".globl __ZTV1f\\n .weak_definition __ZTV1f\\n .section __DATA,__const_coal,coalesced" } } +// { dg-final { scan-assembler ".globl __ZTS1f\\n .weak_definition __ZTS1f\\n .section __TEXT,__const_coal,coalesced" } } +// { dg-final { scan-assembler ".globl __ZTI1f\\n .weak_definition __ZTI1f\\n .section __DATA,__const_coal,coalesced" } } + +class f +{ + virtual void g(); + virtual void h(); +} c; +inline void f::g() {} +int sub(void) +{}