Index: lib/CodeGen/CodeGenModule.h =================================================================== --- lib/CodeGen/CodeGenModule.h +++ lib/CodeGen/CodeGenModule.h @@ -721,7 +721,7 @@ /// Set the visibility for the given LLVM GlobalValue. void setGlobalVisibility(llvm::GlobalValue *GV, const NamedDecl *D) const; - void setDSOLocal(llvm::GlobalValue *GV, const NamedDecl *D) const; + void setDSOLocal(llvm::GlobalValue *GV) const; void setGVProperties(llvm::GlobalValue *GV, const NamedDecl *D) const; Index: lib/CodeGen/CodeGenModule.cpp =================================================================== --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -716,7 +716,7 @@ } static bool shouldAssumeDSOLocal(const CodeGenModule &CGM, - llvm::GlobalValue *GV, const NamedDecl *D) { + llvm::GlobalValue *GV) { const llvm::Triple &TT = CGM.getTriple(); // Only handle ELF for now. if (!TT.isOSBinFormatELF()) @@ -746,31 +746,30 @@ return false; // If we can use copy relocations we can assume it is local. - if (auto *VD = dyn_cast(D)) - if (VD->getTLSKind() == VarDecl::TLS_None && + if (auto *Var = dyn_cast(GV)) + if (!Var->isThreadLocal() && (RM == llvm::Reloc::Static || CGOpts.PIECopyRelocations)) return true; // If we can use a plt entry as the symbol address we can assume it // is local. // FIXME: This should work for PIE, but the gold linker doesn't support it. - if (isa(D) && !CGOpts.NoPLT && RM == llvm::Reloc::Static) + if (isa(GV) && !CGOpts.NoPLT && RM == llvm::Reloc::Static) return true; // Otherwise don't assue it is local. return false; } -void CodeGenModule::setDSOLocal(llvm::GlobalValue *GV, - const NamedDecl *D) const { - if (shouldAssumeDSOLocal(*this, GV, D)) +void CodeGenModule::setDSOLocal(llvm::GlobalValue *GV) const { + if (shouldAssumeDSOLocal(*this, GV)) GV->setDSOLocal(true); } void CodeGenModule::setGVProperties(llvm::GlobalValue *GV, const NamedDecl *D) const { setGlobalVisibility(GV, D); - setDSOLocal(GV, D); + setDSOLocal(GV); } static llvm::GlobalVariable::ThreadLocalMode GetLLVMTLSModel(StringRef S) { @@ -2753,7 +2752,6 @@ GV->setAlignment(getContext().getDeclAlign(D).getQuantity()); setLinkageForGV(GV, D); - setGVProperties(GV, D); if (D->getTLSKind()) { if (D->getTLSKind() == VarDecl::TLS_Dynamic) @@ -2761,6 +2759,8 @@ setTLSMode(GV, *D); } + setGVProperties(GV, D); + // If required by the ABI, treat declarations of static data members with // inline initializers as definitions. if (getContext().isMSStaticDataMemberInlineDefinition(D)) { Index: lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- lib/CodeGen/ItaniumCXXABI.cpp +++ lib/CodeGen/ItaniumCXXABI.cpp @@ -3214,10 +3214,10 @@ llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility()); TypeName->setVisibility(llvmVisibility); - CGM.setDSOLocal(TypeName, Ty->getAsCXXRecordDecl()); + CGM.setDSOLocal(TypeName); GV->setVisibility(llvmVisibility); - CGM.setDSOLocal(GV, Ty->getAsCXXRecordDecl()); + CGM.setDSOLocal(GV); if (CGM.getTriple().isWindowsItaniumEnvironment()) { auto RD = Ty->getAsCXXRecordDecl();