Author: Jonas Hahnfeld Date: 2023-08-17T13:26:22+02:00 New Revision: f8dadefd4afc8e1b7b9a1e69a0ba8df051e03328
URL: https://github.com/llvm/llvm-project/commit/f8dadefd4afc8e1b7b9a1e69a0ba8df051e03328 DIFF: https://github.com/llvm/llvm-project/commit/f8dadefd4afc8e1b7b9a1e69a0ba8df051e03328.diff LOG: [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 Added: clang/test/Interpreter/inline-virtual.cpp Modified: clang/lib/CodeGen/CodeGenModule.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 517af514d9c998..440fb040a43cc5 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -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; } diff --git a/clang/test/Interpreter/inline-virtual.cpp b/clang/test/Interpreter/inline-virtual.cpp new file mode 100644 index 00000000000000..ace7a0a73d82a1 --- /dev/null +++ b/clang/test/Interpreter/inline-virtual.cpp @@ -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) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits