]> granicus.if.org Git - clang/commitdiff
When emitting RTTI for a non-class type, compute the visibility of the RTTI data...
authorAnders Carlsson <andersca@mac.com>
Sat, 29 Jan 2011 22:10:32 +0000 (22:10 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 29 Jan 2011 22:10:32 +0000 (22:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124553 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGRTTI.cpp
test/CodeGenCXX/rtti-linkage.cpp
test/CodeGenCXX/rtti-visibility.cpp

index b2129489bb303b409e77e863c32fd21574ab1cee..957b21893c5571854f20b6ae457018c0a45b810b 100644 (file)
@@ -570,11 +570,7 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
   llvm::GlobalVariable *TypeName = GetAddrOfTypeName(Ty, Linkage);
 
   const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);
-  llvm::Constant *TypeNameAsInt8Ptr = 
-    llvm::ConstantExpr::getBitCast(TypeName, Int8PtrTy);
-
-  bool Hidden = DecideHidden(Ty);
-  Fields.push_back(TypeNameAsInt8Ptr);
+  Fields.push_back(llvm::ConstantExpr::getBitCast(TypeName, Int8PtrTy));
 
   switch (Ty->getTypeClass()) {
 #define TYPE(Class, Base)
@@ -677,12 +673,21 @@ llvm::Constant *RTTIBuilder::BuildTypeInfo(QualType Ty, bool Force) {
 
     CGM.setTypeVisibility(GV, RD, CodeGenModule::TVK_ForRTTI);
     CGM.setTypeVisibility(TypeName, RD, CodeGenModule::TVK_ForRTTIName);
-
-  } else if (Hidden || 
-           (CGM.getCodeGenOpts().HiddenWeakVTables &&
-            Linkage == llvm::GlobalValue::LinkOnceODRLinkage)) {
-    GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
+  } else {
+    Visibility TypeInfoVisibility = DefaultVisibility;
+    if (CGM.getCodeGenOpts().HiddenWeakVTables &&
+        Linkage == llvm::GlobalValue::LinkOnceODRLinkage)
+      TypeInfoVisibility = HiddenVisibility;
+
+    // The type name should have the same visibility as the type itself.
+    Visibility ExplicitVisibility = Ty->getVisibility();
+    TypeName->setVisibility(CodeGenModule::
+                            GetLLVMVisibility(ExplicitVisibility));
+  
+    TypeInfoVisibility = minVisibility(TypeInfoVisibility, Ty->getVisibility());
+    GV->setVisibility(CodeGenModule::GetLLVMVisibility(TypeInfoVisibility));
   }
+
   GV->setUnnamedAddr(true);
 
   return llvm::ConstantExpr::getBitCast(GV, Int8PtrTy);
index 6f7375703964bc355d747e30c2b780c8634e7055..42fe435234042692124c1a3e88f901203df0c0e2 100644 (file)
@@ -4,7 +4,7 @@
 #include <typeinfo>
 
 // CHECK-WITH-HIDDEN: _ZTSFN12_GLOBAL__N_11DEvE = internal constant
-// CHECK-WITH-HIDDEN: @_ZTSPK2T4 = linkonce_odr constant 
+// CHECK-WITH-HIDDEN: @_ZTSPK2T4 = linkonce_odr hidden constant 
 // CHECK-WITH-HIDDEN: @_ZTS2T4 = linkonce_odr hidden constant 
 // CHECK-WITH-HIDDEN: @_ZTI2T4 = linkonce_odr hidden unnamed_addr constant 
 // CHECK-WITH-HIDDEN: @_ZTIPK2T4 = linkonce_odr hidden unnamed_addr constant 
index 249331dc42055d7c46a02dc6e507168df890ba4a..4b3f6b2d1c2e416fa6f88ac5af64637cbdfab1e8 100644 (file)
@@ -10,7 +10,7 @@ namespace Test1 {
   // A is explicitly marked hidden, so all RTTI data should also be marked hidden.
   // CHECK-TEST1: @_ZTSN5Test11AE = linkonce_odr hidden constant
   // CHECK-TEST1: @_ZTIN5Test11AE = linkonce_odr hidden unnamed_addr constant
-  // CHECK-TEST1: @_ZTSPN5Test11AE = linkonce_odr constant
+  // CHECK-TEST1: @_ZTSPN5Test11AE = linkonce_odr hidden constant
   // CHECK-TEST1: @_ZTIPN5Test11AE = linkonce_odr hidden unnamed_addr constant
   struct __attribute__((visibility("hidden"))) A { };