gdb/python: Export nibbles to python layer
This patch makes it possible to allow Value.format_string() to return nibbles output. When we set the parameter of nibbles to True, we can achieve the displaying binary values in groups of every four bits. Here's an example: (gdb) py print (gdb.Value (1230).format_string (format='t', nibbles=True)) 0100 1100 1110 (gdb) Note that the parameter nibbles is only useful if format='t' is also used. This patch also includes update to the relevant testcase and documentation. Tested on x86_64 openSUSE Tumbleweed.
This commit is contained in:
parent
153b3c1117
commit
3f52a09075
3 changed files with 84 additions and 1 deletions
|
@ -1105,6 +1105,11 @@ union} in @ref{Print Settings}).
|
|||
address, @code{False} if it shouldn't (see @code{set print address} in
|
||||
@ref{Print Settings}).
|
||||
|
||||
@item nibbles
|
||||
@code{True} if binary values should be displayed in groups of four bits,
|
||||
known as nibbles. @code{False} if it shouldn't (@pxref{Print Settings,
|
||||
set print nibbles}).
|
||||
|
||||
@item deref_refs
|
||||
@code{True} if C@t{++} references should be resolved to the value they
|
||||
refer to, @code{False} (the default) if they shouldn't. Note that, unlike
|
||||
|
|
|
@ -640,6 +640,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
|
|||
"unions", /* See set print union on|off. */
|
||||
"address", /* See set print address on|off. */
|
||||
"styling", /* Should we apply styling. */
|
||||
"nibbles", /* See set print nibbles on|off. */
|
||||
/* C++ options. */
|
||||
"deref_refs", /* No corresponding setting. */
|
||||
"actual_objects", /* See set print object on|off. */
|
||||
|
@ -685,13 +686,14 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
|
|||
PyObject *unions_obj = NULL;
|
||||
PyObject *address_obj = NULL;
|
||||
PyObject *styling_obj = Py_False;
|
||||
PyObject *nibbles_obj = NULL;
|
||||
PyObject *deref_refs_obj = NULL;
|
||||
PyObject *actual_objects_obj = NULL;
|
||||
PyObject *static_members_obj = NULL;
|
||||
char *format = NULL;
|
||||
if (!gdb_PyArg_ParseTupleAndKeywords (args,
|
||||
kw,
|
||||
"|O!O!O!O!O!O!O!O!O!O!O!IIIs",
|
||||
"|O!O!O!O!O!O!O!O!O!O!O!O!IIIs",
|
||||
keywords,
|
||||
&PyBool_Type, &raw_obj,
|
||||
&PyBool_Type, &pretty_arrays_obj,
|
||||
|
@ -701,6 +703,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
|
|||
&PyBool_Type, &unions_obj,
|
||||
&PyBool_Type, &address_obj,
|
||||
&PyBool_Type, &styling_obj,
|
||||
&PyBool_Type, &nibbles_obj,
|
||||
&PyBool_Type, &deref_refs_obj,
|
||||
&PyBool_Type, &actual_objects_obj,
|
||||
&PyBool_Type, &static_members_obj,
|
||||
|
@ -725,6 +728,8 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw)
|
|||
return NULL;
|
||||
if (!copy_py_bool_obj (&opts.addressprint, address_obj))
|
||||
return NULL;
|
||||
if (!copy_py_bool_obj (&opts.nibblesprint, nibbles_obj))
|
||||
return NULL;
|
||||
if (!copy_py_bool_obj (&opts.deref_ref, deref_refs_obj))
|
||||
return NULL;
|
||||
if (!copy_py_bool_obj (&opts.objectprint, actual_objects_obj))
|
||||
|
|
|
@ -536,6 +536,78 @@ proc_with_prefix test_address {} {
|
|||
}
|
||||
}
|
||||
|
||||
# Test the nibbles option for gdb.Value.format_string.
|
||||
proc_with_prefix test_nibbles {} {
|
||||
global current_lang
|
||||
|
||||
set opts "format='t', nibbles=True"
|
||||
with_test_prefix $opts {
|
||||
if { $current_lang == "c" } {
|
||||
set binary_pointer_regexp "\[ 0-1\]+"
|
||||
gdb_test "python print (gdb.Value (42).format_string (${opts}))" \
|
||||
"0010 1010" \
|
||||
"42 with option ${opts}"
|
||||
|
||||
check_format_string "a_point_t" $opts
|
||||
check_format_string "a_point_t_pointer" $opts \
|
||||
$binary_pointer_regexp
|
||||
check_format_string "another_point" $opts
|
||||
|
||||
check_format_string "a_struct_with_union" $opts \
|
||||
"\\{the_union = \\{an_int = 0010 1010 0010 1010 0010 1010 0010 1010, a_char = 0010 1010\\}\\}"
|
||||
check_format_string "an_enum" $opts \
|
||||
"0001"
|
||||
check_format_string "a_string" $opts \
|
||||
$binary_pointer_regexp
|
||||
check_format_string "a_binary_string" $opts \
|
||||
$binary_pointer_regexp
|
||||
check_format_string "a_binary_string_array" $opts \
|
||||
"\\{0110 1000, 0110 0101, 0110 1100, 0110 1100, 0110 1111, 0, 0111 0111, 0110 1111, 0111 0010, 0110 1100, 0110 0100, 0\\}"
|
||||
check_format_string "a_big_string" $opts \
|
||||
"\\{0100 0001, 0100 0010, 0100 0011, 0100 0100, 0100 0101, \[, 0-1\]+\.\.\.\\}"
|
||||
check_format_string "an_array" $opts \
|
||||
"\\{0010, 0011, 0101\\}"
|
||||
check_format_string "an_array_with_repetition" $opts \
|
||||
"\\{0001, 0011 <repeats 12 times>, 0101, 0101, 0101\\}"
|
||||
check_format_string "a_symbol_pointer" $opts \
|
||||
$binary_pointer_regexp
|
||||
}
|
||||
if { $current_lang == "c++" } {
|
||||
set binary_pointer_regexp "\['0-1\]+"
|
||||
gdb_test "python print (gdb.Value (42).format_string (${opts}))" \
|
||||
"0010'1010" \
|
||||
"42 with option ${opts}"
|
||||
|
||||
check_format_string "a_point_t" $opts
|
||||
check_format_string "a_point_t_pointer" $opts \
|
||||
$binary_pointer_regexp
|
||||
check_format_string "another_point" $opts
|
||||
|
||||
check_format_string "a_struct_with_union" $opts \
|
||||
"\\{the_union = \\{an_int = 0010'1010'0010'1010'0010'1010'0010'1010, a_char = 0010'1010\\}\\}"
|
||||
check_format_string "an_enum" $opts \
|
||||
"0001"
|
||||
check_format_string "a_string" $opts \
|
||||
$binary_pointer_regexp
|
||||
check_format_string "a_binary_string" $opts \
|
||||
$binary_pointer_regexp
|
||||
check_format_string "a_binary_string_array" $opts \
|
||||
"\\{0110'1000, 0110'0101, 0110'1100, 0110'1100, 0110'1111, 0, 0111'0111, 0110'1111, 0111'0010, 0110'1100, 0110'0100, 0\\}"
|
||||
check_format_string "a_big_string" $opts \
|
||||
"\\{0100'0001, 0100'0010, 0100'0011, 0100'0100, 0100'0101, \[, '0-1\]+\.\.\.\\}"
|
||||
check_format_string "an_array" $opts \
|
||||
"\\{0010, 0011, 0101\\}"
|
||||
check_format_string "an_array_with_repetition" $opts \
|
||||
"\\{0001, 0011 <repeats 12 times>, 0101, 0101, 0101\\}"
|
||||
check_format_string "a_symbol_pointer" $opts \
|
||||
$binary_pointer_regexp
|
||||
|
||||
check_format_string "a_point_t_ref" $opts
|
||||
check_format_string "a_base_ref" $opts
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Test the deref_refs option for gdb.Value.format_string.
|
||||
proc_with_prefix test_deref_refs {} {
|
||||
global current_lang
|
||||
|
@ -1047,6 +1119,7 @@ proc_with_prefix test_all_common {} {
|
|||
test_symbols
|
||||
test_unions
|
||||
test_address
|
||||
test_nibbles
|
||||
test_deref_refs
|
||||
test_actual_objects
|
||||
test_static_members
|
||||
|
|
Loading…
Add table
Reference in a new issue