18d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* libunwind - a platform-independent unwind library
28d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   Copyright (C) 2008 CodeSourcery
38d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
48d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
58d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThis file is part of libunwind.
68d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
78d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPermission is hereby granted, free of charge, to any person obtaining
88d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaa copy of this software and associated documentation files (the
98d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala"Software"), to deal in the Software without restriction, including
108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalawithout limitation the rights to use, copy, modify, merge, publish,
118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladistribute, sublicense, and/or sell copies of the Software, and to
128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalapermit persons to whom the Software is furnished to do so, subject to
138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalathe following conditions:
148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThe above copyright notice and this permission notice shall be
168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaincluded in all copies or substantial portions of the Software.
178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "unwind_i.h"
278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPROTECTED int
298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaunw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  struct cursor *c = (struct cursor *) cursor;
328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  dwarf_loc_t loc;
338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  switch (reg)
358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R0:
378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R1:
388d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R2:
398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R3:
408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R4:
418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R5:
428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R6:
438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R7:
448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R8:
458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R9:
468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R10:
478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R11:
488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R12:
498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R13:
508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R14:
518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_R15:
528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_PC:
538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    case UNW_SH_PR:
548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      loc = c->dwarf.loc[reg];
558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      break;
568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    default:
588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      loc = DWARF_NULL_LOC;	/* default to "not saved" */
598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      break;
608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  memset (sloc, 0, sizeof (*sloc));
638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_NULL_LOC (loc))
658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      sloc->type = UNW_SLT_NONE;
678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      return 0;
688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#if !defined(UNW_LOCAL_ONLY)
718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_REG_LOC (loc))
728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      sloc->type = UNW_SLT_REG;
748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      sloc->u.regnum = DWARF_GET_LOC (loc);
758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif
788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      sloc->type = UNW_SLT_MEMORY;
808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      sloc->u.addr = DWARF_GET_LOC (loc);
818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
84