From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 78792 invoked by alias); 3 Oct 2019 16:32:05 -0000 Mailing-List: contact gdb-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: , Sender: gdb-cvs-owner@sourceware.org List-Subscribe: Sender: gdb-cvs-owner@sourceware.org Received: (qmail 78758 invoked by uid 10018); 3 Oct 2019 16:32:05 -0000 Date: Thu, 03 Oct 2019 16:32:00 -0000 Message-ID: <20191003163205.78756.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Jose E.Marchesi To: bfd-cvs@sourceware.org, gdb-cvs@sourceware.org Subject: [binutils-gdb] libctf: dump: support non-root type dumping X-Act-Checkin: binutils-gdb X-Git-Author: Nick Alcock X-Git-Refname: refs/heads/master X-Git-Oldrev: 3dde2c915e2c68fdda36febac618595561ed87f8 X-Git-Newrev: b4f0e09cd18e0dbeeecd303ed54f6f113146e857 X-SW-Source: 2019-10/txt/msg00042.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b4f0e09cd18e0dbeeecd303ed54f6f113146e857 commit b4f0e09cd18e0dbeeecd303ed54f6f113146e857 Author: Nick Alcock Date: Sat Jul 13 20:49:19 2019 +0100 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. Diff: --- libctf/ChangeLog | 11 +++++++++++ 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 + * 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 + * ctf-create.c (ctf_compress_write): Fix double-free. 2019-07-13 Nick Alcock 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: