aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-dump.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2021-01-05 13:25:56 +0000
committerNick Alcock <nick.alcock@oracle.com>2021-01-05 14:53:39 +0000
commit57f97d0e6dd4dfbb54f2f39c5e59d5860040d0b6 (patch)
tree8761b8146292351d0056509f56eb08a73b082804 /libctf/ctf-dump.c
parentb09ad6eae985c6cf3138775de8e712bc116b4166 (diff)
downloadgdb-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/ctf-dump.c')
-rw-r--r--libctf/ctf-dump.c50
1 files changed, 39 insertions, 11 deletions
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));