aboutsummaryrefslogtreecommitdiff
path: root/libctf
diff options
context:
space:
mode:
Diffstat (limited to 'libctf')
-rw-r--r--libctf/ChangeLog7
-rw-r--r--libctf/ctf-dump.c70
2 files changed, 40 insertions, 37 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 99f9022..80f05e9 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,12 @@
2021-01-05 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-dump.c (ctf_dump_objts): Dump by calling ctf_dump_format_type.
+ (ctf_dump_format_type): Don't emit the size for function objects.
+ Dump the element type of arrays like we dump the pointed-to type of
+ pointers, etc.
+
+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.
diff --git a/libctf/ctf-dump.c b/libctf/ctf-dump.c
index ee22f77..f01f225 100644
--- a/libctf/ctf-dump.c
+++ b/libctf/ctf-dump.c
@@ -93,6 +93,8 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag)
do
{
ctf_encoding_t enc;
+ ctf_arinfo_t ar;
+ int kind, unsliced_kind;
const char *nonroot_leader = "";
const char *nonroot_trailer = "";
@@ -123,26 +125,25 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag)
bit = NULL;
if (buf[0] != '\0')
- {
- str = str_append (str, buf);
- str = str_append (str, " ");
- }
+ str = str_append (str, buf);
free (buf);
buf = NULL;
+ unsliced_kind = ctf_type_kind_unsliced (fp, id);
+ kind = ctf_type_kind (fp, id);
/* Slices get a different print representation. */
- if (ctf_type_kind_unsliced (fp, id) == CTF_K_SLICE)
+ if (unsliced_kind == CTF_K_SLICE)
{
ctf_type_encoding (fp, id, &enc);
- if (asprintf (&bit, "[slice 0x%x:0x%x] ",
+ if (asprintf (&bit, " [slice 0x%x:0x%x]",
enc.cte_offset, enc.cte_bits) < 0)
goto oom;
}
- else if (ctf_type_kind (fp, id) == CTF_K_INTEGER)
+ else if (kind == CTF_K_INTEGER)
{
ctf_type_encoding (fp, id, &enc);
- if (asprintf (&bit, "[0x%x:0x%x] ",
+ if (asprintf (&bit, " [0x%x:0x%x]",
enc.cte_offset, enc.cte_bits) < 0)
goto oom;
}
@@ -150,16 +151,27 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag)
free (bit);
bit = NULL;
- if (asprintf (&bit, "(size 0x%lx)%s",
- (unsigned long) ctf_type_size (fp, id),
- nonroot_trailer) < 0)
- goto oom;
+ if (kind != CTF_K_FUNCTION)
+ if (asprintf (&bit, " (size 0x%lx)%s",
+ (unsigned long) ctf_type_size (fp, id),
+ nonroot_trailer) < 0)
+ goto oom;
str = str_append (str, bit);
free (bit);
bit = NULL;
- new_id = ctf_type_reference (fp, id);
+ /* Keep going as long as this type references another. We consider arrays
+ to "reference" their element type. */
+
+ if (kind == CTF_K_ARRAY)
+ {
+ if (ctf_array_info (fp, id, &ar) < 0)
+ goto err;
+ new_id = ar.ctr_contents;
+ }
+ else
+ new_id = ctf_type_reference (fp, id);
if (new_id != CTF_ERR)
str = str_append (str, " ->");
} while (new_id != CTF_ERR);
@@ -383,36 +395,26 @@ ctf_dump_objts (ctf_dict_t *fp, ctf_dump_state_t *state, int functions)
while ((id = ctf_symbol_next (fp, &i, &name, functions)) != CTF_ERR)
{
char *typestr = NULL;
- int err = 0;
- /* Emit the name, if we know it. */
+ /* Emit the name, if we know it. No trailing space: ctf_dump_format_type
+ has a leading one. */
if (name)
{
- if (asprintf (&str, "%s -> ", name) < 0)
+ if (asprintf (&str, "%s ->", name) < 0)
goto oom;
}
else
str = xstrdup ("");
- if ((typestr = ctf_type_aname (fp, id)) == NULL)
+ if ((typestr = ctf_dump_format_type (state->cds_fp, id,
+ CTF_ADD_ROOT)) == NULL)
{
- if (id == 0 || ctf_errno (fp) == ECTF_NONREPRESENTABLE)
- {
- if (asprintf (&typestr, " (%s)", _("type not represented in CTF")) < 0)
- goto oom;
-
- goto out;
- }
-
- if (asprintf (&typestr, _("error: %s"), ctf_errmsg (ctf_errno (fp))) < 0)
- goto oom;
-
- err = -1;
- goto out;
+ ctf_dump_append (state, str);
+ continue; /* Swallow the error. */
}
str = str_append (str, typestr);
- str = str_append (str, "\n");
+ free (typestr);
ctf_dump_append (state, str);
continue;
@@ -420,12 +422,6 @@ ctf_dump_objts (ctf_dict_t *fp, ctf_dump_state_t *state, int functions)
ctf_set_errno (fp, ENOMEM);
ctf_next_destroy (i);
return -1;
- out:
- str = str_append (str, typestr);
- free (typestr);
- ctf_dump_append (state, str);
- ctf_next_destroy (i);
- return err; /* errno is set for us. */
}
return 0;
}