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:
Andrew Cagney 2000-06-07 04:38:02 +00:00
parent 17c579bd62
commit b4a2023990
12 changed files with 584 additions and 859 deletions

View file

@ -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>
* configure.in: Enable autoconf to find curses.h on Solaris 2.8.

View file

@ -1363,6 +1363,10 @@ v850ice.o: v850ice.c $(defs_h) $(symtab_h) $(inferior_h) $(command_h) \
$(TCL_CFLAGS) $(TK_CFLAGS) $(X11_CFLAGS) $(GDBTK_CFLAGS)\
$(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) \
$(gdbtypes_h) $(expression_h) $(gdbcmd_h) $(value_h) target.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) \
$(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) \
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) \
$(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) \
$(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) \
$(inferior_h) target.h serial.h terminal.h

View file

@ -295,6 +295,23 @@ similarly.
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.
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.
@ -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
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.
The name is wrong for starters. ``target_signal'' should probably be

View file

@ -223,11 +223,399 @@ generic_register_convertible_not (num)
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
__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);
}

View file

@ -72,4 +72,20 @@ extern const struct floatformat *default_double_format (struct gdbarch *gdbarch)
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

View file

@ -3069,6 +3069,50 @@ struct gdbarch_init_registration
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
register_gdbarch_init (enum bfd_architecture bfd_architecture,
gdbarch_init_ftype *init)
@ -3102,7 +3146,6 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
(*curr)->arches = NULL;
(*curr)->next = NULL;
}
/* Look for an architecture using gdbarch_info. Base search on only
@ -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 */
/* 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;
/* 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);
void
_initialize_gdbarch ()
{
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);
tm_print_insn_info.flavour = bfd_target_unknown_flavour;
tm_print_insn_info.read_memory_func = dis_asm_read_memory;

View file

@ -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 *);
/* 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
matches the information provided by INFO. */
@ -1342,13 +1350,6 @@ extern const struct bfd_arch_info *target_architecture;
#define TARGET_ARCHITECTURE (target_architecture + 0)
#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 */
@ -1397,12 +1398,6 @@ extern disassemble_info tm_print_insn_info;
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
our list. */

View file

@ -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 *);
/* 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
matches the information provided by INFO. */
@ -832,13 +840,6 @@ extern const struct bfd_arch_info *target_architecture;
#define TARGET_ARCHITECTURE (target_architecture + 0)
#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 */
@ -887,12 +888,6 @@ extern disassemble_info tm_print_insn_info;
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
our list. */
@ -1516,6 +1511,50 @@ struct gdbarch_init_registration
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
register_gdbarch_init (enum bfd_architecture bfd_architecture,
gdbarch_init_ftype *init)
@ -1549,7 +1588,6 @@ register_gdbarch_init (enum bfd_architecture bfd_architecture,
(*curr)->arches = NULL;
(*curr)->next = NULL;
}
/* Look for an architecture using gdbarch_info. Base search on only
@ -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 */
/* 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;
/* 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);
void
_initialize_gdbarch ()
{
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);
tm_print_insn_info.flavour = bfd_target_unknown_flavour;
tm_print_insn_info.read_memory_func = dis_asm_read_memory;

View file

@ -29,6 +29,7 @@
#include "symtab.h"
#include "gdbcmd.h"
#include "command.h"
#include "arch-utils.h"
static long i386_get_frame_setup (CORE_ADDR);

View file

@ -1,5 +1,6 @@
/* 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.
@ -35,6 +36,7 @@
#include "dis-asm.h"
#include "inferior.h" /* for BEFORE_TEXT_END etc. */
#include "gdb_string.h"
#include "arch-utils.h"
/* A set of original names, to be used when restoring back to generic
registers from a specific set. */

View file

@ -1,5 +1,5 @@
/* 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.
@ -24,6 +24,7 @@
#include "monitor.h"
#include "serial.h"
#include "srec.h"
#include "arch-utils.h"
static serial_t parallel;
static int parallel_in_use;

View file

@ -1,5 +1,5 @@
/* 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.
@ -28,6 +28,7 @@
#include "gdb_string.h"
#include "gdbcore.h"
#include "symfile.h"
#include "arch-utils.h"
static char *v850_generic_reg_names[] = REGISTER_NAMES;