]> granicus.if.org Git - clang/commitdiff
Propagte -fvisibility to objc2's class symbols.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 7 Apr 2009 20:26:30 +0000 (20:26 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 7 Apr 2009 20:26:30 +0000 (20:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68543 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGObjCMac.cpp
test/CodeGenObjC/class-obj-hidden-visibility.m [new file with mode: 0644]
test/CodeGenObjC/metadata_symbols.m

index f410e213cb138ac6b510e5b93058d75c78964211..f7829264e7627bda3f918313deb9c121f5b075f7 100644 (file)
@@ -440,6 +440,8 @@ protected:
   llvm::Constant *BuildIvarLayout(const ObjCImplementationDecl *OI,
                                   bool ForStrongLayout);
   
+  bool IsClassHidden(const ObjCInterfaceDecl *ID);
+  
   void BuildAggrIvarLayout(const ObjCInterfaceDecl *OI,
                            const llvm::StructLayout *Layout,
                            const RecordDecl *RD,
@@ -1426,10 +1428,8 @@ enum ClassFlags {
   eClassFlags_ABI2_HasCXXStructors = 0x00004   // <rdr://4923634>
 };
 
-// <rdr://5142207&4705298&4843145>
-static bool IsClassHidden(const ObjCInterfaceDecl *ID) {
+bool CGObjCCommonMac::IsClassHidden(const ObjCInterfaceDecl *ID) {
   if (const VisibilityAttr *attr = ID->getAttr<VisibilityAttr>()) {
-    // FIXME: Support -fvisibility
     switch (attr->getVisibility()) {
     default: 
       assert(0 && "Unknown visibility");
@@ -1440,9 +1440,9 @@ static bool IsClassHidden(const ObjCInterfaceDecl *ID) {
     case VisibilityAttr::HiddenVisibility:
       return true;
     }
-  } else {
-    return false; // FIXME: Support -fvisibility
-  }
+  } else
+      return (CGM.getLangOptions().getVisibilityMode() ==
+              LangOptions::HiddenVisibility);
 }
 
 /*
@@ -4522,9 +4522,6 @@ llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar(
     IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   else if (IsClassHidden(ID))
       IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
-  else if (CGM.getLangOptions().getVisibilityMode() == 
-           LangOptions::HiddenVisibility)
-    IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   else if (CGM.getLangOptions().getVisibilityMode() == 
            LangOptions::DefaultVisibility)
     IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility);
diff --git a/test/CodeGenObjC/class-obj-hidden-visibility.m b/test/CodeGenObjC/class-obj-hidden-visibility.m
new file mode 100644 (file)
index 0000000..fc4ac12
--- /dev/null
@@ -0,0 +1,6 @@
+// RUN: clang-cc -fvisibility=hidden -triple x86_64-apple-darwin10  -S -o - %s | grep -e "private_extern _OBJC_" | count 2 
+
+@interface INTF @end
+
+@implementation INTF @end
+
index 7141813df45d68d699147ba3c1c468890af2ea35..df36a50f521c76a0abd564113e97398e7e106660 100644 (file)
 
 // RUN: clang-cc -fvisibility=hidden -triple x86_64-apple-darwin9 -emit-llvm -o %t %s &&
 
-// FIXME: This is wrong, should be hidden
-// RUN: grep '@"OBJC_METACLASS_$_A" = global .*section "__DATA, __objc_data", align 8' %t && 
-// FIXME: This is wrong, should be hidden
-// RUN: grep '@"OBJC_CLASS_$_A" = global .*section "__DATA, __objc_data", align 8' %t &&
+// RUN: grep '@"OBJC_METACLASS_$_A" = hidden global .*section "__DATA, __objc_data", align 8' %t && 
+// RUN: grep '@"OBJC_CLASS_$_A" = hidden global .*section "__DATA, __objc_data", align 8' %t &&
 // RUN: grep '@"OBJC_EHTYPE_$_EH1" = weak hidden global .*section "__DATA,__datacoal_nt,coalesced"' %t &&
 // RUN: grep -F 'define internal void @"\01-[A im0]"' %t &&
 // FIXME: Should include category name.