This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/4] New gdb arch hook: return_with_first_hidden_param_p


On 04/18/2012 09:17 PM, Yao Qi wrote:
> Hi, this patch series is about fixing return values in C++ in GDB inf-call.
> 
> In C++ ABI, section 3.1.4:
> 
> "...if the return value type has a non-trivial copy constructor or
> destructor, the caller allocates space for a temporary, and passes a
> pointer to the temporary as an implicit first parameter preceding both
> the this parameter and user parameters. The callee constructs the return
> value into this temporary."
> 
> Looks GDB is correct on handling C++ inf-call of return value (by checking
> language_pass_by_reference).  Unfortunately, GCC is not correct here.
> currently GCC processes the return value RTL expanding like this, in
> gcc/function.c:assign_parms_augmented_arg_list():
> 
>   /* If struct value address is treated as the first argument, make it
> so.  */
>   if (aggregate_value_p (DECL_RESULT (fndecl), fndecl)
>       && ! cfun->returns_pcc_struct
>       && targetm.calls.struct_value_rtx (TREE_TYPE (fndecl), 1) == 0)
>     {
>       tree type = build_pointer_type (TREE_TYPE (fntype));
>       tree decl;
>       ...
> 
> The use of the TARGET_STRUCT_VALUE_RTX hook to determine whether to
> honor this convention, effectively makes what should be a
> language-dependent rule, into a target-dependent convention instead.
> 
> The ia64 hook takes care to detect the C++ types to return NULL (which
> is referred to in the comments as an ABI bug resolved in G++ 3.4).
> Looking across other targets, sh, c6x, m68k, are examples of targets
> which always return non-NULL in their TARGET_STRUCT_VALUE_RTX hooks, and
> are exactly those that I also predicted and reproduced the same
> symptoms.
> 
> C++ ABI is intended to be cross-architecture, but C++ ABI ends up being
> target-dependent at some points.  In practice, GDB has to know which
> architecture is special.
> 
> As I said above, GCC changes a language-dependent rule to a
> target-dependent rule 'by mistake', so GDB has to be aware of this.  That
> is the motivation to create this new gdbarch hook.  If the hook is not
> installed, the default version still complies to existing GDB's behavior,
> nothing is changed.
> 
> gdb:
> 
> 2012-04-16  Yao Qi  <yao@codesourcery.com>
> 	    Chung-Lin Tang <cltang@codesourcery.com>
> 
> 	* arch-utils.c (default_return_with_first_hidden_param_p): New.
> 	* arch-utils.h: Declare.
> 	* gdbarch.sh: Add return_with_first_hidden_param_p.
> 	* gdbarch.c, gdbarch.h: Regenerated.
> 	* infcall.c (call_function_by_hand): Call gdbarch_return_with_first_hidden_param_p
> 	instead of language_pass_by_reference.

Ping.  http://sourceware.org/ml/gdb-patches/2012-04/msg00565.html

-- 
Yao (éå)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]