Move dwarf2_frame_state_reg.exp_len to union .loc

dwarf2_frame_state_reg.exp_len is only used together with .loc.exp, so
it makes more sense to exp_len to the union as well.

gdb:

2017-08-11  Yao Qi  <yao.qi@linaro.org>

	* dwarf2-frame.h (struct dwarf2_frame_state_reg) <exp_len>: Remove.
	<loc.exp>: New field.
	* dwarf2-frame.c (execute_cfa_program): Update.
	(dwarf2_frame_prev_register): Update.
This commit is contained in:
Yao Qi 2017-08-11 09:30:02 +01:00
parent 5af3691c75
commit b348037fd8
3 changed files with 20 additions and 10 deletions

View file

@ -1,3 +1,10 @@
2017-08-11 Yao Qi <yao.qi@linaro.org>
* dwarf2-frame.h (struct dwarf2_frame_state_reg) <exp_len>: Remove.
<loc.exp>: New field.
* dwarf2-frame.c (execute_cfa_program): Update.
(dwarf2_frame_prev_register): Update.
2017-08-10 Pedro Alves <palves@redhat.com> 2017-08-10 Pedro Alves <palves@redhat.com>
* common/gdb_unique_ptr.h (xfree_deleter<T[]>): Define. * common/gdb_unique_ptr.h (xfree_deleter<T[]>): Define.

View file

@ -561,8 +561,8 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"),
reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p); reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p);
dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp);
fs->regs.reg[reg].loc.exp = insn_ptr; fs->regs.reg[reg].loc.exp.start = insn_ptr;
fs->regs.reg[reg].exp_len = utmp; fs->regs.reg[reg].loc.exp.len = utmp;
fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_EXP; fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_EXP;
insn_ptr += utmp; insn_ptr += utmp;
break; break;
@ -599,8 +599,8 @@ bad CFI data; mismatched DW_CFA_restore_state at %s"),
insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &reg); insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &reg);
dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp); insn_ptr = safe_read_uleb128 (insn_ptr, insn_end, &utmp);
fs->regs.reg[reg].loc.exp = insn_ptr; fs->regs.reg[reg].loc.exp.start = insn_ptr;
fs->regs.reg[reg].exp_len = utmp; fs->regs.reg[reg].loc.exp.len = utmp;
fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_EXP; fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_VAL_EXP;
insn_ptr += utmp; insn_ptr += utmp;
break; break;
@ -1286,8 +1286,8 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache,
return frame_unwind_got_register (this_frame, regnum, realnum); return frame_unwind_got_register (this_frame, regnum, realnum);
case DWARF2_FRAME_REG_SAVED_EXP: case DWARF2_FRAME_REG_SAVED_EXP:
addr = execute_stack_op (cache->reg[regnum].loc.exp, addr = execute_stack_op (cache->reg[regnum].loc.exp.start,
cache->reg[regnum].exp_len, cache->reg[regnum].loc.exp.len,
cache->addr_size, cache->text_offset, cache->addr_size, cache->text_offset,
this_frame, cache->cfa, 1); this_frame, cache->cfa, 1);
return frame_unwind_got_memory (this_frame, regnum, addr); return frame_unwind_got_memory (this_frame, regnum, addr);
@ -1297,8 +1297,8 @@ dwarf2_frame_prev_register (struct frame_info *this_frame, void **this_cache,
return frame_unwind_got_constant (this_frame, regnum, addr); return frame_unwind_got_constant (this_frame, regnum, addr);
case DWARF2_FRAME_REG_SAVED_VAL_EXP: case DWARF2_FRAME_REG_SAVED_VAL_EXP:
addr = execute_stack_op (cache->reg[regnum].loc.exp, addr = execute_stack_op (cache->reg[regnum].loc.exp.start,
cache->reg[regnum].exp_len, cache->reg[regnum].loc.exp.len,
cache->addr_size, cache->text_offset, cache->addr_size, cache->text_offset,
this_frame, cache->cfa, 1); this_frame, cache->cfa, 1);
return frame_unwind_got_constant (this_frame, regnum, addr); return frame_unwind_got_constant (this_frame, regnum, addr);

View file

@ -74,11 +74,14 @@ struct dwarf2_frame_state_reg
union { union {
LONGEST offset; LONGEST offset;
ULONGEST reg; ULONGEST reg;
const gdb_byte *exp; struct
{
const gdb_byte *start;
ULONGEST len;
} exp;
struct value *(*fn) (struct frame_info *this_frame, void **this_cache, struct value *(*fn) (struct frame_info *this_frame, void **this_cache,
int regnum); int regnum);
} loc; } loc;
ULONGEST exp_len;
enum dwarf2_frame_reg_rule how; enum dwarf2_frame_reg_rule how;
}; };