mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-13 13:49:00 +08:00
Change arm-tdep.c to use type-safe registry
This changes arm-tdep.c to use the type-safe registry, removing a use of VEC in the process. 2019-07-10 Tom Tromey <tromey@adacore.com> * arm-tdep.c (arm_exidx_entry_s): Remove typedef. Don't define VEC. (struct arm_exidx_entry): New method operator<. (struct arm_exidx_data) <section_maps>: Change type. (arm_exidx_data_free): Remove. (arm_exidx_data_key): Change type. Move lower. (arm_exidx_new_objfile): Update. (arm_compare_exidx_entries): Remove. (arm_find_exidx_entry, _initialize_arm_tdep)
This commit is contained in:
parent
48c66e1d07
commit
7a5d944b9e
@ -1,3 +1,15 @@
|
||||
2019-07-10 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* arm-tdep.c (arm_exidx_entry_s): Remove typedef. Don't define
|
||||
VEC.
|
||||
(struct arm_exidx_entry): New method operator<.
|
||||
(struct arm_exidx_data) <section_maps>: Change type.
|
||||
(arm_exidx_data_free): Remove.
|
||||
(arm_exidx_data_key): Change type. Move lower.
|
||||
(arm_exidx_new_objfile): Update.
|
||||
(arm_compare_exidx_entries): Remove.
|
||||
(arm_find_exidx_entry, _initialize_arm_tdep)
|
||||
|
||||
2019-07-10 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* solib-spu.c (ocl_program_data_key): Change type.
|
||||
|
@ -1989,37 +1989,23 @@ struct frame_unwind arm_prologue_unwind = {
|
||||
personality routines; the cache will contain only the frame unwinding
|
||||
instructions associated with the entry (not the descriptors). */
|
||||
|
||||
static const struct objfile_data *arm_exidx_data_key;
|
||||
|
||||
struct arm_exidx_entry
|
||||
{
|
||||
bfd_vma addr;
|
||||
gdb_byte *entry;
|
||||
|
||||
bool operator< (const arm_exidx_entry &other) const
|
||||
{
|
||||
return addr < other.addr;
|
||||
}
|
||||
};
|
||||
typedef struct arm_exidx_entry arm_exidx_entry_s;
|
||||
DEF_VEC_O(arm_exidx_entry_s);
|
||||
|
||||
struct arm_exidx_data
|
||||
{
|
||||
VEC(arm_exidx_entry_s) **section_maps;
|
||||
std::vector<std::vector<arm_exidx_entry>> section_maps;
|
||||
};
|
||||
|
||||
static void
|
||||
arm_exidx_data_free (struct objfile *objfile, void *arg)
|
||||
{
|
||||
struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < objfile->obfd->section_count; i++)
|
||||
VEC_free (arm_exidx_entry_s, data->section_maps[i]);
|
||||
}
|
||||
|
||||
static inline int
|
||||
arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
|
||||
const struct arm_exidx_entry *rhs)
|
||||
{
|
||||
return lhs->addr < rhs->addr;
|
||||
}
|
||||
static const struct objfile_key<arm_exidx_data> arm_exidx_data_key;
|
||||
|
||||
static struct obj_section *
|
||||
arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
|
||||
@ -2064,7 +2050,7 @@ arm_exidx_new_objfile (struct objfile *objfile)
|
||||
LONGEST i;
|
||||
|
||||
/* If we've already touched this file, do nothing. */
|
||||
if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
|
||||
if (!objfile || arm_exidx_data_key.get (objfile) != NULL)
|
||||
return;
|
||||
|
||||
/* Read contents of exception table and index. */
|
||||
@ -2095,11 +2081,8 @@ arm_exidx_new_objfile (struct objfile *objfile)
|
||||
}
|
||||
|
||||
/* Allocate exception table data structure. */
|
||||
data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
|
||||
set_objfile_data (objfile, arm_exidx_data_key, data);
|
||||
data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
|
||||
objfile->obfd->section_count,
|
||||
VEC(arm_exidx_entry_s) *);
|
||||
data = arm_exidx_data_key.emplace (objfile);
|
||||
data->section_maps.resize (objfile->obfd->section_count);
|
||||
|
||||
/* Fill in exception table. */
|
||||
for (i = 0; i < exidx_data.size () / 8; i++)
|
||||
@ -2250,9 +2233,8 @@ arm_exidx_new_objfile (struct objfile *objfile)
|
||||
appear in order of increasing addresses. */
|
||||
new_exidx_entry.addr = idx;
|
||||
new_exidx_entry.entry = entry;
|
||||
VEC_safe_push (arm_exidx_entry_s,
|
||||
data->section_maps[sec->the_bfd_section->index],
|
||||
&new_exidx_entry);
|
||||
data->section_maps[sec->the_bfd_section->index].push_back
|
||||
(new_exidx_entry);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2269,43 +2251,37 @@ arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
|
||||
if (sec != NULL)
|
||||
{
|
||||
struct arm_exidx_data *data;
|
||||
VEC(arm_exidx_entry_s) *map;
|
||||
struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
|
||||
unsigned int idx;
|
||||
|
||||
data = ((struct arm_exidx_data *)
|
||||
objfile_data (sec->objfile, arm_exidx_data_key));
|
||||
data = arm_exidx_data_key.get (sec->objfile);
|
||||
if (data != NULL)
|
||||
{
|
||||
map = data->section_maps[sec->the_bfd_section->index];
|
||||
if (!VEC_empty (arm_exidx_entry_s, map))
|
||||
std::vector<arm_exidx_entry> &map
|
||||
= data->section_maps[sec->the_bfd_section->index];
|
||||
if (!map.empty ())
|
||||
{
|
||||
struct arm_exidx_entry *map_sym;
|
||||
auto idx = std::lower_bound (map.begin (), map.end (), map_key);
|
||||
|
||||
idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
|
||||
arm_compare_exidx_entries);
|
||||
|
||||
/* VEC_lower_bound finds the earliest ordered insertion
|
||||
/* std::lower_bound finds the earliest ordered insertion
|
||||
point. If the following symbol starts at this exact
|
||||
address, we use that; otherwise, the preceding
|
||||
exception table entry covers this address. */
|
||||
if (idx < VEC_length (arm_exidx_entry_s, map))
|
||||
if (idx < map.end ())
|
||||
{
|
||||
map_sym = VEC_index (arm_exidx_entry_s, map, idx);
|
||||
if (map_sym->addr == map_key.addr)
|
||||
if (idx->addr == map_key.addr)
|
||||
{
|
||||
if (start)
|
||||
*start = map_sym->addr + obj_section_addr (sec);
|
||||
return map_sym->entry;
|
||||
*start = idx->addr + obj_section_addr (sec);
|
||||
return idx->entry;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx > 0)
|
||||
if (idx > map.begin ())
|
||||
{
|
||||
map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
|
||||
idx = idx - 1;
|
||||
if (start)
|
||||
*start = map_sym->addr + obj_section_addr (sec);
|
||||
return map_sym->entry;
|
||||
*start = idx->addr + obj_section_addr (sec);
|
||||
return idx->entry;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9461,8 +9437,6 @@ _initialize_arm_tdep (void)
|
||||
|
||||
/* Add ourselves to objfile event chain. */
|
||||
gdb::observers::new_objfile.attach (arm_exidx_new_objfile);
|
||||
arm_exidx_data_key
|
||||
= register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
|
||||
|
||||
/* Register an ELF OS ABI sniffer for ARM binaries. */
|
||||
gdbarch_register_osabi_sniffer (bfd_arch_arm,
|
||||
|
Loading…
Reference in New Issue
Block a user