@@ -8323,53 +8323,3 @@ void CodeGenModule::moveLazyEmissionStates(CodeGenModule *NewBuilder) {
83238323
83248324 NewBuilder->ABI ->MangleCtx = std::move (ABI->MangleCtx );
83258325}
8326-
8327- bool CodeGenModule::classNeedsVectorDestructor (const CXXRecordDecl *RD) {
8328- if (!Context.getTargetInfo ().emitVectorDeletingDtors (Context.getLangOpts ()))
8329- return false ;
8330- CXXDestructorDecl *Dtor = RD->getDestructor ();
8331- // The compiler can't know if new[]/delete[] will be used outside of the DLL,
8332- // so just force vector deleting destructor emission if dllexport is present.
8333- // This matches MSVC behavior.
8334- if (Dtor && Dtor->isVirtual () && Dtor->isDefined () &&
8335- Dtor->hasAttr <DLLExportAttr>())
8336- return true ;
8337-
8338- return RequireVectorDeletingDtor.count (RD);
8339- }
8340-
8341- void CodeGenModule::requireVectorDestructorDefinition (const CXXRecordDecl *RD) {
8342- if (!Context.getTargetInfo ().emitVectorDeletingDtors (Context.getLangOpts ()))
8343- return ;
8344- RequireVectorDeletingDtor.insert (RD);
8345-
8346- // To reduce code size in general case we lazily emit scalar deleting
8347- // destructor definition and an alias from vector deleting destructor to
8348- // scalar deleting destructor. It may happen that we first emitted the scalar
8349- // deleting destructor definition and the alias and then discovered that the
8350- // definition of the vector deleting destructor is required. Then we need to
8351- // remove the alias and the scalar deleting destructor and queue vector
8352- // deleting destructor body for emission. Check if that is the case.
8353- CXXDestructorDecl *DtorD = RD->getDestructor ();
8354- GlobalDecl ScalarDtorGD (DtorD, Dtor_Deleting);
8355- StringRef MangledName = getMangledName (ScalarDtorGD);
8356- llvm::GlobalValue *Entry = GetGlobalValue (MangledName);
8357- if (Entry && !Entry->isDeclaration ()) {
8358- GlobalDecl VectorDtorGD (DtorD, Dtor_VectorDeleting);
8359- StringRef VDName = getMangledName (VectorDtorGD);
8360- llvm::GlobalValue *VDEntry = GetGlobalValue (VDName);
8361- // It exists and it should be an alias.
8362- assert (VDEntry && isa<llvm::GlobalAlias>(VDEntry));
8363- auto *NewFn = llvm::Function::Create (
8364- cast<llvm::FunctionType>(VDEntry->getValueType ()),
8365- llvm::Function::ExternalLinkage, VDName, &getModule ());
8366- SetFunctionAttributes (VectorDtorGD, NewFn, /* IsIncompleteFunction*/ false ,
8367- /* IsThunk*/ false );
8368- NewFn->takeName (VDEntry);
8369- VDEntry->replaceAllUsesWith (NewFn);
8370- VDEntry->eraseFromParent ();
8371- Entry->replaceAllUsesWith (NewFn);
8372- Entry->eraseFromParent ();
8373- addDeferredDeclToEmit (VectorDtorGD);
8374- }
8375- }
0 commit comments