Add support for fixed-point type comparison operators
This patch adds support for binary comparison operators with fixed-point type values. gdb/ChangeLog: * valarith.c (fixed_point_binop): Add BINOP_EQUAL and BINOP_LESS handling. (value_less): Add fixed-point handling. gdb/testsuite/ChangeLog: * gdb.ada/fixed_cmp.exp: Add -fgnat-encodings=minimal testing. * gdb.dwarf2/dw2-fixed-point.c (pck__fp1_var2): New global. (main): Add reference to pck__fp1_var2. * gdb.dwarf2/dw2-fixed-point.exp: Add comparison operator testing.
This commit is contained in:
parent
0a12719e51
commit
b74dbc2093
6 changed files with 137 additions and 2 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2020-11-15 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* valarith.c (fixed_point_binop): Add BINOP_EQUAL and BINOP_LESS
|
||||||
|
handling.
|
||||||
|
(value_less): Add fixed-point handling.
|
||||||
|
|
||||||
2020-11-15 Joel Brobecker <brobecker@adacore.com>
|
2020-11-15 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* eval.c (binop_promote): Add fixed-point type handling.
|
* eval.c (binop_promote): Add fixed-point type handling.
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2020-11-15 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* gdb.ada/fixed_cmp.exp: Add -fgnat-encodings=minimal testing.
|
||||||
|
* gdb.dwarf2/dw2-fixed-point.c (pck__fp1_var2): New global.
|
||||||
|
(main): Add reference to pck__fp1_var2.
|
||||||
|
* gdb.dwarf2/dw2-fixed-point.exp: Add comparison operator testing.
|
||||||
|
|
||||||
2020-11-15 Joel Brobecker <brobecker@adacore.com>
|
2020-11-15 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* gdb.dwarf2/dw2-fixed-point.exp: Add arithmetic tests.
|
* gdb.dwarf2/dw2-fixed-point.exp: Add arithmetic tests.
|
||||||
|
|
|
@ -19,7 +19,7 @@ if { [skip_ada_tests] } { return -1 }
|
||||||
|
|
||||||
standard_ada_testfile fixed
|
standard_ada_testfile fixed
|
||||||
|
|
||||||
foreach_with_prefix gnat_encodings {all} {
|
foreach_with_prefix gnat_encodings {all minimal} {
|
||||||
set flags [list debug additional_flags=-fgnat-encodings=$gnat_encodings]
|
set flags [list debug additional_flags=-fgnat-encodings=$gnat_encodings]
|
||||||
|
|
||||||
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != "" } {
|
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != "" } {
|
||||||
|
|
|
@ -22,6 +22,12 @@
|
||||||
FP1_Var : FP1_Type := 0.25; */
|
FP1_Var : FP1_Type := 0.25; */
|
||||||
int8_t pck__fp1_var = 4;
|
int8_t pck__fp1_var = 4;
|
||||||
|
|
||||||
|
/* Simulate an Ada variable declared inside package Pck as follow:
|
||||||
|
type FP1_Type is delta 0.1 range -1.0 .. +1.0;
|
||||||
|
FP1_Var2 : FP1_Type := 0.50;
|
||||||
|
Basically, the same as FP1_Var, but with a different value. */
|
||||||
|
int8_t pck__fp1_var2 = 8;
|
||||||
|
|
||||||
/* Simulate an Ada variable declared inside package Pck as follow:
|
/* Simulate an Ada variable declared inside package Pck as follow:
|
||||||
type FP2_Type is delta 0.01 digits 14;
|
type FP2_Type is delta 0.01 digits 14;
|
||||||
FP2_Var : FP2_Type := -0.01; */
|
FP2_Var : FP2_Type := -0.01; */
|
||||||
|
@ -41,6 +47,7 @@ int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
pck__fp1_var++;
|
pck__fp1_var++;
|
||||||
|
pck__fp1_var2++;
|
||||||
pck__fp2_var++;
|
pck__fp2_var++;
|
||||||
pck__fp3_var++;
|
pck__fp3_var++;
|
||||||
pck__fp1_range_var++;
|
pck__fp1_range_var++;
|
||||||
|
|
|
@ -49,6 +49,15 @@ Dwarf::assemble $asm_file {
|
||||||
{external 1 flag}
|
{external 1 flag}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DW_TAG_variable {
|
||||||
|
{DW_AT_name pck__fp1_var2}
|
||||||
|
{DW_AT_type :$fp1_base_type}
|
||||||
|
{DW_AT_location {
|
||||||
|
DW_OP_addr [gdb_target_symbol pck__fp1_var2]
|
||||||
|
} SPECIAL_expr}
|
||||||
|
{external 1 flag}
|
||||||
|
}
|
||||||
|
|
||||||
fp2_base_type: DW_TAG_base_type {
|
fp2_base_type: DW_TAG_base_type {
|
||||||
{DW_AT_byte_size 1 DW_FORM_sdata}
|
{DW_AT_byte_size 1 DW_FORM_sdata}
|
||||||
{DW_AT_encoding @DW_ATE_signed_fixed}
|
{DW_AT_encoding @DW_ATE_signed_fixed}
|
||||||
|
@ -161,6 +170,99 @@ gdb_test "print pck.fp1_range_var - 0.5" \
|
||||||
gdb_test "print -pck.fp1_var" \
|
gdb_test "print -pck.fp1_var" \
|
||||||
" = -0.25"
|
" = -0.25"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var = pck.fp1_var" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var = pck.fp1_var2" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var /= pck.fp1_var" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var /= pck.fp1_var2" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var < pck.fp1_var" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var < pck.fp1_var2" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var <= pck.fp1_var2" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var <= pck.fp1_var" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var > pck.fp1_var2" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var2 > pck.fp1_var" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var >= pck.fp1_var" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var >= pck.fp1_var2" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
# Same as above, but with litterals...
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var = 0.25" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var = 0.5" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var = 1" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var /= 0.25" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var /= 0.5" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var /= 1" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var < 0.25" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var < 0.5" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var < 1" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var <= 0.25" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var <= 0.5" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var <= 1" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var > 0.25" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var > 0.5" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var > 1" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var >= 0.25" \
|
||||||
|
" = true"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var >= 0.5" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
gdb_test "print pck.fp1_var >= 1" \
|
||||||
|
" = false"
|
||||||
|
|
||||||
|
|
||||||
# Set the language to LANG and do a ptype test on pck__fp1_var,
|
# Set the language to LANG and do a ptype test on pck__fp1_var,
|
||||||
# pck__fp2_var and pck__fp3_var, verifying that the output matches
|
# pck__fp2_var and pck__fp3_var, verifying that the output matches
|
||||||
# FP1_RE, FP2_RE, FP2_RE (resp.).
|
# FP1_RE, FP2_RE, FP2_RE (resp.).
|
||||||
|
|
|
@ -890,7 +890,9 @@ fixed_point_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
|
||||||
{
|
{
|
||||||
struct type *type1 = check_typedef (value_type (arg1));
|
struct type *type1 = check_typedef (value_type (arg1));
|
||||||
struct type *type2 = check_typedef (value_type (arg2));
|
struct type *type2 = check_typedef (value_type (arg2));
|
||||||
|
const struct language_defn *language = current_language;
|
||||||
|
|
||||||
|
struct gdbarch *gdbarch = get_type_arch (type1);
|
||||||
struct value *val;
|
struct value *val;
|
||||||
|
|
||||||
gdb_assert (is_fixed_point_type (type1) || is_fixed_point_type (type2));
|
gdb_assert (is_fixed_point_type (type1) || is_fixed_point_type (type2));
|
||||||
|
@ -952,6 +954,16 @@ fixed_point_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
|
||||||
INIT_VAL_WITH_FIXED_POINT_VAL (res);
|
INIT_VAL_WITH_FIXED_POINT_VAL (res);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case BINOP_EQUAL:
|
||||||
|
val = value_from_ulongest (language_bool_type (language, gdbarch),
|
||||||
|
mpq_cmp (v1.val, v2.val) == 0 ? 1 : 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BINOP_LESS:
|
||||||
|
val = value_from_ulongest (language_bool_type (language, gdbarch),
|
||||||
|
mpq_cmp (v1.val, v2.val) < 0 ? 1 : 0);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
error (_("Integer-only operation on fixed point number."));
|
error (_("Integer-only operation on fixed point number."));
|
||||||
}
|
}
|
||||||
|
@ -1774,7 +1786,8 @@ value_less (struct value *arg1, struct value *arg2)
|
||||||
is_int1 = is_integral_type (type1);
|
is_int1 = is_integral_type (type1);
|
||||||
is_int2 = is_integral_type (type2);
|
is_int2 = is_integral_type (type2);
|
||||||
|
|
||||||
if (is_int1 && is_int2)
|
if ((is_int1 && is_int2)
|
||||||
|
|| (is_fixed_point_type (type1) && is_fixed_point_type (type2)))
|
||||||
return longest_to_int (value_as_long (value_binop (arg1, arg2,
|
return longest_to_int (value_as_long (value_binop (arg1, arg2,
|
||||||
BINOP_LESS)));
|
BINOP_LESS)));
|
||||||
else if ((is_floating_value (arg1) || is_int1)
|
else if ((is_floating_value (arg1) || is_int1)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue