/* Frame unwinder for ia64 frames using the libunwind library.
- Copyright (C) 2003-2020 Free Software Foundation, Inc.
+ Copyright (C) 2003-2021 Free Software Foundation, Inc.
Written by Jeff Johnston, contributed by Red Hat Inc.
#include "ia64-libunwind-tdep.h"
-#include "complaints.h"
#include "gdbsupport/preprocessor.h"
/* IA-64 is the only target that currently uses ia64-libunwind-tdep.
}
static void *
-libunwind_descr_init (struct gdbarch *gdbarch)
+libunwind_descr_init (struct obstack *obstack)
{
struct libunwind_descr *descr
- = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct libunwind_descr);
+ = OBSTACK_ZALLOC (obstack, struct libunwind_descr);
return descr;
}
arch_descr = ((struct libunwind_descr *)
gdbarch_data (gdbarch, libunwind_descr_handle));
-
- if (arch_descr == NULL)
- {
- /* First time here. Must initialize data area. */
- arch_descr = (struct libunwind_descr *) libunwind_descr_init (gdbarch);
- deprecated_set_gdbarch_data (gdbarch,
- libunwind_descr_handle, arch_descr);
- }
+ gdb_assert (arch_descr != NULL);
/* Copy new descriptor info into arch descriptor. */
arch_descr->gdb2uw = descr->gdb2uw;
libunwind frame unwinding. */
int
libunwind_frame_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame, void **this_cache)
+ struct frame_info *this_frame, void **this_cache)
{
unw_cursor_t cursor;
unw_accessors_t *acc;
void
libunwind_frame_this_id (struct frame_info *this_frame, void **this_cache,
- struct frame_id *this_id)
+ struct frame_id *this_id)
{
struct libunwind_frame_cache *cache =
libunwind_frame_cache (this_frame, this_cache);
struct value *
libunwind_frame_prev_register (struct frame_info *this_frame,
- void **this_cache, int regnum)
+ void **this_cache, int regnum)
{
struct libunwind_frame_cache *cache =
libunwind_frame_cache (this_frame, this_cache);
gdb_assert (regnum >= 0);
- if (!target_has_registers)
+ if (!target_has_registers ())
error (_("No registers."));
if (uw_regnum < 0)
case UNW_SLT_REG:
val = frame_unwind_got_register (this_frame, regnum,
- descr->uw2gdb (sl.u.regnum));
+ descr->uw2gdb (sl.u.regnum));
break;
case UNW_SLT_NONE:
{
- /* The register is not stored at a specific memory address nor
- inside another register. So use libunwind to fetch the register
- value for us, and create a constant value with the result. */
- if (descr->is_fpreg (uw_regnum))
- {
- ret = unw_get_fpreg_p (&cache->cursor, uw_regnum, &fpval);
- if (ret < 0)
- return frame_unwind_got_constant (this_frame, regnum, 0);
- val = frame_unwind_got_bytes (this_frame, regnum,
- (gdb_byte *) &fpval);
- }
- else
- {
- ret = unw_get_reg_p (&cache->cursor, uw_regnum, &intval);
- if (ret < 0)
- return frame_unwind_got_constant (this_frame, regnum, 0);
- val = frame_unwind_got_constant (this_frame, regnum, intval);
- }
- break;
+ /* The register is not stored at a specific memory address nor
+ inside another register. So use libunwind to fetch the register
+ value for us, and create a constant value with the result. */
+ if (descr->is_fpreg (uw_regnum))
+ {
+ ret = unw_get_fpreg_p (&cache->cursor, uw_regnum, &fpval);
+ if (ret < 0)
+ return frame_unwind_got_constant (this_frame, regnum, 0);
+ val = frame_unwind_got_bytes (this_frame, regnum,
+ (gdb_byte *) &fpval);
+ }
+ else
+ {
+ ret = unw_get_reg_p (&cache->cursor, uw_regnum, &intval);
+ if (ret < 0)
+ return frame_unwind_got_constant (this_frame, regnum, 0);
+ val = frame_unwind_got_constant (this_frame, regnum, intval);
+ }
+ break;
}
}
/* Verify if we are in a sigtramp frame and we can use libunwind to unwind. */
int
libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self,
- struct frame_info *this_frame,
- void **this_cache)
+ struct frame_info *this_frame,
+ void **this_cache)
{
unw_cursor_t cursor;
unw_accessors_t *acc;
return libunwind_initialized;
}
+void _initialize_libunwind_frame ();
void
-_initialize_libunwind_frame (void)
+_initialize_libunwind_frame ()
{
libunwind_descr_handle
- = gdbarch_data_register_post_init (libunwind_descr_init);
+ = gdbarch_data_register_pre_init (libunwind_descr_init);
libunwind_initialized = libunwind_load ();
}