Re: Complex DWARF expressions

Jan Kratochvil <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
On Mon, 22 Sep 2014 07:59:20 +0200, Yao Qi wrote:
> Eli Zaretskii <[email protected]> writes:
> 
> >     Range 0x100aaf7-0x100ad4c: a complex DWARF expression:
> >        0: DW_OP_GNU_entry_value
> > 	 2: DW_OP_reg2 [$edx]
> >        3: DW_OP_stack_value
> >
> > "A variable in $edx" I understand, but what about the "complex DWARF
> > expression" parts?  Is there any way a mere mortal such as myself can
> > decipher this to the effect of understanding in which register or at
> > what address can I look up the value, assuming that I know at which PC
> > address the program stopped?
> >
> > (Yes, I've looked at the DWARF Standard, but couldn't understand from
> > the description of these location descriptors how to convert them to
> > either a register or a memory address.)
> 
> DW_OP_GNU_entry_value isn't in DWARF Standard and it is documented here
> http://www.dwarfstd.org/ShowIssue.php?issue=100909.1
> 
> If I understand the doc above correctly, the entry above means if PC is
> within range 0x100aaf7-0x100ad4c, the value of new_width is the value of
> $edx at the moment entering this function.  IOW, to get value of
> new_width, needs to unwind frame and read $edx.

But $edx at the caller would be usually callee-clobbered so one would not be
able to read the value.  This is why the caller's call instruction is described
by:

 <8><1663ca>: Abbrev Number: 24 (DW_TAG_GNU_call_site)
    <1663cb>   DW_AT_low_pc      : 0x814d44f
    <1663cf>   DW_AT_abstract_origin: <0x15e7bc>
 <9><1663d8>: Abbrev Number: 3 (DW_TAG_GNU_call_site_parameter)
    <1663d9>   DW_AT_location    : 1 byte block: 52     (DW_OP_reg2 (edx))
    <1663db>   DW_AT_GNU_call_site_value: 1 byte block: 30      (DW_OP_lit0)

So one finds matching DW_TAG_GNU_call_site and then one finds
DW_TAG_GNU_call_site_parameter with matching DW_AT_location there.

These rules have to be applied recursively, as in many cases there is for
example:

 <6><1669c2>: Abbrev Number: 3 (DW_TAG_GNU_call_site_parameter)
    <1669c3>   DW_AT_location    : 1 byte block: 51     (DW_OP_reg1 (ecx))
    <1669c5>   DW_AT_GNU_call_site_value: 7 byte block: f3 1 51 a ff ff 1a      (DW_OP_GNU_entry_value: (DW_OP_reg1 (ecx)); DW_OP_const2u: 65535; DW_OP_and)


Jan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.