[Dwarf-Discuss] dwarf stack operator for byte swap.
Michael Eager
eager@eagercon.com
Fri Nov 8 14:33:32 GMT 2019
Hi Chirag --
Thanks for your submission. It was received.
I'm redesigning the DWARF website, in part to address the problem that
it receives a lot of spam submissions. Your issue will be posted soon.
On 11/7/19 10:51 PM, Chirag Patel wrote:
> 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 at 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-/>_
>
> <https://www.linkedin.com/in/chirag-patel-/>
>
> ------------------------------------------------------------------------
>
> *From:*Michael Eager <eager at eagercon.com <mailto:eager at 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
>
--
Michael Eager eager at eagercon.com
1960 Park Blvd., Palo Alto, CA 94306
More information about the Dwarf-discuss
mailing list