From 2fa5a27f38b2c4abc26e86895fdcef3ec84af39d Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 28 Jan 2009 01:36:42 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGObjCMac.cpp | 17 +++++++++++++---- 1 file 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 -- 2.40.0