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

            Bug ID: 91968
           Summary: DW_AT_low_pc missing for DW_TAG_label with LTO
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: keiths at redhat dot com
  Target Milestone: ---

Compilers tested: gcc version 10.0.0 20190930, several Fedora system compilers,
e.g., Fedora 29 (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1).

Consider the simple program (from GDB's test suite,
gdb/testsuite/gdb.base/label.c):

#include <stdio.h>

int
main (int argc, char **argv)
{
  int i = 0;
  goto there;

here:
  printf("not here\n");
  i = 1;

there:
  printf("but here\n");
  if (i == 0)
    goto here;

done:
  return 0;
}

If this is compiled with LTO (gcc -g -flto label.c)[1], GDB is unable to set a
breakpoint at any of the labels. This is because GDB is looking for
DW_AT_low_pc, but this attribute is missing from the DIEs for the labels:

 <2><f7>: Abbrev Number: 8 (DW_TAG_label)
    <f8>   DW_AT_name        : (indirect string, offset: 0xfe): there
    <fc>   DW_AT_decl_file   : 1
    <fd>   DW_AT_decl_line   : 13
    <fe>   DW_AT_decl_column : 1
 <2><ff>: Abbrev Number: 8 (DW_TAG_label)
    <100>   DW_AT_name        : (indirect string, offset: 0xff): here
    <104>   DW_AT_decl_file   : 1
    <105>   DW_AT_decl_line   : 9
    <106>   DW_AT_decl_column : 1
 <2><107>: Abbrev Number: 8 (DW_TAG_label)
    <108>   DW_AT_name        : (indirect string, offset: 0xc6): done
    <10c>   DW_AT_decl_file   : 1
    <10d>   DW_AT_decl_line   : 18
    <10e>   DW_AT_decl_column : 1

Is GDB supposed to deal with this in some other way?

[1] Alternatively, if you have a GDB build lying around:
    $ make check RUNTESTFLAGS="--target_board unix/-flto" \
       TESTS=gdb.base/label.exp
That test will show several internal errors (assertion failures) as a result of
this.

Reply via email to