* arch-utils.c (deprecated_select_gdbarch_hack): New function.
authorMark Kettenis <kettenis@gnu.org>
Mon, 27 Oct 2003 20:47:27 +0000 (20:47 +0000)
committerMark Kettenis <kettenis@gnu.org>
Mon, 27 Oct 2003 20:47:27 +0000 (20:47 +0000)
(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.

gdb/ChangeLog
gdb/arch-utils.c
gdb/arch-utils.h

index 3b1460ece522b34692cec81f3ba08704f3649e5d..b45624e021d24cdc00b954a3738bdf295ad43d56 100644 (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
index ca0f514a5497c12c3c20d47fdcfe8359252794af..38ad4862dd1a3cbeec7103d81212316bf65afcaf 100644 (file)
@@ -496,17 +496,68 @@ set_architecture (char *ignore_args, int from_tty, struct cmd_list_element *c)
   show_architecture (NULL, from_tty);
 }
 
-/* Set the dynamic target-system-dependent parameters (architecture,
-   byte-order) using information found in the BFD */
+/* 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.  */
 
-void
-set_gdbarch_from_file (bfd *abfd)
+/* 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 *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
index 9d6718040b0fa4d76b26c886486ce0a332812093..27df54dd1f749b937add78d889d5b4795f4919c9 100644 (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