* 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:
Mark Kettenis 2003-10-27 20:47:27 +00:00
parent 0bcad58476
commit 2b0266504e
3 changed files with 68 additions and 4 deletions

View file

@ -1,3 +1,11 @@
2003-10-27 Mark Kettenis <kettenis@gnu.org>
* 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.
2003-10-27 Andrew Cagney <cagney@redhat.com>
* osabi.c (gdbarch_init_osabi): Use info.bfd_arch_info instead of

View file

@ -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

View file

@ -151,4 +151,9 @@ extern int legacy_register_sim_regno (int regnum);
default values are not zero. */
extern void gdbarch_info_init (struct gdbarch_info *info);
/* Return the architecture for ABFD. If no suitable architecture
could be find, return NULL. */
extern struct gdbarch *gdbarch_from_bfd (bfd *abfd);
#endif