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 <stdlib.h>
278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include <string.h>
288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "unwind_i.h"
308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef UNW_REMOTE_ONLY
328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* unw_local_addr_space is a NULL pointer in this case.  */
348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPROTECTED unw_addr_space_t unw_local_addr_space;
358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else /* !UNW_REMOTE_ONLY */
378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
388d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic struct unw_addr_space local_addr_space;
398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline void *
438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalauc_addr (ucontext_t *uc, int reg)
448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (reg >= UNW_SH_R0 && reg <= UNW_SH_PR)
468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return &uc->uc_mcontext.gregs[reg];
478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return NULL;
498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# ifdef UNW_LOCAL_ONLY
528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaHIDDEN void *
548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalatdep_uc_addr (ucontext_t *uc, int reg)
558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return uc_addr (uc, reg);
578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# endif /* UNW_LOCAL_ONLY */
608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaHIDDEN unw_dyn_info_list_t _U_dyn_info_list;
628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* XXX fix me: there is currently no way to locate the dyn-info list
648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala       by a remote unwinder.  On ia64, this is done via a special
658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala       unwind-table entry.  Perhaps something similar can be done with
668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala       DWARF2 unwind info.  */
678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic void
698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaput_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  /* it's a no-op */
728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic int
758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaget_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala			void *arg)
778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic int
838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaaccess_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	    void *arg)
858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (write)
878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
887d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* ANDROID support update. */
89cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
90f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris      if (map_local_is_writable (addr))
917d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
92cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
937d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "mem[%x] <- %x\n", addr, *val);
947d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          *(unw_word_t *) addr = *val;
95cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
967d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
977d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      else
987d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
997d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "Unwritable memory mem[%x] <- %x\n", addr, *val);
1007d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          return -1;
1017d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
102cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1037d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* End of ANDROID update. */
1048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
1058d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
1068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
1077d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* ANDROID support update. */
108cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
109f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris      if (map_local_is_readable (addr))
1107d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
111cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1127d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          *val = *(unw_word_t *) addr;
1137d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "mem[%x] -> %x\n", addr, *val);
114cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
1157d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
1167d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      else
1177d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
1187d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "Unreadable memory mem[%x] -> XXX\n", addr);
1197d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          return -1;
1207d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
121cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1227d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* End of ANDROID update. */
1238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
1248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
1258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic int
1288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaaccess_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
1298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	    void *arg)
1308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
1318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_word_t *addr;
1328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ucontext_t *uc = arg;
1338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (unw_is_fpreg (reg))
1358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    goto badreg;
1368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (!(addr = uc_addr (uc, reg)))
1388d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    goto badreg;
1398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (write)
1418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
1428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      *(unw_word_t *) addr = *val;
1438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      Debug (12, "%s <- %x\n", unw_regname (reg), *val);
1448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
1458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
1468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
1478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      *val = *(unw_word_t *) addr;
1488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      Debug (12, "%s -> %x\n", unw_regname (reg), *val);
1498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
1508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
1518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala badreg:
1538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  Debug (1, "bad register number %u\n", reg);
1548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return -UNW_EBADREG;
1558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic int
1588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaaccess_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
1598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	      int write, void *arg)
1608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
1618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  ucontext_t *uc = arg;
1628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_fpreg_t *addr;
1638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (!unw_is_fpreg (reg))
1658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    goto badreg;
1668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (!(addr = uc_addr (uc, reg)))
1688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    goto badreg;
1698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (write)
1718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
1728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
1738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
1748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      *(unw_fpreg_t *) addr = *val;
1758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
1768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
1778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    {
1788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      *val = *(unw_fpreg_t *) addr;
1798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
1808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
1818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    }
1828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
1838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala badreg:
1858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  Debug (1, "bad register number %u\n", reg);
1868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  /* attempt to access a non-preserved register */
1878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return -UNW_EBADREG;
1888d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1898d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1908d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic int
1918d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaget_static_proc_name (unw_addr_space_t as, unw_word_t ip,
1928d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala		      char *buf, size_t buf_len, unw_word_t *offp,
1938d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala		      void *arg)
1948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
1958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
1968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1988d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaHIDDEN void
1998d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalash_local_addr_space_init (void)
2008d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
2018d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  memset (&local_addr_space, 0, sizeof (local_addr_space));
2028d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
2038d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
2048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.put_unwind_info = put_unwind_info;
2058d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
2068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.access_mem = access_mem;
2078d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.access_reg = access_reg;
2088d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.access_fpreg = access_fpreg;
2098d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.resume = sh_local_resume;
2108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  local_addr_space.acc.get_proc_name = get_static_proc_name;
2118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_flush_cache (&local_addr_space, 0, 0);
212f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris
213f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris  map_local_init ();
2148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
2158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif /* !UNW_REMOTE_ONLY */
217