summaryrefslogtreecommitdiff
path: root/gdb/frame-base.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/frame-base.c')
-rw-r--r--gdb/frame-base.c69
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;
}