diff options
author | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2008-05-30 10:30:31 +0000 |
---|---|---|
committer | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2008-05-30 10:30:31 +0000 |
commit | cc9b16394fe6c9245dc4f8661a63d0c3937b62f0 (patch) | |
tree | 14ffd780b29f8e2ed574e0684642b2f6d8e90f50 /lib/CodeGen/CGDebugInfo.cpp | |
parent | e36a3c8b5c7db4916342e4381caa2fdc93eb5745 (diff) |
Emit parameter and local variable debug information with -g.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51765 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 1827fc980c..19745dc2a0 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -44,6 +44,7 @@ CGDebugInfo::CGDebugInfo(CodeGenModule *m) , CompileUnitAnchor(NULL) , SubprogramAnchor(NULL) , RegionStack() +, VariableDescList() , Subprogram(NULL) { SR = new llvm::DISerializer(); @@ -72,7 +73,12 @@ CGDebugInfo::~CGDebugInfo() = RegionStack.begin(); I != RegionStack.end(); ++I) { delete *I; } - + + for (std::vector<llvm::VariableDesc *>::iterator I + = VariableDescList.begin(); I != VariableDescList.end(); ++I) { + delete *I; + } + delete CompileUnitAnchor; delete SubprogramAnchor; } @@ -519,3 +525,44 @@ void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder &Builder) RegionStack.pop_back(); } +/// EmitDeclare - Emit local variable declaration debug info. +void CGDebugInfo::EmitDeclare(const VarDecl *decl, unsigned Tag, + llvm::Value *AI, + llvm::IRBuilder &Builder) +{ + // FIXME: If it is a compiler generated temporary then return. + + // Construct llvm.dbg.declare function. + if (!DeclareFn) + DeclareFn = llvm::Intrinsic::getDeclaration(&M->getModule(), + llvm::Intrinsic::dbg_declare); + + // Get type information. + llvm::CompileUnitDesc *Unit = getOrCreateCompileUnit(CurLoc); + llvm::TypeDesc *TyDesc = getOrCreateType(decl->getType(), Unit); + + SourceManager &SM = M->getContext().getSourceManager(); + uint64_t Loc = SM.getLogicalLineNumber(CurLoc); + + // Construct variable. + llvm::VariableDesc *Variable = new llvm::VariableDesc(Tag); + Variable->setContext(RegionStack.back()); + Variable->setName(decl->getName()); + Variable->setFile(Unit); + Variable->setLine(Loc); + Variable->setType(TyDesc); + + // Push it onto the list so that we can free it. + VariableDescList.push_back(Variable); + + // Cast the AllocA result to a {}* for the call to llvm.dbg.declare. + // These bit cast instructions will get freed when the basic block is + // deleted. So do not need to free them explicity. + const llvm::PointerType *EmpPtr = SR->getEmptyStructPtrType(); + llvm::Value *AllocACast = new llvm::BitCastInst(AI, EmpPtr, decl->getName(), + Builder.GetInsertBlock()); + + // Call llvm.dbg.declare. + Builder.CreateCall2(DeclareFn, AllocACast, getCastValueFor(Variable), ""); +} + |