[cfe-commits] r63166 - /cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Fariborz Jahanian fjahanian at apple.com
Tue Jan 27 17:36:42 PST 2009


Author: fjahanian
Date: Tue Jan 27 19:36:42 2009
New Revision: 63166

URL: http://llvm.org/viewvc/llvm-project?rev=63166&view=rev
Log:
Set visibility of ivar offset symbols according to 
accessibility of the ivar (related to objc2's
non-fragile abi).

Modified:
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=63166&r1=63165&r2=63166&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Tue Jan 27 19:36:42 2009
@@ -571,7 +571,7 @@
   llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
   
   llvm::Constant *EmitIvarOffsetVar(const ObjCImplementationDecl *ID,
-                                    const FieldDecl *Field,
+                                    const ObjCIvarDecl *Ivar,
                                     unsigned long int offset);
   
 public:
@@ -3521,11 +3521,11 @@
 
 llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar(
                                               const ObjCImplementationDecl *ID,
-                                              const FieldDecl *Field,
+                                              const ObjCIvarDecl *Ivar,
                                               unsigned long int Offset) {
   
   std::string ExternalName("\01_OBJC_IVAR_$_" + ID->getNameAsString() + '.' 
-                           + Field->getNameAsString());
+                           + Ivar->getNameAsString());
   llvm::Constant *Init = llvm::ConstantInt::get(ObjCTypes.IntTy, Offset);
   
   llvm::GlobalVariable *IvarOffsetGV = 
@@ -3533,6 +3533,7 @@
   if (IvarOffsetGV) {
     // ivar offset symbol already built due to user code referencing it.
     IvarOffsetGV->setInitializer(Init);
+    UsedGlobals.push_back(IvarOffsetGV);
     return IvarOffsetGV;
   }
   
@@ -3543,6 +3544,11 @@
                              Init,
                              ExternalName,
                              &CGM.getModule());
+  // @private and @package have hidden visibility.
+  bool globalVisibility = (Ivar->getAccessControl() == ObjCIvarDecl::Public ||
+                           Ivar->getAccessControl() == ObjCIvarDecl::Protected);
+  if (!globalVisibility)
+    IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
   IvarOffsetGV->setSection("__DATA, __objc_const");
   UsedGlobals.push_back(IvarOffsetGV);
   
@@ -3589,11 +3595,14 @@
   RecordDecl::field_iterator i = RD->field_begin();
   while (countSuperClassIvars-- > 0)
     ++i;
+  ObjCInterfaceDecl::ivar_iterator I = OID->ivar_begin();
+  
   for (RecordDecl::field_iterator e = RD->field_end(); i != e; ++i) {
     FieldDecl *Field = *i;
     unsigned long offset = Layout->getElementOffset(CGM.getTypes().
                                                     getLLVMFieldNo(Field));
-    Ivar[0] = EmitIvarOffsetVar(ID, Field, offset);
+    const ObjCIvarDecl *ivarDecl = *I++;
+    Ivar[0] = EmitIvarOffsetVar(ID, ivarDecl, offset);
     if (Field->getIdentifier())
       Ivar[1] = GetMethodVarName(Field->getIdentifier());
     else





More information about the cfe-commits mailing list