* x86-64-tdep.c (x86_64_init_abi): Add calls to override the i386
target where necessary. Add more comments and remove the ones that don't provide any useful information.
This commit is contained in:
parent
267bf4bb32
commit
b83b026cdc
2 changed files with 83 additions and 72 deletions
|
@ -1,5 +1,9 @@
|
|||
2002-10-26 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* x86-64-tdep.c (x86_64_init_abi): Add calls to override the i386
|
||||
target where necessary. Add more comments and remove the ones
|
||||
that don't provide any useful information.
|
||||
|
||||
* i386-tdep.c (i386_frame_saved_pc): Replace call to
|
||||
deprecated_read_register_dummy with
|
||||
frame_unwind_unsigned_register.
|
||||
|
|
|
@ -917,7 +917,7 @@ x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
int i, sum;
|
||||
|
||||
/* The x86_64 has 16 SSE registers. */
|
||||
/* The x86-64 has 16 SSE registers. */
|
||||
tdep->num_xmm_regs = 16;
|
||||
|
||||
/* This is what all the fuss is about. */
|
||||
|
@ -925,11 +925,35 @@ x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
set_gdbarch_long_long_bit (gdbarch, 64);
|
||||
set_gdbarch_ptr_bit (gdbarch, 64);
|
||||
|
||||
/* In contrast to the i386, on the x86-64 a `long double' actually
|
||||
takes up 128 bits, even though it's still based on the i387
|
||||
extended floating-point format which has only 80 significant bits. */
|
||||
set_gdbarch_long_double_bit (gdbarch, 128);
|
||||
|
||||
set_gdbarch_num_regs (gdbarch, X86_64_NUM_REGS);
|
||||
|
||||
/* Register numbers of various important registers. */
|
||||
set_gdbarch_sp_regnum (gdbarch, 7); /* %rsp */
|
||||
set_gdbarch_fp_regnum (gdbarch, 6); /* %rbp */
|
||||
set_gdbarch_pc_regnum (gdbarch, 16); /* %rip */
|
||||
set_gdbarch_ps_regnum (gdbarch, 17); /* %eflags */
|
||||
set_gdbarch_fp0_regnum (gdbarch, X86_64_NUM_GREGS); /* %st(0) */
|
||||
|
||||
/* The "default" register numbering scheme for the x86-64 is
|
||||
referred to as the "DWARF register number mapping" in the psABI.
|
||||
The preferred debugging format for all known x86-64 targets is
|
||||
actually DWARF2, and GCC doesn't seem to support DWARF (that is
|
||||
DWARF-1), but we provide the same mapping just in case. This
|
||||
mapping is also used for stabs, which GCC does support. */
|
||||
set_gdbarch_stab_reg_to_regnum (gdbarch, x86_64_dwarf2_reg_to_regnum);
|
||||
set_gdbarch_dwarf_reg_to_regnum (gdbarch, x86_64_dwarf2_reg_to_regnum);
|
||||
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, x86_64_dwarf2_reg_to_regnum);
|
||||
|
||||
/* We don't override SDB_REG_RO_REGNUM, sice COFF doesn't seem to be
|
||||
in use on any of the supported x86-64 targets. */
|
||||
|
||||
set_gdbarch_register_name (gdbarch, x86_64_register_name);
|
||||
set_gdbarch_register_size (gdbarch, 8);
|
||||
set_gdbarch_register_raw_size (gdbarch, x86_64_register_raw_size);
|
||||
set_gdbarch_register_byte (gdbarch, x86_64_register_byte);
|
||||
|
||||
/* Total amount of space needed to store our copies of the machine's
|
||||
register (SIZEOF_GREGS + SIZEOF_FPU_REGS + SIZEOF_FPU_CTRL_REGS +
|
||||
|
@ -938,92 +962,75 @@ x86_64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
sum += x86_64_register_info_table[i].size;
|
||||
set_gdbarch_register_bytes (gdbarch, sum);
|
||||
|
||||
set_gdbarch_register_raw_size (gdbarch, x86_64_register_raw_size);
|
||||
set_gdbarch_register_byte (gdbarch, x86_64_register_byte);
|
||||
set_gdbarch_register_virtual_type (gdbarch, x86_64_register_virtual_type);
|
||||
|
||||
/* FIXME: kettenis/20021026: As long as we don't support longjmp,
|
||||
that is, as long as we have `tdep->jb_pc_offset == -1', using
|
||||
i386_get_longjmp_target is fine. */
|
||||
|
||||
set_gdbarch_register_convertible (gdbarch, x86_64_register_convertible);
|
||||
set_gdbarch_register_convert_to_virtual (gdbarch,
|
||||
x86_64_register_convert_to_virtual);
|
||||
set_gdbarch_register_convert_to_raw (gdbarch,
|
||||
x86_64_register_convert_to_raw);
|
||||
|
||||
/* Register numbers of various important registers. */
|
||||
set_gdbarch_sp_regnum (gdbarch, 7); /* %rsp */
|
||||
set_gdbarch_fp_regnum (gdbarch, 6); /* %rbp */
|
||||
set_gdbarch_pc_regnum (gdbarch, 16); /* %rip */
|
||||
set_gdbarch_fp0_regnum (gdbarch, X86_64_NUM_GREGS); /* %st(0) */
|
||||
|
||||
set_gdbarch_read_fp (gdbarch, cfi_read_fp);
|
||||
|
||||
/* Discard from the stack the innermost frame, restoring all registers. */
|
||||
set_gdbarch_pop_frame (gdbarch, x86_64_pop_frame);
|
||||
|
||||
/* FRAME_CHAIN takes a frame's nominal address and produces the
|
||||
frame's chain-pointer. */
|
||||
set_gdbarch_frame_chain (gdbarch, x86_64_linux_frame_chain);
|
||||
|
||||
set_gdbarch_frameless_function_invocation (gdbarch,
|
||||
x86_64_frameless_function_invocation);
|
||||
set_gdbarch_frame_saved_pc (gdbarch, x86_64_linux_frame_saved_pc);
|
||||
|
||||
set_gdbarch_frame_init_saved_regs (gdbarch, x86_64_frame_init_saved_regs);
|
||||
|
||||
/* Frame pc initialization is handled by unwind informations. */
|
||||
set_gdbarch_init_frame_pc (gdbarch, x86_64_init_frame_pc);
|
||||
|
||||
/* Initialization of unwind informations. */
|
||||
set_gdbarch_init_extra_frame_info (gdbarch, x86_64_init_extra_frame_info);
|
||||
|
||||
/* Getting saved registers is handled by unwind informations. */
|
||||
/* Getting saved registers is handled by unwind information. */
|
||||
set_gdbarch_get_saved_register (gdbarch, cfi_get_saved_register);
|
||||
|
||||
/* FIXME: kettenis/20021026: Should we set parm_boundary to 64 here? */
|
||||
set_gdbarch_read_fp (gdbarch, cfi_read_fp);
|
||||
|
||||
/* FIXME: kettenis/20021026: Should be undeprecated. */
|
||||
set_gdbarch_extract_return_value (gdbarch, NULL);
|
||||
set_gdbarch_deprecated_extract_return_value (gdbarch,
|
||||
x86_64_extract_return_value);
|
||||
set_gdbarch_push_arguments (gdbarch, x86_64_push_arguments);
|
||||
set_gdbarch_push_return_address (gdbarch, x86_64_push_return_address);
|
||||
set_gdbarch_pop_frame (gdbarch, x86_64_pop_frame);
|
||||
set_gdbarch_store_struct_return (gdbarch, x86_64_store_struct_return);
|
||||
/* FIXME: kettenis/20021026: Should be undeprecated. */
|
||||
set_gdbarch_store_return_value (gdbarch, NULL);
|
||||
set_gdbarch_deprecated_store_return_value (gdbarch,
|
||||
x86_64_store_return_value);
|
||||
/* Override, since this is handled by x86_64_extract_return_value. */
|
||||
set_gdbarch_extract_struct_value_address (gdbarch, NULL);
|
||||
set_gdbarch_use_struct_convention (gdbarch, x86_64_use_struct_convention);
|
||||
|
||||
set_gdbarch_frame_init_saved_regs (gdbarch, x86_64_frame_init_saved_regs);
|
||||
set_gdbarch_skip_prologue (gdbarch, x86_64_skip_prologue);
|
||||
|
||||
/* Cons up virtual frame pointer for trace */
|
||||
set_gdbarch_virtual_frame_pointer (gdbarch, cfi_virtual_frame_pointer);
|
||||
|
||||
set_gdbarch_frame_chain (gdbarch, x86_64_linux_frame_chain);
|
||||
set_gdbarch_frameless_function_invocation (gdbarch,
|
||||
x86_64_frameless_function_invocation);
|
||||
/* FIXME: kettenis/20021025: Shouldn't this be set to
|
||||
generic_file_frame_chain_valid? */
|
||||
set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid);
|
||||
|
||||
set_gdbarch_push_return_address (gdbarch, x86_64_push_return_address);
|
||||
set_gdbarch_push_arguments (gdbarch, x86_64_push_arguments);
|
||||
|
||||
/* Return number of args passed to a frame, no way to tell. */
|
||||
set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
|
||||
|
||||
/* If USE_STRUCT_CONVENTION retruns 0, then gdb uses
|
||||
STORE_RETURN_VALUE and EXTRACT_RETURN_VALUE to store/fetch the
|
||||
functions return value. It is the case when structure is
|
||||
returned in registers. */
|
||||
set_gdbarch_use_struct_convention (gdbarch, x86_64_use_struct_convention);
|
||||
|
||||
/* Store the address of the place in which to copy the structure the
|
||||
subroutine will return. This is called from call_function. */
|
||||
set_gdbarch_store_struct_return (gdbarch, x86_64_store_struct_return);
|
||||
|
||||
/* Extract from an array REGBUF containing the (raw) register state
|
||||
a function return value of type TYPE, and copy that, in virtual
|
||||
format, into VALBUF. */
|
||||
set_gdbarch_deprecated_extract_return_value (gdbarch,
|
||||
x86_64_extract_return_value);
|
||||
|
||||
|
||||
/* Write into the appropriate registers a function return value
|
||||
stored in VALBUF of type TYPE, given in virtual format. */
|
||||
set_gdbarch_deprecated_store_return_value (gdbarch,
|
||||
x86_64_store_return_value);
|
||||
|
||||
set_gdbarch_skip_prologue (gdbarch, x86_64_skip_prologue);
|
||||
|
||||
/* FIXME: kettenis/20021026: These two are GNU/Linux-specific and
|
||||
should be moved elsewhere. */
|
||||
set_gdbarch_frame_saved_pc (gdbarch, x86_64_linux_frame_saved_pc);
|
||||
set_gdbarch_saved_pc_after_call (gdbarch, x86_64_linux_saved_pc_after_call);
|
||||
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
|
||||
/* Use dwarf2 debug frame informations. */
|
||||
set_gdbarch_dwarf2_build_frame_info (gdbarch, dwarf2_build_frame_info);
|
||||
set_gdbarch_dwarf2_reg_to_regnum (gdbarch, x86_64_dwarf2_reg_to_regnum);
|
||||
|
||||
set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
|
||||
/* FIXME: kettenis/20021026: This one is GNU/Linux-specific too. */
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, x86_64_linux_in_sigtramp);
|
||||
|
||||
/* Build call frame information (CFI) from DWARF2 frame debug info. */
|
||||
set_gdbarch_dwarf2_build_frame_info (gdbarch, dwarf2_build_frame_info);
|
||||
|
||||
/* Initialization of per-frame CFI. */
|
||||
set_gdbarch_init_extra_frame_info (gdbarch, x86_64_init_extra_frame_info);
|
||||
|
||||
/* Frame PC initialization is handled by using CFI. */
|
||||
set_gdbarch_init_frame_pc (gdbarch, x86_64_init_frame_pc);
|
||||
|
||||
/* Cons up virtual frame pointer for trace. */
|
||||
set_gdbarch_virtual_frame_pointer (gdbarch, cfi_virtual_frame_pointer);
|
||||
|
||||
/* FIXME: kettenis/20021026: This is ELF-specific. Fine for now,
|
||||
since all supported x86-64 targets are ELF, but that might change
|
||||
in the future. */
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
}
|
||||
|
||||
static struct gdbarch *
|
||||
|
|
Loading…
Reference in a new issue