[RFC] fixing extract_struct_value_address

Michael Snyder msnyder@redhat.com
Thu Aug 22 11:17:00 GMT 2002


Andrew Cagney wrote:
> 
> > 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

Wouldn't that only work for targets that return the value on the stack?
Those targets already work properly (I think the 386 is one).
I'm concerned here with targets where the struct is returned
by reference (thru a pointer provided by the caller.)


> 
> > 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?
> >



More information about the Gdb-patches mailing list