diff options
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index efcdce70a0..558a8a3cf8 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -164,6 +164,17 @@ void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type, getDiags().Report(Context.getFullLoc(D->getLocation()), DiagID) << Msg; } +static llvm::GlobalValue::VisibilityTypes GetLLVMVisibility(Visibility V) { + switch (V) { + case DefaultVisibility: return llvm::GlobalValue::DefaultVisibility; + case HiddenVisibility: return llvm::GlobalValue::HiddenVisibility; + case ProtectedVisibility: return llvm::GlobalValue::ProtectedVisibility; + } + llvm_unreachable("unknown visibility!"); + return llvm::GlobalValue::DefaultVisibility; +} + + void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const { // Internal definitions always have default visibility. @@ -172,15 +183,7 @@ void CodeGenModule::setGlobalVisibility(llvm::GlobalValue *GV, return; } - switch (D->getVisibility()) { - case DefaultVisibility: - return GV->setVisibility(llvm::GlobalValue::DefaultVisibility); - case HiddenVisibility: - return GV->setVisibility(llvm::GlobalValue::HiddenVisibility); - case ProtectedVisibility: - return GV->setVisibility(llvm::GlobalValue::ProtectedVisibility); - } - llvm_unreachable("unknown visibility!"); + GV->setVisibility(GetLLVMVisibility(D->getVisibility())); } /// Set the symbol visibility of type information (vtable and RTTI) @@ -934,15 +937,18 @@ CodeGenModule::GetOrCreateLLVMGlobal(llvm::StringRef MangledName, // handling. GV->setConstant(DeclIsConstantGlobal(Context, D)); - // FIXME: Merge with other attribute handling code. - if (D->getStorageClass() == SC_PrivateExtern) - GV->setVisibility(llvm::GlobalValue::HiddenVisibility); + // Set linkage and visibility in case we never see a definition. + std::pair<Linkage,Visibility> LV = D->getLinkageAndVisibility(); + if (LV.first != ExternalLinkage) { + GV->setLinkage(llvm::GlobalValue::InternalLinkage); + } else { + if (D->hasAttr<DLLImportAttr>()) + GV->setLinkage(llvm::GlobalValue::DLLImportLinkage); + else if (D->hasAttr<WeakAttr>() || D->hasAttr<WeakImportAttr>()) + GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); - if (D->hasAttr<DLLImportAttr>()) - GV->setLinkage(llvm::GlobalValue::DLLImportLinkage); - else if (D->hasAttr<WeakAttr>() || - D->hasAttr<WeakImportAttr>()) - GV->setLinkage(llvm::GlobalValue::ExternalWeakLinkage); + GV->setVisibility(GetLLVMVisibility(LV.second)); + } GV->setThreadLocal(D->isThreadSpecified()); } |