Index: lib/CodeGen/CodeGenModule.h =================================================================== --- lib/CodeGen/CodeGenModule.h +++ lib/CodeGen/CodeGenModule.h @@ -916,7 +916,8 @@ llvm::AttributeSet()); /// Create a new runtime global variable with the specified type and name. llvm::Constant *CreateRuntimeVariable(llvm::Type *Ty, - StringRef Name); + StringRef Name, + bool Hidden = false); ///@name Custom Blocks Runtime Interfaces ///@{ @@ -1220,7 +1221,8 @@ llvm::PointerType *PTy, const VarDecl *D, ForDefinition_t IsForDefinition - = NotForDefinition); + = NotForDefinition, + bool Hidden = false); void setNonAliasAttributes(const Decl *D, llvm::GlobalObject *GO); Index: lib/CodeGen/CodeGenModule.cpp =================================================================== --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -2183,7 +2183,8 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, llvm::PointerType *Ty, const VarDecl *D, - ForDefinition_t IsForDefinition) { + ForDefinition_t IsForDefinition, + bool Hidden) { // Lookup the entry, lazily creating it if necessary. llvm::GlobalValue *Entry = GetGlobalValue(MangledName); if (Entry) { @@ -2288,6 +2289,8 @@ D->getType().isConstant(Context) && isExternallyVisible(D->getLinkageAndVisibility().getLinkage())) GV->setSection(".cp.rodata"); + } else if (Hidden) { + GV->setVisibility(llvm::GlobalValue::HiddenVisibility); } if (AddrSpace != Ty->getAddressSpace()) @@ -2393,8 +2396,10 @@ /// specified type and name. llvm::Constant * CodeGenModule::CreateRuntimeVariable(llvm::Type *Ty, - StringRef Name) { - return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr); + StringRef Name, + bool Hidden) { + return GetOrCreateLLVMGlobal(Name, llvm::PointerType::getUnqual(Ty), nullptr, + NotForDefinition, Hidden); } void CodeGenModule::EmitTentativeDefinition(const VarDecl *D) { Index: lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- lib/CodeGen/ItaniumCXXABI.cpp +++ lib/CodeGen/ItaniumCXXABI.cpp @@ -2162,7 +2162,7 @@ // Create a variable that binds the atexit to this shared object. llvm::Constant *handle = - CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle"); + CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle", true); llvm::Value *args[] = { llvm::ConstantExpr::getBitCast(dtor, dtorTy), Index: test/CodeGenCXX/global-init.cpp =================================================================== --- test/CodeGenCXX/global-init.cpp +++ test/CodeGenCXX/global-init.cpp @@ -15,7 +15,7 @@ struct D { ~D(); }; -// CHECK: @__dso_handle = external global i8 +// CHECK: @__dso_handle = external hidden global i8 // CHECK: @c = global %struct.C zeroinitializer, align 8 // PR6205: The casts should not require global initializers Index: test/OpenMP/threadprivate_codegen.cpp =================================================================== --- test/OpenMP/threadprivate_codegen.cpp +++ test/OpenMP/threadprivate_codegen.cpp @@ -176,7 +176,7 @@ // CHECK-TLS-DAG: [[ST_S4_ST:@.+]] = linkonce_odr thread_local global %struct.S4 zeroinitializer // CHECK-TLS-DAG: [[ST_S4_ST_GUARD:@_ZGVN2STI2S4E2stE]] = linkonce_odr thread_local global i64 0 // CHECK-TLS-DAG: @__tls_guard = internal thread_local global i8 0 -// CHECK-TLS-DAG: @__dso_handle = external global i8 +// CHECK-TLS-DAG: @__dso_handle = external hidden global i8 // CHECK-TLS-DAG: [[GS1_TLS_INIT:@_ZTHL3gs1]] = internal alias void (), void ()* @__tls_init // CHECK-TLS-DAG: [[ARR_X_TLS_INIT:@_ZTH5arr_x]] = alias void (), void ()* @__tls_init