[lldb-dev] Prologue instructions having line information

Robinson, Paul via lldb-dev lldb-dev at lists.llvm.org
Fri Sep 22 16:18:56 PDT 2017



> -----Original Message-----
> From: lldb-dev [mailto:lldb-dev-bounces at lists.llvm.org] On Behalf Of Chris
> Quenelle via lldb-dev
> Sent: Friday, September 22, 2017 4:03 PM
> To: Jim Ingham
> Cc: LLDB
> Subject: Re: [lldb-dev] Prologue instructions having line information
> 
> 
> > On Sep 14, 2017, at 3:32 PM, Jim Ingham <jingham at apple.com> wrote:
> >
> > This is supported (admittedly a little awkwardly) in DWARF with the
> DW_TAG_inline_subroutine DIE's in the  debug_info section of the DWARF.
> They can expresses the nesting fully.
> >
> 
> Sorry for the delay in responding.
> 
> For now, I don’t have anything interesting to say about how
> lldb keeps track of which logical function it’s in when
> a single instruction maps to multiple functions.  Jim’s comments
> seem logical.  For all the places in lldb that convert an
> instruction location into a function those would be places to look
> at the code and think about doing something more fancy.
> 
> I did have some thoughts on the range list encoding.
> 
> What follows is not a recommendation, it's just random
> musings.
> 
> range lists...
> They seem to take up more space than they need to.
> 
> So for a single inline instance you need: (assuming 64
> bits obviously)
> 
> 2x64 base address
> 2x64 end of list
> 
> Plus 2x64 for every continuous block of instructions.
> Assuming the usual case of inlining is mixed with
> code scheduling and other optimizations, a single
> inlined instance is likely to be split up pretty
> thoroughly. (This is all logical guesses, I haven't
> gathered any statistics.)
> 
> So if you've got 10 instruction split into 5 chunks
> then you need (1+5+1) * (64*2) which is 112 bytes.
> 
> Since most inlined functions are very small
> the overhead of 4 address words just to open
> up a range list seems pretty inefficient.
> 
> You're effectively painting a boolean property
> on a subset of the instructions in a function.
> With one property per inlined instance.
> 
> In the old Sun days we had a desire to do this
> for a couple of different kinds of information so
> we invested in a fairly concise way to record it.
> 
> We just made a sorted list of the instruction offsets
> from the start of the containing function.  Then encoded
> the sorted list of numbers differentially and stored
> it as a list of ULEBs in a raw data block attribute attached
> to a die that describes the property we're describing.
> It was used for describing ctor and dtor code blocks
> among other things.
> 
> So if you have these function offsets of instructions:
> 
> 1001 1002 1005 1010 1030
> 
> You end up with a list of LEBs like:
> 
> 1001 1 3 5 20    (the last 4 numbers are the
>                   differences between adjacent pairs)
> 
> And and since LEBs are fairly short when they are small
> it doesn't take much space.  So for this example I think
> it would be just 6 bytes.
> 
> If you had 10 instructions like I used above, then
> you'd have 10 bytes plus a few extra bytes for the
> larger offsets.
> 
> It's much shorter if you can do without address-sized
> fields, and it's easier on the linker to avoid
> lots of relocations.  But the down side is that
> using relocations and offsets allows you to generate
> the section data using assembly syntax without teaching
> your assembler how to generate special dwarf data.
> So that may be why dwarf has relied a little too heavily on
> addresses and relocations for some things.  But that's
> just guess.

For contiguous ranges described by low_pc/hi_pc attribute
pairs, the hi_pc can be a constant for the length, so you save
a little space and a relocation.  I think that’s in DWARF 4.

DWARF 5 redid the ranges section, to do a lot more with ULEBs
and offsets from base addresses.  So it should be a lot more 
compact.  That requires producers to speak DWARF 5, of course; 
I'm trying to make time to do that for Clang.
--paulr

> 
> 
> Now I noticed there was an issue that Paul Robinson
> mentioned on the intertubes where lldb prefers
> fixed-size dies.  The solution in the Studio compilers
> puts the data block inside the die, but it works
> just as well to factor the data out into a different
> section the same way range lists work. It's a little
> less space efficient because of the address pointing
> at the external section, but still better than range lists.
> 
> 
> 
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev


More information about the lldb-dev mailing list