Module Name: src Committed By: christos Date: Fri Mar 18 14:55:34 UTC 2016
Modified Files: src/external/cddl/osnet/dist/tools/ctf/cvt: ctftools.h dwarf.c merge.c traverse.c Log Message: - Add processing for c++ references. - Make sure we load the DIE that contains the types of array elements so we can resolve them later. - Print t_id (die offsets) in hex. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 \ src/external/cddl/osnet/dist/tools/ctf/cvt/ctftools.h cvs rdiff -u -r1.19 -r1.20 src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c cvs rdiff -u -r1.4 -r1.5 src/external/cddl/osnet/dist/tools/ctf/cvt/merge.c \ src/external/cddl/osnet/dist/tools/ctf/cvt/traverse.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/tools/ctf/cvt/ctftools.h diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/ctftools.h:1.5 src/external/cddl/osnet/dist/tools/ctf/cvt/ctftools.h:1.6 --- src/external/cddl/osnet/dist/tools/ctf/cvt/ctftools.h:1.5 Thu Feb 4 12:40:55 2016 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/ctftools.h Fri Mar 18 10:55:34 2016 @@ -137,6 +137,7 @@ typedef enum stabtype { STABTYPE_FIRST, /* do not use */ INTRINSIC, POINTER, + REFERENCE, ARRAY, FUNCTION, STRUCT, Index: src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c:1.19 src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c:1.20 --- src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c:1.19 Tue Mar 1 09:52:14 2016 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c Fri Mar 18 10:55:34 2016 @@ -181,6 +181,7 @@ tdesc_size(tdesc_t *tdp) switch (tdp->t_type) { case INTRINSIC: case POINTER: + case REFERENCE: case ARRAY: case FUNCTION: case STRUCT: @@ -189,6 +190,7 @@ tdesc_size(tdesc_t *tdp) return (tdp->t_size); case FORWARD: + debug(3, "type is forward for %#x\n", tdp->t_id); return (0); case TYPEDEF: @@ -199,10 +201,11 @@ tdesc_size(tdesc_t *tdp) continue; case 0: /* not yet defined */ + debug(3, "type is undefined for %#x\n", tdp->t_id); return (0); default: - terminate("tdp %u: tdesc_size on unknown type %d\n", + terminate("tdp %u: tdesc_size on unknown type %#x\n", tdp->t_id, tdp->t_type); } } @@ -222,9 +225,11 @@ tdesc_bitsize(tdesc_t *tdp) case UNION: case ENUM: case POINTER: + case REFERENCE: return (tdp->t_size * NBBY); case FORWARD: + debug(3, "bitsize is forward for %d\n", tdp->t_id); return (0); case TYPEDEF: @@ -235,6 +240,7 @@ tdesc_bitsize(tdesc_t *tdp) continue; case 0: /* not yet defined */ + debug(3, "bitsize is undefined for %d\n", tdp->t_id); return (0); default: @@ -664,10 +670,12 @@ tdesc_array_create(dwarf_t *dw, Dwarf_Di if ((dim2 = die_sibling(dw, dim)) == NULL) { ctdp = arrtdp; + debug(3, "die %ju: sibling type %#x for dimension\n", + (uintmax_t)die_off(dw, dim), ctdp->t_id); } else if (die_tag(dw, dim2) == DW_TAG_subrange_type) { ctdp = xcalloc(sizeof (tdesc_t)); ctdp->t_id = mfgtid_next(dw); - debug(3, "die %ju: creating new type %u for sub-dimension\n", + debug(3, "die %ju: creating new type %#x for sub-dimension\n", (uintmax_t)die_off(dw, dim2), ctdp->t_id); tdesc_array_create(dw, dim2, arrtdp, ctdp); } else { @@ -706,6 +714,8 @@ tdesc_array_create(dwarf_t *dw, Dwarf_Di */ ar->ad_idxtype = tdesc_intr_long(dw); ar->ad_contents = ctdp; + debug(3, "die %ju: hi mom sibling type %#x for dimension\n", + (uintmax_t)die_off(dw, dim), ctdp->t_id); if (ar->ad_contents->t_size != 0) { dimtdp->t_size = ar->ad_contents->t_size * ar->ad_nelems; @@ -733,6 +743,17 @@ die_array_create(dwarf_t *dw, Dwarf_Die terminate("die %ju: failed to retrieve array bounds\n", (uintmax_t)off); + if (arrtdp->t_type == 0) { + /* + * Add the die that contains the type of the array elements + * to the the ones we process; XXX: no public API for that? + */ + extern Dwarf_Die _dwarf_die_find(Dwarf_Die, Dwarf_Unsigned); + Dwarf_Die elem = _dwarf_die_find(arr, arrtdp->t_id); + if (elem != NULL) + die_create_one(dw, elem); + } + tdesc_array_create(dw, dim, arrtdp, tdp); if (die_unsigned(dw, arr, DW_AT_byte_size, &uval, 0)) { @@ -779,12 +800,13 @@ die_array_resolve(tdesc_t *tdp, tdesc_t if (tdp->t_flags & TDESC_F_RESOLVED) return (1); - debug(3, "trying to resolve array %d (cont %d)\n", tdp->t_id, - tdp->t_ardef->ad_contents->t_id); + debug(3, "trying to resolve array %#x (cont %#x/%zu)\n", tdp->t_id, + tdp->t_ardef->ad_contents->t_id, + tdp->t_ardef->ad_contents->t_size); if ((sz = tdesc_size(tdp->t_ardef->ad_contents)) == 0 && (tdp->t_ardef->ad_contents->t_flags & TDESC_F_RESOLVED) == 0) { - debug(3, "unable to resolve array %s (%d) contents %d\n", + debug(3, "unable to resolve array %s (%#x) contents %#x\n", tdesc_name(tdp), tdp->t_id, tdp->t_ardef->ad_contents->t_id); @@ -795,7 +817,7 @@ die_array_resolve(tdesc_t *tdp, tdesc_t tdp->t_size = sz * tdp->t_ardef->ad_nelems; tdp->t_flags |= TDESC_F_RESOLVED; - debug(3, "resolved array %d: %u bytes\n", tdp->t_id, tdp->t_size); + debug(3, "resolved array %#x: %u bytes\n", tdp->t_id, tdp->t_size); return (1); } @@ -966,9 +988,9 @@ die_sou_create(dwarf_t *dw, Dwarf_Die st tdp->t_type = (die_isdecl(dw, str) ? FORWARD : type); - debug(3, "die %ju: creating %s %s\n", (uintmax_t)off, + debug(3, "die %ju: creating %s %s <%d>\n", (uintmax_t)off, (tdp->t_type == FORWARD ? "forward decl" : typename), - tdesc_name(tdp)); + tdesc_name(tdp), tdp->t_id); if (tdp->t_type == FORWARD) { hash_add(dw->dw_fwdhash, tdp); @@ -1016,7 +1038,7 @@ die_sou_create(dwarf_t *dw, Dwarf_Die st ml->ml_name = NULL; ml->ml_type = die_lookup_pass1(dw, mem, DW_AT_type); - debug(3, "die_sou_create(): ml_type = %p t_id = %d\n", + debug(3, "die_sou_create(): ml_type = %p t_id = %#x\n", ml->ml_type, ml->ml_type->t_id); if (die_mem_offset(dw, mem, DW_AT_data_member_location, @@ -1578,7 +1600,7 @@ die_through_create(dwarf_t *dw, Dwarf_Di tdp->t_tdesc = tdesc_intr_void(dw); } - if (type == POINTER) + if (type == POINTER || type == REFERENCE) tdp->t_size = dw->dw_ptrsz; tdp->t_flags |= TDESC_F_RESOLVED; @@ -1612,6 +1634,12 @@ die_pointer_create(dwarf_t *dw, Dwarf_Di } static void +die_reference_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp) +{ + die_through_create(dw, die, off, tdp, REFERENCE, "reference"); +} + +static void die_restrict_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp) { die_through_create(dw, die, off, tdp, RESTRICT, "restrict"); @@ -1786,6 +1814,7 @@ static const die_creator_t die_creators[ { DW_TAG_enumeration_type, 0, die_enum_create }, { DW_TAG_lexical_block, DW_F_NOTDP, die_lexblk_descend }, { DW_TAG_pointer_type, 0, die_pointer_create }, + { DW_TAG_reference_type, 0, die_reference_create }, { DW_TAG_structure_type, 0, die_struct_create }, { DW_TAG_subroutine_type, 0, die_funcptr_create }, { DW_TAG_typedef, 0, die_typedef_create }, @@ -1861,6 +1890,7 @@ static tdtrav_cb_f die_resolvers[] = { NULL, NULL, /* intrinsic */ NULL, /* pointer */ + NULL, /* reference */ die_array_resolve, /* array */ NULL, /* function */ die_sou_resolve, /* struct */ @@ -1878,6 +1908,7 @@ static tdtrav_cb_f die_fail_reporters[] NULL, NULL, /* intrinsic */ NULL, /* pointer */ + NULL, /* reference */ die_array_failed, /* array */ NULL, /* function */ die_sou_failed, /* struct */ Index: src/external/cddl/osnet/dist/tools/ctf/cvt/merge.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/merge.c:1.4 src/external/cddl/osnet/dist/tools/ctf/cvt/merge.c:1.5 --- src/external/cddl/osnet/dist/tools/ctf/cvt/merge.c:1.4 Thu Mar 27 11:50:48 2014 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/merge.c Fri Mar 18 10:55:34 2016 @@ -543,6 +543,7 @@ static tdtrav_cb_f map_pre[] = { NULL, map_td_tree_pre, /* intrinsic */ map_td_tree_pre, /* pointer */ + map_td_tree_pre, /* reference */ map_td_tree_pre, /* array */ map_td_tree_pre, /* function */ map_td_tree_pre, /* struct */ @@ -560,6 +561,7 @@ static tdtrav_cb_f map_post[] = { NULL, map_td_tree_post, /* intrinsic */ map_td_tree_post, /* pointer */ + map_td_tree_post, /* reference */ map_td_tree_post, /* array */ map_td_tree_post, /* function */ map_td_tree_post, /* struct */ @@ -577,6 +579,7 @@ static tdtrav_cb_f map_self_post[] = { NULL, map_td_tree_self_post, /* intrinsic */ map_td_tree_self_post, /* pointer */ + map_td_tree_self_post, /* reference */ map_td_tree_self_post, /* array */ map_td_tree_self_post, /* function */ map_td_tree_self_post, /* struct */ @@ -893,6 +896,7 @@ static tdtrav_cb_f fwd_redir_cbs[] = { NULL, NULL, /* intrinsic */ NULL, /* pointer */ + NULL, /* reference */ NULL, /* array */ NULL, /* function */ NULL, /* struct */ @@ -1134,6 +1138,7 @@ tdesc_ops_t tdesc_ops[] = { { "ERROR! BAD tdesc TYPE", NULL, NULL }, { "intrinsic", equiv_intrinsic, conjure_intrinsic }, { "pointer", equiv_plain, conjure_plain }, + { "reference", equiv_plain, conjure_plain }, { "array", equiv_array, conjure_array }, { "function", equiv_function, conjure_function }, { "struct", equiv_su, conjure_su }, Index: src/external/cddl/osnet/dist/tools/ctf/cvt/traverse.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/traverse.c:1.4 src/external/cddl/osnet/dist/tools/ctf/cvt/traverse.c:1.5 --- src/external/cddl/osnet/dist/tools/ctf/cvt/traverse.c:1.4 Sun Mar 9 13:04:00 2014 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/traverse.c Fri Mar 18 10:55:34 2016 @@ -119,6 +119,7 @@ static tdtrav_cb_f tdnops[] = { NULL, NULL, /* intrinsic */ NULL, /* pointer */ + NULL, /* reference */ NULL, /* array */ NULL, /* function */ NULL, /* struct */ @@ -136,6 +137,7 @@ static int (*tddescenders[])(tdesc_t *, NULL, NULL, /* intrinsic */ tdtrav_plain, /* pointer */ + tdtrav_plain, /* reference */ tdtrav_array, /* array */ tdtrav_func, /* function */ tdtrav_su, /* struct */