static void tp_dwarf_next_cu_header(void) { Dwarf_Debug dbg; Dwarf_Error de; Dwarf_Unsigned cu_header_length; Dwarf_Half cu_version; Dwarf_Off cu_abbrev_offset; Dwarf_Half cu_pointer_size; Dwarf_Unsigned cu_next_offset; int fd, result; result = TET_UNRESOLVED; TS_DWARF_INIT(dbg, fd, de); while (dwarf_next_cu_header(dbg, &cu_header_length, &cu_version, &cu_abbrev_offset, &cu_pointer_size, &cu_next_offset, &de) == DW_DLV_OK) { TS_CHECK_UINT(cu_header_length); TS_CHECK_UINT(cu_version); TS_CHECK_INT(cu_abbrev_offset); TS_CHECK_UINT(cu_pointer_size); TS_CHECK_UINT(cu_next_offset); } if (result == TET_UNRESOLVED) result = TET_PASS; done: TS_DWARF_FINISH(dbg, de); TS_RESULT(result); }
static void tp_dwarf_ranges(void) { Dwarf_Debug dbg; Dwarf_Ranges *ranges; Dwarf_Signed range_cnt; Dwarf_Unsigned byte_cnt; Dwarf_Off off; Dwarf_Error de; int fd, r_ranges, i; result = TET_UNRESOLVED; TS_DWARF_INIT(dbg, fd, de); off = 0; for (;;) { tet_printf("check ranges at offset(%ju):\n", (uintmax_t) off); r_ranges = dwarf_get_ranges_a(dbg, off, NULL, &ranges, &range_cnt, &byte_cnt, &de); if (r_ranges != DW_DLV_OK) break; TS_CHECK_INT(range_cnt); TS_CHECK_UINT(byte_cnt); off += byte_cnt; for (i = 0; i < range_cnt; i++) { tet_printf("check range %d:\n", i); TS_CHECK_INT(ranges[i].dwr_type); TS_CHECK_UINT(ranges[i].dwr_addr1); TS_CHECK_UINT(ranges[i].dwr_addr2); } } /* * SGI libdwarf return DW_DLV_ERROR when provided offset is out of * range, instead of DW_DLV_NO_ENTRY as stated in the SGI libdwarf * documentation. elftoolchain libdwarf follows the SGI libdwarf * documentation. */ #if 0 if (r_ranges == DW_DLV_ERROR) { tet_printf("dwarf_get_ranges failed: %s\n", dwarf_errmsg(de)); result = TET_FAIL; } #endif if (result == TET_UNRESOLVED) result = TET_PASS; done: TS_DWARF_FINISH(dbg, de); TS_RESULT(result); }
static void tp_dwarf_get_address_size(void) { Dwarf_Debug dbg; Dwarf_Error de; Dwarf_Half addr_size; int fd, result; dbg = NULL; result = TET_UNRESOLVED; if (dwarf_get_address_size(NULL, &addr_size, &de) != DW_DLV_ERROR) { tet_infoline("dwarf_get_adderss_size NULL 'dbg' test failed"); result = TET_FAIL; goto done; } TS_DWARF_INIT(dbg, fd, de); if (dwarf_get_address_size(dbg, NULL, &de) != DW_DLV_ERROR) { tet_infoline("dwarf_get_adderss_size NULL 'addr_size' test " "failed"); result = TET_FAIL; goto done; } if (dwarf_get_address_size(dbg, &addr_size, &de) != DW_DLV_OK) { tet_printf("dwarf_get_address_size failed: %s", dwarf_errmsg(de)); result = TET_FAIL; goto done; } TS_CHECK_UINT(addr_size); if (result == TET_UNRESOLVED) result = TET_PASS; done: TS_DWARF_FINISH(dbg, de); TS_RESULT(result); }
static void _dwarf_lineno(Dwarf_Die die) { Dwarf_Line *linebuf, ln; Dwarf_Signed linecount, lineoff; Dwarf_Unsigned lineno, srcfileno; Dwarf_Addr lineaddr; Dwarf_Half tag; Dwarf_Error de; Dwarf_Bool linebeginstatement, lineendsequence, lineblock; char *linesrc; int r_srclines; int i; if (dwarf_tag(die, &tag, &de) != DW_DLV_OK) { tet_printf("dwarf_tag failed: %s\n", dwarf_errmsg(de)); result = TET_FAIL; return; } r_srclines = dwarf_srclines(die, &linebuf, &linecount, &de); TS_CHECK_INT(r_srclines); if (r_srclines == DW_DLV_ERROR) { tet_printf("dwarf_srclines should not fail but still failed:", " %s", dwarf_errmsg(de)); return; } if (r_srclines != DW_DLV_OK) return; for (i = 0; i < linecount; i++) { ln = linebuf[i]; if (dwarf_linebeginstatement(ln, &linebeginstatement, &de) != DW_DLV_OK) { tet_printf("dwarf_linebeginstatement failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_INT(linebeginstatement); if (dwarf_linebeginstatement(ln, &linebeginstatement, &de) != DW_DLV_OK) { tet_printf("dwarf_linebeginstatement failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_INT(linebeginstatement); if (dwarf_lineendsequence(ln, &lineendsequence, &de) != DW_DLV_OK) { tet_printf("dwarf_lineendsequence failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_INT(lineendsequence); if (dwarf_lineno(ln, &lineno, &de) != DW_DLV_OK) { tet_printf("dwarf_lineno failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_UINT(lineno); if (dwarf_line_srcfileno(ln, &srcfileno, &de) != DW_DLV_OK) { tet_printf("dwarf_line_srcfileno failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_UINT(srcfileno); if (dwarf_lineaddr(ln, &lineaddr, &de) != DW_DLV_OK) { tet_printf("dwarf_lineaddr failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_UINT(lineaddr); if (dwarf_lineoff(ln, &lineoff, &de) != DW_DLV_OK) { tet_printf("dwarf_lineoff failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_INT(lineoff); if (dwarf_linesrc(ln, &linesrc, &de) != DW_DLV_OK) { tet_printf("dwarf_linesrc failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_STRING(linesrc); if (dwarf_lineblock(ln, &lineblock, &de) != DW_DLV_OK) { tet_printf("dwarf_lineblock failed: %s", dwarf_errmsg(de)); result = TET_FAIL; } TS_CHECK_INT(lineblock); } }
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); }
static void _frame2_test(Dwarf_Debug dbg, Dwarf_Fde fde, Dwarf_Addr pc, Dwarf_Unsigned func_len, Dwarf_Unsigned caf) { Dwarf_Signed offset_relevant, register_num, offset; Dwarf_Addr pc_end, row_pc; Dwarf_Regtable reg_table; Dwarf_Error de; int i, cnt; (void) dwarf_set_frame_cfa_value(dbg, DW_FRAME_CFA_COL); /* Sanity check for invalid table_column. */ if (dwarf_get_fde_info_for_reg(fde, 9999, 0, &offset_relevant, ®ister_num, &offset, &row_pc, &de) != DW_DLV_ERROR) { tet_infoline("dwarf_get_fde_info_for_reg didn't return" " DW_DLV_ERROR when called with invalid table_column" " value"); result = TET_FAIL; return; } cnt = 0; pc_end = pc + func_len; while (pc < pc_end && cnt < 16) { tet_printf("query CFA register pc %#jx\n", (uintmax_t) pc); /* * XXX If application want to use DW_FRAME_CFA_COL for CFA, * it should call dwarf_set_frame_cfa_value() to set that * explicitly. So here DW_FRAME_CFA_COL might not be refering * to the CFA at all, depends on whether CFA(0) is set by * dwarf_set_frame_cfa_value. */ if (dwarf_get_fde_info_for_reg(fde, DW_FRAME_CFA_COL, pc, &offset_relevant, ®ister_num, &offset, &row_pc, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_info_for_reg(cfa) failed: %s", dwarf_errmsg(de)); result = TET_FAIL; return; } TS_CHECK_INT(offset_relevant); TS_CHECK_INT(offset); TS_CHECK_INT(register_num); TS_CHECK_UINT(row_pc); for (i = 1; i < _MAX_REG_NUM; i++) { tet_printf("query register %d\n", i); if (dwarf_get_fde_info_for_reg(fde, i, pc, &offset_relevant, ®ister_num, &offset, &row_pc, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_info_for_reg(%d)" " failed: %s", i, dwarf_errmsg(de)); result = TET_FAIL; goto next; } TS_CHECK_INT(offset_relevant); TS_CHECK_INT(offset); TS_CHECK_INT(register_num); TS_CHECK_UINT(row_pc); } tet_infoline("query all register"); if (dwarf_get_fde_info_for_all_regs(fde, pc, ®_table, &row_pc, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_info_for_all_regs failed: %s", dwarf_errmsg(de)); result = TET_FAIL; goto next; } TS_CHECK_UINT(row_pc); for (i = 0; i < _MAX_REG_NUM; i++) { tet_printf("check reg_table[%d]\n", i); TS_CHECK_UINT(reg_table.rules[i].dw_offset_relevant); TS_CHECK_UINT(reg_table.rules[i].dw_regnum); TS_CHECK_UINT(reg_table.rules[i].dw_offset); } next: pc += caf; cnt++; } }
static void _dwarf_cie_fde_test(Dwarf_Debug dbg, int eh, void (*_frame_test)(Dwarf_Debug, Dwarf_Fde, Dwarf_Addr, Dwarf_Unsigned, Dwarf_Unsigned)) { Dwarf_Cie *cielist, cie; Dwarf_Fde *fdelist, fde; Dwarf_Frame_Op *oplist; Dwarf_Signed ciecnt, fdecnt; Dwarf_Addr low_pc, high_pc; Dwarf_Unsigned func_len, fde_byte_len, fde_inst_len, bytes_in_cie; Dwarf_Unsigned cie_caf, cie_daf, cie_inst_len; Dwarf_Signed cie_index, opcnt; Dwarf_Off cie_offset, fde_offset; Dwarf_Ptr fde_bytes, fde_inst, cie_initinst; Dwarf_Half cie_ra; Dwarf_Small cie_version; Dwarf_Error de; const char *cfa_str; char *cie_augmenter; int i, j, r_fde_at_pc; if (eh) { if (dwarf_get_fde_list_eh(dbg, &cielist, &ciecnt, &fdelist, &fdecnt, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_list_eh failed: %s\n", dwarf_errmsg(de)); result = TET_FAIL; goto done; } } else { if (dwarf_get_fde_list(dbg, &cielist, &ciecnt, &fdelist, &fdecnt, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_list failed: %s\n", dwarf_errmsg(de)); result = TET_FAIL; goto done; } } TS_CHECK_INT(ciecnt); TS_CHECK_INT(fdecnt); /* * Test dwarf_get_fde_at_pc using hard-coded PC values. */ tet_infoline("attempt to get fde at 0x08082a30"); r_fde_at_pc = dwarf_get_fde_at_pc(fdelist, 0x08082a30, &fde, &low_pc, &high_pc, &de); TS_CHECK_INT(r_fde_at_pc); if (r_fde_at_pc == DW_DLV_OK) { TS_CHECK_UINT(low_pc); TS_CHECK_UINT(high_pc); } tet_infoline("attempt to get fde at 0x08083087"); r_fde_at_pc = dwarf_get_fde_at_pc(fdelist, 0x08083087, &fde, &low_pc, &high_pc, &de); TS_CHECK_INT(r_fde_at_pc); if (r_fde_at_pc == DW_DLV_OK) { TS_CHECK_UINT(low_pc); TS_CHECK_UINT(high_pc); } tet_infoline("attempt to get fde at 0x080481f0"); r_fde_at_pc = dwarf_get_fde_at_pc(fdelist, 0x080481f0, &fde, &low_pc, &high_pc, &de); TS_CHECK_INT(r_fde_at_pc); if (r_fde_at_pc == DW_DLV_OK) { TS_CHECK_UINT(low_pc); TS_CHECK_UINT(high_pc); } tet_infoline("attempt to get fde at 0x08048564"); r_fde_at_pc = dwarf_get_fde_at_pc(fdelist, 0x08048564, &fde, &low_pc, &high_pc, &de); TS_CHECK_INT(r_fde_at_pc); if (r_fde_at_pc == DW_DLV_OK) { TS_CHECK_UINT(low_pc); TS_CHECK_UINT(high_pc); } tet_infoline("attempt to get fde at 0x00401280"); r_fde_at_pc = dwarf_get_fde_at_pc(fdelist, 0x00401280, &fde, &low_pc, &high_pc, &de); TS_CHECK_INT(r_fde_at_pc); if (r_fde_at_pc == DW_DLV_OK) { TS_CHECK_UINT(low_pc); TS_CHECK_UINT(high_pc); } tet_infoline("attempt to get fde at 0x004012b1"); r_fde_at_pc = dwarf_get_fde_at_pc(fdelist, 0x004012b1, &fde, &low_pc, &high_pc, &de); TS_CHECK_INT(r_fde_at_pc); if (r_fde_at_pc == DW_DLV_OK) { TS_CHECK_UINT(low_pc); TS_CHECK_UINT(high_pc); } /* * Test each FDE contained in the FDE list. */ for (i = 0; i < fdecnt; i++) { if (dwarf_get_fde_n(fdelist, i, &fde, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_n(%d) failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } if (dwarf_get_fde_range(fde, &low_pc, &func_len, &fde_bytes, &fde_byte_len, &cie_offset, &cie_index, &fde_offset, &de) == DW_DLV_ERROR) { tet_printf("dwarf_get_fde_range(%d) failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_UINT(low_pc); TS_CHECK_UINT(func_len); TS_CHECK_UINT(fde_byte_len); if (fde_byte_len > 0) TS_CHECK_BLOCK(fde_bytes, fde_byte_len); TS_CHECK_INT(cie_offset); TS_CHECK_INT(cie_index); TS_CHECK_INT(fde_offset); if (dwarf_get_cie_of_fde(fde, &cie, &de) != DW_DLV_OK) { tet_printf("dwarf_get_cie_of_fde(%d) failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } if (dwarf_get_cie_index(cie, &cie_index, &de) != DW_DLV_OK) { tet_printf("dwarf_get_cie_index(%d) failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_INT(cie_index); if (dwarf_get_cie_info(cie, &bytes_in_cie, &cie_version, &cie_augmenter, &cie_caf, &cie_daf, &cie_ra, &cie_initinst, &cie_inst_len, &de) != DW_DLV_OK) { tet_printf("dwarf_get_cie_info(%d) failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_UINT(bytes_in_cie); TS_CHECK_UINT(cie_version); TS_CHECK_STRING(cie_augmenter); TS_CHECK_UINT(cie_caf); TS_CHECK_UINT(cie_daf); TS_CHECK_UINT(cie_ra); TS_CHECK_UINT(cie_inst_len); if (cie_inst_len > 0) TS_CHECK_BLOCK(cie_initinst, cie_inst_len); if (dwarf_get_fde_instr_bytes(fde, &fde_inst, &fde_inst_len, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_instr_bytes(%d) failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_UINT(fde_inst_len); if (fde_inst_len > 0) { TS_CHECK_BLOCK(fde_inst, fde_inst_len); if (dwarf_expand_frame_instructions(cie, fde_inst, fde_inst_len, &oplist, &opcnt, &de) != DW_DLV_OK) { tet_printf("dwarf_expand_frame_instructions(%d)" " failed: %s\n", i, dwarf_errmsg(de)); result = TET_FAIL; continue; } TS_CHECK_INT(opcnt); for (j = 0; j < opcnt; j++) { TS_CHECK_UINT(oplist[j].fp_base_op); if (oplist[j].fp_base_op != 0) { if (dwarf_get_CFA_name( oplist[j].fp_base_op << 6, &cfa_str) != DW_DLV_OK) { tet_printf("dwarf_get_CFA_name" " failed\n"); continue; } TS_CHECK_STRING(cfa_str); } TS_CHECK_UINT(oplist[j].fp_extended_op); if (oplist[j].fp_extended_op != 0) { if (dwarf_get_CFA_name( oplist[j].fp_extended_op, &cfa_str) != DW_DLV_OK) { tet_printf("dwarf_get_CFA_name" " failed\n"); continue; } TS_CHECK_STRING(cfa_str); } TS_CHECK_UINT(oplist[j].fp_register); TS_CHECK_INT(oplist[j].fp_offset); TS_CHECK_INT(oplist[j].fp_instr_offset); } } _frame_test(dbg, fde, low_pc, func_len, cie_caf); } done: return; }
static void _frame3_test(Dwarf_Debug dbg, Dwarf_Fde fde, Dwarf_Addr pc, Dwarf_Unsigned func_len, Dwarf_Unsigned caf) { Dwarf_Signed offset_relevant, register_num, offset_or_block_len; Dwarf_Addr pc_end, row_pc; Dwarf_Ptr block_ptr; Dwarf_Regtable3 reg_table3; Dwarf_Small value_type; Dwarf_Error de; int i, cnt; /* Initialise regster table (DWARF3). */ reg_table3.rt3_reg_table_size = DW_REG_TABLE_SIZE; reg_table3.rt3_rules = calloc(reg_table3.rt3_reg_table_size, sizeof(Dwarf_Regtable_Entry3)); if (reg_table3.rt3_rules == NULL) { tet_infoline("calloc failed when initialising reg_table3"); result = TET_FAIL; return; } /* Sanity check for invalid table_column. */ if (dwarf_get_fde_info_for_reg3(fde, 9999, 0, &value_type, &offset_relevant, ®ister_num, &offset_or_block_len, &block_ptr, &row_pc, &de) != DW_DLV_ERROR) { tet_infoline("dwarf_get_fde_info_for_reg3 didn't return" " DW_DLV_ERROR when called with invalid table_column" " value"); result = TET_FAIL; return; } cnt = 0; pc_end = pc + func_len; while (pc < pc_end && cnt < 16) { tet_printf("query CFA(3) register pc %#jx\n", (uintmax_t) pc); if (dwarf_get_fde_info_for_cfa_reg3(fde, pc, &value_type, &offset_relevant, ®ister_num, &offset_or_block_len, &block_ptr, &row_pc, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_info_for_reg3(cfa) failed: %s", dwarf_errmsg(de)); result = TET_FAIL; return; } TS_CHECK_INT(value_type); TS_CHECK_INT(offset_relevant); TS_CHECK_INT(offset_or_block_len); TS_CHECK_INT(register_num); TS_CHECK_UINT(row_pc); if (value_type == DW_EXPR_EXPRESSION || value_type == DW_EXPR_VAL_EXPRESSION) TS_CHECK_BLOCK(block_ptr, offset_or_block_len); for (i = 1; i < _MAX_REG_NUM; i++) { tet_printf("query register(3) %d\n", i); if (dwarf_get_fde_info_for_reg3(fde, i, pc, &value_type, &offset_relevant, ®ister_num, &offset_or_block_len, &block_ptr, &row_pc, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_info_for_reg3(%d)" " failed: %s", i, dwarf_errmsg(de)); result = TET_FAIL; goto next; } TS_CHECK_INT(value_type); TS_CHECK_INT(offset_relevant); TS_CHECK_INT(offset_or_block_len); TS_CHECK_INT(register_num); TS_CHECK_UINT(row_pc); if (value_type == DW_EXPR_EXPRESSION || value_type == DW_EXPR_VAL_EXPRESSION) TS_CHECK_BLOCK(block_ptr, offset_or_block_len); } tet_infoline("query all register(3)"); if (dwarf_get_fde_info_for_all_regs3(fde, pc, ®_table3, &row_pc, &de) != DW_DLV_OK) { tet_printf("dwarf_get_fde_info_for_all_regs failed: %s", dwarf_errmsg(de)); result = TET_FAIL; goto next; } TS_CHECK_UINT(row_pc); #define CFA3 reg_table3.rt3_cfa_rule #define RT3 reg_table3.rt3_rules TS_CHECK_UINT(CFA3.dw_offset_relevant); TS_CHECK_UINT(CFA3.dw_value_type); TS_CHECK_UINT(CFA3.dw_regnum); TS_CHECK_UINT(CFA3.dw_offset_or_block_len); if (CFA3.dw_value_type == DW_EXPR_EXPRESSION || CFA3.dw_value_type == DW_EXPR_VAL_EXPRESSION) TS_CHECK_BLOCK(CFA3.dw_block_ptr, CFA3.dw_offset_or_block_len); for (i = 0; i < _MAX_REG_NUM; i++) { tet_printf("check reg_table3[%d]\n", i); TS_CHECK_UINT(RT3[i].dw_offset_relevant); TS_CHECK_UINT(RT3[i].dw_value_type); TS_CHECK_UINT(RT3[i].dw_regnum); TS_CHECK_UINT(RT3[i].dw_offset_or_block_len); if (RT3[i].dw_value_type == DW_EXPR_EXPRESSION || RT3[i].dw_value_type == DW_EXPR_VAL_EXPRESSION) TS_CHECK_BLOCK(RT3[i].dw_block_ptr, RT3[i].dw_offset_or_block_len); } #undef CFA3 #undef RT3 next: pc += caf; cnt++; } }