mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-10 09:33:36 +00:00
This patch implements passing/returning of parameters for Morello. It is implemented based on the Morello AAPCS64 document and supports both the hybrid AAPCS64 and Pure-Cap AAPCS64-CAP ABI's. gdb/ChangeLog 2021-02-26 Luis Machado <luis.machado@arm.com> * aarch64-tdep.c (struct stack_item_t) <arg_value): New field. (set_register_tag, pass_in_c, pass_in_c_or_stack, pass_in_c_x_or_stack, type_fields_overlap_capabilities, convert_pointer_to_capability, morello_write_memory_with_capabilities, morello_push_dummy_call, morello_extract_return_value, morello_return_in_memory, morello_store_return_value, morello_return_value): New functions. (pass_in_x, pass_in_v, pass_on_stack, pass_in_x_or_stack, pass_in_v_vfp_candidate): Update. (aarch64_return_value): New argument value. (aarch64_gdbarch_init): Conditionally set both gdbarch_push_dummy_call and gdbarch_return_value. * arch/aarch64.h (MORELLO_MEMORY_TAG_GRANULE_SIZE): New constant. * dwarf2/read.c (handle_struct_member_die): Record whether the composite type contains capabilities. * gdbarch.sh (return_value): New argument value. * gdbarch.c: Regenerate. * gdbarch.h: Regenerate. * gdbtypes.c (recursive_dump_type): Dump extra information. (append_composite_type_field_raw): Set whether the composite type constains capabilities. * gdbtypes.h (struct main_type) <m_flag_contains_capability>: New field. <contains_capability>: New member function. <set_contains_capability>: New member function. * alpha-tdep.c: Update return_value hook prototype. * amd64-tdep.c: Update return_value hook prototype. * amd64-windows-tdep.c: Update return_value hook prototype. * arc-tdep.c: Update return_value hook prototype. * arm-tdep.c: Update return_value hook prototype. * avr-tdep.c: Update return_value hook prototype. * bfin-tdep.c: Update return_value hook prototype. * bpf-tdep.c: Update return_value hook prototype. * cris-tdep.c: Update return_value hook prototype. * csky-tdep.c: Update return_value hook prototype. * elfread.c: Update return_value hook prototype. * frv-tdep.c: Update return_value hook prototype. * ft32-tdep.c: Update return_value hook prototype. * h8300-tdep.c: Update return_value hook prototype. * hppa-tdep.c: Update return_value hook prototype. * i386-tdep.c: Update return_value hook prototype. * ia64-tdep.c: Update return_value hook prototype. * infcall.c: Update return_value hook prototype. * infcmd.c: Update return_value hook prototype. * lm32-tdep.c: Update return_value hook prototype. * m32c-tdep.c: Update return_value hook prototype. * m32r-tdep.c: Update return_value hook prototype. * m68hc11-tdep.c: Update return_value hook prototype. * m68k-tdep.c: Update return_value hook prototype. * mep-tdep.c: Update return_value hook prototype. * microblaze-tdep.c: Update return_value hook prototype. * mips-tdep.c: Update return_value hook prototype. * mn10300-tdep.c: Update return_value hook prototype. * moxie-tdep.c: Update return_value hook prototype. * msp430-tdep.c: Update return_value hook prototype. * nds32-tdep.c: Update return_value hook prototype. * nios2-tdep.c: Update return_value hook prototype. * or1k-tdep.c: Update return_value hook prototype. * ppc-fbsd-tdep.c: Update return_value hook prototype. * ppc-linux-tdep.c: Update return_value hook prototype. * ppc-netbsd-tdep.c: Update return_value hook prototype. * ppc-sysv-tdep.c: Update return_value hook prototype. * riscv-tdep.c: Update return_value hook prototype. * rl78-tdep.c: Update return_value hook prototype. * rs6000-aix-tdep.c: Update return_value hook prototype. * rs6000-lynx178-tdep.c: Update return_value hook prototype. * rx-tdep.c: Update return_value hook prototype. * s12z-tdep.c: Update return_value hook prototype. * s390-tdep.c: Update return_value hook prototype. * score-tdep.c: Update return_value hook prototype. * sh-tdep.c: Update return_value hook prototype. * sparc-tdep.c: Update return_value hook prototype. * sparc64-tdep.c: Update return_value hook prototype. * stack.c: Update return_value hook prototype. * tic6x-tdep.c: Update return_value hook prototype. * tilegx-tdep.c: Update return_value hook prototype. * v850-tdep.c: Update return_value hook prototype. * valprint.c: Update return_value hook prototype. * value.c: Update return_value hook prototype. * vax-tdep.c: Update return_value hook prototype. * xstormy16-tdep.c: Update return_value hook prototype. * xtensa-tdep.c: Update return_value hook prototype.
225 lines
6.7 KiB
C
225 lines
6.7 KiB
C
/* Target-dependent code for NetBSD/powerpc.
|
||
|
||
Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||
|
||
Contributed by Wasabi Systems, Inc.
|
||
|
||
This file is part of GDB.
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
You should have received a copy of the GNU General Public License
|
||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||
|
||
#include "defs.h"
|
||
#include "gdbtypes.h"
|
||
#include "osabi.h"
|
||
#include "regcache.h"
|
||
#include "regset.h"
|
||
#include "trad-frame.h"
|
||
#include "tramp-frame.h"
|
||
|
||
#include "ppc-tdep.h"
|
||
#include "netbsd-tdep.h"
|
||
#include "ppc-tdep.h"
|
||
#include "solib-svr4.h"
|
||
|
||
/* Register offsets from <machine/reg.h>. */
|
||
struct ppc_reg_offsets ppcnbsd_reg_offsets;
|
||
|
||
|
||
/* Core file support. */
|
||
|
||
/* NetBSD/powerpc register sets. */
|
||
|
||
const struct regset ppcnbsd_gregset =
|
||
{
|
||
&ppcnbsd_reg_offsets,
|
||
ppc_supply_gregset
|
||
};
|
||
|
||
const struct regset ppcnbsd_fpregset =
|
||
{
|
||
&ppcnbsd_reg_offsets,
|
||
ppc_supply_fpregset
|
||
};
|
||
|
||
/* Iterate over core file register note sections. */
|
||
|
||
static void
|
||
ppcnbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
|
||
iterate_over_regset_sections_cb *cb,
|
||
void *cb_data,
|
||
const struct regcache *regcache)
|
||
{
|
||
cb (".reg", 148, 148, &ppcnbsd_gregset, NULL, cb_data);
|
||
cb (".reg2", 264, 264, &ppcnbsd_fpregset, NULL, cb_data);
|
||
}
|
||
|
||
|
||
/* NetBSD is confused. It appears that 1.5 was using the correct SVR4
|
||
convention but, 1.6 switched to the below broken convention. For
|
||
the moment use the broken convention. Ulgh! */
|
||
|
||
static enum return_value_convention
|
||
ppcnbsd_return_value (struct gdbarch *gdbarch, struct value *function,
|
||
struct type *valtype, struct regcache *regcache,
|
||
struct value *value,
|
||
gdb_byte *readbuf, const gdb_byte *writebuf)
|
||
{
|
||
#if 0
|
||
if ((valtype->code () == TYPE_CODE_STRUCT
|
||
|| valtype->code () == TYPE_CODE_UNION)
|
||
&& !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8)
|
||
&& valtype->is_vector ())
|
||
&& !(TYPE_LENGTH (valtype) == 1
|
||
|| TYPE_LENGTH (valtype) == 2
|
||
|| TYPE_LENGTH (valtype) == 4
|
||
|| TYPE_LENGTH (valtype) == 8))
|
||
return RETURN_VALUE_STRUCT_CONVENTION;
|
||
else
|
||
#endif
|
||
return ppc_sysv_abi_broken_return_value (gdbarch, function, valtype,
|
||
regcache, readbuf, writebuf);
|
||
}
|
||
|
||
|
||
/* Signal trampolines. */
|
||
|
||
extern const struct tramp_frame ppcnbsd2_sigtramp;
|
||
|
||
static void
|
||
ppcnbsd_sigtramp_cache_init (const struct tramp_frame *self,
|
||
struct frame_info *this_frame,
|
||
struct trad_frame_cache *this_cache,
|
||
CORE_ADDR func)
|
||
{
|
||
struct gdbarch *gdbarch = get_frame_arch (this_frame);
|
||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||
CORE_ADDR addr, base;
|
||
int i;
|
||
|
||
base = get_frame_register_unsigned (this_frame,
|
||
gdbarch_sp_regnum (gdbarch));
|
||
if (self == &ppcnbsd2_sigtramp)
|
||
addr = base + 0x10 + 2 * tdep->wordsize;
|
||
else
|
||
addr = base + 0x18 + 2 * tdep->wordsize;
|
||
for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize)
|
||
{
|
||
int regnum = i + tdep->ppc_gp0_regnum;
|
||
trad_frame_set_reg_addr (this_cache, regnum, addr);
|
||
}
|
||
trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, addr);
|
||
addr += tdep->wordsize;
|
||
trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, addr);
|
||
addr += tdep->wordsize;
|
||
trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, addr);
|
||
addr += tdep->wordsize;
|
||
trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, addr);
|
||
addr += tdep->wordsize;
|
||
trad_frame_set_reg_addr (this_cache, gdbarch_pc_regnum (gdbarch),
|
||
addr); /* SRR0? */
|
||
addr += tdep->wordsize;
|
||
|
||
/* Construct the frame ID using the function start. */
|
||
trad_frame_set_id (this_cache, frame_id_build (base, func));
|
||
}
|
||
|
||
static const struct tramp_frame ppcnbsd_sigtramp =
|
||
{
|
||
SIGTRAMP_FRAME,
|
||
4,
|
||
{
|
||
{ 0x3821fff0, ULONGEST_MAX }, /* add r1,r1,-16 */
|
||
{ 0x4e800021, ULONGEST_MAX }, /* blrl */
|
||
{ 0x38610018, ULONGEST_MAX }, /* addi r3,r1,24 */
|
||
{ 0x38000127, ULONGEST_MAX }, /* li r0,295 */
|
||
{ 0x44000002, ULONGEST_MAX }, /* sc */
|
||
{ 0x38000001, ULONGEST_MAX }, /* li r0,1 */
|
||
{ 0x44000002, ULONGEST_MAX }, /* sc */
|
||
{ TRAMP_SENTINEL_INSN, ULONGEST_MAX }
|
||
},
|
||
ppcnbsd_sigtramp_cache_init
|
||
};
|
||
|
||
/* NetBSD 2.0 introduced a slightly different signal trampoline. */
|
||
|
||
const struct tramp_frame ppcnbsd2_sigtramp =
|
||
{
|
||
SIGTRAMP_FRAME,
|
||
4,
|
||
{
|
||
{ 0x3821fff0, ULONGEST_MAX }, /* add r1,r1,-16 */
|
||
{ 0x4e800021, ULONGEST_MAX }, /* blrl */
|
||
{ 0x38610010, ULONGEST_MAX }, /* addi r3,r1,16 */
|
||
{ 0x38000127, ULONGEST_MAX }, /* li r0,295 */
|
||
{ 0x44000002, ULONGEST_MAX }, /* sc */
|
||
{ 0x38000001, ULONGEST_MAX }, /* li r0,1 */
|
||
{ 0x44000002, ULONGEST_MAX }, /* sc */
|
||
{ TRAMP_SENTINEL_INSN, ULONGEST_MAX }
|
||
},
|
||
ppcnbsd_sigtramp_cache_init
|
||
};
|
||
|
||
|
||
static void
|
||
ppcnbsd_init_abi (struct gdbarch_info info,
|
||
struct gdbarch *gdbarch)
|
||
{
|
||
nbsd_init_abi (info, gdbarch);
|
||
|
||
/* For NetBSD, this is an on again, off again thing. Some systems
|
||
do use the broken struct convention, and some don't. */
|
||
set_gdbarch_return_value (gdbarch, ppcnbsd_return_value);
|
||
|
||
/* NetBSD uses SVR4-style shared libraries. */
|
||
set_solib_svr4_fetch_link_map_offsets
|
||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||
|
||
set_gdbarch_iterate_over_regset_sections
|
||
(gdbarch, ppcnbsd_iterate_over_regset_sections);
|
||
|
||
tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd_sigtramp);
|
||
tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd2_sigtramp);
|
||
}
|
||
|
||
void _initialize_ppcnbsd_tdep ();
|
||
void
|
||
_initialize_ppcnbsd_tdep ()
|
||
{
|
||
gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_NETBSD,
|
||
ppcnbsd_init_abi);
|
||
|
||
/* Avoid initializing the register offsets again if they were
|
||
already initialized by ppc-netbsd-nat.c. */
|
||
if (ppcnbsd_reg_offsets.pc_offset == 0)
|
||
{
|
||
/* General-purpose registers. */
|
||
ppcnbsd_reg_offsets.r0_offset = 0;
|
||
ppcnbsd_reg_offsets.gpr_size = 4;
|
||
ppcnbsd_reg_offsets.xr_size = 4;
|
||
ppcnbsd_reg_offsets.lr_offset = 128;
|
||
ppcnbsd_reg_offsets.cr_offset = 132;
|
||
ppcnbsd_reg_offsets.xer_offset = 136;
|
||
ppcnbsd_reg_offsets.ctr_offset = 140;
|
||
ppcnbsd_reg_offsets.pc_offset = 144;
|
||
ppcnbsd_reg_offsets.ps_offset = -1;
|
||
ppcnbsd_reg_offsets.mq_offset = -1;
|
||
|
||
/* Floating-point registers. */
|
||
ppcnbsd_reg_offsets.f0_offset = 0;
|
||
ppcnbsd_reg_offsets.fpscr_offset = 256;
|
||
ppcnbsd_reg_offsets.fpscr_size = 4;
|
||
|
||
}
|
||
}
|