diff options
author | Mike Stump <mrs@apple.com> | 2009-03-13 23:34:28 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-03-13 23:34:28 +0000 |
commit | 5469f29aa92e30ab48d350ad9bd43b8fc9edd445 (patch) | |
tree | ce26b151b1a92d2a287636b02a3832aaec120b22 /clang/lib/CodeGen/CGBlocks.cpp | |
parent | b4cf3ad61b81103ceb3ed811c950216407fc5416 (diff) | |
download | bcm5719-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.cpp | 21 |
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()); |