Get the dll storage class right for structors of classes exported/imported via explicit instantiation (PR23667)
This is a follow-up to r238266. It turned out structors are codegened through a different path, and didn't get the storage class set in EmitGlobalFunctionDefinition. llvm-svn: 238443
This commit is contained in:
@@ -676,6 +676,25 @@ CodeGenModule::getFunctionLinkage(GlobalDecl GD) {
|
||||
return getLLVMLinkageForDeclarator(D, Linkage, /*isConstantVariable=*/false);
|
||||
}
|
||||
|
||||
void CodeGenModule::setFunctionDLLStorageClass(GlobalDecl GD, llvm::Function *F) {
|
||||
const auto *FD = cast<FunctionDecl>(GD.getDecl());
|
||||
|
||||
if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
|
||||
if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
|
||||
// Don't dllexport/import destructor thunks.
|
||||
F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (FD->hasAttr<DLLImportAttr>())
|
||||
F->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
|
||||
else if (FD->hasAttr<DLLExportAttr>())
|
||||
F->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
|
||||
else
|
||||
F->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
|
||||
}
|
||||
|
||||
void CodeGenModule::setFunctionDefinitionAttributes(const FunctionDecl *D,
|
||||
llvm::Function *F) {
|
||||
setNonAliasAttributes(D, F);
|
||||
@@ -889,13 +908,6 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
|
||||
|
||||
setLinkageAndVisibilityForGV(F, FD);
|
||||
|
||||
if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(FD)) {
|
||||
if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) {
|
||||
// Don't dllexport/import destructor thunks.
|
||||
F->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
|
||||
}
|
||||
}
|
||||
|
||||
if (const SectionAttr *SA = FD->getAttr<SectionAttr>())
|
||||
F->setSection(SA->getName());
|
||||
|
||||
@@ -2455,12 +2467,7 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
|
||||
// declarations).
|
||||
auto *Fn = cast<llvm::Function>(GV);
|
||||
setFunctionLinkage(GD, Fn);
|
||||
if (D->hasAttr<DLLImportAttr>())
|
||||
GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass);
|
||||
else if (D->hasAttr<DLLExportAttr>())
|
||||
GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass);
|
||||
else
|
||||
GV->setDLLStorageClass(llvm::GlobalVariable::DefaultStorageClass);
|
||||
setFunctionDLLStorageClass(GD, Fn);
|
||||
|
||||
// FIXME: this is redundant with part of setFunctionDefinitionAttributes
|
||||
setGlobalVisibility(Fn, D);
|
||||
|
||||
Reference in New Issue
Block a user