aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGBlocks.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-02-13 17:23:42 +0000
committerMike Stump <mrs@apple.com>2009-02-13 17:23:42 +0000
commitf99f1d022614200f04a94f0fc5586aa2f5e6226d (patch)
treea949ba571ad639c426657ca89d6980a66ba562ea /lib/CodeGen/CGBlocks.cpp
parent3ba8215d5b14fca14835076f0f40334ecc967121 (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.cpp39
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);