The attatched moves the remaining guff from gdbarch.{h,c,sh} to
arch-utils.{h,c}. The ``set architecutre'' and ``set endian'' commands (part of the move) were implemented to use add_set_enum_cmd() so that ``set architecture <tab>'' works.
This commit is contained in:
parent
17c579bd62
commit
b4a2023990
12 changed files with 584 additions and 859 deletions
|
@ -1,3 +1,29 @@
|
||||||
|
Wed Jun 7 11:34:54 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* arch-utils.c (target_byte_order, target_byte_order_auto,
|
||||||
|
show_endian, set_endian, set_endian_big, set_endian_little,
|
||||||
|
set_endian_auto, set_endian_from_file, enum set_arch,
|
||||||
|
target_architecture_auto, set_architecture_string,
|
||||||
|
target_architecture_hook, target_architecture, arch_ok, set_arch,
|
||||||
|
set_architecture_from_arch_mach, set_architecture_from_file,
|
||||||
|
show_architecture, set_architecture, info_architecture,
|
||||||
|
set_gdbarch_from_file, initialize_current_architecture): Copy from
|
||||||
|
gdbarch.c. Rewrite ``set architecture'' and ``set endian''
|
||||||
|
commands to use enums.
|
||||||
|
(_initialize_gdbarch_utils): Fix name.
|
||||||
|
* arch-utils.h (set_architecture_from_arch_mach,
|
||||||
|
target_architecture_hook): Copy from gdbarch.h.
|
||||||
|
* gdbarch.sh: Update.
|
||||||
|
* gdbarch.h, gdbarch.c: Re-generate.
|
||||||
|
|
||||||
|
* TODO: Update.
|
||||||
|
|
||||||
|
* v850-tdep.c, sh3-rom.c, sh-tdep.c, i386-tdep.c: Include
|
||||||
|
"arch-utils.h".
|
||||||
|
* Makefile.in (v850-tdep.o): Specify dependencies.
|
||||||
|
(i386-tdep.o, sh3-rom.o, sh-tdep.o): Add arch-utils.h to
|
||||||
|
dependency list.
|
||||||
|
|
||||||
2000-06-06 Michael Snyder <msnyder@seadog.cygnus.com>
|
2000-06-06 Michael Snyder <msnyder@seadog.cygnus.com>
|
||||||
|
|
||||||
* configure.in: Enable autoconf to find curses.h on Solaris 2.8.
|
* configure.in: Enable autoconf to find curses.h on Solaris 2.8.
|
||||||
|
|
|
@ -1363,6 +1363,10 @@ v850ice.o: v850ice.c $(defs_h) $(symtab_h) $(inferior_h) $(command_h) \
|
||||||
$(TCL_CFLAGS) $(TK_CFLAGS) $(X11_CFLAGS) $(GDBTK_CFLAGS)\
|
$(TCL_CFLAGS) $(TK_CFLAGS) $(X11_CFLAGS) $(GDBTK_CFLAGS)\
|
||||||
$(srcdir)/v850ice.c
|
$(srcdir)/v850ice.c
|
||||||
|
|
||||||
|
v850-tdep.o: v850-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(obstack_h) \
|
||||||
|
$(target_h) $(value_h) $(bfd_h) $(gdb_string_h) $(gdbcore_h) \
|
||||||
|
$(symfile_h) $(arch_utils_h)
|
||||||
|
|
||||||
tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \
|
tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \
|
||||||
$(gdbtypes_h) $(expression_h) $(gdbcmd_h) $(value_h) target.h \
|
$(gdbtypes_h) $(expression_h) $(gdbcmd_h) $(value_h) target.h \
|
||||||
language.h gdb_string.h $(readline_headers) $(remote_h)
|
language.h gdb_string.h $(readline_headers) $(remote_h)
|
||||||
|
@ -1401,7 +1405,7 @@ i386gnu-nat.o: gnu-nat.h
|
||||||
|
|
||||||
i386-tdep.o: i386-tdep.c $(defs_h) gdb_string.h $(frame_h) \
|
i386-tdep.o: i386-tdep.c $(defs_h) gdb_string.h $(frame_h) \
|
||||||
$(inferior_h) $(gdbcore_h) target.h $(floatformat_h) \
|
$(inferior_h) $(gdbcore_h) target.h $(floatformat_h) \
|
||||||
$(symtab_h) $(gdbcmd_h) $(command_h)
|
$(symtab_h) $(gdbcmd_h) $(command_h) $(arch_utils_h)
|
||||||
|
|
||||||
i386aix-nat.o: i386aix-nat.c $(defs_h) $(frame_h) $(inferior_h) \
|
i386aix-nat.o: i386aix-nat.c $(defs_h) $(frame_h) $(inferior_h) \
|
||||||
language.h $(gdbcore_h) $(floatformat_h) target.h
|
language.h $(gdbcore_h) $(floatformat_h) target.h
|
||||||
|
@ -1790,10 +1794,10 @@ serial.o: serial.c $(defs_h) serial.h gdb_string.h
|
||||||
|
|
||||||
sh-tdep.o: sh-tdep.c $(bfd_h) $(dis-asm_h) \
|
sh-tdep.o: sh-tdep.c $(bfd_h) $(dis-asm_h) \
|
||||||
$(srcdir)/../opcodes/sh-opc.h $(defs_h) $(expression_h) $(frame_h) \
|
$(srcdir)/../opcodes/sh-opc.h $(defs_h) $(expression_h) $(frame_h) \
|
||||||
$(gdbcmd_h) $(gdbtypes_h) $(symtab_h) $(value_h)
|
$(gdbcmd_h) $(gdbtypes_h) $(symtab_h) $(value_h) $(arch_utils_h)
|
||||||
|
|
||||||
sh3-rom.o: sh3-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \
|
sh3-rom.o: sh3-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \
|
||||||
$(inferior_h) target.h serial.h terminal.h
|
$(inferior_h) target.h serial.h terminal.h $(arch_utils_h)
|
||||||
|
|
||||||
mon960-rom.o: mon960-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \
|
mon960-rom.o: mon960-rom.c monitor.h $(bfd_h) gdb_wait.h $(defs_h) $(gdbcmd_h) \
|
||||||
$(inferior_h) target.h serial.h terminal.h
|
$(inferior_h) target.h serial.h terminal.h
|
||||||
|
|
38
gdb/TODO
38
gdb/TODO
|
@ -295,6 +295,23 @@ similarly.
|
||||||
|
|
||||||
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00845.html
|
http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00845.html
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
Change the parameter ``char *list[]'' (etc) to ``const char (*)[]'' so
|
||||||
|
that dynamic lists from things like gdbarch_printable_names() can be
|
||||||
|
passed.
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
The ``maintenance deprecate set endian big'' command doesn't notice
|
||||||
|
that it is deprecating ``set endian'' and not ``set endian big'' (big
|
||||||
|
is implemented using an enum). Is anyone going to notice this?
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
When tab expanding something like ``set arch<tab>'' ignore the
|
||||||
|
deprecated ``set archdebug'' and expand to ``set architecture''.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
|
|
||||||
|
@ -334,6 +351,9 @@ Convert GDB build process to AUTOMAKE.
|
||||||
|
|
||||||
See also sub-directory configure below.
|
See also sub-directory configure below.
|
||||||
|
|
||||||
|
The current convention is (kind of) to use $(<header>_h) in all
|
||||||
|
dependency lists. It isn't done in a consistent way.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
Cleanup configury support for optional sub-directories.
|
Cleanup configury support for optional sub-directories.
|
||||||
|
@ -425,6 +445,16 @@ http://sourceware.cygnus.com/ml/gdb/2000-q1/msg00034.html
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
|
Change the (char *list[]) to (const char (*)[]) so that dynamic lists can
|
||||||
|
be passed.
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
When tab expanding something like ``set arch<tab>'' ignore the
|
||||||
|
deprecated ``set archdebug'' and expand to ``set architecture''.
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
Replace the code that uses the host FPU with an emulator of the target
|
Replace the code that uses the host FPU with an emulator of the target
|
||||||
FPU.
|
FPU.
|
||||||
|
|
||||||
|
@ -884,14 +914,6 @@ symtab file.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
Fix ``set architecture <tab>''
|
|
||||||
|
|
||||||
This command should expand to a list of all supported architectures.
|
|
||||||
At present ``info architecture'' needs to be used. That is simply
|
|
||||||
wrong. It involves the use of add_set_enum_cmd().
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
Fix target_signal_from_host() etc.
|
Fix target_signal_from_host() etc.
|
||||||
|
|
||||||
The name is wrong for starters. ``target_signal'' should probably be
|
The name is wrong for starters. ``target_signal'' should probably be
|
||||||
|
|
394
gdb/arch-utils.c
394
gdb/arch-utils.c
|
@ -223,11 +223,399 @@ generic_register_convertible_not (num)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
|
||||||
|
|
||||||
extern initialize_file_ftype __initialize_gdbarch_utils;
|
/* Functions to manipulate the endianness of the target. */
|
||||||
|
|
||||||
|
#ifdef TARGET_BYTE_ORDER_SELECTABLE
|
||||||
|
/* compat - Catch old targets that expect a selectable byte-order to
|
||||||
|
default to BIG_ENDIAN */
|
||||||
|
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
||||||
|
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !TARGET_BYTE_ORDER_SELECTABLE_P
|
||||||
|
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
||||||
|
/* compat - Catch old non byte-order selectable targets that do not
|
||||||
|
define TARGET_BYTE_ORDER_DEFAULT and instead expect
|
||||||
|
TARGET_BYTE_ORDER to be used as the default. For targets that
|
||||||
|
defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
|
||||||
|
below will get a strange compiler warning. */
|
||||||
|
#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
||||||
|
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
|
||||||
|
#endif
|
||||||
|
int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
|
||||||
|
int target_byte_order_auto = 1;
|
||||||
|
|
||||||
|
static char endian_big[] = "big";
|
||||||
|
static char endian_little[] = "little";
|
||||||
|
static char endian_auto[] = "auto";
|
||||||
|
static char *endian_enum[] =
|
||||||
|
{
|
||||||
|
endian_big,
|
||||||
|
endian_little,
|
||||||
|
endian_auto,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
static char *set_endian_string;
|
||||||
|
|
||||||
|
/* Called by ``show endian''. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_endian (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
if (TARGET_BYTE_ORDER_AUTO)
|
||||||
|
printf_unfiltered ("The target endianness is set automatically (currently %s endian)\n",
|
||||||
|
(TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
|
||||||
|
else
|
||||||
|
printf_unfiltered ("The target is assumed to be %s endian\n",
|
||||||
|
(TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_endian (char *ignore_args, int from_tty, struct cmd_list_element *c)
|
||||||
|
{
|
||||||
|
if (!TARGET_BYTE_ORDER_SELECTABLE_P)
|
||||||
|
{
|
||||||
|
printf_unfiltered ("Byte order is not selectable.");
|
||||||
|
}
|
||||||
|
else if (set_endian_string == endian_auto)
|
||||||
|
{
|
||||||
|
target_byte_order_auto = 1;
|
||||||
|
}
|
||||||
|
else if (set_endian_string == endian_little)
|
||||||
|
{
|
||||||
|
target_byte_order = LITTLE_ENDIAN;
|
||||||
|
target_byte_order_auto = 0;
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
struct gdbarch_info info;
|
||||||
|
memset (&info, 0, sizeof info);
|
||||||
|
info.byte_order = LITTLE_ENDIAN;
|
||||||
|
gdbarch_update (info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (set_endian_string == endian_big)
|
||||||
|
{
|
||||||
|
target_byte_order = BIG_ENDIAN;
|
||||||
|
target_byte_order_auto = 0;
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
struct gdbarch_info info;
|
||||||
|
memset (&info, 0, sizeof info);
|
||||||
|
info.byte_order = BIG_ENDIAN;
|
||||||
|
gdbarch_update (info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
internal_error ("set_endian: bad value");
|
||||||
|
show_endian (NULL, from_tty);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the endianness from a BFD. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_endian_from_file (bfd *abfd)
|
||||||
|
{
|
||||||
|
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
||||||
|
{
|
||||||
|
int want;
|
||||||
|
|
||||||
|
if (bfd_big_endian (abfd))
|
||||||
|
want = BIG_ENDIAN;
|
||||||
|
else
|
||||||
|
want = LITTLE_ENDIAN;
|
||||||
|
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 == BIG_ENDIAN ? "big" : "little",
|
||||||
|
TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bfd_big_endian (abfd)
|
||||||
|
? TARGET_BYTE_ORDER != BIG_ENDIAN
|
||||||
|
: TARGET_BYTE_ORDER == BIG_ENDIAN)
|
||||||
|
warning ("%s endian file does not match %s endian target.",
|
||||||
|
bfd_big_endian (abfd) ? "big" : "little",
|
||||||
|
TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Functions to manipulate the architecture of the target */
|
||||||
|
|
||||||
|
enum set_arch { set_arch_auto, set_arch_manual };
|
||||||
|
|
||||||
|
int target_architecture_auto = 1;
|
||||||
|
|
||||||
|
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 ("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 ("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 ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the architecture from arch/machine (deprecated) */
|
||||||
|
|
||||||
void
|
void
|
||||||
__initialize_gdbarch_utils (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 ("set_architecture_from_arch_mach: not multi-arched");
|
||||||
|
if (wanted != NULL)
|
||||||
|
set_arch (wanted, set_arch_manual);
|
||||||
|
else
|
||||||
|
internal_error ("gdbarch: hardwired architecture/machine not reconized");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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 ("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. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_architecture (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
const char *arch;
|
||||||
|
arch = TARGET_ARCHITECTURE->printable_name;
|
||||||
|
if (target_architecture_auto)
|
||||||
|
printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
|
||||||
|
else
|
||||||
|
printf_filtered ("The target architecture is assumed to be %s\n", arch);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Called if the user enters ``set architecture'' with or without an
|
||||||
|
argument. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_architecture (char *ignore_args, int from_tty, struct cmd_list_element *c)
|
||||||
|
{
|
||||||
|
if (strcmp (set_architecture_string, "auto") == 0)
|
||||||
|
{
|
||||||
|
target_architecture_auto = 1;
|
||||||
|
}
|
||||||
|
else if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
struct gdbarch_info info;
|
||||||
|
memset (&info, 0, sizeof info);
|
||||||
|
info.bfd_arch_info = bfd_scan_arch (set_architecture_string);
|
||||||
|
if (info.bfd_arch_info == NULL)
|
||||||
|
internal_error ("set_architecture: bfd_scan_arch failed");
|
||||||
|
if (gdbarch_update (info))
|
||||||
|
target_architecture_auto = 0;
|
||||||
|
else
|
||||||
|
printf_unfiltered ("Architecture `%s' not reconized.\n",
|
||||||
|
set_architecture_string);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const struct bfd_arch_info *arch
|
||||||
|
= bfd_scan_arch (set_architecture_string);
|
||||||
|
if (arch == NULL)
|
||||||
|
internal_error ("set_architecture: bfd_scan_arch failed");
|
||||||
|
set_arch (arch, set_arch_manual);
|
||||||
|
}
|
||||||
|
show_architecture (NULL, from_tty);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Called if the user enters ``info architecture'' without an argument. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
info_architecture (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
printf_filtered ("Available architectures are:\n");
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
const char **arches = gdbarch_printable_names ();
|
||||||
|
const char **arch;
|
||||||
|
for (arch = arches; *arch != NULL; arch++)
|
||||||
|
{
|
||||||
|
printf_filtered (" %s", *arch);
|
||||||
|
}
|
||||||
|
free (arches);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
enum bfd_architecture a;
|
||||||
|
for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
|
||||||
|
{
|
||||||
|
const struct bfd_arch_info *ap;
|
||||||
|
for (ap = bfd_lookup_arch (a, 0);
|
||||||
|
ap != NULL;
|
||||||
|
ap = ap->next)
|
||||||
|
{
|
||||||
|
printf_filtered (" %s", ap->printable_name);
|
||||||
|
ap = ap->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf_filtered ("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the dynamic target-system-dependant parameters (architecture,
|
||||||
|
byte-order) using information found in the BFD */
|
||||||
|
|
||||||
|
void
|
||||||
|
set_gdbarch_from_file (abfd)
|
||||||
|
bfd *abfd;
|
||||||
|
{
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
struct gdbarch_info info;
|
||||||
|
memset (&info, 0, sizeof info);
|
||||||
|
info.abfd = abfd;
|
||||||
|
gdbarch_update (info);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
set_architecture_from_file (abfd);
|
||||||
|
set_endian_from_file (abfd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize the current architecture. Update the ``set
|
||||||
|
architecture'' command so that it specifies a list of valid
|
||||||
|
architectures. */
|
||||||
|
|
||||||
|
void
|
||||||
|
initialize_current_architecture (void)
|
||||||
|
{
|
||||||
|
const char **arches = gdbarch_printable_names ();
|
||||||
|
const char *chosen = arches[0];
|
||||||
|
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
const char **arch;
|
||||||
|
struct gdbarch_info info;
|
||||||
|
for (arch = arches; *arch != NULL; arch++)
|
||||||
|
{
|
||||||
|
/* Choose the first architecture alphabetically. */
|
||||||
|
if (strcmp (*arch, chosen) < 0)
|
||||||
|
chosen = *arch;
|
||||||
|
}
|
||||||
|
if (chosen == NULL)
|
||||||
|
internal_error ("initialize_current_architecture: No arch");
|
||||||
|
memset (&info, 0, sizeof info);
|
||||||
|
info.bfd_arch_info = bfd_scan_arch (chosen);
|
||||||
|
if (info.bfd_arch_info == NULL)
|
||||||
|
internal_error ("initialize_current_architecture: Arch not found");
|
||||||
|
gdbarch_update (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the ``set architecture'' command prepending ``auto''. */
|
||||||
|
{
|
||||||
|
struct cmd_list_element *c;
|
||||||
|
/* Append ``auto''. */
|
||||||
|
int nr;
|
||||||
|
for (nr = 0; arches[nr] != NULL; nr++);
|
||||||
|
arches = xrealloc (arches, sizeof (char*) * (nr + 2));
|
||||||
|
arches[nr + 0] = "auto";
|
||||||
|
arches[nr + 1] = NULL;
|
||||||
|
/* FIXME: add_set_enum_cmd() uses an array of ``char *'' instead
|
||||||
|
of ``const char *''. We just happen to know that the casts are
|
||||||
|
safe. */
|
||||||
|
c = add_set_enum_cmd ("architecture", class_support,
|
||||||
|
(char **) arches, (char **) &set_architecture_string,
|
||||||
|
"Set architecture of target.",
|
||||||
|
&setlist);
|
||||||
|
c->function.sfunc = set_architecture;
|
||||||
|
add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
|
||||||
|
/* Don't use set_from_show - need to print both auto/manual and
|
||||||
|
current setting. */
|
||||||
|
add_cmd ("architecture", class_support, show_architecture,
|
||||||
|
"Show the current target architecture", &showlist);
|
||||||
|
c = add_cmd ("architecture", class_support, info_architecture,
|
||||||
|
"List supported target architectures", &infolist);
|
||||||
|
deprecate_cmd (c, "set architecture");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* */
|
||||||
|
|
||||||
|
extern initialize_file_ftype _initialize_gdbarch_utils;
|
||||||
|
|
||||||
|
void
|
||||||
|
_initialize_gdbarch_utils (void)
|
||||||
|
{
|
||||||
|
struct cmd_list_element *c;
|
||||||
|
c = add_set_enum_cmd ("endian", class_support,
|
||||||
|
endian_enum, &set_endian_string,
|
||||||
|
"Set endianness of target.",
|
||||||
|
&setlist);
|
||||||
|
c->function.sfunc = set_endian;
|
||||||
|
/* Don't use set_from_show - need to print both auto/manual and
|
||||||
|
current setting. */
|
||||||
|
add_cmd ("endian", class_support, show_endian,
|
||||||
|
"Show the current byte-order", &showlist);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,4 +72,20 @@ extern const struct floatformat *default_double_format (struct gdbarch *gdbarch)
|
||||||
extern int frame_num_args_unknown (struct frame_info *fi);
|
extern int frame_num_args_unknown (struct frame_info *fi);
|
||||||
|
|
||||||
|
|
||||||
|
/* The following DEPRECATED interfaces are for pre- multi-arch legacy
|
||||||
|
targets. */
|
||||||
|
|
||||||
|
/* DEPRECATED pre- multi-arch interface. Explicitly set the dynamic
|
||||||
|
target-system-dependant parameters based on bfd_architecture and
|
||||||
|
machine. This function is deprecated, use
|
||||||
|
set_gdbarch_from_arch_machine(). */
|
||||||
|
|
||||||
|
extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
|
||||||
|
|
||||||
|
/* DEPRECATED pre- multi-arch interface. Notify the target dependant
|
||||||
|
backend of a change to the selected architecture. A zero return
|
||||||
|
status indicates that the target did not like the change. */
|
||||||
|
|
||||||
|
extern int (*target_architecture_hook) (const struct bfd_arch_info *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
453
gdb/gdbarch.c
453
gdb/gdbarch.c
|
@ -3069,6 +3069,50 @@ struct gdbarch_init_registration
|
||||||
|
|
||||||
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
|
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
|
||||||
|
|
||||||
|
static void
|
||||||
|
append_name (const char ***buf, int *nr, const char *name)
|
||||||
|
{
|
||||||
|
*buf = xrealloc (*buf, sizeof (char**) * (*nr + 1));
|
||||||
|
(*buf)[*nr] = name;
|
||||||
|
*nr += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char **
|
||||||
|
gdbarch_printable_names (void)
|
||||||
|
{
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
/* Accumulate a list of names based on the registed list of
|
||||||
|
architectures. */
|
||||||
|
enum bfd_architecture a;
|
||||||
|
int nr_arches = 0;
|
||||||
|
const char **arches = NULL;
|
||||||
|
struct gdbarch_init_registration *rego;
|
||||||
|
for (rego = gdbarch_init_registrary;
|
||||||
|
rego != NULL;
|
||||||
|
rego = rego->next)
|
||||||
|
{
|
||||||
|
const struct bfd_arch_info *ap;
|
||||||
|
ap = bfd_lookup_arch (rego->bfd_architecture, 0);
|
||||||
|
if (ap == NULL)
|
||||||
|
internal_error ("gdbarch_architecture_names: multi-arch unknown");
|
||||||
|
do
|
||||||
|
{
|
||||||
|
append_name (&arches, &nr_arches, ap->printable_name);
|
||||||
|
ap = ap->next;
|
||||||
|
}
|
||||||
|
while (ap != NULL);
|
||||||
|
}
|
||||||
|
append_name (&arches, &nr_arches, NULL);
|
||||||
|
return arches;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Just return all the architectures that BFD knows. Assume that
|
||||||
|
the legacy architecture framework supports them. */
|
||||||
|
return bfd_arch_list ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
||||||
gdbarch_init_ftype *init)
|
gdbarch_init_ftype *init)
|
||||||
|
@ -3104,7 +3148,6 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Look for an architecture using gdbarch_info. Base search on only
|
/* Look for an architecture using gdbarch_info. Base search on only
|
||||||
BFD_ARCH_INFO and BYTE_ORDER. */
|
BFD_ARCH_INFO and BYTE_ORDER. */
|
||||||
|
|
||||||
|
@ -3276,343 +3319,6 @@ gdbarch_update (struct gdbarch_info info)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Functions to manipulate the endianness of the target. */
|
|
||||||
|
|
||||||
#ifdef TARGET_BYTE_ORDER_SELECTABLE
|
|
||||||
/* compat - Catch old targets that expect a selectable byte-order to
|
|
||||||
default to BIG_ENDIAN */
|
|
||||||
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !TARGET_BYTE_ORDER_SELECTABLE_P
|
|
||||||
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
|
||||||
/* compat - Catch old non byte-order selectable targets that do not
|
|
||||||
define TARGET_BYTE_ORDER_DEFAULT and instead expect
|
|
||||||
TARGET_BYTE_ORDER to be used as the default. For targets that
|
|
||||||
defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
|
|
||||||
below will get a strange compiler warning. */
|
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
|
|
||||||
#endif
|
|
||||||
int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
|
|
||||||
int target_byte_order_auto = 1;
|
|
||||||
|
|
||||||
/* Chain containing the \"set endian\" commands. */
|
|
||||||
static struct cmd_list_element *endianlist = NULL;
|
|
||||||
|
|
||||||
/* Called by ``show endian''. */
|
|
||||||
static void
|
|
||||||
show_endian (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
char *msg =
|
|
||||||
(TARGET_BYTE_ORDER_AUTO
|
|
||||||
? "The target endianness is set automatically (currently %s endian)\n"
|
|
||||||
: "The target is assumed to be %s endian\n");
|
|
||||||
printf_unfiltered (msg, (TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters ``set endian'' without an argument. */
|
|
||||||
static void
|
|
||||||
set_endian (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by ``set endian big''. */
|
|
||||||
static void
|
|
||||||
set_endian_big (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
target_byte_order = BIG_ENDIAN;
|
|
||||||
target_byte_order_auto = 0;
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.byte_order = BIG_ENDIAN;
|
|
||||||
gdbarch_update (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_unfiltered ("Byte order is not selectable.");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by ``set endian little''. */
|
|
||||||
static void
|
|
||||||
set_endian_little (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
target_byte_order = LITTLE_ENDIAN;
|
|
||||||
target_byte_order_auto = 0;
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.byte_order = LITTLE_ENDIAN;
|
|
||||||
gdbarch_update (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_unfiltered ("Byte order is not selectable.");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by ``set endian auto''. */
|
|
||||||
static void
|
|
||||||
set_endian_auto (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
target_byte_order_auto = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_unfiltered ("Byte order is not selectable.");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the endianness from a BFD. */
|
|
||||||
static void
|
|
||||||
set_endian_from_file (bfd *abfd)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
int want;
|
|
||||||
|
|
||||||
if (bfd_big_endian (abfd))
|
|
||||||
want = BIG_ENDIAN;
|
|
||||||
else
|
|
||||||
want = LITTLE_ENDIAN;
|
|
||||||
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 == BIG_ENDIAN ? "big" : "little",
|
|
||||||
TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (bfd_big_endian (abfd)
|
|
||||||
? TARGET_BYTE_ORDER != BIG_ENDIAN
|
|
||||||
: TARGET_BYTE_ORDER == BIG_ENDIAN)
|
|
||||||
warning ("%s endian file does not match %s endian target.",
|
|
||||||
bfd_big_endian (abfd) ? "big" : "little",
|
|
||||||
TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Functions to manipulate the architecture of the target */
|
|
||||||
|
|
||||||
enum set_arch { set_arch_auto, set_arch_manual };
|
|
||||||
|
|
||||||
int target_architecture_auto = 1;
|
|
||||||
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 void show_endian (char *, int);
|
|
||||||
static void set_endian (char *, int);
|
|
||||||
static void set_endian_big (char *, int);
|
|
||||||
static void set_endian_little (char *, int);
|
|
||||||
static void set_endian_auto (char *, int);
|
|
||||||
static void set_endian_from_file (bfd *);
|
|
||||||
static int arch_ok (const struct bfd_arch_info *arch);
|
|
||||||
static void set_arch (const struct bfd_arch_info *arch, enum set_arch type);
|
|
||||||
static void show_architecture (char *, int);
|
|
||||||
static void set_architecture (char *, int);
|
|
||||||
static void info_architecture (char *, int);
|
|
||||||
static void set_architecture_from_file (bfd *);
|
|
||||||
|
|
||||||
/* Do the real work of changing the current architecture */
|
|
||||||
|
|
||||||
static int
|
|
||||||
arch_ok (const struct bfd_arch_info *arch)
|
|
||||||
{
|
|
||||||
/* 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)
|
|
||||||
{
|
|
||||||
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 ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters ``show architecture'' without an argument. */
|
|
||||||
static void
|
|
||||||
show_architecture (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
const char *arch;
|
|
||||||
arch = TARGET_ARCHITECTURE->printable_name;
|
|
||||||
if (target_architecture_auto)
|
|
||||||
printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
|
|
||||||
else
|
|
||||||
printf_filtered ("The target architecture is assumed to be %s\n", arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters ``set architecture'' with or without an
|
|
||||||
argument. */
|
|
||||||
static void
|
|
||||||
set_architecture (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (args == NULL)
|
|
||||||
{
|
|
||||||
printf_unfiltered ("\"set architecture\" must be followed by \"auto\" or an architecture name.\n");
|
|
||||||
}
|
|
||||||
else if (strcmp (args, "auto") == 0)
|
|
||||||
{
|
|
||||||
target_architecture_auto = 1;
|
|
||||||
}
|
|
||||||
else if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *arch = bfd_scan_arch (args);
|
|
||||||
if (arch == NULL)
|
|
||||||
printf_unfiltered ("Architecture `%s' not reconized.\n", args);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.bfd_arch_info = arch;
|
|
||||||
if (gdbarch_update (info))
|
|
||||||
target_architecture_auto = 0;
|
|
||||||
else
|
|
||||||
printf_unfiltered ("Architecture `%s' not reconized.\n", args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *arch = bfd_scan_arch (args);
|
|
||||||
if (arch != NULL)
|
|
||||||
set_arch (arch, set_arch_manual);
|
|
||||||
else
|
|
||||||
printf_unfiltered ("Architecture `%s' not reconized.\n", args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters ``info architecture'' without an argument. */
|
|
||||||
static void
|
|
||||||
info_architecture (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
enum bfd_architecture a;
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
if (gdbarch_init_registrary != NULL)
|
|
||||||
{
|
|
||||||
struct gdbarch_init_registration *rego;
|
|
||||||
printf_filtered ("Available architectures are:\n");
|
|
||||||
for (rego = gdbarch_init_registrary;
|
|
||||||
rego != NULL;
|
|
||||||
rego = rego->next)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *ap;
|
|
||||||
ap = bfd_lookup_arch (rego->bfd_architecture, 0);
|
|
||||||
if (ap != NULL)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
printf_filtered (" %s", ap->printable_name);
|
|
||||||
ap = ap->next;
|
|
||||||
}
|
|
||||||
while (ap != NULL);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_filtered ("There are no available architectures.\n");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
printf_filtered ("Available architectures are:\n");
|
|
||||||
for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *ap = bfd_lookup_arch (a, 0);
|
|
||||||
if (ap != NULL)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
printf_filtered (" %s", ap->printable_name);
|
|
||||||
ap = ap->next;
|
|
||||||
}
|
|
||||||
while (ap != NULL);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the architecture from arch/machine */
|
|
||||||
void
|
|
||||||
set_architecture_from_arch_mach (arch, mach)
|
|
||||||
enum bfd_architecture arch;
|
|
||||||
unsigned long mach;
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
|
|
||||||
if (wanted != NULL)
|
|
||||||
set_arch (wanted, set_arch_manual);
|
|
||||||
else
|
|
||||||
internal_error ("gdbarch: hardwired architecture/machine not reconized");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the architecture from a BFD */
|
|
||||||
static void
|
|
||||||
set_architecture_from_file (bfd *abfd)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Disassembler */
|
/* Disassembler */
|
||||||
|
|
||||||
/* Pointer to the target-dependent disassembly function. */
|
/* Pointer to the target-dependent disassembly function. */
|
||||||
|
@ -3620,82 +3326,13 @@ int (*tm_print_insn) (bfd_vma, disassemble_info *);
|
||||||
disassemble_info tm_print_insn_info;
|
disassemble_info tm_print_insn_info;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the dynamic target-system-dependant parameters (architecture,
|
|
||||||
byte-order) using information found in the BFD */
|
|
||||||
|
|
||||||
void
|
|
||||||
set_gdbarch_from_file (abfd)
|
|
||||||
bfd *abfd;
|
|
||||||
{
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.abfd = abfd;
|
|
||||||
gdbarch_update (info);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
set_architecture_from_file (abfd);
|
|
||||||
set_endian_from_file (abfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the current architecture. */
|
|
||||||
void
|
|
||||||
initialize_current_architecture ()
|
|
||||||
{
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_init_registration *rego;
|
|
||||||
const struct bfd_arch_info *chosen = NULL;
|
|
||||||
for (rego = gdbarch_init_registrary; rego != NULL; rego = rego->next)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *ap
|
|
||||||
= bfd_lookup_arch (rego->bfd_architecture, 0);
|
|
||||||
|
|
||||||
/* Choose the first architecture alphabetically. */
|
|
||||||
if (chosen == NULL
|
|
||||||
|| strcmp (ap->printable_name, chosen->printable_name) < 0)
|
|
||||||
chosen = ap;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chosen != NULL)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.bfd_arch_info = chosen;
|
|
||||||
gdbarch_update (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void _initialize_gdbarch (void);
|
extern void _initialize_gdbarch (void);
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_gdbarch ()
|
_initialize_gdbarch ()
|
||||||
{
|
{
|
||||||
struct cmd_list_element *c;
|
struct cmd_list_element *c;
|
||||||
|
|
||||||
add_prefix_cmd ("endian", class_support, set_endian,
|
|
||||||
"Set endianness of target.",
|
|
||||||
&endianlist, "set endian ", 0, &setlist);
|
|
||||||
add_cmd ("big", class_support, set_endian_big,
|
|
||||||
"Set target as being big endian.", &endianlist);
|
|
||||||
add_cmd ("little", class_support, set_endian_little,
|
|
||||||
"Set target as being little endian.", &endianlist);
|
|
||||||
add_cmd ("auto", class_support, set_endian_auto,
|
|
||||||
"Select target endianness automatically.", &endianlist);
|
|
||||||
add_cmd ("endian", class_support, show_endian,
|
|
||||||
"Show endianness of target.", &showlist);
|
|
||||||
|
|
||||||
add_cmd ("architecture", class_support, set_architecture,
|
|
||||||
"Set architecture of target.", &setlist);
|
|
||||||
add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
|
|
||||||
add_cmd ("architecture", class_support, show_architecture,
|
|
||||||
"Show architecture of target.", &showlist);
|
|
||||||
add_cmd ("architecture", class_support, info_architecture,
|
|
||||||
"List supported target architectures", &infolist);
|
|
||||||
|
|
||||||
INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
|
INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
|
||||||
tm_print_insn_info.flavour = bfd_target_unknown_flavour;
|
tm_print_insn_info.flavour = bfd_target_unknown_flavour;
|
||||||
tm_print_insn_info.read_memory_func = dis_asm_read_memory;
|
tm_print_insn_info.read_memory_func = dis_asm_read_memory;
|
||||||
|
|
|
@ -1212,6 +1212,14 @@ typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct g
|
||||||
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a freshly allocated, NULL terminated, array of the valid
|
||||||
|
architecture names. Since architectures are registered during the
|
||||||
|
_initialize phase this function only returns useful information
|
||||||
|
once initialization has been completed. */
|
||||||
|
|
||||||
|
extern const char **gdbarch_printable_names (void);
|
||||||
|
|
||||||
|
|
||||||
/* Helper function. Search the list of ARCHES for a GDBARCH that
|
/* Helper function. Search the list of ARCHES for a GDBARCH that
|
||||||
matches the information provided by INFO. */
|
matches the information provided by INFO. */
|
||||||
|
|
||||||
|
@ -1342,13 +1350,6 @@ extern const struct bfd_arch_info *target_architecture;
|
||||||
#define TARGET_ARCHITECTURE (target_architecture + 0)
|
#define TARGET_ARCHITECTURE (target_architecture + 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Notify the target dependant backend of a change to the selected
|
|
||||||
architecture. A zero return status indicates that the target did
|
|
||||||
not like the change. */
|
|
||||||
|
|
||||||
extern int (*target_architecture_hook) (const struct bfd_arch_info *);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* The target-system-dependant disassembler is semi-dynamic */
|
/* The target-system-dependant disassembler is semi-dynamic */
|
||||||
|
|
||||||
|
@ -1397,12 +1398,6 @@ extern disassemble_info tm_print_insn_info;
|
||||||
extern void set_gdbarch_from_file (bfd *);
|
extern void set_gdbarch_from_file (bfd *);
|
||||||
|
|
||||||
|
|
||||||
/* Explicitly set the dynamic target-system-dependant parameters based
|
|
||||||
on bfd_architecture and machine. */
|
|
||||||
|
|
||||||
extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the current architecture to the "first" one we find on
|
/* Initialize the current architecture to the "first" one we find on
|
||||||
our list. */
|
our list. */
|
||||||
|
|
||||||
|
|
474
gdb/gdbarch.sh
474
gdb/gdbarch.sh
|
@ -702,6 +702,14 @@ typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct g
|
||||||
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a freshly allocated, NULL terminated, array of the valid
|
||||||
|
architecture names. Since architectures are registered during the
|
||||||
|
_initialize phase this function only returns useful information
|
||||||
|
once initialization has been completed. */
|
||||||
|
|
||||||
|
extern const char **gdbarch_printable_names (void);
|
||||||
|
|
||||||
|
|
||||||
/* Helper function. Search the list of ARCHES for a GDBARCH that
|
/* Helper function. Search the list of ARCHES for a GDBARCH that
|
||||||
matches the information provided by INFO. */
|
matches the information provided by INFO. */
|
||||||
|
|
||||||
|
@ -832,13 +840,6 @@ extern const struct bfd_arch_info *target_architecture;
|
||||||
#define TARGET_ARCHITECTURE (target_architecture + 0)
|
#define TARGET_ARCHITECTURE (target_architecture + 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Notify the target dependant backend of a change to the selected
|
|
||||||
architecture. A zero return status indicates that the target did
|
|
||||||
not like the change. */
|
|
||||||
|
|
||||||
extern int (*target_architecture_hook) (const struct bfd_arch_info *);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* The target-system-dependant disassembler is semi-dynamic */
|
/* The target-system-dependant disassembler is semi-dynamic */
|
||||||
|
|
||||||
|
@ -887,12 +888,6 @@ extern disassemble_info tm_print_insn_info;
|
||||||
extern void set_gdbarch_from_file (bfd *);
|
extern void set_gdbarch_from_file (bfd *);
|
||||||
|
|
||||||
|
|
||||||
/* Explicitly set the dynamic target-system-dependant parameters based
|
|
||||||
on bfd_architecture and machine. */
|
|
||||||
|
|
||||||
extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the current architecture to the "first" one we find on
|
/* Initialize the current architecture to the "first" one we find on
|
||||||
our list. */
|
our list. */
|
||||||
|
|
||||||
|
@ -1516,6 +1511,50 @@ struct gdbarch_init_registration
|
||||||
|
|
||||||
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
|
static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
|
||||||
|
|
||||||
|
static void
|
||||||
|
append_name (const char ***buf, int *nr, const char *name)
|
||||||
|
{
|
||||||
|
*buf = xrealloc (*buf, sizeof (char**) * (*nr + 1));
|
||||||
|
(*buf)[*nr] = name;
|
||||||
|
*nr += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char **
|
||||||
|
gdbarch_printable_names (void)
|
||||||
|
{
|
||||||
|
if (GDB_MULTI_ARCH)
|
||||||
|
{
|
||||||
|
/* Accumulate a list of names based on the registed list of
|
||||||
|
architectures. */
|
||||||
|
enum bfd_architecture a;
|
||||||
|
int nr_arches = 0;
|
||||||
|
const char **arches = NULL;
|
||||||
|
struct gdbarch_init_registration *rego;
|
||||||
|
for (rego = gdbarch_init_registrary;
|
||||||
|
rego != NULL;
|
||||||
|
rego = rego->next)
|
||||||
|
{
|
||||||
|
const struct bfd_arch_info *ap;
|
||||||
|
ap = bfd_lookup_arch (rego->bfd_architecture, 0);
|
||||||
|
if (ap == NULL)
|
||||||
|
internal_error ("gdbarch_architecture_names: multi-arch unknown");
|
||||||
|
do
|
||||||
|
{
|
||||||
|
append_name (&arches, &nr_arches, ap->printable_name);
|
||||||
|
ap = ap->next;
|
||||||
|
}
|
||||||
|
while (ap != NULL);
|
||||||
|
}
|
||||||
|
append_name (&arches, &nr_arches, NULL);
|
||||||
|
return arches;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* Just return all the architectures that BFD knows. Assume that
|
||||||
|
the legacy architecture framework supports them. */
|
||||||
|
return bfd_arch_list ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
||||||
gdbarch_init_ftype *init)
|
gdbarch_init_ftype *init)
|
||||||
|
@ -1551,7 +1590,6 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Look for an architecture using gdbarch_info. Base search on only
|
/* Look for an architecture using gdbarch_info. Base search on only
|
||||||
BFD_ARCH_INFO and BYTE_ORDER. */
|
BFD_ARCH_INFO and BYTE_ORDER. */
|
||||||
|
|
||||||
|
@ -1723,343 +1761,6 @@ gdbarch_update (struct gdbarch_info info)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Functions to manipulate the endianness of the target. */
|
|
||||||
|
|
||||||
#ifdef TARGET_BYTE_ORDER_SELECTABLE
|
|
||||||
/* compat - Catch old targets that expect a selectable byte-order to
|
|
||||||
default to BIG_ENDIAN */
|
|
||||||
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#if !TARGET_BYTE_ORDER_SELECTABLE_P
|
|
||||||
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
|
||||||
/* compat - Catch old non byte-order selectable targets that do not
|
|
||||||
define TARGET_BYTE_ORDER_DEFAULT and instead expect
|
|
||||||
TARGET_BYTE_ORDER to be used as the default. For targets that
|
|
||||||
defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
|
|
||||||
below will get a strange compiler warning. */
|
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef TARGET_BYTE_ORDER_DEFAULT
|
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
|
|
||||||
#endif
|
|
||||||
int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
|
|
||||||
int target_byte_order_auto = 1;
|
|
||||||
|
|
||||||
/* Chain containing the \"set endian\" commands. */
|
|
||||||
static struct cmd_list_element *endianlist = NULL;
|
|
||||||
|
|
||||||
/* Called by \`\`show endian''. */
|
|
||||||
static void
|
|
||||||
show_endian (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
char *msg =
|
|
||||||
(TARGET_BYTE_ORDER_AUTO
|
|
||||||
? "The target endianness is set automatically (currently %s endian)\n"
|
|
||||||
: "The target is assumed to be %s endian\n");
|
|
||||||
printf_unfiltered (msg, (TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters \`\`set endian'' without an argument. */
|
|
||||||
static void
|
|
||||||
set_endian (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by \`\`set endian big''. */
|
|
||||||
static void
|
|
||||||
set_endian_big (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
target_byte_order = BIG_ENDIAN;
|
|
||||||
target_byte_order_auto = 0;
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.byte_order = BIG_ENDIAN;
|
|
||||||
gdbarch_update (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_unfiltered ("Byte order is not selectable.");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by \`\`set endian little''. */
|
|
||||||
static void
|
|
||||||
set_endian_little (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
target_byte_order = LITTLE_ENDIAN;
|
|
||||||
target_byte_order_auto = 0;
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.byte_order = LITTLE_ENDIAN;
|
|
||||||
gdbarch_update (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_unfiltered ("Byte order is not selectable.");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called by \`\`set endian auto''. */
|
|
||||||
static void
|
|
||||||
set_endian_auto (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
target_byte_order_auto = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_unfiltered ("Byte order is not selectable.");
|
|
||||||
show_endian (args, from_tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the endianness from a BFD. */
|
|
||||||
static void
|
|
||||||
set_endian_from_file (bfd *abfd)
|
|
||||||
{
|
|
||||||
if (TARGET_BYTE_ORDER_SELECTABLE_P)
|
|
||||||
{
|
|
||||||
int want;
|
|
||||||
|
|
||||||
if (bfd_big_endian (abfd))
|
|
||||||
want = BIG_ENDIAN;
|
|
||||||
else
|
|
||||||
want = LITTLE_ENDIAN;
|
|
||||||
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 == BIG_ENDIAN ? "big" : "little",
|
|
||||||
TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (bfd_big_endian (abfd)
|
|
||||||
? TARGET_BYTE_ORDER != BIG_ENDIAN
|
|
||||||
: TARGET_BYTE_ORDER == BIG_ENDIAN)
|
|
||||||
warning ("%s endian file does not match %s endian target.",
|
|
||||||
bfd_big_endian (abfd) ? "big" : "little",
|
|
||||||
TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Functions to manipulate the architecture of the target */
|
|
||||||
|
|
||||||
enum set_arch { set_arch_auto, set_arch_manual };
|
|
||||||
|
|
||||||
int target_architecture_auto = 1;
|
|
||||||
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 void show_endian (char *, int);
|
|
||||||
static void set_endian (char *, int);
|
|
||||||
static void set_endian_big (char *, int);
|
|
||||||
static void set_endian_little (char *, int);
|
|
||||||
static void set_endian_auto (char *, int);
|
|
||||||
static void set_endian_from_file (bfd *);
|
|
||||||
static int arch_ok (const struct bfd_arch_info *arch);
|
|
||||||
static void set_arch (const struct bfd_arch_info *arch, enum set_arch type);
|
|
||||||
static void show_architecture (char *, int);
|
|
||||||
static void set_architecture (char *, int);
|
|
||||||
static void info_architecture (char *, int);
|
|
||||||
static void set_architecture_from_file (bfd *);
|
|
||||||
|
|
||||||
/* Do the real work of changing the current architecture */
|
|
||||||
|
|
||||||
static int
|
|
||||||
arch_ok (const struct bfd_arch_info *arch)
|
|
||||||
{
|
|
||||||
/* 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)
|
|
||||||
{
|
|
||||||
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 ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters \`\`show architecture'' without an argument. */
|
|
||||||
static void
|
|
||||||
show_architecture (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
const char *arch;
|
|
||||||
arch = TARGET_ARCHITECTURE->printable_name;
|
|
||||||
if (target_architecture_auto)
|
|
||||||
printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
|
|
||||||
else
|
|
||||||
printf_filtered ("The target architecture is assumed to be %s\n", arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters \`\`set architecture'' with or without an
|
|
||||||
argument. */
|
|
||||||
static void
|
|
||||||
set_architecture (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
if (args == NULL)
|
|
||||||
{
|
|
||||||
printf_unfiltered ("\"set architecture\" must be followed by \"auto\" or an architecture name.\n");
|
|
||||||
}
|
|
||||||
else if (strcmp (args, "auto") == 0)
|
|
||||||
{
|
|
||||||
target_architecture_auto = 1;
|
|
||||||
}
|
|
||||||
else if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *arch = bfd_scan_arch (args);
|
|
||||||
if (arch == NULL)
|
|
||||||
printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.bfd_arch_info = arch;
|
|
||||||
if (gdbarch_update (info))
|
|
||||||
target_architecture_auto = 0;
|
|
||||||
else
|
|
||||||
printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *arch = bfd_scan_arch (args);
|
|
||||||
if (arch != NULL)
|
|
||||||
set_arch (arch, set_arch_manual);
|
|
||||||
else
|
|
||||||
printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Called if the user enters \`\`info architecture'' without an argument. */
|
|
||||||
static void
|
|
||||||
info_architecture (char *args, int from_tty)
|
|
||||||
{
|
|
||||||
enum bfd_architecture a;
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
if (gdbarch_init_registrary != NULL)
|
|
||||||
{
|
|
||||||
struct gdbarch_init_registration *rego;
|
|
||||||
printf_filtered ("Available architectures are:\n");
|
|
||||||
for (rego = gdbarch_init_registrary;
|
|
||||||
rego != NULL;
|
|
||||||
rego = rego->next)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *ap;
|
|
||||||
ap = bfd_lookup_arch (rego->bfd_architecture, 0);
|
|
||||||
if (ap != NULL)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
printf_filtered (" %s", ap->printable_name);
|
|
||||||
ap = ap->next;
|
|
||||||
}
|
|
||||||
while (ap != NULL);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf_filtered ("There are no available architectures.\n");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
printf_filtered ("Available architectures are:\n");
|
|
||||||
for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *ap = bfd_lookup_arch (a, 0);
|
|
||||||
if (ap != NULL)
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
printf_filtered (" %s", ap->printable_name);
|
|
||||||
ap = ap->next;
|
|
||||||
}
|
|
||||||
while (ap != NULL);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the architecture from arch/machine */
|
|
||||||
void
|
|
||||||
set_architecture_from_arch_mach (arch, mach)
|
|
||||||
enum bfd_architecture arch;
|
|
||||||
unsigned long mach;
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
|
|
||||||
if (wanted != NULL)
|
|
||||||
set_arch (wanted, set_arch_manual);
|
|
||||||
else
|
|
||||||
internal_error ("gdbarch: hardwired architecture/machine not reconized");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set the architecture from a BFD */
|
|
||||||
static void
|
|
||||||
set_architecture_from_file (bfd *abfd)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Disassembler */
|
/* Disassembler */
|
||||||
|
|
||||||
/* Pointer to the target-dependent disassembly function. */
|
/* Pointer to the target-dependent disassembly function. */
|
||||||
|
@ -2067,82 +1768,13 @@ int (*tm_print_insn) (bfd_vma, disassemble_info *);
|
||||||
disassemble_info tm_print_insn_info;
|
disassemble_info tm_print_insn_info;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Set the dynamic target-system-dependant parameters (architecture,
|
|
||||||
byte-order) using information found in the BFD */
|
|
||||||
|
|
||||||
void
|
|
||||||
set_gdbarch_from_file (abfd)
|
|
||||||
bfd *abfd;
|
|
||||||
{
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.abfd = abfd;
|
|
||||||
gdbarch_update (info);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
set_architecture_from_file (abfd);
|
|
||||||
set_endian_from_file (abfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the current architecture. */
|
|
||||||
void
|
|
||||||
initialize_current_architecture ()
|
|
||||||
{
|
|
||||||
if (GDB_MULTI_ARCH)
|
|
||||||
{
|
|
||||||
struct gdbarch_init_registration *rego;
|
|
||||||
const struct bfd_arch_info *chosen = NULL;
|
|
||||||
for (rego = gdbarch_init_registrary; rego != NULL; rego = rego->next)
|
|
||||||
{
|
|
||||||
const struct bfd_arch_info *ap
|
|
||||||
= bfd_lookup_arch (rego->bfd_architecture, 0);
|
|
||||||
|
|
||||||
/* Choose the first architecture alphabetically. */
|
|
||||||
if (chosen == NULL
|
|
||||||
|| strcmp (ap->printable_name, chosen->printable_name) < 0)
|
|
||||||
chosen = ap;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chosen != NULL)
|
|
||||||
{
|
|
||||||
struct gdbarch_info info;
|
|
||||||
memset (&info, 0, sizeof info);
|
|
||||||
info.bfd_arch_info = chosen;
|
|
||||||
gdbarch_update (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void _initialize_gdbarch (void);
|
extern void _initialize_gdbarch (void);
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_gdbarch ()
|
_initialize_gdbarch ()
|
||||||
{
|
{
|
||||||
struct cmd_list_element *c;
|
struct cmd_list_element *c;
|
||||||
|
|
||||||
add_prefix_cmd ("endian", class_support, set_endian,
|
|
||||||
"Set endianness of target.",
|
|
||||||
&endianlist, "set endian ", 0, &setlist);
|
|
||||||
add_cmd ("big", class_support, set_endian_big,
|
|
||||||
"Set target as being big endian.", &endianlist);
|
|
||||||
add_cmd ("little", class_support, set_endian_little,
|
|
||||||
"Set target as being little endian.", &endianlist);
|
|
||||||
add_cmd ("auto", class_support, set_endian_auto,
|
|
||||||
"Select target endianness automatically.", &endianlist);
|
|
||||||
add_cmd ("endian", class_support, show_endian,
|
|
||||||
"Show endianness of target.", &showlist);
|
|
||||||
|
|
||||||
add_cmd ("architecture", class_support, set_architecture,
|
|
||||||
"Set architecture of target.", &setlist);
|
|
||||||
add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
|
|
||||||
add_cmd ("architecture", class_support, show_architecture,
|
|
||||||
"Show architecture of target.", &showlist);
|
|
||||||
add_cmd ("architecture", class_support, info_architecture,
|
|
||||||
"List supported target architectures", &infolist);
|
|
||||||
|
|
||||||
INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
|
INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
|
||||||
tm_print_insn_info.flavour = bfd_target_unknown_flavour;
|
tm_print_insn_info.flavour = bfd_target_unknown_flavour;
|
||||||
tm_print_insn_info.read_memory_func = dis_asm_read_memory;
|
tm_print_insn_info.read_memory_func = dis_asm_read_memory;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "gdbcmd.h"
|
#include "gdbcmd.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
#include "arch-utils.h"
|
||||||
|
|
||||||
static long i386_get_frame_setup (CORE_ADDR);
|
static long i386_get_frame_setup (CORE_ADDR);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* Target-dependent code for Hitachi Super-H, for GDB.
|
/* Target-dependent code for Hitachi Super-H, for GDB.
|
||||||
Copyright 1993, 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 2000 Free Software
|
||||||
|
Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -35,6 +36,7 @@
|
||||||
#include "dis-asm.h"
|
#include "dis-asm.h"
|
||||||
#include "inferior.h" /* for BEFORE_TEXT_END etc. */
|
#include "inferior.h" /* for BEFORE_TEXT_END etc. */
|
||||||
#include "gdb_string.h"
|
#include "gdb_string.h"
|
||||||
|
#include "arch-utils.h"
|
||||||
|
|
||||||
/* A set of original names, to be used when restoring back to generic
|
/* A set of original names, to be used when restoring back to generic
|
||||||
registers from a specific set. */
|
registers from a specific set. */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Remote target glue for the Hitachi SH-3 ROM monitor.
|
/* Remote target glue for the Hitachi SH-3 ROM monitor.
|
||||||
Copyright 1995, 1996 Free Software Foundation, Inc.
|
Copyright 1995, 1996, 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
#include "srec.h"
|
#include "srec.h"
|
||||||
|
#include "arch-utils.h"
|
||||||
|
|
||||||
static serial_t parallel;
|
static serial_t parallel;
|
||||||
static int parallel_in_use;
|
static int parallel_in_use;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Target-dependent code for the NEC V850 for GDB, the GNU debugger.
|
/* Target-dependent code for the NEC V850 for GDB, the GNU debugger.
|
||||||
Copyright 1996, Free Software Foundation, Inc.
|
Copyright 1996, 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
#include "gdb_string.h"
|
#include "gdb_string.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "symfile.h"
|
#include "symfile.h"
|
||||||
|
#include "arch-utils.h"
|
||||||
|
|
||||||
|
|
||||||
static char *v850_generic_reg_names[] = REGISTER_NAMES;
|
static char *v850_generic_reg_names[] = REGISTER_NAMES;
|
||||||
|
|
Loading…
Add table
Reference in a new issue