/* Target-dependent code for GNU/Linux x86-64.
- Copyright (C) 2001-2020 Free Software Foundation, Inc.
+ Copyright (C) 2001-2021 Free Software Foundation, Inc.
Contributed by Jiri Smid, SuSE Labs.
This file is part of GDB.
#include "glibc-tdep.h"
#include "arch/amd64.h"
#include "target-descriptions.h"
+#include "expop.h"
/* The syscall's XML filename for i386. */
#define XML_SYSCALL_FILENAME_AMD64 "syscalls/amd64-linux.xml"
PC is not at the start of the instruction sequence, there will be
a few trailing readable bytes on the stack. */
- if (!safe_frame_unwind_memory (this_frame, pc, buf, sizeof buf))
+ if (!safe_frame_unwind_memory (this_frame, pc, buf))
return 0;
if (buf[0] != LINUX_SIGTRAMP_INSN0)
return 0;
pc -= LINUX_SIGTRAMP_OFFSET1;
- if (!safe_frame_unwind_memory (this_frame, pc, buf, sizeof buf))
+ if (!safe_frame_unwind_memory (this_frame, pc, buf))
return 0;
}
/* Implementation of `gdbarch_dtrace_parse_probe_argument', as defined
in gdbarch.h. */
-static void
+static expr::operation_up
amd64_dtrace_parse_probe_argument (struct gdbarch *gdbarch,
- struct expr_builder *builder,
int narg)
{
- struct stoken str;
-
/* DTrace probe arguments can be found on the ABI-defined places for
regular arguments at the current PC. The probe abstraction
currently supports up to 12 arguments for probes. */
+ using namespace expr;
+
if (narg < 6)
{
static const int arg_reg_map[6] =
};
int regno = arg_reg_map[narg];
const char *regname = user_reg_map_regnum_to_name (gdbarch, regno);
-
- write_exp_elt_opcode (builder, OP_REGISTER);
- str.ptr = regname;
- str.length = strlen (regname);
- write_exp_string (builder, str);
- write_exp_elt_opcode (builder, OP_REGISTER);
+ return make_operation<register_operation> (regname);
}
else
{
const char *regname = user_reg_map_regnum_to_name (gdbarch, AMD64_RSP_REGNUM);
/* Displacement. */
- write_exp_elt_opcode (builder, OP_LONG);
- write_exp_elt_type (builder, builtin_type (gdbarch)->builtin_long);
- write_exp_elt_longcst (builder, narg - 6);
- write_exp_elt_opcode (builder, OP_LONG);
+ struct type *long_type = builtin_type (gdbarch)->builtin_long;
+ operation_up disp = make_operation<long_const_operation> (long_type,
+ narg - 6);
/* Register: SP. */
- write_exp_elt_opcode (builder, OP_REGISTER);
- str.ptr = regname;
- str.length = strlen (regname);
- write_exp_string (builder, str);
- write_exp_elt_opcode (builder, OP_REGISTER);
+ operation_up reg = make_operation<register_operation> (regname);
- write_exp_elt_opcode (builder, BINOP_ADD);
+ operation_up add = make_operation<add_operation> (std::move (disp),
+ std::move (reg));
/* Cast to long. */
- write_exp_elt_opcode (builder, UNOP_CAST);
- write_exp_elt_type (builder,
- lookup_pointer_type (builtin_type (gdbarch)->builtin_long));
- write_exp_elt_opcode (builder, UNOP_CAST);
+ operation_up cast = make_operation<unop_cast_operation> (std::move (add),
+ long_type);
- write_exp_elt_opcode (builder, UNOP_IND);
+ return make_operation<unop_ind_operation> (std::move (cast));
}
}
static void
amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch,
- bool supports_displaced_step)
+ int num_disp_step_buffers)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
- linux_init_abi (info, gdbarch, supports_displaced_step);
+ linux_init_abi (info, gdbarch, num_disp_step_buffers);
tdep->sigtramp_p = amd64_linux_sigtramp_p;
tdep->sigcontext_addr = amd64_linux_sigcontext_addr;
if (!valid_p)
return;
- amd64_linux_init_abi_common (info, gdbarch, true);
+ amd64_linux_init_abi_common (info, gdbarch, 2);
/* Initialize the amd64_linux_record_tdep. */
/* These values are the size of the type that will be used in a system
if (!valid_p)
return;
- amd64_linux_init_abi_common (info, gdbarch, false);
+ amd64_linux_init_abi_common (info, gdbarch, 0);
/* Initialize the amd64_x32_linux_record_tdep. */
/* These values are the size of the type that will be used in a system