One of the last remnants of Solaris 10 (and 9)/SPARC support is the libgcc unwinder.
To get rid of unused cruft, I've taken a full clone of the Solaris 11 support repository, checked out every since version of 32 and 64-bit libc.so.1 and checked if the patters looked for in sol2-unwind.h are present. * As expected, the 64-bit __sighndlr pattern is present everywhere, as is the Solaris 11 cuh_pattern. However, neither the Solaris 10 cuh_pattern nor the Solaris 9 one can be found, while both are present in the respective versions of libc/libthread. * In the 32-bit case, __sighndlr is identical everywhere again, and the Solaris 11 cuh_pattern is found in most versions of libc. Unlike the 64-bit case, the Solaris 10 cuh_pattern is also found in the Solaris 11 Express (snv_151) versions of libc. While this in itself doesn't matter (I won't be supporting a 9-year old beta version of Solaris 11 these days), it might be that this is still present in OpenSolaris derivatives since snv_147 was the last open version. So I checked Tribblix m20.6, the only known Illumos derivative with SPARC support. However, when I looked at 32-bit libc from Tribblix m20.6, I found none of the patterns in sol2-unwind.h (neither any of the 64-bit ones in the 64-bit libc). I have to assume that Peter Tribble switched to using gcc for his builds. So all pre-Solaris 11 patterns can go since there's no way that they can be found on a Solaris 11 system: there's no static libc.a anymore since Solaris 10 and the system-call interface between libc and kernel changed so much in Solaris 11 that a local copy of Solaris 10 libc.so.1 wouldn't work at all on Solaris 11. Bootstrapped without regressions on sparc-sun-solaris2.11 (Solaris 11.3, 11.4, and 11.5). I'm going to install the patch in a day or two unless someone finds fault with my reasoning. Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University 2019-05-25 Rainer Orth <r...@cebitec.uni-bielefeld.de> * config/sparc/sol2-unwind.h [__arch64__] (sparc64_is_sighandler): Remove Solaris 9 and 10 support. (sparc_is_sighandler): Remove Solaris 9 and 10 support.
# HG changeset patch # Parent a471ac842743a60d92dc3c029ee68c655bb00142 Remove pre-Solaris 11/SPARC unwinding support diff --git a/libgcc/config/sparc/sol2-unwind.h b/libgcc/config/sparc/sol2-unwind.h --- a/libgcc/config/sparc/sol2-unwind.h +++ b/libgcc/config/sparc/sol2-unwind.h @@ -67,51 +67,7 @@ sparc64_is_sighandler (unsigned int *pc, libc.so.1: <call_user_handler+864>: mov %i1, %o1 - <call_user_handler+868>: call __sighndlr - - This is the same setup as for Solaris 10, see below. */ - *nframes = 3; - - else if (cuh_pattern == 0xd25fa7ef) - { - /* This matches the call_user_handler pattern in Solaris 10 - libc.so.1: - - <call_user_handler+988>: ldx [ %fp + 0x7ef ], %o1 - <call_user_handler+992>: call __sighndlr - - There are 2 cases so we look for the return address of the - caller's caller frame in order to do more pattern matching. */ - unsigned long sah_address = *(unsigned long *)(cfa + 176 + 15*8); - - if (sah_address && *(unsigned int *)(sah_address - 4) == 0x92100019) - /* We need to move up three frames: - - <signal handler> <-- context->cfa - __sighndlr - call_user_handler - sigacthandler - <kernel> */ - *nframes = 3; - else - /* The sigacthandler frame isn't present in the chain. - We need to move up two frames: - - <signal handler> <-- context->cfa - __sighndlr - call_user_handler - <kernel> */ - *nframes = 2; - } - - else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x9410001b) - /* This matches the call_user_handler pattern in Solaris 9 - libthread.so.1: - - <call_user_handler+600>: mov %i2, %o2 - <call_user_handler+604>: call __sighndlr - - This is the same setup as for Solaris 10, see above. */ + <call_user_handler+868>: call __sighndlr */ *nframes = 3; return 1; @@ -184,51 +140,7 @@ sparc_is_sighandler (unsigned int *pc, v libc.so.1: <call_user_handler+876>: mov %i1, %o1 - <call_user_handler+880>: call __sighndlr - - This is the same setup as for Solaris 10, see below. */ - *nframes = 3; - - else if (cuh_pattern == 0xd407a04c) - { - /* This matches the call_user_handler pattern in Solaris 10 - libc.so.1: - - <call_user_handler+948>: ld [ %fp + 0x4c ], %o2 - <call_user_handler+952>: call __sighndlr - - There are 2 cases so we look for the return address of the - caller's caller frame in order to do more pattern matching. */ - unsigned int sah_address = *(unsigned int *)(cfa + 96 + 15*4); - - if (sah_address && *(unsigned int *)(sah_address - 4) == 0x92100019) - /* We need to move up three frames: - - <signal handler> <-- context->cfa - __sighndlr - call_user_handler - sigacthandler - <kernel> */ - *nframes = 3; - else - /* The sigacthandler frame isn't present in the chain. - We need to move up two frames: - - <signal handler> <-- context->cfa - __sighndlr - call_user_handler - <kernel> */ - *nframes = 2; - } - - else if (cuh_pattern == 0x9410001a || cuh_pattern == 0x9410001b) - /* This matches the call_user_handler pattern in Solaris 9 - libthread.so.1: - - <call_user_handler+560>: mov %i2, %o2 - <call_user_handler+564>: call __sighndlr - - This is the same setup as for Solaris 10, see above. */ + <call_user_handler+880>: call __sighndlr */ *nframes = 3; return 1;