[cfe-commits] r64994 - in /cfe/trunk/lib: AST/ExprConstant.cpp CodeGen/CGBlocks.cpp CodeGen/CGExprConstant.cpp CodeGen/CGExprScalar.cpp CodeGen/CodeGenModule.h
Mike Stump
mrs at apple.com
Wed Feb 18 17:01:04 PST 2009
Author: mrs
Date: Wed Feb 18 19:01:04 2009
New Revision: 64994
URL: http://llvm.org/viewvc/llvm-project?rev=64994&view=rev
Log:
More codegen for blocks. The type of block literals should be better.
The size calculation is improved.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/lib/CodeGen/CGBlocks.cpp
cfe/trunk/lib/CodeGen/CGExprConstant.cpp
cfe/trunk/lib/CodeGen/CGExprScalar.cpp
cfe/trunk/lib/CodeGen/CodeGenModule.h
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=64994&r1=64993&r2=64994&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Feb 18 19:01:04 2009
@@ -260,6 +260,7 @@
APValue VisitAddrLabelExpr(AddrLabelExpr *E)
{ return APValue(E, 0); }
APValue VisitCallExpr(CallExpr *E);
+ APValue VisitBlockExpr(BlockExpr *E) { return APValue(E, 0); }
APValue VisitConditionalOperator(ConditionalOperator *E);
};
} // end anonymous namespace
Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=64994&r1=64993&r2=64994&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Wed Feb 18 19:01:04 2009
@@ -46,8 +46,13 @@
Elts.push_back(C);
// Size
- int sz = CGM.getTargetData()
- .getTypeStoreSizeInBits(CGM.getGenericBlockLiteralType()) / 8;
+ int sz;
+ if (!BlockHasCopyDispose)
+ sz = CGM.getTargetData()
+ .getTypeStoreSizeInBits(CGM.getGenericBlockLiteralType()) / 8;
+ else
+ sz = CGM.getTargetData()
+ .getTypeStoreSizeInBits(CGM.getGenericExtendedBlockLiteralType()) / 8;
C = llvm::ConstantInt::get(UnsignedLongTy, sz);
Elts.push_back(C);
@@ -107,6 +112,8 @@
return NSConcreteStackBlock;
}
+// FIXME: Push most into CGM, passing down a few bits, like current
+// function name.
llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) {
// FIXME: Push up
bool BlockHasCopyDispose = false;
@@ -146,7 +153,7 @@
C = llvm::ConstantInt::get(IntTy, 0);
Elts.push_back(C);
- // __FuncPtr
+ // __invoke
const char *Name = "";
if (const NamedDecl *ND = dyn_cast<NamedDecl>(CurFuncDecl))
if (ND->getIdentifier())
@@ -168,6 +175,8 @@
C = new llvm::GlobalVariable(C->getType(), true,
llvm::GlobalValue::InternalLinkage,
C, Name, &CGM.getModule());
+ QualType BPT = BE->getType();
+ C = llvm::ConstantExpr::getBitCast(C, ConvertType(BPT));
return C;
}
@@ -210,11 +219,11 @@
getTypes().ConvertType(getContext().IntTy));
// struct __block_literal_generic {
- // void *isa;
- // int flags;
- // int reserved;
- // void (*invoke)(void *);
- // struct __block_descriptor *descriptor;
+ // void *__isa;
+ // int __flags;
+ // int __reserved;
+ // void (*__invoke)(void *);
+ // struct __block_descriptor *__descriptor;
// };
GenericBlockLiteralType = llvm::StructType::get(Int8PtrTy,
IntTy,
@@ -229,6 +238,44 @@
return GenericBlockLiteralType;
}
+const llvm::Type *
+CodeGenModule::getGenericExtendedBlockLiteralType() {
+ if (GenericExtendedBlockLiteralType)
+ return GenericExtendedBlockLiteralType;
+
+ const llvm::Type *Int8PtrTy =
+ llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+
+ const llvm::Type *BlockDescPtrTy =
+ llvm::PointerType::getUnqual(getBlockDescriptorType());
+
+ const llvm::IntegerType *IntTy = cast<llvm::IntegerType>(
+ getTypes().ConvertType(getContext().IntTy));
+
+ // struct __block_literal_generic {
+ // void *__isa;
+ // int __flags;
+ // int __reserved;
+ // void (*__invoke)(void *);
+ // struct __block_descriptor *__descriptor;
+ // void *__copy_func_helper_decl;
+ // void *__destroy_func_decl;
+ // };
+ GenericExtendedBlockLiteralType = llvm::StructType::get(Int8PtrTy,
+ IntTy,
+ IntTy,
+ Int8PtrTy,
+ BlockDescPtrTy,
+ Int8PtrTy,
+ Int8PtrTy,
+ NULL);
+
+ getModule().addTypeName("struct.__block_literal_extended_generic",
+ GenericExtendedBlockLiteralType);
+
+ return GenericExtendedBlockLiteralType;
+}
+
/// getBlockFunctionType - Given a BlockPointerType, will return the
/// function type for the block, including the first block literal argument.
static QualType getBlockFunctionType(ASTContext &Ctx,
Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=64994&r1=64993&r2=64994&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Wed Feb 18 19:01:04 2009
@@ -614,6 +614,9 @@
std::string S(Literal->getStrData(), Literal->getByteLength());
return CGM.GetAddrOfConstantCFString(S);
}
+ case Expr::BlockExprClass: {
+ return CGF->BuildBlockLiteralTmp(cast<BlockExpr>(E));
+ }
}
return 0;
Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=64994&r1=64993&r2=64994&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Wed Feb 18 19:01:04 2009
@@ -1364,10 +1364,7 @@
Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *BE) {
llvm::Constant *C = CGF.BuildBlockLiteralTmp(BE);
-
- const llvm::PointerType *PtrToInt8Ty
- = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
- return llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
+ return C;
}
//===----------------------------------------------------------------------===//
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=64994&r1=64993&r2=64994&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.h Wed Feb 18 19:01:04 2009
@@ -145,6 +145,7 @@
const llvm::Type *BlockDescriptorType;
const llvm::Type *GenericBlockLiteralType;
+ const llvm::Type *GenericExtendedBlockLiteralType;
struct {
int GlobalUniqueCount;
} Block;
@@ -166,6 +167,7 @@
const llvm::Type *getBlockDescriptorType();
const llvm::Type *getGenericBlockLiteralType();
+ const llvm::Type *getGenericExtendedBlockLiteralType();
/// getObjCRuntime() - Return a reference to the configured
/// Objective-C runtime.
More information about the cfe-commits
mailing list