/* GDB routines for manipulating objfiles.
- Copyright (C) 1992-2019 Free Software Foundation, Inc.
+ Copyright (C) 1992-2021 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules.
#include "solist.h"
#include "gdb_bfd.h"
#include "btrace.h"
-#include "common/pathstuff.h"
+#include "gdbsupport/pathstuff.h"
+#include <algorithm>
#include <vector>
/* Keep a registry of per-objfile data-pointers required by other GDB
/* Create the per-BFD storage object for OBJFILE. If ABFD is not
NULL, and it already has a per-BFD storage object, use that.
- Otherwise, allocate a new per-BFD storage object. Note that it is
- not safe to call this multiple times for a given OBJFILE -- it can
- only be called when allocating or re-initializing OBJFILE. */
+ Otherwise, allocate a new per-BFD storage object. */
static struct objfile_per_bfd_storage *
-get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
+get_objfile_bfd_data (bfd *abfd)
{
struct objfile_per_bfd_storage *storage = NULL;
if (storage == NULL)
{
- storage = new objfile_per_bfd_storage;
+ storage = new objfile_per_bfd_storage (abfd);
/* If the object requires gdb to do relocations, we simply fall
back to not sharing data across users. These cases are rare
enough that this seems reasonable. */
void
set_objfile_per_bfd (struct objfile *objfile)
{
- objfile->per_bfd = get_objfile_bfd_data (objfile, objfile->obfd);
+ objfile->per_bfd = get_objfile_bfd_data (objfile->obfd);
}
/* Set the objfile's per-BFD notion of the "main" name and
if (objfile->per_bfd->name_of_main == NULL
|| strcmp (objfile->per_bfd->name_of_main, name) != 0)
objfile->per_bfd->name_of_main
- = (const char *) obstack_copy0 (&objfile->per_bfd->storage_obstack, name,
- strlen (name));
+ = obstack_strdup (&objfile->per_bfd->storage_obstack, name);
objfile->per_bfd->language_of_main = lang;
}
\f
-/* Called via bfd_map_over_sections to build up the section table that
- the objfile references. The objfile contains pointers to the start
- of the table (objfile->sections) and to the first location after
- the end of the table (objfile->sections_end). */
+/* Build up the section table that the objfile references. The
+ objfile contains pointers to the start of the table
+ (objfile->sections) and to the first location after the end of the
+ table (objfile->sections_end). */
static void
-add_to_objfile_sections_full (struct bfd *abfd, struct bfd_section *asect,
+add_to_objfile_sections (struct bfd *abfd, struct bfd_section *asect,
struct objfile *objfile, int force)
{
struct obj_section *section;
{
flagword aflag;
- aflag = bfd_get_section_flags (abfd, asect);
+ aflag = bfd_section_flags (asect);
if (!(aflag & SEC_ALLOC))
return;
}
section->ovly_mapped = 0;
}
-static void
-add_to_objfile_sections (struct bfd *abfd, struct bfd_section *asect,
- void *objfilep)
-{
- add_to_objfile_sections_full (abfd, asect, (struct objfile *) objfilep, 0);
-}
-
/* Builds a section table for OBJFILE.
Note that the OFFSET and OVLY_MAPPED in each table entry are
count,
struct obj_section);
objfile->sections_end = (objfile->sections + count);
- bfd_map_over_sections (objfile->obfd,
- add_to_objfile_sections, (void *) objfile);
+ for (asection *sect : gdb_bfd_sections (objfile->obfd))
+ add_to_objfile_sections (objfile->obfd, sect, objfile, 0);
/* See gdb_bfd_section_index. */
- add_to_objfile_sections_full (objfile->obfd, bfd_com_section_ptr, objfile, 1);
- add_to_objfile_sections_full (objfile->obfd, bfd_und_section_ptr, objfile, 1);
- add_to_objfile_sections_full (objfile->obfd, bfd_abs_section_ptr, objfile, 1);
- add_to_objfile_sections_full (objfile->obfd, bfd_ind_section_ptr, objfile, 1);
+ add_to_objfile_sections (objfile->obfd, bfd_com_section_ptr, objfile, 1);
+ add_to_objfile_sections (objfile->obfd, bfd_und_section_ptr, objfile, 1);
+ add_to_objfile_sections (objfile->obfd, bfd_abs_section_ptr, objfile, 1);
+ add_to_objfile_sections (objfile->obfd, bfd_ind_section_ptr, objfile, 1);
}
/* Given a pointer to an initialized bfd (ABFD) and some flag bits,
objfile::objfile (bfd *abfd, const char *name, objfile_flags flags_)
: flags (flags_),
pspace (current_program_space),
- partial_symtabs (new psymtab_storage ()),
obfd (abfd)
{
const char *expanded_name;
name_holder = gdb_abspath (name);
expanded_name = name_holder.get ();
}
- original_name
- = (char *) obstack_copy0 (&objfile_obstack,
- expanded_name,
- strlen (expanded_name));
+ original_name = obstack_strdup (&objfile_obstack, expanded_name);
/* Update the per-objfile information that comes from the bfd, ensuring
that any data that is reference is saved in the per-objfile data
build_objfile_section_table (this);
}
- per_bfd = get_objfile_bfd_data (this, abfd);
-
- /* Add this file onto the tail of the linked list of other such files. */
-
- if (object_files == NULL)
- object_files = this;
- else
- {
- struct objfile *last_one;
-
- for (last_one = object_files;
- last_one->next;
- last_one = last_one->next);
- last_one->next = this;
- }
-
- /* Rebuild section map next time we need it. */
- get_objfile_pspace_data (pspace)->new_objfiles_available = 1;
-}
-
-/* Retrieve the gdbarch associated with OBJFILE. */
-
-struct gdbarch *
-get_objfile_arch (const struct objfile *objfile)
-{
- return objfile->per_bfd->gdbarch;
+ per_bfd = get_objfile_bfd_data (abfd);
}
/* If there is a valid and known entry point, function fills *ENTRY_P with it
int
entry_point_address_query (CORE_ADDR *entry_p)
{
- if (symfile_objfile == NULL || !symfile_objfile->per_bfd->ei.entry_point_p)
+ objfile *objf = current_program_space->symfile_object_file;
+ if (objf == NULL || !objf->per_bfd->ei.entry_point_p)
return 0;
- *entry_p = (symfile_objfile->per_bfd->ei.entry_point
- + ANOFFSET (symfile_objfile->section_offsets,
- symfile_objfile->per_bfd->ei.the_bfd_section_index));
+ int idx = objf->per_bfd->ei.the_bfd_section_index;
+ *entry_p = objf->per_bfd->ei.entry_point + objf->section_offsets[idx];
return 1;
}
return *this;
}
-/* Put one object file before a specified on in the global list.
- This can be used to make sure an object file is destroyed before
- another when using objfiles_safe to free all objfiles. */
-void
-put_objfile_before (struct objfile *objfile, struct objfile *before_this)
-{
- struct objfile **objp;
-
- unlink_objfile (objfile);
-
- for (objp = &object_files; *objp != NULL; objp = &((*objp)->next))
- {
- if (*objp == before_this)
- {
- objfile->next = *objp;
- *objp = objfile;
- return;
- }
- }
-
- internal_error (__FILE__, __LINE__,
- _("put_objfile_before: before objfile not in list"));
-}
-
-/* Unlink OBJFILE from the list of known objfiles, if it is found in the
- list.
-
- It is not a bug, or error, to call this function if OBJFILE is not known
- to be in the current list. This is done in the case of mapped objfiles,
- for example, just to ensure that the mapped objfile doesn't appear twice
- in the list. Since the list is threaded, linking in a mapped objfile
- twice would create a circular list.
-
- If OBJFILE turns out to be in the list, we zap it's NEXT pointer after
- unlinking it, just to ensure that we have completely severed any linkages
- between the OBJFILE and the list. */
-
-void
-unlink_objfile (struct objfile *objfile)
-{
- struct objfile **objpp;
-
- for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
- {
- if (*objpp == objfile)
- {
- *objpp = (*objpp)->next;
- objfile->next = NULL;
- return;
- }
- }
-
- internal_error (__FILE__, __LINE__,
- _("unlink_objfile: objfile already unlinked"));
-}
-
/* Add OBJFILE as a separate debug objfile of PARENT. */
-void
+static void
add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
{
gdb_assert (objfile && parent);
objfile->separate_debug_objfile_backlink = parent;
objfile->separate_debug_objfile_link = parent->separate_debug_objfile;
parent->separate_debug_objfile = objfile;
+}
- /* Put the separate debug object before the normal one, this is so that
- usage of objfiles_safe will stay safe. */
- put_objfile_before (objfile, parent);
+/* See objfiles.h. */
+
+objfile *
+objfile::make (bfd *bfd_, const char *name_, objfile_flags flags_,
+ objfile *parent)
+{
+ objfile *result = new objfile (bfd_, name_, flags_);
+ if (parent != nullptr)
+ add_separate_debug_objfile (result, parent);
+
+ /* Using std::make_shared might be a bit nicer here, but that would
+ require making the constructor public. */
+ current_program_space->add_objfile (std::shared_ptr<objfile> (result),
+ parent);
+
+ /* Rebuild section map next time we need it. */
+ get_objfile_pspace_data (current_program_space)->new_objfiles_available = 1;
+
+ return result;
+}
+
+/* See objfiles.h. */
+
+void
+objfile::unlink ()
+{
+ current_program_space->remove_objfile (this);
}
/* Free all separate debug objfile of OBJFILE, but don't free OBJFILE
for (child = objfile->separate_debug_objfile; child;)
{
struct objfile *next_child = child->separate_debug_objfile_link;
- delete child;
+ child->unlink ();
child = next_child;
}
}
child = separate_debug_objfile_backlink->separate_debug_objfile;
if (child == this)
- {
- /* THIS is the first child. */
- separate_debug_objfile_backlink->separate_debug_objfile =
- separate_debug_objfile_link;
- }
+ {
+ /* THIS is the first child. */
+ separate_debug_objfile_backlink->separate_debug_objfile =
+ separate_debug_objfile_link;
+ }
else
- {
- /* Find THIS in the list. */
- while (1)
- {
- if (child->separate_debug_objfile_link == this)
- {
- child->separate_debug_objfile_link =
- separate_debug_objfile_link;
- break;
- }
- child = child->separate_debug_objfile_link;
- gdb_assert (child);
- }
- }
+ {
+ /* Find THIS in the list. */
+ while (1)
+ {
+ if (child->separate_debug_objfile_link == this)
+ {
+ child->separate_debug_objfile_link =
+ separate_debug_objfile_link;
+ break;
+ }
+ child = child->separate_debug_objfile_link;
+ gdb_assert (child);
+ }
+ }
}
/* Remove any references to this objfile in the global value
else
delete per_bfd;
- /* Remove it from the chain of all objfiles. */
-
- unlink_objfile (this);
-
- if (this == symfile_objfile)
- symfile_objfile = NULL;
-
/* Before the symbol table code was redone to make it easier to
selectively load and remove information particular to a specific
linkage unit, gdb used to do these things whenever the monolithic
get_objfile_pspace_data (pspace)->section_map_dirty = 1;
}
-/* Free all the object files at once and clean up their users. */
-
-void
-free_all_objfiles (void)
-{
- struct so_list *so;
-
- /* Any objfile reference would become stale. */
- for (so = master_so_list (); so; so = so->next)
- gdb_assert (so->objfile == NULL);
-
- for (objfile *objfile : current_program_space->objfiles_safe ())
- delete objfile;
- clear_symtab_users (0);
-}
\f
/* A helper function for objfile_relocate1 that relocates a single
symbol. */
static void
relocate_one_symbol (struct symbol *sym, struct objfile *objfile,
- struct section_offsets *delta)
+ const section_offsets &delta)
{
fixup_symbol_section (sym, objfile);
they can't possibly pass the tests below. */
if ((SYMBOL_CLASS (sym) == LOC_LABEL
|| SYMBOL_CLASS (sym) == LOC_STATIC)
- && SYMBOL_SECTION (sym) >= 0)
+ && sym->section_index () >= 0)
{
- SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (delta, SYMBOL_SECTION (sym));
+ SET_SYMBOL_VALUE_ADDRESS (sym,
+ SYMBOL_VALUE_ADDRESS (sym)
+ + delta[sym->section_index ()]);
}
}
static int
objfile_relocate1 (struct objfile *objfile,
- const struct section_offsets *new_offsets)
+ const section_offsets &new_offsets)
{
- struct section_offsets *delta =
- ((struct section_offsets *)
- alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
+ section_offsets delta (objfile->section_offsets.size ());
int something_changed = 0;
- for (int i = 0; i < objfile->num_sections; ++i)
+ for (int i = 0; i < objfile->section_offsets.size (); ++i)
{
- delta->offsets[i] =
- ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i);
- if (ANOFFSET (delta, i) != 0)
+ delta[i] = new_offsets[i] - objfile->section_offsets[i];
+ if (delta[i] != 0)
something_changed = 1;
}
if (!something_changed)
if (l)
{
for (int i = 0; i < l->nitems; ++i)
- l->item[i].pc += ANOFFSET (delta,
- COMPUNIT_BLOCK_LINE_SECTION
- (cust));
+ l->item[i].pc += delta[COMPUNIT_BLOCK_LINE_SECTION (cust)];
}
}
}
int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust);
if (BLOCKVECTOR_MAP (bv))
- addrmap_relocate (BLOCKVECTOR_MAP (bv),
- ANOFFSET (delta, block_line_section));
+ addrmap_relocate (BLOCKVECTOR_MAP (bv), delta[block_line_section]);
for (int i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
{
struct mdict_iterator miter;
b = BLOCKVECTOR_BLOCK (bv, i);
- BLOCK_START (b) += ANOFFSET (delta, block_line_section);
- BLOCK_END (b) += ANOFFSET (delta, block_line_section);
+ BLOCK_START (b) += delta[block_line_section];
+ BLOCK_END (b) += delta[block_line_section];
if (BLOCK_RANGES (b) != nullptr)
for (int j = 0; j < BLOCK_NRANGES (b); j++)
{
- BLOCK_RANGE_START (b, j)
- += ANOFFSET (delta, block_line_section);
- BLOCK_RANGE_END (b, j) += ANOFFSET (delta,
- block_line_section);
+ BLOCK_RANGE_START (b, j) += delta[block_line_section];
+ BLOCK_RANGE_END (b, j) += delta[block_line_section];
}
/* We only want to iterate over the local symbols, not any
}
}
- /* This stores relocated addresses and so must be cleared. This
- will cause it to be recreated on demand. */
- objfile->psymbol_map.clear ();
+ /* Notify the quick symbol object. */
+ for (const auto &iter : objfile->qf)
+ iter->relocated ();
/* Relocate isolated symbols. */
{
{
int i;
- for (i = 0; i < objfile->num_sections; ++i)
- (objfile->section_offsets)->offsets[i] = ANOFFSET (new_offsets, i);
+ for (i = 0; i < objfile->section_offsets.size (); ++i)
+ objfile->section_offsets[i] = new_offsets[i];
}
/* Rebuild section map next time we need it. */
int idx = s - objfile->sections;
exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
- obj_section_addr (s));
+ s->addr ());
}
/* Data changed. */
void
objfile_relocate (struct objfile *objfile,
- const struct section_offsets *new_offsets)
+ const section_offsets &new_offsets)
{
int changed = 0;
addr_info_make_relative (&objfile_addrs, debug_objfile->obfd);
- gdb_assert (debug_objfile->num_sections
+ gdb_assert (debug_objfile->section_offsets.size ()
== gdb_bfd_count_sections (debug_objfile->obfd));
- std::vector<struct section_offsets>
- new_debug_offsets (SIZEOF_N_SECTION_OFFSETS (debug_objfile->num_sections));
- relative_addr_info_to_section_offsets (new_debug_offsets.data (),
- debug_objfile->num_sections,
- objfile_addrs);
+ section_offsets new_debug_offsets
+ (debug_objfile->section_offsets.size ());
+ relative_addr_info_to_section_offsets (new_debug_offsets, objfile_addrs);
- changed |= objfile_relocate1 (debug_objfile, new_debug_offsets.data ());
+ changed |= objfile_relocate1 (debug_objfile, new_debug_offsets);
}
/* Relocate breakpoints as necessary, after things are relocated. */
static int
objfile_rebase1 (struct objfile *objfile, CORE_ADDR slide)
{
- struct section_offsets *new_offsets =
- ((struct section_offsets *)
- alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
- int i;
-
- for (i = 0; i < objfile->num_sections; ++i)
- new_offsets->offsets[i] = slide;
-
+ section_offsets new_offsets (objfile->section_offsets.size (), slide);
return objfile_relocate1 (objfile, new_offsets);
}
breakpoint_re_set ();
}
\f
-/* Return non-zero if OBJFILE has partial symbols. */
-
-int
-objfile_has_partial_symbols (struct objfile *objfile)
-{
- if (!objfile->sf)
- return 0;
-
- /* If we have not read psymbols, but we have a function capable of reading
- them, then that is an indication that they are in fact available. Without
- this function the symbols may have been already read in but they also may
- not be present in this objfile. */
- if ((objfile->flags & OBJF_PSYMTABS_READ) == 0
- && objfile->sf->sym_read_psymbols != NULL)
- return 1;
-
- return objfile->sf->qf->has_symbols (objfile);
-}
-
/* Return non-zero if OBJFILE has full symbols. */
int
objfile_has_symbols (struct objfile *objfile)
{
for (::objfile *o : objfile->separate_debug_objfiles ())
- if (objfile_has_partial_symbols (o) || objfile_has_full_symbols (o))
+ if (o->has_partial_symbols () || objfile_has_full_symbols (o))
return 1;
return 0;
}
{
for (objfile *ofp : current_program_space->objfiles ())
{
- if (objfile_has_partial_symbols (ofp))
+ if (ofp->has_partial_symbols ())
return 1;
}
return 0;
be soon. */
if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
- delete objf;
+ objf->unlink ();
}
}
/* Qsort comparison function. */
-static int
-qsort_cmp (const void *a, const void *b)
+static bool
+sort_cmp (const struct obj_section *sect1, const obj_section *sect2)
{
- const struct obj_section *sect1 = *(const struct obj_section **) a;
- const struct obj_section *sect2 = *(const struct obj_section **) b;
- 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 -1;
+ return true;
else if (sect1_addr > sect2_addr)
- return 1;
+ return false;
else
{
/* Sections are at the same address. This could happen if
/* Case A. The ordering doesn't matter: separate debuginfo files
will be filtered out later. */
- return 0;
+ return false;
}
/* Case B. Maintain stable sort order, so bugs in GDB are easier to
triage. This section could be slow (since we iterate over all
- objfiles in each call to qsort_cmp), but this shouldn't happen
+ objfiles in each call to sort_cmp), but this shouldn't happen
very often (GDB is already in a confused state; one hopes this
doesn't happen at all). If you discover that significant time is
spent in the loops below, do 'set complaints 100' and examine the
resulting complaints. */
-
if (objfile1 == objfile2)
{
- /* Both sections came from the same objfile. We are really confused.
- Sort on sequence order of sections within the objfile. */
+ /* Both sections came from the same objfile. We are really
+ confused. Sort on sequence order of sections within the
+ objfile. The order of checks is important here, if we find a
+ match on SECT2 first then either SECT2 is before SECT1, or,
+ SECT2 == SECT1, in both cases we should return false. The
+ second case shouldn't occur during normal use, but std::sort
+ does check that '!(a < a)' when compiled in debug mode. */
const struct obj_section *osect;
ALL_OBJFILE_OSECTIONS (objfile1, osect)
- if (osect == sect1)
- return -1;
- else if (osect == sect2)
- return 1;
+ if (osect == sect2)
+ return false;
+ else if (osect == sect1)
+ return true;
/* We should have found one of the sections before getting here. */
gdb_assert_not_reached ("section not found");
for (objfile *objfile : current_program_space->objfiles ())
if (objfile == objfile1)
- return -1;
+ return true;
else if (objfile == objfile2)
- return 1;
+ return false;
/* We should have found one of the objfiles before getting here. */
gdb_assert_not_reached ("objfile not found");
/* Unreachable. */
gdb_assert_not_reached ("unexpected code path");
- return 0;
+ return false;
}
/* Select "better" obj_section to keep. We prefer the one that came from
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)
insert_section_p (const struct bfd *abfd,
const struct bfd_section *section)
{
- const bfd_vma lma = bfd_section_lma (abfd, section);
+ const bfd_vma lma = bfd_section_lma (section);
- if (overlay_debugging && lma != 0 && lma != bfd_section_vma (abfd, section)
+ if (overlay_debugging && lma != 0 && lma != bfd_section_vma (section)
&& (bfd_get_file_flags (abfd) & BFD_IN_MEMORY) == 0)
/* This is an overlay section. IN_MEMORY check is needed to avoid
discarding sections from the "system supplied DSO" (aka vdso)
on some Linux systems (e.g. Fedora 11). */
return 0;
- if ((bfd_get_section_flags (abfd, section) & SEC_THREAD_LOCAL) != 0)
+ if ((bfd_section_flags (section) & SEC_THREAD_LOCAL) != 0)
/* This is a TLS section. */
return 0;
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
{
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);
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 = get_objfile_arch (objf1);
+ struct gdbarch *const gdbarch = objf1->arch ();
complaint (_("unexpected overlap between:\n"
" (A) section `%s' from `%s' [%s, %s)\n"
" (B) section `%s' from `%s' [%s, %s).\n"
"Will ignore section B"),
- bfd_section_name (abfd1, bfds1), objfile_name (objf1),
+ bfd_section_name (bfds1), objfile_name (objf1),
paddress (gdbarch, sect1_addr),
paddress (gdbarch, sect1_endaddr),
- bfd_section_name (abfd2, bfds2), objfile_name (objf2),
+ bfd_section_name (bfds2), objfile_name (objf2),
paddress (gdbarch, sect2_addr),
paddress (gdbarch, sect2_endaddr));
}
if (insert_section_p (objfile->obfd, s->the_bfd_section))
map[i++] = s;
- qsort (map, alloc_size, sizeof (*map), qsort_cmp);
+ std::sort (map, map + alloc_size, sort_cmp);
map_size = filter_debuginfo_sections(map, alloc_size);
map_size = filter_overlapping_sections(map, map_size);
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;
}
&pspace_info->num_sections);
/* Don't need updates to section map until objfiles are added,
- removed or relocated. */
+ removed or relocated. */
pspace_info->new_objfiles_available = 0;
pspace_info->section_map_dirty = 0;
}
(&get_objfile_pspace_data (pspace)->inhibit_updates, 1);
}
-/* Return 1 if ADDR maps into one of the sections of OBJFILE and 0
- otherwise. */
+/* See objfiles.h. */
-int
+bool
is_addr_in_objfile (CORE_ADDR addr, const struct objfile *objfile)
{
struct obj_section *osect;
if (objfile == NULL)
- return 0;
+ return false;
ALL_OBJFILE_OSECTIONS (objfile, osect)
{
if (section_is_overlay (osect) && !section_is_mapped (osect))
continue;
- if (obj_section_addr (osect) <= addr
- && addr < obj_section_endaddr (osect))
- return 1;
+ if (osect->addr () <= addr && addr < osect->endaddr ())
+ return true;
}
- return 0;
+ return false;
}
-int
+/* See objfiles.h. */
+
+bool
shared_objfile_contains_address_p (struct program_space *pspace,
CORE_ADDR address)
{
{
if ((objfile->flags & OBJF_SHARED) != 0
&& is_addr_in_objfile (address, objfile))
- return 1;
+ return true;
}
- return 0;
+ return false;
}
/* The default implementation for the "iterate_over_objfiles_in_search_order"
searching the objfiles in the order they are stored internally,
ignoring CURRENT_OBJFILE.
- On most platorms, it should be close enough to doing the best
+ On most platforms, it should be close enough to doing the best
we can without some knowledge specific to the architecture. */
void