diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2018-03-01 00:35:47 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2018-03-01 00:35:47 +0000 |
commit | b735004615be10ffa60dd3d4b0a060f0bed2f8de (patch) | |
tree | d6852673e5d3a3fd1725c62a640e6b5d63f5d458 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 2b94972eb981090e0289ba56edd22b311e9fd6f7 (diff) | |
download | bcm5719-llvm-b735004615be10ffa60dd3d4b0a060f0bed2f8de.tar.gz bcm5719-llvm-b735004615be10ffa60dd3d4b0a060f0bed2f8de.zip |
Start setting dllimport/dllexport in setGVProperties.
This is the next step in setting dso_local for COFF.
The patches changes setGVProperties to first set dllimport/dllexport
and changes a few cases that were setting dllimport/dllexport
manually. With this a few more GVs are marked dso_local.
llvm-svn: 326397
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 96 |
1 files changed, 46 insertions, 50 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index b157f5aff22..217f9639ba7 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -777,8 +777,43 @@ void CodeGenModule::setDSOLocal(llvm::GlobalValue *GV) const { GV->setDSOLocal(true); } +void CodeGenModule::setDLLImportDLLExport(llvm::GlobalValue *GV, + GlobalDecl GD) const { + const auto *D = dyn_cast<NamedDecl>(GD.getDecl()); + if (const auto *Dtor = dyn_cast_or_null<CXXDestructorDecl>(D)) { + if (getCXXABI().useThunkForDtorVariant(Dtor, GD.getDtorType())) { + // Don't dllexport/import destructor thunks. + GV->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass); + return; + } + } + setDLLImportDLLExport(GV, D); +} + +void CodeGenModule::setDLLImportDLLExport(llvm::GlobalValue *GV, + const NamedDecl *D) const { + if (D->isExternallyVisible()) { + if (D->hasAttr<DLLImportAttr>()) + GV->setDLLStorageClass(llvm::GlobalVariable::DLLImportStorageClass); + else if (D->hasAttr<DLLExportAttr>() && !GV->isDeclarationForLinker()) + GV->setDLLStorageClass(llvm::GlobalVariable::DLLExportStorageClass); + } +} + +void CodeGenModule::setGVProperties(llvm::GlobalValue *GV, + GlobalDecl GD) const { + setDLLImportDLLExport(GV, GD); + setGlobalVisibilityAndLocal(GV, dyn_cast<NamedDecl>(GD.getDecl())); +} + void CodeGenModule::setGVProperties(llvm::GlobalValue *GV, const NamedDecl *D) const { + setDLLImportDLLExport(GV, D); + setGlobalVisibilityAndLocal(GV, D); +} + +void CodeGenModule::setGlobalVisibilityAndLocal(llvm::GlobalValue *GV, + const NamedDecl *D) const { setGlobalVisibility(GV, D); setDSOLocal(GV); } @@ -1054,25 +1089,6 @@ 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); -} - llvm::ConstantInt *CodeGenModule::CreateCrossDsoCfiTypeId(llvm::Metadata *MD) { llvm::MDString *MDS = dyn_cast<llvm::MDString>(MD); if (!MDS) return nullptr; @@ -1234,8 +1250,8 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, void CodeGenModule::SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV) { const Decl *D = GD.getDecl(); - if (const auto *ND = dyn_cast_or_null<NamedDecl>(D)) - setGVProperties(GV, ND); + if (dyn_cast_or_null<NamedDecl>(D)) + setGVProperties(GV, GD); else GV->setVisibility(llvm::GlobalValue::DefaultVisibility); @@ -1243,16 +1259,6 @@ void CodeGenModule::SetCommonAttributes(GlobalDecl GD, llvm::GlobalValue *GV) { addUsedGlobal(GV); } -void CodeGenModule::setAliasAttributes(GlobalDecl GD, llvm::GlobalValue *GV) { - const Decl *D = GD.getDecl(); - SetCommonAttributes(GD, GV); - - // Process the dllexport attribute based on whether the original definition - // (not necessarily the aliasee) was exported. - if (D->hasAttr<DLLExportAttr>()) - GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); -} - bool CodeGenModule::GetCPUAndFeaturesAttributes(const Decl *D, llvm::AttrBuilder &Attrs) { // Add target-cpu and target-features attributes to functions. If @@ -1349,24 +1355,15 @@ void CodeGenModule::SetInternalFunctionAttributes(GlobalDecl GD, setNonAliasAttributes(GD, F); } -static void setLinkageForGV(llvm::GlobalValue *GV, - const NamedDecl *ND) { +static void setLinkageForGV(llvm::GlobalValue *GV, const NamedDecl *ND) { // Set linkage and visibility in case we never see a definition. LinkageInfo LV = ND->getLinkageAndVisibility(); - if (!isExternallyVisible(LV.getLinkage())) { - // Don't set internal linkage on declarations. - } else { - if (ND->hasAttr<DLLImportAttr>()) { - GV->setLinkage(llvm::GlobalValue::ExternalLinkage); - GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); - } else if (ND->hasAttr<DLLExportAttr>()) { - GV->setLinkage(llvm::GlobalValue::ExternalLinkage); - } else if (ND->hasAttr<WeakAttr>() || ND->isWeakImported()) { - // "extern_weak" is overloaded in LLVM; we probably should have - // separate linkage types for this. - GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); - } - } + // Don't set internal linkage on declarations. + // "extern_weak" is overloaded in LLVM; we probably should have + // separate linkage types for this. + if (isExternallyVisible(LV.getLinkage()) && + (ND->hasAttr<WeakAttr>() || ND->isWeakImported())) + GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); } void CodeGenModule::CreateFunctionTypeMetadata(const FunctionDecl *FD, @@ -3577,10 +3574,9 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD, // declarations). auto *Fn = cast<llvm::Function>(GV); setFunctionLinkage(GD, Fn); - setFunctionDLLStorageClass(GD, Fn); // FIXME: this is redundant with part of setFunctionDefinitionAttributes - setGVProperties(Fn, D); + setGVProperties(Fn, GD); MaybeHandleStaticInExternC(D, Fn); @@ -3672,7 +3668,7 @@ void CodeGenModule::EmitAliasDefinition(GlobalDecl GD) { if (VD->getTLSKind()) setTLSMode(GA, *VD); - setAliasAttributes(GD, GA); + SetCommonAttributes(GD, GA); } void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) { |