/// Create a cursor of a thread in this process given 'context' recorded by
/// unw_getcontext().
_LIBUNWIND_EXPORT int unw_init_local(unw_cursor_t *cursor,
                                     unw_context_t *context) {
  _LIBUNWIND_TRACE_API("unw_init_local(cursor=%p, context=%p)\n",
                              cursor, context);
  // Use "placement new" to allocate UnwindCursor in the cursor buffer.
#if __i386__
  new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_x86>(
                                 context, LocalAddressSpace::sThisAddressSpace);
#elif __x86_64__
  new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_x86_64>(
                                 context, LocalAddressSpace::sThisAddressSpace);
#elif __ppc__
  new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_ppc>(
                                 context, LocalAddressSpace::sThisAddressSpace);
#elif __arm64__
  new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm64>(
                                 context, LocalAddressSpace::sThisAddressSpace);
#elif __arm__
  new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm>(
                                 context, LocalAddressSpace::sThisAddressSpace);
#endif
  AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
  co->setInfoBasedOnIPRegister();

  return UNW_ESUCCESS;
}
Ejemplo n.º 2
0
/// Create a cursor of a thread in this process given 'context' recorded by
/// unw_getcontext().
_LIBUNWIND_EXPORT int unw_init_local(unw_cursor_t *cursor,
                                     unw_context_t *context) {
  _LIBUNWIND_TRACE_API("unw_init_local(cursor=%p, context=%p)",
                       static_cast<void *>(cursor),
                       static_cast<void *>(context));
#if defined(__i386__)
# define REGISTER_KIND Registers_x86
#elif defined(__x86_64__)
# define REGISTER_KIND Registers_x86_64
#elif defined(__ppc__)
# define REGISTER_KIND Registers_ppc
#elif defined(__aarch64__)
# define REGISTER_KIND Registers_arm64
#elif _LIBUNWIND_ARM_EHABI
# define REGISTER_KIND Registers_arm
#elif defined(__or1k__)
# define REGISTER_KIND Registers_or1k
#elif defined(__mips__)
# warning The MIPS architecture is not supported.
#else
# error Architecture not supported
#endif
  // Use "placement new" to allocate UnwindCursor in the cursor buffer.
  new ((void *)cursor) UnwindCursor<LocalAddressSpace, REGISTER_KIND>(
                                 context, LocalAddressSpace::sThisAddressSpace);
#undef REGISTER_KIND
  AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
  co->setInfoBasedOnIPRegister();

  return UNW_ESUCCESS;
}
Ejemplo n.º 3
0
/// Set value of specified register at cursor position in stack frame.
_LIBUNWIND_EXPORT int unw_set_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
                                  unw_word_t value) {
  _LIBUNWIND_TRACE_API("unw_set_reg(cursor=%p, regNum=%d, value=0x%llX)\n",
                       static_cast<void *>(cursor), regNum, (long long)value);
  typedef LocalAddressSpace::pint_t pint_t;
  AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor;
  if (co->validReg(regNum)) {
    co->setReg(regNum, (pint_t)value);
    // specical case altering IP to re-find info (being called by personality
    // function)
    if (regNum == UNW_REG_IP)
      co->setInfoBasedOnIPRegister(false);
    return UNW_ESUCCESS;
  }
  return UNW_EBADREG;
}