From: Mike Stump Date: Fri, 13 Feb 2009 17:23:42 +0000 (+0000) Subject: Condense NSConcreteGlobalBlock handling. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f99f1d022614200f04a94f0fc5586aa2f5e6226d;p=clang 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 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( @@ -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); diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index eb9ce7dfed..4b1a06edc5 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -141,6 +141,8 @@ public: /// Release - Finalize LLVM code generation. void Release(); + llvm::Constant *getNSConcreteGlobalBlock(); + const llvm::Type *getBlockDescriptorType(); const llvm::Type *getGenericBlockLiteralType();