Eric Botcazou <ebotca...@adacore.com> writes: >> That's what I did in my last patch, but without SA_SIGINFO set. This >> doesn't work since the additional args passed in the sa_handler case are >> not in any prototype, to g++ rightly complains (and this is an >> implementation detail I'd not rely upon if it can be avoided). > > OK, I see, so there is a single prototype for the 2 variants with 3 args.
Right. Even if I can cope with that, I haven't been able to extract all the required info (pc, gregs, fpregs) from ucontext_t/mcontext_t with SA_SIGINFO set. Besides, it doesn't seem possible to distinguish between the two cases (sa_handler/sa_sigaction). Therefore I went back for the following hack, adding comments to explain why it is necessary. Bootstrapped without regressions on mips-sgi-irix6.5, all signal handling failures introduced by my previous patch are gone again. Ok for mainline? Rainer 2011-07-26 Rainer Orth <r...@cebitec.uni-bielefeld.de> * init.c (__gnat_error_handler): Cast reason to int. (__gnat_install_handler): Explain sa_sigaction use. diff --git a/gcc/ada/init.c b/gcc/ada/init.c --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -787,7 +787,11 @@ extern struct Exception_Data _abort_sign static void __gnat_error_handler (int sig, siginfo_t *reason, void *uc ATTRIBUTE_UNUSED) { - int code = reason == NULL ? 0 : reason->si_code; + /* This handler is installed with SA_SIGINFO cleared, but there's no + prototype for the resulting alternative three-argument form, so we + have to hack around this by casting reason to the int actually + passed. */ + int code = (int) reason; struct Exception_Data *exception; const char *msg; @@ -872,7 +876,11 @@ __gnat_install_handler (void) /* Setup signal handler to map synchronous signals to appropriate exceptions. Make sure that the handler isn't interrupted by another - signal that might cause a scheduling event! */ + signal that might cause a scheduling event! + + The handler is installed with SA_SIGINFO cleared, but there's no + C++ prototype for the three-argument form, so fake it by using + sa_sigaction and casting the arguments instead. */ act.sa_sigaction = __gnat_error_handler; act.sa_flags = SA_NODEFER + SA_RESTART; -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University