================
@@ -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);
----------------
ChuanqiXu9 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.

Done. Although it is somewhat not efficient, I made it if it makes the 
structure more clear.

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

I tried but it looks not so easy. The problem is that `EmitTopLevelDecl` 
getting called on the fly during the parsing but `Sema::DefineUsedVTables` is 
only get called after Sema finished parsing the translation unit. So we still 
need some special function to replace `HandleVTable`, but then it is 
meaningless.

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

Reply via email to