mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-03 23:56:39 +00:00
amd64-windows: 32 bytes allocated on stack by caller for integer parameter registers
* i386-tdep.h (struct gdbarch_tdep): Add new field integer_param_regs_saved_in_caller_frame. * amd64-windows-tdep.c (amd64_windows_init_abi): Set tdep->integer_param_regs_saved_in_caller_frame to 1. * amd64-tdep.c (amd64_push_dummy_call): Allocate some memory on stack if tdep->integer_param_regs_saved_in_caller_frame is set.
This commit is contained in:
parent
4966b6c228
commit
3af6ddfec6
@ -1,3 +1,14 @@
|
|||||||
|
2010-01-29 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
amd64-windows: 32 bytes allocated on stack by caller for integer
|
||||||
|
parameter registers
|
||||||
|
* i386-tdep.h (struct gdbarch_tdep): Add new field
|
||||||
|
integer_param_regs_saved_in_caller_frame.
|
||||||
|
* amd64-windows-tdep.c (amd64_windows_init_abi): Set
|
||||||
|
tdep->integer_param_regs_saved_in_caller_frame to 1.
|
||||||
|
* amd64-tdep.c (amd64_push_dummy_call): Allocate some memory on
|
||||||
|
stack if tdep->integer_param_regs_saved_in_caller_frame is set.
|
||||||
|
|
||||||
2010-01-29 Joel Brobecker <brobecker@adacore.com>
|
2010-01-29 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
amd64-windows: memory args passed by pointer during function calls.
|
amd64-windows: memory args passed by pointer during function calls.
|
||||||
|
@ -701,6 +701,7 @@ amd64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
int struct_return, CORE_ADDR struct_addr)
|
int struct_return, CORE_ADDR struct_addr)
|
||||||
{
|
{
|
||||||
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
|
||||||
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
gdb_byte buf[8];
|
gdb_byte buf[8];
|
||||||
|
|
||||||
/* Pass arguments. */
|
/* Pass arguments. */
|
||||||
@ -718,6 +719,11 @@ amd64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
|
|||||||
regcache_cooked_write (regcache, arg_regnum, buf);
|
regcache_cooked_write (regcache, arg_regnum, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reserve some memory on the stack for the integer-parameter registers,
|
||||||
|
if required by the ABI. */
|
||||||
|
if (tdep->integer_param_regs_saved_in_caller_frame)
|
||||||
|
sp -= tdep->call_dummy_num_integer_regs * 8;
|
||||||
|
|
||||||
/* Store return address. */
|
/* Store return address. */
|
||||||
sp -= 8;
|
sp -= 8;
|
||||||
store_unsigned_integer (buf, 8, byte_order, bp_addr);
|
store_unsigned_integer (buf, 8, byte_order, bp_addr);
|
||||||
|
@ -84,6 +84,7 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
tdep->call_dummy_integer_regs = amd64_windows_dummy_call_integer_regs;
|
tdep->call_dummy_integer_regs = amd64_windows_dummy_call_integer_regs;
|
||||||
tdep->classify = amd64_windows_classify;
|
tdep->classify = amd64_windows_classify;
|
||||||
tdep->memory_args_by_pointer = 1;
|
tdep->memory_args_by_pointer = 1;
|
||||||
|
tdep->integer_param_regs_saved_in_caller_frame = 1;
|
||||||
|
|
||||||
set_solib_ops (gdbarch, &solib_target_so_ops);
|
set_solib_ops (gdbarch, &solib_target_so_ops);
|
||||||
}
|
}
|
||||||
|
@ -82,12 +82,12 @@ struct gdbarch_tdep
|
|||||||
int call_dummy_num_integer_regs;
|
int call_dummy_num_integer_regs;
|
||||||
int *call_dummy_integer_regs;
|
int *call_dummy_integer_regs;
|
||||||
|
|
||||||
/* Classify TYPE according to calling conventions, and store
|
/* Used on amd64 only. Classify TYPE according to calling conventions,
|
||||||
the result in CLASS. Used on amd64 only. */
|
and store the result in CLASS. */
|
||||||
void (*classify) (struct type *type, enum amd64_reg_class class[2]);
|
void (*classify) (struct type *type, enum amd64_reg_class class[2]);
|
||||||
|
|
||||||
/* Non-zero if the first few MEMORY arguments should be passed by
|
/* Used on amd64 only. Non-zero if the first few MEMORY arguments
|
||||||
pointer.
|
should be passed by pointer.
|
||||||
|
|
||||||
More precisely, MEMORY arguments are passed through the stack.
|
More precisely, MEMORY arguments are passed through the stack.
|
||||||
But certain architectures require that their address be passed
|
But certain architectures require that their address be passed
|
||||||
@ -95,6 +95,16 @@ struct gdbarch_tdep
|
|||||||
available for argument passing. */
|
available for argument passing. */
|
||||||
int memory_args_by_pointer;
|
int memory_args_by_pointer;
|
||||||
|
|
||||||
|
/* Used on amd64 only.
|
||||||
|
|
||||||
|
If non-zero, then the callers of a function are expected to reserve
|
||||||
|
some space in the stack just before the area where the PC is saved
|
||||||
|
so that the callee may save the integer-parameter registers there.
|
||||||
|
The amount of space is dependent on the list of registers used for
|
||||||
|
integer parameter passing (see component call_dummy_num_integer_regs
|
||||||
|
above). */
|
||||||
|
int integer_param_regs_saved_in_caller_frame;
|
||||||
|
|
||||||
/* Floating-point registers. */
|
/* Floating-point registers. */
|
||||||
struct regset *fpregset;
|
struct regset *fpregset;
|
||||||
size_t sizeof_fpregset;
|
size_t sizeof_fpregset;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user