From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31174 invoked by alias); 25 Apr 2012 10:47:39 -0000 Received: (qmail 31165 invoked by uid 22791); 25 Apr 2012 10:47:38 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 25 Apr 2012 10:47:25 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1SMzkq-0000MC-R4 from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Wed, 25 Apr 2012 03:47:24 -0700 Received: from SVR-ORW-FEM-05.mgc.mentorg.com ([147.34.97.43]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Wed, 25 Apr 2012 03:47:24 -0700 Received: from [127.0.0.1] (147.34.91.1) by svr-orw-fem-05.mgc.mentorg.com (147.34.97.43) with Microsoft SMTP Server id 14.1.289.1; Wed, 25 Apr 2012 03:47:23 -0700 Message-ID: <4F97D686.70306@codesourcery.com> Date: Wed, 25 Apr 2012 11:02:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:11.0) Gecko/20120412 Thunderbird/11.0.1 MIME-Version: 1.0 To: Subject: Re: [PATCH 1/4] New gdb arch hook: return_with_first_hidden_param_p References: <1334755073-26528-1-git-send-email-yao@codesourcery.com> In-Reply-To: <1334755073-26528-1-git-send-email-yao@codesourcery.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-04/txt/msg00856.txt.bz2 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 > Chung-Lin Tang > > * 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 (齐尧)