diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2019-07-13 20:49:19 +0100 |
---|---|---|
committer | Nick Alcock <nick.alcock@oracle.com> | 2019-10-03 17:04:55 +0100 |
commit | b4f0e09cd18e0dbeeecd303ed54f6f113146e857 (patch) | |
tree | 408a9ceca5879acb3933dc4d0acd5aab076f72bc | |
parent | 3dde2c915e2c68fdda36febac618595561ed87f8 (diff) | |
download | gdb-b4f0e09cd18e0dbeeecd303ed54f6f113146e857.zip gdb-b4f0e09cd18e0dbeeecd303ed54f6f113146e857.tar.gz gdb-b4f0e09cd18e0dbeeecd303ed54f6f113146e857.tar.bz2 |
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.
-rw-r--r-- | libctf/ChangeLog | 11 | ||||
-rw-r--r-- | libctf/ctf-dump.c | 37 |
2 files changed, 36 insertions, 12 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 9e72d84..09353da 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,16 @@ 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> + * ctf-create.c (ctf_compress_write): Fix double-free. 2019-07-13 Nick Alcock <nick.alcock@oracle.com> diff --git a/libctf/ctf-dump.c b/libctf/ctf-dump.c index acb882b..0c0c224 100644 --- a/libctf/ctf-dump.c +++ b/libctf/ctf-dump.c @@ -95,7 +95,7 @@ ctf_is_slice (ctf_file_t *fp, ctf_id_t id, ctf_encoding_t *enc) type's references. */ 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; char *str = NULL, *bit = NULL, *buf = NULL; @@ -104,8 +104,16 @@ ctf_dump_format_type (ctf_file_t *fp, ctf_id_t id) do { ctf_encoding_t enc; + const char *nonroot_leader = ""; + const char *nonroot_trailer = ""; id = new_id; + if (flag == CTF_ADD_NONROOT) + { + nonroot_leader = "{"; + nonroot_trailer = "}"; + } + buf = ctf_type_aname (fp, id); if (!buf) 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)) { ctf_type_encoding (fp, id, &enc); - if (asprintf (&bit, " %lx: [slice 0x%x:0x%x]", - id, enc.cte_offset, enc.cte_bits) < 0) + if (asprintf (&bit, " %s%lx: [slice 0x%x:0x%x]%s", + nonroot_leader, id, enc.cte_offset, enc.cte_bits, + nonroot_trailer) < 0) goto oom; } else { - if (asprintf (&bit, " %lx: %s (size 0x%lx)", id, buf[0] == '\0' ? - "(nameless)" : buf, - (unsigned long) ctf_type_size (fp, id)) < 0) + if (asprintf (&bit, " %s%lx: %s (size 0x%lx)%s", nonroot_leader, + id, buf[0] == '\0' ? "(nameless)" : buf, + (unsigned long) ctf_type_size (fp, id), + nonroot_trailer) < 0) goto oom; } free (buf); @@ -292,7 +302,8 @@ ctf_dump_label (const char *name, const ctf_lblinfo_t *info, if (asprintf (&str, "%s -> ", name) < 0) 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); 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. */ - 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); 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) 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); 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. */ static int -ctf_dump_type (ctf_id_t id, void *arg) +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 }; 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; 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. */ break; 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. */ break; case CTF_SECT_STR: |