/* Frame unwinder for ia64 frames using the libunwind library.
- Copyright (C) 2003-2014 Free Software Foundation, Inc.
+ Copyright (C) 2003-2019 Free Software Foundation, Inc.
Written by Jeff Johnston, contributed by Red Hat Inc.
#include <dlfcn.h>
-#include "gdb_assert.h"
-#include <string.h>
-
#include "ia64-libunwind-tdep.h"
#include "complaints.h"
+#include "common/preprocessor.h"
/* IA-64 is the only target that currently uses ia64-libunwind-tdep.
Note how UNW_TARGET, UNW_OBJ, etc. are compile time constants below.
static struct gdbarch_data *libunwind_descr_handle;
/* 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 int (*unw_get_saveloc_p) (unw_cursor_t *, unw_regnum_t,
- unw_save_loc_t *);
-static int (*unw_is_signal_frame_p) (unw_cursor_t *);
-static int (*unw_step_p) (unw_cursor_t *);
-static int (*unw_init_remote_p) (unw_cursor_t *, unw_addr_space_t, void *);
-static unw_addr_space_t (*unw_create_addr_space_p) (unw_accessors_t *, int);
-static void (*unw_destroy_addr_space_p) (unw_addr_space_t);
-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, unw_dyn_info_t *,
- void *);
+typedef int (unw_get_reg_p_ftype) (unw_cursor_t *, unw_regnum_t, unw_word_t *);
+static unw_get_reg_p_ftype *unw_get_reg_p;
+typedef int (unw_get_fpreg_p_ftype) (unw_cursor_t *, unw_regnum_t,
+ unw_fpreg_t *);
+static unw_get_fpreg_p_ftype *unw_get_fpreg_p;
+typedef int (unw_get_saveloc_p_ftype) (unw_cursor_t *, unw_regnum_t,
+ unw_save_loc_t *);
+static unw_get_saveloc_p_ftype *unw_get_saveloc_p;
+typedef int (unw_is_signal_frame_p_ftype) (unw_cursor_t *);
+static unw_is_signal_frame_p_ftype *unw_is_signal_frame_p;
+typedef int (unw_step_p_ftype) (unw_cursor_t *);
+static unw_step_p_ftype *unw_step_p;
+typedef int (unw_init_remote_p_ftype) (unw_cursor_t *, unw_addr_space_t,
+ void *);
+static unw_init_remote_p_ftype *unw_init_remote_p;
+typedef unw_addr_space_t (unw_create_addr_space_p_ftype) (unw_accessors_t *,
+ int);
+static unw_create_addr_space_p_ftype *unw_create_addr_space_p;
+typedef void (unw_destroy_addr_space_p_ftype) (unw_addr_space_t);
+static unw_destroy_addr_space_p_ftype *unw_destroy_addr_space_p;
+typedef int (unw_search_unwind_table_p_ftype) (unw_addr_space_t, unw_word_t,
+ unw_dyn_info_t *,
+ unw_proc_info_t *, int, void *);
+static unw_search_unwind_table_p_ftype *unw_search_unwind_table_p;
+typedef unw_word_t (unw_find_dyn_list_p_ftype) (unw_addr_space_t,
+ unw_dyn_info_t *, void *);
+static unw_find_dyn_list_p_ftype *unw_find_dyn_list_p;
struct libunwind_frame_cache
/* We need to qualify the function names with a platform-specific prefix
to match the names used by the libunwind library. The UNW_OBJ macro is
provided by the libunwind.h header file. */
-#define STRINGIFY2(name) #name
-#define STRINGIFY(name) STRINGIFY2(name)
#ifndef LIBUNWIND_SO
/* Use the stable ABI major version number. `libunwind-ia64.so' is a link time
#define LIBUNWIND_SO_7 "libunwind-" STRINGIFY(UNW_TARGET) ".so.7"
#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));
-static char *is_signal_frame_name = STRINGIFY(UNW_OBJ(is_signal_frame));
-static char *step_name = STRINGIFY(UNW_OBJ(step));
-static char *init_remote_name = STRINGIFY(UNW_OBJ(init_remote));
-static char *create_addr_space_name = STRINGIFY(UNW_OBJ(create_addr_space));
-static char *destroy_addr_space_name = STRINGIFY(UNW_OBJ(destroy_addr_space));
-static char *search_unwind_table_name
+static const char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
+static const char *get_fpreg_name = STRINGIFY(UNW_OBJ(get_fpreg));
+static const char *get_saveloc_name = STRINGIFY(UNW_OBJ(get_save_loc));
+static const char *is_signal_frame_name = STRINGIFY(UNW_OBJ(is_signal_frame));
+static const char *step_name = STRINGIFY(UNW_OBJ(step));
+static const char *init_remote_name = STRINGIFY(UNW_OBJ(init_remote));
+static const char *create_addr_space_name
+ = STRINGIFY(UNW_OBJ(create_addr_space));
+static const char *destroy_addr_space_name
+ = STRINGIFY(UNW_OBJ(destroy_addr_space));
+static const char *search_unwind_table_name
= STRINGIFY(UNW_OBJ(search_unwind_table));
-static char *find_dyn_list_name = STRINGIFY(UNW_OBJ(find_dyn_list));
+static const char *find_dyn_list_name = STRINGIFY(UNW_OBJ(find_dyn_list));
static struct libunwind_descr *
libunwind_descr (struct gdbarch *gdbarch)
{
- return gdbarch_data (gdbarch, libunwind_descr_handle);
+ return ((struct libunwind_descr *)
+ gdbarch_data (gdbarch, libunwind_descr_handle));
}
static void *
gdb_assert (gdbarch != NULL);
- arch_descr = gdbarch_data (gdbarch, libunwind_descr_handle);
+ arch_descr = ((struct libunwind_descr *)
+ gdbarch_data (gdbarch, libunwind_descr_handle));
if (arch_descr == NULL)
{
/* First time here. Must initialize data area. */
- arch_descr = libunwind_descr_init (gdbarch);
+ arch_descr = (struct libunwind_descr *) libunwind_descr_init (gdbarch);
deprecated_set_gdbarch_data (gdbarch,
libunwind_descr_handle, arch_descr);
}
struct libunwind_frame_cache *cache;
struct libunwind_descr *descr;
struct gdbarch *gdbarch = get_frame_arch (this_frame);
- int i, ret;
+ int ret;
if (*this_cache)
- return *this_cache;
+ return (struct libunwind_frame_cache *) *this_cache;
/* Allocate a new cache. */
cache = FRAME_OBSTACK_ZALLOC (struct libunwind_frame_cache);
use this cursor to find previous registers via the unw_get_reg
interface which will invoke libunwind's special logic. */
descr = libunwind_descr (gdbarch);
- acc = descr->accessors;
+ acc = (unw_accessors_t *) descr->accessors;
as = unw_create_addr_space_p (acc,
gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
void
libunwind_frame_dealloc_cache (struct frame_info *self, void *this_cache)
{
- struct libunwind_frame_cache *cache = this_cache;
+ struct libunwind_frame_cache *cache
+ = (struct libunwind_frame_cache *) this_cache;
if (cache->as)
unw_destroy_addr_space_p (cache->as);
unw_addr_space_t as;
struct libunwind_descr *descr;
struct gdbarch *gdbarch = get_frame_arch (this_frame);
- int i, ret;
+ int ret;
/* To test for libunwind unwind support, initialize a cursor to
the current frame and try to back up. We use this same method
it has found sufficient libunwind unwinding information to do so. */
descr = libunwind_descr (gdbarch);
- acc = descr->accessors;
+ acc = (unw_accessors_t *) descr->accessors;
as = unw_create_addr_space_p (acc,
gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
{
struct libunwind_frame_cache *cache =
libunwind_frame_cache (this_frame, this_cache);
- struct gdbarch *gdbarch = get_frame_arch (this_frame);
- void *ptr;
- unw_cursor_t *c;
unw_save_loc_t sl;
- int i, ret;
+ int ret;
unw_word_t intval;
unw_fpreg_t fpval;
unw_regnum_t uw_regnum;
libunwind_search_unwind_table (void *as, long ip, void *di,
void *pi, int need_unwind_info, void *args)
{
- return unw_search_unwind_table_p (*(unw_addr_space_t *)as, (unw_word_t )ip,
- di, pi, need_unwind_info, args);
+ return unw_search_unwind_table_p (*(unw_addr_space_t *) as, (unw_word_t) ip,
+ (unw_dyn_info_t *) di,
+ (unw_proc_info_t *) pi, need_unwind_info,
+ args);
}
/* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */
unw_addr_space_t as;
struct libunwind_descr *descr;
struct gdbarch *gdbarch = get_frame_arch (this_frame);
- int i, ret;
+ int ret;
/* To test for libunwind unwind support, initialize a cursor to the
current frame and try to back up. We use this same method when
so. */
descr = libunwind_descr (gdbarch);
- acc = descr->accessors;
+ acc = (unw_accessors_t *) descr->accessors;
as = unw_create_addr_space_p (acc,
gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
are usually located at BOF, this is not always true and only the libunwind
info can decipher where they actually are. */
int
-libunwind_get_reg_special (struct gdbarch *gdbarch, struct regcache *regcache,
+libunwind_get_reg_special (struct gdbarch *gdbarch, readable_regcache *regcache,
int regnum, void *buf)
{
unw_cursor_t cursor;
descr = libunwind_descr (gdbarch);
- acc = descr->special_accessors;
+ acc = (unw_accessors_t *) descr->special_accessors;
as = unw_create_addr_space_p (acc,
gdbarch_byte_order (gdbarch)
== BFD_ENDIAN_BIG
/* Initialize pointers to the dynamic library functions we will use. */
- unw_get_reg_p = dlsym (handle, get_reg_name);
+ unw_get_reg_p = (unw_get_reg_p_ftype *) dlsym (handle, get_reg_name);
if (unw_get_reg_p == NULL)
return 0;
- unw_get_fpreg_p = dlsym (handle, get_fpreg_name);
+ unw_get_fpreg_p = (unw_get_fpreg_p_ftype *) dlsym (handle, get_fpreg_name);
if (unw_get_fpreg_p == NULL)
return 0;
- unw_get_saveloc_p = dlsym (handle, get_saveloc_name);
+ unw_get_saveloc_p
+ = (unw_get_saveloc_p_ftype *) dlsym (handle, get_saveloc_name);
if (unw_get_saveloc_p == NULL)
return 0;
- unw_is_signal_frame_p = dlsym (handle, is_signal_frame_name);
+ unw_is_signal_frame_p
+ = (unw_is_signal_frame_p_ftype *) dlsym (handle, is_signal_frame_name);
if (unw_is_signal_frame_p == NULL)
return 0;
- unw_step_p = dlsym (handle, step_name);
+ unw_step_p = (unw_step_p_ftype *) dlsym (handle, step_name);
if (unw_step_p == NULL)
return 0;
- unw_init_remote_p = dlsym (handle, init_remote_name);
+ unw_init_remote_p
+ = (unw_init_remote_p_ftype *) dlsym (handle, init_remote_name);
if (unw_init_remote_p == NULL)
return 0;
- unw_create_addr_space_p = dlsym (handle, create_addr_space_name);
+ unw_create_addr_space_p
+ = (unw_create_addr_space_p_ftype *) dlsym (handle, create_addr_space_name);
if (unw_create_addr_space_p == NULL)
return 0;
- unw_destroy_addr_space_p = dlsym (handle, destroy_addr_space_name);
+ unw_destroy_addr_space_p
+ = (unw_destroy_addr_space_p_ftype *) dlsym (handle,
+ destroy_addr_space_name);
if (unw_destroy_addr_space_p == NULL)
return 0;
- unw_search_unwind_table_p = dlsym (handle, search_unwind_table_name);
+ unw_search_unwind_table_p
+ = (unw_search_unwind_table_p_ftype *) dlsym (handle,
+ search_unwind_table_name);
if (unw_search_unwind_table_p == NULL)
return 0;
- unw_find_dyn_list_p = dlsym (handle, find_dyn_list_name);
+ unw_find_dyn_list_p
+ = (unw_find_dyn_list_p_ftype *) dlsym (handle, find_dyn_list_name);
if (unw_find_dyn_list_p == NULL)
return 0;
return libunwind_initialized;
}
-/* Provide a prototype to silence -Wmissing-prototypes. */
-void _initialize_libunwind_frame (void);
-
void
_initialize_libunwind_frame (void)
{