/* Target-dependent code for GNU/Linux running on PA-RISC, for GDB.
- Copyright (C) 2004-2014 Free Software Foundation, Inc.
+ Copyright (C) 2004-2022 Free Software Foundation, Inc.
This file is part of GDB.
#include "glibc-tdep.h"
#include "frame-unwind.h"
#include "trad-frame.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
#include "value.h"
#include "regset.h"
#include "regcache.h"
hppa_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
{
/* The general registers and the sar are the same in both sets. */
- if (reg <= 32)
+ if (reg >= 0 && reg <= 32)
return reg;
/* fr4-fr31 (left and right halves) are mapped from 72. */
if (reg >= 72 && reg <= 72 + 28 * 2)
return HPPA_FP4_REGNUM + (reg - 72);
- warning (_("Unmapped DWARF DBX Register #%d encountered."), reg);
return -1;
}
matched. */
static int
insns_match_pattern (struct gdbarch *gdbarch, CORE_ADDR pc,
- struct insn_pattern *pattern,
- unsigned int *insn)
+ struct insn_pattern *pattern,
+ unsigned int *insn)
{
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int i;
target_read_memory (npc, buf, 4);
insn[i] = extract_unsigned_integer (buf, 4, byte_order);
if ((insn[i] & pattern[i].mask) == pattern[i].data)
- npc += 4;
+ npc += 4;
else
- return 0;
+ return 0;
}
return 1;
}
{
unsigned int dummy[HPPA_MAX_INSN_PATTERN_LEN];
int offs = 0;
- int try;
+ int attempt;
/* offsets to try to find the trampoline */
static int pcoffs[] = { 0, 4*4, 5*4 };
/* offsets to the rt_sigframe structure */
e4008200 be,l 0x100(%sr2, %r0), %sr0, %r31
08000240 nop */
- for (try = 0; try < ARRAY_SIZE (pcoffs); try++)
+ for (attempt = 0; attempt < ARRAY_SIZE (pcoffs); attempt++)
{
- if (insns_match_pattern (gdbarch, sp + pcoffs[try],
+ if (insns_match_pattern (gdbarch, sp + pcoffs[attempt],
hppa_sigtramp, dummy))
{
- offs = sfoffs[try];
+ offs = sfoffs[attempt];
break;
}
}
/* sigaltstack case: we have no way of knowing which offset to
use in this case; default to new kernel handling. If this is
wrong the unwinding will fail. */
- try = 2;
- sp = pc - pcoffs[try];
+ attempt = 2;
+ sp = pc - pcoffs[attempt];
}
else
- {
- return 0;
- }
+ return 0;
}
/* sp + sfoffs[try] points to a struct rt_sigframe, which contains
bad we cannot include system specific headers :-(.
sizeof(struct siginfo) == 128
offsetof(struct ucontext, uc_mcontext) == 24. */
- return sp + sfoffs[try] + 128 + 24;
+ return sp + sfoffs[attempt] + 128 + 24;
}
struct hppa_linux_sigtramp_unwind_cache
{
CORE_ADDR base;
- struct trad_frame_saved_reg *saved_regs;
+ trad_frame_saved_reg *saved_regs;
};
static struct hppa_linux_sigtramp_unwind_cache *
int i;
if (*this_cache)
- return *this_cache;
+ return (struct hppa_linux_sigtramp_unwind_cache *) *this_cache;
info = FRAME_OBSTACK_ZALLOC (struct hppa_linux_sigtramp_unwind_cache);
*this_cache = info;
scptr += 4;
/* GR[0] is the psw. */
- info->saved_regs[HPPA_IPSW_REGNUM].addr = scptr;
+ info->saved_regs[HPPA_IPSW_REGNUM].set_addr (scptr);
scptr += 4;
/* General registers. */
for (i = 1; i < 32; i++)
{
- info->saved_regs[HPPA_R0_REGNUM + i].addr = scptr;
+ info->saved_regs[HPPA_R0_REGNUM + i].set_addr (scptr);
scptr += 4;
}
for (i = 4; i < 32; i++)
{
- info->saved_regs[HPPA_FP0_REGNUM + (i * 2)].addr = scptr;
+ info->saved_regs[HPPA_FP0_REGNUM + (i * 2)].set_addr (scptr);
scptr += 4;
- info->saved_regs[HPPA_FP0_REGNUM + (i * 2) + 1].addr = scptr;
+ info->saved_regs[HPPA_FP0_REGNUM + (i * 2) + 1].set_addr (scptr);
scptr += 4;
}
/* IASQ/IAOQ. */
- info->saved_regs[HPPA_PCSQ_HEAD_REGNUM].addr = scptr;
+ info->saved_regs[HPPA_PCSQ_HEAD_REGNUM].set_addr (scptr);
scptr += 4;
- info->saved_regs[HPPA_PCSQ_TAIL_REGNUM].addr = scptr;
+ info->saved_regs[HPPA_PCSQ_TAIL_REGNUM].set_addr (scptr);
scptr += 4;
- info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr = scptr;
+ info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].set_addr (scptr);
scptr += 4;
- info->saved_regs[HPPA_PCOQ_TAIL_REGNUM].addr = scptr;
+ info->saved_regs[HPPA_PCOQ_TAIL_REGNUM].set_addr (scptr);
scptr += 4;
- info->saved_regs[HPPA_SAR_REGNUM].addr = scptr;
+ info->saved_regs[HPPA_SAR_REGNUM].set_addr (scptr);
info->base = get_frame_register_unsigned (this_frame, HPPA_SP_REGNUM);
}
static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
+ "hppa linux sigtramp",
SIGTRAMP_FRAME,
default_frame_unwind_stop_reason,
hppa_linux_sigtramp_frame_this_id,
{
CORE_ADDR addr, endaddr;
- addr = obj_section_addr (osect);
- endaddr = obj_section_endaddr (osect);
+ addr = osect->addr ();
+ endaddr = osect->endaddr ();
while (addr < endaddr)
{
status = target_read_memory (addr, buf, sizeof (buf));
if (status != 0)
break;
- tag = extract_signed_integer (buf, sizeof (buf), byte_order);
+ tag = extract_signed_integer (buf, byte_order);
if (tag == DT_PLTGOT)
{
regcache_supply_regset, regcache_collect_regset
};
-static const struct regset *
-hppa_linux_regset_from_core_section (struct gdbarch *gdbarch,
- const char *sect_name,
- size_t sect_size)
+static void
+hppa_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
+ iterate_over_regset_sections_cb *cb,
+ void *cb_data,
+ const struct regcache *regcache)
{
- if (strcmp (sect_name, ".reg") == 0)
- return &hppa_linux_regset;
- else if (strcmp (sect_name, ".reg2") == 0)
- return &hppa_linux_fpregset;
+ hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
- return NULL;
+ cb (".reg", 80 * tdep->bytes_per_address, 80 * tdep->bytes_per_address,
+ &hppa_linux_regset, NULL, cb_data);
+ cb (".reg2", 64 * 4, 64 * 4, &hppa_linux_fpregset, NULL, cb_data);
}
-\f
-
-/* Forward declarations. */
-extern initialize_file_ftype _initialize_hppa_linux_tdep;
static void
hppa_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
{
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ hppa_gdbarch_tdep *tdep = (hppa_gdbarch_tdep *) gdbarch_tdep (gdbarch);
- linux_init_abi (info, gdbarch);
+ linux_init_abi (info, gdbarch, 0);
/* GNU/Linux is always ELF. */
tdep->is_elf = 1;
/* GNU/Linux uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
- (gdbarch, svr4_ilp32_fetch_link_map_offsets);
+ (gdbarch, linux_ilp32_fetch_link_map_offsets);
tdep->in_solib_call_trampoline = hppa_in_solib_call_trampoline;
set_gdbarch_skip_trampoline_code (gdbarch, hppa_skip_trampoline_code);
some discussions to support 128-bit long double, but it requires some
more work in gcc and glibc first. */
set_gdbarch_long_double_bit (gdbarch, 64);
+ set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
- set_gdbarch_regset_from_core_section
- (gdbarch, hppa_linux_regset_from_core_section);
+ set_gdbarch_iterate_over_regset_sections
+ (gdbarch, hppa_linux_iterate_over_regset_sections);
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, hppa_dwarf_reg_to_regnum);
/* Enable TLS support. */
set_gdbarch_fetch_tls_load_module_address (gdbarch,
- svr4_fetch_objfile_link_map);
+ svr4_fetch_objfile_link_map);
}
+void _initialize_hppa_linux_tdep ();
void
-_initialize_hppa_linux_tdep (void)
+_initialize_hppa_linux_tdep ()
{
gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_LINUX,
hppa_linux_init_abi);