static Dwarf_Die find_cu_die(Dwarf_Debug dbg, Dwarf_Addr pc) { Dwarf_Error de = {0}; Dwarf_Die cu_die = NULL; Dwarf_Arange *arlist; Dwarf_Signed arcnt; Dwarf_Arange ar; Dwarf_Off die_offs; if (dwarf_get_aranges(dbg, &arlist, &arcnt, &de) != DW_DLV_OK || dwarf_get_arange(arlist, arcnt, pc, &ar, &de) != DW_DLV_OK || dwarf_get_cu_die_offset(ar, &die_offs, &de) != DW_DLV_OK || dwarf_offdie(dbg, die_offs, &cu_die, &de) != DW_DLV_OK) { NOTIFY_DWARF(de); /* Try to find it by walking all CU's and looking at their lowpc+highpc * entries, which should work if each has a single contiguous * range. Note that Cygwin and MinGW gcc don't seen to include * lowpc+highpc in their CU's. */ cu_die = find_cu_die_via_iter(dbg, pc); } return cu_die; }
static void tp_dwarf_arange(void) { Dwarf_Debug dbg; Dwarf_Arange *aranges; Dwarf_Arange arange; Dwarf_Signed arange_cnt; Dwarf_Off cu_die_offset, cu_die_offset2, cu_header_offset; Dwarf_Addr start; Dwarf_Unsigned length; Dwarf_Error de; int fd, i, r_aranges, r_arange; result = TET_UNRESOLVED; TS_DWARF_INIT(dbg, fd, de); r_aranges = dwarf_get_aranges(dbg, &aranges, &arange_cnt, &de); TS_CHECK_INT(r_aranges); if (r_aranges == DW_DLV_ERROR) { tet_printf("dwarf_get_aranges failed: %s\n", dwarf_errmsg(de)); result = TET_FAIL; goto done; } if (r_aranges == DW_DLV_OK) { for (i = 0; i < arange_cnt; i++) { if (dwarf_get_cu_die_offset(aranges[i], &cu_die_offset, &de) != DW_DLV_OK) { tet_printf("dwarf_get_cu_die_offset failed:" " %s\n", dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_INT(cu_die_offset); if (dwarf_get_arange_cu_header_offset(aranges[i], &cu_header_offset, &de) != DW_DLV_OK) { tet_printf("dwarf_get_arange_cu_header_offset" "failed: %s\n", dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_INT(cu_header_offset); if (dwarf_get_arange_info(aranges[i], &start, &length, &cu_die_offset2, &de) != DW_DLV_OK) { tet_printf("dwarf_get_arange_info failed:%s\n", dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_UINT(start); TS_CHECK_UINT(length); TS_CHECK_UINT(cu_die_offset2); r_arange = dwarf_get_arange(aranges, arange_cnt, start, &arange, &de); TS_CHECK_INT(r_arange); r_arange = dwarf_get_arange(aranges, arange_cnt, start + 1, &arange, &de); TS_CHECK_INT(r_arange); r_arange = dwarf_get_arange(aranges, arange_cnt, start + length, &arange, &de); TS_CHECK_INT(r_arange); r_arange = dwarf_get_arange(aranges, arange_cnt, start + length + 1, &arange, &de); TS_CHECK_INT(r_arange); r_arange = dwarf_get_arange(aranges, arange_cnt, start + length - 1, &arange, &de); TS_CHECK_INT(r_arange); } } if (result == TET_UNRESOLVED) result = TET_PASS; done: TS_DWARF_FINISH(dbg, de); TS_RESULT(result); }