Skip to content

Commit

Permalink
[CodeGen] Keep track of eagerly emitted globals
Browse files Browse the repository at this point in the history
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
  • Loading branch information
hahnjo committed Aug 17, 2023
1 parent 3c24326 commit f8dadef
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
21 changes: 21 additions & 0 deletions clang/test/Interpreter/inline-virtual.cpp
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit f8dadef

Please sign in to comment.