1d4e76214Sopenharmony_ci/* libunwind - a platform-independent unwind library
2d4e76214Sopenharmony_ci   Copyright (C) 2008 CodeSourcery
3d4e76214Sopenharmony_ci   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
4d4e76214Sopenharmony_ci
5d4e76214Sopenharmony_ciThis file is part of libunwind.
6d4e76214Sopenharmony_ci
7d4e76214Sopenharmony_ciPermission is hereby granted, free of charge, to any person obtaining
8d4e76214Sopenharmony_cia copy of this software and associated documentation files (the
9d4e76214Sopenharmony_ci"Software"), to deal in the Software without restriction, including
10d4e76214Sopenharmony_ciwithout limitation the rights to use, copy, modify, merge, publish,
11d4e76214Sopenharmony_cidistribute, sublicense, and/or sell copies of the Software, and to
12d4e76214Sopenharmony_cipermit persons to whom the Software is furnished to do so, subject to
13d4e76214Sopenharmony_cithe following conditions:
14d4e76214Sopenharmony_ci
15d4e76214Sopenharmony_ciThe above copyright notice and this permission notice shall be
16d4e76214Sopenharmony_ciincluded in all copies or substantial portions of the Software.
17d4e76214Sopenharmony_ci
18d4e76214Sopenharmony_ciTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19d4e76214Sopenharmony_ciEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20d4e76214Sopenharmony_ciMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21d4e76214Sopenharmony_ciNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22d4e76214Sopenharmony_ciLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23d4e76214Sopenharmony_ciOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24d4e76214Sopenharmony_ciWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
25d4e76214Sopenharmony_ci
26d4e76214Sopenharmony_ci#include "unwind_i.h"
27d4e76214Sopenharmony_ci
28d4e76214Sopenharmony_ciint
29d4e76214Sopenharmony_ciunw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
30d4e76214Sopenharmony_ci{
31d4e76214Sopenharmony_ci  struct cursor *c = (struct cursor *) cursor;
32d4e76214Sopenharmony_ci  dwarf_loc_t loc;
33d4e76214Sopenharmony_ci
34d4e76214Sopenharmony_ci  switch (reg)
35d4e76214Sopenharmony_ci    {
36d4e76214Sopenharmony_ci    case UNW_SH_R0:
37d4e76214Sopenharmony_ci    case UNW_SH_R1:
38d4e76214Sopenharmony_ci    case UNW_SH_R2:
39d4e76214Sopenharmony_ci    case UNW_SH_R3:
40d4e76214Sopenharmony_ci    case UNW_SH_R4:
41d4e76214Sopenharmony_ci    case UNW_SH_R5:
42d4e76214Sopenharmony_ci    case UNW_SH_R6:
43d4e76214Sopenharmony_ci    case UNW_SH_R7:
44d4e76214Sopenharmony_ci    case UNW_SH_R8:
45d4e76214Sopenharmony_ci    case UNW_SH_R9:
46d4e76214Sopenharmony_ci    case UNW_SH_R10:
47d4e76214Sopenharmony_ci    case UNW_SH_R11:
48d4e76214Sopenharmony_ci    case UNW_SH_R12:
49d4e76214Sopenharmony_ci    case UNW_SH_R13:
50d4e76214Sopenharmony_ci    case UNW_SH_R14:
51d4e76214Sopenharmony_ci    case UNW_SH_R15:
52d4e76214Sopenharmony_ci    case UNW_SH_PC:
53d4e76214Sopenharmony_ci    case UNW_SH_PR:
54d4e76214Sopenharmony_ci      loc = c->dwarf.loc[reg];
55d4e76214Sopenharmony_ci      break;
56d4e76214Sopenharmony_ci
57d4e76214Sopenharmony_ci    default:
58d4e76214Sopenharmony_ci      loc = DWARF_NULL_LOC;     /* default to "not saved" */
59d4e76214Sopenharmony_ci      break;
60d4e76214Sopenharmony_ci    }
61d4e76214Sopenharmony_ci
62d4e76214Sopenharmony_ci  memset (sloc, 0, sizeof (*sloc));
63d4e76214Sopenharmony_ci
64d4e76214Sopenharmony_ci  if (DWARF_IS_NULL_LOC (loc))
65d4e76214Sopenharmony_ci    {
66d4e76214Sopenharmony_ci      sloc->type = UNW_SLT_NONE;
67d4e76214Sopenharmony_ci      return 0;
68d4e76214Sopenharmony_ci    }
69d4e76214Sopenharmony_ci
70d4e76214Sopenharmony_ci#if !defined(UNW_LOCAL_ONLY)
71d4e76214Sopenharmony_ci  if (DWARF_IS_REG_LOC (loc))
72d4e76214Sopenharmony_ci    {
73d4e76214Sopenharmony_ci      sloc->type = UNW_SLT_REG;
74d4e76214Sopenharmony_ci      sloc->u.regnum = DWARF_GET_LOC (loc);
75d4e76214Sopenharmony_ci    }
76d4e76214Sopenharmony_ci  else
77d4e76214Sopenharmony_ci#endif
78d4e76214Sopenharmony_ci    {
79d4e76214Sopenharmony_ci      sloc->type = UNW_SLT_MEMORY;
80d4e76214Sopenharmony_ci      sloc->u.addr = DWARF_GET_LOC (loc);
81d4e76214Sopenharmony_ci    }
82d4e76214Sopenharmony_ci  return 0;
83d4e76214Sopenharmony_ci}
84