+2021-05-06 Nick Alcock <nick.alcock@oracle.com>
+
+ * ctf.h (CTF_K_UNKNOWN): Document that it can be used for
+ nonrepresentable types, not just padding.
+ * ctf-api.h (ctf_add_unknown): New.
+
2021-04-22 Clément Chigot <clement.chigot@atos.net>
* coff/internal.h (union internal_auxent):
size_t);
extern ctf_id_t ctf_add_union_sized (ctf_dict_t *, uint32_t, const char *,
size_t);
+extern ctf_id_t ctf_add_unknown (ctf_dict_t *, uint32_t, const char *);
extern ctf_id_t ctf_add_volatile (ctf_dict_t *, uint32_t, ctf_id_t);
extern int ctf_add_enumerator (ctf_dict_t *, ctf_id_t, const char *, int);
CTF_INFO_VLEN() will extract the number of elements in the list, and
the type of each element is shown in the comments below. */
-#define CTF_K_UNKNOWN 0 /* Unknown type (used for padding). */
+#define CTF_K_UNKNOWN 0 /* Unknown type (used for padding and
+ unrepresentable types). */
#define CTF_K_INTEGER 1 /* Variant data is CTF_INT_DATA (see below). */
#define CTF_K_FLOAT 2 /* Variant data is CTF_FP_DATA (see below). */
#define CTF_K_POINTER 3 /* ctt_type is referenced type. */
+2021-05-06 Nick Alcock <nick.alcock@oracle.com>
+
+ * ctf-open.c (init_types): Unknown types may have names.
+ * ctf-types.c (ctf_type_resolve): CTF_K_UNKNOWN is as
+ non-representable as type ID 0.
+ (ctf_type_aname): Print unknown types.
+ * ctf-dedup.c (ctf_dedup_hash_type): Do not early-exit for
+ CTF_K_UNKNOWN types: they have real hash values now.
+ (ctf_dedup_rwalk_one_output_mapping): Treat CTF_K_UNKNOWN types
+ like other types with no referents: call the callback and do not
+ skip them.
+ (ctf_dedup_emit_type): Emit via...
+ * ctf-create.c (ctf_add_unknown): ... this new function.
+ * libctf.ver (LIBCTF_1.2): Add it.
+
2021-03-25 Nick Alcock <nick.alcock@oracle.com>
* configure.ac: Check for dlsym, not dlopen.
symbol number is known, like in object files and dynamic dicts created by
ctf_create.
+** libctf supports compilers that encode unrepresentable types via a special
+ kind (CTF_K_UNKNOWN) as well as via type ID 0.
+
* Bugfixes
** Avoid duplicating or losing types of data object symbols when
return type;
}
+ctf_id_t
+ctf_add_unknown (ctf_dict_t *fp, uint32_t flag, const char *name)
+{
+ ctf_dtdef_t *dtd;
+ ctf_id_t type = 0;
+
+ /* If a type is already defined with this name, error (if not CTF_K_UNKNOWN)
+ or just return it. */
+
+ if (name != NULL && name[0] != '\0' && flag == CTF_ADD_ROOT
+ && (type = ctf_lookup_by_rawname (fp, CTF_K_UNKNOWN, name)))
+ {
+ if (ctf_type_kind (fp, type) == CTF_K_UNKNOWN)
+ return type;
+ else
+ {
+ ctf_err_warn (fp, 1, ECTF_CONFLICT,
+ _("ctf_add_unknown: cannot add unknown type "
+ "named %s: type of this name already defined"),
+ name ? name : _("(unnamed type)"));
+ return (ctf_set_errno (fp, ECTF_CONFLICT));
+ }
+ }
+
+ if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNKNOWN, 0, &dtd)) == CTF_ERR)
+ return CTF_ERR; /* errno is set for us. */
+
+ dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNKNOWN, flag, 0);
+ dtd->dtd_data.ctt_type = 0;
+
+ return type;
+}
+
ctf_id_t
ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
ctf_id_t ref)
if (tp->ctt_name == 0 || !name || name[0] == '\0')
name = NULL;
- /* Treat the unknown kind just like the unimplemented type. */
- if (kind == CTF_K_UNKNOWN)
- return "00000000000000000000";
-
/* Decorate the name appropriately for the namespace it appears in: forwards
appear in the namespace of their referent. */
switch (ctf_type_kind_unsliced (fp, type))
{
case CTF_K_UNKNOWN:
- /* Just skip things of unknown kind. */
- return 0;
case CTF_K_FORWARD:
case CTF_K_INTEGER:
case CTF_K_FLOAT:
switch (kind)
{
case CTF_K_UNKNOWN:
- /* These are types that CTF cannot encode, marked as such by the compile.
- We intentionally do not re-emit these. */
- new_type = 0;
+ /* These are types that CTF cannot encode, marked as such by the
+ compiler. */
+ errtype = _("unknown type");
+ if ((new_type = ctf_add_unknown (target, isroot, name)) == CTF_ERR)
+ goto err_target;
break;
case CTF_K_FORWARD:
/* This will do nothing if the type to which this forwards already exists,
return ENOMEM;
if ((fp->ctf_names.ctn_readonly
- = ctf_hash_create (pop[CTF_K_INTEGER] +
+ = ctf_hash_create (pop[CTF_K_UNKNOWN] +
+ pop[CTF_K_INTEGER] +
pop[CTF_K_FLOAT] +
pop[CTF_K_FUNCTION] +
pop[CTF_K_TYPEDEF] +
switch (kind)
{
+ case CTF_K_UNKNOWN:
case CTF_K_INTEGER:
case CTF_K_FLOAT:
/* Names are reused by bit-fields, which are differentiated by their
prev = type;
type = tp->ctt_type;
break;
+ case CTF_K_UNKNOWN:
+ return (ctf_set_errno (ofp, ECTF_NONREPRESENTABLE));
default:
return type;
}
case CTF_K_RESTRICT:
ctf_decl_sprintf (&cd, "restrict");
break;
+ case CTF_K_UNKNOWN:
+ if (name[0] == '\0')
+ ctf_decl_sprintf (&cd, _("(nonrepresentable type)"));
+ else
+ ctf_decl_sprintf (&cd, _("(nonrepresentable type %s)"),
+ name);
+ break;
}
k = cdp->cd_kind;
global:
ctf_lookup_by_symbol_name;
ctf_arc_lookup_symbol_name;
+ ctf_add_unknown;
} LIBCTF_1.1;