This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/8] Record explicit block ranges from dwarf2read.c


On 2018-06-26 02:44 AM, Kevin Buettner wrote:
> This change sets BLOCK_RANGES for the block under consideration by
> calling make_blockranges().  This action is performed in
> dwarf2_record_block_ranges().
> 
> It should be noted that dwarf2_record_block_ranges() already does some
> recording of the range via a call to record_block_range().  The ranges
> recorded in that fashion end up in the address map associated with the
> blockvector for the compilation unit's symtab.  Given an address, the
> addrmap provides a fast way of finding the block containing that
> address.  The address map does not, however, provide a convenient way
> of determining which address ranges make up a particular block.
> 
> While reading a set of ranges, a vector of pairs is used to collect
> the starting and ending addresses for each range in the block.  Once
> all of the ranges for a block have been collected, make_blockranges()
> is called to fill in BLOCK_RANGES for the block.
> 
> The ranges are stored for the block in the order that they're read
> from the debug info.  For DWARF, the starting address of the first
> range of the block will be the entry pc in cases where DW_AT_entry_pc
> is not present.  (Well, that would ideally be the case.  At the moment
> DW_AT_entry_pc is not being handled.)
> 
> gdb/ChangeLog:
>     
>     	* dwarf2read.c (dwarf2_record_block_ranges): Fill in BLOCK_RANGES
>     	for block.
> ---
>  gdb/dwarf2read.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 4ad0527..2f0f9b9 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -14722,6 +14722,7 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block,
>        unsigned long offset = (DW_UNSND (attr)
>  			      + (need_ranges_base ? cu->ranges_base : 0));
>  
> +      std::vector<std::pair<CORE_ADDR, CORE_ADDR>> blockvec;
>        dwarf2_ranges_process (offset, cu,
>  	[&] (CORE_ADDR start, CORE_ADDR end)
>  	{
> @@ -14730,7 +14731,10 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block,
>  	  start = gdbarch_adjust_dwarf2_addr (gdbarch, start);
>  	  end = gdbarch_adjust_dwarf2_addr (gdbarch, end);
>  	  record_block_range (block, start, end - 1);
> +	  blockvec.push_back (std::make_pair (start, end));

A real small nit, using

  blockvec.emplace_back (start, end);

would avoid some unnecessary copying.  Otherwise, it LGTM.

Simon


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]