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/>. */
26 #include "frame-base.h"
27 #include "frame-unwind.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
55 #define __BIG_ENDIAN 4321
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
,
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
,
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
,
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
*,
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
,
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
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. */
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"
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
));
135 libunwind_descr_init (struct obstack
*obstack
)
137 struct libunwind_descr
*descr
138 = OBSTACK_ZALLOC (obstack
, struct libunwind_descr
);
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
;
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
);
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
)
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
);
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
);
227 unw_destroy_addr_space_p (as
);
228 error (_("Can't get libunwind sp register."));
231 cache
->base
= (CORE_ADDR
)fp
;
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
;
245 unw_destroy_addr_space_p (cache
->as
);
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
)
261 unw_accessors_t
*acc
;
263 struct libunwind_descr
*descr
;
264 struct gdbarch
*gdbarch
= get_frame_arch (this_frame
);
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
)
281 ret
= unw_init_remote_p (&cursor
, as
, this_frame
);
285 unw_destroy_addr_space_p (as
);
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
);
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
);
310 (*this_id
) = frame_id_build (cache
->base
, cache
->func_addr
);
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
);
324 unw_regnum_t uw_regnum
;
325 struct libunwind_descr
*descr
;
326 struct value
*val
= 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."));
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);
349 val
= frame_unwind_got_memory (this_frame
, regnum
, sl
.u
.addr
);
353 val
= frame_unwind_got_register (this_frame
, regnum
,
354 descr
->uw2gdb (sl
.u
.regnum
));
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
);
365 return frame_unwind_got_constant (this_frame
, regnum
, 0);
366 val
= frame_unwind_got_bytes (this_frame
, regnum
,
367 (gdb_byte
*) &fpval
);
371 ret
= unw_get_reg_p (&cache
->cursor
, uw_regnum
, &intval
);
373 return frame_unwind_got_constant (this_frame
, regnum
, 0);
374 val
= frame_unwind_got_constant (this_frame
, regnum
, intval
);
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
,
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
,
402 unw_accessors_t
*acc
;
404 struct libunwind_descr
*descr
;
405 struct gdbarch
*gdbarch
= get_frame_arch (this_frame
);
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
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
)
423 ret
= unw_init_remote_p (&cursor
, as
, this_frame
);
427 unw_destroy_addr_space_p (as
);
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
);
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
)
450 unw_accessors_t
*acc
;
452 struct libunwind_descr
*descr
;
454 unw_regnum_t uw_regnum
;
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
)
468 ret
= unw_init_remote_p (&cursor
, as
, regcache
);
471 unw_destroy_addr_space_p (as
);
475 uw_regnum
= descr
->gdb2uw (regnum
);
477 if (descr
->is_fpreg (uw_regnum
))
479 ret
= unw_get_fpreg_p (&cursor
, uw_regnum
, &fpval
);
484 ret
= unw_get_reg_p (&cursor
, uw_regnum
, &intval
);
488 unw_destroy_addr_space_p (as
);
494 memcpy (buf
, ptr
, register_size (gdbarch
, regnum
));
500 libunwind_load (void)
503 char *so_error
= NULL
;
505 handle
= dlopen (LIBUNWIND_SO
, RTLD_NOW
);
508 so_error
= xstrdup (dlerror ());
509 #ifdef LIBUNWIND_SO_7
510 handle
= dlopen (LIBUNWIND_SO_7
, RTLD_NOW
);
511 #endif /* LIBUNWIND_SO_7 */
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 */
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
)
532 unw_get_fpreg_p
= (unw_get_fpreg_p_ftype
*) dlsym (handle
, get_fpreg_name
);
533 if (unw_get_fpreg_p
== NULL
)
537 = (unw_get_saveloc_p_ftype
*) dlsym (handle
, get_saveloc_name
);
538 if (unw_get_saveloc_p
== NULL
)
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
)
546 unw_step_p
= (unw_step_p_ftype
*) dlsym (handle
, step_name
);
547 if (unw_step_p
== NULL
)
551 = (unw_init_remote_p_ftype
*) dlsym (handle
, init_remote_name
);
552 if (unw_init_remote_p
== NULL
)
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
)
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
)
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
)
573 = (unw_find_dyn_list_p_ftype
*) dlsym (handle
, find_dyn_list_name
);
574 if (unw_find_dyn_list_p
== NULL
)
581 libunwind_is_initialized (void)
583 return libunwind_initialized
;
586 void _initialize_libunwind_frame ();
588 _initialize_libunwind_frame ()
590 libunwind_descr_handle
591 = gdbarch_data_register_pre_init (libunwind_descr_init
);
593 libunwind_initialized
= libunwind_load ();