This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFC] fixing extract_struct_value_address
- From: Andrew Cagney <ac131313 at ges dot redhat dot com>
- To: Michael Snyder <msnyder at redhat dot com>
- Cc: gdb-patches at sources dot redhat dot com, kevinb at redhat dot com,cagney at redhat dot com, Elena Zannoni <ezannoni at redhat dot com>
- Date: Thu, 22 Aug 2002 11:15:40 -0400
- Subject: Re: [RFC] fixing extract_struct_value_address
- References: <3D6418C5.FBF117D@redhat.com>
Problem: Find a function's return value when it is a struct
returned by reference (thru a pointer).
Hmm,
As far as I know, there are two cases:
1. a normal function forced to return:
(gdb) break foo
(gdb) finish
2. an inferior function call:
(gdb) print foo()
I don't think the first case has a solution (unless the debug info steps
forward with the answer we need).
For the latter case, the inferior function code contains:
/* Figure out the value returned by the function. */
/* elz: I defined this new macro for the hppa architecture only.
this gives us a way to get the value returned by the function from
the stack,
at the same address we told the function to put it.
We cannot assume on the pa that r28 still contains the address of
the returned
structure. Usually this will be overwritten by the callee.
I don't know about other architectures, so I defined this macro
*/
#ifdef VALUE_RETURNED_FROM_STACK
if (struct_return)
{
do_cleanups (retbuf_cleanup);
return VALUE_RETURNED_FROM_STACK (value_type, struct_addr);
}
#endif
{
struct value *retval = value_being_returned (value_type, retbuf,
struct_return);
do_cleanups (retbuf_cleanup);
return retval;
}
}
I get the feeling that all that is needed is for the above to be enabled
for all targets.
enjoy,
Andrew
Solution level one: Take the value of the register that was
used by the caller to pass the struct return address.
Shortcoming: that register isn't preserved, so may be clobbered.
Solution level two: Save the struct_return address when it
is passed to store_struct_return (or push_arguments), and
recover it when it is needed by extract_struct_value_address.
Shortcoming: Not reentrant. Nested function calls will clobber it.
Proposed solution: create a stack structure, and "push" the
struct_return address in store_struct_return, popping it in
extract_return_address. If you can't find it on the stack,
then use the value of the appropriate arg0 register.
I think this should work for most targets, so the code for
managing the stack can be shared.
What do you think?