From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 831F13858C62 for ; Mon, 26 Sep 2022 17:06:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 831F13858C62 Received: from [10.0.0.11] (unknown [217.28.27.60]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id CCF3D1E0D5; Mon, 26 Sep 2022 13:06:30 -0400 (EDT) Message-ID: <509056c3-8388-6db8-d82d-1f7dac55ed6c@simark.ca> Date: Mon, 26 Sep 2022 13:06:30 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.3.0 Subject: Re: [PATCH 4/4] gdb/fortran: Fix sizeof intrinsic for Fortran To: Nils-Christian Kempke , gdb-patches@sourceware.org Cc: tom@tromey.com References: <20220920072629.2736207-1-nils-christian.kempke@intel.com> <20220920072629.2736207-5-nils-christian.kempke@intel.com> Content-Language: en-US From: Simon Marchi In-Reply-To: <20220920072629.2736207-5-nils-christian.kempke@intel.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, SPF_HELO_PASS, SPF_PASS, 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: Mon, 26 Sep 2022 17:06:33 -0000 On 2022-09-20 03:26, Nils-Christian Kempke via Gdb-patches wrote: > The sizeof operator in Fortran behaves differently from e.g. C/Cpp in > that it can be applied to pointers. We thus dereference pointers before > evaluating their size. A test has been added for the Fortran sizeof > operator. > --- > gdb/eval.c | 3 + > gdb/testsuite/gdb.fortran/sizeof.exp | 110 +++++++++++++++++++++++++++ > gdb/testsuite/gdb.fortran/sizeof.f90 | 108 ++++++++++++++++++++++++++ > 3 files changed, 221 insertions(+) > create mode 100644 gdb/testsuite/gdb.fortran/sizeof.exp > create mode 100644 gdb/testsuite/gdb.fortran/sizeof.f90 > > diff --git a/gdb/eval.c b/gdb/eval.c > index ce1d883aa86..bb6b757d452 100644 > --- a/gdb/eval.c > +++ b/gdb/eval.c > @@ -2730,6 +2730,9 @@ evaluate_subexp_for_sizeof_base (struct expression *exp, struct type *type) > if (exp->language_defn->la_language == language_cplus > && (TYPE_IS_REFERENCE (type))) > type = check_typedef (TYPE_TARGET_TYPE (type)); > + else if (exp->language_defn->la_language == language_fortran > + && type->code () == TYPE_CODE_PTR) > + type = check_typedef (TYPE_TARGET_TYPE (type)); Do you need yo handle TYPE_CODE_REF for fortran too? > return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type)); > } > > diff --git a/gdb/testsuite/gdb.fortran/sizeof.exp b/gdb/testsuite/gdb.fortran/sizeof.exp > new file mode 100644 > index 00000000000..f353e8c4dd9 > --- /dev/null > +++ b/gdb/testsuite/gdb.fortran/sizeof.exp > @@ -0,0 +1,110 @@ > +# Copyright 2022 Free Software Foundation, Inc. > + > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; either version 3 of the License, or > +# (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program. If not, see . > + > +# Testing GDB's implementation of SIZE keyword. > + > +if {[skip_fortran_tests]} { return -1 } > + > +standard_testfile ".f90" > +load_lib fortran.exp > + > +if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \ > + {debug f90}]} { > + return -1 > +} > + > +if ![fortran_runto_main] { > + return -1 > +} > + > +gdb_breakpoint [gdb_get_line_number "Test breakpoint"] > +gdb_breakpoint [gdb_get_line_number "Past unassigned pointers"] > +gdb_breakpoint [gdb_get_line_number "Final breakpoint"] > + > +set done_unassigned 0 > +set found_final_breakpoint 0 > +set test_count 0 > +while { $test_count < 200 } { > + with_test_prefix "test $test_count" { > + incr test_count > + > + gdb_test_multiple "continue" "continue" { > + -re -wrap "! Test breakpoint" { > + # We can run a test from here. > + } > + -re -wrap "! Past unassigned pointers" { > + # Done with testing unassigned pointers. > + set done_unassigned 1 > + continue > + } > + -re -wrap "! Final breakpoint" { > + # We're done with the tests. > + set found_final_breakpoint 1 > + } > + } > + > + if ($found_final_breakpoint) { > + break > + } > + > + # First grab the expected answer. > + set answer [get_valueof "" "answer" "**unknown**"] > + > + # Now move up a frame and figure out a command for us to run > + # as a test. > + set command "" > + gdb_test_multiple "up" "up" { > + -re -wrap "\r\n\[0-9\]+\[ \t\]+call test_sizeof \\((\[^\r\n\]+)\\)" { > + set command $expect_out(1,string) > + } > + } > + > + gdb_assert { ![string equal $command ""] } "found a command to run" > + > + set is_pointer_to_array [string match "sizeof (*a_p)*" $command] > + > + if {$done_unassigned || !$is_pointer_to_array} { > + gdb_test "p $command" " = $answer" > + } else { > + # Gfortran, ifx and ifort have slightly differnt behavior for > + # unassigned pointers to arrays. While ifx and ifort will print 0 > + # as the sizeof result, gfortran will print the size of the base > + # type of the pointer/array. Since the default behavior in GDB was > + # to print 0 we keep this and make an exception for gfortran here. > + gdb_test_multiple "p $command" "p $command" { > + -re -wrap " = $answer" { > + pass $gdb_test_name > + } > + -re -wrap " = 0" { > + pass $gdb_test_name > + } > + } > + } > + } > +} Can you add some comments to explain what is going on here with the big loop? It's a bit of an unusual structure, so it would help to explain it. Simon