Revert use of memory_args_by_pointer in i386 gdbarch_tdep.

This is no longer useful, as it was introduced to reuse the funcall
handling code in amd64-tdep.c in the context of x64-windows. But
we have since then changed the implementations to be completely
independent of each other.

This reverts the non-windows-specific part of the change called:
    amd64-windows: memory args passed by pointer during function calls.
(the x64-windows portion has already been reverted)

gdb/ChangeLog:

        Revert:
        * i386-tdep.h (gdbarch_tdep): Add field memory_args_by_pointer.
        * amd64-tdep.c (amd64_push_arguments): Add handling of architectures
        where tdep->memory_args_by_pointer is non-zero.
This commit is contained in:
Joel Brobecker
2013-09-24 16:13:58 +00:00
parent c1459fd652
commit 849e975504
3 changed files with 12 additions and 42 deletions

View File

@@ -749,8 +749,7 @@ static CORE_ADDR
amd64_push_arguments (struct regcache *regcache, int nargs,
struct value **args, CORE_ADDR sp, int struct_return)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
int *integer_regs = tdep->call_dummy_integer_regs;
int num_integer_regs = tdep->call_dummy_num_integer_regs;
@@ -763,11 +762,6 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
AMD64_XMM0_REGNUM + 6, AMD64_XMM0_REGNUM + 7,
};
struct value **stack_args = alloca (nargs * sizeof (struct value *));
/* An array that mirrors the stack_args array. For all arguments
that are passed by MEMORY, if that argument's address also needs
to be stored in a register, the ARG_ADDR_REGNO array will contain
that register number (or a negative value otherwise). */
int *arg_addr_regno = alloca (nargs * sizeof (int));
int num_stack_args = 0;
int num_elements = 0;
int element = 0;
@@ -811,19 +805,7 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
{
/* The argument will be passed on the stack. */
num_elements += ((len + 7) / 8);
stack_args[num_stack_args] = args[i];
/* If this is an AMD64_MEMORY argument whose address must also
be passed in one of the integer registers, reserve that
register and associate this value to that register so that
we can store the argument address as soon as we know it. */
if (class[0] == AMD64_MEMORY
&& tdep->memory_args_by_pointer
&& integer_reg < tdep->call_dummy_num_integer_regs)
arg_addr_regno[num_stack_args] =
tdep->call_dummy_integer_regs[integer_reg++];
else
arg_addr_regno[num_stack_args] = -1;
num_stack_args++;
stack_args[num_stack_args++] = args[i];
}
else
{
@@ -878,20 +860,10 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
{
struct type *type = value_type (stack_args[i]);
const gdb_byte *valbuf = value_contents (stack_args[i]);
CORE_ADDR arg_addr = sp + element * 8;
int len = TYPE_LENGTH (type);
write_memory (arg_addr, valbuf, TYPE_LENGTH (type));
if (arg_addr_regno[i] >= 0)
{
/* We also need to store the address of that argument in
the given register. */
gdb_byte buf[8];
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
store_unsigned_integer (buf, 8, byte_order, arg_addr);
regcache_cooked_write (regcache, arg_addr_regno[i], buf);
}
element += ((TYPE_LENGTH (type) + 7) / 8);
write_memory (sp + element * 8, valbuf, len);
element += ((len + 7) / 8);
}
/* The psABI says that "For calls that may call functions that use