================ @@ -1185,6 +1190,21 @@ bool CodeGenVTables::isVTableExternal(const CXXRecordDecl *RD) { TSK == TSK_ExplicitInstantiationDefinition) return false; + // Itanium C++ ABI [5.2.3]: + // Virtual tables for dynamic classes are emitted as follows: + // + // - If the class is templated, the tables are emitted in every object that + // references any of them. + // - Otherwise, if the class is attached to a module, the tables are uniquely + // emitted in the object for the module unit in which it is defined. + // - Otherwise, if the class has a key function (see below), the tables are + // emitted in the object for the translation unit containing the definition of + // the key function. This is unique if the key function is not inline. + // - Otherwise, the tables are emitted in every object that references any of + // them. + if (RD->isInNamedModule()) + return RD->shouldEmitInExternalSource(); ---------------- dwblaikie wrote:
Shouldn't need to test "isInNamedModule" here, though? Would it be adequate to do: ``` if (RD->shouldEmitInExternalSource()) return true; ``` Ah, I geuss you want to return false ASAP too - I guess looking at some of the implementation details of `shouldEmitInExternalSource` and using those APIs directly here - Always -> true, Never -> false, I think? Like `adjustGVALinkageForExternalDefinitionKind` already does? Or even reusing some of that functionality somehow. https://github.com/llvm/llvm-project/pull/75912 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits