[cfe-commits] r64457 - in /cfe/trunk/lib/CodeGen: CGBlocks.cpp CGExprScalar.cpp CodeGenFunction.h
Mike Stump
mrs at apple.com
Fri Feb 13 08:19:20 PST 2009
Author: mrs
Date: Fri Feb 13 10:19:19 2009
New Revision: 64457
URL: http://llvm.org/viewvc/llvm-project?rev=64457&view=rev
Log:
Condense all the blocks code into CGBlocks.cpp.
Modified:
cfe/trunk/lib/CodeGen/CGBlocks.cpp
cfe/trunk/lib/CodeGen/CGExprScalar.cpp
cfe/trunk/lib/CodeGen/CodeGenFunction.h
Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=64457&r1=64456&r2=64457&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Fri Feb 13 10:19:19 2009
@@ -21,11 +21,138 @@
using namespace clang;
using namespace CodeGen;
-// Block flags
enum {
- IsGlobal = 1 << 28
+ BLOCK_NEEDS_FREE = (1 << 24),
+ BLOCK_HAS_COPY_DISPOSE = (1 << 25),
+ BLOCK_HAS_CXX_OBJ = (1 << 26),
+ BLOCK_IS_GC = (1 << 27),
+ BLOCK_IS_GLOBAL = (1 << 28),
+ BLOCK_HAS_DESCRIPTOR = (1 << 29)
};
+llvm::Constant *CodeGenFunction::BuildDescriptorBlockDecl() {
+ // FIXME: Push up.
+ bool BlockHasCopyDispose = false;
+
+ const llvm::PointerType *PtrToInt8Ty
+ = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+ llvm::Constant *C;
+ std::vector<llvm::Constant*> Elts;
+
+ // reserved
+ const llvm::IntegerType *LongTy
+ = cast<llvm::IntegerType>(
+ CGM.getTypes().ConvertType(CGM.getContext().LongTy));
+ C = llvm::ConstantInt::get(LongTy, 0);
+ Elts.push_back(C);
+
+ // Size
+ // FIXME: This should be the size of BlockStructType
+ C = llvm::ConstantInt::get(LongTy, 20);
+ Elts.push_back(C);
+
+ if (BlockHasCopyDispose) {
+ // copy_func_helper_decl
+ C = llvm::ConstantInt::get(LongTy, 0);
+ C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
+ Elts.push_back(C);
+
+ // destroy_func_decl
+ C = llvm::ConstantInt::get(LongTy, 0);
+ C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
+ Elts.push_back(C);
+ }
+
+ C = llvm::ConstantStruct::get(Elts);
+
+ // FIXME: Should be in module?
+ static int desc_unique_count;
+ char Name[32];
+ sprintf(Name, "__block_descriptor_tmp_%d", ++desc_unique_count);
+ C = new llvm::GlobalVariable(C->getType(), true,
+ llvm::GlobalValue::InternalLinkage,
+ C, Name, &CGM.getModule());
+ return C;
+}
+
+llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() {
+ // FIXME: Push up
+ bool BlockHasCopyDispose = false;
+ bool insideFunction = false;
+ bool BlockRefDeclList = false;
+ bool BlockByrefDeclList = false;
+
+ std::vector<llvm::Constant*> Elts;
+ llvm::Constant *C;
+
+ bool staticBlockTmp = (BlockRefDeclList == 0
+ && BlockByrefDeclList == 0);
+
+ {
+ // C = BuildBlockStructInitlist();
+ unsigned int flags = BLOCK_HAS_DESCRIPTOR;
+
+ if (BlockHasCopyDispose)
+ flags |= BLOCK_HAS_COPY_DISPOSE;
+
+ const llvm::PointerType *PtrToInt8Ty
+ = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+ // FIXME: static? What if we start up a new, unrelated module?
+ // logically we want 1 per module.
+ static llvm::Constant *NSConcreteGlobalBlock_decl
+ = new llvm::GlobalVariable(PtrToInt8Ty, false,
+ llvm::GlobalValue::ExternalLinkage,
+ 0, "_NSConcreteGlobalBlock",
+ &CGM.getModule());
+ static llvm::Constant *NSConcreteStackBlock_decl
+ = new llvm::GlobalVariable(PtrToInt8Ty, false,
+ llvm::GlobalValue::ExternalLinkage,
+ 0, "_NSConcreteStackBlock",
+ &CGM.getModule());
+ C = NSConcreteStackBlock_decl;
+ if (!insideFunction ||
+ (!BlockRefDeclList && !BlockByrefDeclList)) {
+ C = NSConcreteGlobalBlock_decl;
+ flags |= BLOCK_IS_GLOBAL;
+ }
+ C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
+ Elts.push_back(C);
+
+ // __flags
+ const llvm::IntegerType *IntTy = cast<llvm::IntegerType>(
+ CGM.getTypes().ConvertType(CGM.getContext().IntTy));
+ C = llvm::ConstantInt::get(IntTy, flags);
+ Elts.push_back(C);
+
+ // __reserved
+ C = llvm::ConstantInt::get(IntTy, 0);
+ Elts.push_back(C);
+
+ // __FuncPtr
+ // FIXME: Build this up.
+ Elts.push_back(C);
+
+ // __descriptor
+ Elts.push_back(BuildDescriptorBlockDecl());
+
+ // FIXME: Add block_original_ref_decl_list and block_byref_decl_list.
+ }
+
+ C = llvm::ConstantStruct::get(Elts);
+
+ char Name[32];
+ // FIXME: Boost in CGM?
+ static int global_unique_count;
+ sprintf(Name, "__block_holder_tmp_%d", ++global_unique_count);
+ C = new llvm::GlobalVariable(C->getType(), true,
+ llvm::GlobalValue::InternalLinkage,
+ C, Name, &CGM.getModule());
+ return C;
+}
+
+
+
+
const llvm::Type *CodeGenModule::getBlockDescriptorType() {
if (BlockDescriptorType)
return BlockDescriptorType;
@@ -192,7 +319,7 @@
LiteralFields[0] = NSConcreteGlobalBlock;
// Flags
- LiteralFields[1] = llvm::ConstantInt::get(IntTy, IsGlobal);
+ LiteralFields[1] = llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL);
// Reserved
LiteralFields[2] = llvm::Constant::getNullValue(IntTy);
Modified: cfe/trunk/lib/CodeGen/CGExprScalar.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprScalar.cpp?rev=64457&r1=64456&r2=64457&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprScalar.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprScalar.cpp Fri Feb 13 10:19:19 2009
@@ -86,9 +86,6 @@
Value *EmitComplexToScalarConversion(CodeGenFunction::ComplexPairTy Src,
QualType SrcTy, QualType DstTy);
- llvm::Constant *BuildBlockLiteralTmp ();
- llvm::Constant *BuildDescriptorBlockDecl();
-
//===--------------------------------------------------------------------===//
// Visitor Methods
//===--------------------------------------------------------------------===//
@@ -1360,137 +1357,9 @@
return C;
}
-enum {
- BLOCK_NEEDS_FREE = (1 << 24),
- BLOCK_HAS_COPY_DISPOSE = (1 << 25),
- BLOCK_HAS_CXX_OBJ = (1 << 26),
- BLOCK_IS_GC = (1 << 27),
- BLOCK_IS_GLOBAL = (1 << 28),
- BLOCK_HAS_DESCRIPTOR = (1 << 29)
-};
-
-llvm::Constant *ScalarExprEmitter::BuildDescriptorBlockDecl() {
- // FIXME: Push up.
- bool BlockHasCopyDispose = false;
-
- const llvm::PointerType *PtrToInt8Ty
- = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
- llvm::Constant *C;
- std::vector<llvm::Constant*> Elts;
-
- // reserved
- const llvm::IntegerType *LongTy
- = cast<llvm::IntegerType>(
- CGF.CGM.getTypes().ConvertType(CGF.CGM.getContext().LongTy));
- C = llvm::ConstantInt::get(LongTy, 0);
- Elts.push_back(C);
-
- // Size
- // FIXME: This should be the size of BlockStructType
- C = llvm::ConstantInt::get(LongTy, 20);
- Elts.push_back(C);
-
- if (BlockHasCopyDispose) {
- // copy_func_helper_decl
- C = llvm::ConstantInt::get(LongTy, 0);
- C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
- Elts.push_back(C);
-
- // destroy_func_decl
- C = llvm::ConstantInt::get(LongTy, 0);
- C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
- Elts.push_back(C);
- }
-
- C = llvm::ConstantStruct::get(Elts);
-
- // FIXME: Should be in module?
- static int desc_unique_count;
- char Name[32];
- sprintf(Name, "__block_descriptor_tmp_%d", ++desc_unique_count);
- C = new llvm::GlobalVariable(C->getType(), true,
- llvm::GlobalValue::InternalLinkage,
- C, Name, &CGF.CGM.getModule());
- return C;
-}
-
-llvm::Constant *ScalarExprEmitter::BuildBlockLiteralTmp() {
- // FIXME: Push up
- bool BlockHasCopyDispose = false;
- bool insideFunction = false;
- bool BlockRefDeclList = false;
- bool BlockByrefDeclList = false;
-
- std::vector<llvm::Constant*> Elts;
- llvm::Constant *C;
-
- bool staticBlockTmp = (BlockRefDeclList == 0
- && BlockByrefDeclList == 0);
-
- {
- // C = BuildBlockStructInitlist();
- unsigned int flags = BLOCK_HAS_DESCRIPTOR;
-
- if (BlockHasCopyDispose)
- flags |= BLOCK_HAS_COPY_DISPOSE;
-
- const llvm::PointerType *PtrToInt8Ty
- = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
- // FIXME: static? What if we start up a new, unrelated module?
- // logically we want 1 per module.
- static llvm::Constant *NSConcreteGlobalBlock_decl
- = new llvm::GlobalVariable(PtrToInt8Ty, false,
- llvm::GlobalValue::ExternalLinkage,
- 0, "_NSConcreteGlobalBlock",
- &CGF.CGM.getModule());
- static llvm::Constant *NSConcreteStackBlock_decl
- = new llvm::GlobalVariable(PtrToInt8Ty, false,
- llvm::GlobalValue::ExternalLinkage,
- 0, "_NSConcreteStackBlock",
- &CGF.CGM.getModule());
- C = NSConcreteStackBlock_decl;
- if (!insideFunction ||
- (!BlockRefDeclList && !BlockByrefDeclList)) {
- C = NSConcreteGlobalBlock_decl;
- flags |= BLOCK_IS_GLOBAL;
- }
- C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty);
- Elts.push_back(C);
-
- // __flags
- const llvm::IntegerType *IntTy = cast<llvm::IntegerType>(
- CGF.CGM.getTypes().ConvertType(CGF.CGM.getContext().IntTy));
- C = llvm::ConstantInt::get(IntTy, flags);
- Elts.push_back(C);
-
- // __reserved
- C = llvm::ConstantInt::get(IntTy, 0);
- Elts.push_back(C);
-
- // __FuncPtr
- // FIXME: Build this up.
- Elts.push_back(C);
-
- // __descriptor
- Elts.push_back(BuildDescriptorBlockDecl());
-
- // FIXME: Add block_original_ref_decl_list and block_byref_decl_list.
- }
-
- C = llvm::ConstantStruct::get(Elts);
-
- char Name[32];
- // FIXME: Boost in CGM?
- static int global_unique_count;
- sprintf(Name, "__block_holder_tmp_%d", ++global_unique_count);
- C = new llvm::GlobalVariable(C->getType(), true,
- llvm::GlobalValue::InternalLinkage,
- C, Name, &CGF.CGM.getModule());
- return C;
-}
Value *ScalarExprEmitter::VisitBlockExpr(const BlockExpr *BE) {
- llvm::Constant *C = BuildBlockLiteralTmp();
+ llvm::Constant *C = CGF.BuildBlockLiteralTmp();
const llvm::PointerType *PtrToInt8Ty
= llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=64457&r1=64456&r2=64457&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Feb 13 10:19:19 2009
@@ -88,6 +88,9 @@
const llvm::Type *LLVMIntTy;
uint32_t LLVMPointerWidth;
+ llvm::Constant *BuildBlockLiteralTmp();
+ llvm::Constant *BuildDescriptorBlockDecl();
+
public:
/// ObjCEHValueStack - Stack of Objective-C exception values, used for
/// rethrows.
More information about the cfe-commits
mailing list