diff options
author | Mike Stump <mrs@apple.com> | 2009-03-20 21:53:12 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-03-20 21:53:12 +0000 |
commit | 6cc88f78fd36d3511b89412b193494b3e423cbff (patch) | |
tree | 1e15a06b97d146a052973e948b20e6ebe778c5b1 /lib/CodeGen/CGBlocks.cpp | |
parent | 082d936a5b8323ac2c04558d8bca277a647831a3 (diff) |
Fix codegen for support for super inside block literal expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67406 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index fcda90794e..c233ff3854 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -13,6 +13,7 @@ #include "CodeGenFunction.h" #include "CodeGenModule.h" +#include "clang/AST/DeclObjC.h" #include "llvm/Module.h" #include "llvm/Target/TargetData.h" @@ -155,7 +156,7 @@ 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, LocalDeclMap, + = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, CurFuncDecl, LocalDeclMap, subBlockSize, subBlockAlign, subBlockDeclRefDecls, @@ -525,6 +526,19 @@ llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const BlockDeclRefExpr *E) { return V; } +void CodeGenFunction::BlockForwardSelf() { + const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl); + ImplicitParamDecl *SelfDecl = OMD->getSelfDecl(); + llvm::Value *&DMEntry = LocalDeclMap[SelfDecl]; + if (DMEntry) + return; + // FIXME - Eliminate BlockDeclRefExprs, clients don't need/want to care + BlockDeclRefExpr *BDRE = new (getContext()) + BlockDeclRefExpr(SelfDecl, + SelfDecl->getType(), SourceLocation(), false); + DMEntry = GetAddrOfBlockDecl(BDRE); +} + llvm::Constant * BlockModule::GetAddrOfGlobalBlock(const BlockExpr *BE, const char * n) { // Generate the block descriptor. @@ -561,7 +575,7 @@ BlockModule::GetAddrOfGlobalBlock(const BlockExpr *BE, const char * n) { bool subBlockHasCopyDispose = false; llvm::DenseMap<const Decl*, llvm::Value*> LocalDeclMap; llvm::Function *Fn - = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, LocalDeclMap, + = CodeGenFunction(CGM).GenerateBlockFunction(BE, Info, 0, LocalDeclMap, subBlockSize, subBlockAlign, subBlockDeclRefDecls, @@ -605,6 +619,7 @@ llvm::Value *CodeGenFunction::LoadBlockStruct() { llvm::Function * CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr, const BlockInfo& Info, + const Decl *OuterFuncDecl, llvm::DenseMap<const Decl*, llvm::Value*> ldm, uint64_t &Size, uint64_t &Align, @@ -657,6 +672,7 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr, StartFunction(BD, FTy->getResultType(), Fn, Args, BExpr->getBody()->getLocEnd()); + CurFuncDecl = OuterFuncDecl; EmitStmt(BExpr->getBody()); FinishFunction(cast<CompoundStmt>(BExpr->getBody())->getRBracLoc()); |