#include "unwind_i.h"
HIDDEN void
tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
{
struct cursor *c = (struct cursor *) dwarf_to_cursor (d);
unw_tdep_frame_t *f = &c->frame_info;
Debug (4, "ip=0x%x cfa=0x%x type %d cfa [where=%d val=%d] cfaoff=%d"
" ra=0x%x r7 [where=%d val=%d @0x%x] lr [where=%d val=%d @0x%x] "
"sp [where=%d val=%d @0x%x]\n",
d->ip, d->cfa, f->frame_type,
rs->reg.where[DWARF_CFA_REG_COLUMN],
rs->reg.val[DWARF_CFA_REG_COLUMN],
rs->reg.val[DWARF_CFA_OFF_COLUMN],
DWARF_GET_LOC(d->loc[rs->ret_addr_column]),
rs->reg.where[R7], rs->reg.val[R7], DWARF_GET_LOC(d->loc[R7]),
rs->reg.where[LR], rs->reg.val[LR], DWARF_GET_LOC(d->loc[LR]),
rs->reg.where[SP], rs->reg.val[SP], DWARF_GET_LOC(d->loc[SP]));
if (f->frame_type == UNW_ARM_FRAME_OTHER
&& (rs->reg.where[DWARF_CFA_REG_COLUMN] == DWARF_WHERE_REG)
&& (rs->reg.val[DWARF_CFA_REG_COLUMN] == R7
|| rs->reg.val[DWARF_CFA_REG_COLUMN] == SP)
&& labs(rs->reg.val[DWARF_CFA_OFF_COLUMN]) < (1 << 29)
&& rs->ret_addr_column == LR
&& (rs->reg.where[R7] == DWARF_WHERE_UNDEF
|| rs->reg.where[R7] == DWARF_WHERE_SAME
|| rs->reg.where[R7] == DWARF_WHERE_CFA
|| (rs->reg.where[R7] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[R7]) < (1 << 29)
&& rs->reg.val[R7]+1 != 0))
&& (rs->reg.where[LR] == DWARF_WHERE_UNDEF
|| rs->reg.where[LR] == DWARF_WHERE_SAME
|| rs->reg.where[R7] == DWARF_WHERE_CFA
|| (rs->reg.where[LR] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[LR]) < (1 << 29)
&& rs->reg.val[LR]+1 != 0))
&& (rs->reg.where[SP] == DWARF_WHERE_UNDEF
|| rs->reg.where[SP] == DWARF_WHERE_SAME
|| rs->reg.where[SP] == DWARF_WHERE_CFA
|| (rs->reg.where[SP] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[SP]) < (1 << 29)
&& rs->reg.val[SP]+1 != 0)))
{
f->frame_type = UNW_ARM_FRAME_STANDARD;
f->cfa_reg_sp = (rs->reg.val[DWARF_CFA_REG_COLUMN] == SP);
f->cfa_reg_offset = rs->reg.val[DWARF_CFA_OFF_COLUMN];
if (rs->reg.where[R7] == DWARF_WHERE_CFAREL)
f->r7_cfa_offset = rs->reg.val[R7];
if (rs->reg.where[LR] == DWARF_WHERE_CFAREL)
f->lr_cfa_offset = rs->reg.val[LR];
if (rs->reg.where[SP] == DWARF_WHERE_CFAREL)
f->sp_cfa_offset = rs->reg.val[SP];
if (rs->reg.where[R7] == DWARF_WHERE_CFA)
f->r7_cfa_offset = 0;
if (rs->reg.where[LR] == DWARF_WHERE_CFA)
f->lr_cfa_offset = 0;
if (rs->reg.where[SP] == DWARF_WHERE_CFA)
f->sp_cfa_offset = 0;
Debug (4, " standard frame\n");
}
else
Debug (4, " unusual frame\n");
}