From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id 16DBC38197E3 for ; Fri, 16 Sep 2022 15:11:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 16DBC38197E3 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 40D0F1FB4E; Fri, 16 Sep 2022 15:11:30 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 2F0641346B; Fri, 16 Sep 2022 15:11:30 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id DIzWCiKSJGOZagAAMHmgww (envelope-from ); Fri, 16 Sep 2022 15:11:30 +0000 Message-ID: Date: Fri, 16 Sep 2022 17:11:29 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.12.0 Subject: Re: [PATCH][gdb/tdep] Fix PowerPC IEEE 128-bit format arg passing Content-Language: en-US From: Tom de Vries To: gdb-patches@sourceware.org Cc: Ulrich Weigand , Carl Love References: <20220912090146.GA9403@delia.home> In-Reply-To: <20220912090146.GA9403@delia.home> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, SPF_HELO_NONE, 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: Fri, 16 Sep 2022 15:11:35 -0000 On 9/12/22 11:01, Tom de Vries wrote: > Hi, > > On a powerpc system with gcc 12 built to default to 128-bit IEEE long double, > I run into: > ... > (gdb) print find_max_long_double_real(4, ldc1, ldc2, ldc3, ldc4)^M > $8 = 0 + 0i^M > (gdb) FAIL: gdb.base/varargs.exp: print \ > find_max_long_double_real(4, ldc1, ldc2, ldc3, ldc4) > ... > > This is due to incorrect handling of the argument in ppc64_sysv_abi_push_param. > > Fix this and similar cases, and expand the test-case to test handling of > homogeneous aggregates. > > Tested on ppc64le-linux, power 10. > > Co-Authored-By: Ulrich Weigand > Tested-by: Carl Love > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29543 > Committed. Thanks, - Tom > Any comments? > > Thanks, > - Tom > > [gdb/tdep] Fix PowerPC IEEE 128-bit format arg passing > > --- > gdb/ppc-sysv-tdep.c | 25 +++++++++++++++++++------ > gdb/testsuite/gdb.base/varargs.c | 28 ++++++++++++++++++++++++++++ > gdb/testsuite/gdb.base/varargs.exp | 2 ++ > 3 files changed, 49 insertions(+), 6 deletions(-) > > diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c > index 1fe81b95f6c..78bb40e49e4 100644 > --- a/gdb/ppc-sysv-tdep.c > +++ b/gdb/ppc-sysv-tdep.c > @@ -1444,7 +1444,7 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch, > == floatformats_ieee_quad)) > { > /* IEEE FLOAT128, args in vector registers. */ > - ppc64_sysv_abi_push_val (gdbarch, val, TYPE_LENGTH (type), 0, argpos); > + ppc64_sysv_abi_push_val (gdbarch, val, TYPE_LENGTH (type), 16, argpos); > ppc64_sysv_abi_push_vreg (gdbarch, val, argpos); > } > else if (type->code () == TYPE_CODE_FLT > @@ -1514,7 +1514,10 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch, > } > else > { > - ppc64_sysv_abi_push_val (gdbarch, val, TYPE_LENGTH (type), 0, argpos); > + /* Align == 0 is correct for ppc64_sysv_abi_push_freg, > + Align == 16 is correct for ppc64_sysv_abi_push_vreg. > + Default to 0. */ > + int align = 0; > > /* The ABI (version 1.9) specifies that structs containing a > single floating-point value, at any level of nesting of > @@ -1532,7 +1535,10 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch, > if (TYPE_LENGTH (type) == 16 > && (gdbarch_long_double_format (gdbarch) > == floatformats_ieee_quad)) > - ppc64_sysv_abi_push_vreg (gdbarch, val, argpos); > + { > + ppc64_sysv_abi_push_vreg (gdbarch, val, argpos); > + align = 16; > + } > else > ppc64_sysv_abi_push_freg (gdbarch, type, val, argpos); > } > @@ -1556,8 +1562,10 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch, > && (gdbarch_long_double_format (gdbarch) > == floatformats_ieee_quad)) > /* IEEE FLOAT128, args in vector registers. */ > - ppc64_sysv_abi_push_vreg (gdbarch, elval, argpos); > - > + { > + ppc64_sysv_abi_push_vreg (gdbarch, elval, argpos); > + align = 16; > + } > else if (eltype->code () == TYPE_CODE_FLT > || eltype->code () == TYPE_CODE_DECFLOAT) > /* IBM long double and all other floats and decfloats, args > @@ -1567,9 +1575,14 @@ ppc64_sysv_abi_push_param (struct gdbarch *gdbarch, > && eltype->is_vector () > && tdep->vector_abi == POWERPC_VEC_ALTIVEC > && TYPE_LENGTH (eltype) == 16) > - ppc64_sysv_abi_push_vreg (gdbarch, elval, argpos); > + { > + ppc64_sysv_abi_push_vreg (gdbarch, elval, argpos); > + align = 16; > + } > } > } > + > + ppc64_sysv_abi_push_val (gdbarch, val, TYPE_LENGTH (type), align, argpos); > } > } > > diff --git a/gdb/testsuite/gdb.base/varargs.c b/gdb/testsuite/gdb.base/varargs.c > index cacb29d89e7..fcadcee6fb3 100644 > --- a/gdb/testsuite/gdb.base/varargs.c > +++ b/gdb/testsuite/gdb.base/varargs.c > @@ -45,6 +45,16 @@ long double _Complex ldc2 = 2.0L + 2.0Li; > long double _Complex ldc3 = 3.0L + 3.0Li; > long double _Complex ldc4 = 4.0L + 4.0Li; > > +struct sldc > +{ > + long double _Complex ldc; > +}; > + > +struct sldc sldc1 = { 1.0L + 1.0Li }; > +struct sldc sldc2 = { 2.0L + 2.0Li }; > +struct sldc sldc3 = { 3.0L + 3.0Li }; > +struct sldc sldc4 = { 4.0L + 4.0Li }; > + > #endif > > int > @@ -201,4 +211,22 @@ find_max_long_double_real (int num_vals, ...) > } > > > +long double _Complex > +find_max_struct_long_double_real (int num_vals, ...) > +{ > + long double _Complex max = 0.0L + 0.0iL; > + struct sldc x; > + va_list argp; > + int i; > + > + va_start(argp, num_vals); > + for (i = 0; i < num_vals; i++) > + { > + x = va_arg (argp, struct sldc); > + if (creall (max) < creal (x.ldc)) max = x.ldc; > + } > + > + return max; > +} > + > #endif /* TEST_COMPLEX */ > diff --git a/gdb/testsuite/gdb.base/varargs.exp b/gdb/testsuite/gdb.base/varargs.exp > index 7bd2cb08207..7fa464f09ad 100644 > --- a/gdb/testsuite/gdb.base/varargs.exp > +++ b/gdb/testsuite/gdb.base/varargs.exp > @@ -103,4 +103,6 @@ if [support_complex_tests] { > set test "print find_max_long_double_real(4, ldc1, ldc2, ldc3, ldc4)" > gdb_test $test ".*= 4 \\+ 4i" > > + set test "print find_max_struct_long_double_real(4, sldc1, sldc2, sldc3, sldc4)" > + gdb_test $test ".*= 4 \\+ 4i" > }