[cfe-commits] Clang DebugInfo Patch for StopPoints.
Sanjiv.Gupta at microchip.com
Sanjiv.Gupta at microchip.com
Mon May 5 00:29:12 PDT 2008
> -----Original Message-----
> From: Chris Lattner [mailto:clattner at apple.com]
> Sent: Monday, May 05, 2008 12:42 PM
> To: Sanjiv Kumar Gupta - I00171
> Cc: cfe-commits at cs.uiuc.edu
> Subject: Re: [cfe-commits] Clang DebugInfo Patch for StopPoints.
>
>
> On May 2, 2008, at 4:39 AM, Sanjiv.Gupta at microchip.com wrote:
>
> > Hi,
> >
> > Please find the patch attached for stoppoint debug info
> generation in
> > clang.
> > It also includes a command line switch called -g.
> > There are two new files to be placed in lib/CodeGen , those
> files are
> > attached here.
>
> This is looking great, some thoughts:
>
> //
> =
> =
> =-------------------------------------------------------------
> ---------
> ===//
> +// Code Generator Options
> +//
> =
> =
> =-------------------------------------------------------------
> ---------
> ===//
> +static llvm::cl::opt<bool>
> +GenerateDebugInfo("g",
> + llvm::cl::desc("Generate source level debug
> information."));
>
> It looks like clang is currently inconsistent here, but
> option descriptions should not end with a ".".
>
>
>
> +++ lib/CodeGen/CGStmt.cpp (working copy)
> @@ -29,6 +31,16 @@
> void CodeGenFunction::EmitStmt(const Stmt *S) {
> assert(S && "Null statement?");
>
> + if (S->getStmtClass() != Stmt::CompoundStmtClass) {
> + if (CGM.TheDebugInfo) {
>
> Please reduce nesting by using && here for the first two predicates:
> "if !compoundstmt && thedebuginfo" Please add a comment
> indicating why you explicitly exclude compound statements.
> (they don't generate executable code?)
>
> + if (S->getLocStart().isValid()) {
> + CGM.TheDebugInfo->setLocation (S->getLocStart());
>
> No space before the '('.
>
> + }
> +
> + CGM.TheDebugInfo->EmitStopPoint(CurFn,
> Builder.GetInsertBlock());
> + }
> + }
>
> Why does this pass Builder.GetInsertBlock() here? Wouldn't
> it be more natural to pass a reference to the builder in instead?
>
>
> +++ lib/CodeGen/CodeGenModule.cpp (working copy)
> @@ -32,13 +33,19 @@
> + // Debug Info generator.
> + if (GenerateDebugInfo)
>
> This comment doesn't add any value. How about "If debug info
> generation is enabled, create the CodeGenDebugInfo object
> which manages this."
>
> + TheDebugInfo = new CodeGenDebugInfo (this); else
> + TheDebugInfo = NULL;
>
> No space before (this).
>
>
> + if (TheDebugInfo)
> + delete TheDebugInfo;
>
> No need to check for null, delete handles null pointers.
>
>
> +++ lib/CodeGen/CodeGenModule.h (working copy)
> @@ -69,8 +70,10 @@
>
> std::vector<llvm::Function *> BuiltinFunctions;
> public:
> + CodeGenDebugInfo *TheDebugInfo;
>
> Please make TheDebugInfo private and add an accessor,
> following the lead of other instance vars in CodeGenModule.
>
> //===--- CodeGenDebugInfo.h - DebugInfo for LLVM CodeGen
> ----------===//
>
> Please pad this out with '-'s to fill 80 cols.
>
>
> #include <map>
> #include <string>
>
> You don't use "string" in the the header, it can be removed.
>
> #include "llvm/CodeGen/MachineModuleInfo.h"
>
> Is there any way to avoid bringing in MachineModuleInfo.h?
> It is a really gross header that needs a lot of cleanup. Can
> you avoid #including it by forward declaring what ever you
> need and then only #including it into CodeGenDebugInfo.cpp?
> I think it is worth it, even if it means making 'SR' by a
> pointer instead of holding the DISerializer by value.
>
> std::map<unsigned, llvm::CompileUnitDesc *> CompileUnitCache;
> // Cache of
> previously constructed
> // CompileUnits.
>
> Please comment this with a doxygen-style comment:
>
> /// CompileUnitCache - Cache of previously constructed
> CompileUnits.
> std::map<unsigned, llvm::CompileUnitDesc *> CompileUnitCache;
>
>
>
> There are a couple more places where you put spaces before '('.
>
>
>
> llvm::CompileUnitDesc *getOrCreateCompileUnit(const
> SourceLocation loc);
>
> You pass Loc by value, so no need for it to be const. Please
> use 'Loc' instead of 'loc' for consistency.
>
>
>
> //===--- CodeGenDebugInfo.cpp - Emit Debug Information for a
> Module --------===//
>
> This is one char to long. I'm picky, huh? :)
>
>
> #include "CodeGenDebugInfo.h"
>
> #include "CodeGenModule.h"
>
> #include "llvm/Constants.h"
> #include "llvm/DerivedTypes.h"
> #include "llvm/Instructions.h"
> #include "llvm/Intrinsics.h"
> #include "llvm/Module.h"
> #include "llvm/Support/Dwarf.h"
> #include "llvm/Target/TargetMachine.h"
> #include "llvm/ADT/StringExtras.h"
> #include "llvm/ADT/SmallVector.h"
> #include "llvm/CodeGen/MachineModuleInfo.h"
>
> #include "clang/Basic/SourceManager.h"
> #include "clang/Basic/FileManager.h"
> #include "clang/AST/ASTContext.h"
>
>
>
> using namespace clang;
> using namespace clang::CodeGen;
>
> The vertical spacing here is pretty arbitrary and doesn't add
> much value, please eliminate it.
>
>
> // FIX_ME: Do not know how to get clang version yet.
>
> Please use "FIXME" instead of "FIX_ME" for consistency with
> the rest of the codebase.
>
> void
> CodeGenDebugInfo::EmitStopPoint(llvm::Function *Fn, llvm::BasicBlock
> *CurBB) {
> // Don't bother if things are the same as last time.
> if (CurLoc == PrevLoc && PrevBB == CurBB)
> return;
>
> Why are you checking for BB equality here? Wouldn't it be
> more reasonable to check that the line # is the same instead
> of the full location? This would emit multiple stop points
> for things like:
>
> a = b; c = d;
>
> right?
>
>
> // Invoke llvm.dbg.stoppoint
> llvm::Value *Args[3] = {
> llvm::ConstantInt::get(llvm::Type::Int32Ty, CurLineNo),
> llvm::ConstantInt::get(llvm::Type::Int32Ty, (uint64_t) 0),
> getCastValueFor(Unit)
> };
> llvm::CallInst::Create(StopPointFn, Args, Args+3, "", CurBB);
>
> This should use the LLVMBuilder and use the .CreateCall3 method.
> Likewise for the EmitRegionStart method etc.
>
>
>
> // Provide an region stop point.
> EmitStopPoint(Fn, CurBB);
>
>
> Why emit a stop point on "}"?
>
> Please resend the updated patch. I'm sorry for the delay, I
> will try not to delay as much on the next iteration. Thanks
> for working on this!
>
> -Chris
>
Thanks for your inputs Chris. I am working on these.
-Sanjiv
More information about the cfe-commits
mailing list