buf = ctf_type_aname (fp, id);
if (!buf)
- goto oom;
+ {
+ if (id == 0 || ctf_errno (fp) == ECTF_NONREPRESENTABLE)
+ {
+ str = ctf_str_append (str, " (type not represented in CTF)");
+ ctf_set_errno (fp, ECTF_NOTREF);
+ break;
+ }
+
+ goto err;
+ }
/* Slices get a different print representation. */
return str;
oom:
+ ctf_set_errno (fp, errno);
+ err:
free (buf);
free (str);
free (bit);
- ctf_set_errno (fp, ENOMEM);
return NULL;
}
return 0;
err:
- return (ctf_set_errno (fp, -ENOMEM));
+ return (ctf_set_errno (fp, errno));
}
/* Dump one section-offset field from the file header into the cds_items. */
return 0;
err:
- return (ctf_set_errno (fp, -ENOMEM));
+ return (ctf_set_errno (fp, errno));
}
/* Dump the file header into the cds_items. */
return 0;
err:
- return (ctf_set_errno (fp, -ENOMEM));
+ return (ctf_set_errno (fp, errno));
}
/* Dump a single label into the cds_items. */
ctf_dump_state_t *state = arg;
if (asprintf (&str, "%s -> ", name) < 0)
- return (ctf_set_errno (state->cds_fp, ENOMEM));
+ return (ctf_set_errno (state->cds_fp, errno));
if ((typestr = ctf_dump_format_type (state->cds_fp, info->ctb_type,
CTF_ADD_ROOT)) == NULL)
if (sym_name[0] == '\0')
{
if (asprintf (&str, "%lx -> ", (unsigned long) i) < 0)
- return (ctf_set_errno (fp, ENOMEM));
+ return (ctf_set_errno (fp, errno));
}
else
{
if (asprintf (&str, "%s (%lx) -> ", sym_name, (unsigned long) i) < 0)
- return (ctf_set_errno (fp, ENOMEM));
+ return (ctf_set_errno (fp, errno));
}
/* Variable type. */
for (i = 0; i < fp->ctf_nsyms; i++)
{
- char *str ;
+ char *str;
char *bit;
+ const char *err;
const char *sym_name;
ctf_funcinfo_t fi;
ctf_id_t type;
case ECTF_NOSYMTAB:
return -1;
case ECTF_NOTDATA:
- case ECTF_NOTYPEDAT:
+ case ECTF_NOTFUNC:
+ case ECTF_NOFUNCDAT:
continue;
}
if ((args = calloc (fi.ctc_argc, sizeof (ctf_id_t))) == NULL)
/* Return type. */
if ((str = ctf_type_aname (state->cds_fp, type)) == NULL)
- goto err;
+ {
+ err = "look up return type";
+ goto err;
+ }
str = ctf_str_append (str, " ");
/* Function arguments. */
if (ctf_func_args (state->cds_fp, i, fi.ctc_argc, args) < 0)
- goto err;
+ {
+ err = "look up argument type";
+ goto err;
+ }
for (j = 0; j < fi.ctc_argc; j++)
{
if ((bit = ctf_type_aname (state->cds_fp, args[j])) == NULL)
- goto err;
+ {
+ err = "look up argument type name";
+ goto err;
+ }
str = ctf_str_append (str, bit);
if ((j < fi.ctc_argc - 1) || (fi.ctc_flags & CTF_FUNC_VARARG))
str = ctf_str_append (str, ", ");
oom:
free (args);
free (str);
- return (ctf_set_errno (fp, ENOMEM));
+ return (ctf_set_errno (fp, errno));
err:
+ ctf_dprintf ("Cannot %s dumping function type for symbol 0x%li: %s\n",
+ err, (unsigned long) i,
+ ctf_errmsg (ctf_errno (state->cds_fp)));
free (args);
free (str);
return -1; /* errno is set for us. */
ctf_dump_state_t *state = arg;
if (asprintf (&str, "%s -> ", name) < 0)
- return (ctf_set_errno (state->cds_fp, ENOMEM));
+ return (ctf_set_errno (state->cds_fp, errno));
if ((typestr = ctf_dump_format_type (state->cds_fp, type,
CTF_ADD_ROOT)) == NULL)
*state->cdm_str = ctf_str_append (*state->cdm_str, " ");
if ((typestr = ctf_type_aname (state->cdm_fp, id)) == NULL)
- goto oom;
+ {
+ if (id == 0 || ctf_errno (state->cdm_fp) == ECTF_NONREPRESENTABLE)
+ {
+ if (asprintf (&bit, " [0x%lx] (type not represented in CTF)",
+ offset) < 0)
+ goto oom;
+
+ *state->cdm_str = ctf_str_append (*state->cdm_str, bit);
+ free (typestr);
+ free (bit);
+ return 0;
+ }
+
+ goto oom;
+ }
if (asprintf (&bit, " [0x%lx] (ID 0x%lx) (kind %i) %s %s (aligned at 0x%lx",
offset, id, ctf_type_kind (state->cdm_fp, id), typestr, name,
oom:
free (typestr);
free (bit);
- return (ctf_set_errno (state->cdm_fp, ENOMEM));
+ return (ctf_set_errno (state->cdm_fp, errno));
}
/* Dump a single type into the cds_items. */
-
static int
ctf_dump_type (ctf_id_t id, int flag, void *arg)
{
char *str;
+ const char *err;
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, flag)) == NULL)
- goto err;
+ {
+ err = "format type";
+ goto err;
+ }
str = ctf_str_append (str, "\n");
if ((ctf_type_visit (state->cds_fp, id, ctf_dump_member, &membstate)) < 0)
- goto err;
+ {
+ if (id == 0 || ctf_errno (state->cds_fp) == ECTF_NONREPRESENTABLE)
+ {
+ ctf_dump_append (state, str);
+ return 0;
+ }
+ err = "visit members";
+ goto err;
+ }
/* Trim off the last linefeed added by ctf_dump_member(). */
len = strlen (str);
return 0;
err:
+ ctf_dprintf ("Cannot %s dumping type 0x%lx: %s\n", err, id,
+ ctf_errmsg (ctf_errno (state->cds_fp)));
free (str);
return -1; /* errno is set for us. */
}
if (asprintf (&str, "%lx: %s",
(unsigned long) (s - fp->ctf_str[CTF_STRTAB_0].cts_strs),
s) < 0)
- return (ctf_set_errno (fp, ENOMEM));
+ return (ctf_set_errno (fp, errno));
ctf_dump_append (state, str);
s += strlen (s) + 1;
}