Automatic date update in version.in
[binutils-gdb.git] / gdb / ia64-libunwind-tdep.c
bloba2a236a46670a30548ff2e09dfe3db09a62fbded
1 /* Frame unwinder for ia64 frames using the libunwind library.
3 Copyright (C) 2003-2022 Free Software Foundation, Inc.
5 Written by Jeff Johnston, contributed by Red Hat Inc.
7 This file is part of GDB.
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.
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.
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/>. */
22 #include "defs.h"
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"
34 #include <dlfcn.h>
36 #include "ia64-libunwind-tdep.h"
38 #include "gdbsupport/preprocessor.h"
40 /* IA-64 is the only target that currently uses ia64-libunwind-tdep.
41 Note how UNW_TARGET, UNW_OBJ, etc. are compile time constants below.
42 Those come from libunwind's headers, and are target dependent.
43 Also, some of libunwind's typedefs are target dependent, as e.g.,
44 unw_word_t. If some other target wants to use this, we will need
45 to do some abstracting in order to make it possible to select which
46 libunwind we're talking to at runtime (and have one per arch). */
48 /* The following two macros are normally defined in <endian.h>.
49 But systems such as ia64-hpux do not provide such header, so
50 we just define them here if not already defined. */
51 #ifndef __LITTLE_ENDIAN
52 #define __LITTLE_ENDIAN 1234
53 #endif
54 #ifndef __BIG_ENDIAN
55 #define __BIG_ENDIAN 4321
56 #endif
58 static int libunwind_initialized;
59 static struct gdbarch_data *libunwind_descr_handle;
61 /* Required function pointers from libunwind. */
62 typedef int (unw_get_reg_p_ftype) (unw_cursor_t *, unw_regnum_t, unw_word_t *);
63 static unw_get_reg_p_ftype *unw_get_reg_p;
64 typedef int (unw_get_fpreg_p_ftype) (unw_cursor_t *, unw_regnum_t,
65 unw_fpreg_t *);
66 static unw_get_fpreg_p_ftype *unw_get_fpreg_p;
67 typedef int (unw_get_saveloc_p_ftype) (unw_cursor_t *, unw_regnum_t,
68 unw_save_loc_t *);
69 static unw_get_saveloc_p_ftype *unw_get_saveloc_p;
70 typedef int (unw_is_signal_frame_p_ftype) (unw_cursor_t *);
71 static unw_is_signal_frame_p_ftype *unw_is_signal_frame_p;
72 typedef int (unw_step_p_ftype) (unw_cursor_t *);
73 static unw_step_p_ftype *unw_step_p;
74 typedef int (unw_init_remote_p_ftype) (unw_cursor_t *, unw_addr_space_t,
75 void *);
76 static unw_init_remote_p_ftype *unw_init_remote_p;
77 typedef unw_addr_space_t (unw_create_addr_space_p_ftype) (unw_accessors_t *,
78 int);
79 static unw_create_addr_space_p_ftype *unw_create_addr_space_p;
80 typedef void (unw_destroy_addr_space_p_ftype) (unw_addr_space_t);
81 static unw_destroy_addr_space_p_ftype *unw_destroy_addr_space_p;
82 typedef int (unw_search_unwind_table_p_ftype) (unw_addr_space_t, unw_word_t,
83 unw_dyn_info_t *,
84 unw_proc_info_t *, int, void *);
85 static unw_search_unwind_table_p_ftype *unw_search_unwind_table_p;
86 typedef unw_word_t (unw_find_dyn_list_p_ftype) (unw_addr_space_t,
87 unw_dyn_info_t *, void *);
88 static unw_find_dyn_list_p_ftype *unw_find_dyn_list_p;
91 struct libunwind_frame_cache
93 CORE_ADDR base;
94 CORE_ADDR func_addr;
95 unw_cursor_t cursor;
96 unw_addr_space_t as;
99 /* We need to qualify the function names with a platform-specific prefix
100 to match the names used by the libunwind library. The UNW_OBJ macro is
101 provided by the libunwind.h header file. */
103 #ifndef LIBUNWIND_SO
104 /* Use the stable ABI major version number. `libunwind-ia64.so' is a link time
105 only library, not a runtime one. */
106 #define LIBUNWIND_SO "libunwind-" STRINGIFY(UNW_TARGET) ".so.8"
108 /* Provide also compatibility with older .so. The two APIs are compatible, .8
109 is only extended a bit, GDB does not use the extended API at all. */
110 #define LIBUNWIND_SO_7 "libunwind-" STRINGIFY(UNW_TARGET) ".so.7"
111 #endif
113 static const char *get_reg_name = STRINGIFY(UNW_OBJ(get_reg));
114 static const char *get_fpreg_name = STRINGIFY(UNW_OBJ(get_fpreg));
115 static const char *get_saveloc_name = STRINGIFY(UNW_OBJ(get_save_loc));
116 static const char *is_signal_frame_name = STRINGIFY(UNW_OBJ(is_signal_frame));
117 static const char *step_name = STRINGIFY(UNW_OBJ(step));
118 static const char *init_remote_name = STRINGIFY(UNW_OBJ(init_remote));
119 static const char *create_addr_space_name
120 = STRINGIFY(UNW_OBJ(create_addr_space));
121 static const char *destroy_addr_space_name
122 = STRINGIFY(UNW_OBJ(destroy_addr_space));
123 static const char *search_unwind_table_name
124 = STRINGIFY(UNW_OBJ(search_unwind_table));
125 static const char *find_dyn_list_name = STRINGIFY(UNW_OBJ(find_dyn_list));
127 static struct libunwind_descr *
128 libunwind_descr (struct gdbarch *gdbarch)
130 return ((struct libunwind_descr *)
131 gdbarch_data (gdbarch, libunwind_descr_handle));
134 static void *
135 libunwind_descr_init (struct obstack *obstack)
137 struct libunwind_descr *descr
138 = OBSTACK_ZALLOC (obstack, struct libunwind_descr);
140 return descr;
143 void
144 libunwind_frame_set_descr (struct gdbarch *gdbarch,
145 struct libunwind_descr *descr)
147 struct libunwind_descr *arch_descr;
149 gdb_assert (gdbarch != NULL);
151 arch_descr = ((struct libunwind_descr *)
152 gdbarch_data (gdbarch, libunwind_descr_handle));
153 gdb_assert (arch_descr != NULL);
155 /* Copy new descriptor info into arch descriptor. */
156 arch_descr->gdb2uw = descr->gdb2uw;
157 arch_descr->uw2gdb = descr->uw2gdb;
158 arch_descr->is_fpreg = descr->is_fpreg;
159 arch_descr->accessors = descr->accessors;
160 arch_descr->special_accessors = descr->special_accessors;
163 static struct libunwind_frame_cache *
164 libunwind_frame_cache (struct frame_info *this_frame, void **this_cache)
166 unw_accessors_t *acc;
167 unw_addr_space_t as;
168 unw_word_t fp;
169 unw_regnum_t uw_sp_regnum;
170 struct libunwind_frame_cache *cache;
171 struct libunwind_descr *descr;
172 struct gdbarch *gdbarch = get_frame_arch (this_frame);
173 int ret;
175 if (*this_cache)
176 return (struct libunwind_frame_cache *) *this_cache;
178 /* Allocate a new cache. */
179 cache = FRAME_OBSTACK_ZALLOC (struct libunwind_frame_cache);
181 cache->func_addr = get_frame_func (this_frame);
182 if (cache->func_addr == 0)
183 /* This can happen when the frame corresponds to a function for which
184 there is no debugging information nor any entry in the symbol table.
185 This is probably a static function for which an entry in the symbol
186 table was not created when the objfile got linked (observed in
187 libpthread.so on ia64-hpux).
189 The best we can do, in that case, is use the frame PC as the function
190 address. We don't need to give up since we still have the unwind
191 record to help us perform the unwinding. There is also another
192 compelling to continue, because abandoning now means stopping
193 the backtrace, which can never be helpful for the user. */
194 cache->func_addr = get_frame_pc (this_frame);
196 /* Get a libunwind cursor to the previous frame.
198 We do this by initializing a cursor. Libunwind treats a new cursor
199 as the top of stack and will get the current register set via the
200 libunwind register accessor. Now, we provide the platform-specific
201 accessors and we set up the register accessor to use the frame
202 register unwinding interfaces so that we properly get the registers
203 for the current frame rather than the top. We then use the unw_step
204 function to move the libunwind cursor back one frame. We can later
205 use this cursor to find previous registers via the unw_get_reg
206 interface which will invoke libunwind's special logic. */
207 descr = libunwind_descr (gdbarch);
208 acc = (unw_accessors_t *) descr->accessors;
209 as = unw_create_addr_space_p (acc,
210 gdbarch_byte_order (gdbarch)
211 == BFD_ENDIAN_BIG
212 ? __BIG_ENDIAN
213 : __LITTLE_ENDIAN);
215 unw_init_remote_p (&cache->cursor, as, this_frame);
216 if (unw_step_p (&cache->cursor) < 0)
218 unw_destroy_addr_space_p (as);
219 return NULL;
222 /* To get base address, get sp from previous frame. */
223 uw_sp_regnum = descr->gdb2uw (gdbarch_sp_regnum (gdbarch));
224 ret = unw_get_reg_p (&cache->cursor, uw_sp_regnum, &fp);
225 if (ret < 0)
227 unw_destroy_addr_space_p (as);
228 error (_("Can't get libunwind sp register."));
231 cache->base = (CORE_ADDR)fp;
232 cache->as = as;
234 *this_cache = cache;
235 return cache;
238 void
239 libunwind_frame_dealloc_cache (struct frame_info *self, void *this_cache)
241 struct libunwind_frame_cache *cache
242 = (struct libunwind_frame_cache *) this_cache;
244 if (cache->as)
245 unw_destroy_addr_space_p (cache->as);
248 unw_word_t
249 libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
251 return unw_find_dyn_list_p (as, di, arg);
254 /* Verify if there is sufficient libunwind information for the frame to use
255 libunwind frame unwinding. */
257 libunwind_frame_sniffer (const struct frame_unwind *self,
258 struct frame_info *this_frame, void **this_cache)
260 unw_cursor_t cursor;
261 unw_accessors_t *acc;
262 unw_addr_space_t as;
263 struct libunwind_descr *descr;
264 struct gdbarch *gdbarch = get_frame_arch (this_frame);
265 int ret;
267 /* To test for libunwind unwind support, initialize a cursor to
268 the current frame and try to back up. We use this same method
269 when setting up the frame cache (see libunwind_frame_cache()).
270 If libunwind returns success for this operation, it means that
271 it has found sufficient libunwind unwinding information to do so. */
273 descr = libunwind_descr (gdbarch);
274 acc = (unw_accessors_t *) descr->accessors;
275 as = unw_create_addr_space_p (acc,
276 gdbarch_byte_order (gdbarch)
277 == BFD_ENDIAN_BIG
278 ? __BIG_ENDIAN
279 : __LITTLE_ENDIAN);
281 ret = unw_init_remote_p (&cursor, as, this_frame);
283 if (ret < 0)
285 unw_destroy_addr_space_p (as);
286 return 0;
290 /* Check to see if we have libunwind info by checking if we are in a
291 signal frame. If it doesn't return an error, we have libunwind info
292 and can use libunwind. */
293 ret = unw_is_signal_frame_p (&cursor);
294 unw_destroy_addr_space_p (as);
296 if (ret < 0)
297 return 0;
299 return 1;
302 void
303 libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
304 struct frame_id *this_id)
306 struct libunwind_frame_cache *cache =
307 libunwind_frame_cache (this_frame, this_cache);
309 if (cache != NULL)
310 (*this_id) = frame_id_build (cache->base, cache->func_addr);
313 struct value *
314 libunwind_frame_prev_register (struct frame_info *this_frame,
315 void **this_cache, int regnum)
317 struct libunwind_frame_cache *cache =
318 libunwind_frame_cache (this_frame, this_cache);
320 unw_save_loc_t sl;
321 int ret;
322 unw_word_t intval;
323 unw_fpreg_t fpval;
324 unw_regnum_t uw_regnum;
325 struct libunwind_descr *descr;
326 struct value *val = NULL;
328 if (cache == NULL)
329 return frame_unwind_got_constant (this_frame, regnum, 0);
331 /* Convert from gdb register number to libunwind register number. */
332 descr = libunwind_descr (get_frame_arch (this_frame));
333 uw_regnum = descr->gdb2uw (regnum);
335 gdb_assert (regnum >= 0);
337 if (!target_has_registers ())
338 error (_("No registers."));
340 if (uw_regnum < 0)
341 return frame_unwind_got_constant (this_frame, regnum, 0);
343 if (unw_get_saveloc_p (&cache->cursor, uw_regnum, &sl) < 0)
344 return frame_unwind_got_constant (this_frame, regnum, 0);
346 switch (sl.type)
348 case UNW_SLT_MEMORY:
349 val = frame_unwind_got_memory (this_frame, regnum, sl.u.addr);
350 break;
352 case UNW_SLT_REG:
353 val = frame_unwind_got_register (this_frame, regnum,
354 descr->uw2gdb (sl.u.regnum));
355 break;
356 case UNW_SLT_NONE:
358 /* The register is not stored at a specific memory address nor
359 inside another register. So use libunwind to fetch the register
360 value for us, and create a constant value with the result. */
361 if (descr->is_fpreg (uw_regnum))
363 ret = unw_get_fpreg_p (&cache->cursor, uw_regnum, &fpval);
364 if (ret < 0)
365 return frame_unwind_got_constant (this_frame, regnum, 0);
366 val = frame_unwind_got_bytes (this_frame, regnum,
367 (gdb_byte *) &fpval);
369 else
371 ret = unw_get_reg_p (&cache->cursor, uw_regnum, &intval);
372 if (ret < 0)
373 return frame_unwind_got_constant (this_frame, regnum, 0);
374 val = frame_unwind_got_constant (this_frame, regnum, intval);
376 break;
380 return val;
383 /* The following is a glue routine to call the libunwind unwind table
384 search function to get unwind information for a specified ip address. */
386 libunwind_search_unwind_table (void *as, long ip, void *di,
387 void *pi, int need_unwind_info, void *args)
389 return unw_search_unwind_table_p (*(unw_addr_space_t *) as, (unw_word_t) ip,
390 (unw_dyn_info_t *) di,
391 (unw_proc_info_t *) pi, need_unwind_info,
392 args);
395 /* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */
397 libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
398 struct frame_info *this_frame,
399 void **this_cache)
401 unw_cursor_t cursor;
402 unw_accessors_t *acc;
403 unw_addr_space_t as;
404 struct libunwind_descr *descr;
405 struct gdbarch *gdbarch = get_frame_arch (this_frame);
406 int ret;
408 /* To test for libunwind unwind support, initialize a cursor to the
409 current frame and try to back up. We use this same method when
410 setting up the frame cache (see libunwind_frame_cache()). If
411 libunwind returns success for this operation, it means that it
412 has found sufficient libunwind unwinding information to do
413 so. */
415 descr = libunwind_descr (gdbarch);
416 acc = (unw_accessors_t *) descr->accessors;
417 as = unw_create_addr_space_p (acc,
418 gdbarch_byte_order (gdbarch)
419 == BFD_ENDIAN_BIG
420 ? __BIG_ENDIAN
421 : __LITTLE_ENDIAN);
423 ret = unw_init_remote_p (&cursor, as, this_frame);
425 if (ret < 0)
427 unw_destroy_addr_space_p (as);
428 return 0;
431 /* Check to see if we are in a signal frame. */
432 ret = unw_is_signal_frame_p (&cursor);
433 unw_destroy_addr_space_p (as);
434 if (ret > 0)
435 return 1;
437 return 0;
440 /* The following routine is for accessing special registers of the top frame.
441 A special set of accessors must be given that work without frame info.
442 This is used by ia64 to access the rse registers r32-r127. While they
443 are usually located at BOF, this is not always true and only the libunwind
444 info can decipher where they actually are. */
446 libunwind_get_reg_special (struct gdbarch *gdbarch, readable_regcache *regcache,
447 int regnum, void *buf)
449 unw_cursor_t cursor;
450 unw_accessors_t *acc;
451 unw_addr_space_t as;
452 struct libunwind_descr *descr;
453 int ret;
454 unw_regnum_t uw_regnum;
455 unw_word_t intval;
456 unw_fpreg_t fpval;
457 void *ptr;
460 descr = libunwind_descr (gdbarch);
461 acc = (unw_accessors_t *) descr->special_accessors;
462 as = unw_create_addr_space_p (acc,
463 gdbarch_byte_order (gdbarch)
464 == BFD_ENDIAN_BIG
465 ? __BIG_ENDIAN
466 : __LITTLE_ENDIAN);
468 ret = unw_init_remote_p (&cursor, as, regcache);
469 if (ret < 0)
471 unw_destroy_addr_space_p (as);
472 return -1;
475 uw_regnum = descr->gdb2uw (regnum);
477 if (descr->is_fpreg (uw_regnum))
479 ret = unw_get_fpreg_p (&cursor, uw_regnum, &fpval);
480 ptr = &fpval;
482 else
484 ret = unw_get_reg_p (&cursor, uw_regnum, &intval);
485 ptr = &intval;
488 unw_destroy_addr_space_p (as);
490 if (ret < 0)
491 return -1;
493 if (buf)
494 memcpy (buf, ptr, register_size (gdbarch, regnum));
496 return 0;
499 static int
500 libunwind_load (void)
502 void *handle;
503 char *so_error = NULL;
505 handle = dlopen (LIBUNWIND_SO, RTLD_NOW);
506 if (handle == NULL)
508 so_error = xstrdup (dlerror ());
509 #ifdef LIBUNWIND_SO_7
510 handle = dlopen (LIBUNWIND_SO_7, RTLD_NOW);
511 #endif /* LIBUNWIND_SO_7 */
513 if (handle == NULL)
515 gdb_printf (gdb_stderr, _("[GDB failed to load %s: %s]\n"),
516 LIBUNWIND_SO, so_error);
517 #ifdef LIBUNWIND_SO_7
518 gdb_printf (gdb_stderr, _("[GDB failed to load %s: %s]\n"),
519 LIBUNWIND_SO_7, dlerror ());
520 #endif /* LIBUNWIND_SO_7 */
522 xfree (so_error);
523 if (handle == NULL)
524 return 0;
526 /* Initialize pointers to the dynamic library functions we will use. */
528 unw_get_reg_p = (unw_get_reg_p_ftype *) dlsym (handle, get_reg_name);
529 if (unw_get_reg_p == NULL)
530 return 0;
532 unw_get_fpreg_p = (unw_get_fpreg_p_ftype *) dlsym (handle, get_fpreg_name);
533 if (unw_get_fpreg_p == NULL)
534 return 0;
536 unw_get_saveloc_p
537 = (unw_get_saveloc_p_ftype *) dlsym (handle, get_saveloc_name);
538 if (unw_get_saveloc_p == NULL)
539 return 0;
541 unw_is_signal_frame_p
542 = (unw_is_signal_frame_p_ftype *) dlsym (handle, is_signal_frame_name);
543 if (unw_is_signal_frame_p == NULL)
544 return 0;
546 unw_step_p = (unw_step_p_ftype *) dlsym (handle, step_name);
547 if (unw_step_p == NULL)
548 return 0;
550 unw_init_remote_p
551 = (unw_init_remote_p_ftype *) dlsym (handle, init_remote_name);
552 if (unw_init_remote_p == NULL)
553 return 0;
555 unw_create_addr_space_p
556 = (unw_create_addr_space_p_ftype *) dlsym (handle, create_addr_space_name);
557 if (unw_create_addr_space_p == NULL)
558 return 0;
560 unw_destroy_addr_space_p
561 = (unw_destroy_addr_space_p_ftype *) dlsym (handle,
562 destroy_addr_space_name);
563 if (unw_destroy_addr_space_p == NULL)
564 return 0;
566 unw_search_unwind_table_p
567 = (unw_search_unwind_table_p_ftype *) dlsym (handle,
568 search_unwind_table_name);
569 if (unw_search_unwind_table_p == NULL)
570 return 0;
572 unw_find_dyn_list_p
573 = (unw_find_dyn_list_p_ftype *) dlsym (handle, find_dyn_list_name);
574 if (unw_find_dyn_list_p == NULL)
575 return 0;
577 return 1;
581 libunwind_is_initialized (void)
583 return libunwind_initialized;
586 void _initialize_libunwind_frame ();
587 void
588 _initialize_libunwind_frame ()
590 libunwind_descr_handle
591 = gdbarch_data_register_pre_init (libunwind_descr_init);
593 libunwind_initialized = libunwind_load ();