From: Mike Stump Date: Fri, 13 Feb 2009 15:16:56 +0000 (+0000) Subject: Move BlockDescriptorType into CGM. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ab695143861b520f5c9f8f982534a71d355396f1;p=clang Move BlockDescriptorType into CGM. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64451 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 9aa5207a44..cb096fcacc 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -26,25 +26,25 @@ enum { IsGlobal = 1 << 28 }; -static const llvm::Type *getBlockDescriptorType(CodeGenModule &CGM) { - static const llvm::Type *Ty = 0; - - if (!Ty) { - const llvm::Type *UnsignedLongTy = - CGM.getTypes().ConvertType(CGM.getContext().UnsignedLongTy); - - // struct __block_descriptor { - // unsigned long reserved; - // unsigned long block_size; - // }; - Ty = llvm::StructType::get(UnsignedLongTy, - UnsignedLongTy, - NULL); +const llvm::Type *CodeGenModule::getBlockDescriptorType() { + if (BlockDescriptorType) + return BlockDescriptorType; + + const llvm::Type *UnsignedLongTy = + getTypes().ConvertType(getContext().UnsignedLongTy); - CGM.getModule().addTypeName("struct.__block_descriptor", Ty); - } - - return Ty; + // struct __block_descriptor { + // unsigned long reserved; + // unsigned long block_size; + // }; + BlockDescriptorType = llvm::StructType::get(UnsignedLongTy, + UnsignedLongTy, + NULL); + + getModule().addTypeName("struct.__block_descriptor", + BlockDescriptorType); + + return BlockDescriptorType; } static const llvm::Type *getGenericBlockLiteralType(CodeGenModule &CGM) { @@ -55,7 +55,7 @@ static const llvm::Type *getGenericBlockLiteralType(CodeGenModule &CGM) { llvm::PointerType::getUnqual(llvm::Type::Int8Ty); const llvm::Type *BlockDescPtrTy = - llvm::PointerType::getUnqual(getBlockDescriptorType(CGM)); + llvm::PointerType::getUnqual(CGM.getBlockDescriptorType()); // struct __block_literal_generic { // void *isa; diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index df4a3d0763..422eb3bb7b 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -36,7 +36,8 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO, Diagnostic &diags, bool GenerateDebugInfo) : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags), Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), - CFConstantStringClassRef(0), NSConcreteGlobalBlock(0) { + CFConstantStringClassRef(0), NSConcreteGlobalBlock(0), + BlockDescriptorType(0) { if (Features.ObjC1) { if (Features.NeXTRuntime) { diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index d8719efabf..c484264e3d 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -123,10 +123,12 @@ class CodeGenModule { /// Obj-C class pointer. llvm::Constant *CFConstantStringClassRef; - /// NSConcreteGlobalBlock - Cached reference to the clas pointer for + /// NSConcreteGlobalBlock - Cached reference to the class pointer for /// global blocks. llvm::Constant *NSConcreteGlobalBlock; + const llvm::Type *BlockDescriptorType; + std::vector BuiltinFunctions; public: CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M, @@ -138,6 +140,8 @@ public: /// Release - Finalize LLVM code generation. void Release(); + const llvm::Type *getBlockDescriptorType(); + /// getObjCRuntime() - Return a reference to the configured /// Objective-C runtime. CGObjCRuntime &getObjCRuntime() {