Skip to content

Commit

Permalink
gdb: convert obj_section macros to methods
Browse files Browse the repository at this point in the history
Convert these three macros to methods of obj_section.  The problem fixed
by the following patch is caused by an out of bound access of the
objfile::section_offsets vector.  Since this is deep in macros, we don't
get a clear backtrace and it's difficult to debug.  Changing that to
methods means we can step in them and break on them.

Because their implementation requires knowing about struct objfile, move
struct obj_section below struct objfile in objfiles.h.

The obj_section_offset was used in one place as an lvalue to set
offsets, in machoread.c.  Replace that with a set_offset method.

Add the objfile::section_offset and objfile::set_section_offset methods
to improve encapsulation (reduce other objects poking into struct
objfile's internals).

gdb/ChangeLog:

	* objfiles.h (struct obj_section): Move down.
	<offset, set_offset, addr, endaddr>: New.
	(obj_section_offset, obj_section_addr, obj_section_endaddr),
	replace all users to use obj_section methods.
	(struct objfile) <section_offset, set_section_offset>: New.

Change-Id: I97e8fcae93ab2353fbdadcb4a5ec10d7949a7334
  • Loading branch information
simark committed Jun 28, 2021
1 parent f07fad9 commit 0c1bcd2
Show file tree
Hide file tree
Showing 22 changed files with 134 additions and 102 deletions.
16 changes: 16 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
2021-06-28 Simon Marchi <simon.marchi@polymtl.ca>

* objfiles.h (struct obj_section): Move down.
<offset, set_offset, addr, endaddr>: New.
(obj_section_offset, obj_section_addr, obj_section_endaddr),
replace all users to use obj_section methods.
(struct objfile) <section_offset, set_section_offset>: New.

2021-06-28 Simon Marchi <simon.marchi@polymtl.ca>

* objfiles.h (struct obj_section): Move down.
<offset, set_offset, addr, endaddr>: New.
(obj_section_offset, obj_section_addr, obj_section_endaddr),
replace all users to use obj_section methods.
(struct objfile) <section_offset, set_section_offset>: New.

2021-06-28 Simon Marchi <simon.marchi@polymtl.ca>

* .flake8: New.
Expand Down
15 changes: 7 additions & 8 deletions gdb/arm-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,8 +395,7 @@ arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
data->section_maps_sorted[section_idx] = true;
}

struct arm_mapping_symbol map_key
= { memaddr - obj_section_addr (sec), 0 };
arm_mapping_symbol map_key = { memaddr - sec->addr (), 0 };
arm_mapping_symbol_vec::const_iterator it
= std::lower_bound (map.begin (), map.end (), map_key);

Expand All @@ -409,7 +408,7 @@ arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
if (it->value == map_key.value)
{
if (start)
*start = it->value + obj_section_addr (sec);
*start = it->value + sec->addr ();
return it->type;
}
}
Expand All @@ -420,7 +419,7 @@ arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
= it - 1;

if (start)
*start = prev_it->value + obj_section_addr (sec);
*start = prev_it->value + sec->addr ();
return prev_it->type;
}
}
Expand Down Expand Up @@ -2218,7 +2217,7 @@ arm_exidx_new_objfile (struct objfile *objfile)
NULL
};

CORE_ADDR pc = pers + obj_section_offset (pers_sec);
CORE_ADDR pc = pers + pers_sec->offset ();
int k;

for (k = 0; personality[k]; k++)
Expand Down Expand Up @@ -2303,7 +2302,7 @@ arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
if (sec != NULL)
{
struct arm_exidx_data *data;
struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
struct arm_exidx_entry map_key = { memaddr - sec->addr (), 0 };

data = arm_exidx_data_key.get (sec->objfile->obfd);
if (data != NULL)
Expand All @@ -2323,7 +2322,7 @@ arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
if (idx->addr == map_key.addr)
{
if (start)
*start = idx->addr + obj_section_addr (sec);
*start = idx->addr + sec->addr ();
return idx->entry;
}
}
Expand All @@ -2332,7 +2331,7 @@ arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
{
idx = idx - 1;
if (start)
*start = idx->addr + obj_section_addr (sec);
*start = idx->addr + sec->addr ();
return idx->entry;
}
}
Expand Down
3 changes: 1 addition & 2 deletions gdb/exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -636,8 +636,7 @@ program_space::add_target_sections (struct objfile *objfile)
if (bfd_section_size (osect->the_bfd_section) == 0)
continue;

m_target_sections.emplace_back (obj_section_addr (osect),
obj_section_endaddr (osect),
m_target_sections.emplace_back (osect->addr (), osect->endaddr (),
osect->the_bfd_section, (void *) objfile);
}
}
Expand Down
6 changes: 3 additions & 3 deletions gdb/gcore.c
Original file line number Diff line number Diff line change
Expand Up @@ -404,8 +404,8 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size, int read,
bfd *abfd = objfile->obfd;
asection *asec = objsec->the_bfd_section;
bfd_vma align = (bfd_vma) 1 << bfd_section_alignment (asec);
bfd_vma start = obj_section_addr (objsec) & -align;
bfd_vma end = (obj_section_endaddr (objsec) + align - 1) & -align;
bfd_vma start = objsec->addr () & -align;
bfd_vma end = (objsec->endaddr () + align - 1) & -align;

/* Match if either the entire memory region lies inside the
section (i.e. a mapping covering some pages of a large
Expand Down Expand Up @@ -479,7 +479,7 @@ objfile_find_memory_regions (struct target_ops *self,
int size = bfd_section_size (isec);
int ret;

ret = (*func) (obj_section_addr (objsec), size,
ret = (*func) (objsec->addr (), size,
1, /* All sections will be readable. */
(flags & SEC_READONLY) == 0, /* Writable. */
(flags & SEC_CODE) != 0, /* Executable. */
Expand Down
4 changes: 2 additions & 2 deletions gdb/hppa-bsd-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ hppabsd_find_global_pointer (struct gdbarch *gdbarch, struct value *function)

if (sec < faddr_sec->objfile->sections_end)
{
CORE_ADDR addr = obj_section_addr (sec);
CORE_ADDR endaddr = obj_section_endaddr (sec);
CORE_ADDR addr = sec->addr ();
CORE_ADDR endaddr = sec->endaddr ();

while (addr < endaddr)
{
Expand Down
4 changes: 2 additions & 2 deletions gdb/hppa-linux-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,8 @@ hppa_linux_find_global_pointer (struct gdbarch *gdbarch,
{
CORE_ADDR addr, endaddr;

addr = obj_section_addr (osect);
endaddr = obj_section_endaddr (osect);
addr = osect->addr ();
endaddr = osect->endaddr ();

while (addr < endaddr)
{
Expand Down
6 changes: 1 addition & 5 deletions gdb/hppa-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -943,11 +943,7 @@ hppa64_convert_code_addr_to_fptr (struct gdbarch *gdbarch, CORE_ADDR code)

if (opd < sec->objfile->sections_end)
{
CORE_ADDR addr;

for (addr = obj_section_addr (opd);
addr < obj_section_endaddr (opd);
addr += 2 * 8)
for (CORE_ADDR addr = opd->addr (); addr < opd->endaddr (); addr += 2 * 8)
{
ULONGEST opdaddr;
gdb_byte tmp[8];
Expand Down
14 changes: 5 additions & 9 deletions gdb/ia64-tdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -2859,7 +2859,7 @@ ia64_get_dyn_info_list (unw_addr_space_t as,
void *buf = NULL;

text_sec = objfile->sections + SECT_OFF_TEXT (objfile);
ip = obj_section_addr (text_sec);
ip = text_sec->addr ();
ret = ia64_find_unwind_table (objfile, ip, &di, &buf);
if (ret >= 0)
{
Expand Down Expand Up @@ -3432,10 +3432,8 @@ ia64_find_global_pointer_from_dynamic_section (struct gdbarch *gdbarch,

if (osect < faddr_sect->objfile->sections_end)
{
CORE_ADDR addr, endaddr;

addr = obj_section_addr (osect);
endaddr = obj_section_endaddr (osect);
CORE_ADDR addr = osect->addr ();
CORE_ADDR endaddr = osect->endaddr ();

while (addr < endaddr)
{
Expand Down Expand Up @@ -3515,10 +3513,8 @@ find_extant_func_descr (struct gdbarch *gdbarch, CORE_ADDR faddr)

if (osect < faddr_sect->objfile->sections_end)
{
CORE_ADDR addr, endaddr;

addr = obj_section_addr (osect);
endaddr = obj_section_endaddr (osect);
CORE_ADDR addr = osect->addr ();
CORE_ADDR endaddr = osect->endaddr ();

while (addr < endaddr)
{
Expand Down
2 changes: 1 addition & 1 deletion gdb/machoread.c
Original file line number Diff line number Diff line change
Expand Up @@ -926,7 +926,7 @@ macho_symfile_offsets (struct objfile *objfile,

if (bfd_sect_name == addrs[i].name)
{
obj_section_offset (osect) = addrs[i].addr;
osect->set_offset (addrs[i].addr);
break;
}
}
Expand Down
3 changes: 1 addition & 2 deletions gdb/maint.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,8 +319,7 @@ print_objfile_section_info (bfd *abfd, struct obj_section *asect,

print_section_index (abfd, asect->the_bfd_section, index_digits);
maint_print_section_info (name, flags,
obj_section_addr (asect),
obj_section_endaddr (asect),
asect->addr (), asect->endaddr (),
asect->the_bfd_section->filepos,
addr_size);
}
Expand Down
8 changes: 4 additions & 4 deletions gdb/minsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -687,9 +687,9 @@ frob_address (struct objfile *objfile, CORE_ADDR *pc)

ALL_OBJFILE_OSECTIONS (objfile, iter)
{
if (*pc >= obj_section_addr (iter) && *pc < obj_section_endaddr (iter))
if (*pc >= iter->addr () && *pc < iter->endaddr ())
{
*pc -= obj_section_offset (iter);
*pc -= iter->offset ();
return 1;
}
}
Expand Down Expand Up @@ -1616,12 +1616,12 @@ minimal_symbol_upper_bound (struct bound_minimal_symbol minsym)
obj_section = minsym.obj_section ();
if (iter != past_the_end
&& (MSYMBOL_VALUE_ADDRESS (minsym.objfile, iter)
< obj_section_endaddr (obj_section)))
< obj_section->endaddr ()))
result = MSYMBOL_VALUE_ADDRESS (minsym.objfile, iter);
else
/* We got the start address from the last msymbol in the objfile.
So the end address is the end of the section. */
result = obj_section_endaddr (obj_section);
result = obj_section->endaddr ();

return result;
}
27 changes: 13 additions & 14 deletions gdb/objfiles.c
Original file line number Diff line number Diff line change
Expand Up @@ -729,7 +729,7 @@ objfile_relocate1 (struct objfile *objfile,
int idx = s - objfile->sections;

exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
obj_section_addr (s));
s->addr ());
}

/* Data changed. */
Expand Down Expand Up @@ -899,8 +899,8 @@ have_minimal_symbols (void)
static bool
sort_cmp (const struct obj_section *sect1, const obj_section *sect2)
{
const CORE_ADDR sect1_addr = obj_section_addr (sect1);
const CORE_ADDR sect2_addr = obj_section_addr (sect2);
const CORE_ADDR sect1_addr = sect1->addr ();
const CORE_ADDR sect2_addr = sect2->addr ();

if (sect1_addr < sect2_addr)
return true;
Expand Down Expand Up @@ -982,7 +982,7 @@ sort_cmp (const struct obj_section *sect1, const obj_section *sect2)
static struct obj_section *
preferred_obj_section (struct obj_section *a, struct obj_section *b)
{
gdb_assert (obj_section_addr (a) == obj_section_addr (b));
gdb_assert (a->addr () == b->addr ());
gdb_assert ((a->objfile->separate_debug_objfile == b->objfile)
|| (b->objfile->separate_debug_objfile == a->objfile));
gdb_assert ((a->objfile->separate_debug_objfile_backlink == b->objfile)
Expand Down Expand Up @@ -1030,8 +1030,8 @@ filter_debuginfo_sections (struct obj_section **map, int map_size)
struct obj_section *const sect2 = map[i + 1];
const struct objfile *const objfile1 = sect1->objfile;
const struct objfile *const objfile2 = sect2->objfile;
const CORE_ADDR sect1_addr = obj_section_addr (sect1);
const CORE_ADDR sect2_addr = obj_section_addr (sect2);
const CORE_ADDR sect1_addr = sect1->addr ();
const CORE_ADDR sect2_addr = sect2->addr ();

if (sect1_addr == sect2_addr
&& (objfile1->separate_debug_objfile == objfile2
Expand Down Expand Up @@ -1075,9 +1075,9 @@ filter_overlapping_sections (struct obj_section **map, int map_size)
{
struct obj_section *const sect1 = map[i];
struct obj_section *const sect2 = map[k];
const CORE_ADDR sect1_addr = obj_section_addr (sect1);
const CORE_ADDR sect2_addr = obj_section_addr (sect2);
const CORE_ADDR sect1_endaddr = obj_section_endaddr (sect1);
const CORE_ADDR sect1_addr = sect1->addr ();
const CORE_ADDR sect2_addr = sect2->addr ();
const CORE_ADDR sect1_endaddr = sect1->endaddr ();

gdb_assert (sect1_addr <= sect2_addr);

Expand All @@ -1093,7 +1093,7 @@ filter_overlapping_sections (struct obj_section **map, int map_size)
const struct bfd_section *const bfds1 = sect1->the_bfd_section;
const struct bfd_section *const bfds2 = sect2->the_bfd_section;

const CORE_ADDR sect2_endaddr = obj_section_endaddr (sect2);
const CORE_ADDR sect2_endaddr = sect2->endaddr ();

struct gdbarch *const gdbarch = objf1->arch ();

Expand Down Expand Up @@ -1184,9 +1184,9 @@ bsearch_cmp (const void *key, const void *elt)
const CORE_ADDR pc = *(CORE_ADDR *) key;
const struct obj_section *section = *(const struct obj_section **) elt;

if (pc < obj_section_addr (section))
if (pc < section->addr ())
return -1;
if (pc < obj_section_endaddr (section))
if (pc < section->endaddr ())
return 0;
return 1;
}
Expand Down Expand Up @@ -1289,8 +1289,7 @@ is_addr_in_objfile (CORE_ADDR addr, const struct objfile *objfile)
if (section_is_overlay (osect) && !section_is_mapped (osect))
continue;

if (obj_section_addr (osect) <= addr
&& addr < obj_section_endaddr (osect))
if (osect->addr () <= addr && addr < osect->endaddr ())
return true;
}
return false;
Expand Down
Loading

0 comments on commit 0c1bcd2

Please sign in to comment.