[Dwarf-Discuss] Lexical block address ranges when nesting

Michael Eager eager@eagercon.com
Sat Nov 8 19:36:15 GMT 2008


Ron echoes my thoughts on this.

A lexical block contains all of its nested inner blocks.  In DWARF,
each block would have a low_PC and high_PC value, unless the block
really is discontiguous.


Ron Brender wrote:
> The computer science concept of a lexical block is inherently inclusive 
> of any blocks nested within (so-called inner blocks). As a consequence, 
> it never occurred to this complier implementor and the debugger 
> implementors he has worked with over the years to exclude the inner 
> blocks when generating the debug info for a block.
> 
> In a non-optimized compilation, it will normally be the case the every 
> lexical block (including every function body) can be described by as a 
> single contiguous range of instructions (using DW_AT_low_PC and 
> _high_PC) if blocks are considered inclusive of inner blocks. If inner 
> blocks are excluded, then any block containing a inner block becomes 
> discontiguous (usually) and would require the more complicated 
> DW_AT_range attribute to describe.
> 
> I don't recall anywhere else in the document where the concept of block 
> is explicitly defined. But I also find it hard to read Section 3.4 in a 
> way that allows either inclusive or exclusive interpretations.
> 
> I see no advantage for DWARF as a specification to be ambivalent about 
> whether blocks are inclusive or exclusive. But if that were the intent, 
> the I would argue that DWARF really needs another attribute that 
> specifies which interpretation is being used by a particular version of 
> a particular producer on a particular architecture (this week). 
> Otherwise, debugger implementations become less portable and must build 
> in additional knowledge about "known producers". (Yes, there is some of 
> this already but I see no value in it in this connection.)
> 
> Ron
> 
> -----------------
> Martin Day wrote:
>> Section 3.4 of the dwarf3 spec says :
>>
>> "The lexical block entry may have either a DW_AT_low_pc and DW_AT_high_pc
>> pair of attributes or a DW_AT_ranges attribute whose values encode the
>> contiguous or non-contiguous address ranges, respectively, of the machine
>> instructions generated for the lexical block (see Section 2.17)."
>>
>> We're compiling C/C++ using DW_AT_ranges. Should the ranges specified 
>> for a
>> lexical block include the ranges of all nested (child) lexical blocks or
>> should it only be the address ranges of instructions generated for that
>> lexical block as the quote above seems to imply or is it undefined and
>> implementation dependant?
>>
>> Compiler writers say it's easier for them to just list the ranges for
>> instructions in the block excluding those in nested blocks. Debugger 
>> writers
>> would prefer the ranges of a parent block to include all the ranges of 
>> child
>> blocks so that a tree search is easier.
>>
>> Is this explicitly defined somewhere in the standard or should the 
>> debugger
>> be able to cope with either method?
>>
>> Thanks
>>
>> Martin
> 
> _______________________________________________
> Dwarf-Discuss mailing list
> Dwarf-Discuss at lists.dwarfstd.org
> http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
> 


-- 
Michael Eager	 eager at eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077




More information about the Dwarf-discuss mailing list