summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBlocks.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-03-13 23:34:28 +0000
committerMike Stump <mrs@apple.com>2009-03-13 23:34:28 +0000
commit5469f29aa92e30ab48d350ad9bd43b8fc9edd445 (patch)
treece26b151b1a92d2a287636b02a3832aaec120b22 /clang/lib/CodeGen/CGBlocks.cpp
parentb4cf3ad61b81103ceb3ed811c950216407fc5416 (diff)
downloadbcm5719-llvm-5469f29aa92e30ab48d350ad9bd43b8fc9edd445.tar.gz
bcm5719-llvm-5469f29aa92e30ab48d350ad9bd43b8fc9edd445.zip
Do up codegen for function static data and externs in functions in block
literals. llvm-svn: 66984
Diffstat (limited to 'clang/lib/CodeGen/CGBlocks.cpp')
-rw-r--r--clang/lib/CodeGen/CGBlocks.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp
index a876938c02e..fcda90794e9 100644
--- a/clang/lib/CodeGen/CGBlocks.cpp
+++ b/clang/lib/CodeGen/CGBlocks.cpp
@@ -155,7 +155,8 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) {
uint64_t subBlockSize, subBlockAlign;
llvm::SmallVector<const Expr *, 8> subBlockDeclRefDecls;
llvm::Function *Fn
- = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, subBlockSize,
+ = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, LocalDeclMap,
+ subBlockSize,
subBlockAlign,
subBlockDeclRefDecls,
BlockHasCopyDispose);
@@ -558,8 +559,10 @@ BlockModule::GetAddrOfGlobalBlock(const BlockExpr *BE, const char * n) {
uint64_t subBlockSize, subBlockAlign;
llvm::SmallVector<const Expr *, 8> subBlockDeclRefDecls;
bool subBlockHasCopyDispose = false;
+ llvm::DenseMap<const Decl*, llvm::Value*> LocalDeclMap;
llvm::Function *Fn
- = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, subBlockSize,
+ = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, LocalDeclMap,
+ subBlockSize,
subBlockAlign,
subBlockDeclRefDecls,
subBlockHasCopyDispose);
@@ -602,10 +605,24 @@ llvm::Value *CodeGenFunction::LoadBlockStruct() {
llvm::Function *
CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
const BlockInfo& Info,
+ llvm::DenseMap<const Decl*, llvm::Value*> ldm,
uint64_t &Size,
uint64_t &Align,
llvm::SmallVector<const Expr *, 8> &subBlockDeclRefDecls,
bool &subBlockHasCopyDispose) {
+ // Arrange for local static and local extern declarations to appear
+ // to be local to this function as well, as they are directly referenced
+ // in a block.
+ for (llvm::DenseMap<const Decl *, llvm::Value*>::iterator i = ldm.begin();
+ i != ldm.end();
+ ++i) {
+ const VarDecl *VD = dyn_cast<VarDecl>(i->first);
+
+ if (VD->getStorageClass() == VarDecl::Static
+ || VD->getStorageClass() == VarDecl::Extern)
+ LocalDeclMap[VD] = i->second;
+ }
+
const FunctionProtoType *FTy =
cast<FunctionProtoType>(BExpr->getFunctionType());
OpenPOWER on IntegriCloud