Lines Matching full:it
21 * DWARF to IT (internal type) representation parser.
141 struct itype *it; in dwarf_parse() local
180 RB_FOREACH(it, itype_tree, &itypet[CTF_K_INTEGER]) { in dwarf_parse()
181 if (it_name(it) == NULL || it->it_size != (8 * sizeof(long))) in dwarf_parse()
184 if (strcmp(it_name(it), "unsigned") == 0) { in dwarf_parse()
185 long_tidx = it->it_idx; in dwarf_parse()
195 struct itype *it; in it_new() local
200 pool_init(&it_pool, "it", 512, sizeof(struct itype)); in it_new()
209 it = pmalloc(&it_pool, sizeof(*it)); in it_new()
210 SIMPLEQ_INIT(&it->it_refs); in it_new()
211 TAILQ_INIT(&it->it_members); in it_new()
212 it->it_off = off; in it_new()
213 it->it_ref = ref; in it_new()
214 it->it_refp = NULL; in it_new()
215 it->it_size = size; in it_new()
216 it->it_nelems = 0; in it_new()
217 it->it_enc = enc; in it_new()
218 it->it_idx = index; in it_new()
219 it->it_type = type; in it_new()
220 it->it_flags = flags; in it_new()
223 it->it_flags |= ITF_ANON; in it_new()
227 if ((n = strlcpy(it->it_name, name, ITNAME_MAX)) > ITNAME_MAX) in it_new()
231 return it; in it_new()
235 it_dup(struct itype *it) in it_dup() argument
240 copit = it_new(it->it_idx, it->it_off, it_name(it), it->it_size, in it_dup()
241 it->it_enc, it->it_ref, it->it_type, it->it_flags); in it_dup()
243 copit->it_refp = it->it_refp; in it_dup()
244 copit->it_nelems = it->it_nelems; in it_dup()
246 TAILQ_FOREACH(im, &it->it_members, im_next) { in it_dup()
256 * Merge the content of ``it'', the full type declaration into the
260 it_merge(struct itype *fwd, struct itype *it) in it_merge() argument
263 assert(fwd->it_type == it->it_type); in it_merge()
265 assert(SIMPLEQ_EMPTY(&it->it_refs)); in it_merge()
267 fwd->it_off = it->it_off; in it_merge()
268 fwd->it_ref = it->it_ref; in it_merge()
269 fwd->it_refp = it->it_refp; in it_merge()
270 fwd->it_size = it->it_size; in it_merge()
271 fwd->it_nelems = it->it_nelems; in it_merge()
272 fwd->it_enc = it->it_enc; in it_merge()
273 fwd->it_flags = it->it_flags; in it_merge()
275 TAILQ_CONCAT(&fwd->it_members, &it->it_members, im_next); in it_merge()
276 assert(TAILQ_EMPTY(&it->it_members)); in it_merge()
280 it_name(struct itype *it) in it_name() argument
282 if (!(it->it_flags & ITF_ANON)) in it_name()
283 return it->it_name; in it_name()
289 it_reference(struct itype *it) in it_reference() argument
293 if (it == NULL || it->it_flags & ITF_USED) in it_reference()
296 it->it_flags |= ITF_USED; in it_reference()
298 it_reference(it->it_refp); in it_reference()
299 TAILQ_FOREACH(im, &it->it_members, im_next) in it_reference()
304 it_free(struct itype *it) in it_free() argument
308 if (it == NULL) in it_free()
311 while ((im = TAILQ_FIRST(&it->it_members)) != NULL) { in it_free()
312 TAILQ_REMOVE(&it->it_members, im, im_next); in it_free()
316 ir_purge(it); in it_free()
317 pfree(&it_pool, it); in it_free()
388 ir_add(struct itype *it, struct itype *tmp) in ir_add() argument
393 if (ir->ir_itp == it) in ir_add()
398 ir->ir_itp = it; in ir_add()
403 ir_purge(struct itype *it) in ir_purge() argument
407 while ((ir = SIMPLEQ_FIRST(&it->it_refs)) != NULL) { in ir_purge()
408 SIMPLEQ_REMOVE_HEAD(&it->it_refs, ir_next); in ir_purge()
462 struct itype *it, *ref, tmp; in cu_resolve() local
467 TAILQ_FOREACH(it, cutq, it_next) { in cu_resolve()
468 if (!(it->it_flags & (ITF_UNRES|ITF_UNRES_MEMB))) in cu_resolve()
471 /* If this type references another one, try to find it. */ in cu_resolve()
472 if (it->it_flags & ITF_UNRES) { in cu_resolve()
473 tmp.it_off = it->it_ref + off; in cu_resolve()
476 it->it_refp = ref; in cu_resolve()
477 ir_add(it, ref); in cu_resolve()
478 it->it_flags &= ~ITF_UNRES; in cu_resolve()
483 toresolve = it->it_nelems; in cu_resolve()
484 if ((it->it_flags & ITF_UNRES_MEMB) && toresolve > 0) { in cu_resolve()
485 TAILQ_FOREACH(im, &it->it_members, im_next) { in cu_resolve()
490 ir_add(it, ref); in cu_resolve()
495 it->it_flags &= ~ITF_UNRES_MEMB; in cu_resolve()
498 if (it->it_flags & (ITF_UNRES|ITF_UNRES_MEMB)) { in cu_resolve()
500 it->it_off, it_name(it), it->it_type, it->it_ref); in cu_resolve()
503 TAILQ_FOREACH(im, &it->it_members, im_next) { in cu_resolve()
513 /* We'll reuse the tree for the next CU, so empty it. */ in cu_resolve()
514 RB_FOREACH_SAFE(it, ioff_tree, cuot, ref) in cu_resolve()
515 RB_REMOVE(ioff_tree, cuot, it); in cu_resolve()
521 struct itype *it; in cu_reference() local
523 TAILQ_FOREACH(it, cutq, it_next) { in cu_reference()
524 if (it->it_flags & (ITF_OBJ|ITF_FUNC)) in cu_reference()
525 it_reference(it); in cu_reference()
535 struct itype *it, *nit, *prev, *first; in cu_merge() local
538 /* First ``it'' that needs a duplicate check. */ in cu_merge()
548 for (it = first; it != NULL; it = nit) { in cu_merge()
549 nit = TAILQ_NEXT(it, it_next); in cu_merge()
552 if (it->it_flags & (ITF_FUNC|ITF_OBJ)) { in cu_merge()
557 if (RB_FIND(isymb_tree, &isymbt, it) == NULL) in cu_merge()
558 RB_INSERT(isymb_tree, &isymbt, it); in cu_merge()
563 if (it->it_flags & ITF_USED) in cu_merge()
564 prev = RB_FIND(itype_tree, &itypet[it->it_type], it); in cu_merge()
569 struct itype *old = it; in cu_merge()
575 it = ir->ir_itp; in cu_merge()
580 if (it->it_refp == old) in cu_merge()
581 it->it_refp = prev; in cu_merge()
583 TAILQ_FOREACH(im, &it->it_members, im_next) { in cu_merge()
589 /* If we first got a forward reference, complete it. */ in cu_merge()
595 } else if (it->it_flags & ITF_USED) { in cu_merge()
596 RB_INSERT(itype_tree, &itypet[it->it_type], it); in cu_merge()
604 for (it = first; it != NULL; it = nit) { in cu_merge()
605 nit = TAILQ_NEXT(it, it_next); in cu_merge()
607 if (it->it_flags & (ITF_FUNC|ITF_OBJ)) in cu_merge()
611 if (it->it_flags & ITF_USED) { in cu_merge()
612 it->it_idx -= diff; in cu_merge()
617 TAILQ_REMOVE(&itypeq, it, it_next); in cu_merge()
618 it_free(it); in cu_merge()
623 it = TAILQ_LAST(&itypeq, itype_queue); in cu_merge()
624 while (it->it_flags & (ITF_FUNC|ITF_OBJ)) in cu_merge()
625 it = TAILQ_PREV(it, itype_queue, it_next); in cu_merge()
627 tidx = it->it_idx; in cu_merge()
636 struct itype *it = NULL; in cu_parse() local
648 it = parse_array(die, dcu->dcu_psize); in cu_parse()
651 it = parse_enum(die, dcu->dcu_psize); in cu_parse()
654 it = parse_refers(die, psz, CTF_K_POINTER); in cu_parse()
657 it = parse_struct(die, psz, CTF_K_STRUCT, off); in cu_parse()
658 if (it == NULL) in cu_parse()
662 it = parse_refers(die, psz, CTF_K_TYPEDEF); in cu_parse()
665 it = parse_struct(die, psz, CTF_K_UNION, off); in cu_parse()
666 if (it == NULL) in cu_parse()
670 it = parse_base(die, psz); in cu_parse()
671 if (it == NULL) in cu_parse()
675 it = parse_refers(die, psz, CTF_K_CONST); in cu_parse()
678 it = parse_refers(die, psz, CTF_K_VOLATILE); in cu_parse()
681 it = parse_refers(die, psz, CTF_K_RESTRICT); in cu_parse()
684 it = parse_function(die, psz); in cu_parse()
685 if (it == NULL) in cu_parse()
689 it = parse_funcptr(die, psz); in cu_parse()
697 assert(it->it_type == CTF_K_STRUCT || in cu_parse()
698 it->it_type == CTF_K_UNION || in cu_parse()
699 it->it_type == CTF_K_ENUM); in cu_parse()
702 assert(it->it_type == CTF_K_ARRAY); in cu_parse()
709 if (it == NULL) in cu_parse()
713 if (it->it_type == CTF_K_STRUCT || in cu_parse()
714 it->it_type == CTF_K_UNION || in cu_parse()
715 it->it_type == CTF_K_ENUM || in cu_parse()
716 it->it_type == CTF_K_TYPEDEF) in cu_parse()
719 if (it->it_flags & ITF_OBJ) in cu_parse()
722 assert(it->it_type == CTF_K_FUNCTION); in cu_parse()
725 it = parse_variable(die, psz); in cu_parse()
727 if (it == NULL) in cu_parse()
741 TAILQ_INSERT_TAIL(cutq, it, it_next); in cu_parse()
742 RB_INSERT(ioff_tree, cuot, it); in cu_parse()
749 struct itype *it; in parse_base() local
822 it = it_new(++tidx, die->die_offset, enc2name(enc), bits, in parse_base()
825 return it; in parse_base()
831 struct itype *it; in parse_refers() local
854 it = it_new(++tidx, die->die_offset, name, size, 0, ref, type, in parse_refers()
857 if (it->it_ref == 0 && (it->it_size == sizeof(void *) || in parse_refers()
861 it->it_flags &= ~ITF_UNRES; in parse_refers()
862 it->it_ref = VOID_OFFSET; in parse_refers()
863 it->it_refp = void_it; in parse_refers()
866 return it; in parse_refers()
872 struct itype *it; in parse_array() local
891 it = it_new(++tidx, die->die_offset, name, 0, 0, ref, CTF_K_ARRAY, in parse_array()
894 subparse_subrange(die, psz, it); in parse_array()
896 return it; in parse_array()
902 struct itype *it; in parse_enum() local
922 it = it_new(++tidx, die->die_offset, name, size, 0, 0, CTF_K_ENUM, 0); in parse_enum()
924 subparse_enumerator(die, psz, it); in parse_enum()
926 return it; in parse_enum()
930 subparse_subrange(struct dwdie *die, size_t psz, struct itype *it) in subparse_subrange() argument
934 assert(it->it_type == CTF_K_ARRAY); in subparse_subrange()
941 * after it on the list. in subparse_subrange()
966 it->it_nelems = nelems; in subparse_subrange()
971 subparse_enumerator(struct dwdie *die, size_t psz, struct itype *it) in subparse_enumerator() argument
976 assert(it->it_type == CTF_K_ENUM); in subparse_enumerator()
983 * after it on the list. in subparse_enumerator()
1009 warnx("%s with anon member", it_name(it)); in subparse_enumerator()
1014 assert(it->it_nelems < UINT_MAX); in subparse_enumerator()
1015 it->it_nelems++; in subparse_enumerator()
1016 TAILQ_INSERT_TAIL(&it->it_members, im, im_next); in subparse_enumerator()
1023 struct itype *it = NULL; in parse_struct() local
1051 it = it_new(++tidx, die->die_offset, name, size, 0, 0, type, flags); in parse_struct()
1052 subparse_member(die, psz, it, off); in parse_struct()
1054 return it; in parse_struct()
1058 subparse_member(struct dwdie *die, size_t psz, struct itype *it, size_t offset) in subparse_member() argument
1066 assert(it->it_type == CTF_K_STRUCT || it->it_type == CTF_K_UNION); in subparse_member()
1073 * after it on the list. in subparse_member()
1096 it->it_flags |= ITF_UNRES_MEMB; in subparse_member()
1129 assert(it->it_nelems < UINT_MAX); in subparse_member()
1130 it->it_nelems++; in subparse_member()
1131 TAILQ_INSERT_TAIL(&it->it_members, im, im_next); in subparse_member()
1137 subparse_arguments(struct dwdie *die, size_t psz, struct itype *it) in subparse_arguments() argument
1143 assert(it->it_type == CTF_K_FUNCTION); in subparse_arguments()
1149 * This loop assumes that the children of a DIE are after it in subparse_arguments()
1181 it->it_flags |= ITF_UNRES_MEMB; in subparse_arguments()
1196 assert(it->it_nelems < UINT_MAX); in subparse_arguments()
1197 it->it_nelems++; in subparse_arguments()
1198 TAILQ_INSERT_TAIL(&it->it_members, im, im_next); in subparse_arguments()
1205 struct itype *it; in parse_function() local
1237 it = it_new(++fidx, die->die_offset, name, 0, 0, ref, CTF_K_FUNCTION, in parse_function()
1240 subparse_arguments(die, psz, it); in parse_function()
1242 if (it->it_ref == 0) { in parse_function()
1244 it->it_flags &= ~ITF_UNRES; in parse_function()
1245 it->it_ref = VOID_OFFSET; in parse_function()
1246 it->it_refp = void_it; in parse_function()
1249 return it; in parse_function()
1255 struct itype *it; in parse_funcptr() local
1274 it = it_new(++tidx, die->die_offset, name, 0, 0, ref, CTF_K_FUNCTION, in parse_funcptr()
1277 subparse_arguments(die, psz, it); in parse_funcptr()
1279 if (it->it_ref == 0) { in parse_funcptr()
1281 it->it_flags &= ~ITF_UNRES; in parse_funcptr()
1282 it->it_ref = VOID_OFFSET; in parse_funcptr()
1283 it->it_refp = void_it; in parse_funcptr()
1286 return it; in parse_funcptr()
1292 struct itype *it = NULL; in parse_variable() local
1329 it = it_new(++oidx, die->die_offset, name, 0, 0, ref, 0, in parse_variable()
1333 return it; in parse_variable()