return BlockDescriptorType;
}
-static const llvm::Type *getGenericBlockLiteralType(CodeGenModule &CGM) {
- static const llvm::Type *Ty = 0;
-
- if (!Ty) {
- const llvm::Type *Int8PtrTy =
- llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+const llvm::Type *
+CodeGenModule::getGenericBlockLiteralType() {
+ if (GenericBlockLiteralType)
+ return GenericBlockLiteralType;
+
+ const llvm::Type *Int8PtrTy =
+ llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
- const llvm::Type *BlockDescPtrTy =
- llvm::PointerType::getUnqual(CGM.getBlockDescriptorType());
+ const llvm::Type *BlockDescPtrTy =
+ llvm::PointerType::getUnqual(getBlockDescriptorType());
- // struct __block_literal_generic {
- // void *isa;
- // int flags;
- // int reserved;
- // void (*invoke)(void *);
- // struct __block_descriptor *descriptor;
- // };
- Ty = llvm::StructType::get(Int8PtrTy,
- llvm::Type::Int32Ty,
- llvm::Type::Int32Ty,
- Int8PtrTy,
- BlockDescPtrTy,
- NULL);
+ // struct __block_literal_generic {
+ // void *isa;
+ // int flags;
+ // int reserved;
+ // void (*invoke)(void *);
+ // struct __block_descriptor *descriptor;
+ // };
+ GenericBlockLiteralType = llvm::StructType::get(Int8PtrTy,
+ llvm::Type::Int32Ty,
+ llvm::Type::Int32Ty,
+ Int8PtrTy,
+ BlockDescPtrTy,
+ NULL);
- CGM.getModule().addTypeName("struct.__block_literal_generic", Ty);
- }
+ getModule().addTypeName("struct.__block_literal_generic",
+ GenericBlockLiteralType);
- return Ty;
+ return GenericBlockLiteralType;
}
/// getBlockFunctionType - Given a BlockPointerType, will return the
// Get a pointer to the generic block literal.
const llvm::Type *BlockLiteralTy =
- llvm::PointerType::getUnqual(getGenericBlockLiteralType(CGM));
+ llvm::PointerType::getUnqual(CGM.getGenericBlockLiteralType());
// Bitcast the callee to a block literal.
llvm::Value *BlockLiteral =
// Block literal size. For global blocks we just use the size of the generic
// block literal struct.
uint64_t BlockLiteralSize =
- TheTargetData.getTypeStoreSizeInBits(getGenericBlockLiteralType(*this)) / 8;
+ TheTargetData.getTypeStoreSizeInBits(getGenericBlockLiteralType()) / 8;
DescriptorFields[1] = llvm::ConstantInt::get(UnsignedLongTy,BlockLiteralSize);
llvm::Constant *DescriptorStruct =
: 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),
- BlockDescriptorType(0) {
+ BlockDescriptorType(0), GenericBlockLiteralType(0) {
if (Features.ObjC1) {
if (Features.NeXTRuntime) {
llvm::Constant *NSConcreteGlobalBlock;
const llvm::Type *BlockDescriptorType;
+ const llvm::Type * GenericBlockLiteralType;
std::vector<llvm::Function *> BuiltinFunctions;
public:
const llvm::Type *getBlockDescriptorType();
+ const llvm::Type *getGenericBlockLiteralType();
+
/// getObjCRuntime() - Return a reference to the configured
/// Objective-C runtime.
CGObjCRuntime &getObjCRuntime() {