Change inferior thread list to be a thread map
[deliverable/binutils-gdb.git] / gdb / ia64-libunwind-tdep.c
index dec4547ce380ac7bf88a7d4af97515e628dbfc5e..9efe637c37a8b0925ca7412fa24444f5447b393e 100644 (file)
@@ -1,6 +1,6 @@
 /* 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 <string.h>
-
 #include "ia64-libunwind-tdep.h"
 
 #include "complaints.h"
+#include "gdbsupport/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.
@@ -61,20 +60,33 @@ static int libunwind_initialized;
 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
@@ -88,8 +100,6 @@ 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
@@ -101,22 +111,25 @@ struct libunwind_frame_cache
 #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 *
@@ -136,12 +149,13 @@ libunwind_frame_set_descr (struct gdbarch *gdbarch,
 
   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);
     }
@@ -164,10 +178,10 @@ libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
   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);
@@ -183,7 +197,7 @@ libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
        The best we can do, in that case, is use the frame PC as the function
        address.  We don't need to give up since we still have the unwind
        record to help us perform the unwinding.  There is also another
-       compelling to continue, because abandonning now means stopping
+       compelling to continue, because abandoning now means stopping
        the backtrace, which can never be helpful for the user.  */
     cache->func_addr = get_frame_pc (this_frame);
 
@@ -199,7 +213,7 @@ libunwind_frame_cache (struct frame_info *this_frame, void **this_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
@@ -232,7 +246,8 @@ libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
 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);
@@ -255,7 +270,7 @@ libunwind_frame_sniffer (const struct frame_unwind *self,
   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
@@ -264,7 +279,7 @@ libunwind_frame_sniffer (const struct frame_unwind *self,
      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
@@ -309,12 +324,9 @@ libunwind_frame_prev_register (struct frame_info *this_frame,
 {
   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;
@@ -382,8 +394,10 @@ int
 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.  */
@@ -397,7 +411,7 @@ libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
   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
@@ -407,7 +421,7 @@ libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
      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
@@ -437,7 +451,7 @@ libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
    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;
@@ -452,7 +466,7 @@ libunwind_get_reg_special (struct gdbarch *gdbarch, struct regcache *regcache,
 
 
   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
@@ -519,43 +533,52 @@ libunwind_load (void)
 
   /* 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;
    
@@ -568,9 +591,6 @@ libunwind_is_initialized (void)
   return libunwind_initialized;
 }
 
-/* Provide a prototype to silence -Wmissing-prototypes.  */
-void _initialize_libunwind_frame (void);
-
 void
 _initialize_libunwind_frame (void)
 {
This page took 0.030082 seconds and 4 git commands to generate.