This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Fix wrong output of x87 registers due to truncation to double on amd64


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b593e3d9b00b09af43abf1e95d68e68200e3c2a5

commit b593e3d9b00b09af43abf1e95d68e68200e3c2a5
Author: Ruslan Kabatsayev <b7.10110111@gmail.com>
Date:   Wed Dec 9 12:17:40 2015 +0000

    Fix wrong output of x87 registers due to truncation to double on amd64
    
    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:
    2015-12-09  Ruslan Kabatsayev  <b7.10110111@gmail.com>
    
    	PR gdb/18702
    	* configure.host: Fix detection of x86_64 host when setting
    	floatformats.
    
    gdb/testsuite/ChangeLog:
    2015-12-09  Ruslan Kabatsayev  <b7.10110111@gmail.com>
    	    Pedro Alves  <pedro@redhat.com>
    
    	PR gdb/18702
    	Add checking of floatformats setup on x86_64 hosts.
    	* gdb.arch/i386-float.S (main): Load bigval and smallval.
    	(smallval, bigval): New labels/constants.
    	* gdb.arch/i386-float.exp: Use with_test_prefix and test "info
    	float" after loading bigval and smallval.

Diff:
---
 gdb/ChangeLog                         |  6 ++++++
 gdb/configure.host                    |  2 +-
 gdb/testsuite/ChangeLog               | 10 ++++++++++
 gdb/testsuite/gdb.arch/i386-float.S   |  4 ++++
 gdb/testsuite/gdb.arch/i386-float.exp | 20 ++++++++++++++++----
 5 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b5d2431..8a8202c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-12-09  Ruslan Kabatsayev  <b7.10110111@gmail.com>  (tiny patch)
+
+	PR gdb/18702
+	* configure.host: Fix detection of x86_64 host when setting
+	floatformats.
+
 2015-12-08  Pierre-Marie de Rodat  <derodat@adacore.com>
 
 	* NEWS: Announce this enhancement and the corresponding new
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/ChangeLog b/gdb/testsuite/ChangeLog
index 8316d32..d959e7b 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2015-12-09  Ruslan Kabatsayev  <b7.10110111@gmail.com>
+	    Pedro Alves  <pedro@redhat.com>
+
+	PR gdb/18702
+	Add checking of floatformats setup on x86_64 hosts.
+	* gdb.arch/i386-float.S (main): Load bigval and smallval.
+	(smallval, bigval): New labels/constants.
+	* gdb.arch/i386-float.exp: Use with_test_prefix and test "info
+	float" after loading bigval and smallval.
+
 2015-12-07  Pierre-Marie de Rodat  <derodat@adacore.com>
 
 	* gdb.ada/fun_overload_menu.exp: New testcase.
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..e3ae3ba 100644
--- a/gdb/testsuite/gdb.arch/i386-float.exp
+++ b/gdb/testsuite/gdb.arch/i386-float.exp
@@ -37,7 +37,19 @@ if ![runto_main] then {
     return 0
 }
 
-gdb_test "stepi" ".*fldt.*" "first stepi"
-gdb_test "info float" ".*R7: Empty   0x00000000000000000000\r\n.*"
-gdb_test "stepi" ".*ret.*" "second stepi"
-gdb_test "info float" ".*=>R7: Valid   0xbffee922191107450000 .*"
+with_test_prefix "zero" {
+    gdb_test "stepi" ".*fldt.*"
+    gdb_test "info float" "R7: Empty   0x00000000000000000000\r\n.*"
+}
+with_test_prefix "val" {
+    gdb_test "stepi" ".*fldt.*"
+    gdb_test "info float" "=>R7: Valid   0xbffee922191107450000 .*"
+}
+with_test_prefix "smallval" {
+    gdb_test "stepi" ".*fldt.*"
+    gdb_test "info float" "=>R6: Valid   0x03e5c6f8c103dc90456a \\+3.500000000000000007e-4632\r\n.*"
+}
+with_test_prefix "bigval" {
+    gdb_test "stepi" ".*ret.*"
+    gdb_test "info float" "=>R5: Valid   0x6a5cc643b78165d7d0e9 \\+7.250000000000000005e\\+3264\r\n.*"
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]