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.
This commit is contained in:
Nick Alcock 2021-01-05 13:25:56 +00:00
parent b09ad6eae9
commit 57f97d0e6d
31 changed files with 287 additions and 216 deletions

View file

@ -1,3 +1,15 @@
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.

View file

@ -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));