From patchwork Fri Dec 4 16:09:46 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ruslan Kabatsayev X-Patchwork-Id: 9889 Received: (qmail 115018 invoked by alias); 4 Dec 2015 16:09:03 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 115008 invoked by uid 89); 4 Dec 2015 16:09:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-lf0-f41.google.com Received: from mail-lf0-f41.google.com (HELO mail-lf0-f41.google.com) (209.85.215.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 04 Dec 2015 16:09:01 +0000 Received: by lfs39 with SMTP id 39so111716274lfs.3 for ; Fri, 04 Dec 2015 08:08:58 -0800 (PST) X-Received: by 10.25.26.68 with SMTP id a65mr7523572lfa.72.1449245338518; Fri, 04 Dec 2015 08:08:58 -0800 (PST) Received: from [192.168.18.151] ([81.222.86.72]) by smtp.gmail.com with ESMTPSA id m5sm2427094lfe.22.2015.12.04.08.08.56 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 04 Dec 2015 08:08:57 -0800 (PST) Subject: Re: [PATCH][PR 18702] Fix wrong output of x87 registers due to truncation to double on amd64 To: Pedro Alves References: <564F998D.5080406@gmail.com> <5660357F.4030605@redhat.com> <5661AD07.5090002@redhat.com> <5661B2A7.6020005@redhat.com> Cc: gdb-patches@sourceware.org From: Ruslan Kabatsayev Message-ID: <5661BACA.50909@gmail.com> Date: Fri, 4 Dec 2015 19:09:46 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: <5661B2A7.6020005@redhat.com> When `info float` is used on an AMD64 system, GDB prints floating-point values of x87 registers with raw contents like 0x361a867a8e0527397ce0 or 0xc4f988454a1ddd3cfdab wrongly. This happens due to truncation to double, after which the former becomes 0.0, and the latter becomes negative infinity. This is caused by failed detection of x86-64 host, which results in setting gdb_host_{float,double,long_double}_format to zeros. This commit fixes this misdetection, and adds a test to make sure future commits don't introduce a regression here. gdb/ChangeLog: * configure.host: Fix detection of x86_64 host when setting floatformats. * testsuite/gdb.arch/i386-float.S: Add a regression test for the fix. * testsuite/gdb.arch/i386-float.exp: Add checking of the test results. --- gdb/configure.host | 2 +- gdb/testsuite/gdb.arch/i386-float.S | 4 ++++ gdb/testsuite/gdb.arch/i386-float.exp | 6 +++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gdb/configure.host b/gdb/configure.host index 48714f4..ef265eb 100644 --- a/gdb/configure.host +++ b/gdb/configure.host @@ -195,7 +195,7 @@ esac # "double" and "long double" types. case "${host}" in -i[34567]86-*-*) +i[34567]86-*-*|x86_64-*-*) gdb_host_float_format="&floatformat_ieee_single_little" gdb_host_double_format="&floatformat_ieee_double_little" gdb_host_long_double_format="&floatformat_i387_ext" diff --git a/gdb/testsuite/gdb.arch/i386-float.S b/gdb/testsuite/gdb.arch/i386-float.S index 76126c4..f5de8c2 100644 --- a/gdb/testsuite/gdb.arch/i386-float.S +++ b/gdb/testsuite/gdb.arch/i386-float.S @@ -29,6 +29,10 @@ SYMBOL(main): fninit fldt val + fldt bigval + fldt smallval ret .data val: .byte 0x00,0x00,0x45,0x07,0x11,0x19,0x22,0xe9,0xfe,0xbf + smallval: .byte 0xe9,0xd0,0xd7,0x65,0x81,0xb7,0x43,0xc6,0x5c,0x6a + bigval: .byte 0x6a,0x45,0x90,0xdc,0x03,0xc1,0xf8,0xc6,0xe5,0x03 diff --git a/gdb/testsuite/gdb.arch/i386-float.exp b/gdb/testsuite/gdb.arch/i386-float.exp index e638ceb..4260f29 100644 --- a/gdb/testsuite/gdb.arch/i386-float.exp +++ b/gdb/testsuite/gdb.arch/i386-float.exp @@ -39,5 +39,9 @@ if ![runto_main] then { gdb_test "stepi" ".*fldt.*" "first stepi" gdb_test "info float" ".*R7: Empty 0x00000000000000000000\r\n.*" -gdb_test "stepi" ".*ret.*" "second stepi" +gdb_test "stepi" ".*fldt.*" "second stepi" gdb_test "info float" ".*=>R7: Valid 0xbffee922191107450000 .*" +gdb_test "stepi" ".*fldt.*" "third stepi" +gdb_test "info float" ".*=>R6: Valid 0x03e5c6f8c103dc90456a \\+3.500000000000000007e-4632\r\n.*" +gdb_test "stepi" ".*ret.*" "fourth stepi" +gdb_test "info float" ".*=>R5: Valid 0x6a5cc643b78165d7d0e9 \\+7.250000000000000005e\\+3264\r\n.*"