This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
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 (éå)