depth);
break;
}
+ case CTF_K_BTF_FLOAT:
+ {
+ ssize_t size;
+
+ ctf_get_ctt_size (input, tp, &size, NULL);
+ ctf_dedup_sha1_add (&hash, &size, sizeof (size_t), "size", depth);
+ break;
+ }
/* Types that reference other types. */
case CTF_K_TYPEDEF:
case CTF_K_VOLATILE:
ctf_id_t membtype;
ssize_t size;
int bit_width;
+ int is_bitfield;
ctf_get_ctt_size (input, tp, &size, NULL);
ctf_dedup_sha1_add (&hash, &size, sizeof (ssize_t), "struct size",
depth);
+ if ((is_bitfield = ctf_struct_bitfield (input, type)) < 0)
+ {
+ whaterr = N_("error doing struct/union member bitfield checking");
+ goto input_err;
+ }
+ ctf_dedup_sha1_add (&hash, &is_bitfield, sizeof (is_bitfield),
+ "struct/union bitfieldness", depth);
+
while ((offset = ctf_member_next (input, type, &i, &mname, &membtype,
&bit_width, 0)) >= 0)
{
depth);
ctf_dedup_sha1_add (&hash, &offset, sizeof (offset), "member offset",
depth);
+ ctf_dedup_sha1_add (&hash, &bit_width, sizeof (bit_width),
+ "member bit width", depth);
ADD_CITER (citers, hval);
}
if (ctf_errno (input) != ECTF_NEXT_END)
case CTF_K_FORWARD:
case CTF_K_INTEGER:
case CTF_K_FLOAT:
+ case CTF_K_BTF_FLOAT:
case CTF_K_ENUM:
case CTF_K_ENUM64:
/* No types referenced. */
break;
case CTF_K_FLOAT:
+ case CTF_K_BTF_FLOAT:
case CTF_K_INTEGER:
errtype = _("float/int");
if (ctf_type_encoding (input, type, &ep) < 0)
case CTF_K_STRUCT:
case CTF_K_UNION:
{
- size_t size = ctf_type_size (input, type);
+ ssize_t size = ctf_type_size (input, type);
void *out_id;
+ int is_bitfield;
+
/* Insert the structure itself, so other types can refer to it. */
errtype = _("structure/union");
+
+ is_bitfield = ctf_struct_bitfield (input, type);
+
+ if (is_bitfield < 0 || size < 0)
+ goto err_input;
+
+ if (is_bitfield)
+ isroot |= CTF_ADD_STRUCT_BITFIELDS;
+
if (kind == CTF_K_STRUCT)
new_type = ctf_add_struct_sized (target, isroot, name, size);
else
#ifdef ENABLE_LIBCTF_HASH_DEBUGGING
ctf_dprintf ("Emitting %s, target-mapped type %lx, offset %zi\n", name, membtype, offset);
#endif
- if (ctf_add_member_offset (target, target_type, name,
- membtype, offset) < 0)
+ if (ctf_add_member_bitfield (target, target_type, name, membtype,
+ offset, width) < 0)
{
ctf_next_destroy (j);
goto err_target;