Ping for https://gcc.gnu.org/pipermail/gcc-patches/2024-August/660956.html (and the rest of this series).
On Wed, Aug 21, 2024 at 09:38:44AM +1000, Nathaniel Shead wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? > > -- >8 -- > > The Itanium ABI has specific rules for when virtual tables for dynamic > classes should be emitted. However we didn't consider structures with > virtual inheritance but no virtual members as dynamic classes for ABI > purposes; this patch fixes this. > > gcc/cp/ChangeLog: > > * decl2.cc (import_export_class): Use TYPE_CONTAINS_VPTR_P > instead of TYPE_POLYMORPHIC_P. > (import_export_decl): Likewise. > > gcc/testsuite/ChangeLog: > > * g++.dg/modules/virt-5_a.C: New test. > * g++.dg/modules/virt-5_b.C: New test. > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> > --- > gcc/cp/decl2.cc | 4 ++-- > gcc/testsuite/g++.dg/modules/virt-5_a.C | 16 ++++++++++++++++ > gcc/testsuite/g++.dg/modules/virt-5_b.C | 11 +++++++++++ > 3 files changed, 29 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/modules/virt-5_a.C > create mode 100644 gcc/testsuite/g++.dg/modules/virt-5_b.C > > diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc > index e9ae979896c..af544f40dac 100644 > --- a/gcc/cp/decl2.cc > +++ b/gcc/cp/decl2.cc > @@ -2431,7 +2431,7 @@ import_export_class (tree ctype) > translation unit, then export the class; otherwise, import > it. */ > import_export = -1; > - else if (TYPE_POLYMORPHIC_P (ctype)) > + else if (TYPE_CONTAINS_VPTR_P (ctype)) > { > tree cdecl = TYPE_NAME (ctype); > if (DECL_LANG_SPECIFIC (cdecl) && DECL_MODULE_ATTACH_P (cdecl)) > @@ -3527,7 +3527,7 @@ import_export_decl (tree decl) > class_type = type; > import_export_class (type); > if (CLASSTYPE_INTERFACE_KNOWN (type) > - && TYPE_POLYMORPHIC_P (type) > + && TYPE_CONTAINS_VPTR_P (type) > && CLASSTYPE_INTERFACE_ONLY (type) > /* If -fno-rtti was specified, then we cannot be sure > that RTTI information will be emitted with the > diff --git a/gcc/testsuite/g++.dg/modules/virt-5_a.C > b/gcc/testsuite/g++.dg/modules/virt-5_a.C > new file mode 100644 > index 00000000000..f4c6abe85ef > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/virt-5_a.C > @@ -0,0 +1,16 @@ > +// { dg-additional-options "-fmodules-ts" } > +// { dg-module-cmi M } > + > +export module M; > + > +struct C {}; > +struct B : virtual C {}; > + > +// Despite no non-inline key function, this is still a dynamic class > +// and so by the Itanium ABI 5.2.3 should be uniquely emitted in this TU > +export struct A : B { > + inline A (int) {} > +}; > + > +// { dg-final { scan-assembler {_ZTTW1M1A:} } } > +// { dg-final { scan-assembler {_ZTVW1M1A:} } } > diff --git a/gcc/testsuite/g++.dg/modules/virt-5_b.C > b/gcc/testsuite/g++.dg/modules/virt-5_b.C > new file mode 100644 > index 00000000000..785dd92ac1e > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/virt-5_b.C > @@ -0,0 +1,11 @@ > +// { dg-module-do link } > +// { dg-additional-options "-fmodules-ts" } > + > +import M; > + > +int main() { > + A a(0); > +} > + > +// { dg-final { scan-assembler-not {_ZTTW1M1A:} } } > +// { dg-final { scan-assembler-not {_ZTVW1M1A:} } } > -- > 2.43.2 >