From 12eabbda6bd7fab8482c288ed30c73b15c49680c Mon Sep 17 00:00:00 2001 From: Simon Wright Date: Thu, 7 Feb 2013 18:07:18 +0000 Subject: [PATCH] re PR target/50678 (FAIL: c52104y on x86_64-apple-darwin10) PR target/50678 * init.c (__darwin_major_version): New function for x86-64/Darwin. (__gnat_adjust_context_for_raise) [Darwin]: Disable the workaround on Darwin 12 and above. From-SVN: r195862 --- gcc/ada/ChangeLog | 7 +++++++ gcc/ada/init.c | 52 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index fbacc4fdd6a..b7c755200de 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2013-02-07 Simon Wright + + PR target/50678 + * init.c (__darwin_major_version): New function for x86-64/Darwin. + (__gnat_adjust_context_for_raise) [Darwin]: Disable the workaround + on Darwin 12 and above. + 2013-02-06 Rainer Emrich PR target/52123 diff --git a/gcc/ada/init.c b/gcc/ada/init.c index 37c403b803e..f5c3a814411 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -2056,7 +2056,9 @@ __gnat_install_handler(void) #elif defined(__APPLE__) #include +#include #include +#include #include #include #include @@ -2095,20 +2097,52 @@ __gnat_is_stack_guard (mach_vm_address_t addr) #define HAVE_GNAT_ADJUST_CONTEXT_FOR_RAISE +#if defined (__x86_64__) +static int +__darwin_major_version (void) +{ + static int cache = -1; + if (cache < 0) + { + int mib[2] = {CTL_KERN, KERN_OSRELEASE}; + size_t len; + + /* Find out how big the buffer needs to be (and set cache to 0 + on failure). */ + if (sysctl (mib, 2, NULL, &len, NULL, 0) == 0) + { + char release[len]; + sysctl (mib, 2, release, &len, NULL, 0); + /* Darwin releases are of the form L.M.N where L is the major + version, so strtol will return L. */ + cache = (int) strtol (release, NULL, 10); + } + else + { + cache = 0; + } + } + return cache; +} +#endif + void __gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED, void *ucontext ATTRIBUTE_UNUSED) { #if defined (__x86_64__) - /* Work around radar #10302855/pr50678, where the unwinders (libunwind or - libgcc_s depending on the system revision) and the DWARF unwind data for - the sigtramp have different ideas about register numbering (causing rbx - and rdx to be transposed).. */ - ucontext_t *uc = (ucontext_t *)ucontext ; - unsigned long t = uc->uc_mcontext->__ss.__rbx; - - uc->uc_mcontext->__ss.__rbx = uc->uc_mcontext->__ss.__rdx; - uc->uc_mcontext->__ss.__rdx = t; + if (__darwin_major_version () < 12) + { + /* Work around radar #10302855, where the unwinders (libunwind or + libgcc_s depending on the system revision) and the DWARF unwind + data for sigtramp have different ideas about register numbering, + causing rbx and rdx to be transposed. */ + ucontext_t *uc = (ucontext_t *)ucontext; + unsigned long t = uc->uc_mcontext->__ss.__rbx; + + uc->uc_mcontext->__ss.__rbx = uc->uc_mcontext->__ss.__rdx; + uc->uc_mcontext->__ss.__rdx = t; + } #endif } -- 2.30.2