Do up codegen for function static data and externs in functions in block

literals.

llvm-svn: 66984
This commit is contained in:
Mike Stump 2009-03-13 23:34:28 +00:00
parent b4cf3ad61b
commit 5469f29aa9
3 changed files with 32 additions and 3 deletions

View File

@ -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());

View File

@ -272,6 +272,7 @@ public:
llvm::Function *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);

View File

@ -41,9 +41,20 @@ void test3() {
^{j=0; k=0;}();
}
int test4() {
extern int g;
static int i = 1;
^(int j){ i = j; g = 0; }(0);
return i + g;
}
int g;
int main() {
int rv = 0;
test1();
test2();
test3();
return 0;
rv += test4();
return rv;
}