diff options
-rw-r--r-- | gdb/block.h | 27 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 2 | ||||
-rw-r--r-- | gdb/objfiles.c | 12 |
3 files changed, 24 insertions, 17 deletions
diff --git a/gdb/block.h b/gdb/block.h index 60e53c6..daaaecd 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -21,6 +21,7 @@ #define BLOCK_H #include "dictionary.h" +#include "gdbsupport/array-view.h" /* Opaque declarations. */ @@ -154,6 +155,18 @@ struct block void set_namespace_info (block_namespace_info *namespace_info) { m_namespace_info = namespace_info; } + /* Return a view on this block's ranges. */ + gdb::array_view<blockrange> ranges () + { return gdb::make_array_view (m_ranges->range, m_ranges->nranges); } + + /* Const version of the above. */ + gdb::array_view<const blockrange> ranges () const + { return gdb::make_array_view (m_ranges->range, m_ranges->nranges); } + + /* Set this block's ranges array. */ + void set_ranges (blockranges *ranges) + { m_ranges = ranges; } + /* Addresses in the executable code that are in this block. */ CORE_ADDR m_start; @@ -185,7 +198,7 @@ struct block is NULL, then there is only one range which is specified by startaddr and endaddr above. */ - struct blockranges *ranges; + struct blockranges *m_ranges; }; /* The global block is singled out so that we can provide a back-link @@ -202,22 +215,18 @@ struct global_block struct compunit_symtab *compunit_symtab; }; -/* Accessor for ranges field within block BL. */ - -#define BLOCK_RANGES(bl) (bl)->ranges - /* Number of ranges within a block. */ -#define BLOCK_NRANGES(bl) (bl)->ranges->nranges +#define BLOCK_NRANGES(bl) (bl)->ranges ().size () /* Access range array for block BL. */ -#define BLOCK_RANGE(bl) (bl)->ranges->range +#define BLOCK_RANGE(bl) (bl)->ranges ().data () /* Are all addresses within a block contiguous? */ -#define BLOCK_CONTIGUOUS_P(bl) (BLOCK_RANGES (bl) == nullptr \ - || BLOCK_NRANGES (bl) <= 1) +#define BLOCK_CONTIGUOUS_P(bl) ((bl)->ranges ().size () == 0 \ + || (bl)->ranges ().size () == 1) /* Define the "entry pc" for a block BL to be the lowest (start) address for the block when all addresses within the block are contiguous. If diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 37e9587..d146d52 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -13192,7 +13192,7 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block, blockvec.emplace_back (start, end); }); - BLOCK_RANGES(block) = make_blockranges (objfile, blockvec); + block->set_ranges (make_blockranges (objfile, blockvec)); } } diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 9c7a30d..c4b054a 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -680,13 +680,11 @@ objfile_relocate1 (struct objfile *objfile, b->set_start (b->start () + delta[block_line_section]); b->set_end (b->end () + delta[block_line_section]); - if (BLOCK_RANGES (b) != nullptr) - for (int j = 0; j < BLOCK_NRANGES (b); j++) - { - blockrange &r = BLOCK_RANGE (b)[j]; - r.set_start (r.start () + delta[block_line_section]); - r.set_end (r.end () + delta[block_line_section]); - } + for (blockrange &r : b->ranges ()) + { + r.set_start (r.start () + delta[block_line_section]); + r.set_end (r.end () + delta[block_line_section]); + } /* We only want to iterate over the local symbols, not any symbols in included symtabs. */ |