forked from Imagelibrary/binutils-gdb
Currently, "print/x" will display a floating-point value by first
casting it to an integer type. This yields weird results like:
(gdb) print/x 1.5
$1 = 0x1
This has confused users multiple times -- see PR gdb/16242, where
there are several dups. I've also seen some confusion from this
internally at AdaCore.
The manual says:
'x'
Regard the bits of the value as an integer, and print the integer
in hexadecimal.
... which seems more useful. So, perhaps what happened is that this
was incorrectly implemented (or maybe correctly implemented and then
regressed, as there don't seem to be any tests).
This patch fixes the bug.
There was a previous discussion where we agreed to preserve the old
behavior:
https://sourceware.org/legacy-ml/gdb-patches/2017-06/msg00314.html
However, I think it makes more sense to follow the manual.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16242
71 lines
2.4 KiB
Plaintext
71 lines
2.4 KiB
Plaintext
# Copyright (C) 2009-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 <http://www.gnu.org/licenses/>.
|
|
|
|
set skip_float_test [gdb_skip_float_test]
|
|
|
|
proc do_test {type} {
|
|
set typenospace [string map {{ } -} $type]
|
|
|
|
with_test_prefix "$typenospace" {
|
|
if {[runto "func"]} {
|
|
# Verify that we do not crash when using "return" from a
|
|
# function with no debugging info. Such function has no
|
|
# `struct symbol'. It may still have an associated
|
|
# `struct minimal_symbol'.
|
|
|
|
gdb_test "return -1" \
|
|
"Return value type not available for selected stack frame\\.\r\nPlease use an explicit cast of the value to return\\." \
|
|
"return from function with no debug info without a cast"
|
|
|
|
# Cast of the result to the proper width must be done explicitely.
|
|
gdb_test "return ($type) -1" "#0 .* main \\(.*" \
|
|
"return from function with no debug info with a cast" \
|
|
"Make selected stack frame return now\\? \\(y or n\\) " "y"
|
|
|
|
gdb_test "advance marker" "marker \\(.*" \
|
|
"advance to marker"
|
|
|
|
# And if it returned the full width of the result.
|
|
if {$type == "float" || $type == "double"} {
|
|
set flag ""
|
|
} else {
|
|
set flag "/d"
|
|
}
|
|
gdb_test "print $flag t" " = -1" "full width of the returned result"
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach type {{signed char} {short} {int} {long} {long long} {float} {double}} {
|
|
if { $skip_float_test && ($type == "float" || $type == "double") } {
|
|
continue
|
|
}
|
|
set typeesc [string map {{ } {\ }} $type]
|
|
set typenospace [string map {{ } -} $type]
|
|
|
|
standard_testfile .c return-nodebug1.c
|
|
|
|
set additional_flags "additional_flags=-DTYPE=$typeesc"
|
|
|
|
if {[prepare_for_testing_full "failed to prepare" \
|
|
[list ${testfile}-${typenospace} debug \
|
|
$srcfile [list debug $additional_flags] \
|
|
$srcfile2 [list $additional_flags]]]} {
|
|
continue
|
|
}
|
|
|
|
do_test $type
|
|
}
|