#include "unwind_i.h"
int
unw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
{
struct cursor *c = (struct cursor *) cursor;
dwarf_loc_t loc;
switch (reg)
{
case UNW_RISCV_X1:
case UNW_RISCV_X2:
case UNW_RISCV_X3:
case UNW_RISCV_X4:
case UNW_RISCV_X5:
case UNW_RISCV_X6:
case UNW_RISCV_X7:
case UNW_RISCV_X8:
case UNW_RISCV_X9:
case UNW_RISCV_X10:
case UNW_RISCV_X11:
case UNW_RISCV_X12:
case UNW_RISCV_X13:
case UNW_RISCV_X14:
case UNW_RISCV_X15:
case UNW_RISCV_X16:
case UNW_RISCV_X17:
case UNW_RISCV_X18:
case UNW_RISCV_X19:
case UNW_RISCV_X20:
case UNW_RISCV_X21:
case UNW_RISCV_X22:
case UNW_RISCV_X23:
case UNW_RISCV_X24:
case UNW_RISCV_X25:
case UNW_RISCV_X26:
case UNW_RISCV_X27:
case UNW_RISCV_X28:
case UNW_RISCV_X29:
case UNW_RISCV_X30:
case UNW_RISCV_X31:
case UNW_RISCV_PC:
loc = c->dwarf.loc[reg - UNW_RISCV_X0];
break;
default:
loc = DWARF_NULL_LOC;
break;
}
memset (sloc, 0, sizeof (*sloc));
if (DWARF_IS_NULL_LOC (loc))
{
sloc->type = UNW_SLT_NONE;
return 0;
}
#if !defined(UNW_LOCAL_ONLY)
if (DWARF_IS_REG_LOC (loc))
{
sloc->type = UNW_SLT_REG;
sloc->u.regnum = DWARF_GET_LOC (loc);
}
else
#endif
{
sloc->type = UNW_SLT_MEMORY;
sloc->u.addr = DWARF_GET_LOC (loc);
}
return 0;
}