From: Mike Stump Date: Fri, 13 Feb 2009 19:29:27 +0000 (+0000) Subject: Move NSConcreteStackBlock into CGM. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=59c5b118dfbcbc22c65ae42b8f5ef5979ec802ee;p=clang Move NSConcreteStackBlock into CGM. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64479 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index be79a1a1ac..d6c248dcef 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -93,6 +93,24 @@ llvm::Constant *CodeGenModule::getNSConcreteGlobalBlock() { return NSConcreteGlobalBlock; } +llvm::Constant *CodeGenModule::getNSConcreteStackBlock() { + if (NSConcreteStackBlock) + return NSConcreteStackBlock; + + 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. + NSConcreteStackBlock + = new llvm::GlobalVariable(PtrToInt8Ty, false, + llvm::GlobalValue::ExternalLinkage, + 0, "_NSConcreteStackBlock", + &getModule()); + + return NSConcreteStackBlock; +} + llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() { // FIXME: Push up bool BlockHasCopyDispose = false; @@ -110,21 +128,14 @@ llvm::Constant *CodeGenFunction::BuildBlockLiteralTmp() { 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 *NSConcreteStackBlock_decl - = new llvm::GlobalVariable(PtrToInt8Ty, false, - llvm::GlobalValue::ExternalLinkage, - 0, "_NSConcreteStackBlock", - &CGM.getModule()); - C = NSConcreteStackBlock_decl; + C = CGM.getNSConcreteStackBlock(); if (!insideFunction || (!BlockRefDeclList && !BlockByrefDeclList)) { C = CGM.getNSConcreteGlobalBlock(); flags |= BLOCK_IS_GLOBAL; } + const llvm::PointerType *PtrToInt8Ty + = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); C = llvm::ConstantExpr::getBitCast(C, PtrToInt8Ty); Elts.push_back(C); diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index fb13dfde5c..e79d18990d 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -123,6 +123,10 @@ class CodeGenModule { /// blocks. llvm::Constant *NSConcreteGlobalBlock; + /// NSConcreteStackBlock - Cached reference to the class poinnter for stack + /// blocks. + llvm::Constant *NSConcreteStackBlock; + const llvm::Type *BlockDescriptorType; const llvm::Type * GenericBlockLiteralType; struct { @@ -141,6 +145,7 @@ public: void Release(); llvm::Constant *getNSConcreteGlobalBlock(); + llvm::Constant *getNSConcreteStackBlock(); int getGlobalUniqueCount() { return ++Block.GlobalUniqueCount; } const llvm::Type *getBlockDescriptorType();