# 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.  */