[clang] [C++20] [Modules] [Itanium ABI] Generate the vtable in the module unit of dynamic classes (PR #75912)

Eli Friedman via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 11 20:33:10 PDT 2024


================
@@ -6853,6 +6853,13 @@ void CodeGenModule::EmitTopLevelDecl(Decl *D) {
         if (ES->hasExternalDefinitions(D) == ExternalASTSource::EK_Never)
           DI->completeUnusedClass(*CRD);
     }
+    // If we're emitting a dynamic class from the importable module we're
+    // emitting, we always need to emit the virtual table according to the ABI
+    // requirement.
+    if (CRD->getDefinition() && CRD->isDynamicClass() &&
+        CRD->isInCurrentModuleUnit())
+      EmitVTable(CRD);
----------------
efriedma-quic wrote:

So DefineUsedVTables is called, but the ASTWriter eats the call without actually recording the fact anywhere?  Okay, that makes more sense.  So I guess that gives a potential alternate approach; we could teach ASTWriter to record the fact that HandleVTable was called, and replay it later.

But if we can reliably handle emitting vtables in EmitTopLevelDecl, it's probably simpler to just eliminate HandleVTable.

https://github.com/llvm/llvm-project/pull/75912


More information about the cfe-commits mailing list