Lines Matching defs:dw

150 mfgtid_next(dwarf_t *dw)
152 return (++dw->dw_mfgtid_last);
156 tdesc_add(dwarf_t *dw, tdesc_t *tdp)
158 hash_add(dw->dw_tidhash, tdp);
162 tdesc_lookup(dwarf_t *dw, int tid)
168 if (hash_find(dw->dw_tidhash, &tmpl, (void **)&tdp))
268 die_off(dwarf_t *dw, Dwarf_Die die)
272 if (dwarf_dieoffset(die, &off, &dw->dw_err) == DW_DLV_OK)
276 dwarf_errmsg(dw->dw_err));
282 die_sibling(dwarf_t *dw, Dwarf_Die die)
287 if ((rc = dwarf_siblingof(dw->dw_dw, die, &sib, &dw->dw_err)) ==
294 die_off(dw, die), dwarf_errmsg(dw->dw_err));
300 die_child(dwarf_t *dw, Dwarf_Die die)
305 if ((rc = dwarf_child(die, &child, &dw->dw_err)) == DW_DLV_OK)
311 die_off(dw, die), dwarf_errmsg(dw->dw_err));
317 die_tag(dwarf_t *dw, Dwarf_Die die)
321 if (dwarf_tag(die, &tag, &dw->dw_err) == DW_DLV_OK)
325 die_off(dw, die), dwarf_errmsg(dw->dw_err));
331 die_attr(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, int req)
336 if ((rc = dwarf_attr(die, name, &attr, &dw->dw_err)) == DW_DLV_OK) {
340 terminate("die %llu: no attr 0x%x\n", die_off(dw, die),
348 die_off(dw, die), dwarf_errmsg(dw->dw_err));
354 die_attr_form(dwarf_t *dw, Dwarf_Attribute attr)
358 if (dwarf_whatform(attr, &form, &dw->dw_err) == DW_DLV_OK)
362 dwarf_errmsg(dw->dw_err));
378 * dw - the dwarf object to look in
399 die_signed(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Signed *valp,
405 if ((attr = die_attr(dw, die, name, req)) == NULL)
408 if (dwarf_formsdata(attr, &val, &dw->dw_err) != DW_DLV_OK) {
413 die_off(dw, die), die_attr_form(dw, attr));
416 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
423 die_unsigned(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Unsigned *valp,
429 if ((attr = die_attr(dw, die, name, req)) == NULL)
432 if (dwarf_formudata(attr, &val, &dw->dw_err) != DW_DLV_OK) {
437 die_off(dw, die), die_attr_form(dw, attr));
440 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
447 die_bool(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Bool *valp, int req)
452 if ((attr = die_attr(dw, die, name, req)) == NULL)
455 if (dwarf_formflag(attr, &val, &dw->dw_err) != DW_DLV_OK) {
460 die_off(dw, die), die_attr_form(dw, attr));
463 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
470 die_string(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, char **strp, int req)
475 if ((attr = die_attr(dw, die, name, req)) == NULL)
478 if (dwarf_formstring(attr, &str, &dw->dw_err) != DW_DLV_OK) {
483 die_off(dw, die), die_attr_form(dw, attr));
487 dwarf_dealloc(dw->dw_dw, str, DW_DLA_STRING);
493 die_attr_ref(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name)
498 attr = die_attr(dw, die, name, DW_ATTR_REQ);
500 if (dwarf_formref(attr, &off, &dw->dw_err) != DW_DLV_OK) {
502 die_off(dw, die), die_attr_form(dw, attr));
505 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
511 die_name(dwarf_t *dw, Dwarf_Die die)
515 (void) die_string(dw, die, DW_AT_name, &str, 0);
521 die_isdecl(dwarf_t *dw, Dwarf_Die die)
525 return (die_bool(dw, die, DW_AT_declaration, &val, 0) && val);
529 die_isglobal(dwarf_t *dw, Dwarf_Die die)
538 if (die_signed(dw, die, DW_AT_visibility, &vis, 0))
541 return (die_bool(dw, die, DW_AT_external, &ext, 0) && ext);
545 die_add(dwarf_t *dw, Dwarf_Off off)
551 tdesc_add(dw, tdp);
557 die_lookup_pass1(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name)
559 Dwarf_Off ref = die_attr_ref(dw, die, name);
562 if ((tdp = tdesc_lookup(dw, ref)) != NULL)
565 return (die_add(dw, ref));
569 die_mem_offset(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name,
576 if ((attr = die_attr(dw, die, name, req)) == NULL)
579 if (dwarf_loclist(attr, &loc, &locnum, &dw->dw_err) != DW_DLV_OK) {
581 die_off(dw, die));
584 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
588 die_off(dw, die));
593 dwarf_dealloc(dw->dw_dw, loc->ld_s, DW_DLA_LOC_BLOCK);
594 dwarf_dealloc(dw->dw_dw, loc, DW_DLA_LOCDESC);
600 tdesc_intr_common(dwarf_t *dw, int tid, const char *name, size_t sz)
618 tdesc_add(dw, tdp);
633 tdesc_intr_void(dwarf_t *dw)
635 if (dw->dw_void == NULL)
636 dw->dw_void = tdesc_intr_common(dw, TID_VOID, "void", 0);
638 return (dw->dw_void);
642 tdesc_intr_long(dwarf_t *dw)
644 if (dw->dw_long == NULL) {
645 dw->dw_long = tdesc_intr_common(dw, TID_LONG, "long",
646 dw->dw_ptrsz);
649 return (dw->dw_long);
658 tdesc_intr_clone(dwarf_t *dw, tdesc_t *old, size_t bitsz)
669 new->t_id = mfgtid_next(dw);
677 tdesc_add(dw, new);
683 tdesc_array_create(dwarf_t *dw, Dwarf_Die dim, tdesc_t *arrtdp,
692 if ((dim2 = die_sibling(dw, dim)) == NULL) {
694 } else if (die_tag(dw, dim2) == DW_TAG_subrange_type) {
696 ctdp->t_id = mfgtid_next(dw);
698 die_off(dw, dim2), ctdp->t_id);
699 tdesc_array_create(dw, dim2, arrtdp, ctdp);
702 die_off(dw, dim2));
719 if (die_unsigned(dw, dim, DW_AT_upper_bound, &uval, 0))
721 else if (die_signed(dw, dim, DW_AT_upper_bound, &sval, 0))
730 ar->ad_idxtype = tdesc_intr_long(dw);
745 die_array_create(dwarf_t *dw, Dwarf_Die arr, Dwarf_Off off, tdesc_t *tdp)
747 tdesc_t *arrtdp = die_lookup_pass1(dw, arr, DW_AT_type);
753 if ((dim = die_child(dw, arr)) == NULL ||
754 die_tag(dw, dim) != DW_TAG_subrange_type)
757 tdesc_array_create(dw, dim, arrtdp, tdp);
759 if (die_unsigned(dw, arr, DW_AT_byte_size, &uval, 0)) {
790 dwarf_t *dw = private;
804 dw->dw_nunres++;
838 die_enum_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
848 (void) die_unsigned(dw, die, DW_AT_byte_size, &uval, DW_ATTR_REQ);
851 if ((mem = die_child(dw, die)) != NULL) {
857 if (die_tag(dw, mem) != DW_TAG_enumerator) {
859 die_create_one(dw, mem);
864 el->el_name = die_name(dw, mem);
866 if (die_signed(dw, mem, DW_AT_const_value, &sval, 0)) {
868 } else if (die_unsigned(dw, mem, DW_AT_const_value,
873 "value\n", off, die_off(dw, mem));
877 die_off(dw, mem), el->el_name, el->el_number);
882 } while ((mem = die_sibling(dw, mem)) != NULL);
884 hash_add(dw->dw_enumhash, tdp);
894 iidesc_add(dw->dw_td->td_iihash, ii);
916 dwarf_t *dw = private;
922 (void) hash_find_iter(dw->dw_enumhash, tdp, die_enum_match, &full);
959 die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
967 tdp->t_type = (die_isdecl(dw, str) ? FORWARD : type);
974 hash_add(dw->dw_fwdhash, tdp);
978 (void) hash_find_iter(dw->dw_fwdhash, tdp, die_fwd_map, tdp);
980 (void) die_unsigned(dw, str, DW_AT_byte_size, &sz, DW_ATTR_REQ);
986 if ((mem = die_child(dw, str)) == NULL)
992 Dwarf_Off memoff = die_off(dw, mem);
993 Dwarf_Half tag = die_tag(dw, mem);
998 die_create_one(dw, mem);
1013 if ((ml->ml_name = die_name(dw, mem)) == NULL)
1016 ml->ml_type = die_lookup_pass1(dw, mem, DW_AT_type);
1018 if (die_mem_offset(dw, mem, DW_AT_data_member_location,
1025 if (die_unsigned(dw, mem, DW_AT_bit_size, &bitsz, 0))
1030 if (die_unsigned(dw, mem, DW_AT_bit_offset, &bitoff, 0)) {
1044 } while ((mem = die_sibling(dw, mem)) != NULL);
1087 iidesc_add(dw->dw_td->td_iihash, ii);
1092 die_struct_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1094 die_sou_create(dw, die, off, tdp, STRUCT, "struct");
1098 die_union_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1100 die_sou_create(dw, die, off, tdp, UNION, "union");
1107 dwarf_t *dw = private;
1132 dw->dw_nunres++;
1137 dw->dw_nunres++;
1153 ml->ml_type = tdesc_intr_clone(dw, mt, ml->ml_size);
1185 die_funcptr_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1199 for (arg = die_child(dw, die); arg != NULL;
1200 arg = die_sibling(dw, arg)) {
1201 if ((tag = die_tag(dw, arg)) != DW_TAG_formal_parameter &&
1204 die_create_one(dw, arg);
1208 if (die_isdecl(dw, die)) {
1222 if ((attr = die_attr(dw, die, DW_AT_type, 0)) != NULL) {
1223 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
1224 fn->fn_ret = die_lookup_pass1(dw, die, DW_AT_type);
1226 fn->fn_ret = tdesc_intr_void(dw);
1232 for (fn->fn_nargs = 0, arg = die_child(dw, die); arg != NULL;
1233 arg = die_sibling(dw, arg)) {
1234 if ((tag = die_tag(dw, arg)) == DW_TAG_formal_parameter)
1246 for (i = 0, arg = die_child(dw, die);
1248 arg = die_sibling(dw, arg)) {
1249 if (die_tag(dw, arg) != DW_TAG_formal_parameter)
1252 fn->fn_args[i++] = die_lookup_pass1(dw, arg,
1360 die_base_type2enc(dwarf_t *dw, Dwarf_Off off, Dwarf_Signed enc, size_t sz)
1363 uint_t szidx = dw->dw_ptrsz == sizeof (uint64_t);
1385 die_base_from_dwarf(dwarf_t *dw, Dwarf_Die base, Dwarf_Off off, size_t sz)
1390 (void) die_signed(dw, base, DW_AT_encoding, &enc, DW_ATTR_REQ);
1422 intr->intr_fformat = die_base_type2enc(dw, off, enc, sz);
1433 die_base_create(dwarf_t *dw, Dwarf_Die base, Dwarf_Off off, tdesc_t *tdp)
1450 (void) die_unsigned(dw, base, DW_AT_byte_size, &sz, DW_ATTR_REQ);
1471 intr = die_base_from_dwarf(dw, base, off, sz);
1484 die_through_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp,
1493 if ((attr = die_attr(dw, die, DW_AT_type, 0)) != NULL) {
1494 dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
1495 tdp->t_tdesc = die_lookup_pass1(dw, die, DW_AT_type);
1497 tdp->t_tdesc = tdesc_intr_void(dw);
1501 tdp->t_size = dw->dw_ptrsz;
1511 iidesc_add(dw->dw_td->td_iihash, ii);
1516 die_typedef_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1518 die_through_create(dw, die, off, tdp, TYPEDEF, "typedef");
1522 die_const_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1524 die_through_create(dw, die, off, tdp, CONST, "const");
1528 die_pointer_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1530 die_through_create(dw, die, off, tdp, POINTER, "pointer");
1534 die_restrict_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1536 die_through_create(dw, die, off, tdp, RESTRICT, "restrict");
1540 die_volatile_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1542 die_through_create(dw, die, off, tdp, VOLATILE, "volatile");
1547 die_function_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1560 for (arg = die_child(dw, die); arg != NULL;
1561 arg = die_sibling(dw, arg)) {
1562 if ((tag = die_tag(dw, arg)) != DW_TAG_formal_parameter &&
1565 die_create_one(dw, arg);
1569 if (die_isdecl(dw, die) || (name = die_name(dw, die)) == NULL) {
1578 ii->ii_type = die_isglobal(dw, die) ? II_GFUN : II_SFUN;
1581 ii->ii_owner = xstrdup(dw->dw_cuname);
1586 if (die_attr(dw, die, DW_AT_type, 0) != NULL)
1587 ii->ii_dtype = die_lookup_pass1(dw, die, DW_AT_type);
1589 ii->ii_dtype = tdesc_intr_void(dw);
1591 for (arg = die_child(dw, die); arg != NULL;
1592 arg = die_sibling(dw, arg)) {
1596 off, die_off(dw, die));
1598 if (die_tag(dw, arg) != DW_TAG_formal_parameter)
1601 if ((name = die_name(dw, arg)) == NULL) {
1623 for (arg = die_child(dw, die), i = 0;
1625 arg = die_sibling(dw, arg)) {
1626 if (die_tag(dw, arg) != DW_TAG_formal_parameter)
1629 ii->ii_args[i++] = die_lookup_pass1(dw, arg,
1634 iidesc_add(dw->dw_td->td_iihash, ii);
1639 die_variable_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1646 if (die_isdecl(dw, die) || (name = die_name(dw, die)) == NULL)
1650 ii->ii_type = die_isglobal(dw, die) ? II_GVAR : II_SVAR;
1652 ii->ii_dtype = die_lookup_pass1(dw, die, DW_AT_type);
1654 ii->ii_owner = xstrdup(dw->dw_cuname);
1656 iidesc_add(dw->dw_td->td_iihash, ii);
1679 die_lexblk_descend(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
1681 Dwarf_Die child = die_child(dw, die);
1684 die_create(dw, child);
1734 die_create_one(dwarf_t *dw, Dwarf_Die die)
1736 Dwarf_Off off = die_off(dw, die);
1743 if (off > dw->dw_maxoff) {
1745 dw->dw_maxoff);
1748 tag = die_tag(dw, die);
1755 if ((tdp = tdesc_lookup(dw, off)) == NULL &&
1759 tdesc_add(dw, tdp);
1763 tdp->t_name = die_name(dw, die);
1765 dc->dc_create(dw, die, off, tdp);
1769 die_create(dwarf_t *dw, Dwarf_Die die)
1772 die_create_one(dw, die);
1773 } while ((die = die_sibling(dw, die)) != NULL);
1811 die_resolve(dwarf_t *dw)
1818 dw->dw_nunres = 0;
1820 (void) iitraverse_hash(dw->dw_td->td_iihash,
1821 &dw->dw_td->td_curvgen, NULL, NULL, die_resolvers, dw);
1823 debug(3, "resolve: pass %d, %u left\n", pass, dw->dw_nunres);
1825 if (dw->dw_nunres == last) {
1829 (void) iitraverse_hash(dw->dw_td->td_iihash,
1830 &dw->dw_td->td_curvgen, NULL, NULL,
1831 die_fail_reporters, dw);
1836 last = dw->dw_nunres;
1838 } while (dw->dw_nunres != 0);
1901 dwarf_t dw;
1905 bzero(&dw, sizeof (dwarf_t));
1906 dw.dw_td = td;
1907 dw.dw_ptrsz = elf_ptrsz(elf);
1908 dw.dw_mfgtid_last = TID_MFGTID_BASE;
1909 dw.dw_tidhash = hash_new(TDESC_HASH_BUCKETS, tdesc_idhash, tdesc_idcmp);
1910 dw.dw_fwdhash = hash_new(TDESC_HASH_BUCKETS, tdesc_namehash,
1912 dw.dw_enumhash = hash_new(TDESC_HASH_BUCKETS, tdesc_namehash,
1915 if ((rc = dwarf_elf_init(elf, DW_DLC_READ, NULL, NULL, &dw.dw_dw,
1916 &dw.dw_err)) == DW_DLV_NO_ENTRY) {
1924 if (dwarf_errno(dw.dw_err) == DW_DLE_DEBUG_INFO_NULL) {
1933 dwarf_errmsg(dw.dw_err));
1936 if ((rc = dwarf_next_cu_header(dw.dw_dw, &hdrlen, &vers, &abboff,
1937 &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_OK)
1939 dwarf_errmsg(dw.dw_err));
1945 if ((cu = die_sibling(&dw, NULL)) == NULL ||
1946 ((child = die_child(&dw, cu)) == NULL) &&
1954 dw.dw_maxoff = nxthdr - 1;
1956 if (dw.dw_maxoff > TID_FILEMAX)
1965 if (die_string(&dw, cu, DW_AT_producer, &prod, 0)) {
1970 if ((dw.dw_cuname = die_name(&dw, cu)) != NULL) {
1971 char *base = xstrdup(basename(dw.dw_cuname));
1972 free(dw.dw_cuname);
1973 dw.dw_cuname = base;
1975 debug(1, "CU name: %s\n", dw.dw_cuname);
1978 die_create(&dw, child);
1980 if ((rc = dwarf_next_cu_header(dw.dw_dw, &hdrlen, &vers, &abboff,
1981 &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_NO_ENTRY)
1984 (void) dwarf_finish(dw.dw_dw, &dw.dw_err);
1986 die_resolve(&dw);
1988 cvt_fixups(td, dw.dw_ptrsz);