[cfe-dev] potentially incorrect DWARF location list

Eric Christopher echristo at gmail.com
Fri Dec 5 14:53:26 PST 2014


On Fri Dec 05 2014 at 12:28:22 PM Romanova, Katya <
Katya_Romanova at playstation.sony.com> wrote:

>  Thank you, Frédéric.
>
>
>
> I will file a bug against the compiler and work on it. I will also file a
> corresponding bug against the debugger.
>
>
(I too agree with the analysis)

Sounds good. Patches for this will almost assuredly be to llvm-commits FWIW.

-eric


>
>
> Katya.
>
>
>
>
>
> *From:* Frédéric Riss [mailto:friss at apple.com]
> *Sent:* Friday, December 05, 2014 7:56 AM
> *To:* Romanova, Katya
> *Cc:* cfe-dev at cs.uiuc.edu
> *Subject:* Re: [cfe-dev] potentially incorrect DWARF location list
>
>
>
> Hi,
>
>
>
>  On Dec 4, 2014, at 6:16 PM, Romanova, Katya <
> Katya_Romanova at playstation.sony.com> wrote:
>
>
>
>
>
> Hi,
>
>
>
> I've encountered a situation where Clang generates an incorrect location
> list for the variable. GDB chokes on it, but LLDB understands it.
>
> DWARF standard doesn't say that this location list is legal. Is it a bug
> in Clang that got compensated by LLDB? Or is it done on purpose?
>
>
>
>
>
> Here is more information.
>
>
>
> Consider the following test:
>
>
>
>
>
> ---main.cpp---
>
>
>
> #include "stuff.h"
>
>
>
> int main()
>
> {
>
>                 int c = 0;
>
>
>
>                 for (int a = 0; a < 100; ++a)
>
>                                 c += func(a);
>
>
>
>                 return c;
>
> }
>
>
>
> --- stuff.h---
>
>
>
>
>
> extern int func(int a);
>
>
>
>
>
> ---stuff.cpp---
>
>
>
> #include "stuff.h"
>
>
>
> int func(int a)
>
> {
>
>         return a * 15;
>
> }
>
>
>
>
>
>
>
> The following DWARF is generated for variables "a" and "c":
>
> <2><43>: Abbrev Number: 3 (DW_TAG_variable)
>
>     <44>   DW_AT_location    : 0x0      (location list)
>
>     <48>   DW_AT_name        : (indirect string, offset: 0x73): c
>
>     <4c>   DW_AT_decl_file   : 1
>
>     <4d>   DW_AT_decl_line   : 5
>
>     <4e>   DW_AT_type        : <0x70>
>
> <2><52>: Abbrev Number: 4 (DW_TAG_lexical_block)
>
>     <53>   DW_AT_low_pc      : 0x12
>
>     <5b>   DW_AT_high_pc     : 0x10
>
> <3><5f>: Abbrev Number: 3 (DW_TAG_variable)
>
>     <60>   DW_AT_location    : 0x39     (location list)
>
>     <64>   DW_AT_name        : (indirect string, offset: 0x75): a
>
>     <68>   DW_AT_decl_file   : 1
>
>     <69>   DW_AT_decl_line   : 7
>
>     <6a>   DW_AT_type        : <0x70>
>
>
>
>
>
>
>
> Content of the .debug_loc section:
>
>
>
>     Offset   Begin    End      Expression
>
>     00000000 0000000000000003 0000000000000026 (DW_OP_consts: 13)
>
>     00000014 0000000000000026 0000000000000029 (DW_OP_reg0 (rax);
> DW_OP_piece: 4)
>
>     00000029 <End of list>
>
>     00000039 0000000000000008 000000000000001d (DW_OP_consts: 0)
>
>     0000004d 000000000000001d 0000000000000022 (DW_OP_reg3 (rbx);
> DW_OP_piece: 4)
>
>     00000062 <End of list>
>
>
>
>
>
> DWARF expressions"DW_OP_consts 13" and "DW_OP_consts 0" are legal, but are
> they legal as locations? I've checked DWARF-3, DWAWF-4 and DWARF-5
>
> and it seems that the proper way to describe the situation where in a
> specific address range the value is constant is "DW_OP_constu 0,
> DW_OP_stack_value”.
>
>
>
> I agree with this interpretation. IIRC, the OP_stack_value didn’t exist
> before the DWARF4 standard. Expressing this situation simply was impossible
> without this operation and I am quite sure that producers and consumers
> started to rely on heuristics to disambiguate the value vs. location status
> of the expression. GDB might have moved away from that by now. We’d need to
> fix lldb to DTRT also.
>
>
>
> Fred
>
>
>
>   DW_OP_const pushes a value on to the expression stack, this describes a
> location, not a value. In order for the stack to represent a value the
> expression needs to end with DW_OP_stack_value.
>
>
>
> GDB thinks that "DW_OP_consts 0" represents a location in memory:
>
>
>
> Breakpoint 1, main () at main.cpp:8
>
> 8                       c += func(a);
>
> (gdb) p c
>
> Cannot access memory at address 0xd
>
> (gdb) p a
>
> Cannot access memory at address 0x0
>
> (gdb)
>
>
>
>
>
> LLDB seems to know how to interpret DW_OP_consts correctly.
>
>
>
>
>
> (lldb) run
>
> Process 8216 launching
>
>
>
> * thread #1: tid = 8216, 0x0000000000400502 main.O2.exe`main + 18 at
> main.cpp:8, name =
>
> 'main.O2.exe', stop reason = breakpoint 1.1
>
>     frame #0: 0x0000000000400502 main.O2.exe`main + 18 at main.cpp:8
>
>    5            int c = 13;
>
>    6
>
>    7            for (int a = 0; a < 100; ++a)
>
> -> 8                    c += func(a);
>
>    9
>
>    10           return c;
>
>    11   }
>
> (lldb) p c
>
> (int) $0 = 13
>
> (lldb) p a
>
> (int) $1 = 0
>
>
>
> Is this implemented in Clang on purpose for some reason? Or is it a bug in
> Clang that gets compensated by the debugger?
>
> Thanks!
>
> Katya.
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
>  _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141205/2dee6b57/attachment.html>


More information about the cfe-dev mailing list