diff --git a/clang/lib/CodeGen/CGRTTI.cpp b/clang/lib/CodeGen/CGRTTI.cpp index 53c45cd3e9ff..1642548ca99c 100644 --- a/clang/lib/CodeGen/CGRTTI.cpp +++ b/clang/lib/CodeGen/CGRTTI.cpp @@ -679,7 +679,10 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) { // Give the type_info object and name the formal visibility of the // type itself. llvm::GlobalValue::VisibilityTypes llvmVisibility; - if (RTTIUniqueness == CGCXXABI::RUK_NonUniqueHidden) + if (llvm::GlobalValue::isLocalLinkage(Linkage)) + // If the linkage is local, only default visibility makes sense. + llvmVisibility = llvm::GlobalValue::DefaultVisibility; + else if (RTTIUniqueness == CGCXXABI::RUK_NonUniqueHidden) llvmVisibility = llvm::GlobalValue::HiddenVisibility; else llvmVisibility = CodeGenModule::GetLLVMVisibility(Ty->getVisibility()); diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp b/clang/lib/CodeGen/ItaniumCXXABI.cpp index d11d1728afec..8fdcaee31c9c 100644 --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp @@ -1586,7 +1586,8 @@ ItaniumCXXABI::getOrCreateThreadLocalWrapper(const VarDecl *VD, CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false)), WrapperName.str(), &CGM.getModule()); // Always resolve references to the wrapper at link time. - Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility); + if (!Wrapper->hasLocalLinkage()) + Wrapper->setVisibility(llvm::GlobalValue::HiddenVisibility); return Wrapper; } diff --git a/clang/test/CodeGenCXX/cxx11-thread-local.cpp b/clang/test/CodeGenCXX/cxx11-thread-local.cpp index 7813a47ffe9d..a3690b352989 100644 --- a/clang/test/CodeGenCXX/cxx11-thread-local.cpp +++ b/clang/test/CodeGenCXX/cxx11-thread-local.cpp @@ -151,7 +151,7 @@ thread_local int anon_i{1}; void set_anon_i() { anon_i = 2; } -// CHECK-LABEL: define internal hidden i32* @_ZTWN12_GLOBAL__N_16anon_iE() +// CHECK-LABEL: define internal i32* @_ZTWN12_GLOBAL__N_16anon_iE() // CHECK: define {{.*}} @[[V_M_INIT:.*]]() // CHECK: load i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*) @@ -189,7 +189,7 @@ void set_anon_i() { // CHECK: declare extern_weak void @_ZTH1b() -// CHECK-LABEL: define internal hidden i32* @_ZTWL1d() +// CHECK-LABEL: define internal i32* @_ZTWL1d() // CHECK: call void @_ZTHL1d() // CHECK: ret i32* @_ZL1d diff --git a/clang/test/CodeGenCXX/rtti-linkage.cpp b/clang/test/CodeGenCXX/rtti-linkage.cpp index 1484b99b196f..3b06d426e5a9 100644 --- a/clang/test/CodeGenCXX/rtti-linkage.cpp +++ b/clang/test/CodeGenCXX/rtti-linkage.cpp @@ -1,8 +1,31 @@ -// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s -// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck -check-prefix=CHECK-WITH-HIDDEN %s +// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BOTH +// RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck -check-prefix=CHECK-WITH-HIDDEN -check-prefix=CHECK-BOTH %s #include +// CHECK-BOTH: _ZTSP1C = internal constant +// CHECK-BOTH: _ZTS1C = internal constant +// CHECK-BOTH: _ZTI1C = internal constant +// CHECK-BOTH: _ZTIP1C = internal constant +// CHECK-BOTH: _ZTSPP1C = internal constant +// CHECK-BOTH: _ZTIPP1C = internal constant +// CHECK-BOTH: _ZTSM1Ci = internal constant +// CHECK-BOTH: _ZTIM1Ci = internal constant +// CHECK-BOTH: _ZTSPM1Ci = internal constant +// CHECK-BOTH: _ZTIPM1Ci = internal constant +// CHECK-BOTH: _ZTSM1CS_ = internal constant +// CHECK-BOTH: _ZTIM1CS_ = internal constant +// CHECK-BOTH: _ZTSM1CPS_ = internal constant +// CHECK-BOTH: _ZTIM1CPS_ = internal constant +// CHECK-BOTH: _ZTSM1A1C = internal constant +// CHECK: _ZTS1A = linkonce_odr constant +// CHECK-WITH-HIDDEN: _ZTS1A = linkonce_odr hidden constant +// CHECK: _ZTI1A = linkonce_odr constant +// CHECK-WITH-HIDDEN: _ZTI1A = linkonce_odr hidden constant +// CHECK-BOTH: _ZTIM1A1C = internal constant +// CHECK-BOTH: _ZTSM1AP1C = internal constant +// CHECK-BOTH: _ZTIM1AP1C = internal constant + // CHECK-WITH-HIDDEN: _ZTSFN12_GLOBAL__N_11DEvE = internal constant // CHECK-WITH-HIDDEN: @_ZTSPK2T4 = linkonce_odr hidden constant // CHECK-WITH-HIDDEN: @_ZTS2T4 = linkonce_odr hidden constant @@ -17,26 +40,6 @@ // CHECK-WITH-HIDDEN: @_ZTSZ2t6vE1A = linkonce_odr hidden constant // CHECK-WITH-HIDDEN: @_ZTIZ2t6vE1A = linkonce_odr hidden constant -// CHECK: _ZTSP1C = internal constant -// CHECK: _ZTS1C = internal constant -// CHECK: _ZTI1C = internal constant -// CHECK: _ZTIP1C = internal constant -// CHECK: _ZTSPP1C = internal constant -// CHECK: _ZTIPP1C = internal constant -// CHECK: _ZTSM1Ci = internal constant -// CHECK: _ZTIM1Ci = internal constant -// CHECK: _ZTSPM1Ci = internal constant -// CHECK: _ZTIPM1Ci = internal constant -// CHECK: _ZTSM1CS_ = internal constant -// CHECK: _ZTIM1CS_ = internal constant -// CHECK: _ZTSM1CPS_ = internal constant -// CHECK: _ZTIM1CPS_ = internal constant -// CHECK: _ZTSM1A1C = internal constant -// CHECK: _ZTS1A = linkonce_odr constant -// CHECK: _ZTI1A = linkonce_odr constant -// CHECK: _ZTIM1A1C = internal constant -// CHECK: _ZTSM1AP1C = internal constant -// CHECK: _ZTIM1AP1C = internal constant // CHECK: _ZTSN12_GLOBAL__N_11DE = internal constant // CHECK: _ZTIN12_GLOBAL__N_11DE = internal constant // CHECK: _ZTSPN12_GLOBAL__N_11DE = internal constant