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
This commit is contained in:
Andrew Burgess 2019-11-05 14:24:17 +00:00
parent 468c0cbb32
commit e06f3d6eba
8 changed files with 106 additions and 2 deletions

View file

@ -688,6 +688,24 @@ ui_out::vmessage (const ui_file_style &in_style, const char *format,
}
}
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;