[Dwarf-Discuss] dwarf stack operator for byte swap.

Chirag Patel Chirag@raincode.com
Fri Nov 8 06:51:52 GMT 2019


Hi all,

I have sent a comment through http://dwarfstd.org/Comment.php


But below is the body of the comment "
Section 2.5.1.7, pg 37

DW_OP_byte_swap to Byte Swap the data on top of the dwarf stack.
===============================================================================

Overview
------------

For debugging binary with bi-endian marked dwarf DIEs and the some calculation
depending at runtime, the data needs to be loaded at runtime and needs to be
byte swapped. the depended variable DIE here is marked as big-endian and the
host is little-endian. The DW_OP_byte_swap will byte swap the raw data stored
in top dwarf stack entry.

...
0x00000057:   DW_TAG_variable
                DW_AT_name      ("__gbloffset__")
                DW_AT_type      (0x000001e5 "int")
                DW_AT_external  (true)
                DW_AT_decl_file ("...")
                DW_AT_decl_line (8)
                DW_AT_location  (DW_OP_addr 0) // pre linkage
                DW_AT_linkage_name      ("_gblsection__")
                DW_AT_endianity (DW_END_big)

0x00000170:   DW_TAG_variable
                DW_AT_name      ("VAR1")
                DW_AT_type      (0x0000010b "fixed.dec.display.72")
                DW_AT_decl_file ("...")
                DW_AT_decl_line (10)
                DW_AT_location  (DW_OP_addr 0x0, DW_OP_call4 0x57, DW_OP_deref_size, 4,
DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit0, DW_OP_shl, DW_OP_and, DW_OP_lit24, DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit8, DW_OP_shl, DW_OP_and, DW_OP_lit8, DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit16, DW_OP_shl, DW_OP_and, DW_OP_lit8, DW_OP_shr, DW_OP_swap, DW_OP_constu 0xff, DW_OP_lit24, DW_OP_shl, DW_OP_and, DW_OP_lit24, DW_OP_shr, DW_OP_swap, DW_OP_or, DW_OP_or, DW_OP_or, DW_OP_plus)
                DW_AT_linkage_name      ("VAR1")


In above snippet, the DW_OP_byte_swap will replace,
DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit0, DW_OP_shl, DW_OP_and, DW_OP_lit24, DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit8, DW_OP_shl, DW_OP_and, DW_OP_lit8, DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit16, DW_OP_shl, DW_OP_and, DW_OP_lit8, DW_OP_shr, DW_OP_swap, DW_OP_constu 0xff, DW_OP_lit24, DW_OP_shl, DW_OP_and, DW_OP_lit24, DW_OP_shr, DW_OP_swap, DW_OP_or, DW_OP_or, DW_OP_or number of operations.


Proposed changes to DWARF
---------------------------

2.5.1.7 Special Operation

Addition

<n> DW_OP_byte_swap

               The DW_OP_byte_swap operation pops the top stack entry, byte swaps the value
               and pushes back the swapped value on the dwarf stack.

               e.g. so 0x12345678 will become 0x78563412, useful to change endianity of raw
               data.

---------------------------

"

i did not received any confirmation on my mail. How can I check if it was sent correctly?

Kindly inform me if anything more needs to be done from myside.

Regards,

Chirag Patel
Software Engineer | Raincode Labs India
Tel: (+91) 080 41159811
Mob: (+91) 9049336744
www.raincodelabs.com<http://www.raincodelabs.com/>
[linkedin-button]<https://in.linkedin.com/in/chirag-patel->

From: Chirag Patel <Chirag@raincode.com>
Sent: 29 October 2019 17:10
To: Michael Eager <eager at eagercon.com>; Robinson, Paul <paul.robinson at sony.com>; Ron Brender <ron.brender at gmail.com>
Cc: dwarf-discuss at lists.dwarfstd.org
Subject: Re: [Dwarf-Discuss] dwarf stack operator for byte swap.

Hello,

Thank you all for prompt reply.

@Robinson, Paul<mailto:paul.robinson at sony.com>,
Thanks for the shorter list of operators, but as Michael has suggested, i have added a vendor specific operator for that in llvm/lldb(fork of our branch anyways).
the operator, pops the stack entry and byte reverses the value and pushes it back on the stack.

@Ron Brender<mailto:ron.brender at gmail.com>
The operator that i was suggesting, pops the top of the stack, reverses the bytes and pushes it on the stack(like neg operator does for negation).(on second thought the byte_rev would be a better name)
About the other cases you suggested, i sure hope others can help to zero in for perfect
design to cover wide range.

@Michael Eager<mailto:eager at eagercon.com>
Thanks, i have tried the same for our fork of llvm/lldb branch and it seems to be working well(for our case :). https://gitlab.phidani.be/Chirag.Patel

Thank you all for the helpful comments. i will open a dwarf enhancement request soon.

Best Regards.






Chirag Patel

Software Engineer | Raincode Labs India

Tel: (+91) 080 41159811

Mob: (+91) 9049336744
<https://www.linkedin.com/in/chirag-patel-/>


<https://www.linkedin.com/in/chirag-patel-/>
[cid:image002.png at 01D5962F.4FC9C430]<https://www.linkedin.com/in/chirag-patel-/>


________________________________
From: Michael Eager <eager at eagercon.com<mailto:eager@eagercon.com>>
Sent: 28 October 2019 20:37
To: Robinson, Paul <paul.robinson at sony.com<mailto:paul.robinson at sony.com>>; Chirag Patel <Chirag at raincode.com<mailto:Chirag at raincode.com>>
Cc: dwarf-discuss at lists.dwarfstd.org<mailto:dwarf-discuss at lists.dwarfstd.org> <dwarf-discuss at lists.dwarfstd.org<mailto:dwarf-discuss at lists.dwarfstd.org>>
Subject: Re: [Dwarf-Discuss] dwarf stack operator for byte swap.

Hi Chirag --

A byte-swap operator would be a reasonable addition to the DWARF
interpreter.

In addition to writing a proposal as Paul suggests, one option I would
recommend you consider is to create a user-defined operation to perform
this byte-swap operation and give it a value in the range between
DW_OP_lo_user and DW_OP_hi_user.  Of course, this user-defined would
need to be implemented not only in the producer (i.e., compiler) but in
any consumers (i.e., debugger).

When a new version of the DWARF Standard is released, this operation
would be assigned a new value.

On 10/28/19 6:53 AM, Robinson, Paul via Dwarf-Discuss wrote:
> Hello Chirag,
>
> Regarding a byte-swap operation, it seems that you have a reasonable
> use-case on a bi-endian machine.  Feel free to request a new operator on
> the "public comments" page at http://dwarfstd.org/Comment.php
>
> Note that a byte-swap operator would swap all bytes in the top-of-stack
> value, which on your 64-bit machine would of course be a 64-bit value.
> As you want a 32-bit swapped value, you would still need to do a shift
> afterward, but even so, "DW_OP_byte_swap DW_OP_const1u 32 DW_OP_shr"
> would be considerably shorter than what you have to do now.
>
> Of course a new operator would be introduced in a new DWARF revision,
> which is likely to be years away.  In the meantime let me suggest a
> shorter expression for doing the byte-swap operation.  The book
> "Hacker's Delight" shows a straightforward 32-bit byte swap with masks
> no wider than 16 bits, as follows:
>
>                 x = (x << 24) | ((x & 0xff00) << 8) | ((x >> 8) &
> 0xff00) | (x >> 24);
>
> Your 64-bit machine will of course use 64-bit values on the expression
> stack, so to keep the result "32-bit clean" we want to do one additional
> mask:
>
>                 x = ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >> 8)
> & 0xff00) | (x >> 24);
>
> Translating this into a DWARF expression, I get the following:
>
>                 DW_OP_dup, DW_OP_const1u 0xff, DW_OP_and, DW_OP_lit24,
> DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_const2u 0xff00, DW_OP_and,
> DW_OP_lit8, DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_lit8, DW_OP_shr,
> DW_OP_const2u 0xff00, DW_OP_and, DW_OP_swap, DW_OP_lit24, DW_OP_shr,
> DW_OP_or, DW_OP_or, DW_OP_or
>
> I hope this is helpful to you.
>
> --paulr
>
> *From:* Dwarf-Discuss <dwarf-discuss-bounces at lists.dwarfstd.org<mailto:dwarf-discuss-bounces at lists.dwarfstd.org>> *On
> Behalf Of *Chirag Patel via Dwarf-Discuss
> *Sent:* Monday, October 28, 2019 12:47 AM
> *To:* dwarf-discuss at lists.dwarfstd.org<mailto:dwarf-discuss at lists.dwarfstd.org>
> *Subject:* [Dwarf-Discuss] dwarf stack operator for byte swap.
>
> Hello Dwarf experts.
>
> I am currently working trying to encode dwarf of binaries with having
> bi-endian variables marked with DW_AT_endianity attribute.
>
> The location calculation for some  variable depends on other variable
> with different endianity, also the value of this other variable is known
> at runtime.
>
> At the moment I am using location list to calculate the correct location
> of first variable and list of dwarf operators to reverse the endianity
> of variable "__gbloffset__" in below case (I only needed lower 32 bits
> on 64 bit machine).
>
> 0x000001e5: DW_TAG_base_type
>
>   DW_AT_byte_size  (0x04)
>
>    DW_AT_encoding  (DW_ATE_signed)
>
>                  DW_AT_name      ("int")
>
>                  DW_AT_endianity (DW_END_big)
>
> ...
>
> 0x00000057:   DW_TAG_variable
>
>                  DW_AT_name      ("__gbloffset__")
>
>                  DW_AT_type      (0x000001e5 "int")
>
>                  DW_AT_external  (true)
>
>                  DW_AT_decl_file ("...")
>
>                  DW_AT_decl_line (8)
>
>                  DW_AT_location  (DW_OP_addr 0) // pre linkage
>
>                  DW_AT_linkage_name      ("_gblsection__")
>
> 0x00000170:   DW_TAG_variable
>
>                  DW_AT_name      ("VAR1")
>
>                  DW_AT_type      (0x0000010b "fixed.dec.display.72")
>
>                  DW_AT_decl_file ("...")
>
>                  DW_AT_decl_line (10)
>
>                  DW_AT_location  (DW_OP_addr 0x0, DW_OP_call4 0x57,
> DW_OP_deref_size, 4,
>
> DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit0, DW_OP_shl, DW_OP_and,
> DW_OP_lit24, DW_OP_shl, DW_OP_swap, DW_OP_dup, DW_OP_constu 0xff,
> DW_OP_lit8, DW_OP_shl, DW_OP_and, DW_OP_lit8, DW_OP_shl, DW_OP_swap,
> DW_OP_dup, DW_OP_constu 0xff, DW_OP_lit16, DW_OP_shl, DW_OP_and,
> DW_OP_lit8, DW_OP_shr, DW_OP_swap, DW_OP_constu 0xff, DW_OP_lit24,
> DW_OP_shl, DW_OP_and, DW_OP_lit24, DW_OP_shr, DW_OP_swap, DW_OP_or,
> DW_OP_or, DW_OP_or, DW_OP_plus)
>
>                  DW_AT_linkage_name      ("VAR1")
>
> In above snippet of dwarf dump, I am using yellow highlighted list of
> operators to swap the bytes.
>
> I think there should be a support for DW_OP_byte_swap simple operator to
> accomplice this simple task. Does this idea looks like it can be useful?
> Is there any specific reason why dwarf spec does not have it or I am
> missing something subtle.
>
> I hope I conveyed the idea properly, apologies in advanced as English is
> not my first language.
>
> **
>
> *Thanks and regards,*
>
> **
>
> *Chirag Patel*
>
> Software Engineer | Raincode Labs India
>
> *Tel*: (+91) 080 41159811
>
> *Mob*: (+91) 9049336744
>
> www.raincodelabs.com<http://www.raincodelabs.com> <http://www.raincodelabs.com/>__
>
> linkedin-button <https://in.linkedin.com/in/chirag-patel->
>
>
> _______________________________________________
> Dwarf-Discuss mailing list
> Dwarf-Discuss at lists.dwarfstd.org<mailto:Dwarf-Discuss at lists.dwarfstd.org>
> http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
>

--
Michael Eager    eager at eagercon.com<mailto:eager at eagercon.com>
1960 Park Blvd., Palo Alto, CA 94306
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dwarfstd.org/pipermail/dwarf-discuss-dwarfstd.org/attachments/20191108/3197a943/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image002.png
Type: image/png
Size: 22419 bytes
Desc: image002.png
URL: <http://lists.dwarfstd.org/pipermail/dwarf-discuss-dwarfstd.org/attachments/20191108/3197a943/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image003.png
Type: image/png
Size: 7399 bytes
Desc: image003.png
URL: <http://lists.dwarfstd.org/pipermail/dwarf-discuss-dwarfstd.org/attachments/20191108/3197a943/attachment-0003.png>



More information about the Dwarf-discuss mailing list