Improving GCC's line table information to help GDB

Luis Machado luis.machado@linaro.org
Wed Oct 16 14:55:00 GMT 2019


On 10/16/19 5:59 AM, Richard Biener wrote:
> I think that adding an extra jump is unwanted.  Instead - if you disregard
> the single-source-line case - there's always the jump and the label we jump
> to which might/should get different source locations.  Like in one of the above
> cases:
> 
> main ()
> {
>    int D.1803;
> 
>    [t.c:2:1] {
>      int var;
> 
>      [t.c:3:5] var = 0;
>      <D.1801>:
>      [t.c:7:8] var = var + 1;
>      [t.c:7:8] goto <D.1801>;
>      [t.c:10:8] D.1803 = 0;
>      [t.c:10:8] return D.1803;
> 
> seen at GIMPLE.  Of course we lose the label once we build the CFG,
> but we retain a goto-locus which we could then put back on the
> jump statement.  For this case we at the moment get
> 
> .L2:
>          .loc 1 7 0 discriminator 1
>          addl    $1, -4(%rbp)
>          jmp     .L2
> 
> and we could do
> 
> .L2:
>          .loc 1 7 0 discriminator 1
>          addl    $1, -4(%rbp)
>          .loc 1 5 0
>          jmp     .L2
> 
> thus assign the "destination" location to the jump instruction?

On a first look, i considered reusing the jump instruction that did not 
get a location assigned to it, but that didn't work right for all cases, 
such as the one you showed below with the incorrect line ordering.

> 
> The first question is of course what happens with the edges
> goto_locus at the moment and why we get the code we get.
> 
> The above solution might also be a bit odd since for the loop
> entry we'd first see line 7 and only after that line 5.  But fixing
> that would mean we have to output an extra instruction
> (where I'd chose a nop instead of some random extra jump).

Right. I wanted to preserve the correct order of execution, at least 
from a O0 perspective. A nop would work just as well. I'll give this a try.

I don't think it makes sense to output additional instructions in O1+ 
cases just because we want to have more debug info, but we do need a new 
instruction address in some cases, in order to use it in the line table 
for the line transition.

Would it make sense to have it restricted to O0?



More information about the Gcc mailing list