diff options
author | David S. Miller <davem@redhat.com> | 2013-02-06 19:40:04 +0000 |
---|---|---|
committer | David S. Miller <davem@redhat.com> | 2013-02-06 19:40:04 +0000 |
commit | bbfdfe1c572ca7710cf08607db4935e8c8db174c (patch) | |
tree | 9b17fe788ec840a339b176b8fd82ebe353cef5fe /gdb/stack.c | |
parent | bc9abe4a9122ac5984bb05ecd895ddeec6c8a67c (diff) | |
download | gdb-bbfdfe1c572ca7710cf08607db4935e8c8db174c.zip gdb-bbfdfe1c572ca7710cf08607db4935e8c8db174c.tar.gz gdb-bbfdfe1c572ca7710cf08607db4935e8c8db174c.tar.bz2 |
Allow struct 'return' on 32-bit sparc.
gdb/
* sparc-tdep.c (sparc32_return_value): Handle writing return value when
using RETURN_VALUE_ABI_PRESERVES_ADDRESS.
* value.c (struct_return_convention): New function.
(using_struct_return): Implement in terms of struct_return_convention.
* value.h (struct_return_convention): Declare.
* stack.c (return_command): Allow successful overriding of the return
value when RETURN_VALUE_ABI_PRESERVES_ADDRESS.
Diffstat (limited to 'gdb/stack.c')
-rw-r--r-- | gdb/stack.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/gdb/stack.c b/gdb/stack.c index bfec1b8..9f4aafc 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -2278,6 +2278,7 @@ down_command (char *count_exp, int from_tty) void return_command (char *retval_exp, int from_tty) { + enum return_value_convention rv_conv; struct frame_info *thisframe; struct gdbarch *gdbarch; struct symbol *thisfun; @@ -2331,6 +2332,7 @@ return_command (char *retval_exp, int from_tty) if (thisfun != NULL) function = read_var_value (thisfun, thisframe); + rv_conv = RETURN_VALUE_REGISTER_CONVENTION; if (TYPE_CODE (return_type) == TYPE_CODE_VOID) /* If the return-type is "void", don't try to find the return-value's location. However, do still evaluate the @@ -2338,14 +2340,18 @@ return_command (char *retval_exp, int from_tty) is discarded, side effects such as "return i++" still occur. */ return_value = NULL; - else if (thisfun != NULL - && using_struct_return (gdbarch, function, return_type)) + else if (thisfun != NULL) { - query_prefix = "The location at which to store the " - "function's return value is unknown.\n" - "If you continue, the return value " - "that you specified will be ignored.\n"; - return_value = NULL; + rv_conv = struct_return_convention (gdbarch, function, return_type); + if (rv_conv == RETURN_VALUE_STRUCT_CONVENTION + || rv_conv == RETURN_VALUE_ABI_RETURNS_ADDRESS) + { + query_prefix = "The location at which to store the " + "function's return value is unknown.\n" + "If you continue, the return value " + "that you specified will be ignored.\n"; + return_value = NULL; + } } } @@ -2375,9 +2381,8 @@ return_command (char *retval_exp, int from_tty) struct type *return_type = value_type (return_value); struct gdbarch *gdbarch = get_regcache_arch (get_current_regcache ()); - gdb_assert (gdbarch_return_value (gdbarch, function, return_type, NULL, - NULL, NULL) - == RETURN_VALUE_REGISTER_CONVENTION); + gdb_assert (rv_conv != RETURN_VALUE_STRUCT_CONVENTION + && rv_conv != RETURN_VALUE_ABI_RETURNS_ADDRESS); gdbarch_return_value (gdbarch, function, return_type, get_current_regcache (), NULL /*read*/, value_contents (return_value) /*write*/); |