Fix for old names of mcontext registers

c.f. https://github.com/mistydemeo/tigerbrew/issues/473

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64812 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-09-22 20:13:08 +00:00
parent 50c16d52a9
commit 55c7b8541a
2 changed files with 40 additions and 24 deletions

View File

@ -854,12 +854,17 @@ check_stack_overflow(int sig, const uintptr_t addr, const ucontext_t *ctx)
const greg_t bp = mctx->gregs[REG_EBP]; const greg_t bp = mctx->gregs[REG_EBP];
# endif # endif
# elif defined __APPLE__ # elif defined __APPLE__
# if defined(__LP64__) # if __DARWIN_UNIX03
const uintptr_t sp = mctx->__ss.__rsp; # define MCTX_SS_REG(reg) __ss.__##reg
const uintptr_t bp = mctx->__ss.__rbp;
# else # else
const uintptr_t sp = mctx->__ss.__esp; # define MCTX_SS_REG(reg) ss.reg
const uintptr_t bp = mctx->__ss.__ebp; # endif
# if defined(__LP64__)
const uintptr_t sp = mctx->MCTX_SS_REG(rsp);
const uintptr_t bp = mctx->MCTX_SS_REG(rbp);
# else
const uintptr_t sp = mctx->MCTX_SS_REG(esp);
const uintptr_t bp = mctx->MCTX_SS_REG(ebp);
# endif # endif
# elif defined __FreeBSD__ # elif defined __FreeBSD__
# if defined(__amd64__) # if defined(__amd64__)

View File

@ -13,6 +13,9 @@
#include "addr2line.h" #include "addr2line.h"
#include "vm_core.h" #include "vm_core.h"
#include "iseq.h" #include "iseq.h"
#ifdef HAVE_UCONTEXT_H
#include "ucontext.h"
#endif
/* see vm_insnhelper.h for the values */ /* see vm_insnhelper.h for the values */
#ifndef VMDEBUG #ifndef VMDEBUG
@ -407,6 +410,14 @@ rb_vmdebug_thread_dump_state(VALUE self)
return Qnil; return Qnil;
} }
#if defined __APPLE__
# if __DARWIN_UNIX03
# define MCTX_SS_REG(reg) __ss.__##reg
# else
# define MCTX_SS_REG(reg) ss.reg
# endif
#endif
#if defined(HAVE_BACKTRACE) #if defined(HAVE_BACKTRACE)
# ifdef HAVE_LIBUNWIND # ifdef HAVE_LIBUNWIND
# undef backtrace # undef backtrace
@ -449,23 +460,23 @@ darwin_sigtramp:
*/ */
unw_get_reg(&cursor, UNW_X86_64_RBX, &ip); unw_get_reg(&cursor, UNW_X86_64_RBX, &ip);
uctx = (ucontext_t *)ip; uctx = (ucontext_t *)ip;
unw_set_reg(&cursor, UNW_X86_64_RAX, uctx->uc_mcontext->__ss.__rax); unw_set_reg(&cursor, UNW_X86_64_RAX, uctx->uc_mcontext->MCTX_SS_REG(rax));
unw_set_reg(&cursor, UNW_X86_64_RBX, uctx->uc_mcontext->__ss.__rbx); unw_set_reg(&cursor, UNW_X86_64_RBX, uctx->uc_mcontext->MCTX_SS_REG(rbx));
unw_set_reg(&cursor, UNW_X86_64_RCX, uctx->uc_mcontext->__ss.__rcx); unw_set_reg(&cursor, UNW_X86_64_RCX, uctx->uc_mcontext->MCTX_SS_REG(rcx));
unw_set_reg(&cursor, UNW_X86_64_RDX, uctx->uc_mcontext->__ss.__rdx); unw_set_reg(&cursor, UNW_X86_64_RDX, uctx->uc_mcontext->MCTX_SS_REG(rdx));
unw_set_reg(&cursor, UNW_X86_64_RDI, uctx->uc_mcontext->__ss.__rdi); unw_set_reg(&cursor, UNW_X86_64_RDI, uctx->uc_mcontext->MCTX_SS_REG(rdi));
unw_set_reg(&cursor, UNW_X86_64_RSI, uctx->uc_mcontext->__ss.__rsi); unw_set_reg(&cursor, UNW_X86_64_RSI, uctx->uc_mcontext->MCTX_SS_REG(rsi));
unw_set_reg(&cursor, UNW_X86_64_RBP, uctx->uc_mcontext->__ss.__rbp); unw_set_reg(&cursor, UNW_X86_64_RBP, uctx->uc_mcontext->MCTX_SS_REG(rbp));
unw_set_reg(&cursor, UNW_X86_64_RSP, 8+(uctx->uc_mcontext->__ss.__rsp)); unw_set_reg(&cursor, UNW_X86_64_RSP, 8+(uctx->uc_mcontext->MCTX_SS_REG(rsp)));
unw_set_reg(&cursor, UNW_X86_64_R8, uctx->uc_mcontext->__ss.__r8); unw_set_reg(&cursor, UNW_X86_64_R8, uctx->uc_mcontext->MCTX_SS_REG(r8));
unw_set_reg(&cursor, UNW_X86_64_R9, uctx->uc_mcontext->__ss.__r9); unw_set_reg(&cursor, UNW_X86_64_R9, uctx->uc_mcontext->MCTX_SS_REG(r9));
unw_set_reg(&cursor, UNW_X86_64_R10, uctx->uc_mcontext->__ss.__r10); unw_set_reg(&cursor, UNW_X86_64_R10, uctx->uc_mcontext->MCTX_SS_REG(r10));
unw_set_reg(&cursor, UNW_X86_64_R11, uctx->uc_mcontext->__ss.__r11); unw_set_reg(&cursor, UNW_X86_64_R11, uctx->uc_mcontext->MCTX_SS_REG(r11));
unw_set_reg(&cursor, UNW_X86_64_R12, uctx->uc_mcontext->__ss.__r12); unw_set_reg(&cursor, UNW_X86_64_R12, uctx->uc_mcontext->MCTX_SS_REG(r12));
unw_set_reg(&cursor, UNW_X86_64_R13, uctx->uc_mcontext->__ss.__r13); unw_set_reg(&cursor, UNW_X86_64_R13, uctx->uc_mcontext->MCTX_SS_REG(r13));
unw_set_reg(&cursor, UNW_X86_64_R14, uctx->uc_mcontext->__ss.__r14); unw_set_reg(&cursor, UNW_X86_64_R14, uctx->uc_mcontext->MCTX_SS_REG(r14));
unw_set_reg(&cursor, UNW_X86_64_R15, uctx->uc_mcontext->__ss.__r15); unw_set_reg(&cursor, UNW_X86_64_R15, uctx->uc_mcontext->MCTX_SS_REG(r15));
ip = uctx->uc_mcontext->__ss.__rip; ip = uctx->uc_mcontext->MCTX_SS_REG(rip);
/* There are 4 cases for SEGV: /* There are 4 cases for SEGV:
* (1) called invalid address * (1) called invalid address
@ -498,7 +509,7 @@ darwin_sigtramp:
/* if segv is caused by invalid call or signal received in syscall */ /* if segv is caused by invalid call or signal received in syscall */
/* the frame is invalid; skip */ /* the frame is invalid; skip */
trace[n++] = (void *)ip; trace[n++] = (void *)ip;
ip = *(unw_word_t*)uctx->uc_mcontext->__ss.__rsp; ip = *(unw_word_t*)uctx->uc_mcontext->MCTX_SS_REG(rsp);
} }
trace[n++] = (void *)ip; trace[n++] = (void *)ip;
unw_set_reg(&cursor, UNW_REG_IP, ip); unw_set_reg(&cursor, UNW_REG_IP, ip);
@ -843,7 +854,7 @@ print_machine_register(size_t reg, const char *reg_name, int col_count, int max_
# ifdef __linux__ # ifdef __linux__
# define dump_machine_register(reg) (col_count = print_machine_register(mctx->gregs[REG_##reg], #reg, col_count, 80)) # define dump_machine_register(reg) (col_count = print_machine_register(mctx->gregs[REG_##reg], #reg, col_count, 80))
# elif defined __APPLE__ # elif defined __APPLE__
# define dump_machine_register(reg) (col_count = print_machine_register(mctx->__ss.__##reg, #reg, col_count, 80)) # define dump_machine_register(reg) (col_count = print_machine_register(mctx->MCTX_SS_REG(reg), #reg, col_count, 80))
# endif # endif
static void static void