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

Aldy Hernandez <aldyh at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org

--- Comment #4 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
I am attaching a simplified preprocessed file that exhibits the problem. 
Perhaps someone with more debug-fu can comment here.

[tl;dr: Shouldn't local variables in a cloned variable have their own location
lists?].

The following is being cloned into guality_main.constprop(), which in turn is
called from main():

int
guality_main(int argc, char *argv[])
{
  int boring = -1;
    boring = -f(&boring);
  guality_check ("boring", boring, 0);
  return boring;
}

[FWIW, guality_main and guality_main.constprop have exactly the same IL, albeit
with different #DEBUG statements.  I don't know why we even clone it.]

$ ./a.out
FAIL: guality/guality.h: boring is -1, not 1
FAIL: guality/guality.h: 0 PASS, 1 FAIL, 0 UNRESOLVED

Since guality_main.constprop() is the function being called, let's look for
"boring" in it:

;; guality_main.constprop()
 <1><9f0>: Abbrev Number: 42 (DW_TAG_subprogram)
    <9f1>   DW_AT_abstract_origin: <0x474>
    <9f5>   DW_AT_low_pc      : 0x400e22
    <9fd>   DW_AT_high_pc     : 0x1f
    <a05>   DW_AT_frame_base  : 1 byte block: 9c        (DW_OP_call_frame_cfa)
    <a07>   DW_AT_GNU_all_call_sites: 1
    <a07>   DW_AT_sibling     : <0xa4a>
 <2><a0b>: Abbrev Number: 46 (DW_TAG_variable)
    <a0c>   DW_AT_abstract_origin: <0x9c1>

According to this, "boring" comes from 0x9c1 which is defined in
guality_main(), the original function:

;; guality_main()
 <1><994>: Abbrev Number: 42 (DW_TAG_subprogram)
    <995>   DW_AT_abstract_origin: <0x474>
    <999>   DW_AT_low_pc      : 0x400e03
    <9a1>   DW_AT_high_pc     : 0x1f
    <9a9>   DW_AT_frame_base  : 1 byte block: 9c        (DW_OP_call_frame_cfa)
    <9ab>   DW_AT_GNU_all_call_sites: 1
    <9ab>   DW_AT_sibling     : <0x9f0>
...
 <2><9c1>: Abbrev Number: 45 (DW_TAG_variable)
    <9c2>   DW_AT_abstract_origin: <0x49d>  <-- points to DW_TAG_var for
"boring"
    <9c6>   DW_AT_location    : 0x542 (location list)

The location list for this 0x542 has a literal of 1 as expected:

00000542 0000000000400e03 0000000000400e18 (DW_OP_lit1; DW_OP_stack_value)

However, my question is, shouldn't "boring" in guality_main.constprop (0xa0b)
have a DW_AT_location of itself?  Because even if if the location of boring in
guality_main.constprop (0xa0b) comes through the abstract origin that
ultimately leeds to...

00000542 0000000000400e03 0000000000400e18 (DW_OP_lit1; DW_OP_stack_value)

This is the wrong address. 0x400e03 through 0x400e18 is in guality_main(), not
in guality_main.constprop() which is the function being called:

0000000000400e03 <guality_main>:
  400e03:       48 83 ec 08             sub    $0x8,%rsp
  400e07:       31 d2                   xor    %edx,%edx
  400e09:       be 01 00 00 00          mov    $0x1,%esi
  400e0e:       bf 08 12 40 00          mov    $0x401208,%edi
  400e13:       e8 b3 fd ff ff          callq  400bcb <guality_check>
  400e18:       b8 01 00 00 00          mov    $0x1,%eax
  400e1d:       48 83 c4 08             add    $0x8,%rsp
  400e21:       c3                      retq   

Hints, tips, and/or solutions, would be greatly appreciated :).

Reply via email to