diff options
author | Mike Stump <mrs@apple.com> | 2009-02-13 17:23:42 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-02-13 17:23:42 +0000 |
commit | f99f1d022614200f04a94f0fc5586aa2f5e6226d (patch) | |
tree | a949ba571ad639c426657ca89d6980a66ba562ea /lib/CodeGen/CGBlocks.cpp | |
parent | 3ba8215d5b14fca14835076f0f40334ecc967121 (diff) |
Condense NSConcreteGlobalBlock handling.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64461 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index a7f5aacde7..f61e0bcd39 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -75,6 +75,24 @@ llvm::Constant *CodeGenFunction::BuildDescriptorBlockDecl() { return C; } +llvm::Constant *CodeGenModule::getNSConcreteGlobalBlock() { + if (NSConcreteGlobalBlock) + return NSConcreteGlobalBlock; + + const llvm::PointerType *PtrToInt8Ty + = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); + // FIXME: Wee should have a CodeGenModule::AddRuntimeVariable that does the + // same thing as CreateRuntimeFunction if there's already a variable with + // the same name. + NSConcreteGlobalBlock + = new llvm::GlobalVariable(PtrToInt8Ty, false, + llvm::GlobalValue::ExternalLinkage, + 0, "_NSConcreteGlobalBlock", + &getModule()); + + return NSConcreteGlobalBlock; +} + llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() { // FIXME: Push up bool BlockHasCopyDispose = false; @@ -99,11 +117,6 @@ llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() { = 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, @@ -112,7 +125,7 @@ llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() { C = NSConcreteStackBlock_decl; if (!insideFunction || (!BlockRefDeclList && !BlockByrefDeclList)) { - C = NSConcreteGlobalBlock_decl; + C = CGM.getNSConcreteGlobalBlock(); flags |= BLOCK_IS_GLOBAL; } C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty); @@ -272,18 +285,6 @@ RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) { } llvm::Constant *CodeGenModule::GetAddrOfGlobalBlock(const BlockExpr *BE) { - if (!NSConcreteGlobalBlock) { - const llvm::Type *Ty = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); - - // FIXME: Wee should have a CodeGenModule::AddRuntimeVariable that does the - // same thing as CreateRuntimeFunction if there's already a variable with - // the same name. - NSConcreteGlobalBlock = - new llvm::GlobalVariable(Ty, false, - llvm::GlobalVariable::ExternalLinkage, 0, - "_NSConcreteGlobalBlock", &getModule()); - } - // Generate the block descriptor. const llvm::Type *UnsignedLongTy = Types.ConvertType(Context.UnsignedLongTy); const llvm::IntegerType *IntTy = cast<llvm::IntegerType>( @@ -316,7 +317,7 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalBlock(const BlockExpr *BE) { llvm::Function *Fn = CodeGenFunction(*this).GenerateBlockFunction(BE, Info); // isa - LiteralFields[0] = NSConcreteGlobalBlock; + LiteralFields[0] = getNSConcreteGlobalBlock(); // Flags LiteralFields[1] = llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL); |