[LLVMdev] Proposal: Debug information improvement - keep the line number with optimizations

Sheng Zhou zhousheng at autoesl.com
Mon Feb 2 23:50:19 PST 2009


Hi Patel,

Here is second part of my reply.
> 2.      Proposed Work Plan
> > This section defines a proposed work plan to accomplish the  
> > requirements that we desires. The work plan is broken into several  
> > distinct phases that follow a logical progression of modifications  
> > to the LLVM software.
> >
> > 2.1   Phase 1: Establish the testing system
> > One of the most useful things to get started is to have some way to  
> > determine whether codegen is being impacted by debug info.  It is  
> > important to be able to tell when this happens so that we can track  
> > down these places and fix them.
> >
> > 2.1.1    Pass Scanning Script
> > Following the way proposed by Chris, it is good to have a script to  
> > scan the standard LLVM transform pass list. We can get the standard  
> > compile optimization pass list by:
>   
>
> You can use http://llvm.org/docs/SourceLevelDebugging.html#debugopt as  
> a starting point here.
>   

Ok.
>> >
>> >        $ opt -std-compile-opts -debug-pass=Arguments foo.bc > /dev/ 
>> > null
...
...
> 2.2   Phase 2: New Pass to Strip Debug Information
> > LLVM already has a transform pass "-strip-debug", it removes all the  
> > debug information. But for the first half of this project, we want  
> > to just keep the line number information (stop point) in the  
> > optimized code. So we need a new transform pass to just removes the  
> > variable declaration information. Pass "-strip-debug" also doesn't  
> > cleanup the dead variable and function calling for debug  
> > information, it thinks other pass like "-dce" or "-globaldce" can  
> > handle this. But as we are also going to update those passes, we  
> > can't use them in the verification flow, otherwise, it may output  
> > incorrect check results.
> >
> > The new pass "-strip-debug-pro" should have the following functions:
> > 1.         Just remove the variable declaration information and  
> > clean up the dead debug information.
> >
> > 2.         Remove all the debug information and clean up
> >
> > 3.2.1    Work Plan
> > 1.         Take a reference to transform pass StripSymbol.cpp
> > 2.         Based on the StripSymbol.cpp, add an option to it to just  
> > remove debug information, like "-rm-debug"
>   
>
> That's what -strip-debug is doing.
>
>   
>> > 3.         Add an option to just remove the variable declaration  
>> > information, like "?rm-debug=2"
>>     
>
> Why not -strip-debug=2 if you want a way to remove variable  
> declarations ..?
>   
Agree.
>   
>> > 4.         Add a procedure to clean up the dead variables and  
>> > function calls for debug purpose.
>> >
>> > 2.3   Phase 3: Extend llvm-gcc
>> > Once we have a way to verify what is happening, I propose that we  
>> > aim for an intermediate point: instead of having -O disable all  
>> > debug info, we should make it disable just variable information, but  
>> > keep emitting line number info.  This would allow stepping through  
>> > the program, getting stack traces, use performance tools like shark,  
>> > etc.
>> >
>> > We need the front-end llvm-gcc to have a mode that causes it to emit  
>> > line number info but not
>> > variable info, we can go through the process above to identify  
>> > passes that change behavior when line number intrinsics are in the  
>> > code.
>> >
>> > 1.3.1    Work Plan
>> > 1.         First locate the file position that llvm-gcc handle the  
>> > parameter options.
>> > 2.         Add a new option to control the llvm-gcc to emit  
>> > specified debug information: like ?g1. ?g1 to only emit line number
>>     
>
>   
>> > 3.         Building the new llvm-gcc
>> > 4.         Testing through llvm/test, llvm-test
>> >
>> > 2.4   Phase 4: Update Transform Passes for Line Number Info.
>> > When the front-end has a mode that causes it to emit line number  
>> > info but not variable info, we can go through the process above to  
>> > identify passes that change behavior when line number intrinsics are  
>> > in the code.
>>     
>
> I think, the optimizer is not changing behavior when dbg info is  
> present. Try running dbgopt tests.
>
>   
>> >   Obvious cases are things like loop unroll and inlining: they  
>> > 'measure' the size of some code to determine whether to unroll it or  
>> > not. This means that it should be enhanced to ignore debug  
>> > intrinsics for the sake of code size estimation.
>>     
>
> The loop unrolling pass already ignores the debug info! See  
> LoopUnroll.cpp::ApproximateLoopSize()
>   
ok, I see.
>   
>> >
>> > Another example is optimizations like SimplifyCFG when it merges if/ 
>> > then/else into select instructions. SimplifyCFG will have to be  
>> > enhanced to ignore debug intrinsics when doing its safety/ 
>> > profitability analysis,
>>     
>
> I think, it handles this part well, but ...
>   
>> > but then it will also have to be updated to just delete the line  
>> > number intrinsics when it does the xform. This is simplifycfg's way  
>> > of "updating" the debug info for this example transformation.
>>     
>
> .. the second part has not received full attention.
>
>   
>> > As we progress through various optimizations, we will find cases  
>> > where it is possible to update (e.g. loop unroll or inlining, which  
>> > doesn't have to do anything special to update line #'s) and places  
>> > where it isn't.  As long as the debug intrinsics don't affect  
>> > codegen, we are happy, even if the debug intrinsics are deleted in  
>> > cases where it would be possible to update them (this becomes a  
>> > optimized debugging QoI issue).




More information about the llvm-dev mailing list