Update documentation
[deliverable/binutils-gdb.git] / gdb / arch-utils.c
index 968508df04d21a0056736a47f740745bce0212d0..38ad4862dd1a3cbeec7103d81212316bf65afcaf 100644 (file)
@@ -23,6 +23,7 @@
 #include "defs.h"
 
 #include "arch-utils.h"
+#include "buildsym.h"
 #include "gdbcmd.h"
 #include "inferior.h"          /* enum CALL_DUMMY_LOCATION et.al. */
 #include "gdb_string.h"
@@ -140,14 +141,6 @@ generic_prologue_frameless_p (CORE_ADDR ip)
   return ip == SKIP_PROLOGUE (ip);
 }
 
-/* New/multi-arched targets should use the correct gdbarch field
-   instead of using this global pointer. */
-int
-legacy_print_insn (bfd_vma vma, disassemble_info *info)
-{
-  return (*deprecated_tm_print_insn) (vma, info);
-}
-
 /* Helper functions for INNER_THAN */
 
 int
@@ -228,21 +221,21 @@ core_addr_identity (CORE_ADDR addr)
   return addr;
 }
 
-int
-no_op_reg_to_regnum (int reg)
+CORE_ADDR
+convert_from_func_ptr_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr,
+                                    struct target_ops *targ)
 {
-  return reg;
+  return addr;
 }
 
-CORE_ADDR
-init_frame_pc_noop (int fromleaf, struct frame_info *prev)
+int
+no_op_reg_to_regnum (int reg)
 {
-  /* Do nothing, implies return the same PC value.  */
-  return get_frame_pc (prev);
+  return reg;
 }
 
 CORE_ADDR
-init_frame_pc_default (int fromleaf, struct frame_info *prev)
+deprecated_init_frame_pc_default (int fromleaf, struct frame_info *prev)
 {
   if (fromleaf && DEPRECATED_SAVED_PC_AFTER_CALL_P ())
     return DEPRECATED_SAVED_PC_AFTER_CALL (get_next_frame (prev));
@@ -308,7 +301,7 @@ generic_register_size (int regnum)
     /* FIXME: cagney/2003-03-01: Once all architectures implement
        gdbarch_register_type(), this entire function can go away.  It
        is made obsolete by register_size().  */
-    return TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (regnum)); /* OK */
+    return TYPE_LENGTH (DEPRECATED_REGISTER_VIRTUAL_TYPE (regnum)); /* OK */
 }
 
 /* Assume all registers are adjacent.  */
@@ -352,7 +345,7 @@ legacy_register_to_value (struct frame_info *frame, int regnum,
                          struct type *type, void *to)
 {
   char from[MAX_REGISTER_SIZE];
-  frame_read_register (frame, regnum, from);
+  get_frame_register (frame, regnum, from);
   DEPRECATED_REGISTER_CONVERT_TO_VIRTUAL (regnum, type, from, to);
 }
 
@@ -367,6 +360,23 @@ legacy_value_to_register (struct frame_info *frame, int regnum,
   put_frame_register (frame, regnum, to);
 }
 
+int
+default_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
+{
+  if (DEPRECATED_REG_STRUCT_HAS_ADDR_P ()
+      && DEPRECATED_REG_STRUCT_HAS_ADDR (processing_gcc_compilation, type))
+    {
+      CHECK_TYPEDEF (type);
+
+      return (TYPE_CODE (type) == TYPE_CODE_STRUCT
+             || TYPE_CODE (type) == TYPE_CODE_UNION
+             || TYPE_CODE (type) == TYPE_CODE_SET
+             || TYPE_CODE (type) == TYPE_CODE_BITSTRING);
+    }
+
+  return 0;
+}
+
 \f
 /* Functions to manipulate the endianness of the target.  */
 
@@ -486,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
@@ -616,7 +677,7 @@ initialize_current_architecture (void)
 
 /* Initialize a gdbarch info to values that will be automatically
    overridden.  Note: Originally, this ``struct info'' was initialized
-   using memset(0).  Unfortunatly, that ran into problems, namely
+   using memset(0).  Unfortunately, that ran into problems, namely
    BFD_ENDIAN_BIG is zero.  An explicit initialization function that
    can explicitly set each field to a well defined value is used.  */
 
This page took 0.026427 seconds and 4 git commands to generate.