diff options
Diffstat (limited to 'cddl/contrib/opensolaris/common/ctf/ctf_create.c')
-rw-r--r-- | cddl/contrib/opensolaris/common/ctf/ctf_create.c | 371 |
1 files changed, 234 insertions, 137 deletions
diff --git a/cddl/contrib/opensolaris/common/ctf/ctf_create.c b/cddl/contrib/opensolaris/common/ctf/ctf_create.c index 3a080e71baa0..154cefb775ba 100644 --- a/cddl/contrib/opensolaris/common/ctf/ctf_create.c +++ b/cddl/contrib/opensolaris/common/ctf/ctf_create.c @@ -87,48 +87,85 @@ ctf_create(int *errp) } static uchar_t * -ctf_copy_smembers(ctf_dtdef_t *dtd, uint_t soff, uchar_t *t) +ctf_copy_smembers(const ctf_file_t *fp, ctf_dtdef_t *dtd, uint_t soff, + uchar_t *t) { ctf_dmdef_t *dmd = ctf_list_next(&dtd->dtd_u.dtu_members); - ctf_member_t ctm; + size_t sz; + uint_t name; for (; dmd != NULL; dmd = ctf_list_next(dmd)) { if (dmd->dmd_name) { - ctm.ctm_name = soff; + name = soff; soff += strlen(dmd->dmd_name) + 1; } else - ctm.ctm_name = 0; + name = 0; - ctm.ctm_type = (ushort_t)dmd->dmd_type; - ctm.ctm_offset = (ushort_t)dmd->dmd_offset; + if (fp->ctf_version == CTF_VERSION_2) { + struct ctf_member_v2 ctm; - bcopy(&ctm, t, sizeof (ctm)); - t += sizeof (ctm); + ctm.ctm_name = name; + ctm.ctm_type = (ushort_t)dmd->dmd_type; + ctm.ctm_offset = (ushort_t)dmd->dmd_offset; + + sz = sizeof (ctm); + bcopy(&ctm, t, sz); + t += sz; + } else { + struct ctf_member_v3 ctm; + + ctm.ctm_name = name; + ctm.ctm_type = dmd->dmd_type; + ctm.ctm_offset = dmd->dmd_offset; + + sz = sizeof (ctm); + bcopy(&ctm, t, sz); + t += sz; + } } return (t); } static uchar_t * -ctf_copy_lmembers(ctf_dtdef_t *dtd, uint_t soff, uchar_t *t) +ctf_copy_lmembers(const ctf_file_t *fp, ctf_dtdef_t *dtd, uint_t soff, + uchar_t *t) { ctf_dmdef_t *dmd = ctf_list_next(&dtd->dtd_u.dtu_members); - ctf_lmember_t ctlm; + size_t sz; + uint_t name; for (; dmd != NULL; dmd = ctf_list_next(dmd)) { if (dmd->dmd_name) { - ctlm.ctlm_name = soff; + name = soff; soff += strlen(dmd->dmd_name) + 1; } else - ctlm.ctlm_name = 0; + name = 0; + + if (fp->ctf_version == CTF_VERSION_2) { + struct ctf_lmember_v2 ctlm; - ctlm.ctlm_type = (ushort_t)dmd->dmd_type; - ctlm.ctlm_pad = 0; - ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI(dmd->dmd_offset); - ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO(dmd->dmd_offset); + ctlm.ctlm_name = name; + ctlm.ctlm_type = (ushort_t)dmd->dmd_type; + ctlm.ctlm_pad = 0; + ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI(dmd->dmd_offset); + ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO(dmd->dmd_offset); - bcopy(&ctlm, t, sizeof (ctlm)); - t += sizeof (ctlm); + sz = sizeof (ctlm); + bcopy(&ctlm, t, sz); + t += sz; + } else { + struct ctf_lmember_v3 ctlm; + + ctlm.ctlm_name = name; + ctlm.ctlm_type = dmd->dmd_type; + ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI(dmd->dmd_offset); + ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO(dmd->dmd_offset); + + sz = sizeof (ctlm); + bcopy(&ctlm, t, sz); + t += sz; + } } return (t); @@ -259,7 +296,7 @@ ctf_update(ctf_file_t *fp) */ bzero(&hdr, sizeof (hdr)); hdr.cth_magic = CTF_MAGIC; - hdr.cth_version = CTF_VERSION; + hdr.cth_version = fp->ctf_version; if (fp->ctf_flags & LCTF_CHILD) hdr.cth_parname = 1; /* i.e. _CTF_STRTAB_TEMPLATE[1] */ @@ -271,13 +308,20 @@ ctf_update(ctf_file_t *fp) for (size = 0, dtd = ctf_list_next(&fp->ctf_dtdefs); dtd != NULL; dtd = ctf_list_next(dtd)) { - uint_t kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info); - uint_t vlen = CTF_INFO_VLEN(dtd->dtd_data.ctt_info); + uint_t kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info); + uint_t vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info); - if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT) - size += sizeof (ctf_stype_t); - else - size += sizeof (ctf_type_t); + if (fp->ctf_version == CTF_VERSION_2) { + if (dtd->dtd_data.ctt_size != CTF_V2_LSIZE_SENT) + size += sizeof (struct ctf_stype_v2); + else + size += sizeof (struct ctf_type_v2); + } else { + if (dtd->dtd_data.ctt_size != LCTF_LSIZE_SENT(fp)) + size += sizeof (struct ctf_stype_v3); + else + size += sizeof (struct ctf_type_v3); + } switch (kind) { case CTF_K_INTEGER: @@ -285,17 +329,32 @@ ctf_update(ctf_file_t *fp) size += sizeof (uint_t); break; case CTF_K_ARRAY: - size += sizeof (ctf_array_t); + size += fp->ctf_version == CTF_VERSION_2 ? + sizeof (struct ctf_array_v2) : + sizeof (struct ctf_array_v3); break; case CTF_K_FUNCTION: - size += sizeof (ushort_t) * (vlen + (vlen & 1)); + size += roundup2(fp->ctf_idwidth * vlen, 4); break; case CTF_K_STRUCT: case CTF_K_UNION: - if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH) - size += sizeof (ctf_member_t) * vlen; - else - size += sizeof (ctf_lmember_t) * vlen; + if (fp->ctf_version == CTF_VERSION_2) { + if (dtd->dtd_data.ctt_size < + LCTF_LSTRUCT_THRESH(fp)) + size += sizeof (struct ctf_member_v2) * + vlen; + else + size += sizeof (struct ctf_lmember_v2) * + vlen; + } else { + if (dtd->dtd_data.ctt_size < + LCTF_LSTRUCT_THRESH(fp)) + size += sizeof (struct ctf_member_v3) * + vlen; + else + size += sizeof (struct ctf_lmember_v3) * + vlen; + } break; case CTF_K_ENUM: size += sizeof (ctf_enum_t) * vlen; @@ -328,11 +387,11 @@ ctf_update(ctf_file_t *fp) */ for (dtd = ctf_list_next(&fp->ctf_dtdefs); dtd != NULL; dtd = ctf_list_next(dtd)) { + void *tp; + uint_t kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info); + uint_t vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info); + struct ctf_type_v2 ctt; - uint_t kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info); - uint_t vlen = CTF_INFO_VLEN(dtd->dtd_data.ctt_info); - - ctf_array_t cta; uint_t encoding; size_t len; @@ -344,12 +403,27 @@ ctf_update(ctf_file_t *fp) } else dtd->dtd_data.ctt_name = 0; - if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT) - len = sizeof (ctf_stype_t); - else - len = sizeof (ctf_type_t); + if (fp->ctf_version == CTF_VERSION_2) { + ctt.ctt_name = dtd->dtd_data.ctt_name; + ctt.ctt_info = (ushort_t)dtd->dtd_data.ctt_info; + ctt.ctt_size = (ushort_t)dtd->dtd_data.ctt_size; + if (dtd->dtd_data.ctt_size != CTF_V2_LSIZE_SENT) + len = sizeof (struct ctf_stype_v2); + else { + len = sizeof (struct ctf_type_v2); + ctt.ctt_lsizehi = dtd->dtd_data.ctt_lsizehi; + ctt.ctt_lsizelo = dtd->dtd_data.ctt_lsizelo; + } + tp = &ctt; + } else { + if (dtd->dtd_data.ctt_size != LCTF_LSIZE_SENT(fp)) + len = sizeof (struct ctf_stype_v3); + else + len = sizeof (struct ctf_type_v3); + tp = &dtd->dtd_data; + } - bcopy(&dtd->dtd_data, t, len); + bcopy(tp, t, len); t += len; switch (kind) { @@ -371,24 +445,52 @@ ctf_update(ctf_file_t *fp) break; case CTF_K_ARRAY: - cta.cta_contents = (ushort_t) - dtd->dtd_u.dtu_arr.ctr_contents; - cta.cta_index = (ushort_t) - dtd->dtd_u.dtu_arr.ctr_index; - cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems; - bcopy(&cta, t, sizeof (cta)); - t += sizeof (cta); + if (fp->ctf_version == CTF_VERSION_2) { + struct ctf_array_v2 cta; + + cta.cta_contents = + (uint16_t)dtd->dtd_u.dtu_arr.ctr_contents; + cta.cta_index = + (uint16_t)dtd->dtd_u.dtu_arr.ctr_index; + cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems; + + bcopy(&cta, t, sizeof (cta)); + t += sizeof (cta); + } else { + struct ctf_array_v3 cta; + + cta.cta_contents = + dtd->dtd_u.dtu_arr.ctr_contents; + cta.cta_index = dtd->dtd_u.dtu_arr.ctr_index; + cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems; + + bcopy(&cta, t, sizeof (cta)); + t += sizeof (cta); + } break; case CTF_K_FUNCTION: { - ushort_t *argv = (ushort_t *)(uintptr_t)t; + char *argv = (char *)(uintptr_t)t; uint_t argc; - for (argc = 0; argc < vlen; argc++) - *argv++ = (ushort_t)dtd->dtd_u.dtu_argv[argc]; + if (fp->ctf_version == CTF_VERSION_2) { + ushort_t arg; - if (vlen & 1) - *argv++ = 0; /* pad to 4-byte boundary */ + for (argc = 0; argc < vlen; + argc++, argv += sizeof(arg)) { + arg = + (ushort_t)dtd->dtd_u.dtu_argv[argc]; + memcpy(argv, &arg, sizeof(arg)); + } + } else { + uint_t arg; + + for (argc = 0; argc < vlen; + argc++, argv += sizeof(arg)) { + arg = (uint_t)dtd->dtd_u.dtu_argv[argc]; + memcpy(argv, &arg, sizeof(arg)); + } + } t = (uchar_t *)argv; break; @@ -396,10 +498,12 @@ ctf_update(ctf_file_t *fp) case CTF_K_STRUCT: case CTF_K_UNION: - if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH) - t = ctf_copy_smembers(dtd, (uint_t)(s - s0), t); + if (dtd->dtd_data.ctt_size < LCTF_LSTRUCT_THRESH(fp)) + t = ctf_copy_smembers(fp, dtd, (uint_t)(s - s0), + t); else - t = ctf_copy_lmembers(dtd, (uint_t)(s - s0), t); + t = ctf_copy_lmembers(fp, dtd, (uint_t)(s - s0), + t); s = ctf_copy_membnames(dtd, s); break; @@ -495,7 +599,7 @@ ctf_dtd_delete(ctf_file_t *fp, ctf_dtdef_t *dtd) if (p != NULL) *q = p->dtd_hash; - kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info); + kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info); switch (kind) { case CTF_K_STRUCT: case CTF_K_UNION: @@ -515,11 +619,11 @@ ctf_dtd_delete(ctf_file_t *fp, ctf_dtdef_t *dtd) break; case CTF_K_FUNCTION: ctf_ref_dec(fp, dtd->dtd_data.ctt_type); - for (i = 0; i < CTF_INFO_VLEN(dtd->dtd_data.ctt_info); i++) + for (i = 0; i < LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info); i++) if (dtd->dtd_u.dtu_argv[i] != 0) ctf_ref_dec(fp, dtd->dtd_u.dtu_argv[i]); ctf_free(dtd->dtd_u.dtu_argv, sizeof (ctf_id_t) * - CTF_INFO_VLEN(dtd->dtd_data.ctt_info)); + LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info)); break; case CTF_K_ARRAY: ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents); @@ -584,7 +688,7 @@ ctf_discard(ctf_file_t *fp) for (dtd = ctf_list_prev(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) { ntd = ctf_list_prev(dtd); - if (CTF_TYPE_TO_INDEX(dtd->dtd_type) <= fp->ctf_dtoldid) + if (LCTF_TYPE_TO_INDEX(fp, dtd->dtd_type) <= fp->ctf_dtoldid) continue; /* skip types that have been committed */ ctf_dtd_delete(fp, dtd); @@ -609,7 +713,7 @@ ctf_add_generic(ctf_file_t *fp, uint_t flag, const char *name, ctf_dtdef_t **rp) if (!(fp->ctf_flags & LCTF_RDWR)) return (ctf_set_errno(fp, ECTF_RDONLY)); - if (CTF_INDEX_TO_TYPE(fp->ctf_dtnextid, 1) > CTF_MAX_TYPE) + if (LCTF_INDEX_TO_TYPE(fp, fp->ctf_dtnextid, 1) > LCTF_MAX_TYPE(fp)) return (ctf_set_errno(fp, ECTF_FULL)); if ((dtd = ctf_alloc(sizeof (ctf_dtdef_t))) == NULL) @@ -621,7 +725,7 @@ ctf_add_generic(ctf_file_t *fp, uint_t flag, const char *name, ctf_dtdef_t **rp) } type = fp->ctf_dtnextid++; - type = CTF_INDEX_TO_TYPE(type, (fp->ctf_flags & LCTF_CHILD)); + type = LCTF_INDEX_TO_TYPE(fp, type, (fp->ctf_flags & LCTF_CHILD)); bzero(dtd, sizeof (ctf_dtdef_t)); dtd->dtd_name = s; @@ -669,7 +773,7 @@ ctf_add_encoded(ctf_file_t *fp, uint_t flag, if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, flag, 0); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, flag, 0); dtd->dtd_data.ctt_size = clp2(P2ROUNDUP(ep->cte_bits, NBBY) / NBBY); dtd->dtd_u.dtu_enc = *ep; @@ -682,7 +786,7 @@ ctf_add_reftype(ctf_file_t *fp, uint_t flag, ctf_id_t ref, uint_t kind) ctf_dtdef_t *dtd; ctf_id_t type; - if (ref == CTF_ERR || ref < 0 || ref > CTF_MAX_TYPE) + if (ref == CTF_ERR || ref > LCTF_MAX_TYPE(fp)) return (ctf_set_errno(fp, EINVAL)); if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR) @@ -690,8 +794,8 @@ ctf_add_reftype(ctf_file_t *fp, uint_t flag, ctf_id_t ref, uint_t kind) ctf_ref_inc(fp, ref); - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, flag, 0); - dtd->dtd_data.ctt_type = (ushort_t)ref; + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, flag, 0); + dtd->dtd_data.ctt_type = (uint_t)ref; return (type); } @@ -739,7 +843,7 @@ ctf_add_array(ctf_file_t *fp, uint_t flag, const ctf_arinfo_t *arp) if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_ARRAY, flag, 0); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_ARRAY, flag, 0); dtd->dtd_data.ctt_size = 0; dtd->dtd_u.dtu_arr = *arp; ctf_ref_inc(fp, arp->ctr_contents); @@ -757,7 +861,8 @@ ctf_set_array(ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp) if (!(fp->ctf_flags & LCTF_RDWR)) return (ctf_set_errno(fp, ECTF_RDONLY)); - if (dtd == NULL || CTF_INFO_KIND(dtd->dtd_data.ctt_info) != CTF_K_ARRAY) + if (dtd == NULL || + LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY) return (ctf_set_errno(fp, ECTF_BADID)); fpd = fp; @@ -799,7 +904,7 @@ ctf_add_function(ctf_file_t *fp, uint_t flag, if (ctc->ctc_flags & CTF_FUNC_VARARG) vlen++; /* add trailing zero to indicate varargs (see below) */ - if (vlen > CTF_MAX_VLEN) + if (vlen > LCTF_MAX_VLEN(fp)) return (ctf_set_errno(fp, EOVERFLOW)); fpd = fp; @@ -822,8 +927,8 @@ ctf_add_function(ctf_file_t *fp, uint_t flag, return (CTF_ERR); /* errno is set for us */ } - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_FUNCTION, flag, vlen); - dtd->dtd_data.ctt_type = (ushort_t)ctc->ctc_return; + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_FUNCTION, flag, vlen); + dtd->dtd_data.ctt_type = ctc->ctc_return; ctf_ref_inc(fp, ctc->ctc_return); for (i = 0; i < ctc->ctc_argc; i++) @@ -853,7 +958,7 @@ ctf_add_struct(ctf_file_t *fp, uint_t flag, const char *name) else if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_STRUCT, flag, 0); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_STRUCT, flag, 0); dtd->dtd_data.ctt_size = 0; return (type); @@ -875,7 +980,7 @@ ctf_add_union(ctf_file_t *fp, uint_t flag, const char *name) else if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_UNION, flag, 0); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_UNION, flag, 0); dtd->dtd_data.ctt_size = 0; return (type); @@ -897,7 +1002,7 @@ ctf_add_enum(ctf_file_t *fp, uint_t flag, const char *name) else if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_ENUM, flag, 0); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_ENUM, flag, 0); dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int; return (type); @@ -936,7 +1041,7 @@ ctf_add_forward(ctf_file_t *fp, uint_t flag, const char *name, uint_t kind) if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_FORWARD, flag, 0); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_FORWARD, flag, 0); dtd->dtd_data.ctt_type = kind; return (type); @@ -957,8 +1062,8 @@ ctf_add_typedef(ctf_file_t *fp, uint_t flag, const char *name, ctf_id_t ref) if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR) return (CTF_ERR); /* errno is set for us */ - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_TYPEDEF, flag, 0); - dtd->dtd_data.ctt_type = (ushort_t)ref; + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_TYPEDEF, flag, 0); + dtd->dtd_data.ctt_type = ref; ctf_ref_inc(fp, ref); return (type); @@ -1000,14 +1105,14 @@ ctf_add_enumerator(ctf_file_t *fp, ctf_id_t enid, const char *name, int value) if (dtd == NULL) return (ctf_set_errno(fp, ECTF_BADID)); - kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info); - root = CTF_INFO_ISROOT(dtd->dtd_data.ctt_info); - vlen = CTF_INFO_VLEN(dtd->dtd_data.ctt_info); + kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info); + root = LCTF_INFO_ROOT(fp, dtd->dtd_data.ctt_info); + vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info); if (kind != CTF_K_ENUM) return (ctf_set_errno(fp, ECTF_NOTENUM)); - if (vlen == CTF_MAX_VLEN) + if (vlen > LCTF_MAX_VLEN(fp)) return (ctf_set_errno(fp, ECTF_DTFULL)); for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members); @@ -1029,7 +1134,7 @@ ctf_add_enumerator(ctf_file_t *fp, ctf_id_t enid, const char *name, int value) dmd->dmd_offset = 0; dmd->dmd_value = value; - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, root, vlen + 1); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, root, vlen + 1); ctf_list_append(&dtd->dtd_u.dtu_members, dmd); fp->ctf_dtstrlen += strlen(s) + 1; @@ -1054,14 +1159,14 @@ ctf_add_member(ctf_file_t *fp, ctf_id_t souid, const char *name, ctf_id_t type) if (dtd == NULL) return (ctf_set_errno(fp, ECTF_BADID)); - kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info); - root = CTF_INFO_ISROOT(dtd->dtd_data.ctt_info); - vlen = CTF_INFO_VLEN(dtd->dtd_data.ctt_info); + kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info); + root = LCTF_INFO_ROOT(fp, dtd->dtd_data.ctt_info); + vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info); if (kind != CTF_K_STRUCT && kind != CTF_K_UNION) return (ctf_set_errno(fp, ECTF_NOTSOU)); - if (vlen == CTF_MAX_VLEN) + if (vlen > LCTF_MAX_VLEN(fp)) return (ctf_set_errno(fp, ECTF_DTFULL)); if (name != NULL) { @@ -1121,14 +1226,14 @@ ctf_add_member(ctf_file_t *fp, ctf_id_t souid, const char *name, ctf_id_t type) ssize = MAX(ssize, msize); } - if (ssize > CTF_MAX_SIZE) { - dtd->dtd_data.ctt_size = CTF_LSIZE_SENT; + if (ssize > LCTF_MAX_SIZE(fp)) { + dtd->dtd_data.ctt_size = LCTF_LSIZE_SENT(fp); dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI(ssize); dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO(ssize); } else - dtd->dtd_data.ctt_size = (ushort_t)ssize; + dtd->dtd_data.ctt_size = ssize; - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, root, vlen + 1); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, root, vlen + 1); ctf_list_append(&dtd->dtd_u.dtu_members, dmd); if (s != NULL) @@ -1233,10 +1338,10 @@ static long soucmp(ctf_file_t *src_fp, ctf_id_t src_type, ctf_file_t *dst_fp, ctf_id_t dst_type) { - const struct ctf_type *src_tp, *dst_tp; + const void *src_tp, *dst_tp; const char *src_name, *dst_name; ssize_t src_sz, dst_sz, src_inc, dst_inc; - uint_t kind, n; + uint_t dst_kind, dst_vlen, src_kind, src_vlen, n; if ((src_type = ctf_type_resolve(src_fp, src_type)) == CTF_ERR) return (CTF_ERR); @@ -1248,47 +1353,37 @@ soucmp(ctf_file_t *src_fp, ctf_id_t src_type, ctf_file_t *dst_fp, if ((dst_tp = ctf_lookup_by_id(&dst_fp, dst_type)) == NULL) return (CTF_ERR); - if ((kind = LCTF_INFO_KIND(src_fp, src_tp->ctt_info)) != - LCTF_INFO_KIND(dst_fp, dst_tp->ctt_info)) + ctf_get_ctt_info(src_fp, src_tp, &src_kind, &src_vlen, NULL); + ctf_get_ctt_info(dst_fp, dst_tp, &dst_kind, &dst_vlen, NULL); + + if (src_kind != dst_kind) return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - if (kind != CTF_K_STRUCT && kind != CTF_K_UNION) + if (src_kind != CTF_K_STRUCT && src_kind != CTF_K_UNION) return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - if ((n = LCTF_INFO_VLEN(src_fp, src_tp->ctt_info)) != - LCTF_INFO_VLEN(dst_fp, dst_tp->ctt_info)) + if (src_vlen != dst_vlen) return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); (void) ctf_get_ctt_size(src_fp, src_tp, &src_sz, &src_inc); (void) ctf_get_ctt_size(dst_fp, dst_tp, &dst_sz, &dst_inc); - if (src_sz != dst_sz || src_inc != dst_inc) + if (src_sz != dst_sz) return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - if (src_sz < CTF_LSTRUCT_THRESH) { - const ctf_member_t *src_mp, *dst_mp; + const char *src_mp, *dst_mp; + ulong_t src_offset, dst_offset; - src_mp = (const ctf_member_t *)((uintptr_t)src_tp + src_inc); - dst_mp = (const ctf_member_t *)((uintptr_t)dst_tp + dst_inc); - for (; n != 0; n--, src_mp++, dst_mp++) { - if (src_mp->ctm_offset != dst_mp->ctm_offset) - return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - src_name = ctf_strptr(src_fp, src_mp->ctm_name); - dst_name = ctf_strptr(dst_fp, dst_mp->ctm_name); - if (strcmp(src_name, dst_name) != 0) - return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - } - } else { - const ctf_lmember_t *src_mp, *dst_mp; + src_mp = (const char *)src_tp + src_inc; + dst_mp = (const char *)dst_tp + dst_inc; + for (n = src_vlen; n != 0; + n--, src_mp += src_inc, dst_mp += dst_inc) { + ctf_get_ctm_info(src_fp, src_mp, src_sz, &src_inc, NULL, + &src_offset, &src_name); + ctf_get_ctm_info(dst_fp, dst_mp, dst_sz, &dst_inc, NULL, + &dst_offset, &dst_name); - src_mp = (const ctf_lmember_t *)((uintptr_t)src_tp + src_inc); - dst_mp = (const ctf_lmember_t *)((uintptr_t)dst_tp + dst_inc); - for (; n != 0; n--, src_mp++, dst_mp++) { - if (src_mp->ctlm_offsethi != dst_mp->ctlm_offsethi || - src_mp->ctlm_offsetlo != dst_mp->ctlm_offsetlo) - return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - src_name = ctf_strptr(src_fp, src_mp->ctlm_name); - dst_name = ctf_strptr(dst_fp, dst_mp->ctlm_name); - if (strcmp(src_name, dst_name) != 0) - return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); - } + if (src_offset != dst_offset) + return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); + if (strcmp(src_name, dst_name) != 0) + return (ctf_set_errno(dst_fp, ECTF_CONFLICT)); } return (0); @@ -1307,9 +1402,9 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type) ctf_id_t dst_type = CTF_ERR; uint_t dst_kind = CTF_K_UNKNOWN; - const ctf_type_t *tp; + const void *tp; const char *name; - uint_t kind, flag, vlen; + uint_t type, kind, flag, vlen; ctf_bundle_t src, dst; ctf_encoding_t src_en, main_en, dst_en; @@ -1331,10 +1426,9 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type) if ((tp = ctf_lookup_by_id(&src_fp, src_type)) == NULL) return (ctf_set_errno(dst_fp, ctf_errno(src_fp))); - name = ctf_strptr(src_fp, tp->ctt_name); - kind = LCTF_INFO_KIND(src_fp, tp->ctt_info); - flag = LCTF_INFO_ROOT(src_fp, tp->ctt_info); - vlen = LCTF_INFO_VLEN(src_fp, tp->ctt_info); + name = ctf_type_rname(src_fp, tp); + + ctf_get_ctt_info(src_fp, tp, &kind, &vlen, &flag); switch (kind) { case CTF_K_STRUCT: @@ -1389,10 +1483,10 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type) */ if (dst_type == CTF_ERR && name[0] != '\0') { for (dtd = ctf_list_prev(&dst_fp->ctf_dtdefs); dtd != NULL && - CTF_TYPE_TO_INDEX(dtd->dtd_type) > dst_fp->ctf_dtoldid; - dtd = ctf_list_prev(dtd)) { - if (CTF_INFO_KIND(dtd->dtd_data.ctt_info) != kind || - dtd->dtd_name == NULL || + LCTF_TYPE_TO_INDEX(dst_fp, dtd->dtd_type) > + dst_fp->ctf_dtoldid; dtd = ctf_list_prev(dtd)) { + if (LCTF_INFO_KIND(dst_fp, dtd->dtd_data.ctt_info) != + kind || dtd->dtd_name == NULL || strcmp(dtd->dtd_name, name) != 0) continue; if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT) { @@ -1499,7 +1593,8 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type) break; case CTF_K_FUNCTION: - ctc.ctc_return = ctf_add_type(dst_fp, src_fp, tp->ctt_type); + ctf_get_ctt_index(src_fp, tp, NULL, &type, NULL); + ctc.ctc_return = ctf_add_type(dst_fp, src_fp, type); ctc.ctc_argc = 0; ctc.ctc_flags = 0; @@ -1541,14 +1636,16 @@ ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type) if (ctf_member_iter(src_fp, src_type, membadd, &dst) != 0) errs++; /* increment errs and fail at bottom of case */ - if ((size = ctf_type_size(src_fp, src_type)) > CTF_MAX_SIZE) { - dtd->dtd_data.ctt_size = CTF_LSIZE_SENT; + if ((size = ctf_type_size(src_fp, src_type)) > + LCTF_MAX_SIZE(src_fp)) { + dtd->dtd_data.ctt_size = LCTF_LSIZE_SENT(dst_fp); dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI(size); dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO(size); } else - dtd->dtd_data.ctt_size = (ushort_t)size; + dtd->dtd_data.ctt_size = size; - dtd->dtd_data.ctt_info = CTF_TYPE_INFO(kind, flag, vlen); + dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(dst_fp, kind, flag, + vlen); /* * Make a final pass through the members changing each dmd_type |