From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 436743858D32 for ; Tue, 18 Oct 2022 01:07:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 436743858D32 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-512-xVJtR9N7Na2PszNj2DoNuQ-1; Mon, 17 Oct 2022 21:06:59 -0400 X-MC-Unique: xVJtR9N7Na2PszNj2DoNuQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 17ACD8630C5; Tue, 18 Oct 2022 01:06:59 +0000 (UTC) Received: from f35-zws-1 (unknown [10.2.17.47]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9C7B9109EF60; Tue, 18 Oct 2022 01:06:58 +0000 (UTC) Date: Mon, 17 Oct 2022 18:06:57 -0700 From: Kevin Buettner To: Carl Love Cc: gdb-patches@sourceware.org, Ulrich Weigand Subject: Re: [PATCH 2/2] PowerPC, fix support for printing the function return value for non-trivial values. Message-ID: <20221017180657.54a9aeec@f35-zws-1> In-Reply-To: <41e8f94ed30fb22c94a05a0823de2f5ae2250334.camel@us.ibm.com> References: <28ce795ca489f69829207b2a7a535cf7f77f6dd8.camel@us.ibm.com> <8decd662134d57e8caf43960a1cdc47723e2bfe3.camel@us.ibm.com> <79d82ed277308ed5ce312bff398e770ab234390a.camel@us.ibm.com> <63f21a897f452d81a73fb386cb99110a359ef0b7.camel@de.ibm.com> <97275f61ef101a12cde8e5a45008ed8e479424eb.camel@us.ibm.com> <191f5826b228a7614c084c9704b086851d418c78.camel@us.ibm.com> <5405a79ecd6ed34646ad77eed0779063ee222d37.camel@de.ibm.com> <1d55efe113cdcf96b812055ee45196a554c4ca78.camel@us.ibm.com> <20221013194959.7164bb86@f35-zws-1> <41e8f94ed30fb22c94a05a0823de2f5ae2250334.camel@us.ibm.com> Organization: Red Hat MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Oct 2022 01:07:06 -0000 On Fri, 14 Oct 2022 16:23:58 -0700 Carl Love wrote: > > 2) Whitespace complaints: > > > > Applying: PowerPC, fix support for printing the function return value > > for non-trivial values. > > ...patch:161: indent with spaces. > > "gdbarch_dump: get_return_buf_addr = <%s>\n", > > ...patch:162: indent with spaces. > > host_address_to_string (gdbarch- > > >get_return_buf_addr)); > > ...patch:182: indent with spaces. > > gdbarch_get_return_buf_addr_ftype > > get_return_buf_addr) > > warning: 3 lines add whitespace errors. > > > > (I substituted some long paths local to my machines w/ '...'.) > > Yes, I have seen the complaints about the white spaces. The whitespace > complaints come from file gdb/gdbarch.c which is a generated file. As > I assume you know, the file was regenerated by the gdb/gdbarch.py based > on the changes to gdb/gdbarch-components.py. The regenerated file is > set to read only. Not sure what I can do to rectify the white spaces? > Any ideas? If the unwanted white space is generated by gdbarch.py,maybe fix that script? That said, if those files already have this problem, I'm okay with it going in with the whitespace complaints. (It can be fixed in a later patch addressing just that problem.) > > I already mentioned this last week, but... > > > > s/GDB ABI/gdbarch method/ > > > > I guess you could also refer to it as an API which you did later on > > in your commit remarks. (What I really object to is calling it an > > "ABI", which it definitely is not - that said it's easy to mis-type > > API > > as ABI, so I do understand this mistake.) > > Yea, I think referring to it as a new gdbarch method is probably better > than GDB API/ABI. I have changed the GDB API/ABI references to gdbarch > method. I will need to update that in the message to the GDB > maintainers as well when I send the next version of the patch. Sounds good. > > > value of r3 on entry to the function. This requires the use of the > > > -fvar-tracking compiler option to compile the user application thus > > > generating the DW_OP_entry_value in the binary. The DW_OP_entries > > > in the > > > > I don't think that "DW_OP_entries" is correct here. Maybe > > "DW_OP_entry_value > > entries"? > > > > binary file enables GDB can resolve the DW_TAG_call_sites. This > > > new API > > > > Maybe instead of "enables GDB can resolve the DW_TAG_call_sites", say > > "allow GDB to resolve the DW_TAG_call_site entries". > > > > > > > is used to get the return buffer address, in the case of a function > > > returning a nontrivial data type, on exit from the function. The > > > GDB > > > function should_stop checks to see if RETURN_BUF is non-zero. By > > > default, > > > RETURN_BUF will be set to zero by the new ABI call for all > > > architectures > > > > s/ABI/API/ > > > > > but PowerPC. The get_return_value function will be used to obtain > > > the > > > return value on these architectures as is currently being done if > > > RETURN_BUF is zero. On PowerPC, the new ABI will return a nonzero > > > address > > > in RETURN_BUF if the value can be determined. The value_at > > > function uses > > > the return buffer address to get the return value. > > So, I tried to address all of the above comments about ABI, > "DW_OP_entries" etc. The paragraph now reads: > > This patch adds a new gdbarch method to allow PowerPC to access the value > of r3 on entry to a function. On PowerPC, the new gdb arch method attempts > to use the DW_OP_entry_value for the DWARF entries, when exiting the > function, to determine the value of r3 on entry to the function. This > requires the use of the -fvar-tracking compiler option to compile the > user application thus generating the DW_OP_entry_value in the binary. The > DW_OP_entry_value entries in the binary file allows GDB to resolve the > DW_TAG_call_site entries. This new gdbarch method is used to get the > return buffer address, in the case of a function returning a nontrivial > data type, on exit from the function. The GDB function should_stop checks > to see if RETURN_BUF is non-zero. By default, RETURN_BUF will be set to > zero by the new gdbarch method call for all architectures except PowerPC. > The get_return_value function will be used to obtain the return value on > all other architectures as is currently being done if RETURN_BUF is zero. > On PowerPC, the new gdbarch method will return a nonzero address in > RETURN_BUF if the value can be determined. The value_at function uses the > return buffer address to get the return value. > > Which I think covers all of the comments above. Yes, this looks good, though I'd use 'gdbarch' in place of 'gdb arch'. This is a small nit though; if you'd prefer to make them separate words, I won't argue about it. > > > if (execution_direction == EXEC_REVERSE) > > > diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c > > > index 14effb93210..59145f9f166 100644 > > > --- a/gdb/ppc-sysv-tdep.c > > > +++ b/gdb/ppc-sysv-tdep.c > > > @@ -28,6 +28,7 @@ > > > #include "objfiles.h" > > > #include "infcall.h" > > > #include "dwarf2.h" > > > +#include "dwarf2/loc.h" > > > #include "target-float.h" > > > #include > > > > > > @@ -2156,3 +2157,39 @@ ppc64_sysv_abi_return_value (struct gdbarch > > > *gdbarch, struct value *function, > > > return RETURN_VALUE_STRUCT_CONVENTION; > > > } > > > > > > +CORE_ADDR ppc64_sysv_get_return_buf_addr (struct type *val_type, > > > + frame_info *cur_frame) > > > +{ > > > + /* On PowerPC, the ABI specifies r3 is the address where an > > > argument > > > > s/specifies/specifies that/ > > > > I'm not sure about this phrase: "where an argument and". If you > > mean > > to say that r3 is sometimes used for arguments (when it's not used > > for > > the address of the return value buffer), then that's true, but it's > > not relevant here. > > > > So, I guess that I'm asking that this comment be reworded somewhat. > > > > > + and the return value is stored. The PowerPC ABI does not > > > guarantee > > > + r3 will be preserved when the function returns. The function > > > returns > > > + the address of the buffer stored in r3. > > > > I find this part confusing. If the function returns the address of > > the buffer, doesn't it do so by returning it in r3? (And, if so, it > > seems to me that this code would be unnecessary - so, clearly, I must > > be missing something...) > > > > + > > > + Attempt to determine the value of r3 on entry to the function > > > using the > > > + DW_OP_entry_value DWARF entries. This requires compiling the > > > user > > > + program with -fvar-tracking to resolve the DW_TAG_call_sites > > > in the > > > + binary file. */ > > OK, so some rework here to make things a bit better. I changed the > header comment for function ppc64_sysv_get_return_buf_addr to the > following. Hopefully this addresses the various questions and > comments. > > /* The PowerPC ABI specifies aggregates that are not returned by value > are returned in a storage buffer provided by the caller. The > address of the storage buffer is provided as a hidden first input > arguement in register r3. The PowerPC ABI does not guarantee that > register r3 will not be changed while executing the function. Hence, it > cannot be assumed that r3 will still contain the address of the storage > buffer when execution reaches the end of the function. > > This function attempts to determine the value of r3 on entry to the > function using the DW_OP_entry_value DWARF entries. This requires > compiling the user program with -fvar-tracking to resolve the > DW_TAG_call_sites in the binary file. */ > > Hopefully that is clearer and clears up any confusion as to the role of r3. Thanks for reworking that comment. > > > + catch (const gdb_exception_error &e) > > > + { > > > + warning ("Cannot determine the function return value.\n" > > > + "Try compiling with -fvar-tracking."); > > > > Will this warning be printed a lot? (I'm wondering if there should > > be a > > way to shut it off...) > > Hmm, hard to say how often it will get printed. It is going to be up > to what the user is trying to do. If they are stopping on the return > of functions that return non-trivial structures, they will see the > message for every function. Otherwise, the message should not get > printed. > > Not aware of anyway we could prompt the user to ask them if they want > to suppress this message from the command line. If there is, can you > give me a pointer to an example? > > We could do something like: > > catch (const gdb_exception_error &e) > { > static int warned = 0; > > if (warned++ < 6) > warning ("Cannot determine the function return value.\n" > "Try compiling with -fvar-tracking."); > } > > So the warning is only printed the first five or whatever number of > times we want before suppressing the message. Not sure what the right > number of times should be? > > Would adding something like this be agreeable? Maybe. If we go that route, I'd recommend printing an additional message along side the last "Cannot determine the function return value." message indicating that these messages are now being suppressed. We have several mechanisms in gdb for suppressing messages already. Probably the most used one is the "complaints" facility for supressing warnings while reading symbols. (See gdb/complaints.{h,c}.) I recently added a bfd error supression mechanism in gdb_bfd.c. Look for gdb_bfd_error_handler() in that file. There's also lim_warning() in ada-lang.c along with an old FIXME remark indicating that it's doing something similar to that of complaint(). There may be others, but I don't know for sure. None of them prompt the user about whether to continue to print warnings; I'd prefer not to do it that way. Hard coding it to six (or something) is okay. Making it user-settable with some default is also okay. That said, this is just one message. It seems like overkill to add a setting for this one message. After thinking about this a bit more, I think we should go with your original code which doesn't suppress any messages. If we find that it's too noisy, we can add something along the lines of what you suggested above. Kevin