/* Frame unwinder for frames using the libunwind library.
- Copyright 2003 Free Software Foundation, Inc.
+ Copyright 2003, 2004 Free Software Foundation, Inc.
Written by Jeff Johnston, contributed by Red Hat Inc.
static int libunwind_initialized;
static struct gdbarch_data *libunwind_descr_handle;
-#ifndef LIBUNWIND_SO
-#define LIBUNWIND_SO "libunwind.so"
-#endif
-
/* Required function pointers from libunwind. */
static int (*unw_get_reg_p) (unw_cursor_t *, unw_regnum_t, unw_word_t *);
static int (*unw_get_fpreg_p) (unw_cursor_t *, unw_regnum_t, unw_fpreg_t *);
static unw_addr_space_t (*unw_create_addr_space_p) (unw_accessors_t *, int);
static int (*unw_search_unwind_table_p) (unw_addr_space_t, unw_word_t, unw_dyn_info_t *,
unw_proc_info_t *, int, void *);
-static unw_word_t (*unw_find_dyn_list_p) (unw_addr_space_t, void *, size_t,
- unw_word_t, unw_word_t, void *);
+static unw_word_t (*unw_find_dyn_list_p) (unw_addr_space_t, unw_dyn_info_t *,
+ void *);
struct libunwind_frame_cache
#define STRINGIFY2(name) #name
#define STRINGIFY(name) STRINGIFY2(name)
+#ifndef LIBUNWIND_SO
+#define LIBUNWIND_SO "libunwind-" STRINGIFY(UNW_TARGET) ".so"
+#endif
+
static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
static char *get_fpreg_name = STRINGIFY(UNW_OBJ(get_fpreg));
static char *get_saveloc_name = STRINGIFY(UNW_OBJ(get_save_loc));
{
/* First time here. Must initialize data area. */
arch_descr = libunwind_descr_init (gdbarch);
- set_gdbarch_data (gdbarch, libunwind_descr_handle, arch_descr);
+ deprecated_set_gdbarch_data (gdbarch, libunwind_descr_handle, arch_descr);
}
/* Copy new descriptor info into arch descriptor. */
uw_sp_regnum = descr->gdb2uw (SP_REGNUM);
ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp);
if (ret < 0)
- error ("Can't get libunwind sp register.");
+ error (_("Can't get libunwind sp register."));
cache->base = (CORE_ADDR)fp;
return cache;
}
-unw_word_t
-libunwind_find_dyn_list (unw_addr_space_t as, void *table, size_t table_size,
- unw_word_t segbase, unw_word_t gp, void *arg)
+unw_word_t
+libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
{
- return unw_find_dyn_list_p (as, table, table_size, segbase, gp, arg);
+ return unw_find_dyn_list_p (as, di, arg);
}
static const struct frame_unwind libunwind_frame_unwind =
gdb_assert (regnum >= 0);
if (!target_has_registers)
- error ("No registers.");
+ error (_("No registers."));
*optimizedp = 0;
*addrp = 0;
*lvalp = not_lval;
*realnump = -1;
- memset (valuep, 0, register_size (current_gdbarch, regnum));
+ if (valuep)
+ memset (valuep, 0, register_size (current_gdbarch, regnum));
if (uw_regnum < 0)
return;
if (ret < 0)
return;
- memcpy (valuep, ptr, register_size (current_gdbarch, regnum));
+ if (valuep)
+ memcpy (valuep, ptr, register_size (current_gdbarch, regnum));
if (unw_get_saveloc_p (&cache->cursor, uw_regnum, &sl) < 0)
return;
void
_initialize_libunwind_frame (void)
{
- libunwind_descr_handle = register_gdbarch_data (libunwind_descr_init);
+ libunwind_descr_handle = gdbarch_data_register_post_init (libunwind_descr_init);
libunwind_initialized = libunwind_load ();
}