From: Fariborz Jahanian Date: Thu, 29 Jan 2009 20:10:59 +0000 (+0000) Subject: Set protocol linkage and visibility correctly and X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8448c2cdab6e3d4b15725921735243c77b06623d;p=clang Set protocol linkage and visibility correctly and build protocol translation table meta-data (objc2 non-fragile abi). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63329 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index 67db5fa7e6..09987a291e 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -3843,12 +3843,12 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol( if (Entry) { // Already created, fix the linkage and update the initializer. - Entry->setLinkage(llvm::GlobalValue::InternalLinkage); + Entry->setLinkage(llvm::GlobalValue::WeakLinkage); Entry->setInitializer(Init); } else { Entry = new llvm::GlobalVariable(ObjCTypes.ProtocolnfABITy, false, - llvm::GlobalValue::InternalLinkage, + llvm::GlobalValue::WeakLinkage, Init, std::string("\01l_OBJC_PROTOCOL_$_")+ProtocolName, &CGM.getModule()); @@ -3856,6 +3856,21 @@ llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol( // FIXME: Is this necessary? Why only for protocol? Entry->setAlignment(4); } + Entry->setVisibility(llvm::GlobalValue::HiddenVisibility); + + // Use this protocol meta-data to build protocol list table in section + // __DATA, __objc_protolist + llvm::Type *ptype = llvm::PointerType::getUnqual(ObjCTypes.ProtocolnfABITy); + llvm::GlobalVariable *PTGV = new llvm::GlobalVariable( + ptype, false, + llvm::GlobalValue::WeakLinkage, + Entry, + std::string("\01l_OBJC_LABEL_PROTOCOL_$_") + +ProtocolName, + &CGM.getModule()); + PTGV->setSection("__DATA, __objc_protolist"); + PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); + UsedGlobals.push_back(PTGV); return Entry; }