From 0abca47e977bdb882beae6c56194f2f005e895e3 Mon Sep 17 00:00:00 2001 From: Yichao Yu Date: Fri, 27 Oct 2017 13:50:58 +0000 Subject: [PATCH] ..... --- src/dwarf/Gparser.c | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/dwarf/Gparser.c b/src/dwarf/Gparser.c index 70e690f..438a78a 100644 --- a/src/dwarf/Gparser.c +++ b/src/dwarf/Gparser.c @@ -115,7 +115,7 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr, /* Process everything up to and including the current 'end_ip', including all the DW_CFA_advance_loc instructions. See 'c->use_prev_instr' use in 'fetch_proc_info' for details. */ - while (*ip <= end_ip && *addr < end_addr && ret >= 0) + while (*ip + c->use_prev_instr <= end_ip && *addr < end_addr && ret >= 0) { unw_word_t operand = 0, regnum, val, len; uint8_t u8, op; @@ -289,10 +289,8 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr, ret = -UNW_EINVAL; break; } - if (*ip < end_ip) { - memcpy (&sr->rs_current, &(*rs_stack)->state, sizeof (sr->rs_current)); - pop_rstate_stack(rs_stack); - } + memcpy (&sr->rs_current, &(*rs_stack)->state, sizeof (sr->rs_current)); + pop_rstate_stack(rs_stack); Debug (15, "CFA_restore_state\n"); break; @@ -384,11 +382,8 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr, case DW_CFA_GNU_args_size: if ((ret = dwarf_read_uleb128 (as, a, addr, &val, arg)) < 0) break; - if (*ip < end_ip) - { - sr->args_size = val; - Debug (15, "CFA_GNU_args_size %lu\n", (long) val); - } + sr->args_size = val; + Debug (15, "CFA_GNU_args_size %lu\n", (long) val); break; case DW_CFA_GNU_negative_offset_extended: @@ -429,7 +424,7 @@ run_cfi_program (struct dwarf_cursor *c, dwarf_state_record_t *sr, } static int -fetch_proc_info (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info) +fetch_proc_info (struct dwarf_cursor *c, unw_word_t ip) { int ret, dynamic = 1; @@ -475,14 +470,6 @@ fetch_proc_info (struct dwarf_cursor *c, unw_word_t ip, int need_unwind_info) if (ret >= 0) tdep_fetch_frame (c, ip, 1); - /* Update use_prev_instr for the next frame. */ - if (need_unwind_info) - { - assert(c->pi.unwind_info); - struct dwarf_cie_info *dci = c->pi.unwind_info; - c->use_prev_instr = ! dci->signal_frame; - } - return ret; } @@ -914,10 +901,17 @@ find_reg_state (struct dwarf_cursor *c, dwarf_state_record_t *sr) } else { - ret = fetch_proc_info (c, c->ip, 1); - if (ret >= 0) + ret = fetch_proc_info (c, c->ip); + int next_use_prev_instr = c->use_prev_instr; + if (ret >= 0) { + /* Update use_prev_instr for the next frame. */ + assert(c->pi.unwind_info); + struct dwarf_cie_info *dci = c->pi.unwind_info; + next_use_prev_instr = ! dci->signal_frame; ret = create_state_record_for (c, sr, c->ip); + } put_unwind_info (c, &c->pi); + c->use_prev_instr = next_use_prev_instr; if (cache && ret >= 0) { @@ -972,7 +966,7 @@ dwarf_make_proc_info (struct dwarf_cursor *c) int ret; /* Lookup it up the slow way... */ - ret = fetch_proc_info (c, c->ip, 0); + ret = fetch_proc_info (c, c->ip); if (ret >= 0) ret = create_state_record_for (c, &sr, c->ip); put_unwind_info (c, &c->pi); @@ -1006,8 +1000,8 @@ dwarf_reg_states_table_iterate(struct dwarf_cursor *c, while (ret >= 0 && curr_ip < c->pi.end_ip && addr < dci->fde_instr_end) { unw_word_t prev_ip = curr_ip; - ret = run_cfi_program (c, &sr, &curr_ip, prev_ip, &addr, dci->fde_instr_end, - &rs_stack, dci); + ret = run_cfi_program (c, &sr, &curr_ip, prev_ip + c->use_prev_instr, &addr, + dci->fde_instr_end, &rs_stack, dci); if (ret >= 0 && prev_ip < curr_ip) ret = cb(token, &sr.rs_current, sizeof(sr.rs_current), prev_ip, curr_ip); } @@ -1029,8 +1023,13 @@ dwarf_reg_states_iterate(struct dwarf_cursor *c, unw_reg_states_callback cb, void *token) { - int ret = fetch_proc_info (c, c->ip, 1); + int ret = fetch_proc_info (c, c->ip); + int next_use_prev_instr = c->use_prev_instr; if (ret >= 0) + /* Update use_prev_instr for the next frame. */ + assert(c->pi.unwind_info); + struct dwarf_cie_info *dci = c->pi.unwind_info; + next_use_prev_instr = ! dci->signal_frame; switch (c->pi.format) { case UNW_INFO_FORMAT_TABLE: @@ -1047,6 +1046,7 @@ dwarf_reg_states_iterate(struct dwarf_cursor *c, ret = -UNW_EINVAL; } put_unwind_info (c, &c->pi); + c->use_prev_instr = next_use_prev_instr; return ret; } -- 2.14.3