[CodeGen] Keep track of eagerly emitted globals

An inline virtual function must be emitted, but we need to remember
it and emit the same definition again in the future in case later
LLVM optimizations stripped it from the Module. The added test case
shows the problem; before this patch, it would fail with:
    Symbols not found: [ _ZN1AD0Ev, _ZN1AD1Ev ]

Differential Revision: https://reviews.llvm.org/D156537
This commit is contained in:
Jonas Hahnfeld
2023-07-28 15:43:11 +02:00
parent 3c2432690a
commit f8dadefd4a
2 changed files with 22 additions and 0 deletions

View File

@@ -3658,6 +3658,7 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) {
// Emit the definition if it can't be deferred.
EmitGlobalDefinition(GD);
addEmittedDeferredDecl(GD);
return;
}

View File

@@ -0,0 +1,21 @@
// REQUIRES: host-supports-jit
// UNSUPPORTED: system-aix
// RUN: cat %s | clang-repl | FileCheck %s
// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s
extern "C" int printf(const char *, ...);
struct A { int a; A(int a) : a(a) {} virtual ~A(); };
// Then define the virtual destructor as inline out-of-line, in a separate
// PartialTranslationUnit.
inline A::~A() { printf("~A(%d)\n", a); }
// Create one instance with new and delete it.
A *a1 = new A(1);
delete a1;
// CHECK: ~A(1)
// Also create one global that will be auto-destructed.
A a2(2);
// CHECK: ~A(2)