mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
* amd64-tdep.c (amd64_return_value): Implement
RETURN_VALUE_ABI_RETURNS_ADDRESS.
This commit is contained in:
parent
e47577ab7b
commit
6fa57a7d27
@ -1,5 +1,8 @@
|
||||
2004-05-09 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* amd64-tdep.c (amd64_return_value): Implement
|
||||
RETURN_VALUE_ABI_RETURNS_ADDRESS.
|
||||
|
||||
* m68k-tdep.c (m68k_convert_register_p, m68k_register_to_value)
|
||||
(m68k_value_to_register): New functions.
|
||||
(m68k_gdbarch_init): Set convert_register_p, register_to_value and
|
||||
|
@ -423,10 +423,27 @@ amd64_return_value (struct gdbarch *gdbarch, struct type *type,
|
||||
|
||||
/* 2. If the type has class MEMORY, then the caller provides space
|
||||
for the return value and passes the address of this storage in
|
||||
%rdi as if it were the first argument to the function. In
|
||||
effect, this address becomes a hidden first argument. */
|
||||
%rdi as if it were the first argument to the function. In effect,
|
||||
this address becomes a hidden first argument.
|
||||
|
||||
On return %rax will contain the address that has been passed in
|
||||
by the caller in %rdi. */
|
||||
if (class[0] == AMD64_MEMORY)
|
||||
return RETURN_VALUE_STRUCT_CONVENTION;
|
||||
{
|
||||
/* As indicated by the comment above, the ABI guarantees that we
|
||||
can always find the return value just after the function has
|
||||
returned. */
|
||||
|
||||
if (readbuf)
|
||||
{
|
||||
ULONGEST addr;
|
||||
|
||||
regcache_raw_read_unsigned (regcache, AMD64_RAX_REGNUM, &addr);
|
||||
read_memory (addr, readbuf, TYPE_LENGTH (type));
|
||||
}
|
||||
|
||||
return RETURN_VALUE_ABI_RETURNS_ADDRESS;
|
||||
}
|
||||
|
||||
gdb_assert (class[1] != AMD64_MEMORY);
|
||||
gdb_assert (len <= 16);
|
||||
|
Loading…
Reference in New Issue
Block a user