binutils-gdb/gdb/testsuite/gdb.ada/fixed_points.exp
Tom Tromey a625a8c9eb Fix fixed-point regression with recent GCC
A recent version of GCC changed how fixed-point types are described.
For example, a denominator in one test case now looks like:

    GNU_denominator      (exprloc)
     [ 0] implicit_value: 16 byte block: 00 00 b8 9d 0d 69 55 a0 01 00 00 00 00 00 00 00

... the difference being that this now uses exprloc and emits a
DW_OP_implicit_value for the 16-byte block.  (DWARF 5 still uses
DW_FORM_data16.)

This change was made here:

    https://gcc.gnu.org/pipermail/gcc-patches/2020-December/560897.html

This patch updates gdb to handle this situation.

Note that, before GCC 11, this test would not give the same answer.
Earlier versions of GCC fell back to GNAT encodings for this case.

gdb/ChangeLog
2021-01-25  Tom Tromey  <tromey@adacore.com>

	* dwarf2/read.c (get_mpz): New function.
	(get_dwarf2_rational_constant): Use it.

gdb/testsuite/ChangeLog
2021-01-25  Tom Tromey  <tromey@adacore.com>

	* gdb.ada/fixed_points.exp: Add regression test.
	* gdb.ada/fixed_points/fixed_points.adb (FP5_Var): New variable.
	* gdb.ada/fixed_points/pck.adb (Delta5, FP5_Type): New.
2021-01-25 08:13:51 -07:00

133 lines
3.8 KiB
Plaintext

# Copyright 2004-2021 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/>.
load_lib "ada.exp"
if { [skip_ada_tests] } { return -1 }
standard_ada_testfile fixed_points
foreach_with_prefix scenario {all minimal} {
set flags [list debug additional_flags=-fgnat-encodings=$scenario]
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
return -1
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "Set breakpoint here" ${testdir}/fixed_points.adb]
runto "fixed_points.adb:$bp_location"
# Fixed point subtypes:
gdb_test "print base_object" \
"= -50" \
"p on a fixed point type"
gdb_test "print subtype_object" \
"= -50" \
"p on a subtype fixed point type"
gdb_test "print new_type_object" \
"= -50" \
"p on a new fixed point type"
# Overprecise delta:
gdb_test "print Overprecise_Object" \
"= 0.13579135791"
gdb_test_multiple "ptype Overprecise_Object" "" {
-re "type = <2-byte fixed point \\(small = 135791357913579/1000000000000000\\)>\r\n$gdb_prompt $" {
pass $gdb_test_name
}
-re "type = delta 0.135791\r\n$gdb_prompt $" {
# The (legacy) output we obtain when the compiler described
# our fixed point types using the GNAT encodings rather than
# standard DWARF. OK as well.
pass $gdb_test_name
}
}
# FP*_Var...
gdb_test "print fp1_var" \
" = 0.25"
gdb_test_multiple "ptype fp1_var" "" {
-re "type = <1-byte fixed point \\(small = 1/16\\)>\r\n$gdb_prompt $" {
pass $gdb_test_name
}
-re "type = delta 0\\.1 <'small = 0\\.0625>\r\n$gdb_prompt $" {
# The (legacy) output we obtain when the compiler described
# our fixed point types using the GNAT encodings rather than
# standard DWARF. OK as well.
pass $gdb_test_name
}
}
gdb_test "print fp2_var" \
" = -0.01"
gdb_test_multiple "ptype fp2_var" "" {
-re "type = <8-byte fixed point \\(small = 1/100\\)>\r\n$gdb_prompt $" {
pass $gdb_test_name
}
-re "type = delta 0\\.01\r\n$gdb_prompt $" {
# The (legacy) output we obtain when the compiler described
# our fixed point types using the GNAT encodings rather than
# standard DWARF. OK as well.
pass $gdb_test_name
}
}
gdb_test "print fp3_var" \
" = 0.1"
gdb_test_multiple "ptype fp3_var" "" {
-re "type = <1-byte fixed point \\(small = 1/30\\)>\r\n$gdb_prompt $" {
pass $gdb_test_name
}
-re "type = delta 0\\.1 <'small = 0\\.0333333>\r\n$gdb_prompt $" {
# The (legacy) output we obtain when the compiler described
# our fixed point types using the GNAT encodings rather than
# standard DWARF. OK as well.
pass $gdb_test_name
}
}
# One of the benefits of minimal encoding is that operations work
# a bit better.
if {$scenario == "minimal"} {
gdb_test "print fp2_var + 0" \
" = -0.01"
gdb_test "print 0 + fp2_var" \
" = -0.01"
gdb_test "print fp2_var - 0" \
" = -0.01"
set fp4 "= 2e-07"
gdb_test "print fp4_var" $fp4
gdb_test "print fp4_var * 1" $fp4
gdb_test "print 1 * fp4_var" $fp4
gdb_test "print fp4_var / 1" $fp4
# This only started working in GCC 11.
if {[test_compiler_info {gcc-11-*}]} {
gdb_test "print fp5_var" " = 3e-19"
}
}
}