GDB (xrefs)
/tmp/gdb-8.1/gdb/ia64-libunwind-tdep.c
Go to the documentation of this file.
1 /* Frame unwinder for ia64 frames using the libunwind library.
2 
3  Copyright (C) 2003-2018 Free Software Foundation, Inc.
4 
5  Written by Jeff Johnston, contributed by Red Hat Inc.
6 
7  This file is part of GDB.
8 
9  This program is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 3 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 
22 #include "defs.h"
23 
24 #include "inferior.h"
25 #include "frame.h"
26 #include "frame-base.h"
27 #include "frame-unwind.h"
28 #include "gdbcore.h"
29 #include "gdbtypes.h"
30 #include "symtab.h"
31 #include "objfiles.h"
32 #include "regcache.h"
33 
34 #include <dlfcn.h>
35 
36 #include "ia64-libunwind-tdep.h"
37 
38 #include "complaints.h"
39 #include "common/preprocessor.h"
40 
41 /* IA-64 is the only target that currently uses ia64-libunwind-tdep.
42  Note how UNW_TARGET, UNW_OBJ, etc. are compile time constants below.
43  Those come from libunwind's headers, and are target dependent.
44  Also, some of libunwind's typedefs are target dependent, as e.g.,
45  unw_word_t. If some other target wants to use this, we will need
46  to do some abstracting in order to make it possible to select which
47  libunwind we're talking to at runtime (and have one per arch). */
48 
49 /* The following two macros are normally defined in <endian.h>.
50  But systems such as ia64-hpux do not provide such header, so
51  we just define them here if not already defined. */
52 #ifndef __LITTLE_ENDIAN
53 #define __LITTLE_ENDIAN 1234
54 #endif
55 #ifndef __BIG_ENDIAN
56 #define __BIG_ENDIAN 4321
57 #endif
58 
61 
62 /* Required function pointers from libunwind. */
63 typedef int (unw_get_reg_p_ftype) (unw_cursor_t *, unw_regnum_t, unw_word_t *);
65 typedef int (unw_get_fpreg_p_ftype) (unw_cursor_t *, unw_regnum_t,
66  unw_fpreg_t *);
68 typedef int (unw_get_saveloc_p_ftype) (unw_cursor_t *, unw_regnum_t,
69  unw_save_loc_t *);
71 typedef int (unw_is_signal_frame_p_ftype) (unw_cursor_t *);
73 typedef int (unw_step_p_ftype) (unw_cursor_t *);
75 typedef int (unw_init_remote_p_ftype) (unw_cursor_t *, unw_addr_space_t,
76  void *);
78 typedef unw_addr_space_t (unw_create_addr_space_p_ftype) (unw_accessors_t *,
79  int);
81 typedef void (unw_destroy_addr_space_p_ftype) (unw_addr_space_t);
83 typedef int (unw_search_unwind_table_p_ftype) (unw_addr_space_t, unw_word_t,
84  unw_dyn_info_t *,
85  unw_proc_info_t *, int, void *);
87 typedef unw_word_t (unw_find_dyn_list_p_ftype) (unw_addr_space_t,
88  unw_dyn_info_t *, void *);
90 
91 
93 {
96  unw_cursor_t cursor;
97  unw_addr_space_t as;
98 };
99 
100 /* We need to qualify the function names with a platform-specific prefix
101  to match the names used by the libunwind library. The UNW_OBJ macro is
102  provided by the libunwind.h header file. */
103 
104 #ifndef LIBUNWIND_SO
105 /* Use the stable ABI major version number. `libunwind-ia64.so' is a link time
106  only library, not a runtime one. */
107 #define LIBUNWIND_SO "libunwind-" STRINGIFY(UNW_TARGET) ".so.8"
108 
109 /* Provide also compatibility with older .so. The two APIs are compatible, .8
110  is only extended a bit, GDB does not use the extended API at all. */
111 #define LIBUNWIND_SO_7 "libunwind-" STRINGIFY(UNW_TARGET) ".so.7"
112 #endif
113 
114 static char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
115 static char *get_fpreg_name = STRINGIFY(UNW_OBJ(get_fpreg));
116 static char *get_saveloc_name = STRINGIFY(UNW_OBJ(get_save_loc));
117 static char *is_signal_frame_name = STRINGIFY(UNW_OBJ(is_signal_frame));
118 static char *step_name = STRINGIFY(UNW_OBJ(step));
119 static char *init_remote_name = STRINGIFY(UNW_OBJ(init_remote));
120 static char *create_addr_space_name = STRINGIFY(UNW_OBJ(create_addr_space));
121 static char *destroy_addr_space_name = STRINGIFY(UNW_OBJ(destroy_addr_space));
122 static char *search_unwind_table_name
123  = STRINGIFY(UNW_OBJ(search_unwind_table));
124 static char *find_dyn_list_name = STRINGIFY(UNW_OBJ(find_dyn_list));
125 
126 static struct libunwind_descr *
128 {
129  return ((struct libunwind_descr *)
131 }
132 
133 static void *
135 {
136  struct libunwind_descr *descr
138 
139  return descr;
140 }
141 
142 void
144  struct libunwind_descr *descr)
145 {
146  struct libunwind_descr *arch_descr;
147 
148  gdb_assert (gdbarch != NULL);
149 
150  arch_descr = ((struct libunwind_descr *)
152 
153  if (arch_descr == NULL)
154  {
155  /* First time here. Must initialize data area. */
156  arch_descr = (struct libunwind_descr *) libunwind_descr_init (gdbarch);
158  libunwind_descr_handle, arch_descr);
159  }
160 
161  /* Copy new descriptor info into arch descriptor. */
162  arch_descr->gdb2uw = descr->gdb2uw;
163  arch_descr->uw2gdb = descr->uw2gdb;
164  arch_descr->is_fpreg = descr->is_fpreg;
165  arch_descr->accessors = descr->accessors;
166  arch_descr->special_accessors = descr->special_accessors;
167 }
168 
169 static struct libunwind_frame_cache *
170 libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
171 {
172  unw_accessors_t *acc;
173  unw_addr_space_t as;
174  unw_word_t fp;
175  unw_regnum_t uw_sp_regnum;
176  struct libunwind_frame_cache *cache;
177  struct libunwind_descr *descr;
178  struct gdbarch *gdbarch = get_frame_arch (this_frame);
179  int i, ret;
180 
181  if (*this_cache)
182  return (struct libunwind_frame_cache *) *this_cache;
183 
184  /* Allocate a new cache. */
186 
187  cache->func_addr = get_frame_func (this_frame);
188  if (cache->func_addr == 0)
189  /* This can happen when the frame corresponds to a function for which
190  there is no debugging information nor any entry in the symbol table.
191  This is probably a static function for which an entry in the symbol
192  table was not created when the objfile got linked (observed in
193  libpthread.so on ia64-hpux).
194 
195  The best we can do, in that case, is use the frame PC as the function
196  address. We don't need to give up since we still have the unwind
197  record to help us perform the unwinding. There is also another
198  compelling to continue, because abandonning now means stopping
199  the backtrace, which can never be helpful for the user. */
200  cache->func_addr = get_frame_pc (this_frame);
201 
202  /* Get a libunwind cursor to the previous frame.
203 
204  We do this by initializing a cursor. Libunwind treats a new cursor
205  as the top of stack and will get the current register set via the
206  libunwind register accessor. Now, we provide the platform-specific
207  accessors and we set up the register accessor to use the frame
208  register unwinding interfaces so that we properly get the registers
209  for the current frame rather than the top. We then use the unw_step
210  function to move the libunwind cursor back one frame. We can later
211  use this cursor to find previous registers via the unw_get_reg
212  interface which will invoke libunwind's special logic. */
213  descr = libunwind_descr (gdbarch);
214  acc = (unw_accessors_t *) descr->accessors;
215  as = unw_create_addr_space_p (acc,
217  == BFD_ENDIAN_BIG
218  ? __BIG_ENDIAN
219  : __LITTLE_ENDIAN);
220 
221  unw_init_remote_p (&cache->cursor, as, this_frame);
222  if (unw_step_p (&cache->cursor) < 0)
223  {
225  return NULL;
226  }
227 
228  /* To get base address, get sp from previous frame. */
229  uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (gdbarch));
230  ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp);
231  if (ret < 0)
232  {
234  error (_("Can't get libunwind sp register."));
235  }
236 
237  cache->base = (CORE_ADDR)fp;
238  cache->as = as;
239 
240  *this_cache = cache;
241  return cache;
242 }
243 
244 void
245 libunwind_frame_dealloc_cache (struct frame_info *self, void *this_cache)
246 {
247  struct libunwind_frame_cache *cache
248  = (struct libunwind_frame_cache *) this_cache;
249 
250  if (cache->as)
251  unw_destroy_addr_space_p (cache->as);
252 }
253 
254 unw_word_t
255 libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
256 {
257  return unw_find_dyn_list_p (as, di, arg);
258 }
259 
260 /* Verify if there is sufficient libunwind information for the frame to use
261  libunwind frame unwinding. */
262 int
264  struct frame_info *this_frame, void **this_cache)
265 {
266  unw_cursor_t cursor;
267  unw_accessors_t *acc;
268  unw_addr_space_t as;
269  struct libunwind_descr *descr;
270  struct gdbarch *gdbarch = get_frame_arch (this_frame);
271  int i, ret;
272 
273  /* To test for libunwind unwind support, initialize a cursor to
274  the current frame and try to back up. We use this same method
275  when setting up the frame cache (see libunwind_frame_cache()).
276  If libunwind returns success for this operation, it means that
277  it has found sufficient libunwind unwinding information to do so. */
278 
279  descr = libunwind_descr (gdbarch);
280  acc = (unw_accessors_t *) descr->accessors;
281  as = unw_create_addr_space_p (acc,
283  == BFD_ENDIAN_BIG
284  ? __BIG_ENDIAN
285  : __LITTLE_ENDIAN);
286 
287  ret = unw_init_remote_p (&cursor, as, this_frame);
288 
289  if (ret < 0)
290  {
292  return 0;
293  }
294 
295 
296  /* Check to see if we have libunwind info by checking if we are in a
297  signal frame. If it doesn't return an error, we have libunwind info
298  and can use libunwind. */
299  ret = unw_is_signal_frame_p (&cursor);
301 
302  if (ret < 0)
303  return 0;
304 
305  return 1;
306 }
307 
308 void
309 libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
310  struct frame_id *this_id)
311 {
312  struct libunwind_frame_cache *cache =
313  libunwind_frame_cache (this_frame, this_cache);
314 
315  if (cache != NULL)
316  (*this_id) = frame_id_build (cache->base, cache->func_addr);
317 }
318 
319 struct value *
321  void **this_cache, int regnum)
322 {
323  struct libunwind_frame_cache *cache =
324  libunwind_frame_cache (this_frame, this_cache);
325  struct gdbarch *gdbarch = get_frame_arch (this_frame);
326 
327  void *ptr;
328  unw_cursor_t *c;
329  unw_save_loc_t sl;
330  int i, ret;
331  unw_word_t intval;
332  unw_fpreg_t fpval;
333  unw_regnum_t uw_regnum;
334  struct libunwind_descr *descr;
335  struct value *val = NULL;
336 
337  if (cache == NULL)
338  return frame_unwind_got_constant (this_frame, regnum, 0);
339 
340  /* Convert from gdb register number to libunwind register number. */
341  descr = libunwind_descr (get_frame_arch (this_frame));
342  uw_regnum = descr->gdb2uw (regnum);
343 
344  gdb_assert (regnum >= 0);
345 
347  error (_("No registers."));
348 
349  if (uw_regnum < 0)
350  return frame_unwind_got_constant (this_frame, regnum, 0);
351 
352  if (unw_get_saveloc_p (&cache->cursor, uw_regnum, &sl) < 0)
353  return frame_unwind_got_constant (this_frame, regnum, 0);
354 
355  switch (sl.type)
356  {
357  case UNW_SLT_MEMORY:
358  val = frame_unwind_got_memory (this_frame, regnum, sl.u.addr);
359  break;
360 
361  case UNW_SLT_REG:
362  val = frame_unwind_got_register (this_frame, regnum,
363  descr->uw2gdb (sl.u.regnum));
364  break;
365  case UNW_SLT_NONE:
366  {
367  /* The register is not stored at a specific memory address nor
368  inside another register. So use libunwind to fetch the register
369  value for us, and create a constant value with the result. */
370  if (descr->is_fpreg (uw_regnum))
371  {
372  ret = unw_get_fpreg_p (&cache->cursor, uw_regnum, &fpval);
373  if (ret < 0)
374  return frame_unwind_got_constant (this_frame, regnum, 0);
375  val = frame_unwind_got_bytes (this_frame, regnum,
376  (gdb_byte *) &fpval);
377  }
378  else
379  {
380  ret = unw_get_reg_p (&cache->cursor, uw_regnum, &intval);
381  if (ret < 0)
382  return frame_unwind_got_constant (this_frame, regnum, 0);
383  val = frame_unwind_got_constant (this_frame, regnum, intval);
384  }
385  break;
386  }
387  }
388 
389  return val;
390 }
391 
392 /* The following is a glue routine to call the libunwind unwind table
393  search function to get unwind information for a specified ip address. */
394 int
395 libunwind_search_unwind_table (void *as, long ip, void *di,
396  void *pi, int need_unwind_info, void *args)
397 {
398  return unw_search_unwind_table_p (*(unw_addr_space_t *) as, (unw_word_t) ip,
399  (unw_dyn_info_t *) di,
400  (unw_proc_info_t *) pi, need_unwind_info,
401  args);
402 }
403 
404 /* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */
405 int
407  struct frame_info *this_frame,
408  void **this_cache)
409 {
410  unw_cursor_t cursor;
411  unw_accessors_t *acc;
412  unw_addr_space_t as;
413  struct libunwind_descr *descr;
414  struct gdbarch *gdbarch = get_frame_arch (this_frame);
415  int i, ret;
416 
417  /* To test for libunwind unwind support, initialize a cursor to the
418  current frame and try to back up. We use this same method when
419  setting up the frame cache (see libunwind_frame_cache()). If
420  libunwind returns success for this operation, it means that it
421  has found sufficient libunwind unwinding information to do
422  so. */
423 
424  descr = libunwind_descr (gdbarch);
425  acc = (unw_accessors_t *) descr->accessors;
426  as = unw_create_addr_space_p (acc,
428  == BFD_ENDIAN_BIG
429  ? __BIG_ENDIAN
430  : __LITTLE_ENDIAN);
431 
432  ret = unw_init_remote_p (&cursor, as, this_frame);
433 
434  if (ret < 0)
435  {
437  return 0;
438  }
439 
440  /* Check to see if we are in a signal frame. */
441  ret = unw_is_signal_frame_p (&cursor);
443  if (ret > 0)
444  return 1;
445 
446  return 0;
447 }
448 
449 /* The following routine is for accessing special registers of the top frame.
450  A special set of accessors must be given that work without frame info.
451  This is used by ia64 to access the rse registers r32-r127. While they
452  are usually located at BOF, this is not always true and only the libunwind
453  info can decipher where they actually are. */
454 int
456  int regnum, void *buf)
457 {
458  unw_cursor_t cursor;
459  unw_accessors_t *acc;
460  unw_addr_space_t as;
461  struct libunwind_descr *descr;
462  int ret;
463  unw_regnum_t uw_regnum;
464  unw_word_t intval;
465  unw_fpreg_t fpval;
466  void *ptr;
467 
468 
469  descr = libunwind_descr (gdbarch);
470  acc = (unw_accessors_t *) descr->special_accessors;
471  as = unw_create_addr_space_p (acc,
473  == BFD_ENDIAN_BIG
474  ? __BIG_ENDIAN
475  : __LITTLE_ENDIAN);
476 
477  ret = unw_init_remote_p (&cursor, as, regcache);
478  if (ret < 0)
479  {
481  return -1;
482  }
483 
484  uw_regnum = descr->gdb2uw (regnum);
485 
486  if (descr->is_fpreg (uw_regnum))
487  {
488  ret = unw_get_fpreg_p (&cursor, uw_regnum, &fpval);
489  ptr = &fpval;
490  }
491  else
492  {
493  ret = unw_get_reg_p (&cursor, uw_regnum, &intval);
494  ptr = &intval;
495  }
496 
498 
499  if (ret < 0)
500  return -1;
501 
502  if (buf)
503  memcpy (buf, ptr, register_size (gdbarch, regnum));
504 
505  return 0;
506 }
507 
508 static int
510 {
511  void *handle;
512  char *so_error = NULL;
513 
514  handle = dlopen (LIBUNWIND_SO, RTLD_NOW);
515  if (handle == NULL)
516  {
517  so_error = xstrdup (dlerror ());
518 #ifdef LIBUNWIND_SO_7
519  handle = dlopen (LIBUNWIND_SO_7, RTLD_NOW);
520 #endif /* LIBUNWIND_SO_7 */
521  }
522  if (handle == NULL)
523  {
524  fprintf_unfiltered (gdb_stderr, _("[GDB failed to load %s: %s]\n"),
525  LIBUNWIND_SO, so_error);
526 #ifdef LIBUNWIND_SO_7
527  fprintf_unfiltered (gdb_stderr, _("[GDB failed to load %s: %s]\n"),
528  LIBUNWIND_SO_7, dlerror ());
529 #endif /* LIBUNWIND_SO_7 */
530  }
531  xfree (so_error);
532  if (handle == NULL)
533  return 0;
534 
535  /* Initialize pointers to the dynamic library functions we will use. */
536 
537  unw_get_reg_p = (unw_get_reg_p_ftype *) dlsym (handle, get_reg_name);
538  if (unw_get_reg_p == NULL)
539  return 0;
540 
542  if (unw_get_fpreg_p == NULL)
543  return 0;
544 
546  = (unw_get_saveloc_p_ftype *) dlsym (handle, get_saveloc_name);
547  if (unw_get_saveloc_p == NULL)
548  return 0;
549 
552  if (unw_is_signal_frame_p == NULL)
553  return 0;
554 
555  unw_step_p = (unw_step_p_ftype *) dlsym (handle, step_name);
556  if (unw_step_p == NULL)
557  return 0;
558 
560  = (unw_init_remote_p_ftype *) dlsym (handle, init_remote_name);
561  if (unw_init_remote_p == NULL)
562  return 0;
563 
566  if (unw_create_addr_space_p == NULL)
567  return 0;
568 
570  = (unw_destroy_addr_space_p_ftype *) dlsym (handle,
572  if (unw_destroy_addr_space_p == NULL)
573  return 0;
574 
576  = (unw_search_unwind_table_p_ftype *) dlsym (handle,
578  if (unw_search_unwind_table_p == NULL)
579  return 0;
580 
582  = (unw_find_dyn_list_p_ftype *) dlsym (handle, find_dyn_list_name);
583  if (unw_find_dyn_list_p == NULL)
584  return 0;
585 
586  return 1;
587 }
588 
589 int
591 {
592  return libunwind_initialized;
593 }
594 
595 void
597 {
600 
602 }
static unw_step_p_ftype * unw_step_p
#define target_has_registers
Definition: target.h:1740
static char * get_saveloc_name
void libunwind_frame_set_descr(struct gdbarch *gdbarch, struct libunwind_descr *descr)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:624
struct value * frame_unwind_got_bytes(struct frame_info *frame, int regnum, gdb_byte *buf)
Definition: frame-unwind.c:260
#define __LITTLE_ENDIAN
static unw_get_fpreg_p_ftype * unw_get_fpreg_p
CORE_ADDR get_frame_pc(struct frame_info *frame)
Definition: frame.c:2376
int() unw_step_p_ftype(unw_cursor_t *)
static char * is_signal_frame_name
bfd_vma CORE_ADDR
Definition: common-types.h:41
static void * libunwind_descr_init(struct gdbarch *gdbarch)
static unw_destroy_addr_space_p_ftype * unw_destroy_addr_space_p
void xfree(void *)
void libunwind_frame_dealloc_cache(struct frame_info *self, void *this_cache)
struct value * frame_unwind_got_memory(struct frame_info *frame, int regnum, CORE_ADDR addr)
Definition: frame-unwind.c:233
static char * find_dyn_list_name
void libunwind_frame_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
static char * search_unwind_table_name
static char * step_name
#define _(String)
Definition: gdb_locale.h:35
unw_word_t() unw_find_dyn_list_p_ftype(unw_addr_space_t, unw_dyn_info_t *, void *)
static struct gdbarch_data * libunwind_descr_handle
#define FRAME_OBSTACK_ZALLOC(TYPE)
Definition: frame.h:678
static unw_find_dyn_list_p_ftype * unw_find_dyn_list_p
static char * init_remote_name
#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE)
Definition: gdbarch.h:1709
struct value * frame_unwind_got_constant(struct frame_info *frame, int regnum, ULONGEST val)
Definition: frame-unwind.c:246
#define LIBUNWIND_SO
int() unw_get_reg_p_ftype(unw_cursor_t *, unw_regnum_t, unw_word_t *)
static char * get_reg_name
void _initialize_libunwind_frame(void)
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_init_remote_p_ftype * unw_init_remote_p
int gdbarch_sp_regnum(struct gdbarch *gdbarch)
Definition: gdbarch.c:2146
static char * destroy_addr_space_name
int libunwind_is_initialized(void)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
Definition: utils.c:2018
unw_addr_space_t() unw_create_addr_space_p_ftype(unw_accessors_t *, int)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
Definition: gdbarch.c:1509
static unw_is_signal_frame_p_ftype * unw_is_signal_frame_p
static char * create_addr_space_name
static unw_get_saveloc_p_ftype * unw_get_saveloc_p
static unw_search_unwind_table_p_ftype * unw_search_unwind_table_p
int regnum
Definition: aarch64-tdep.c:77
#define STRINGIFY(x)
Definition: preprocessor.h:29
static unw_create_addr_space_p_ftype * unw_create_addr_space_p
#define gdb_assert(expr)
Definition: gdb_assert.h:32
Definition: value.c:169
static int libunwind_load(void)
bfd_byte gdb_byte
Definition: common-types.h:38
int libunwind_get_reg_special(struct gdbarch *gdbarch, struct regcache *regcache, int regnum, void *buf)
int libunwind_sigtramp_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_cache)
int() unw_is_signal_frame_p_ftype(unw_cursor_t *)
int libunwind_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_cache)
#define gdb_stderr
Definition: utils.h:344
struct value * frame_unwind_got_register(struct frame_info *frame, int regnum, int new_regnum)
Definition: frame-unwind.c:223
struct value * libunwind_frame_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
int() unw_get_fpreg_p_ftype(unw_cursor_t *, unw_regnum_t, unw_fpreg_t *)
void deprecated_set_gdbarch_data(struct gdbarch *gdbarch, struct gdbarch_data *data, void *pointer)
Definition: gdbarch.c:5155
int() unw_init_remote_p_ftype(unw_cursor_t *, unw_addr_space_t, void *)
static struct libunwind_frame_cache * libunwind_frame_cache(struct frame_info *this_frame, void **this_cache)
unw_word_t libunwind_find_dyn_list(unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
static struct libunwind_descr * libunwind_descr(struct gdbarch *gdbarch)
int register_size(struct gdbarch *gdbarch, int regnum)
Definition: regcache.c:164
#define __BIG_ENDIAN
int() unw_get_saveloc_p_ftype(unw_cursor_t *, unw_regnum_t, unw_save_loc_t *)
static char * get_fpreg_name
void() unw_destroy_addr_space_p_ftype(unw_addr_space_t)
int libunwind_search_unwind_table(void *as, long ip, void *di, void *pi, int need_unwind_info, void *args)
static unw_get_reg_p_ftype * unw_get_reg_p
CORE_ADDR get_frame_func(struct frame_info *this_frame)
Definition: frame.c:1001
void error(const char *fmt,...)
Definition: errors.c:38
static int libunwind_initialized
#define LIBUNWIND_SO_7
struct gdbarch_data * gdbarch_data_register_post_init(gdbarch_data_post_init_ftype *post_init)
Definition: gdbarch.c:5136
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2691