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

            Bug ID: 87440
           Summary: GCC creates debug that confuses gdb
           Product: gcc
           Version: 8.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
  Target Milestone: ---

static int foo (int i)
{
  volatile int j = i + 3;
  return j - 2;
}
int main()
{
  volatile int z = foo (-1);
  return z;
}

> gcc t.c -O -g
> gdb ./a,out
(gdb) start
(gdb) s
foo (i=-1) at t.c:7
7       {
(gdb) info locals
j = 0
j = <optimized out>

we get 'j' two times (this is with gdb 8.2) because we emit a stray lexical
block for the DW_TAG_inlined_subroutine:

 <2><128>: Abbrev Number: 4 (DW_TAG_inlined_subroutine)
    <129>   DW_AT_abstract_origin: <0x170>
    <12d>   DW_AT_low_pc      : 0x4004d7
    <135>   DW_AT_high_pc     : 0xf
    <13d>   DW_AT_call_file   : 1
    <13e>   DW_AT_call_line   : 8
 <3><13f>: Abbrev Number: 5 (DW_TAG_formal_parameter)
    <140>   DW_AT_abstract_origin: <0x17c>
    <144>   DW_AT_location    : 0x0 (location list)
 <3><148>: Abbrev Number: 6 (DW_TAG_lexical_block)
    <149>   DW_AT_low_pc      : 0x4004d7
    <151>   DW_AT_high_pc     : 0xf
 <4><159>: Abbrev Number: 7 (DW_TAG_variable)
    <15a>   DW_AT_abstract_origin: <0x185>
    <15e>   DW_AT_location    : 2 byte block: 91 70     (DW_OP_fbreg: -16)

vs. the abstract origin which has:

 <1><170>: Abbrev Number: 10 (DW_TAG_subprogram)
    <171>   DW_AT_name        : foo
    <175>   DW_AT_decl_file   : 1
    <176>   DW_AT_decl_line   : 1
    <177>   DW_AT_prototyped  : 1
    <177>   DW_AT_type        : <0x164>
    <17b>   DW_AT_inline      : 1       (inlined)
 <2><17c>: Abbrev Number: 11 (DW_TAG_formal_parameter)
    <17d>   DW_AT_name        : i
    <17f>   DW_AT_decl_file   : 1
    <180>   DW_AT_decl_line   : 1
    <181>   DW_AT_type        : <0x164>
 <2><185>: Abbrev Number: 12 (DW_TAG_variable)
    <186>   DW_AT_name        : j
    <188>   DW_AT_decl_file   : 1
    <189>   DW_AT_decl_line   : 3
    <18a>   DW_AT_type        : <0x16b>

note how there's no outermost lexical block there.

This is because gen_subprogram_die calls decls_for_scope on DECL_INITIAL
rather than gen_lexical_block_die.  gen_inlined_subroutine_die tries to do
the same but fails to merge the "fake" block the inliner generates for
the parameter replacements with the actual outer scope of the function.

Reply via email to