# Test general offset printing, ctor/dtor printing, union, formatting.
gdb_test "ptype /o struct abc" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct abc \{" \
-" public:" \
-"/* 8 | 8 */ void *field1;" \
-"/* 16: 0 | 4 */ unsigned int field2 : 1;" \
-"/* XXX 7-bit hole */" \
-"/* XXX 3-byte hole */" \
-"/* 20 | 4 */ int field3;" \
-"/* 24 | 1 */ signed char field4;" \
-"/* XXX 7-byte hole */" \
-"/* 32 | 8 */ uint64_t field5;" \
-"/* 40 | 8 */ union \{" \
-"/* 8 */ void *field6;" \
-"/* 4 */ int field7;" \
+"/* offset | size */ type = struct abc \{" \
+" public:" \
+"/* 8 | 8 */ void *field1;" \
+"/* 16: 0 | 4 */ unsigned int field2 : 1;" \
+"/* XXX 7-bit hole */" \
+"/* XXX 3-byte hole */" \
+"/* 20 | 4 */ int field3;" \
+"/* 24 | 1 */ signed char field4;" \
+"/* XXX 7-byte hole */" \
+"/* 32 | 8 */ uint64_t field5;" \
+"/* 40 | 8 */ union \{" \
+"/* 8 */ void *field6;" \
+"/* 4 */ int field7;" \
"" \
-" /* total size (bytes): 8 */" \
-" \} field8;" \
-"/* 48 | 2 */ my_int_type field9;" \
-"/* XXX 6-byte padding */" \
+" /* total size (bytes): 8 */" \
+" \} field8;" \
+"/* 48 | 2 */ my_int_type field9;" \
+"/* XXX 6-byte padding */" \
"" \
-" /* total size (bytes): 56 */" \
-" \}"]]
+" /* total size (bytes): 56 */" \
+" \}"]]
+
+# test "ptype /ox"
+gdb_test "ptype /ox struct abc" \
+ [string_to_regexp [multi_line \
+"/* offset | size */ type = struct abc {" \
+" public:" \
+"/* 0x0008 | 0x0008 */ void *field1;" \
+"/* 0x0010: 0x0 | 0x0004 */ unsigned int field2 : 1;" \
+"/* XXX 7-bit hole */" \
+"/* XXX 3-byte hole */" \
+"/* 0x0014 | 0x0004 */ int field3;" \
+"/* 0x0018 | 0x0001 */ signed char field4;" \
+"/* XXX 7-byte hole */" \
+"/* 0x0020 | 0x0008 */ uint64_t field5;" \
+"/* 0x0028 | 0x0008 */ union \{" \
+"/* 0x0008 */ void *field6;" \
+"/* 0x0004 */ int field7;" \
+"" \
+" /* total size (bytes): 8 */" \
+" \} field8;" \
+"/* 0x0030 | 0x0002 */ my_int_type field9;" \
+"/* XXX 6-byte padding */" \
+"" \
+" /* total size (bytes): 56 */" \
+" \}"]]
# Test "ptype /oTM".
gdb_test "ptype /oTM struct abc" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct abc \{" \
-" public:" \
-"/* 8 | 8 */ void *field1;" \
-"/* 16: 0 | 4 */ unsigned int field2 : 1;" \
-"/* XXX 7-bit hole */" \
-"/* XXX 3-byte hole */" \
-"/* 20 | 4 */ int field3;" \
-"/* 24 | 1 */ signed char field4;" \
-"/* XXX 7-byte hole */" \
-"/* 32 | 8 */ uint64_t field5;" \
-"/* 40 | 8 */ union \{" \
-"/* 8 */ void *field6;" \
-"/* 4 */ int field7;" \
+"/* offset | size */ type = struct abc \{" \
+" public:" \
+"/* 8 | 8 */ void *field1;" \
+"/* 16: 0 | 4 */ unsigned int field2 : 1;" \
+"/* XXX 7-bit hole */" \
+"/* XXX 3-byte hole */" \
+"/* 20 | 4 */ int field3;" \
+"/* 24 | 1 */ signed char field4;" \
+"/* XXX 7-byte hole */" \
+"/* 32 | 8 */ uint64_t field5;" \
+"/* 40 | 8 */ union \{" \
+"/* 8 */ void *field6;" \
+"/* 4 */ int field7;" \
"" \
-" /* total size (bytes): 8 */" \
-" \} field8;" \
-"/* 48 | 2 */ my_int_type field9;" \
+" /* total size (bytes): 8 */" \
+" \} field8;" \
+"/* 48 | 2 */ my_int_type field9;" \
"" \
-" abc(void);" \
-" ~abc();" \
+" abc(void);" \
+" ~abc();" \
"" \
-" typedef short my_int_type;" \
-"/* XXX 6-byte padding */" \
+" typedef short my_int_type;" \
+"/* XXX 6-byte padding */" \
"" \
-" /* total size (bytes): 56 */" \
-" \}"]]
+" /* total size (bytes): 56 */" \
+" \}"]]
# Test "ptype /TMo". This should be the same as "ptype /o".
gdb_test "ptype /TMo struct abc" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct abc \{" \
-" public:" \
-"/* 8 | 8 */ void *field1;" \
-"/* 16: 0 | 4 */ unsigned int field2 : 1;" \
-"/* XXX 7-bit hole */" \
-"/* XXX 3-byte hole */" \
-"/* 20 | 4 */ int field3;" \
-"/* 24 | 1 */ signed char field4;" \
-"/* XXX 7-byte hole */" \
-"/* 32 | 8 */ uint64_t field5;" \
-"/* 40 | 8 */ union \{" \
-"/* 8 */ void *field6;" \
-"/* 4 */ int field7;" \
+"/* offset | size */ type = struct abc \{" \
+" public:" \
+"/* 8 | 8 */ void *field1;" \
+"/* 16: 0 | 4 */ unsigned int field2 : 1;" \
+"/* XXX 7-bit hole */" \
+"/* XXX 3-byte hole */" \
+"/* 20 | 4 */ int field3;" \
+"/* 24 | 1 */ signed char field4;" \
+"/* XXX 7-byte hole */" \
+"/* 32 | 8 */ uint64_t field5;" \
+"/* 40 | 8 */ union \{" \
+"/* 8 */ void *field6;" \
+"/* 4 */ int field7;" \
"" \
-" /* total size (bytes): 8 */" \
-" \} field8;" \
-"/* 48 | 2 */ my_int_type field9;" \
-"/* XXX 6-byte padding */" \
+" /* total size (bytes): 8 */" \
+" \} field8;" \
+"/* 48 | 2 */ my_int_type field9;" \
+"/* XXX 6-byte padding */" \
"" \
-" /* total size (bytes): 56 */" \
-" \}"]]
+" /* total size (bytes): 56 */" \
+" \}"]]
# Test nested structs.
gdb_test "ptype /o struct pqr" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct pqr \{" \
-"/* 0 | 4 */ int ff1;" \
-"/* XXX 4-byte hole */" \
-"/* 8 | 40 */ struct xyz \{" \
-"/* 8 | 4 */ int f1;" \
-"/* 12 | 1 */ signed char f2;" \
-"/* XXX 3-byte hole */" \
-"/* 16 | 8 */ void *f3;" \
-"/* 24 | 24 */ struct tuv \{" \
-"/* 24 | 4 */ int a1;" \
-"/* XXX 4-byte hole */" \
-"/* 32 | 8 */ signed char *a2;" \
-"/* 40 | 4 */ int a3;" \
-"/* XXX 4-byte padding */" \
+"/* offset | size */ type = struct pqr \{" \
+"/* 0 | 4 */ int ff1;" \
+"/* XXX 4-byte hole */" \
+"/* 8 | 40 */ struct xyz \{" \
+"/* 8 | 4 */ int f1;" \
+"/* 12 | 1 */ signed char f2;" \
+"/* XXX 3-byte hole */" \
+"/* 16 | 8 */ void *f3;" \
+"/* 24 | 24 */ struct tuv \{" \
+"/* 24 | 4 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 32 | 8 */ signed char *a2;" \
+"/* 40 | 4 */ int a3;" \
+"/* XXX 4-byte padding */" \
"" \
-" /* total size (bytes): 24 */" \
-" \} f4;" \
+" /* total size (bytes): 24 */" \
+" \} f4;" \
"" \
-" /* total size (bytes): 40 */" \
-" \} ff2;" \
-"/* 48 | 1 */ signed char ff3;" \
-"/* XXX 7-byte padding */" \
+" /* total size (bytes): 40 */" \
+" \} ff2;" \
+"/* 48 | 1 */ signed char ff3;" \
+"/* XXX 7-byte padding */" \
"" \
-" /* total size (bytes): 56 */" \
-" \}"]]
+" /* total size (bytes): 56 */" \
+" \}"]]
-# Test that the offset is properly reset when we are printing a union
-# and go inside two inner structs.
-# This also tests a struct inside a struct inside a union.
-gdb_test "ptype /o union qwe" \
+# Test nested struct with /x
+gdb_test "ptype /ox struct pqr" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = union qwe \{" \
-"/* 24 */ struct tuv \{" \
-"/* 0 | 4 */ int a1;" \
-"/* XXX 4-byte hole */" \
-"/* 8 | 8 */ signed char *a2;" \
-"/* 16 | 4 */ int a3;" \
-"/* XXX 4-byte padding */" \
+"/* offset | size */ type = struct pqr \{" \
+"/* 0x0000 | 0x0004 */ int ff1;" \
+"/* XXX 4-byte hole */" \
+"/* 0x0008 | 0x0028 */ struct xyz \{" \
+"/* 0x0008 | 0x0004 */ int f1;" \
+"/* 0x000c | 0x0001 */ signed char f2;" \
+"/* XXX 3-byte hole */" \
+"/* 0x0010 | 0x0008 */ void *f3;" \
+"/* 0x0018 | 0x0018 */ struct tuv \{" \
+"/* 0x0018 | 0x0004 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 0x0020 | 0x0008 */ signed char *a2;" \
+"/* 0x0028 | 0x0004 */ int a3;" \
+"/* XXX 4-byte padding */" \
"" \
-" /* total size (bytes): 24 */" \
-" \} fff1;" \
-"/* 40 */ struct xyz \{" \
-"/* 0 | 4 */ int f1;" \
-"/* 4 | 1 */ signed char f2;" \
-"/* XXX 3-byte hole */" \
-"/* 8 | 8 */ void *f3;" \
-"/* 16 | 24 */ struct tuv \{" \
-"/* 16 | 4 */ int a1;" \
-"/* XXX 4-byte hole */" \
-"/* 24 | 8 */ signed char *a2;" \
-"/* 32 | 4 */ int a3;" \
-"/* XXX 4-byte padding */" \
-"" \
-" /* total size (bytes): 24 */" \
-" \} f4;" \
+" /* total size (bytes): 24 */" \
+" \} f4;" \
"" \
-" /* total size (bytes): 40 */" \
-" \} fff2;" \
+" /* total size (bytes): 40 */" \
+" \} ff2;" \
+"/* 0x0030 | 0x0001 */ signed char ff3;" \
+"/* XXX 7-byte padding */" \
"" \
-" /* total size (bytes): 40 */" \
-" \}"]]
+" /* total size (bytes): 56 */" \
+" \}"]]
-# Test printing a struct that contains a union, and that also
-# contains a struct.
-gdb_test "ptype /o struct poi" \
+
+# Test that the offset is properly reset when we are printing a union
+# and go inside two inner structs.
+# This also tests a struct inside a struct inside a union.
+gdb_test "ptype /o union qwe" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct poi \{" \
-"/* 0 | 4 */ int f1;" \
-"/* XXX 4-byte hole */" \
-"/* 8 | 40 */ union qwe \{" \
-"/* 24 */ struct tuv \{" \
-"/* 8 | 4 */ int a1;" \
-"/* XXX 4-byte hole */" \
-"/* 16 | 8 */ signed char *a2;" \
-"/* 24 | 4 */ int a3;" \
-"/* XXX 4-byte padding */" \
+"/* offset | size */ type = union qwe \{" \
+"/* 24 */ struct tuv \{" \
+"/* 0 | 4 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 8 | 8 */ signed char *a2;" \
+"/* 16 | 4 */ int a3;" \
+"/* XXX 4-byte padding */" \
"" \
" /* total size (bytes): 24 */" \
" \} fff1;" \
-"/* 40 */ struct xyz \{" \
-"/* 8 | 4 */ int f1;" \
-"/* 12 | 1 */ signed char f2;" \
-"/* XXX 3-byte hole */" \
-"/* 16 | 8 */ void *f3;" \
-"/* 24 | 24 */ struct tuv \{" \
-"/* 24 | 4 */ int a1;" \
-"/* XXX 4-byte hole */" \
-"/* 32 | 8 */ signed char *a2;" \
-"/* 40 | 4 */ int a3;" \
-"/* XXX 4-byte padding */" \
+"/* 40 */ struct xyz \{" \
+"/* 0 | 4 */ int f1;" \
+"/* 4 | 1 */ signed char f2;" \
+"/* XXX 3-byte hole */" \
+"/* 8 | 8 */ void *f3;" \
+"/* 16 | 24 */ struct tuv \{" \
+"/* 16 | 4 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 24 | 8 */ signed char *a2;" \
+"/* 32 | 4 */ int a3;" \
+"/* XXX 4-byte padding */" \
"" \
" /* total size (bytes): 24 */" \
" \} f4;" \
"" \
" /* total size (bytes): 40 */" \
" \} fff2;" \
-"/* XXX 32-byte padding */" \
"" \
" /* total size (bytes): 40 */" \
-" \} f2;" \
-"/* 48 | 2 */ uint16_t f3;" \
-"/* XXX 6-byte hole */" \
-"/* 56 | 56 */ struct pqr \{" \
-"/* 56 | 4 */ int ff1;" \
-"/* XXX 4-byte hole */" \
-"/* 64 | 40 */ struct xyz \{" \
-"/* 64 | 4 */ int f1;" \
-"/* 68 | 1 */ signed char f2;" \
-"/* XXX 3-byte hole */" \
-"/* 72 | 8 */ void *f3;" \
-"/* 80 | 24 */ struct tuv \{" \
-"/* 80 | 4 */ int a1;" \
-"/* XXX 4-byte hole */" \
-"/* 88 | 8 */ signed char *a2;" \
-"/* 96 | 4 */ int a3;" \
-"/* XXX 4-byte padding */" \
+" \}"]]
+
+# Test printing a struct that contains a union, and that also
+# contains a struct.
+gdb_test "ptype /o struct poi" \
+ [string_to_regexp [multi_line \
+"/* offset | size */ type = struct poi \{" \
+"/* 0 | 4 */ int f1;" \
+"/* XXX 4-byte hole */" \
+"/* 8 | 40 */ union qwe \{" \
+"/* 24 */ struct tuv \{" \
+"/* 8 | 4 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 16 | 8 */ signed char *a2;" \
+"/* 24 | 4 */ int a3;" \
+"/* XXX 4-byte padding */" \
"" \
" /* total size (bytes): 24 */" \
-" \} f4;" \
+" \} fff1;" \
+"/* 40 */ struct xyz \{" \
+"/* 8 | 4 */ int f1;" \
+"/* 12 | 1 */ signed char f2;" \
+"/* XXX 3-byte hole */" \
+"/* 16 | 8 */ void *f3;" \
+"/* 24 | 24 */ struct tuv \{" \
+"/* 24 | 4 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 32 | 8 */ signed char *a2;" \
+"/* 40 | 4 */ int a3;" \
+"/* XXX 4-byte padding */" \
+"" \
+" /* total size (bytes): 24 */" \
+" \} f4;" \
+"" \
+" /* total size (bytes): 40 */" \
+" \} fff2;" \
+"/* XXX 32-byte padding */" \
"" \
" /* total size (bytes): 40 */" \
-" \} ff2;" \
-"/* 104 | 1 */ signed char ff3;" \
-"/* XXX 7-byte padding */" \
+" \} f2;" \
+"/* 48 | 2 */ uint16_t f3;" \
+"/* XXX 6-byte hole */" \
+"/* 56 | 56 */ struct pqr \{" \
+"/* 56 | 4 */ int ff1;" \
+"/* XXX 4-byte hole */" \
+"/* 64 | 40 */ struct xyz \{" \
+"/* 64 | 4 */ int f1;" \
+"/* 68 | 1 */ signed char f2;" \
+"/* XXX 3-byte hole */" \
+"/* 72 | 8 */ void *f3;" \
+"/* 80 | 24 */ struct tuv \{" \
+"/* 80 | 4 */ int a1;" \
+"/* XXX 4-byte hole */" \
+"/* 88 | 8 */ signed char *a2;" \
+"/* 96 | 4 */ int a3;" \
+"/* XXX 4-byte padding */" \
"" \
-" /* total size (bytes): 56 */" \
-" \} f4;" \
+" /* total size (bytes): 24 */" \
+" \} f4;" \
+"" \
+" /* total size (bytes): 40 */" \
+" \} ff2;" \
+"/* 104 | 1 */ signed char ff3;" \
+"/* XXX 7-byte padding */" \
+"" \
+" /* total size (bytes): 56 */" \
+" \} f4;" \
"" \
-" /* total size (bytes): 112 */" \
-" \}"]]
+" /* total size (bytes): 112 */" \
+" \}"]]
# Test printing a struct with several bitfields, laid out in various
# ways.
# 0x7fffffffd550: 0xff 0x00 0x00 0x00 0x00 0x00 0x00 0x00
gdb_test "ptype /o struct tyu" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct tyu \{" \
-"/* 0: 0 | 4 */ int a1 : 1;" \
-"/* 0: 1 | 4 */ int a2 : 3;" \
-"/* 0: 4 | 4 */ int a3 : 23;" \
-"/* 3: 3 | 1 */ signed char a4 : 2;" \
-"/* XXX 3-bit hole */" \
-"/* XXX 4-byte hole */" \
-"/* 8 | 8 */ int64_t a5;" \
-"/* 16: 0 | 4 */ int a6 : 5;" \
-"/* 16: 5 | 8 */ int64_t a7 : 3;" \
-"/* XXX 7-byte padding */" \
-"" \
-" /* total size (bytes): 24 */" \
-" \}"]]
+"/* offset | size */ type = struct tyu \{" \
+"/* 0: 0 | 4 */ int a1 : 1;" \
+"/* 0: 1 | 4 */ int a2 : 3;" \
+"/* 0: 4 | 4 */ int a3 : 23;" \
+"/* 3: 3 | 1 */ signed char a4 : 2;" \
+"/* XXX 3-bit hole */" \
+"/* XXX 4-byte hole */" \
+"/* 8 | 8 */ int64_t a5;" \
+"/* 16: 0 | 4 */ int a6 : 5;" \
+"/* 16: 5 | 8 */ int64_t a7 : 3;" \
+"/* XXX 7-byte padding */" \
+"" \
+" /* total size (bytes): 24 */" \
+" \}"]]
gdb_test "ptype /o struct asd" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct asd \{" \
-"/* 0 | 32 */ struct asd::jkl \{" \
-"/* 0 | 8 */ signed char *f1;" \
-"/* 8 | 8 */ union \{" \
-"/* 8 */ void *ff1;" \
+"/* offset | size */ type = struct asd \{" \
+"/* 0 | 32 */ struct asd::jkl \{" \
+"/* 0 | 8 */ signed char *f1;" \
+"/* 8 | 8 */ union \{" \
+"/* 8 */ void *ff1;" \
"" \
-" /* total size (bytes): 8 */" \
-" \} f2;" \
-"/* 16 | 8 */ union \{" \
-"/* 8 */ signed char *ff2;" \
+" /* total size (bytes): 8 */" \
+" \} f2;" \
+"/* 16 | 8 */ union \{" \
+"/* 8 */ signed char *ff2;" \
"" \
-" /* total size (bytes): 8 */" \
-" \} f3;" \
-"/* 24: 0 | 4 */ int f4 : 5;" \
-"/* 24: 5 | 4 */ unsigned int f5 : 1;" \
-"/* XXX 2-bit hole */" \
-"/* XXX 1-byte hole */" \
-"/* 26 | 2 */ short f6;" \
-"/* XXX 4-byte padding */" \
-"" \
-" /* total size (bytes): 32 */" \
-" \} f7;" \
-"/* 32 | 8 */ unsigned long f8;" \
-"/* 40 | 8 */ signed char *f9;" \
-"/* 48: 0 | 4 */ int f10 : 4;" \
-"/* 48: 4 | 4 */ unsigned int f11 : 1;" \
-"/* 48: 5 | 4 */ unsigned int f12 : 1;" \
-"/* 48: 6 | 4 */ unsigned int f13 : 1;" \
-"/* 48: 7 | 4 */ unsigned int f14 : 1;" \
-"/* XXX 7-byte hole */" \
-"/* 56 | 8 */ void *f15;" \
-"/* 64 | 8 */ void *f16;" \
-"" \
-" /* total size (bytes): 72 */" \
-" \}"]]
+" /* total size (bytes): 8 */" \
+" \} f3;" \
+"/* 24: 0 | 4 */ int f4 : 5;" \
+"/* 24: 5 | 4 */ unsigned int f5 : 1;" \
+"/* XXX 2-bit hole */" \
+"/* XXX 1-byte hole */" \
+"/* 26 | 2 */ short f6;" \
+"/* XXX 4-byte padding */" \
+"" \
+" /* total size (bytes): 32 */" \
+" \} f7;" \
+"/* 32 | 8 */ unsigned long f8;" \
+"/* 40 | 8 */ signed char *f9;" \
+"/* 48: 0 | 4 */ int f10 : 4;" \
+"/* 48: 4 | 4 */ unsigned int f11 : 1;" \
+"/* 48: 5 | 4 */ unsigned int f12 : 1;" \
+"/* 48: 6 | 4 */ unsigned int f13 : 1;" \
+"/* 48: 7 | 4 */ unsigned int f14 : 1;" \
+"/* XXX 7-byte hole */" \
+"/* 56 | 8 */ void *f15;" \
+"/* 64 | 8 */ void *f16;" \
+"" \
+" /* total size (bytes): 72 */" \
+" \}"]]
# Test that we don't print any header when issuing a "ptype /o" on a
# non-struct, non-union, non-class type.
# get us into an infinite loop.
gdb_test "ptype/o static_member" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct static_member \{" \
-" static static_member Empty;" \
-"/* 0 | 4 */ int abc;" \
+"/* offset | size */ type = struct static_member \{" \
+" static static_member Empty;" \
+"/* 0 | 4 */ int abc;" \
"" \
-" /* total size (bytes): 4 */" \
-" \}"]]
+" /* total size (bytes): 4 */" \
+" \}"]]
# Test that the "no data fields" text is indented properly.
gdb_test "ptype/o empty_member" \
[string_to_regexp [multi_line \
-"/* offset | size */ type = struct empty_member \{" \
-"/* 0 | 1 */ struct {" \
-" <no data fields>" \
+"/* offset | size */ type = struct empty_member \{" \
+"/* 0 | 1 */ struct {" \
+" <no data fields>" \
"" \
-" /* total size (bytes): 1 */" \
-" } empty;" \
-"/* XXX 3-byte hole */" \
-"/* 4 | 4 */ int an_int;" \
+" /* total size (bytes): 1 */" \
+" } empty;" \
+"/* XXX 3-byte hole */" \
+"/* 4 | 4 */ int an_int;" \
"" \
-" /* total size (bytes): 8 */" \
-" \}"]]
+" /* total size (bytes): 8 */" \
+" \}"]]
+
+with_test_prefix "with_hex_default" {
+ # Test setting default display to hex
+ send_gdb "set print type hex on\n"
+ gdb_test "show print type hex" \
+ "Display of struct members offsets and sizes in hexadecimal is on"
+
+ # test "ptype /o" is now equivalent to "ptype /ox"
+ gdb_test "ptype /o struct abc" \
+ [string_to_regexp [multi_line \
+ "/* offset | size */ type = struct abc \{" \
+ " public:" \
+ "/* 0x0008 | 0x0008 */ void *field1;" \
+ "/* 0x0010: 0x0 | 0x0004 */ unsigned int field2 : 1;" \
+ "/* XXX 7-bit hole */" \
+ "/* XXX 3-byte hole */" \
+ "/* 0x0014 | 0x0004 */ int field3;" \
+ "/* 0x0018 | 0x0001 */ signed char field4;" \
+ "/* XXX 7-byte hole */" \
+ "/* 0x0020 | 0x0008 */ uint64_t field5;" \
+ "/* 0x0028 | 0x0008 */ union \{" \
+ "/* 0x0008 */ void *field6;" \
+ "/* 0x0004 */ int field7;" \
+ "" \
+ " /* total size (bytes): 8 */" \
+ " \} field8;" \
+ "/* 0x0030 | 0x0002 */ my_int_type field9;" \
+ "/* XXX 6-byte padding */" \
+ "" \
+ " /* total size (bytes): 56 */" \
+ " \}"]]
+
+ gdb_test "ptype /od struct abc" \
+ [string_to_regexp [multi_line \
+ "/* offset | size */ type = struct abc \{" \
+ " public:" \
+ "/* 8 | 8 */ void *field1;" \
+ "/* 16: 0 | 4 */ unsigned int field2 : 1;" \
+ "/* XXX 7-bit hole */" \
+ "/* XXX 3-byte hole */" \
+ "/* 20 | 4 */ int field3;" \
+ "/* 24 | 1 */ signed char field4;" \
+ "/* XXX 7-byte hole */" \
+ "/* 32 | 8 */ uint64_t field5;" \
+ "/* 40 | 8 */ union \{" \
+ "/* 8 */ void *field6;" \
+ "/* 4 */ int field7;" \
+ "" \
+ " /* total size (bytes): 8 */" \
+ " \} field8;" \
+ "/* 48 | 2 */ my_int_type field9;" \
+ "/* XXX 6-byte padding */" \
+ "" \
+ " /* total size (bytes): 56 */" \
+ " \}"]]
+
+ # restore
+ send_gdb "set print type hex off\n"
+}
1, /* print_methods */
1, /* print_typedefs */
0, /* print_offsets */
+ 0, /* print_in_hex */
0, /* print_nested_type_limit */
NULL, /* local_typedefs */
NULL, /* global_table */
1, /* print_methods */
1, /* print_typedefs */
0, /* print_offsets */
+ 0, /* print_in_hex */
0, /* print_nested_type_limit */
NULL, /* local_typedefs */
NULL, /* global_table */
/* See typeprint.h. */
-const int print_offset_data::indentation = 23;
+const int print_offset_data::indentation = 27;
+/* See typeprint.h. */
+
+print_offset_data::print_offset_data (const struct type_print_options *flags)
+{
+ if (flags != nullptr)
+ print_in_hex = flags->print_in_hex;
+}
/* See typeprint.h. */
unsigned int hole_bit = hole % TARGET_CHAR_BIT;
if (hole_bit > 0)
- fprintf_filtered (stream, "/* XXX %2u-bit %s */\n", hole_bit,
+ fprintf_filtered (stream, "/* XXX %2u-bit %-7s */\n", hole_bit,
for_what);
if (hole_byte > 0)
- fprintf_filtered (stream, "/* XXX %2u-byte %s */\n", hole_byte,
+ fprintf_filtered (stream, "/* XXX %2u-byte %-7s */\n", hole_byte,
for_what);
}
}
{
/* Since union fields don't have the concept of offsets, we just
print their sizes. */
- fprintf_filtered (stream, "/* %4s */",
- pulongest (TYPE_LENGTH (ftype)));
+ fprintf_filtered (stream, "/* %6s */",
+ (print_in_hex ?
+ hex_string_custom (TYPE_LENGTH (ftype), 4) :
+ pulongest (TYPE_LENGTH (ftype))));
return;
}
unsigned real_bitpos = bitpos + offset_bitpos;
- fprintf_filtered (stream, "/* %4u:%2u", real_bitpos / TARGET_CHAR_BIT,
+ fprintf_filtered (stream,
+ (print_in_hex ? "/* 0x%04x: 0x%x" : "/* %6u:%2u "),
+ real_bitpos / TARGET_CHAR_BIT,
real_bitpos % TARGET_CHAR_BIT);
}
else
{
/* The position of the field, relative to the beginning of the
struct. */
- fprintf_filtered (stream, "/* %4u",
+ fprintf_filtered (stream, (print_in_hex ? "/* 0x%04x" : "/* %6u"),
(bitpos + offset_bitpos) / TARGET_CHAR_BIT);
- fprintf_filtered (stream, " ");
+ fprintf_filtered (stream, " ");
}
- fprintf_filtered (stream, " | %4u */", fieldsize_byte);
+ fprintf_filtered (stream, (print_in_hex ? " | 0x%04x */" : " | %6u */"),
+ fieldsize_byte);
end_bitpos = bitpos + fieldsize_bit;
}
}
break;
}
+ case 'x':
+ flags.print_in_hex = 1;
+ break;
+ case 'd':
+ flags.print_in_hex = 0;
+ break;
default:
error (_("unrecognized flag '%c'"), *exp);
}
if (flags.print_offsets
&& (type->code () == TYPE_CODE_STRUCT
|| type->code () == TYPE_CODE_UNION))
- fprintf_filtered (gdb_stdout, "/* offset | size */ ");
+ fprintf_filtered (gdb_stdout, "/* offset | size */ ");
printf_filtered ("type = ");
}
}
+/* When printing structs, offsets and sizes of members can be displayed using
+ decimal notation or hexadecimal notation. By default, Decimal notation is
+ used. */
+
+static bool print_offsets_and_sizes_in_hex = false;
+
+/* Set the flags that instructs if sizes and offsets of struct members are
+ displayed in hexadecimal or decimal notation. */
+
+static void
+set_print_offsets_and_sizes_in_hex (const char *args,
+ int from_tty, struct cmd_list_element *c)
+{
+ default_ptype_flags.print_in_hex = print_offsets_and_sizes_in_hex;
+}
+
+/* Display whether struct members sizes and offsets are printed
+ using decimal or hexadecimal notation. */
+
+static void
+show_print_offsets_and_sizes_in_hex (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c,
+ const char *value)
+{
+ fprintf_filtered (file, _("\
+Display of struct members offsets and sizes in hexadecimal is %s\n"),
+ value);
+}
+
void _initialize_typeprint ();
void
_initialize_typeprint ()
/M print methods defined in a class\n\
/t do not print typedefs defined in a class\n\
/T print typedefs defined in a class\n\
- /o print offsets and sizes of fields in a struct (like pahole)"));
+ /o print offsets and sizes of fields in a struct (like pahole)\n\
+ /x use hexadecimal notation when displaying sizes and offsets\n\
+ of struct members\n\
+ /d use decimal notation when displaying sizes and offsets\n\
+ of struct members "));
set_cmd_completer (c, expression_completer);
c = add_com ("whatis", class_vars, whatis_command,
set_print_type_nested_types,
show_print_type_nested_types,
&setprinttypelist, &showprinttypelist);
+
+ add_setshow_boolean_cmd ("hex", no_class, &print_offsets_and_sizes_in_hex,
+ _("\
+Set printing of struct members sizes and offsets using hex notation."), _("\
+Show whether sizes and offsets of struct members are printed using hex \
+notation."), nullptr, set_print_offsets_and_sizes_in_hex,
+ show_print_offsets_and_sizes_in_hex,
+ &setprinttypelist, &showprinttypelist);
}
/* Print <not allocated> status to stream STREAM. */