[Lldb-commits] [clang] [lldb] Reland [MS][clang] Add support for vector deleting destructors (PR #165598)
Eli Friedman via lldb-commits
lldb-commits at lists.llvm.org
Wed Nov 5 13:33:01 PST 2025
================
@@ -8281,3 +8281,53 @@ void CodeGenModule::moveLazyEmissionStates(CodeGenModule *NewBuilder) {
NewBuilder->ABI->MangleCtx = std::move(ABI->MangleCtx);
}
+
+bool CodeGenModule::classNeedsVectorDestructor(const CXXRecordDecl *RD) {
+ if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
+ return false;
+ CXXDestructorDecl *Dtor = RD->getDestructor();
+ // The compiler can't know if new[]/delete[] will be used outside of the DLL,
+ // so just force vector deleting destructor emission if dllexport is present.
+ // This matches MSVC behavior.
+ if (Dtor && Dtor->isVirtual() && Dtor->isDefined() &&
+ Dtor->hasAttr<DLLExportAttr>())
+ return true;
+
+ return RequireVectorDeletingDtor.count(RD);
+}
+
+void CodeGenModule::requireVectorDestructorDefinition(const CXXRecordDecl *RD) {
+ if (!Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts()))
+ return;
+ RequireVectorDeletingDtor.insert(RD);
+
+ // To reduce code size in general case we lazily emit scalar deleting
+ // destructor definition and an alias from vector deleting destructor to
+ // scalar deleting destructor. It may happen that we first emitted the scalar
----------------
efriedma-quic wrote:
Oh, hmm. So normally, the scalar destuctor is sufficient, but if some translation unit uses delete[], you need the vector destructor. And you handle this by emitting a weak symbol by default, but overriding it with an actual definition if you need it.
And it looks like this is what MSVC does... so that's fine, I guess. Feels a little convoluted, but I guess we didn't define it.
https://github.com/llvm/llvm-project/pull/165598
More information about the lldb-commits
mailing list