#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%lx cfa=0x%lx type %d cfa [where=%d val=%ld] cfaoff=%ld"
" ra=0x%lx fp [where=%d val=%ld @0x%lx] lr [where=%d val=%ld @0x%lx] "
"sp [where=%d val=%ld @0x%lx]\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[FP], rs->reg.val[FP], DWARF_GET_LOC(d->loc[FP]),
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_AARCH64_FRAME_OTHER
&& (rs->reg.where[DWARF_CFA_REG_COLUMN] == DWARF_WHERE_REG)
&& (rs->reg.val[DWARF_CFA_REG_COLUMN] == FP
|| 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[FP] == DWARF_WHERE_UNDEF
|| rs->reg.where[FP] == DWARF_WHERE_SAME
|| rs->reg.where[FP] == DWARF_WHERE_CFA
|| (rs->reg.where[FP] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[FP]) < (1 << 29)
&& rs->reg.val[FP]+1 != 0))
&& (rs->reg.where[LR] == DWARF_WHERE_UNDEF
|| rs->reg.where[LR] == DWARF_WHERE_SAME
|| rs->reg.where[LR] == 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_AARCH64_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[FP] == DWARF_WHERE_CFAREL)
f->fp_cfa_offset = rs->reg.val[FP];
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[FP] == DWARF_WHERE_CFA)
f->fp_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");
}