http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50678
--- Comment #71 from simon at pushface dot org 2013-02-05 15:33:52 UTC --- Created attachment 29360 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29360 Patch to suppress register swap on Darwin >= 12 (In reply to comment #69) > OK, thanks, so the bug has apparently been fixed in Darwin 12. The last thing > to do is to devise a _run time_ test to be added to > __gnat_adjust_context_for_raise that will disable the code if the Darwin > version is 12 or above. Essentially anything that works is acceptable. Any > Darwin expert out there? This patch works here in Darwin 12.2.1: === acats Summary === # of expected passes 2320 # of unexpected failures 0 === gnat Summary === # of expected passes 1158 # of expected failures 17 # of unsupported tests 5 /Users/simon/tmp/gcc-build-195682-patched/gcc/gnatmake version 4.8.0 20130202 (experimental) [trunk revision 195682] It uses sysctl(3) and strtol(3), which might seem heavy but as Eric has pointed out it'll only be called when we're already in the middle of handling a signal. Especially considering that, I may have gone OTT in caching the determined version and/or separating the version determination into a new function. I haven't checked the returned values of the sysctl(3) calls or the length of the buffer required; what's policy? and what could be done if there was an error? As an aside, what's the recommended technique for rebuilding and reinstalling just the RTS? ('cd gcc; make gnatlib' leaves the build in a state where 'make install' doesn't work).