diff options
author | Joel Brobecker <brobecker@gnat.com> | 2013-09-24 16:13:58 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2013-09-24 16:13:58 +0000 |
commit | 849e9755046dee69b1032fd2a9d9001cd69ca2c7 (patch) | |
tree | 39777ac49b5da8618db0f2266af7c2f1ea30d90c /gdb/amd64-tdep.c | |
parent | c1459fd6522c2074924ddca79d447befde2b35cf (diff) | |
download | gdb-849e9755046dee69b1032fd2a9d9001cd69ca2c7.zip gdb-849e9755046dee69b1032fd2a9d9001cd69ca2c7.tar.gz gdb-849e9755046dee69b1032fd2a9d9001cd69ca2c7.tar.bz2 |
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.
Diffstat (limited to 'gdb/amd64-tdep.c')
-rw-r--r-- | gdb/amd64-tdep.c | 40 |
1 files changed, 6 insertions, 34 deletions
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index ec6bfc6..35526cf 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -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; - - 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); + int len = TYPE_LENGTH (type); + + write_memory (sp + element * 8, valbuf, len); + element += ((len + 7) / 8); } /* The psABI says that "For calls that may call functions that use |