Rainer Orth <r...@cebitec.uni-bielefeld.de> writes:

> 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;

Wouldn't it be cleanest to adjust the prototype of __gnat_error_handler
to reality, and cast it when assigning to sa_handler (not sa_sigaction,
which is only valid if SA_SIGINFO is set)?

Andreas.

-- 
Andreas Schwab, sch...@redhat.com
GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84  5EC7 45C6 250E 6F00 984E
"And now for something completely different."

Reply via email to