diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2021-01-05 13:25:56 +0000 |
---|---|---|
committer | Nick Alcock <nick.alcock@oracle.com> | 2021-01-05 14:53:39 +0000 |
commit | 57f97d0e6dd4dfbb54f2f39c5e59d5860040d0b6 (patch) | |
tree | 8761b8146292351d0056509f56eb08a73b082804 /libctf | |
parent | b09ad6eae985c6cf3138775de8e712bc116b4166 (diff) | |
download | gdb-57f97d0e6dd4dfbb54f2f39c5e59d5860040d0b6.zip gdb-57f97d0e6dd4dfbb54f2f39c5e59d5860040d0b6.tar.gz gdb-57f97d0e6dd4dfbb54f2f39c5e59d5860040d0b6.tar.bz2 |
libctf, ld: CTF dumper changes for consistency
In most places in CTF dumper output, we emit 0x... for hex strings, but
in three places (top-level type IDs, string table offsets, and the file
magic number) we don't emit the 0x.
This is very confusing if by chance there are no hex digits in the
output. Add 0x consistently to everything, and adjust tests
accordingly. While we're at it, improve the indentation of the output
so that subsequent lines in aggregate output are indented by at least as
many columns as the colon in the type output. (Subsequent indentation
is still 4 spaces at a time.)
ld/ChangeLog
2021-01-05 Nick Alcock <nick.alcock@oracle.com>
* testsuite/ld-ctf/array.d: Adjust for dumper changes.
* testsuite/ld-ctf/conflicting-cycle-1.B-1.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-1.B-2.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-1.parent.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-2.A-1.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-2.A-2.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-2.parent.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-3.C-1.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-3.C-2.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-3.parent.d: Likewise.
* testsuite/ld-ctf/conflicting-enums.d: Likewise.
* testsuite/ld-ctf/conflicting-typedefs.d: Likewise.
* testsuite/ld-ctf/cross-tu-cyclic-conflicting.d: Likewise.
* testsuite/ld-ctf/cross-tu-cyclic-nonconflicting.d: Likewise.
* testsuite/ld-ctf/cross-tu-into-cycle.d: Likewise.
* testsuite/ld-ctf/cross-tu-noncyclic.d: Likewise.
* testsuite/ld-ctf/cycle-1.d: Likewise.
* testsuite/ld-ctf/cycle-2.A.d: Likewise.
* testsuite/ld-ctf/cycle-2.B.d: Likewise.
* testsuite/ld-ctf/cycle-2.C.d: Likewise.
* testsuite/ld-ctf/data-func-conflicted.d: Likewise.
* testsuite/ld-ctf/diag-cttname-null.d: Likewise.
* testsuite/ld-ctf/diag-cuname.d: Likewise.
* testsuite/ld-ctf/diag-parlabel.d: Likewise.
* testsuite/ld-ctf/diag-wrong-magic-number-mixed.d: Likewise.
* testsuite/ld-ctf/function.d: Likewise.
* testsuite/ld-ctf/slice.d: Likewise.
* testsuite/ld-ctf/super-sub-cycles.d: Likewise.
libctf/ChangeLog
2021-01-05 Nick Alcock <nick.alcock@oracle.com>
* ctf-dump.c (ctf_dump_format_type): Add 0x to hex type IDs.
(ctf_dump_header): Add 0x to the hex magic number.
(ctf_dump_str): Add 0x to the hex string offsets.
(ctf_dump_membstate_t) <cdm_toplevel_indent>: New.
(ctf_dump_type): Adjust. Free it when we're done.
(type_hex_digits): New.
(ctf_dump_member): Align output depending on the width of the type
ID being generated. Use printf padding, not a loop, to generate
indentation.
Diffstat (limited to 'libctf')
-rw-r--r-- | libctf/ChangeLog | 12 | ||||
-rw-r--r-- | libctf/ctf-dump.c | 50 |
2 files changed, 51 insertions, 11 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog index cc8e34a..99f9022 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,17 @@ 2021-01-05 Nick Alcock <nick.alcock@oracle.com> + * ctf-dump.c (ctf_dump_format_type): Add 0x to hex type IDs. + (ctf_dump_header): Add 0x to the hex magic number. + (ctf_dump_str): Add 0x to the hex string offsets. + (ctf_dump_membstate_t) <cdm_toplevel_indent>: New. + (ctf_dump_type): Adjust. Free it when we're done. + (type_hex_digits): New. + (ctf_dump_member): Align output depending on the width of the type + ID being generated. Use printf padding, not a loop, to generate + indentation. + +2021-01-05 Nick Alcock <nick.alcock@oracle.com> + * ctf-decl.c (ctf_decl_push): Don't print array decls backwards. 2021-01-04 Nicolas Boulenguez <nicolas@debian.org> diff --git a/libctf/ctf-dump.c b/libctf/ctf-dump.c index 621ff25..ee22f77 100644 --- a/libctf/ctf-dump.c +++ b/libctf/ctf-dump.c @@ -47,6 +47,7 @@ typedef struct ctf_dump_membstate { char **cdm_str; ctf_dict_t *cdm_fp; + char *cdm_toplevel_indent; } ctf_dump_membstate_t; static int @@ -115,7 +116,7 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag) goto err; } - if (asprintf (&bit, " %s%lx: ", nonroot_leader, id) < 0) + if (asprintf (&bit, " %s0x%lx: ", nonroot_leader, id) < 0) goto oom; str = str_append (str, bit); free (bit); @@ -236,7 +237,7 @@ ctf_dump_header (ctf_dict_t *fp, ctf_dump_state_t *state) }; const char *verstr = NULL; - if (asprintf (&str, "Magic number: %x\n", hp->cth_magic) < 0) + if (asprintf (&str, "Magic number: 0x%x\n", hp->cth_magic) < 0) goto err; ctf_dump_append (state, str); @@ -454,26 +455,51 @@ ctf_dump_var (const char *name, ctf_id_t type, void *arg) return 0; } +/* Report the number of digits in the hexadecimal representation of a type + ID. */ + +static int +type_hex_digits (ctf_id_t id) +{ + int i = 0; + + if (id == 0) + return 1; + + for (; id > 0; id >>= 4, i++); + return i; +} + /* Dump a single member into the string in the membstate. */ static int ctf_dump_member (const char *name, ctf_id_t id, unsigned long offset, - int depth, void *arg) + int depth, void *arg) { ctf_dump_membstate_t *state = arg; char *typestr = NULL; char *bit = NULL; ctf_encoding_t ep; int has_encoding = 0; - ssize_t i; - for (i = 0; i < depth; i++) - *state->cdm_str = str_append (*state->cdm_str, " "); + /* Align neatly. */ + + if (depth == 0) + { + if (asprintf (&state->cdm_toplevel_indent, " %*s", + type_hex_digits (id), "") < 0) + goto oom; + } + + if (asprintf (&bit, "%s%*s", state->cdm_toplevel_indent, depth * 4, "") < 0) + goto oom; + *state->cdm_str = str_append (*state->cdm_str, bit); + free (bit); if ((typestr = ctf_type_aname (state->cdm_fp, id)) == NULL) { if (id == 0 || ctf_errno (state->cdm_fp) == ECTF_NONREPRESENTABLE) { - if (asprintf (&bit, " [0x%lx] (type not represented in CTF)", + if (asprintf (&bit, "[0x%lx] (type not represented in CTF)", offset) < 0) goto oom; @@ -491,7 +517,7 @@ ctf_dump_member (const char *name, ctf_id_t id, unsigned long offset, has_encoding = 1; ctf_type_encoding (state->cdm_fp, id, &ep); - if (asprintf (&bit, " [0x%lx] (ID 0x%lx) (kind %i) %s%s%s:%i " + if (asprintf (&bit, "[0x%lx] (ID 0x%lx) (kind %i) %s%s%s:%i " "(aligned at 0x%lx", offset, id, ctf_type_kind (state->cdm_fp, id), typestr, (name[0] != 0 && typestr[0] != 0) ? " " : "", name, @@ -501,7 +527,7 @@ ctf_dump_member (const char *name, ctf_id_t id, unsigned long offset, } else { - if (asprintf (&bit, " [0x%lx] (ID 0x%lx) (kind %i) %s%s%s " + if (asprintf (&bit, "[0x%lx] (ID 0x%lx) (kind %i) %s%s%s " "(aligned at 0x%lx", offset, id, ctf_type_kind (state->cdm_fp, id), typestr, (name[0] != 0 && typestr[0] != 0) ? " " : "", name, @@ -540,7 +566,7 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg) { char *str; ctf_dump_state_t *state = arg; - ctf_dump_membstate_t membstate = { &str, state->cds_fp }; + ctf_dump_membstate_t membstate = { &str, state->cds_fp, NULL }; size_t len; if ((str = ctf_dump_format_type (state->cds_fp, id, flag)) == NULL) @@ -558,6 +584,7 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg) _("cannot visit members dumping type 0x%lx"), id); goto err; } + free (membstate.cdm_toplevel_indent); /* Trim off the last linefeed added by ctf_dump_member(). */ len = strlen (str); @@ -568,6 +595,7 @@ ctf_dump_type (ctf_id_t id, int flag, void *arg) return 0; err: + free (membstate.cdm_toplevel_indent); free (str); return 0; /* Swallow the error. */ } @@ -583,7 +611,7 @@ ctf_dump_str (ctf_dict_t *fp, ctf_dump_state_t *state) fp->ctf_str[CTF_STRTAB_0].cts_len;) { char *str; - if (asprintf (&str, "%lx: %s", + if (asprintf (&str, "0x%lx: %s", (unsigned long) (s - fp->ctf_str[CTF_STRTAB_0].cts_strs), s) < 0) return (ctf_set_errno (fp, errno)); |