diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-28 01:36:42 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-28 01:36:42 +0000 |
commit | 2fa5a27f38b2c4abc26e86895fdcef3ec84af39d (patch) | |
tree | dee2113134b8bf7a414aaad9512df7ea4becd953 /lib/CodeGen/CGObjCMac.cpp | |
parent | 1bf0afbb08a23412d1607505c092a537f305d8c7 (diff) |
Set visibility of ivar offset symbols according to
accessibility of the ivar (related to objc2's
non-fragile abi).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63166 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index ad8bba4aaf..f786a4729b 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -571,7 +571,7 @@ private: 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::EmitMethodList( 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 @@ llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar( 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 @@ llvm::Constant * CGObjCNonFragileABIMac::EmitIvarOffsetVar( 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 @@ llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList( 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 |