+2019-11-12 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdbsupport/format.c (format_pieces::format_pieces): Support
+ printf 'z' size modifier.
+ * gdbsupport/format.h (enum argclass): Add size_t_arg.
+ * printcmd.c (ui_printf): Handle size_t_arg.
+ * ui-out.c (ui_out::vmessage): Likewise.
+ * unittests/format_pieces-selftests.c (test_format_int_sizes): New
+ function.
+ (run_tests): Call test_format_int_sizes.
+
2019-11-12 Christian Biesinger <cbiesinger@google.com>
* ada-exp.y (write_ambiguous_var): Update.
enum argclass
{
literal_piece,
- int_arg, long_arg, long_long_arg, ptr_arg,
+ int_arg, long_arg, long_long_arg, size_t_arg, ptr_arg,
string_arg, wide_string_arg, wide_char_arg,
double_arg, long_double_arg,
dec32float_arg, dec64float_arg, dec128float_arg
}
}
break;
+ case size_t_arg:
+ {
+ size_t val = va_arg (args, size_t);
+ switch (piece.n_int_args)
+ {
+ case 0:
+ call_do_message (style, current_substring, val);
+ break;
+ case 1:
+ call_do_message (style, current_substring, intvals[0], val);
+ break;
+ case 2:
+ call_do_message (style, current_substring,
+ intvals[0], intvals[1], val);
+ break;
+ }
+ }
+ break;
case double_arg:
call_do_message (style, current_substring, va_arg (args, double));
break;
}, true);
}
+/* Test the different size modifiers that can be applied to an integer
+ argument. Test with different integer format specifiers too. */
+
+static void
+test_format_int_sizes ()
+{
+ check ("Hello\\t %hu%lu%llu%zu", /* ARI: %ll */
+ {
+ format_piece ("Hello\t ", literal_piece, 0),
+ format_piece ("%hu", int_arg, 0),
+ format_piece ("%lu", long_arg, 0),
+ format_piece ("%llu", long_long_arg, 0), /* ARI: %ll */
+ format_piece ("%zu", size_t_arg, 0)
+ });
+
+ check ("Hello\\t %hx%lx%llx%zx", /* ARI: %ll */
+ {
+ format_piece ("Hello\t ", literal_piece, 0),
+ format_piece ("%hx", int_arg, 0),
+ format_piece ("%lx", long_arg, 0),
+ format_piece ("%llx", long_long_arg, 0), /* ARI: %ll */
+ format_piece ("%zx", size_t_arg, 0)
+ });
+
+ check ("Hello\\t %ho%lo%llo%zo", /* ARI: %ll */
+ {
+ format_piece ("Hello\t ", literal_piece, 0),
+ format_piece ("%ho", int_arg, 0),
+ format_piece ("%lo", long_arg, 0),
+ format_piece ("%llo", long_long_arg, 0), /* ARI: %ll */
+ format_piece ("%zo", size_t_arg, 0)
+ });
+
+ check ("Hello\\t %hd%ld%lld%zd", /* ARI: %ll */
+ {
+ format_piece ("Hello\t ", literal_piece, 0),
+ format_piece ("%hd", int_arg, 0),
+ format_piece ("%ld", long_arg, 0),
+ format_piece ("%lld", long_long_arg, 0), /* ARI: %ll */
+ format_piece ("%zd", size_t_arg, 0)
+ });
+}
+
static void
run_tests ()
{
test_escape_sequences ();
test_format_specifier ();
test_gdb_formats ();
+ test_format_int_sizes ();
}
} /* namespace format_pieces */