mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-24 02:24:46 +08:00
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:
parent
4ed00bba84
commit
b732d07d86
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
|
118
gdb/gdbarch.sh
118
gdb/gdbarch.sh
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user