+2020-11-15 Joel Brobecker <brobecker@adacore.com>
+
+ * ada-typeprint.c (ada_print_type): Add handing of fixed-point
+ range types.
+ * c-typeprint.c (c_type_print_varspec_prefix)
+ (c_type_print_varspec_suffix, c_type_print_base_1): Add
+ TYPE_CODE_FIXED_POINT handling.
+ * p-typeprint.c (pascal_type_print_varspec_prefix)
+ (pascal_type_print_varspec_suffix): Likewise.
+ * typeprint.c (print_type_fixed_point): New function.
+ * typeprint.h (print_type_fixed_point): Add declaration.
+
2020-11-15 Joel Brobecker <brobecker@adacore.com>
* printcmd.c (print_scalar_formatted): Add fixed-point type
case TYPE_CODE_RANGE:
if (ada_is_gnat_encoded_fixed_point_type (type))
print_gnat_encoded_fixed_point_type (type, stream);
+ else if (is_fixed_point_type (type))
+ {
+ fprintf_filtered (stream, "<");
+ print_type_fixed_point (type, stream);
+ fprintf_filtered (stream, ">");
+ }
else if (ada_is_modular_type (type))
fprintf_filtered (stream, "mod %s",
int_string (ada_modulus (type), 10, 0, 0, 1));
case TYPE_CODE_COMPLEX:
case TYPE_CODE_NAMESPACE:
case TYPE_CODE_DECFLOAT:
+ case TYPE_CODE_FIXED_POINT:
/* These types need no prefix. They are listed here so that
gcc -Wall will reveal any types that haven't been handled. */
break;
case TYPE_CODE_COMPLEX:
case TYPE_CODE_NAMESPACE:
case TYPE_CODE_DECFLOAT:
+ case TYPE_CODE_FIXED_POINT:
/* These types do not need a suffix. They are listed so that
gcc -Wall will report types that may not have been
considered. */
fprintf_styled (stream, metadata_style.style (), _("<range type>"));
break;
+ case TYPE_CODE_FIXED_POINT:
+ print_type_fixed_point (type, stream);
+ break;
+
case TYPE_CODE_NAMESPACE:
fputs_filtered ("namespace ", stream);
fputs_filtered (type->name (), stream);
case TYPE_CODE_STRING:
case TYPE_CODE_COMPLEX:
case TYPE_CODE_TYPEDEF:
+ case TYPE_CODE_FIXED_POINT:
/* These types need no prefix. They are listed here so that
gcc -Wall will reveal any types that haven't been handled. */
break;
case TYPE_CODE_STRING:
case TYPE_CODE_COMPLEX:
case TYPE_CODE_TYPEDEF:
+ case TYPE_CODE_FIXED_POINT:
/* These types do not need a suffix. They are listed so that
gcc -Wall will report types that may not have been considered. */
break;
+2020-11-15 Joel Brobecker <brobecker@adacore.com>
+
+ * gdb.ada/fixed_points.exp: Add ptype tests.
+ * gdb.dwarf2/dw2-fixed-point.exp: Likewise.
+
2020-11-15 Joel Brobecker <brobecker@adacore.com>
* gdb.dwarf2/dw2-fixed-point.exp: Add "print /x" tests.
gdb_test "print fp1_var" \
" = 0.25"
+gdb_test_multiple "ptype fp1_var" "" {
+ -re "type = <1-byte fixed point \\(small = 0\\.0625\\)>\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 = 0\\.01\\)>\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 = 0\\.0333333\\)>\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
+ }
+}
gdb_test "print /x pck.fp1_range_var" \
" = 0x1"
+
+# 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
+# FP1_RE, FP2_RE, FP2_RE (resp.).
+
+proc do_ptype_test {lang fp1_re fp2_re fp3_re fp1_range_re} {
+ with_test_prefix "lang=$lang" {
+ gdb_test_no_output "set language $lang" \
+ "set language to $lang for ptype test"
+
+ gdb_test "ptype pck__fp1_var" $fp1_re
+
+ gdb_test "ptype pck__fp2_var" $fp2_re
+
+ gdb_test "ptype pck__fp3_var" $fp3_re
+
+ if { $lang == "modula-2" || $lang == "pascal" } {
+ setup_xfail "*-*-*" "not supported by language"
+ }
+ gdb_test "ptype pck__fp1_range_var" $fp1_range_re
+ }
+}
+
+do_ptype_test "ada" \
+ " = <1-byte fixed point \\(small = 1/16\\)>" \
+ " = <1-byte fixed point \\(small = 1/100\\)>" \
+ " = <1-byte fixed point \\(small = 1/30\\)>" \
+ " = <1-byte fixed point \\(small = 1/16\\)>"
+
+foreach lang [list "c" "d" "go" "objective-c" "opencl" ] {
+ do_ptype_test $lang \
+ " = 1-byte fixed point \\(small = 1/16\\)" \
+ " = 1-byte fixed point \\(small = 1/100\\)" \
+ " = 1-byte fixed point \\(small = 1/30\\)" \
+ " = <range type>"
+}
+
+foreach lang [list "fortran" "modula-2" "pascal" ] {
+ do_ptype_test $lang \
+ " = pck__fp1_type" \
+ " = pck__fp2_type" \
+ " = pck__fp3_type" \
+ " = <range type>"
+}
}
}
+/* See typeprint.h. */
+
+void
+print_type_fixed_point (struct type *type, struct ui_file *stream)
+{
+ gdb::unique_xmalloc_ptr<char> small_img
+ = fixed_point_scaling_factor (type).str ();
+
+ fprintf_filtered (stream, "%s-byte fixed point (small = %s)",
+ pulongest (TYPE_LENGTH (type)), small_img.get ());
+}
+
/* Dump details of a type specified either directly or indirectly.
Uses the same sort of type lookup mechanism as ptype_command()
and whatis_command(). */
void print_type_scalar (struct type * type, LONGEST, struct ui_file *);
+/* Assuming the TYPE is a fixed point type, print its type description
+ on STREAM. */
+
+void print_type_fixed_point (struct type *type, struct ui_file *stream);
+
void c_type_print_args (struct type *, struct ui_file *, int, enum language,
const struct type_print_options *);