libctf: dump: support non-root type dumping
Use the recently-added ctf_type_iter_all function to iterate over non-root types, too, indicating them via {....} surrounding the type description in the dump. libctf/ * ctf-dump.c (ctf_dump): Use ctf_type_iter_all to dump types, not ctf_type_iter. (ctf_dump_type): Pass down the flag from ctf_type_iter_all. (ctf_dump_format_type): Add non-root-type { } notation. Add root flag to prototype. (ctf_dump_label): Adjust accordingly. (ctf_dump_objts): Likewise. (ctf_dump_var): Likewise.
This commit is contained in:
parent
3dde2c915e
commit
b4f0e09cd1
2 changed files with 36 additions and 12 deletions
|
@ -1,3 +1,14 @@
|
||||||
|
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
|
* ctf-dump.c (ctf_dump): Use ctf_type_iter_all to dump types, not
|
||||||
|
ctf_type_iter.
|
||||||
|
(ctf_dump_type): Pass down the flag from ctf_type_iter_all.
|
||||||
|
(ctf_dump_format_type): Add non-root-type { } notation.
|
||||||
|
Add root flag to prototype.
|
||||||
|
(ctf_dump_label): Adjust accordingly.
|
||||||
|
(ctf_dump_objts): Likewise.
|
||||||
|
(ctf_dump_var): Likewise.
|
||||||
|
|
||||||
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
* ctf-create.c (ctf_compress_write): Fix double-free.
|
* ctf-create.c (ctf_compress_write): Fix double-free.
|
||||||
|
|
|
@ -95,7 +95,7 @@ ctf_is_slice (ctf_file_t *fp, ctf_id_t id, ctf_encoding_t *enc)
|
||||||
type's references. */
|
type's references. */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
ctf_dump_format_type (ctf_file_t *fp, ctf_id_t id)
|
ctf_dump_format_type (ctf_file_t *fp, ctf_id_t id, int flag)
|
||||||
{
|
{
|
||||||
ctf_id_t new_id;
|
ctf_id_t new_id;
|
||||||
char *str = NULL, *bit = NULL, *buf = NULL;
|
char *str = NULL, *bit = NULL, *buf = NULL;
|
||||||
|
@ -104,8 +104,16 @@ ctf_dump_format_type (ctf_file_t *fp, ctf_id_t id)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ctf_encoding_t enc;
|
ctf_encoding_t enc;
|
||||||
|
const char *nonroot_leader = "";
|
||||||
|
const char *nonroot_trailer = "";
|
||||||
|
|
||||||
id = new_id;
|
id = new_id;
|
||||||
|
if (flag == CTF_ADD_NONROOT)
|
||||||
|
{
|
||||||
|
nonroot_leader = "{";
|
||||||
|
nonroot_trailer = "}";
|
||||||
|
}
|
||||||
|
|
||||||
buf = ctf_type_aname (fp, id);
|
buf = ctf_type_aname (fp, id);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
goto oom;
|
goto oom;
|
||||||
|
@ -115,15 +123,17 @@ ctf_dump_format_type (ctf_file_t *fp, ctf_id_t id)
|
||||||
if (ctf_is_slice (fp, id, &enc))
|
if (ctf_is_slice (fp, id, &enc))
|
||||||
{
|
{
|
||||||
ctf_type_encoding (fp, id, &enc);
|
ctf_type_encoding (fp, id, &enc);
|
||||||
if (asprintf (&bit, " %lx: [slice 0x%x:0x%x]",
|
if (asprintf (&bit, " %s%lx: [slice 0x%x:0x%x]%s",
|
||||||
id, enc.cte_offset, enc.cte_bits) < 0)
|
nonroot_leader, id, enc.cte_offset, enc.cte_bits,
|
||||||
|
nonroot_trailer) < 0)
|
||||||
goto oom;
|
goto oom;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (asprintf (&bit, " %lx: %s (size 0x%lx)", id, buf[0] == '\0' ?
|
if (asprintf (&bit, " %s%lx: %s (size 0x%lx)%s", nonroot_leader,
|
||||||
"(nameless)" : buf,
|
id, buf[0] == '\0' ? "(nameless)" : buf,
|
||||||
(unsigned long) ctf_type_size (fp, id)) < 0)
|
(unsigned long) ctf_type_size (fp, id),
|
||||||
|
nonroot_trailer) < 0)
|
||||||
goto oom;
|
goto oom;
|
||||||
}
|
}
|
||||||
free (buf);
|
free (buf);
|
||||||
|
@ -292,7 +302,8 @@ ctf_dump_label (const char *name, const ctf_lblinfo_t *info,
|
||||||
if (asprintf (&str, "%s -> ", name) < 0)
|
if (asprintf (&str, "%s -> ", name) < 0)
|
||||||
return (ctf_set_errno (state->cds_fp, ENOMEM));
|
return (ctf_set_errno (state->cds_fp, ENOMEM));
|
||||||
|
|
||||||
if ((typestr = ctf_dump_format_type (state->cds_fp, info->ctb_type)) == NULL)
|
if ((typestr = ctf_dump_format_type (state->cds_fp, info->ctb_type,
|
||||||
|
CTF_ADD_ROOT)) == NULL)
|
||||||
{
|
{
|
||||||
free (str);
|
free (str);
|
||||||
return -1; /* errno is set for us. */
|
return -1; /* errno is set for us. */
|
||||||
|
@ -348,7 +359,8 @@ ctf_dump_objts (ctf_file_t *fp, ctf_dump_state_t *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Variable type. */
|
/* Variable type. */
|
||||||
if ((typestr = ctf_dump_format_type (state->cds_fp, type)) == NULL)
|
if ((typestr = ctf_dump_format_type (state->cds_fp, type,
|
||||||
|
CTF_ADD_ROOT)) == NULL)
|
||||||
{
|
{
|
||||||
free (str);
|
free (str);
|
||||||
return -1; /* errno is set for us. */
|
return -1; /* errno is set for us. */
|
||||||
|
@ -464,7 +476,8 @@ ctf_dump_var (const char *name, ctf_id_t type, void *arg)
|
||||||
if (asprintf (&str, "%s -> ", name) < 0)
|
if (asprintf (&str, "%s -> ", name) < 0)
|
||||||
return (ctf_set_errno (state->cds_fp, ENOMEM));
|
return (ctf_set_errno (state->cds_fp, ENOMEM));
|
||||||
|
|
||||||
if ((typestr = ctf_dump_format_type (state->cds_fp, type)) == NULL)
|
if ((typestr = ctf_dump_format_type (state->cds_fp, type,
|
||||||
|
CTF_ADD_ROOT)) == NULL)
|
||||||
{
|
{
|
||||||
free (str);
|
free (str);
|
||||||
return -1; /* errno is set for us. */
|
return -1; /* errno is set for us. */
|
||||||
|
@ -529,14 +542,14 @@ ctf_dump_member (const char *name, ctf_id_t id, unsigned long offset,
|
||||||
/* Dump a single type into the cds_items. */
|
/* Dump a single type into the cds_items. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ctf_dump_type (ctf_id_t id, void *arg)
|
ctf_dump_type (ctf_id_t id, int flag, void *arg)
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
ctf_dump_state_t *state = arg;
|
ctf_dump_state_t *state = arg;
|
||||||
ctf_dump_membstate_t membstate = { &str, state->cds_fp };
|
ctf_dump_membstate_t membstate = { &str, state->cds_fp };
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
if ((str = ctf_dump_format_type (state->cds_fp, id)) == NULL)
|
if ((str = ctf_dump_format_type (state->cds_fp, id, flag)) == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
str = ctf_str_append (str, "\n");
|
str = ctf_str_append (str, "\n");
|
||||||
|
@ -641,7 +654,7 @@ ctf_dump (ctf_file_t *fp, ctf_dump_state_t **statep, ctf_sect_names_t sect,
|
||||||
goto end; /* errno is set for us. */
|
goto end; /* errno is set for us. */
|
||||||
break;
|
break;
|
||||||
case CTF_SECT_TYPE:
|
case CTF_SECT_TYPE:
|
||||||
if (ctf_type_iter (fp, ctf_dump_type, state) < 0)
|
if (ctf_type_iter_all (fp, ctf_dump_type, state) < 0)
|
||||||
goto end; /* errno is set for us. */
|
goto end; /* errno is set for us. */
|
||||||
break;
|
break;
|
||||||
case CTF_SECT_STR:
|
case CTF_SECT_STR:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue