+2006-03-01 Mike Stump <mrs@apple.com>
+
+ PR darwin/25908
+ * decl2.c (import_export_decl): Fix ABI breakage on darwin.
+
2006-02-24 Geoffrey Keating <geoffk@apple.com>
* except.c (expand_start_catch_block): Handle
/* 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
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)
{
--- /dev/null
+// 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)
+{}