forked from OSchip/llvm-project
[libunwind] Remove the remote unwinding support
This is unfinished, unused and incomplete. This could be brought back in the future if there's a desire to build a more complete implementation, but at the moment it's just bitrotting. Differential Revision: https://reviews.llvm.org/D57252 llvm-svn: 352965
This commit is contained in:
parent
e546b53e01
commit
368c02e3ec
|
@ -124,32 +124,6 @@ extern int unw_get_proc_name(unw_cursor_t *, char *, size_t, unw_word_t *) LIBUN
|
||||||
|
|
||||||
extern unw_addr_space_t unw_local_addr_space;
|
extern unw_addr_space_t unw_local_addr_space;
|
||||||
|
|
||||||
#ifdef UNW_REMOTE
|
|
||||||
/*
|
|
||||||
* Mac OS X "remote" API for unwinding other processes on same machine
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
extern unw_addr_space_t unw_create_addr_space_for_task(task_t);
|
|
||||||
extern void unw_destroy_addr_space(unw_addr_space_t);
|
|
||||||
extern int unw_init_remote_thread(unw_cursor_t *, unw_addr_space_t, thread_t *);
|
|
||||||
#endif /* UNW_REMOTE */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* traditional libunwind "remote" API
|
|
||||||
* NOT IMPLEMENTED on Mac OS X
|
|
||||||
*
|
|
||||||
* extern int unw_init_remote(unw_cursor_t*, unw_addr_space_t,
|
|
||||||
* thread_t*);
|
|
||||||
* extern unw_accessors_t unw_get_accessors(unw_addr_space_t);
|
|
||||||
* extern unw_addr_space_t unw_create_addr_space(unw_accessors_t, int);
|
|
||||||
* extern void unw_flush_cache(unw_addr_space_t, unw_word_t,
|
|
||||||
* unw_word_t);
|
|
||||||
* extern int unw_set_caching_policy(unw_addr_space_t,
|
|
||||||
* unw_caching_policy_t);
|
|
||||||
* extern void _U_dyn_register(unw_dyn_info_t*);
|
|
||||||
* extern void _U_dyn_cancel(unw_dyn_info_t*);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -607,138 +607,6 @@ inline bool LocalAddressSpace::findFunctionName(pint_t addr, char *buf,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef UNW_REMOTE
|
|
||||||
|
|
||||||
/// RemoteAddressSpace is used as a template parameter to UnwindCursor when
|
|
||||||
/// unwinding a thread in the another process. The other process can be a
|
|
||||||
/// different endianness and a different pointer size which is handled by
|
|
||||||
/// the P template parameter.
|
|
||||||
template <typename P>
|
|
||||||
class RemoteAddressSpace {
|
|
||||||
public:
|
|
||||||
RemoteAddressSpace(task_t task) : fTask(task) {}
|
|
||||||
|
|
||||||
typedef typename P::uint_t pint_t;
|
|
||||||
|
|
||||||
uint8_t get8(pint_t addr);
|
|
||||||
uint16_t get16(pint_t addr);
|
|
||||||
uint32_t get32(pint_t addr);
|
|
||||||
uint64_t get64(pint_t addr);
|
|
||||||
pint_t getP(pint_t addr);
|
|
||||||
uint64_t getRegister(pint_t addr);
|
|
||||||
uint64_t getULEB128(pint_t &addr, pint_t end);
|
|
||||||
int64_t getSLEB128(pint_t &addr, pint_t end);
|
|
||||||
pint_t getEncodedP(pint_t &addr, pint_t end, uint8_t encoding,
|
|
||||||
pint_t datarelBase = 0);
|
|
||||||
bool findFunctionName(pint_t addr, char *buf, size_t bufLen,
|
|
||||||
unw_word_t *offset);
|
|
||||||
bool findUnwindSections(pint_t targetAddr, UnwindInfoSections &info);
|
|
||||||
bool findOtherFDE(pint_t targetAddr, pint_t &fde);
|
|
||||||
private:
|
|
||||||
void *localCopy(pint_t addr);
|
|
||||||
|
|
||||||
task_t fTask;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename P> uint8_t RemoteAddressSpace<P>::get8(pint_t addr) {
|
|
||||||
return *((uint8_t *)localCopy(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P> uint16_t RemoteAddressSpace<P>::get16(pint_t addr) {
|
|
||||||
return P::E::get16(*(uint16_t *)localCopy(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P> uint32_t RemoteAddressSpace<P>::get32(pint_t addr) {
|
|
||||||
return P::E::get32(*(uint32_t *)localCopy(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P> uint64_t RemoteAddressSpace<P>::get64(pint_t addr) {
|
|
||||||
return P::E::get64(*(uint64_t *)localCopy(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P>
|
|
||||||
typename P::uint_t RemoteAddressSpace<P>::getP(pint_t addr) {
|
|
||||||
return P::getP(*(uint64_t *)localCopy(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P>
|
|
||||||
typename P::uint_t OtherAddressSpace<P>::getRegister(pint_t addr) {
|
|
||||||
return P::getRegister(*(uint64_t *)localCopy(addr));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P>
|
|
||||||
uint64_t OtherAddressSpace<P>::getULEB128(pint_t &addr, pint_t end) {
|
|
||||||
uintptr_t size = (end - addr);
|
|
||||||
LocalAddressSpace::pint_t laddr = (LocalAddressSpace::pint_t) localCopy(addr);
|
|
||||||
LocalAddressSpace::pint_t sladdr = laddr;
|
|
||||||
uint64_t result = LocalAddressSpace::getULEB128(laddr, laddr + size);
|
|
||||||
addr += (laddr - sladdr);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P>
|
|
||||||
int64_t RemoteAddressSpace<P>::getSLEB128(pint_t &addr, pint_t end) {
|
|
||||||
uintptr_t size = (end - addr);
|
|
||||||
LocalAddressSpace::pint_t laddr = (LocalAddressSpace::pint_t) localCopy(addr);
|
|
||||||
LocalAddressSpace::pint_t sladdr = laddr;
|
|
||||||
uint64_t result = LocalAddressSpace::getSLEB128(laddr, laddr + size);
|
|
||||||
addr += (laddr - sladdr);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P> void *RemoteAddressSpace<P>::localCopy(pint_t addr) {
|
|
||||||
// FIX ME
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename P>
|
|
||||||
bool RemoteAddressSpace<P>::findFunctionName(pint_t addr, char *buf,
|
|
||||||
size_t bufLen,
|
|
||||||
unw_word_t *offset) {
|
|
||||||
// FIX ME
|
|
||||||
}
|
|
||||||
|
|
||||||
/// unw_addr_space is the base class that abstract unw_addr_space_t type in
|
|
||||||
/// libunwind.h points to.
|
|
||||||
struct unw_addr_space {
|
|
||||||
cpu_type_t cpuType;
|
|
||||||
task_t taskPort;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// unw_addr_space_i386 is the concrete instance that a unw_addr_space_t points
|
|
||||||
/// to when examining
|
|
||||||
/// a 32-bit intel process.
|
|
||||||
struct unw_addr_space_i386 : public unw_addr_space {
|
|
||||||
unw_addr_space_i386(task_t task) : oas(task) {}
|
|
||||||
RemoteAddressSpace<Pointer32<LittleEndian>> oas;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// unw_addr_space_x86_64 is the concrete instance that a unw_addr_space_t
|
|
||||||
/// points to when examining
|
|
||||||
/// a 64-bit intel process.
|
|
||||||
struct unw_addr_space_x86_64 : public unw_addr_space {
|
|
||||||
unw_addr_space_x86_64(task_t task) : oas(task) {}
|
|
||||||
RemoteAddressSpace<Pointer64<LittleEndian>> oas;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// unw_addr_space_ppc is the concrete instance that a unw_addr_space_t points
|
|
||||||
/// to when examining
|
|
||||||
/// a 32-bit PowerPC process.
|
|
||||||
struct unw_addr_space_ppc : public unw_addr_space {
|
|
||||||
unw_addr_space_ppc(task_t task) : oas(task) {}
|
|
||||||
RemoteAddressSpace<Pointer32<BigEndian>> oas;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// unw_addr_space_ppc is the concrete instance that a unw_addr_space_t points
|
|
||||||
/// to when examining a 64-bit PowerPC process.
|
|
||||||
struct unw_addr_space_ppc64 : public unw_addr_space {
|
|
||||||
unw_addr_space_ppc64(task_t task) : oas(task) {}
|
|
||||||
RemoteAddressSpace<Pointer64<LittleEndian>> oas;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UNW_REMOTE
|
|
||||||
|
|
||||||
} // namespace libunwind
|
} // namespace libunwind
|
||||||
|
|
||||||
#endif // __ADDRESSSPACE_HPP__
|
#endif // __ADDRESSSPACE_HPP__
|
||||||
|
|
|
@ -79,93 +79,6 @@ _LIBUNWIND_EXPORT int unw_init_local(unw_cursor_t *cursor,
|
||||||
return UNW_ESUCCESS;
|
return UNW_ESUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UNW_REMOTE
|
|
||||||
/// Create a cursor into a thread in another process.
|
|
||||||
_LIBUNWIND_EXPORT int unw_init_remote_thread(unw_cursor_t *cursor,
|
|
||||||
unw_addr_space_t as,
|
|
||||||
void *arg) {
|
|
||||||
// special case: unw_init_remote(xx, unw_local_addr_space, xx)
|
|
||||||
if (as == (unw_addr_space_t)&LocalAddressSpace::sThisAddressSpace)
|
|
||||||
return unw_init_local(cursor, NULL); //FIXME
|
|
||||||
|
|
||||||
// use "placement new" to allocate UnwindCursor in the cursor buffer
|
|
||||||
switch (as->cpuType) {
|
|
||||||
case CPU_TYPE_I386:
|
|
||||||
new ((void *)cursor)
|
|
||||||
UnwindCursor<RemoteAddressSpace<Pointer32<LittleEndian>>,
|
|
||||||
Registers_x86>(((unw_addr_space_i386 *)as)->oas, arg);
|
|
||||||
break;
|
|
||||||
case CPU_TYPE_X86_64:
|
|
||||||
new ((void *)cursor)
|
|
||||||
UnwindCursor<RemoteAddressSpace<Pointer64<LittleEndian>>,
|
|
||||||
Registers_x86_64>(((unw_addr_space_x86_64 *)as)->oas, arg);
|
|
||||||
break;
|
|
||||||
case CPU_TYPE_POWERPC:
|
|
||||||
new ((void *)cursor)
|
|
||||||
UnwindCursor<RemoteAddressSpace<Pointer32<BigEndian>>,
|
|
||||||
Registers_ppc>(((unw_addr_space_ppc *)as)->oas, arg);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return UNW_EUNSPEC;
|
|
||||||
}
|
|
||||||
return UNW_ESUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool is64bit(task_t task) {
|
|
||||||
return false; // FIXME
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create an address_space object for use in examining another task.
|
|
||||||
_LIBUNWIND_EXPORT unw_addr_space_t unw_create_addr_space_for_task(task_t task) {
|
|
||||||
#if __i386__
|
|
||||||
if (is64bit(task)) {
|
|
||||||
unw_addr_space_x86_64 *as = malloc(sizeof(unw_addr_space_x86_64));
|
|
||||||
new (as) unw_addr_space_x86_64(task);
|
|
||||||
as->taskPort = task;
|
|
||||||
as->cpuType = CPU_TYPE_X86_64;
|
|
||||||
//as->oas
|
|
||||||
} else {
|
|
||||||
unw_addr_space_i386 *as = malloc(sizeof(unw_addr_space_i386));
|
|
||||||
new (as) unw_addr_space_i386(task);
|
|
||||||
as->taskPort = task;
|
|
||||||
as->cpuType = CPU_TYPE_I386;
|
|
||||||
//as->oas
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// FIXME
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Delete an address_space object.
|
|
||||||
_LIBUNWIND_EXPORT void unw_destroy_addr_space(unw_addr_space_t asp) {
|
|
||||||
switch (asp->cpuType) {
|
|
||||||
#if __i386__ || __x86_64__
|
|
||||||
case CPU_TYPE_I386: {
|
|
||||||
unw_addr_space_i386 *as = (unw_addr_space_i386 *)asp;
|
|
||||||
as->~unw_addr_space_i386();
|
|
||||||
free(as);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CPU_TYPE_X86_64: {
|
|
||||||
unw_addr_space_x86_64 *as = (unw_addr_space_x86_64 *)asp;
|
|
||||||
as->~unw_addr_space_x86_64();
|
|
||||||
free(as);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case CPU_TYPE_POWERPC: {
|
|
||||||
unw_addr_space_ppc *as = (unw_addr_space_ppc *)asp;
|
|
||||||
as->~unw_addr_space_ppc();
|
|
||||||
free(as);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // UNW_REMOTE
|
|
||||||
|
|
||||||
|
|
||||||
/// Get value of specified register at cursor position in stack frame.
|
/// Get value of specified register at cursor position in stack frame.
|
||||||
_LIBUNWIND_EXPORT int unw_get_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
_LIBUNWIND_EXPORT int unw_get_reg(unw_cursor_t *cursor, unw_regnum_t regNum,
|
||||||
unw_word_t *value) {
|
unw_word_t *value) {
|
||||||
|
|
Loading…
Reference in New Issue