* arch-utils.c (deprecated_select_gdbarch_hack): New function.
(gdbarch_from_bfd): New function. (set_gdbarch_from_file): Re-implement using gdbarch_from_bfd and deprecated_select_gdbarch_hack. * arch-utils.h (gdbarch_from_bfd): New prototype.
This commit is contained in:
parent
0bcad58476
commit
2b0266504e
3 changed files with 68 additions and 4 deletions
|
@ -496,17 +496,68 @@ set_architecture (char *ignore_args, int from_tty, struct cmd_list_element *c)
|
|||
show_architecture (NULL, from_tty);
|
||||
}
|
||||
|
||||
/* FIXME: kettenis/20031124: Of the functions that follow, only
|
||||
gdbarch_from_bfd is supposed to survive. The others will
|
||||
dissappear since in the future GDB will (hopefully) be truly
|
||||
multi-arch. However, for now we're still stuck with the concept of
|
||||
a single active architecture. */
|
||||
|
||||
/* Make GDBARCH the currently selected architecture. */
|
||||
|
||||
static void
|
||||
deprecated_select_gdbarch_hack (struct gdbarch *gdbarch)
|
||||
{
|
||||
struct gdbarch_info info;
|
||||
|
||||
/* FIXME: kettenis/20031024: The only way to select a specific
|
||||
architecture is to clone its `struct gdbarch_info', and update
|
||||
according to that copy. This is gross, but significant work will
|
||||
need to be done before we can take a more sane approach. */
|
||||
gdbarch_info_init (&info);
|
||||
info.bfd_arch_info = gdbarch_bfd_arch_info (gdbarch);
|
||||
info.byte_order = gdbarch_byte_order (gdbarch);
|
||||
info.osabi = gdbarch_osabi (gdbarch);
|
||||
gdbarch_update_p (info);
|
||||
gdb_assert (gdbarch == current_gdbarch);
|
||||
}
|
||||
|
||||
/* Return the architecture for ABFD. If no suitable architecture
|
||||
could be find, return NULL. */
|
||||
|
||||
struct gdbarch *
|
||||
gdbarch_from_bfd (bfd *abfd)
|
||||
{
|
||||
struct gdbarch *old_gdbarch = current_gdbarch;
|
||||
struct gdbarch *new_gdbarch;
|
||||
struct gdbarch_info info;
|
||||
|
||||
/* FIXME: kettenis/20031024: The only way to find the architecture
|
||||
for a certain BFD is by doing an architecture update. This
|
||||
activates the architecture, so we need to reactivate the old
|
||||
architecture. This is gross, but significant work will need to
|
||||
be done before we can take a more sane approach. */
|
||||
gdbarch_info_init (&info);
|
||||
info.abfd = abfd;
|
||||
if (! gdbarch_update_p (info))
|
||||
return NULL;
|
||||
|
||||
new_gdbarch = current_gdbarch;
|
||||
deprecated_select_gdbarch_hack (old_gdbarch);
|
||||
return new_gdbarch;
|
||||
}
|
||||
|
||||
/* Set the dynamic target-system-dependent parameters (architecture,
|
||||
byte-order) using information found in the BFD */
|
||||
|
||||
void
|
||||
set_gdbarch_from_file (bfd *abfd)
|
||||
{
|
||||
struct gdbarch_info info;
|
||||
gdbarch_info_init (&info);
|
||||
info.abfd = abfd;
|
||||
if (! gdbarch_update_p (info))
|
||||
struct gdbarch *gdbarch;
|
||||
|
||||
gdbarch = gdbarch_from_bfd (abfd);
|
||||
if (gdbarch == NULL)
|
||||
error ("Architecture of file not recognized.\n");
|
||||
deprecated_select_gdbarch_hack (gdbarch);
|
||||
}
|
||||
|
||||
/* Initialize the current architecture. Update the ``set
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue