diff options
Diffstat (limited to 'gdb/frame-base.c')
-rw-r--r-- | gdb/frame-base.c | 69 |
1 files changed, 26 insertions, 43 deletions
diff --git a/gdb/frame-base.c b/gdb/frame-base.c index 80adb432e5f..6d0f8aedc8d 100644 --- a/gdb/frame-base.c +++ b/gdb/frame-base.c @@ -1,6 +1,6 @@ /* Definitions for frame address handler, for GDB, the GNU debugger. - Copyright 2003 Free Software Foundation, Inc. + Copyright 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -30,16 +30,14 @@ really need to override this. */ static CORE_ADDR -default_frame_base_address (const struct frame_base *self, - struct frame_info *next_frame, void **this_cache) +default_frame_base_address (struct frame_info *next_frame, void **this_cache) { struct frame_info *this_frame = get_prev_frame (next_frame); return get_frame_base (this_frame); /* sigh! */ } static CORE_ADDR -default_frame_locals_address (const struct frame_base *self, - struct frame_info *next_frame, void **this_cache) +default_frame_locals_address (struct frame_info *next_frame, void **this_cache) { if (DEPRECATED_FRAME_LOCALS_ADDRESS_P ()) { @@ -48,22 +46,21 @@ default_frame_locals_address (const struct frame_base *self, struct frame_info *this_frame = get_prev_frame (next_frame); return DEPRECATED_FRAME_LOCALS_ADDRESS (this_frame); } - return default_frame_base_address (self, next_frame, this_cache); + return default_frame_base_address (next_frame, this_cache); } static CORE_ADDR -default_frame_args_address (const struct frame_base *self, - struct frame_info *next_frame, void **this_cache) +default_frame_args_address (struct frame_info *next_frame, void **this_cache) { if (DEPRECATED_FRAME_ARGS_ADDRESS_P ()) { struct frame_info *this_frame = get_prev_frame (next_frame); return DEPRECATED_FRAME_ARGS_ADDRESS (this_frame); } - return default_frame_base_address (self, next_frame, this_cache); + return default_frame_base_address (next_frame, this_cache); } -static const struct frame_base default_frame_base = { +const struct frame_base default_frame_base = { NULL, /* No parent. */ default_frame_base_address, default_frame_locals_address, @@ -74,51 +71,35 @@ static struct gdbarch_data *frame_base_data; struct frame_base_table_entry { - const struct frame_base_sniffer *sniffer; + frame_base_sniffer_ftype *sniffer; struct frame_base_table_entry *next; }; struct frame_base_table { - struct frame_base_table_entry *first; + struct frame_base_table_entry *head; + struct frame_base_table_entry **tail; const struct frame_base *default_base; }; static void * frame_base_init (struct obstack *obstack) { - return OBSTACK_ZALLOC (obstack, struct frame_base_table); -} - -/* Append a predicate to the end of the table. */ -static void -append_predicate (struct gdbarch *gdbarch, - const struct frame_base_sniffer *sniffer) -{ - struct frame_base_table *table = gdbarch_data (gdbarch, frame_base_data); - struct frame_base_table_entry **entry; - - for (entry = &table->first; (*entry) != NULL; entry = &(*entry)->next); - (*entry) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_base_table_entry); - (*entry)->sniffer = sniffer; + struct frame_base_table *table + = OBSTACK_ZALLOC (obstack, struct frame_base_table); + table->tail = &table->head; + table->default_base = &default_frame_base; + return table; } void frame_base_append_sniffer (struct gdbarch *gdbarch, frame_base_sniffer_ftype *sniffer) { - struct frame_base_sniffer *base_sniffer; - - base_sniffer = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_base_sniffer); - base_sniffer->sniffer = sniffer; - append_predicate (gdbarch, base_sniffer); -} - -void -frame_base_sniffer_append (struct gdbarch *gdbarch, - const struct frame_base_sniffer *sniffer) -{ - append_predicate (gdbarch, sniffer); + struct frame_base_table *table = gdbarch_data (gdbarch, frame_base_data); + (*table->tail) = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_base_table_entry); + (*table->tail)->sniffer = sniffer; + table->tail = &(*table->tail)->next; } void @@ -130,17 +111,19 @@ frame_base_set_default (struct gdbarch *gdbarch, } const struct frame_base * -frame_base_find_by_frame (struct frame_info *next_frame) +frame_base_find_by_frame (struct frame_info *next_frame, + void **this_base_cache, + const struct frame_unwind *unwinder, + void **this_prologue_cache) { struct gdbarch *gdbarch = get_frame_arch (next_frame); struct frame_base_table *table = gdbarch_data (gdbarch, frame_base_data); struct frame_base_table_entry *entry; - for (entry = table->first; entry != NULL; entry = entry->next) + for (entry = table->head; entry != NULL; entry = entry->next) { - const struct frame_base *desc; - - desc = entry->sniffer->sniffer (entry->sniffer, next_frame); + const struct frame_base *desc = NULL; + desc = entry->sniffer (next_frame); if (desc != NULL) return desc; } |