simplify and add more architectures.

This commit is contained in:
christos 2014-10-23 00:25:54 +00:00
parent e3b61b8356
commit 9512ff2aab

View File

@ -50,39 +50,38 @@ void *AsanDoesNotSupportStaticLinkage() {
void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
#ifdef __NetBSD__
# if defined(__arm__)
# define REG_PC _REG_PC
# define REG_BP _REG_FP
# define REG_SP _REG_SP
# define __UC_MACHINE_FP(ucontext, r) \
(ucontext)->uc_mcontext.__gregs[(r)]
/*
* Unfortunately we don't have a portable frame pointer (yet)
*/
# if defined(__alpha__)
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_X15)
# elif defined(__arm__)
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_FP)
# elif defined(__x86_64__)
# define REG_PC _REG_RIP
# define REG_BP _REG_RBP
# define REG_SP _REG_RSP
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_RBP)
# elif defined(__i386__)
# define REG_PC _REG_EIP
# define REG_BP _REG_EBP
# define REG_SP _REG_ESP
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_EBP)
# elif defined(__m68k__)
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_A6)
# elif defined(__mips__)
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_S8)
# elif defined(__powerpc__) || defined(__powerpc64__)
# define REG_PC _REG_PC
# define REG_BP _REG_R1
# define REG_SP _REG_R31
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_R1)
# elif defined(__sparc__)
# define _UC_MACHINE_FP(ucontext) sp[15]
# elif defined(__sh3__)
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_R14)
# elif defined(__vax__)
# define _UC_MACHINE_FP(ucontext) __UC_MACHINE_FP(ucontext, _REG_FP)
# else
# define _UC_MACHINE_FP(ucontext) 0
# endif
ucontext_t *ucontext = (ucontext_t*)context;
*pc = _UC_MACHINE_PC(ucontext);
*sp = _UC_MACHINE_SP(ucontext);
*bp = sp[15]; // XXX: christos
# else
// Lot's are missing, please add more.
#endif
# ifdef REG_PC
ucontext_t *ucontext = (ucontext_t*)context;
*pc = ucontext->uc_mcontext.__gregs[REG_PC];
*bp = ucontext->uc_mcontext.__gregs[REG_BP];
*sp = ucontext->uc_mcontext.__gregs[REG_SP];
# else
*pc = *bp = *sp = 0;
# endif
*bp = _UC_MACHINE_FP(ucontext);
#elif ASAN_ANDROID
*pc = *sp = *bp = 0;
#elif defined(__arm__)