Move GenericBlockLiteralType into CGM.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64452 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index cb096fc..2168351 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -47,34 +47,35 @@
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
@@ -103,7 +104,7 @@
// 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 =
@@ -164,7 +165,7 @@
// 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 =
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 422eb3b..53d99f0 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -37,7 +37,7 @@
: 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) {
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index c484264..eb9ce7d 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -128,6 +128,7 @@
llvm::Constant *NSConcreteGlobalBlock;
const llvm::Type *BlockDescriptorType;
+ const llvm::Type * GenericBlockLiteralType;
std::vector<llvm::Function *> BuiltinFunctions;
public:
@@ -142,6 +143,8 @@
const llvm::Type *getBlockDescriptorType();
+ const llvm::Type *getGenericBlockLiteralType();
+
/// getObjCRuntime() - Return a reference to the configured
/// Objective-C runtime.
CGObjCRuntime &getObjCRuntime() {