diff options
author | Mike Stump <mrs@apple.com> | 2009-09-30 02:43:10 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-09-30 02:43:10 +0000 |
commit | b1a6e687967105bf1e18dfba196d0248e6700a4e (patch) | |
tree | 23fcc79d307541248b56dbe30e10e35febf519aa /lib/CodeGen/CGBlocks.cpp | |
parent | 432887fadd6bf87a6985906d6cef356b1f617d84 (diff) |
Improve debugging information for BlockDeclRefExpr. WIP. Given this
scheme, we can switch the previous scheme over to using this code
path. There's a bit of simplifications yet to do as well.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83138 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGBlocks.cpp')
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index daeeee56f9..e9648251d2 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "CGDebugInfo.h" #include "CodeGenFunction.h" #include "CodeGenModule.h" #include "clang/AST/DeclObjC.h" @@ -661,9 +662,40 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr, StartFunction(BD, ResultType, Fn, Args, BExpr->getBody()->getLocEnd()); + + // Save a spot to insert the debug information for all the BlockDeclRefDecls. + llvm::BasicBlock *entry = Builder.GetInsertBlock(); + llvm::BasicBlock::iterator entry_ptr = Builder.GetInsertPoint(); + CurFuncDecl = OuterFuncDecl; CurCodeDecl = BD; EmitStmt(BExpr->getBody()); + + if (CGDebugInfo *DI = getDebugInfo()) { + llvm::BasicBlock *end = Builder.GetInsertBlock(); + llvm::BasicBlock::iterator end_ptr = Builder.GetInsertPoint(); + + // Emit debug information for all the BlockDeclRefDecls. + // First, go back to the entry... + Builder.SetInsertPoint(entry, entry_ptr); + + // And then insert the debug information.. + for (unsigned i=0; i < BlockDeclRefDecls.size(); ++i) { + const Expr *E = BlockDeclRefDecls[i]; + const BlockDeclRefExpr *BDRE = dyn_cast<BlockDeclRefExpr>(E); + if (BDRE) { + const ValueDecl *D = BDRE->getDecl(); + DI->setLocation(D->getLocation()); + DI->EmitDeclareOfBlockDeclRefVariable(BDRE, + LocalDeclMap[getBlockStructDecl()], + Builder, this); + } + } + + // Then go back to the end, and we're done. + Builder.SetInsertPoint(end, end_ptr); + } + FinishFunction(cast<CompoundStmt>(BExpr->getBody())->getRBracLoc()); // The runtime needs a minimum alignment of a void *. |