static void get_ctt_size(ctf_type_t *ctt, size_t *sizep, size_t *incrementp) { if (ctt->ctt_size == CTF_LSIZE_SENT) { *sizep = (size_t)CTF_TYPE_LSIZE(ctt); *incrementp = sizeof (ctf_type_t); } else { *sizep = ctt->ctt_size; *incrementp = sizeof (ctf_stype_t); } }
ssize_t ctf_get_ctt_size(const ctf_file_t *fp, const ctf_type_t *tp, ssize_t *sizep, ssize_t *incrementp) { ssize_t size, increment; if (fp->ctf_version > CTF_VERSION_1 && tp->ctt_size == CTF_LSIZE_SENT) { size = CTF_TYPE_LSIZE(tp); increment = sizeof (ctf_type_t); } else { size = tp->ctt_size; increment = sizeof (ctf_stype_t); } if (sizep) *sizep = size; if (incrementp) *incrementp = increment; return (size); }
static ssize_t fbt_get_ctt_size(uint8_t version, const ctf_type_t *tp, ssize_t *sizep, ssize_t *incrementp) { ssize_t size, increment; if (version > CTF_VERSION_1 && tp->ctt_size == CTF_LSIZE_SENT) { size = CTF_TYPE_LSIZE(tp); increment = sizeof (ctf_type_t); } else { size = tp->ctt_size; increment = sizeof (ctf_stype_t); } if (sizep) *sizep = size; if (incrementp) *incrementp = increment; return (size); }
static int read_types(const ctf_header_t *hp, const ctf_data_t *cd) { /* LINTED - pointer alignment */ const ctf_type_t *tp = (ctf_type_t *)(cd->cd_ctfdata + hp->cth_typeoff); /* LINTED - pointer alignment */ const ctf_type_t *end = (ctf_type_t *)(cd->cd_ctfdata + hp->cth_stroff); ulong_t id; if (flags != F_STATS) print_line("- Types "); if (hp->cth_typeoff & 3) WARN("cth_typeoff is not aligned properly\n"); if (hp->cth_typeoff >= cd->cd_ctflen) WARN("file is truncated or cth_typeoff is corrupt\n"); if (hp->cth_stroff >= cd->cd_ctflen) WARN("file is truncated or cth_stroff is corrupt\n"); if (hp->cth_typeoff > hp->cth_stroff) WARN("file is corrupt -- cth_typeoff > cth_stroff\n"); id = 1; if (hp->cth_parlabel || hp->cth_parname) id += 1 << CTF_PARENT_SHIFT; for (/* */; tp < end; id++) { ulong_t i, n = CTF_INFO_VLEN(tp->ctt_info); size_t size, increment, vlen = 0; int kind = CTF_INFO_KIND(tp->ctt_info); union { const void *ptr; const ctf_array_t *ap; const ctf_member_t *mp; const ctf_lmember_t *lmp; const ctf_enum_t *ep; const ushort_t *argp; } u; if (flags != F_STATS) { (void) printf(" %c%lu%c ", "[<"[CTF_INFO_ISROOT(tp->ctt_info)], id, "]>"[CTF_INFO_ISROOT(tp->ctt_info)]); } if (tp->ctt_size == CTF_LSIZE_SENT) { increment = sizeof (ctf_type_t); size = (size_t)CTF_TYPE_LSIZE(tp); } else { increment = sizeof (ctf_stype_t); size = tp->ctt_size; } u.ptr = (caddr_t)tp + increment; switch (kind) { case CTF_K_INTEGER: if (flags != F_STATS) { uint_t encoding = *((const uint_t *)u.ptr); (void) printf("INTEGER %s encoding=%s offset=%u" " bits=%u", ref_to_str(tp->ctt_name, hp, cd), int_encoding_to_str( CTF_INT_ENCODING(encoding)), CTF_INT_OFFSET(encoding), CTF_INT_BITS(encoding)); } vlen = sizeof (uint_t); break; case CTF_K_FLOAT: if (flags != F_STATS) { uint_t encoding = *((const uint_t *)u.ptr); (void) printf("FLOAT %s encoding=%s offset=%u " "bits=%u", ref_to_str(tp->ctt_name, hp, cd), fp_encoding_to_str( CTF_FP_ENCODING(encoding)), CTF_FP_OFFSET(encoding), CTF_FP_BITS(encoding)); } vlen = sizeof (uint_t); break; case CTF_K_POINTER: if (flags != F_STATS) { (void) printf("POINTER %s refers to %u", ref_to_str(tp->ctt_name, hp, cd), tp->ctt_type); } break; case CTF_K_ARRAY: if (flags != F_STATS) { (void) printf("ARRAY %s content: %u index: %u " "nelems: %u\n", ref_to_str(tp->ctt_name, hp, cd), u.ap->cta_contents, u.ap->cta_index, u.ap->cta_nelems); } vlen = sizeof (ctf_array_t); break; case CTF_K_FUNCTION: if (flags != F_STATS) { (void) printf("FUNCTION %s returns: %u args: (", ref_to_str(tp->ctt_name, hp, cd), tp->ctt_type); if (n != 0) { (void) printf("%u", *u.argp++); for (i = 1; i < n; i++, u.argp++) (void) printf(", %u", *u.argp); } (void) printf(")"); } vlen = sizeof (ushort_t) * (n + (n & 1)); break; case CTF_K_STRUCT: case CTF_K_UNION: if (kind == CTF_K_STRUCT) { stats.s_nsmem += n; stats.s_smmax = MAX(stats.s_smmax, n); stats.s_nsbytes += size; stats.s_sbmax = MAX(stats.s_sbmax, size); if (flags != F_STATS) (void) printf("STRUCT"); } else { stats.s_numem += n; stats.s_ummax = MAX(stats.s_ummax, n); stats.s_nubytes += size; stats.s_ubmax = MAX(stats.s_ubmax, size); if (flags != F_STATS) (void) printf("UNION"); } if (flags != F_STATS) { (void) printf(" %s (%d bytes)\n", ref_to_str(tp->ctt_name, hp, cd), size); if (size >= CTF_LSTRUCT_THRESH) { for (i = 0; i < n; i++, u.lmp++) { (void) printf( "\t%s type=%u off=%llu\n", ref_to_str(u.lmp->ctlm_name, hp, cd), u.lmp->ctlm_type, CTF_LMEM_OFFSET(u.lmp)); } } else { for (i = 0; i < n; i++, u.mp++) { (void) printf( "\t%s type=%u off=%u\n", ref_to_str(u.mp->ctm_name, hp, cd), u.mp->ctm_type, u.mp->ctm_offset); } } } vlen = n * (size >= CTF_LSTRUCT_THRESH ? sizeof (ctf_lmember_t) : sizeof (ctf_member_t)); break; case CTF_K_ENUM: if (flags != F_STATS) { (void) printf("ENUM %s\n", ref_to_str(tp->ctt_name, hp, cd)); for (i = 0; i < n; i++, u.ep++) { (void) printf("\t%s = %d\n", ref_to_str(u.ep->cte_name, hp, cd), u.ep->cte_value); } } stats.s_nemem += n; stats.s_emmax = MAX(stats.s_emmax, n); vlen = sizeof (ctf_enum_t) * n; break; case CTF_K_FORWARD: if (flags != F_STATS) { (void) printf("FORWARD %s", ref_to_str(tp->ctt_name, hp, cd)); } break; case CTF_K_TYPEDEF: if (flags != F_STATS) { (void) printf("TYPEDEF %s refers to %u", ref_to_str(tp->ctt_name, hp, cd), tp->ctt_type); } break; case CTF_K_VOLATILE: if (flags != F_STATS) { (void) printf("VOLATILE %s refers to %u", ref_to_str(tp->ctt_name, hp, cd), tp->ctt_type); } break; case CTF_K_CONST: if (flags != F_STATS) { (void) printf("CONST %s refers to %u", ref_to_str(tp->ctt_name, hp, cd), tp->ctt_type); } break; case CTF_K_RESTRICT: if (flags != F_STATS) { (void) printf("RESTRICT %s refers to %u", ref_to_str(tp->ctt_name, hp, cd), tp->ctt_type); } break; case CTF_K_UNKNOWN: break; /* hole in type id space */ default: (void) printf("unexpected kind %u\n", kind); return (E_ERROR); } if (flags != F_STATS) (void) printf("\n"); stats.s_ntypes++; stats.s_types[kind]++; tp = (ctf_type_t *)((uintptr_t)tp + increment + vlen); } return (E_SUCCESS); }