aboutsummaryrefslogtreecommitdiff
path: root/cddl/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'cddl/contrib')
-rw-r--r--cddl/contrib/opensolaris/common/ctf/ctf_create.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/cddl/contrib/opensolaris/common/ctf/ctf_create.c b/cddl/contrib/opensolaris/common/ctf/ctf_create.c
index a2ca81960f73..46e2b7faf437 100644
--- a/cddl/contrib/opensolaris/common/ctf/ctf_create.c
+++ b/cddl/contrib/opensolaris/common/ctf/ctf_create.c
@@ -1258,7 +1258,7 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type)
uint_t kind, flag, vlen;
ctf_bundle_t src, dst;
- ctf_encoding_t src_en, dst_en;
+ ctf_encoding_t src_en, main_en, dst_en;
ctf_arinfo_t src_ar, dst_ar;
ctf_dtdef_t *dtd;
@@ -1373,6 +1373,27 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type)
if (ctf_type_encoding(src_fp, src_type, &src_en) != 0)
return (ctf_set_errno(dst_fp, ctf_errno(src_fp)));
+ /*
+ * This could be a bitfield, and the CTF library assumes
+ * intrinsics will appear before bitfields. Therefore,
+ * try to copy over the intrinsic prior to copying the
+ * bitfield.
+ */
+ if (dst_type == CTF_ERR && name[0] != '\0' &&
+ (hep = ctf_hash_lookup(&src_fp->ctf_names, src_fp, name,
+ strlen(name))) != NULL &&
+ src_type != (ctf_id_t)hep->h_type) {
+ if (ctf_type_encoding(src_fp, (ctf_id_t)hep->h_type,
+ &main_en) != 0) {
+ return (ctf_set_errno(dst_fp,
+ ctf_errno(src_fp)));
+ }
+ if (bcmp(&src_en, &main_en, sizeof (ctf_encoding_t)) &&
+ ctf_add_type(dst_fp, src_fp,
+ (ctf_id_t)hep->h_type) == CTF_ERR)
+ return (CTF_ERR); /* errno is set for us */
+ }
+
if (dst_type != CTF_ERR) {
if (ctf_type_encoding(dst_fp, dst_type, &dst_en) != 0)
return (CTF_ERR); /* errno is set for us */