Condense NSConcreteGlobalBlock handling.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64461 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index a7f5aac..f61e0bc 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -75,6 +75,24 @@
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::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 @@
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 @@
}
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::Function *Fn = CodeGenFunction(*this).GenerateBlockFunction(BE, Info);
// isa
- LiteralFields[0] = NSConcreteGlobalBlock;
+ LiteralFields[0] = getNSConcreteGlobalBlock();
// Flags
LiteralFields[1] = llvm::ConstantInt::get(IntTy, BLOCK_IS_GLOBAL);
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index eb9ce7d..4b1a06e 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -141,6 +141,8 @@
/// Release - Finalize LLVM code generation.
void Release();
+ llvm::Constant *getNSConcreteGlobalBlock();
+
const llvm::Type *getBlockDescriptorType();
const llvm::Type *getGenericBlockLiteralType();