/* Target-dependent code for the i386.
- Copyright (C) 2001-2017 Free Software Foundation, Inc.
+ Copyright (C) 2001-2021 Free Software Foundation, Inc.
This file is part of GDB.
#ifndef I386_TDEP_H
#define I386_TDEP_H
+#include "gdbarch.h"
+#include "infrun.h"
+#include "expression.h"
+
struct frame_info;
struct gdbarch;
struct reggroup;
int xsave_xcr0_offset;
/* Register names. */
- const char **register_names;
+ const char * const *register_names;
/* Register number for %ymm0h. Set this to -1 to indicate the absence
of upper YMM register support. */
int ymm0h_regnum;
/* Upper YMM register names. Only used for tdesc_numbered_register. */
- const char **ymmh_register_names;
+ const char * const *ymmh_register_names;
/* Register number for %ymm16h. Set this to -1 to indicate the absence
of support for YMM16-31. */
int ymm16h_regnum;
/* YMM16-31 register names. Only used for tdesc_numbered_register. */
- const char **ymm16h_register_names;
+ const char * const *ymm16h_register_names;
/* Register number for %bnd0r. Set this to -1 to indicate the absence
bound registers. */
int bndcfgu_regnum;
/* MPX register names. Only used for tdesc_numbered_register. */
- const char **mpx_register_names;
+ const char * const *mpx_register_names;
/* Register number for %zmm0h. Set this to -1 to indicate the absence
of ZMM_HI256 register support. */
int zmm0h_regnum;
/* OpMask register names. */
- const char **k_register_names;
+ const char * const *k_register_names;
/* ZMM register names. Only used for tdesc_numbered_register. */
- const char **zmmh_register_names;
+ const char * const *zmmh_register_names;
/* XMM16-31 register names. Only used for tdesc_numbered_register. */
- const char **xmm_avx512_register_names;
+ const char * const *xmm_avx512_register_names;
/* YMM16-31 register names. Only used for tdesc_numbered_register. */
- const char **ymm_avx512_register_names;
+ const char * const *ymm_avx512_register_names;
+
+ /* Number of PKEYS registers. */
+ int num_pkeys_regs;
+
+ /* Register number for PKRU register. */
+ int pkru_regnum;
+
+ /* PKEYS register names. */
+ const char * const *pkeys_register_names;
+
+ /* Register number for %fsbase. Set this to -1 to indicate the
+ absence of segment base registers. */
+ int fsbase_regnum;
/* Target description. */
const struct target_desc *tdesc;
/* Floating-point registers. */
-/* All FPU control regusters (except for FIOFF and FOOFF) are 16-bit
+/* All FPU control registers (except for FIOFF and FOOFF) are 16-bit
(at most) in the FPU, but are zero-extended to 32 bits in GDB's
register cache. */
I386_K0_REGNUM, /* %k0 */
I386_K7_REGNUM = I386_K0_REGNUM + 7,
I386_ZMM0H_REGNUM, /* %zmm0h */
- I386_ZMM7H_REGNUM = I386_ZMM0H_REGNUM + 7
+ I386_ZMM7H_REGNUM = I386_ZMM0H_REGNUM + 7,
+ I386_PKRU_REGNUM,
+ I386_FSBASE_REGNUM,
+ I386_GSBASE_REGNUM
};
/* Register numbers of RECORD_REGMAP. */
#define I386_AVX_NUM_REGS (I386_YMM7H_REGNUM + 1)
#define I386_MPX_NUM_REGS (I386_BNDSTATUS_REGNUM + 1)
#define I386_AVX512_NUM_REGS (I386_ZMM7H_REGNUM + 1)
+#define I386_PKEYS_NUM_REGS (I386_PKRU_REGNUM + 1)
+#define I386_NUM_REGS (I386_GSBASE_REGNUM + 1)
/* Size of the largest register. */
#define I386_MAX_REGISTER_SIZE 64
-extern struct target_desc *tdesc_i386;
-
/* Types for i386-specific registers. */
extern struct type *i387_ext_type (struct gdbarch *gdbarch);
extern int i386_k_regnum_p (struct gdbarch *gdbarch, int regnum);
extern int i386_zmm_regnum_p (struct gdbarch *gdbarch, int regnum);
extern int i386_zmmh_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern bool i386_pkru_regnum_p (struct gdbarch *gdbarch, int regnum);
extern const char *i386_pseudo_register_name (struct gdbarch *gdbarch,
int regnum);
int regnum);
extern void i386_pseudo_register_read_into_value (struct gdbarch *gdbarch,
- struct regcache *regcache,
+ readable_regcache *regcache,
int regnum,
struct value *result);
extern CORE_ADDR i386_skip_main_prologue (struct gdbarch *gdbarch,
CORE_ADDR pc);
+/* The "push_dummy_call" gdbarch method, optionally with the thiscall
+ calling convention. */
+extern CORE_ADDR i386_thiscall_push_dummy_call (struct gdbarch *gdbarch,
+ struct value *function,
+ struct regcache *regcache,
+ CORE_ADDR bp_addr,
+ int nargs, struct value **args,
+ CORE_ADDR sp,
+ function_call_return_method
+ return_method,
+ CORE_ADDR struct_addr,
+ bool thiscall);
+
/* Return whether the THIS_FRAME corresponds to a sigtramp routine. */
extern int i386_sigtramp_p (struct frame_info *this_frame);
void *cb_data,
const struct regcache *regcache);
-extern struct displaced_step_closure *i386_displaced_step_copy_insn
+typedef buf_displaced_step_copy_insn_closure
+ i386_displaced_step_copy_insn_closure;
+
+extern displaced_step_copy_insn_closure_up i386_displaced_step_copy_insn
(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to,
struct regcache *regs);
-extern void i386_displaced_step_fixup (struct gdbarch *gdbarch,
- struct displaced_step_closure *closure,
- CORE_ADDR from, CORE_ADDR to,
- struct regcache *regs);
+extern void i386_displaced_step_fixup
+ (struct gdbarch *gdbarch, displaced_step_copy_insn_closure *closure,
+ CORE_ADDR from, CORE_ADDR to, regcache *regs);
/* Initialize a basic ELF architecture variant. */
extern void i386_elf_init_abi (struct gdbarch_info, struct gdbarch *);
/* Initialize a SVR4 architecture variant. */
extern void i386_svr4_init_abi (struct gdbarch_info, struct gdbarch *);
+/* Convert SVR4 register number REG to the appropriate register number
+ used by GDB. */
+extern int i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg);
+
extern int i386_process_record (struct gdbarch *gdbarch,
- struct regcache *regcache, CORE_ADDR addr);
-extern const struct target_desc *i386_target_description (uint64_t xcr0);
+ struct regcache *regcache, CORE_ADDR addr);
+extern const struct target_desc *i386_target_description (uint64_t xcr0,
+ bool segments);
/* Return true iff the current target is MPX enabled. */
extern int i386_mpx_enabled (void);
extern CORE_ADDR i386obsd_sigtramp_end_addr;
extern int i386fbsd4_sc_reg_offset[];
extern int i386fbsd_sc_reg_offset[];
-extern int i386nbsd_sc_reg_offset[];
extern int i386obsd_sc_reg_offset[];
extern int i386bsd_sc_reg_offset[];
extern int i386_stap_is_single_operand (struct gdbarch *gdbarch,
const char *s);
-extern int i386_stap_parse_special_token (struct gdbarch *gdbarch,
- struct stap_parse_info *p);
+extern expr::operation_up i386_stap_parse_special_token
+ (struct gdbarch *gdbarch, struct stap_parse_info *p);
#endif /* i386-tdep.h */