mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-26 03:24:41 +08:00
* alpha-tdep.c (alpha_abi_handler): New structure to describe
an Alpha ABI variant. (alpha_abi_handler_list): Declare. (alpha_gdbarch_register_os_abi): New function. (alpha_gdbarch_init): Give registered ABI variant handlers a chance to tweak the gdbarch once we have set up defaults. * alpha-tdep.h: Prototype alpha_gdbarch_register_os_abi.
This commit is contained in:
parent
65585be4ba
commit
44dffaac91
@ -1,3 +1,13 @@
|
||||
2002-04-21 Jason Thorpe <thorpej@wasabisystems.com>
|
||||
|
||||
* alpha-tdep.c (alpha_abi_handler): New structure to describe
|
||||
an Alpha ABI variant.
|
||||
(alpha_abi_handler_list): Declare.
|
||||
(alpha_gdbarch_register_os_abi): New function.
|
||||
(alpha_gdbarch_init): Give registered ABI variant handlers a
|
||||
chance to tweak the gdbarch once we have set up defaults.
|
||||
* alpha-tdep.h: Prototype alpha_gdbarch_register_os_abi.
|
||||
|
||||
2002-04-21 Jason Thorpe <thorpej@wasabisystems.com>
|
||||
|
||||
* alpha-tdep.c (alpha_gdbarch_init): Set coerce_float_to_double
|
||||
|
@ -1902,6 +1902,44 @@ get_elfosabi (bfd *abfd)
|
||||
return ALPHA_ABI_UNKNOWN;
|
||||
}
|
||||
|
||||
struct alpha_abi_handler
|
||||
{
|
||||
struct alpha_abi_handler *next;
|
||||
enum alpha_abi abi;
|
||||
void (*init_abi)(struct gdbarch_info, struct gdbarch *);
|
||||
};
|
||||
|
||||
struct alpha_abi_handler *alpha_abi_handler_list = NULL;
|
||||
|
||||
void
|
||||
alpha_gdbarch_register_os_abi (enum alpha_abi abi,
|
||||
void (*init_abi)(struct gdbarch_info,
|
||||
struct gdbarch *))
|
||||
{
|
||||
struct alpha_abi_handler **handler_p;
|
||||
|
||||
for (handler_p = &alpha_abi_handler_list; *handler_p != NULL;
|
||||
handler_p = &(*handler_p)->next)
|
||||
{
|
||||
if ((*handler_p)->abi == abi)
|
||||
{
|
||||
internal_error
|
||||
(__FILE__, __LINE__,
|
||||
"alpha_gdbarch_register_os_abi: A handler for this ABI variant "
|
||||
"(%d) has already been registered", (int) abi);
|
||||
/* If user wants to continue, override previous definition. */
|
||||
(*handler_p)->init_abi = init_abi;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
(*handler_p)
|
||||
= (struct alpha_abi_handler *) xmalloc (sizeof (struct alpha_abi_handler));
|
||||
(*handler_p)->next = NULL;
|
||||
(*handler_p)->abi = abi;
|
||||
(*handler_p)->init_abi = init_abi;
|
||||
}
|
||||
|
||||
/* Initialize the current architecture based on INFO. If possible, re-use an
|
||||
architecture from ARCHES, which is a list of architectures already created
|
||||
during this debugging session.
|
||||
@ -1915,6 +1953,7 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
struct gdbarch_tdep *tdep;
|
||||
struct gdbarch *gdbarch;
|
||||
enum alpha_abi alpha_abi = ALPHA_ABI_UNKNOWN;
|
||||
struct alpha_abi_handler *abi_handler;
|
||||
|
||||
/* Try to determine the ABI of the object we are loading. */
|
||||
|
||||
@ -2065,6 +2104,40 @@ alpha_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
||||
set_gdbarch_decr_pc_after_break (gdbarch, 4);
|
||||
set_gdbarch_frame_args_skip (gdbarch, 0);
|
||||
|
||||
/* Hook in ABI-specific overrides, if they have been registered. */
|
||||
if (alpha_abi == ALPHA_ABI_UNKNOWN)
|
||||
{
|
||||
/* Don't complain about not knowing the ABI variant if we don't
|
||||
have an inferior. */
|
||||
if (info.abfd)
|
||||
fprintf_filtered
|
||||
(gdb_stderr, "GDB doesn't recognize the ABI of the inferior. "
|
||||
"Attempting to continue with the default Alpha settings");
|
||||
}
|
||||
else
|
||||
{
|
||||
for (abi_handler = alpha_abi_handler_list; abi_handler != NULL;
|
||||
abi_handler = abi_handler->next)
|
||||
if (abi_handler->abi == alpha_abi)
|
||||
break;
|
||||
|
||||
if (abi_handler)
|
||||
abi_handler->init_abi (info, gdbarch);
|
||||
else
|
||||
{
|
||||
/* We assume that if GDB_MULTI_ARCH is less than
|
||||
GDB_MULTI_ARCH_TM that an ABI variant can be supported by
|
||||
overriding definitions in this file. */
|
||||
if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL)
|
||||
fprintf_filtered
|
||||
(gdb_stderr,
|
||||
"A handler for the ABI variant \"%s\" is not built into this "
|
||||
"configuration of GDB. "
|
||||
"Attempting to continue with the default Alpha settings",
|
||||
alpha_abi_names[alpha_abi]);
|
||||
}
|
||||
}
|
||||
|
||||
return gdbarch;
|
||||
}
|
||||
|
||||
|
@ -98,4 +98,8 @@ struct gdbarch_tdep
|
||||
CORE_ADDR vm_min_address; /* used by heuristic_proc_start */
|
||||
};
|
||||
|
||||
void alpha_gdbarch_register_os_abi (enum alpha_abi,
|
||||
void (*init_abi)(struct gdbarch_info,
|
||||
struct gdbarch *));
|
||||
|
||||
#endif /* ALPHA_TDEP_H */
|
||||
|
Loading…
Reference in New Issue
Block a user