diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-17 18:36:30 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-17 18:36:30 +0000 |
commit | 020de3254acc3847aea99c6ed97b7701035f251c (patch) | |
tree | 609dade19c8863772513ca126802b78c71771eef /clang/lib/CodeGen/CGObjCMac.cpp | |
parent | a77c03be54d46a56c6813f0dd86d788040a808c8 (diff) | |
download | bcm5719-llvm-020de3254acc3847aea99c6ed97b7701035f251c.tar.gz bcm5719-llvm-020de3254acc3847aea99c6ed97b7701035f251c.zip |
Don't eagerly deserialize the 'Protocol' type when initializing code
generation for Objective-C; it may not be needed.
llvm-svn: 148317
Diffstat (limited to 'clang/lib/CodeGen/CGObjCMac.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGObjCMac.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index 3171d988d33..45fe53d9a51 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -185,10 +185,26 @@ public: /// SelectorPtrTy - LLVM type for selector handles (typeof(SEL)) llvm::Type *SelectorPtrTy; + +private: /// ProtocolPtrTy - LLVM type for external protocol handles /// (typeof(Protocol)) llvm::Type *ExternalProtocolPtrTy; - + +public: + llvm::Type *getExternalProtocolPtrTy() { + if (!ExternalProtocolPtrTy) { + // FIXME: It would be nice to unify this with the opaque type, so that the + // IR comes out a bit cleaner. + CodeGen::CodeGenTypes &Types = CGM.getTypes(); + ASTContext &Ctx = CGM.getContext(); + llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType()); + ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T); + } + + return ExternalProtocolPtrTy; + } + // SuperCTy - clang type for struct objc_super. QualType SuperCTy; // SuperPtrCTy - clang type for struct objc_super *. @@ -1769,7 +1785,7 @@ llvm::Value *CGObjCMac::GenerateProtocolRef(CGBuilderTy &Builder, LazySymbols.insert(&CGM.getContext().Idents.get("Protocol")); return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD), - ObjCTypes.ExternalProtocolPtrTy); + ObjCTypes.getExternalProtocolPtrTy()); } void CGObjCCommonMac::GenerateProtocol(const ObjCProtocolDecl *PD) { @@ -4232,11 +4248,6 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) PtrObjectPtrTy = llvm::PointerType::getUnqual(ObjectPtrTy); SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType()); - // FIXME: It would be nice to unify this with the opaque type, so that the IR - // comes out a bit cleaner. - llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType()); - ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T); - // I'm not sure I like this. The implicit coordination is a bit // gross. We should solve this in a reasonable fashion because this // is a pretty common task (match some runtime data structure with @@ -5111,7 +5122,7 @@ llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CGBuilderTy &Builder, // llvm::Constant *Init = llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD), - ObjCTypes.ExternalProtocolPtrTy); + ObjCTypes.getExternalProtocolPtrTy()); std::string ProtocolName("\01l_OBJC_PROTOCOL_REFERENCE_$_"); ProtocolName += PD->getName(); |