Lines Matching refs:cup

295 ctf_dwarf_error(ctf_cu_t *cup, ctf_file_t *cfp, int err, const char *fmt, ...)  in ctf_dwarf_error()  argument
300 ssize_t rem = cup->cu_errlen; in ctf_dwarf_error()
307 ret = snprintf(cup->cu_errbuf, rem, "die %s: ", cup->cu_name); in ctf_dwarf_error()
314 ret = vsnprintf(cup->cu_errbuf + off, rem, fmt, ap); in ctf_dwarf_error()
322 (void) snprintf(cup->cu_errbuf + off, rem, in ctf_dwarf_error()
329 cup->cu_errbuf[0] = '\0'; in ctf_dwarf_error()
340 ctf_dwarf_void(ctf_cu_t *cup) in ctf_dwarf_void() argument
342 if (cup->cu_voidtid == CTF_ERR) { in ctf_dwarf_void()
344 cup->cu_voidtid = ctf_add_integer(cup->cu_ctfp, CTF_ADD_ROOT, in ctf_dwarf_void()
346 if (cup->cu_voidtid == CTF_ERR) { in ctf_dwarf_void()
347 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_void()
349 ctf_errmsg(ctf_errno(cup->cu_ctfp))); in ctf_dwarf_void()
353 return (cup->cu_voidtid); in ctf_dwarf_void()
362 ctf_dwarf_long(ctf_cu_t *cup) in ctf_dwarf_long() argument
364 if (cup->cu_longtid == CTF_ERR) { in ctf_dwarf_long()
370 enc.cte_bits = cup->cu_ptrsz * 8; in ctf_dwarf_long()
371 cup->cu_longtid = ctf_add_integer(cup->cu_ctfp, CTF_ADD_NONROOT, in ctf_dwarf_long()
373 if (cup->cu_longtid == CTF_ERR) { in ctf_dwarf_long()
374 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_long()
376 ctf_errmsg(ctf_errno(cup->cu_ctfp))); in ctf_dwarf_long()
381 return (cup->cu_longtid); in ctf_dwarf_long()
398 ctf_dwmap_add(ctf_cu_t *cup, ctf_id_t id, Dwarf_Die die, boolean_t fix) in ctf_dwmap_add() argument
407 if ((ret = ctf_dwarf_offset(cup, die, &off)) != 0) in ctf_dwmap_add()
419 VERIFY(avl_find(&cup->cu_map, dwmap, &index) == NULL); in ctf_dwmap_add()
420 avl_insert(&cup->cu_map, dwmap, index); in ctf_dwmap_add()
425 ctf_dwarf_attribute(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, in ctf_dwarf_attribute() argument
437 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_attribute()
444 ctf_dwarf_ref(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, Dwarf_Off *refp) in ctf_dwarf_ref() argument
450 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0) in ctf_dwarf_ref()
454 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_ref()
458 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_ref()
465 ctf_dwarf_refdie(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, in ctf_dwarf_refdie() argument
472 if ((ret = ctf_dwarf_ref(cup, die, name, &off)) != 0) in ctf_dwarf_refdie()
475 off += cup->cu_cuoff; in ctf_dwarf_refdie()
476 if ((ret = dwarf_offdie(cup->cu_dwarf, off, diep, &derr)) != in ctf_dwarf_refdie()
478 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_refdie()
488 ctf_dwarf_signed(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, in ctf_dwarf_signed() argument
495 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0) in ctf_dwarf_signed()
499 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_signed()
503 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_signed()
510 ctf_dwarf_unsigned(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, in ctf_dwarf_unsigned() argument
517 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0) in ctf_dwarf_unsigned()
521 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_unsigned()
525 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_unsigned()
532 ctf_dwarf_boolean(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, in ctf_dwarf_boolean() argument
539 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0) in ctf_dwarf_boolean()
543 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_boolean()
547 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_boolean()
555 ctf_dwarf_string(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, char **strp) in ctf_dwarf_string() argument
563 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0) in ctf_dwarf_string()
571 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_string()
575 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_string()
582 ctf_dwarf_member_location(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Unsigned *valp) in ctf_dwarf_member_location() argument
590 if ((ret = ctf_dwarf_attribute(cup, die, DW_AT_data_member_location, in ctf_dwarf_member_location()
595 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_member_location()
598 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_member_location()
601 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR); in ctf_dwarf_member_location()
604 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_member_location()
606 dwarf_dealloc(cup->cu_dwarf, loc->ld_s, DW_DLA_LOC_BLOCK); in ctf_dwarf_member_location()
607 dwarf_dealloc(cup->cu_dwarf, loc, DW_DLA_LOCDESC); in ctf_dwarf_member_location()
613 dwarf_dealloc(cup->cu_dwarf, loc->ld_s, DW_DLA_LOC_BLOCK); in ctf_dwarf_member_location()
614 dwarf_dealloc(cup->cu_dwarf, loc, DW_DLA_LOCDESC); in ctf_dwarf_member_location()
620 ctf_dwarf_offset(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Off *offsetp) in ctf_dwarf_offset() argument
627 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_offset()
645 ctf_dwarf_tag(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half *tagp) in ctf_dwarf_tag() argument
652 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_tag()
659 ctf_dwarf_sib(ctf_cu_t *cup, Dwarf_Die base, Dwarf_Die *sibp) in ctf_dwarf_sib() argument
665 ret = dwarf_siblingof(cup->cu_dwarf, base, sibp, &derr); in ctf_dwarf_sib()
669 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_sib()
676 ctf_dwarf_child(ctf_cu_t *cup, Dwarf_Die base, Dwarf_Die *childp) in ctf_dwarf_child() argument
686 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_child()
699 ctf_dwarf_isglobal(ctf_cu_t *cup, Dwarf_Die die, boolean_t *igp) in ctf_dwarf_isglobal() argument
705 if ((ret = ctf_dwarf_signed(cup, die, DW_AT_visibility, &vis)) == 0) { in ctf_dwarf_isglobal()
712 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_external, &ext)) != 0) { in ctf_dwarf_isglobal()
724 ctf_dwarf_die_elfenc(Elf *elf, ctf_cu_t *cup, char *errbuf, size_t errlen) in ctf_dwarf_die_elfenc() argument
735 cup->cu_mach = ehdr.e_machine; in ctf_dwarf_die_elfenc()
738 cup->cu_ptrsz = 4; in ctf_dwarf_die_elfenc()
739 VERIFY(ctf_setmodel(cup->cu_ctfp, CTF_MODEL_ILP32) == 0); in ctf_dwarf_die_elfenc()
741 cup->cu_ptrsz = 8; in ctf_dwarf_die_elfenc()
742 VERIFY(ctf_setmodel(cup->cu_ctfp, CTF_MODEL_LP64) == 0); in ctf_dwarf_die_elfenc()
750 cup->cu_bigend = B_FALSE; in ctf_dwarf_die_elfenc()
752 cup->cu_bigend = B_TRUE; in ctf_dwarf_die_elfenc()
807 ctf_dwarf_float_base(ctf_cu_t *cup, Dwarf_Signed type, ctf_encoding_t *enc) in ctf_dwarf_float_base() argument
814 if (map->cdf_mach == cup->cu_mach) in ctf_dwarf_float_base()
819 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_float_base()
820 "Unsupported machine type: %d\n", cup->cu_mach); in ctf_dwarf_float_base()
840 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_float_base()
847 ctf_dwarf_dwarf_base(ctf_cu_t *cup, Dwarf_Die die, int *kindp, in ctf_dwarf_dwarf_base() argument
853 if ((ret = ctf_dwarf_signed(cup, die, DW_AT_encoding, &type)) != 0) in ctf_dwarf_dwarf_base()
884 if ((ret = ctf_dwarf_float_base(cup, type, enc)) != 0) in ctf_dwarf_dwarf_base()
888 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_dwarf_base()
976 ctf_dwarf_create_base(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot, in ctf_dwarf_create_base() argument
986 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0) in ctf_dwarf_create_base()
988 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, &sz)) != 0) { in ctf_dwarf_create_base()
1003 if ((ret = ctf_dwarf_dwarf_base(cup, die, &kind, &enc)) != 0) in ctf_dwarf_create_base()
1007 id = ctf_add_encoded(cup->cu_ctfp, isroot, name, &enc, kind); in ctf_dwarf_create_base()
1009 ret = ctf_errno(cup->cu_ctfp); in ctf_dwarf_create_base()
1012 ret = ctf_dwmap_add(cup, id, die, B_FALSE); in ctf_dwarf_create_base()
1038 ctf_dwarf_member_offset(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t mid, in ctf_dwarf_member_offset() argument
1047 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_data_bit_offset, in ctf_dwarf_member_offset()
1055 if ((ret = ctf_dwarf_member_location(cup, die, &loc)) != 0) in ctf_dwarf_member_offset()
1059 if ((ret = ctf_dwarf_signed(cup, die, DW_AT_bit_offset, in ctf_dwarf_member_offset()
1068 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_bit_size, &bitsz)) != 0) in ctf_dwarf_member_offset()
1071 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, in ctf_dwarf_member_offset()
1075 if ((tsz = ctf_type_size(cup->cu_ctfp, mid)) == CTF_ERR) { in ctf_dwarf_member_offset()
1076 int e = ctf_errno(cup->cu_ctfp); in ctf_dwarf_member_offset()
1077 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_member_offset()
1085 if (cup->cu_bigend == B_TRUE) { in ctf_dwarf_member_offset()
1108 ctf_dwarf_member_bitfield(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp) in ctf_dwarf_member_bitfield() argument
1118 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_bit_size, &bitsz)) != 0) { in ctf_dwarf_member_bitfield()
1133 dtd = ctf_dtd_lookup(cup->cu_ctfp, base); in ctf_dwarf_member_bitfield()
1138 dtd = ctf_dtd_lookup(cup->cu_ctfp, dtd->dtd_data.ctt_type); in ctf_dwarf_member_bitfield()
1163 for (cdb = ctf_list_next(&cup->cu_bitfields); cdb != NULL; in ctf_dwarf_member_bitfield()
1194 cdb->cdb_id = ctf_add_integer(cup->cu_ctfp, CTF_ADD_NONROOT, in ctf_dwarf_member_bitfield()
1197 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_member_bitfield()
1199 ctf_errmsg(ctf_errno(cup->cu_ctfp))); in ctf_dwarf_member_bitfield()
1205 ctf_list_append(&cup->cu_bitfields, cdb); in ctf_dwarf_member_bitfield()
1214 ctf_dwarf_fixup_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t base, boolean_t add) in ctf_dwarf_fixup_sou() argument
1221 kind = ctf_type_kind(cup->cu_ctfp, base); in ctf_dwarf_fixup_sou()
1228 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) in ctf_dwarf_fixup_sou()
1241 if ((ret = ctf_dwarf_tag(cup, memb, &tag)) != 0) in ctf_dwarf_fixup_sou()
1247 if ((ret = ctf_dwarf_refdie(cup, memb, DW_AT_type, &tdie)) != 0) in ctf_dwarf_fixup_sou()
1250 if ((ret = ctf_dwarf_convert_type(cup, tdie, &mid, in ctf_dwarf_fixup_sou()
1259 if ((ret = ctf_dwarf_member_bitfield(cup, memb, in ctf_dwarf_fixup_sou()
1265 if ((ret = ctf_dwarf_string(cup, memb, DW_AT_name, in ctf_dwarf_fixup_sou()
1273 } else if ((ret = ctf_dwarf_member_offset(cup, memb, mid, in ctf_dwarf_fixup_sou()
1280 if ((ret = ctf_dwarf_member_bitfield(cup, memb, &mid)) != 0) in ctf_dwarf_fixup_sou()
1283 ret = ctf_add_member(cup->cu_ctfp, base, mname, mid, memboff); in ctf_dwarf_fixup_sou()
1285 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_fixup_sou()
1287 mname, ctf_errmsg(ctf_errno(cup->cu_ctfp))); in ctf_dwarf_fixup_sou()
1297 if ((ret = ctf_dwarf_sib(cup, memb, &sib)) != 0) in ctf_dwarf_fixup_sou()
1310 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, &size)) != 0) in ctf_dwarf_fixup_sou()
1313 if ((ctf_set_size(cup->cu_ctfp, base, nsz)) == CTF_ERR) { in ctf_dwarf_fixup_sou()
1314 int e = ctf_errno(cup->cu_ctfp); in ctf_dwarf_fixup_sou()
1315 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_fixup_sou()
1325 ctf_dwarf_create_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, in ctf_dwarf_create_sou() argument
1338 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && in ctf_dwarf_create_sou()
1350 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration, in ctf_dwarf_create_sou()
1358 base = ctf_add_forward(cup->cu_ctfp, isroot, name, kind); in ctf_dwarf_create_sou()
1360 base = ctf_add_struct(cup->cu_ctfp, isroot, name); in ctf_dwarf_create_sou()
1362 base = ctf_add_union(cup->cu_ctfp, isroot, name); in ctf_dwarf_create_sou()
1368 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_sou()
1376 return (ctf_dwmap_add(cup, base, die, B_FALSE)); in ctf_dwarf_create_sou()
1377 if ((ret = ctf_dwmap_add(cup, base, die, B_TRUE)) != 0) in ctf_dwarf_create_sou()
1383 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) in ctf_dwarf_create_sou()
1392 ctf_dwarf_create_array_range(ctf_cu_t *cup, Dwarf_Die range, ctf_id_t *idp, in ctf_dwarf_create_array_range() argument
1403 if ((ret = ctf_dwarf_sib(cup, range, &sib)) != 0) in ctf_dwarf_create_array_range()
1407 if ((ret = ctf_dwarf_create_array_range(cup, sib, &id, in ctf_dwarf_create_array_range()
1415 if ((ar.ctr_index = ctf_dwarf_long(cup)) == CTF_ERR) in ctf_dwarf_create_array_range()
1416 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_array_range()
1429 if ((ret = ctf_dwarf_unsigned(cup, range, DW_AT_upper_bound, in ctf_dwarf_create_array_range()
1434 } else if ((ret = ctf_dwarf_signed(cup, range, DW_AT_upper_bound, in ctf_dwarf_create_array_range()
1443 if ((*idp = ctf_add_array(cup->cu_ctfp, isroot, &ar)) == CTF_ERR) in ctf_dwarf_create_array_range()
1444 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_array_range()
1455 ctf_dwarf_create_array(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) in ctf_dwarf_create_array() argument
1462 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) in ctf_dwarf_create_array()
1464 if ((ret = ctf_dwarf_convert_type(cup, tdie, &tid, in ctf_dwarf_create_array()
1468 if ((ret = ctf_dwarf_child(cup, die, &rdie)) != 0) in ctf_dwarf_create_array()
1470 if ((ret = ctf_dwarf_tag(cup, rdie, &rtag)) != 0) in ctf_dwarf_create_array()
1473 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_create_array()
1484 if ((ret = ctf_dwarf_create_array_range(cup, rdie, idp, tid, in ctf_dwarf_create_array()
1488 return (ctf_dwmap_add(cup, *idp, die, B_FALSE)); in ctf_dwarf_create_array()
1492 ctf_dwarf_create_reference(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, in ctf_dwarf_create_reference() argument
1501 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && in ctf_dwarf_create_reference()
1513 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) { in ctf_dwarf_create_reference()
1518 if ((id = ctf_dwarf_void(cup)) == CTF_ERR) { in ctf_dwarf_create_reference()
1520 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_reference()
1523 if ((ret = ctf_dwarf_convert_type(cup, tdie, &id, in ctf_dwarf_create_reference()
1530 if ((*idp = ctf_add_reftype(cup->cu_ctfp, isroot, name, id, kind)) == in ctf_dwarf_create_reference()
1533 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_reference()
1537 return (ctf_dwmap_add(cup, *idp, die, B_FALSE)); in ctf_dwarf_create_reference()
1541 ctf_dwarf_create_enum(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) in ctf_dwarf_create_enum() argument
1548 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && in ctf_dwarf_create_enum()
1553 id = ctf_add_enum(cup->cu_ctfp, isroot, name); in ctf_dwarf_create_enum()
1558 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_enum()
1560 if ((ret = ctf_dwmap_add(cup, id, die, B_FALSE)) != 0) in ctf_dwarf_create_enum()
1563 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) { in ctf_dwarf_create_enum()
1576 if ((ret = ctf_dwarf_sib(cup, arg, &child)) != 0) in ctf_dwarf_create_enum()
1579 if ((ret = ctf_dwarf_tag(cup, arg, &tag)) != 0) in ctf_dwarf_create_enum()
1583 if ((ret = ctf_dwarf_convert_type(cup, arg, NULL, in ctf_dwarf_create_enum()
1592 if ((ret = ctf_dwarf_string(cup, arg, DW_AT_name, &name)) != 0) in ctf_dwarf_create_enum()
1601 if ((ret = ctf_dwarf_unsigned(cup, arg, DW_AT_const_value, in ctf_dwarf_create_enum()
1604 } else if ((ret = ctf_dwarf_signed(cup, arg, DW_AT_const_value, in ctf_dwarf_create_enum()
1613 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_create_enum()
1618 ret = ctf_add_enumerator(cup->cu_ctfp, id, name, eval); in ctf_dwarf_create_enum()
1620 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_create_enum()
1624 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_enum()
1637 ctf_dwarf_create_fptr(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) in ctf_dwarf_create_fptr() argument
1647 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration, &b)) != 0) { in ctf_dwarf_create_fptr()
1658 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &retdie)) != 0) { in ctf_dwarf_create_fptr()
1661 if ((fi.ctc_return = ctf_dwarf_void(cup)) == CTF_ERR) in ctf_dwarf_create_fptr()
1662 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_fptr()
1664 if ((ret = ctf_dwarf_convert_type(cup, retdie, &fi.ctc_return, in ctf_dwarf_create_fptr()
1669 if ((ret = ctf_dwarf_function_count(cup, die, &fi, B_TRUE)) != 0) { in ctf_dwarf_create_fptr()
1678 if ((ret = ctf_dwarf_convert_fargs(cup, die, &fi, argv)) != 0) { in ctf_dwarf_create_fptr()
1684 if ((*idp = ctf_add_funcptr(cup->cu_ctfp, isroot, &fi, argv)) == in ctf_dwarf_create_fptr()
1687 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_create_fptr()
1691 return (ctf_dwmap_add(cup, *idp, die, B_FALSE)); in ctf_dwarf_create_fptr()
1695 ctf_dwarf_convert_type(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, in ctf_dwarf_convert_type() argument
1707 if ((ret = ctf_dwarf_offset(cup, die, &offset)) != 0) in ctf_dwarf_convert_type()
1710 if (offset > cup->cu_maxoff) { in ctf_dwarf_convert_type()
1711 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_convert_type()
1713 offset, cup->cu_maxoff); in ctf_dwarf_convert_type()
1721 if ((map = avl_find(&cup->cu_map, &lookup, NULL)) != NULL) { in ctf_dwarf_convert_type()
1726 if ((ret = ctf_dwarf_tag(cup, die, &tag)) != 0) in ctf_dwarf_convert_type()
1733 ret = ctf_dwarf_create_base(cup, die, idp, isroot, offset); in ctf_dwarf_convert_type()
1737 ret = ctf_dwarf_create_array(cup, die, idp, isroot); in ctf_dwarf_convert_type()
1741 ret = ctf_dwarf_create_enum(cup, die, idp, isroot); in ctf_dwarf_convert_type()
1745 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_POINTER, in ctf_dwarf_convert_type()
1750 ret = ctf_dwarf_create_sou(cup, die, idp, CTF_K_STRUCT, in ctf_dwarf_convert_type()
1755 ret = ctf_dwarf_create_fptr(cup, die, idp, isroot); in ctf_dwarf_convert_type()
1759 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_TYPEDEF, in ctf_dwarf_convert_type()
1764 ret = ctf_dwarf_create_sou(cup, die, idp, CTF_K_UNION, in ctf_dwarf_convert_type()
1769 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_CONST, in ctf_dwarf_convert_type()
1774 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_VOLATILE, in ctf_dwarf_convert_type()
1779 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_RESTRICT, in ctf_dwarf_convert_type()
1794 ctf_dwarf_walk_lexical(ctf_cu_t *cup, Dwarf_Die die) in ctf_dwarf_walk_lexical() argument
1799 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) in ctf_dwarf_walk_lexical()
1805 return (ctf_dwarf_convert_die(cup, die)); in ctf_dwarf_walk_lexical()
1809 ctf_dwarf_function_count(ctf_cu_t *cup, Dwarf_Die die, ctf_funcinfo_t *fip, in ctf_dwarf_function_count() argument
1815 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) in ctf_dwarf_function_count()
1822 if ((ret = ctf_dwarf_tag(cup, arg, &tag)) != 0) in ctf_dwarf_function_count()
1840 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, in ctf_dwarf_function_count()
1854 if ((ret = ctf_dwarf_sib(cup, arg, &sib)) != 0) in ctf_dwarf_function_count()
1863 ctf_dwarf_convert_fargs(ctf_cu_t *cup, Dwarf_Die die, ctf_funcinfo_t *fip, in ctf_dwarf_convert_fargs() argument
1870 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) in ctf_dwarf_convert_fargs()
1877 if ((ret = ctf_dwarf_tag(cup, arg, &tag)) != 0) in ctf_dwarf_convert_fargs()
1882 if ((ret = ctf_dwarf_refdie(cup, arg, DW_AT_type, in ctf_dwarf_convert_fargs()
1886 if ((ret = ctf_dwarf_convert_type(cup, tdie, &argv[i], in ctf_dwarf_convert_fargs()
1900 if ((ret = ctf_dwarf_sib(cup, arg, &sib)) != 0) in ctf_dwarf_convert_fargs()
1909 ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) in ctf_dwarf_convert_function() argument
1922 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0) { in ctf_dwarf_convert_function()
1936 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) == 0) { in ctf_dwarf_convert_function()
1937 if ((ret = ctf_dwarf_convert_type(cup, tdie, in ctf_dwarf_convert_function()
1948 if ((cdf->cdf_fip.ctc_return = ctf_dwarf_void(cup)) == in ctf_dwarf_convert_function()
1952 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_convert_function()
1966 if ((ret = ctf_dwarf_function_count(cup, die, &cdf->cdf_fip, in ctf_dwarf_convert_function()
1982 if ((ret = ctf_dwarf_convert_fargs(cup, die, in ctf_dwarf_convert_function()
1993 if ((ret = ctf_dwarf_isglobal(cup, die, &cdf->cdf_global)) != 0) { in ctf_dwarf_convert_function()
2001 ctf_list_append(&cup->cu_funcs, cdf); in ctf_dwarf_convert_function()
2009 ctf_dwarf_convert_variable(ctf_cu_t *cup, Dwarf_Die die) in ctf_dwarf_convert_variable() argument
2019 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration, &b)) == 0) { in ctf_dwarf_convert_variable()
2033 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_specification, in ctf_dwarf_convert_variable()
2036 if ((ret = ctf_dwarf_offset(cup, tdie, &offset)) != 0) in ctf_dwarf_convert_variable()
2045 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && in ctf_dwarf_convert_variable()
2051 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) { in ctf_dwarf_convert_variable()
2056 if ((ret = ctf_dwarf_convert_type(cup, tdie, &id, in ctf_dwarf_convert_variable()
2068 if ((ret = ctf_dwarf_isglobal(cup, die, &cdv->cdv_global)) != 0) { in ctf_dwarf_convert_variable()
2074 ctf_list_append(&cup->cu_vars, cdv); in ctf_dwarf_convert_variable()
2082 ctf_dwarf_walk_toplevel(ctf_cu_t *cup, Dwarf_Die die) in ctf_dwarf_walk_toplevel() argument
2088 if ((ret = ctf_dwarf_offset(cup, die, &offset)) != 0) in ctf_dwarf_walk_toplevel()
2091 if (offset > cup->cu_maxoff) { in ctf_dwarf_walk_toplevel()
2092 (void) snprintf(cup->cu_errbuf, cup->cu_errlen, in ctf_dwarf_walk_toplevel()
2094 offset, cup->cu_maxoff); in ctf_dwarf_walk_toplevel()
2098 if ((ret = ctf_dwarf_tag(cup, die, &tag)) != 0) in ctf_dwarf_walk_toplevel()
2105 ret = ctf_dwarf_convert_function(cup, die); in ctf_dwarf_walk_toplevel()
2109 ret = ctf_dwarf_convert_variable(cup, die); in ctf_dwarf_walk_toplevel()
2113 ret = ctf_dwarf_walk_lexical(cup, die); in ctf_dwarf_walk_toplevel()
2120 ret = ctf_dwarf_convert_type(cup, die, NULL, B_TRUE); in ctf_dwarf_walk_toplevel()
2135 ctf_dwarf_convert_die(ctf_cu_t *cup, Dwarf_Die die) in ctf_dwarf_convert_die() argument
2141 if ((ret = ctf_dwarf_walk_toplevel(cup, die)) != 0) in ctf_dwarf_convert_die()
2144 if ((ret = ctf_dwarf_sib(cup, die, &sib)) != 0) in ctf_dwarf_convert_die()
2152 ctf_dwarf_fixup_die(ctf_cu_t *cup, boolean_t addpass) in ctf_dwarf_fixup_die() argument
2156 for (map = avl_first(&cup->cu_map); map != NULL; in ctf_dwarf_fixup_die()
2157 map = AVL_NEXT(&cup->cu_map, map)) { in ctf_dwarf_fixup_die()
2161 if ((ret = ctf_dwarf_fixup_sou(cup, map->cdm_die, map->cdm_id, in ctf_dwarf_fixup_die()
2170 ctf_dwarf_match_func(ctf_cu_t *cup, const char *file, const char *name, in ctf_dwarf_match_func() argument
2179 if (bind == STB_LOCAL && (file == NULL || cup->cu_name == NULL)) in ctf_dwarf_match_func()
2182 for (cdf = ctf_list_next(&cup->cu_funcs); cdf != NULL; in ctf_dwarf_match_func()
2190 if (bind == STB_LOCAL && strcmp(file, cup->cu_name) != 0) in ctf_dwarf_match_func()
2198 ctf_dwarf_match_var(ctf_cu_t *cup, const char *file, const char *name, in ctf_dwarf_match_var() argument
2204 if (bind == STB_LOCAL && (file == NULL || cup->cu_name == NULL)) in ctf_dwarf_match_var()
2208 for (cdv = ctf_list_next(&cup->cu_vars); cdv != NULL; in ctf_dwarf_match_var()
2216 if (bind == STB_LOCAL && strcmp(file, cup->cu_name) != 0) in ctf_dwarf_match_var()
2225 ctf_dwarf_symtab_iter(ctf_cu_t *cup, ctf_dwarf_symtab_f *func, void *arg) in ctf_dwarf_symtab_iter() argument
2229 ctf_file_t *fp = cup->cu_ctfp; in ctf_dwarf_symtab_iter()
2276 ret = func(cup, gsymp, i, file, name, arg); in ctf_dwarf_symtab_iter()
2285 ctf_dwarf_conv_funcvars_cb(ctf_cu_t *cup, const GElf_Sym *symp, ulong_t idx, in ctf_dwarf_conv_funcvars_cb() argument
2300 ctf_dwvar_t *cdv = ctf_dwarf_match_var(cup, file, name, in ctf_dwarf_conv_funcvars_cb()
2305 ret = ctf_add_object(cup->cu_ctfp, idx, cdv->cdv_type); in ctf_dwarf_conv_funcvars_cb()
2308 ctf_dwfunc_t *cdf = ctf_dwarf_match_func(cup, file, name, in ctf_dwarf_conv_funcvars_cb()
2312 ret = ctf_add_function(cup->cu_ctfp, idx, &cdf->cdf_fip, in ctf_dwarf_conv_funcvars_cb()
2317 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_conv_funcvars_cb()
2324 ctf_dwarf_conv_funcvars(ctf_cu_t *cup) in ctf_dwarf_conv_funcvars() argument
2326 return (ctf_dwarf_symtab_iter(cup, ctf_dwarf_conv_funcvars_cb, NULL)); in ctf_dwarf_conv_funcvars()
2375 ctf_dwarf_conv_check_weak(ctf_cu_t *cup, const GElf_Sym *symp, in ctf_dwarf_conv_check_weak() argument
2422 ctf_dwarf_duplicate_sym(ctf_cu_t *cup, ulong_t idx, ulong_t matchidx) in ctf_dwarf_duplicate_sym() argument
2424 ctf_id_t id = ctf_lookup_by_symbol(cup->cu_ctfp, matchidx); in ctf_dwarf_duplicate_sym()
2431 if (ctf_errno(cup->cu_ctfp) == ECTF_NOTYPEDAT) in ctf_dwarf_duplicate_sym()
2434 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_duplicate_sym()
2437 if (ctf_add_object(cup->cu_ctfp, idx, id) == CTF_ERR) in ctf_dwarf_duplicate_sym()
2438 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_duplicate_sym()
2444 ctf_dwarf_duplicate_func(ctf_cu_t *cup, ulong_t idx, ulong_t matchidx) in ctf_dwarf_duplicate_func() argument
2450 if (ctf_func_info(cup->cu_ctfp, matchidx, &fip) == CTF_ERR) { in ctf_dwarf_duplicate_func()
2451 if (ctf_errno(cup->cu_ctfp) == ECTF_NOFUNCDAT) in ctf_dwarf_duplicate_func()
2454 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_duplicate_func()
2462 if (ctf_func_args(cup->cu_ctfp, matchidx, fip.ctc_argc, args) == in ctf_dwarf_duplicate_func()
2465 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_duplicate_func()
2469 ret = ctf_add_function(cup->cu_ctfp, idx, &fip, args); in ctf_dwarf_duplicate_func()
2473 return (ctf_errno(cup->cu_ctfp)); in ctf_dwarf_duplicate_func()
2479 ctf_dwarf_conv_weaks_cb(ctf_cu_t *cup, const GElf_Sym *symp, in ctf_dwarf_conv_weaks_cb() argument
2506 ret = ctf_dwarf_symtab_iter(cup, ctf_dwarf_conv_check_weak, &cweak); in ctf_dwarf_conv_weaks_cb()
2522 ret = ctf_dwarf_duplicate_sym(cup, idx, cweak.cweak_idx); in ctf_dwarf_conv_weaks_cb()
2524 ret = ctf_dwarf_duplicate_func(cup, idx, cweak.cweak_idx); in ctf_dwarf_conv_weaks_cb()
2531 ctf_dwarf_conv_weaks(ctf_cu_t *cup) in ctf_dwarf_conv_weaks() argument
2533 return (ctf_dwarf_symtab_iter(cup, ctf_dwarf_conv_weaks_cb, NULL)); in ctf_dwarf_conv_weaks()
2542 ctf_cu_t *cup = arg; in ctf_dwarf_convert_one() local
2544 ctf_dprintf("converting die: %s\n", cup->cu_name); in ctf_dwarf_convert_one()
2545 ctf_dprintf("max offset: %x\n", cup->cu_maxoff); in ctf_dwarf_convert_one()
2546 VERIFY(cup != NULL); in ctf_dwarf_convert_one()
2548 ret = ctf_dwarf_convert_die(cup, cup->cu_cu); in ctf_dwarf_convert_one()
2549 ctf_dprintf("ctf_dwarf_convert_die (%s) returned %d\n", cup->cu_name, in ctf_dwarf_convert_one()
2554 if (ctf_update(cup->cu_ctfp) != 0) { in ctf_dwarf_convert_one()
2555 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0, in ctf_dwarf_convert_one()
2559 ret = ctf_dwarf_fixup_die(cup, B_FALSE); in ctf_dwarf_convert_one()
2560 ctf_dprintf("ctf_dwarf_fixup_die (%s) returned %d\n", cup->cu_name, in ctf_dwarf_convert_one()
2565 if (ctf_update(cup->cu_ctfp) != 0) { in ctf_dwarf_convert_one()
2566 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0, in ctf_dwarf_convert_one()
2570 ret = ctf_dwarf_fixup_die(cup, B_TRUE); in ctf_dwarf_convert_one()
2571 ctf_dprintf("ctf_dwarf_fixup_die (%s) returned %d\n", cup->cu_name, in ctf_dwarf_convert_one()
2576 if (ctf_update(cup->cu_ctfp) != 0) { in ctf_dwarf_convert_one()
2577 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0, in ctf_dwarf_convert_one()
2582 if ((ret = ctf_dwarf_conv_funcvars(cup)) != 0) { in ctf_dwarf_convert_one()
2583 return (ctf_dwarf_error(cup, NULL, ret, in ctf_dwarf_convert_one()
2587 if (ctf_update(cup->cu_ctfp) != 0) { in ctf_dwarf_convert_one()
2588 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0, in ctf_dwarf_convert_one()
2592 if (cup->cu_doweaks == B_TRUE) { in ctf_dwarf_convert_one()
2593 if ((ret = ctf_dwarf_conv_weaks(cup)) != 0) { in ctf_dwarf_convert_one()
2594 return (ctf_dwarf_error(cup, NULL, ret, in ctf_dwarf_convert_one()
2598 if (ctf_update(cup->cu_ctfp) != 0) { in ctf_dwarf_convert_one()
2599 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0, in ctf_dwarf_convert_one()
2604 ctf_phase_dump(cup->cu_ctfp, "pre-dedup"); in ctf_dwarf_convert_one()
2606 if ((ret = ctf_merge_add(cup->cu_cmh, cup->cu_ctfp)) != 0) { in ctf_dwarf_convert_one()
2607 return (ctf_dwarf_error(cup, NULL, ret, in ctf_dwarf_convert_one()
2612 if ((ret = ctf_merge_dedup(cup->cu_cmh, &dedup)) != 0) { in ctf_dwarf_convert_one()
2613 return (ctf_dwarf_error(cup, NULL, ret, in ctf_dwarf_convert_one()
2616 ctf_close(cup->cu_ctfp); in ctf_dwarf_convert_one()
2617 cup->cu_ctfp = dedup; in ctf_dwarf_convert_one()
2628 ctf_dwarf_free_die(ctf_cu_t *cup) in ctf_dwarf_free_die() argument
2637 ctf_dprintf("Beginning to free die: %p\n", cup); in ctf_dwarf_free_die()
2638 cup->cu_elf = NULL; in ctf_dwarf_free_die()
2639 ctf_dprintf("Trying to free name: %p\n", cup->cu_name); in ctf_dwarf_free_die()
2640 if (cup->cu_name != NULL) in ctf_dwarf_free_die()
2641 ctf_free(cup->cu_name, strlen(cup->cu_name) + 1); in ctf_dwarf_free_die()
2642 ctf_dprintf("Trying to free merge handle: %p\n", cup->cu_cmh); in ctf_dwarf_free_die()
2643 if (cup->cu_cmh != NULL) { in ctf_dwarf_free_die()
2644 ctf_merge_fini(cup->cu_cmh); in ctf_dwarf_free_die()
2645 cup->cu_cmh = NULL; in ctf_dwarf_free_die()
2649 for (cdf = ctf_list_next(&cup->cu_funcs); cdf != NULL; cdf = ndf) { in ctf_dwarf_free_die()
2660 for (cdv = ctf_list_next(&cup->cu_vars); cdv != NULL; cdv = ndv) { in ctf_dwarf_free_die()
2667 for (cdb = ctf_list_next(&cup->cu_bitfields); cdb != NULL; cdb = ndb) { in ctf_dwarf_free_die()
2672 ctf_dprintf("Trying to clean up dwarf_t: %p\n", cup->cu_dwarf); in ctf_dwarf_free_die()
2673 (void) dwarf_finish(cup->cu_dwarf, &derr); in ctf_dwarf_free_die()
2674 cup->cu_dwarf = NULL; in ctf_dwarf_free_die()
2675 ctf_close(cup->cu_ctfp); in ctf_dwarf_free_die()
2678 while ((map = avl_destroy_nodes(&cup->cu_map, &cookie)) != NULL) { in ctf_dwarf_free_die()
2681 avl_destroy(&cup->cu_map); in ctf_dwarf_free_die()
2682 cup->cu_errbuf = NULL; in ctf_dwarf_free_die()
2734 ctf_dwarf_init_die(int fd, Elf *elf, ctf_cu_t *cup, int ndie, char *errbuf, in ctf_dwarf_init_die() argument
2743 while ((ret = dwarf_next_cu_header(cup->cu_dwarf, &hdrlen, NULL, in ctf_dwarf_init_die()
2760 cup->cu_voidtid = CTF_ERR; in ctf_dwarf_init_die()
2761 cup->cu_longtid = CTF_ERR; in ctf_dwarf_init_die()
2762 cup->cu_elf = elf; in ctf_dwarf_init_die()
2763 cup->cu_maxoff = nexthdr - 1; in ctf_dwarf_init_die()
2764 cup->cu_ctfp = ctf_fdcreate(fd, &ret); in ctf_dwarf_init_die()
2765 if (cup->cu_ctfp == NULL) { in ctf_dwarf_init_die()
2766 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2769 avl_create(&cup->cu_map, ctf_dwmap_comp, sizeof (ctf_dwmap_t), in ctf_dwarf_init_die()
2771 cup->cu_errbuf = errbuf; in ctf_dwarf_init_die()
2772 cup->cu_errlen = errlen; in ctf_dwarf_init_die()
2773 bzero(&cup->cu_vars, sizeof (ctf_list_t)); in ctf_dwarf_init_die()
2774 bzero(&cup->cu_funcs, sizeof (ctf_list_t)); in ctf_dwarf_init_die()
2775 bzero(&cup->cu_bitfields, sizeof (ctf_list_t)); in ctf_dwarf_init_die()
2777 if ((ret = ctf_dwarf_die_elfenc(elf, cup, errbuf, in ctf_dwarf_init_die()
2779 avl_destroy(&cup->cu_map); in ctf_dwarf_init_die()
2780 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2784 if ((ret = ctf_dwarf_sib(cup, NULL, &cu)) != 0) { in ctf_dwarf_init_die()
2785 avl_destroy(&cup->cu_map); in ctf_dwarf_init_die()
2786 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2792 avl_destroy(&cup->cu_map); in ctf_dwarf_init_die()
2793 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2797 if ((ret = ctf_dwarf_child(cup, cu, &child)) != 0) { in ctf_dwarf_init_die()
2798 avl_destroy(&cup->cu_map); in ctf_dwarf_init_die()
2799 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2805 avl_destroy(&cup->cu_map); in ctf_dwarf_init_die()
2806 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2810 cup->cu_cuoff = offset; in ctf_dwarf_init_die()
2811 cup->cu_cu = child; in ctf_dwarf_init_die()
2813 if ((cup->cu_cmh = ctf_merge_init(fd, &ret)) == NULL) { in ctf_dwarf_init_die()
2814 avl_destroy(&cup->cu_map); in ctf_dwarf_init_die()
2815 ctf_free(cup, sizeof (ctf_cu_t)); in ctf_dwarf_init_die()
2819 if (ctf_dwarf_string(cup, cu, DW_AT_name, &name) == 0) { in ctf_dwarf_init_die()
2822 cup->cu_name = strdup(b); in ctf_dwarf_init_die()
2839 ctf_cu_t *cdies = NULL, *cup; in ctf_dwarf_convert() local
2890 cup = &cdies[i]; in ctf_dwarf_convert()
2892 &cup->cu_dwarf, &derr); in ctf_dwarf_convert()
2907 cup->cu_doweaks = ndies > 1 ? B_FALSE : B_TRUE; in ctf_dwarf_convert()
2926 cup = &cdies[i]; in ctf_dwarf_convert()
2927 ctf_dprintf("adding die %s: %p, %x %x\n", cup->cu_name, in ctf_dwarf_convert()
2928 cup->cu_cu, cup->cu_cuoff, cup->cu_maxoff); in ctf_dwarf_convert()
2929 if (workq_add(wqp, cup) == -1) { in ctf_dwarf_convert()
2964 cup = &cdies[i]; in ctf_dwarf_convert()
2965 if ((ret = ctf_merge_add(cmp, cup->cu_ctfp)) != 0) { in ctf_dwarf_convert()