https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94235

            Bug ID: 94235
           Summary: worse debug info with O0 than with O2 with flto
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

Consider the following test-case (minimized from
gdb/testsuite/gdb.threads/step-bg-decr-pc-switch-thread.c):
...
$ cat -n test.c
     1  int i;
     2
     3  int
     4  main (void)
     5  {
     6    i++;
     7    
     8    while (1);
     9
    10    return 0;
    11  }
    12
...

When compiled normally:
...
$ gcc-10 test.c -g
...

We can run to main, and step once:
...
$ gdb -batch a.out -ex start -ex s
Temporary breakpoint 1 at 0x400496: file test.c, line 6.

Temporary breakpoint 1, main () at test.c:6
6         i++;
8         while (1);
$
...

But if we use -flto -O0:
...
$ gcc-10 test.c -g -flto -O0
...
instead we have:
...
$ gdb -batch a.out -ex start -ex s
Temporary breakpoint 1 at 0x400496: file test.c, line 6.

Temporary breakpoint 1, main () at test.c:6
6         i++;
<hangs>
...

Looking at the differences with objdump -dS, we have normally:
...
0000000000400492 <main>:
int i;

int
main (void)
{
  400492:       55                      push   %rbp
  400493:       48 89 e5                mov    %rsp,%rbp
  i++;
  400496:       8b 05 90 0b 20 00       mov    0x200b90(%rip),%eax        #
60102c <i>
  40049c:       83 c0 01                add    $0x1,%eax
  40049f:       89 05 87 0b 20 00       mov    %eax,0x200b87(%rip)        #
60102c <i>

  while (1);
  4004a5:       eb fe                   jmp    4004a5 <main+0x13>
  4004a7:       66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  4004ae:       00 00 
...

but with lto there's no line number info for the loop:
...
0000000000400492 <main>:
int i;

int
main (void)
{
  400492:       55                      push   %rbp
  400493:       48 89 e5                mov    %rsp,%rbp
  i++;
  400496:       8b 05 90 0b 20 00       mov    0x200b90(%rip),%eax        #
60102c <i>
  40049c:       83 c0 01                add    $0x1,%eax
  40049f:       89 05 87 0b 20 00       mov    %eax,0x200b87(%rip)        #
60102c <i>
  4004a5:       eb fe                   jmp    4004a5 <main+0x13>
  4004a7:       66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  4004ae:       00 00 
...

Amazingly, with -flto -O2, we have:
...
00000000004003c0 <main>:
int i;

int
main (void)
{
  i++;
  4003c0:       83 05 65 0c 20 00 01    addl   $0x1,0x200c65(%rip)        #
60102c <i>

  while (1);
  4003c7:       eb fe                   jmp    4003c7 <main+0x7>
  4003c9:       0f 1f 80 00 00 00 00    nopl   0x0(%rax)

...
and:
...
$ gdb -batch a.out -ex start -ex s
Temporary breakpoint 1 at 0x4003c0: file test.c, line 6.

Temporary breakpoint 1, main () at test.c:6
6         i++;
8         while (1);
$
...

Same for O1 as for O2.

For some reason, we have worse debug info with O0 than with O2.

Reply via email to