Move GenericBlockLiteralType into CGM.

llvm-svn: 64452
This commit is contained in:
Mike Stump 2009-02-13 15:25:34 +00:00
parent 650c932d80
commit 005c9a62b5
3 changed files with 31 additions and 27 deletions

View File

@ -47,34 +47,35 @@ const llvm::Type *CodeGenModule::getBlockDescriptorType() {
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 @@ RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) {
// 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 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalBlock(const BlockExpr *BE) {
// 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 =

View File

@ -37,7 +37,7 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO,
: 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) {

View File

@ -128,6 +128,7 @@ class CodeGenModule {
llvm::Constant *NSConcreteGlobalBlock;
const llvm::Type *BlockDescriptorType;
const llvm::Type * GenericBlockLiteralType;
std::vector<llvm::Function *> BuiltinFunctions;
public:
@ -142,6 +143,8 @@ public:
const llvm::Type *getBlockDescriptorType();
const llvm::Type *getGenericBlockLiteralType();
/// getObjCRuntime() - Return a reference to the configured
/// Objective-C runtime.
CGObjCRuntime &getObjCRuntime() {