diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-11-05 14:24:17 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2019-11-12 23:46:41 +0000 |
commit | e06f3d6eba37df8451ecc2ce2ac76cba811e8b35 (patch) | |
tree | b934c6e13719f986aab4714769dd9b56e3e1e075 /gdb/unittests | |
parent | 468c0cbb327fadf28386a989f929fcbed4aed8b9 (diff) | |
download | gdb-e06f3d6eba37df8451ecc2ce2ac76cba811e8b35.zip gdb-e06f3d6eba37df8451ecc2ce2ac76cba811e8b35.tar.gz gdb-e06f3d6eba37df8451ecc2ce2ac76cba811e8b35.tar.bz2 |
gdb: Support printf 'z' size modifier
The gdb format mechanism doesn't currently support the 'z' size
modifier, there are a few places in GDB where this is used. Instead
of removing these uses lets just add support to GDB for using 'z'.
I found this issue when trying to use some of the debug output.
Before this commit:
(gdb) set debug dwarf-line 9
(gdb) file test
Reading symbols from test...
Unrecognized format specifier 'z' in printf
(No debugging symbols found in test)
(gdb)
After this commit:
(gdb) set debug dwarf-line 9
(gdb) file test
Reading symbols from test...
Adding dir 1: /usr/include
Adding file 1: test.c
Adding file 2: stdc-predef.h
Processing actual line 3: file 1, address 0x4004a0, is_stmt 1, discrim 0
Processing actual line 4: file 1, address 0x4004a0, is_stmt 1, discrim 0
.... lots of debug output ...
Processing actual line 10: file 1, address 0x4003b7, is_stmt 0, discrim 0
(gdb)
I've added a self test to cover the integer format size modifiers,
including the 'z' modifier.
gdb/ChangeLog:
* 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.
gdb/gdbserver/ChangeLog:
* ax.c (ax_printf): Handle size_t_arg.
Change-Id: Ib6c44d88aa5bce265d757e4c0698881803dd186f
Diffstat (limited to 'gdb/unittests')
-rw-r--r-- | gdb/unittests/format_pieces-selftests.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/gdb/unittests/format_pieces-selftests.c b/gdb/unittests/format_pieces-selftests.c index ed83d96..3971201 100644 --- a/gdb/unittests/format_pieces-selftests.c +++ b/gdb/unittests/format_pieces-selftests.c @@ -76,12 +76,56 @@ test_gdb_formats () }, 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 */ |