Author: Jonas Hahnfeld Date: 2023-08-18T09:42:28+02:00 New Revision: c861d32d7c2791bdc058d9d9fbaecc1c2f07b8c7
URL: https://github.com/llvm/llvm-project/commit/c861d32d7c2791bdc058d9d9fbaecc1c2f07b8c7 DIFF: https://github.com/llvm/llvm-project/commit/c861d32d7c2791bdc058d9d9fbaecc1c2f07b8c7.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 ] This reapplies commit f8dadefd4a, reverted in commit 0e17372b38, but disables RTTI in the test to avoid problems on Windows. 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..79ab8ed337ffea --- /dev/null +++ b/clang/test/Interpreter/inline-virtual.cpp @@ -0,0 +1,24 @@ +// REQUIRES: host-supports-jit +// UNSUPPORTED: system-aix +// +// We disable RTTI to avoid problems on Windows for non-RTTI builds of LLVM +// where the JIT cannot find ??_7type_info@@6B@. +// RUN: cat %s | clang-repl -Xcc -fno-rtti | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -fno-rtti -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