split dwarf2_fetch_cfa_info from dwarf2_compile_expr_to_ax

This removes dwarf2_compile_expr_to_ax, replacing it with a utility
function that fetches the CFA data and adding the code to actually
compile to an agent expression directly into
dwarf2_compile_expr_to_ax.  This refactoring lets a later patch reuse
the new dwarf2_fetch_cfa_info.

gdb/ChangeLog
2014-12-12  Tom Tromey  <tromey@redhat.com>

	* dwarf2loc.c (dwarf2_compile_expr_to_ax) <DW_OP_call_frame_cfa>:
	Update.
	* dwarf2-frame.c (dwarf2_fetch_cfa_info): New function, based on
	dwarf2_compile_cfa_to_ax.
	(dwarf2_compile_cfa_to_ax): Remove.
	* dwarf2-frame.h (dwarf2_fetch_cfa_info): Declare.
	(dwarf2_compile_cfa_to_ax): Remove.
This commit is contained in:
Tom Tromey
2014-05-14 14:25:01 -06:00
committed by Jan Kratochvil
parent ed12ef62cc
commit a8fd558970
4 changed files with 77 additions and 32 deletions

View File

@@ -882,11 +882,15 @@ dwarf2_frame_find_quirks (struct dwarf2_frame_state *fs,
}
void
dwarf2_compile_cfa_to_ax (struct agent_expr *expr, struct axs_value *loc,
struct gdbarch *gdbarch,
CORE_ADDR pc,
struct dwarf2_per_cu_data *data)
/* See dwarf2-frame.h. */
int
dwarf2_fetch_cfa_info (struct gdbarch *gdbarch, CORE_ADDR pc,
struct dwarf2_per_cu_data *data,
int *regnum_out, LONGEST *offset_out,
CORE_ADDR *text_offset_out,
const gdb_byte **cfa_start_out,
const gdb_byte **cfa_end_out)
{
struct dwarf2_fde *fde;
CORE_ADDR text_offset;
@@ -932,26 +936,20 @@ dwarf2_compile_cfa_to_ax (struct agent_expr *expr, struct axs_value *loc,
if (regnum == -1)
error (_("Unable to access DWARF register number %d"),
(int) fs.regs.cfa_reg); /* FIXME */
ax_reg (expr, regnum);
if (fs.regs.cfa_offset != 0)
{
if (fs.armcc_cfa_offsets_reversed)
ax_const_l (expr, -fs.regs.cfa_offset);
else
ax_const_l (expr, fs.regs.cfa_offset);
ax_simple (expr, aop_add);
}
*regnum_out = regnum;
if (fs.armcc_cfa_offsets_reversed)
*offset_out = -fs.regs.cfa_offset;
else
*offset_out = fs.regs.cfa_offset;
return 1;
}
break;
case CFA_EXP:
ax_const_l (expr, text_offset);
dwarf2_compile_expr_to_ax (expr, loc, gdbarch, addr_size,
fs.regs.cfa_exp,
fs.regs.cfa_exp + fs.regs.cfa_exp_len,
data);
break;
*text_offset_out = text_offset;
*cfa_start_out = fs.regs.cfa_exp;
*cfa_end_out = fs.regs.cfa_exp + fs.regs.cfa_exp_len;
return 0;
default:
internal_error (__FILE__, __LINE__, _("Unknown CFA rule."));