diff options
Diffstat (limited to 'gcc/config/rs6000/host-darwin.c')
| -rw-r--r-- | gcc/config/rs6000/host-darwin.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/config/rs6000/host-darwin.c b/gcc/config/rs6000/host-darwin.c index 75c92a2..b0fc7c6 100644 --- a/gcc/config/rs6000/host-darwin.c +++ b/gcc/config/rs6000/host-darwin.c @@ -33,9 +33,19 @@ static void segv_crash_handler (int); static void segv_handler (int, siginfo_t *, void *); static void darwin_rs6000_extra_signals (void); +#ifndef HAVE_DECL_SIGALTSTACK /* This doesn't have a prototype in signal.h in 10.2.x and earlier, fixed in later releases. */ extern int sigaltstack(const struct sigaltstack *, struct sigaltstack *); +#endif + +/* The fields of the mcontext_t type have acquired underscores in later + OS versions. */ +#ifdef HAS_MCONTEXT_T_UNDERSCORES +#define MC_FLD(x) __ ## x +#else +#define MC_FLD(x) x +#endif #undef HOST_HOOKS_EXTRA_SIGNALS #define HOST_HOOKS_EXTRA_SIGNALS darwin_rs6000_extra_signals @@ -68,7 +78,7 @@ segv_handler (int sig ATTRIBUTE_UNUSED, sigaddset (&sigset, SIGSEGV); sigprocmask (SIG_UNBLOCK, &sigset, NULL); - faulting_insn = *(unsigned *)uc->uc_mcontext->ss.srr0; + faulting_insn = *(unsigned *)uc->uc_mcontext->MC_FLD(ss).MC_FLD(srr0); /* Note that this only has to work for GCC, so we don't have to deal with all the possible cases (GCC has no AltiVec code, for @@ -117,7 +127,8 @@ segv_handler (int sig ATTRIBUTE_UNUSED, } fprintf (stderr, "[address=%08lx pc=%08x]\n", - uc->uc_mcontext->es.dar, uc->uc_mcontext->ss.srr0); + uc->uc_mcontext->MC_FLD(es).MC_FLD(dar), + uc->uc_mcontext->MC_FLD(ss).MC_FLD(srr0)); internal_error ("Segmentation Fault"); exit (FATAL_EXIT_CODE); } |
