
This commit introduces a new kind of type, meant to describe fixed-point types, using a new code added specifically for this purpose (TYPE_CODE_FIXED_POINT). It then adds handling of fixed-point base types in the DWARF reader. And finally, as a first step, this commit adds support for printing the value of fixed-point type objects. Note that this commit has a known issue: Trying to print the value of a fixed-point object with a format letter (e.g. "print /x NAME") causes the wrong value to be printed because the scaling factor is not applied. Since the fix for this issue is isolated, and this is not a regression, the fix will be made in a pach of its own. This is meant to simplify review and archeology. Also, other functionalities related to fixed-point type handling (ptype, arithmetics, etc), will be added piecemeal as well, for the same reasons (faciliate reviews and archeology). Related to this, the testcase gdb.ada/fixed_cmp.exp is adjusted to compile the test program with -fgnat-encodings=all, so as to force the use of GNAT encodings, rather than rely on the compiler's default to use them. The intent is to enhance this testcase to also test the pure DWARF approach using -fgnat-encodings=minimal as soon as the corresponding suport gets added in. Thus, the modification to the testcase is made in a way that it prepares this testcase to be tested in both modes. gdb/ChangeLog: * ada-valprint.c (ada_value_print_1): Add fixed-point type handling. * dwarf2/read.c (get_dwarf2_rational_constant) (get_dwarf2_unsigned_rational_constant, finish_fixed_point_type) (has_zero_over_zero_small_attribute): New functions. read_base_type, set_die_type): Add fixed-point type handling. * gdb-gdb.py.in: Add fixed-point type handling. * gdbtypes.c: #include "gmp-utils.h". (create_range_type, set_type_code): Add fixed-point type handling. (init_fixed_point_type): New function. (is_integral_type, is_scalar_type): Add fixed-point type handling. (print_fixed_point_type_info): New function. (recursive_dump_type, copy_type_recursive): Add fixed-point type handling. (fixed_point_type_storage): New typedef. (fixed_point_objfile_key): New static global. (allocate_fixed_point_type_info, is_fixed_point_type): New functions. (fixed_point_type_base_type, fixed_point_scaling_factor): New functions. * gdbtypes.h: #include "gmp-utils.h". (enum type_code) <TYPE_SPECIFIC_FIXED_POINT>: New enum. (union type_specific) <fixed_point_info>: New field. (struct fixed_point_type_info): New struct. (INIT_FIXED_POINT_SPECIFIC, TYPE_FIXED_POINT_INFO): New macros. (init_fixed_point_type, is_fixed_point_type) (fixed_point_type_base_type, fixed_point_scaling_factor) (allocate_fixed_point_type_info): Add declarations. * valprint.c (generic_val_print_fixed_point): New function. (generic_value_print): Add fixed-point type handling. * value.c (value_as_address, unpack_long): Add fixed-point type handling. gdb/testsuite/ChangeLog: * gdb.ada/fixed_cmp.exp: Force compilation to use -fgnat-encodings=all. * gdb.ada/fixed_points.exp: Add fixed-point variables printing tests. * gdb.ada/fixed_points/pck.ads, gdb.ada/fixed_points/pck.adb: New files. * gdb.ada/fixed_points/fixed_points.adb: Add use of package Pck. * gdb.dwarf2/dw2-fixed-point.c, gdb.dwarf2/dw2-fixed-point.exp: New files.
66 lines
2 KiB
Ada
66 lines
2 KiB
Ada
-- Copyright 2004-2020 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/>.
|
|
|
|
with System;
|
|
with Pck; use Pck;
|
|
|
|
procedure Fixed_Points is
|
|
|
|
------------
|
|
-- Test 1 --
|
|
------------
|
|
|
|
-- Fixed point subtypes
|
|
|
|
type Base_Fixed_Point_Type is
|
|
delta 1.0 / 16.0
|
|
range -2147483648 * 1.0 / 16.0 .. 2147483647 * 1.0 / 16.0;
|
|
|
|
subtype Fixed_Point_Subtype is
|
|
Base_Fixed_Point_Type range -50.0 .. 50.0;
|
|
|
|
type New_Fixed_Point_Type is
|
|
new Base_Fixed_Point_Type range -50.0 .. 50.0;
|
|
|
|
Base_Object : Base_Fixed_Point_Type := -50.0;
|
|
Subtype_Object : Fixed_Point_Subtype := -50.0;
|
|
New_Type_Object : New_Fixed_Point_Type := -50.0;
|
|
|
|
|
|
------------
|
|
-- Test 2 --
|
|
------------
|
|
|
|
-- Overprecise delta
|
|
|
|
Overprecise_Delta : constant := 0.135791357913579;
|
|
-- delta whose significant figures cannot be stored into a long.
|
|
|
|
type Overprecise_Fixed_Point is
|
|
delta Overprecise_Delta range 0.0 .. 200.0;
|
|
for Overprecise_Fixed_Point'Small use Overprecise_Delta;
|
|
|
|
Overprecise_Object : Overprecise_Fixed_Point :=
|
|
Overprecise_Fixed_Point'Small;
|
|
|
|
begin
|
|
Base_Object := 1.0/16.0; -- Set breakpoint here
|
|
Subtype_Object := 1.0/16.0;
|
|
New_Type_Object := 1.0/16.0;
|
|
Overprecise_Object := Overprecise_Fixed_Point'Small * 2;
|
|
Do_Nothing (FP1_Var'Address);
|
|
Do_Nothing (FP2_Var'Address);
|
|
Do_Nothing (FP3_Var'Address);
|
|
end Fixed_Points;
|