#include "defs.h"
-#if GDB_MULTI_ARCH
#include "arch-utils.h"
+#include "buildsym.h"
#include "gdbcmd.h"
#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
-#else
-/* Just include everything in sight so that the every old definition
- of macro is visible. */
-#include "symtab.h"
-#include "frame.h"
-#include "inferior.h"
-#include "breakpoint.h"
-#include "gdb_wait.h"
-#include "gdbcore.h"
-#include "gdbcmd.h"
-#include "target.h"
-#include "annotate.h"
-#endif
#include "gdb_string.h"
#include "regcache.h"
#include "gdb_assert.h"
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
const struct floatformat *
default_float_format (struct gdbarch *gdbarch)
{
-#if GDB_MULTI_ARCH
int byte_order = gdbarch_byte_order (gdbarch);
-#else
- int byte_order = TARGET_BYTE_ORDER;
-#endif
switch (byte_order)
{
case BFD_ENDIAN_BIG:
const struct floatformat *
default_double_format (struct gdbarch *gdbarch)
{
-#if GDB_MULTI_ARCH
int byte_order = gdbarch_byte_order (gdbarch);
-#else
- int byte_order = TARGET_BYTE_ORDER;
-#endif
switch (byte_order)
{
case BFD_ENDIAN_BIG:
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));
/* 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. */
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);
}
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. */
}
else if (set_endian_string == endian_little)
{
+ struct gdbarch_info info;
target_byte_order_auto = 0;
- if (GDB_MULTI_ARCH)
- {
- struct gdbarch_info info;
- gdbarch_info_init (&info);
- info.byte_order = BFD_ENDIAN_LITTLE;
- if (! gdbarch_update_p (info))
- {
- printf_unfiltered ("Little endian target not supported by GDB\n");
- }
- }
- else
- {
- target_byte_order = BFD_ENDIAN_LITTLE;
- }
+ gdbarch_info_init (&info);
+ info.byte_order = BFD_ENDIAN_LITTLE;
+ if (! gdbarch_update_p (info))
+ printf_unfiltered ("Little endian target not supported by GDB\n");
}
else if (set_endian_string == endian_big)
{
+ struct gdbarch_info info;
target_byte_order_auto = 0;
- if (GDB_MULTI_ARCH)
- {
- struct gdbarch_info info;
- gdbarch_info_init (&info);
- info.byte_order = BFD_ENDIAN_BIG;
- if (! gdbarch_update_p (info))
- {
- printf_unfiltered ("Big endian target not supported by GDB\n");
- }
- }
- else
- {
- target_byte_order = BFD_ENDIAN_BIG;
- }
+ gdbarch_info_init (&info);
+ info.byte_order = BFD_ENDIAN_BIG;
+ if (! gdbarch_update_p (info))
+ printf_unfiltered ("Big endian target not supported by GDB\n");
}
else
internal_error (__FILE__, __LINE__,
show_endian (NULL, from_tty);
}
-/* Set the endianness from a BFD. */
-
-static void
-set_endian_from_file (bfd *abfd)
-{
- int want;
- if (GDB_MULTI_ARCH)
- internal_error (__FILE__, __LINE__,
- "set_endian_from_file: not for multi-arch");
- if (bfd_big_endian (abfd))
- want = BFD_ENDIAN_BIG;
- else
- want = BFD_ENDIAN_LITTLE;
- if (TARGET_BYTE_ORDER_AUTO)
- target_byte_order = want;
- else if (TARGET_BYTE_ORDER != want)
- warning ("%s endian file does not match %s endian target.",
- want == BFD_ENDIAN_BIG ? "big" : "little",
- TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "big" : "little");
-}
-
-
/* Functions to manipulate the architecture of the target */
enum set_arch { set_arch_auto, set_arch_manual };
const char *set_architecture_string;
-/* Old way of changing the current architecture. */
-
-extern const struct bfd_arch_info bfd_default_arch_struct;
-const struct bfd_arch_info *target_architecture = &bfd_default_arch_struct;
-int (*target_architecture_hook) (const struct bfd_arch_info *ap);
-
-static int
-arch_ok (const struct bfd_arch_info *arch)
-{
- if (GDB_MULTI_ARCH)
- internal_error (__FILE__, __LINE__,
- "arch_ok: not multi-arched");
- /* Should be performing the more basic check that the binary is
- compatible with GDB. */
- /* Check with the target that the architecture is valid. */
- return (target_architecture_hook == NULL
- || target_architecture_hook (arch));
-}
-
-static void
-set_arch (const struct bfd_arch_info *arch,
- enum set_arch type)
-{
- if (GDB_MULTI_ARCH)
- internal_error (__FILE__, __LINE__,
- "set_arch: not multi-arched");
- switch (type)
- {
- case set_arch_auto:
- if (!arch_ok (arch))
- warning ("Target may not support %s architecture",
- arch->printable_name);
- target_architecture = arch;
- break;
- case set_arch_manual:
- if (!arch_ok (arch))
- {
- printf_unfiltered ("Target does not support `%s' architecture.\n",
- arch->printable_name);
- }
- else
- {
- target_architecture_auto = 0;
- target_architecture = arch;
- }
- break;
- }
- if (gdbarch_debug)
- gdbarch_dump (current_gdbarch, gdb_stdlog);
-}
-
-/* Set the architecture from arch/machine (deprecated) */
-
-void
-set_architecture_from_arch_mach (enum bfd_architecture arch,
- unsigned long mach)
-{
- const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
- if (GDB_MULTI_ARCH)
- internal_error (__FILE__, __LINE__,
- "set_architecture_from_arch_mach: not multi-arched");
- if (wanted != NULL)
- set_arch (wanted, set_arch_manual);
- else
- internal_error (__FILE__, __LINE__,
- "gdbarch: hardwired architecture/machine not recognized");
-}
-
-/* Set the architecture from a BFD (deprecated) */
-
-static void
-set_architecture_from_file (bfd *abfd)
-{
- const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
- if (GDB_MULTI_ARCH)
- internal_error (__FILE__, __LINE__,
- "set_architecture_from_file: not multi-arched");
- if (target_architecture_auto)
- {
- set_arch (wanted, set_arch_auto);
- }
- else if (wanted != target_architecture)
- {
- warning ("%s architecture file may be incompatible with %s target.",
- wanted->printable_name,
- target_architecture->printable_name);
- }
-}
-
-
/* Called if the user enters ``show architecture'' without an
argument. */
{
target_architecture_auto = 1;
}
- else if (GDB_MULTI_ARCH)
+ else
{
struct gdbarch_info info;
gdbarch_info_init (&info);
printf_unfiltered ("Architecture `%s' not recognized.\n",
set_architecture_string);
}
- else
- {
- const struct bfd_arch_info *arch
- = bfd_scan_arch (set_architecture_string);
- if (arch == NULL)
- internal_error (__FILE__, __LINE__,
- "set_architecture: bfd_scan_arch failed");
- set_arch (arch, set_arch_manual);
- }
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)
{
- if (GDB_MULTI_ARCH)
- {
- struct gdbarch_info info;
- gdbarch_info_init (&info);
- info.abfd = abfd;
- if (! gdbarch_update_p (info))
- error ("Architecture of file not recognized.\n");
- }
- else
- {
- set_architecture_from_file (abfd);
- set_endian_from_file (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
info.byte_order = BFD_ENDIAN_BIG;
}
- if (GDB_MULTI_ARCH)
- {
- if (! gdbarch_update_p (info))
- {
- internal_error (__FILE__, __LINE__,
- "initialize_current_architecture: Selection of initial architecture failed");
- }
- }
- else
- {
- /* If the multi-arch logic comes up with a byte-order (from BFD)
- use it for the non-multi-arch case. */
- if (info.byte_order != BFD_ENDIAN_UNKNOWN)
- target_byte_order = info.byte_order;
- initialize_non_multiarch ();
- }
+ if (! gdbarch_update_p (info))
+ internal_error (__FILE__, __LINE__,
+ "initialize_current_architecture: Selection of initial architecture failed");
/* Create the ``set architecture'' command appending ``auto'' to the
list of architectures. */
/* 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. */