#include "defs.h"
#include "frame.h"
#include "frame-unwind.h"
#include "gdb_assert.h"
#include "dummy-frame.h"
static struct gdbarch_data *frame_unwind_data;
struct frame_unwind_table
{
frame_unwind_p_ftype **p;
int middle;
int nr;
};
static void
append_predicate (struct frame_unwind_table *table, frame_unwind_p_ftype *p)
{
table->p = xrealloc (table->p, ((table->nr + 1)
* sizeof (frame_unwind_p_ftype *)));
table->p[table->nr] = p;
table->nr++;
}
static void *
frame_unwind_init (struct gdbarch *gdbarch)
{
struct frame_unwind_table *table = XCALLOC (1, struct frame_unwind_table);
append_predicate (table, dummy_frame_p);
return table;
}
static void
frame_unwind_free (struct gdbarch *gdbarch, void *data)
{
struct frame_unwind_table *table =
gdbarch_data (gdbarch, frame_unwind_data);
xfree (table->p);
xfree (table);
}
void
frame_unwind_append_predicate (struct gdbarch *gdbarch,
frame_unwind_p_ftype *p)
{
struct frame_unwind_table *table =
gdbarch_data (gdbarch, frame_unwind_data);
if (table == NULL)
{
table = frame_unwind_init (gdbarch);
set_gdbarch_data (gdbarch, frame_unwind_data, table);
}
append_predicate (table, p);
}
const struct frame_unwind *
frame_unwind_find_by_pc (struct gdbarch *gdbarch, CORE_ADDR pc)
{
int i;
struct frame_unwind_table *table =
gdbarch_data (gdbarch, frame_unwind_data);
if (!DEPRECATED_USE_GENERIC_DUMMY_FRAMES)
return trad_frame_unwind;
for (i = 0; i < table->nr; i++)
{
const struct frame_unwind *desc = table->p[i] (pc);
if (desc != NULL)
return desc;
}
return trad_frame_unwind;
}
void
_initialize_frame_unwind (void)
{
frame_unwind_data = register_gdbarch_data (frame_unwind_init,
frame_unwind_free);
}