Fix logic selecting a new architecture. Use the sequence:

o	provided by INFO
	o	hard-wired by (gdb) set ...
	o	reversed engineered from INFO.abfd
	o	default to previous architecture
This commit is contained in:
Andrew Cagney 2001-05-14 16:43:35 +00:00
parent 4ed00bba84
commit b732d07d86
5 changed files with 112 additions and 123 deletions

View File

@ -1,3 +1,12 @@
2001-05-12 Andrew Cagney <ac131313@redhat.com>
* gdbarch.sh (struct gdbarch_info): Delete field bfd_architecture.
(gdbarch_update_p): Rewrite logic filling in INFO struct. Use
user specified values when available.
* rs6000-tdep.c (rs6000_gdbarch_init): Update. Get the
architecture from info.bfd_arch_info.
* gdbarch.c, gdbarch.h: Regenerate.
2001-05-12 Fernando Nasser <fnasser@redhat.com>
* remote-e7000.c (e7000_open): Check for bad baud rate.

View File

@ -4644,56 +4644,40 @@ gdbarch_update_p (struct gdbarch_info info)
struct gdbarch_list **list;
struct gdbarch_registration *rego;
/* Fill in any missing bits. Most important is the bfd_architecture
which is used to select the target architecture. */
if (info.bfd_architecture == bfd_arch_unknown)
{
if (info.bfd_arch_info != NULL)
info.bfd_architecture = info.bfd_arch_info->arch;
else if (info.abfd != NULL)
info.bfd_architecture = bfd_get_arch (info.abfd);
/* FIXME - should query BFD for its default architecture. */
else
info.bfd_architecture = current_gdbarch->bfd_arch_info->arch;
}
if (info.bfd_arch_info == NULL)
{
if (target_architecture_auto && info.abfd != NULL)
info.bfd_arch_info = bfd_get_arch_info (info.abfd);
else
info.bfd_arch_info = current_gdbarch->bfd_arch_info;
}
if (info.byte_order == 0)
{
if (target_byte_order_auto && info.abfd != NULL)
info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
: bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
: 0);
else
info.byte_order = current_gdbarch->byte_order;
/* FIXME - should query BFD for its default byte-order. */
}
/* A default for abfd? */
/* Fill in missing parts of the INFO struct using a number of
sources: ``set ...''; INFOabfd supplied; existing target. */
/* Find the target that knows about this architecture. */
for (rego = gdbarch_registry;
rego != NULL;
rego = rego->next)
if (rego->bfd_architecture == info.bfd_architecture)
break;
if (rego == NULL)
{
if (gdbarch_debug)
fprintf_unfiltered (gdb_stdlog, "gdbarch_update: No matching architecture\n");
return 0;
}
/* ``(gdb) set architecture ...'' */
if (info.bfd_arch_info == NULL
&& !TARGET_ARCHITECTURE_AUTO)
info.bfd_arch_info = TARGET_ARCHITECTURE;
if (info.bfd_arch_info == NULL
&& info.abfd != NULL
&& bfd_get_arch (info.abfd) != bfd_arch_unknown
&& bfd_get_arch (info.abfd) != bfd_arch_obscure)
info.bfd_arch_info = bfd_get_arch_info (info.abfd);
if (info.bfd_arch_info == NULL)
info.bfd_arch_info = TARGET_ARCHITECTURE;
/* ``(gdb) set byte-order ...'' */
if (info.byte_order == 0
&& !TARGET_BYTE_ORDER_AUTO)
info.byte_order = TARGET_BYTE_ORDER;
/* From the INFO struct. */
if (info.byte_order == 0
&& info.abfd != NULL)
info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
: bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
: 0);
/* From the current target. */
if (info.byte_order == 0)
info.byte_order = TARGET_BYTE_ORDER;
/* Must have found some sort of architecture. */
gdb_assert (info.bfd_arch_info != NULL);
if (gdbarch_debug)
{
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.bfd_architecture %d (%s)\n",
info.bfd_architecture,
bfd_lookup_arch (info.bfd_architecture, 0)->printable_name);
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.bfd_arch_info %s\n",
(info.bfd_arch_info != NULL
@ -4713,6 +4697,19 @@ gdbarch_update_p (struct gdbarch_info info)
(long) info.tdep_info);
}
/* Find the target that knows about this architecture. */
for (rego = gdbarch_registry;
rego != NULL;
rego = rego->next)
if (rego->bfd_architecture == info.bfd_arch_info->arch)
break;
if (rego == NULL)
{
if (gdbarch_debug)
fprintf_unfiltered (gdb_stdlog, "gdbarch_update: No matching architecture\n");
return 0;
}
/* Ask the target for a replacement architecture. */
new_gdbarch = rego->init (info, rego->arches);

View File

@ -1607,9 +1607,6 @@ struct gdbarch_list
struct gdbarch_info
{
/* Use default: bfd_arch_unknown (ZERO). */
enum bfd_architecture bfd_architecture;
/* Use default: NULL (ZERO). */
const struct bfd_arch_info *bfd_arch_info;
@ -1663,16 +1660,12 @@ extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gd
extern void gdbarch_free (struct gdbarch *);
/* Helper function. Force an update of the current architecture. Used
by legacy targets that have added their own target specific
architecture manipulation commands.
/* Helper function. Force an update of the current architecture.
The INFO parameter shall be fully initialized (``memset (&INFO,
sizeof (info), 0)'' set relevant fields) before gdbarch_update_p()
is called. gdbarch_update_p() shall initialize any ``default''
fields using information obtained from the previous architecture or
INFO.ABFD (if specified) before calling the corresponding
architectures INIT function.
The actual architecture selected is determined by INFO, ``(gdb) set
architecture'' et.al., the existing architecture and BFD's default
architecture. INFO should be initialized to zero and then selected
fields should be updated.
Returns non-zero if the update succeeds */

View File

@ -838,9 +838,6 @@ struct gdbarch_list
struct gdbarch_info
{
/* Use default: bfd_arch_unknown (ZERO). */
enum bfd_architecture bfd_architecture;
/* Use default: NULL (ZERO). */
const struct bfd_arch_info *bfd_arch_info;
@ -894,16 +891,12 @@ extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gd
extern void gdbarch_free (struct gdbarch *);
/* Helper function. Force an update of the current architecture. Used
by legacy targets that have added their own target specific
architecture manipulation commands.
/* Helper function. Force an update of the current architecture.
The INFO parameter shall be fully initialized (\`\`memset (&INFO,
sizeof (info), 0)'' set relevant fields) before gdbarch_update_p()
is called. gdbarch_update_p() shall initialize any \`\`default''
fields using information obtained from the previous architecture or
INFO.ABFD (if specified) before calling the corresponding
architectures INIT function.
The actual architecture selected is determined by INFO, \`\`(gdb) set
architecture'' et.al., the existing architecture and BFD's default
architecture. INFO should be initialized to zero and then selected
fields should be updated.
Returns non-zero if the update succeeds */
@ -1945,42 +1938,64 @@ gdbarch_update_p (struct gdbarch_info info)
struct gdbarch_list **list;
struct gdbarch_registration *rego;
/* Fill in any missing bits. Most important is the bfd_architecture
which is used to select the target architecture. */
if (info.bfd_architecture == bfd_arch_unknown)
{
if (info.bfd_arch_info != NULL)
info.bfd_architecture = info.bfd_arch_info->arch;
else if (info.abfd != NULL)
info.bfd_architecture = bfd_get_arch (info.abfd);
/* FIXME - should query BFD for its default architecture. */
else
info.bfd_architecture = current_gdbarch->bfd_arch_info->arch;
}
/* Fill in missing parts of the INFO struct using a number of
sources: \`\`set ...''; INFOabfd supplied; existing target. */
/* \`\`(gdb) set architecture ...'' */
if (info.bfd_arch_info == NULL
&& !TARGET_ARCHITECTURE_AUTO)
info.bfd_arch_info = TARGET_ARCHITECTURE;
if (info.bfd_arch_info == NULL
&& info.abfd != NULL
&& bfd_get_arch (info.abfd) != bfd_arch_unknown
&& bfd_get_arch (info.abfd) != bfd_arch_obscure)
info.bfd_arch_info = bfd_get_arch_info (info.abfd);
if (info.bfd_arch_info == NULL)
{
if (target_architecture_auto && info.abfd != NULL)
info.bfd_arch_info = bfd_get_arch_info (info.abfd);
else
info.bfd_arch_info = current_gdbarch->bfd_arch_info;
}
info.bfd_arch_info = TARGET_ARCHITECTURE;
/* \`\`(gdb) set byte-order ...'' */
if (info.byte_order == 0
&& !TARGET_BYTE_ORDER_AUTO)
info.byte_order = TARGET_BYTE_ORDER;
/* From the INFO struct. */
if (info.byte_order == 0
&& info.abfd != NULL)
info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
: bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
: 0);
/* From the current target. */
if (info.byte_order == 0)
info.byte_order = TARGET_BYTE_ORDER;
/* Must have found some sort of architecture. */
gdb_assert (info.bfd_arch_info != NULL);
if (gdbarch_debug)
{
if (target_byte_order_auto && info.abfd != NULL)
info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
: bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
: 0);
else
info.byte_order = current_gdbarch->byte_order;
/* FIXME - should query BFD for its default byte-order. */
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.bfd_arch_info %s\n",
(info.bfd_arch_info != NULL
? info.bfd_arch_info->printable_name
: "(null)"));
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.byte_order %d (%s)\n",
info.byte_order,
(info.byte_order == BIG_ENDIAN ? "big"
: info.byte_order == LITTLE_ENDIAN ? "little"
: "default"));
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.abfd 0x%lx\n",
(long) info.abfd);
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.tdep_info 0x%lx\n",
(long) info.tdep_info);
}
/* A default for abfd? */
/* Find the target that knows about this architecture. */
for (rego = gdbarch_registry;
rego != NULL;
rego = rego->next)
if (rego->bfd_architecture == info.bfd_architecture)
if (rego->bfd_architecture == info.bfd_arch_info->arch)
break;
if (rego == NULL)
{
@ -1989,31 +2004,6 @@ gdbarch_update_p (struct gdbarch_info info)
return 0;
}
if (gdbarch_debug)
{
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.bfd_architecture %d (%s)\\n",
info.bfd_architecture,
bfd_lookup_arch (info.bfd_architecture, 0)->printable_name);
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.bfd_arch_info %s\\n",
(info.bfd_arch_info != NULL
? info.bfd_arch_info->printable_name
: "(null)"));
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.byte_order %d (%s)\\n",
info.byte_order,
(info.byte_order == BIG_ENDIAN ? "big"
: info.byte_order == LITTLE_ENDIAN ? "little"
: "default"));
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.abfd 0x%lx\\n",
(long) info.abfd);
fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: info.tdep_info 0x%lx\\n",
(long) info.tdep_info);
}
/* Ask the target for a replacement architecture. */
new_gdbarch = rego->init (info, rego->arches);

View File

@ -2210,7 +2210,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
if (!from_xcoff_exec)
{
arch = info.bfd_architecture;
arch = info.bfd_arch_info->arch;
mach = info.bfd_arch_info->mach;
}
else