From 4e9ee5951c4be406f440245583ee8770a5807e2a Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Fri, 13 Nov 2015 12:18:17 +0100 Subject: [PATCH] [multiple changes] 2015-11-13 Ed Schonberg * sem_ch4.adb (Constant_Indexing_OK): If the indexing is the prefix of a procedure call assume that constant indexing is not chosen. 2015-11-13 Eric Botcazou * sigtramp.h: Fix formatting throughout, do not include other headers, add missing preprocessor condition and 'extern' keywords. * sigtramp-armdroid.c: Include . * init.c [Android]: Likewise. From-SVN: r230304 --- gcc/ada/ChangeLog | 13 +++++++++ gcc/ada/init.c | 1 + gcc/ada/sem_ch4.adb | 17 +++++++++-- gcc/ada/sigtramp-armdroid.c | 2 ++ gcc/ada/sigtramp.h | 57 ++++++++++++++++--------------------- 5 files changed, 54 insertions(+), 36 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 22fa12f8083..90910ca0909 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,16 @@ +2015-11-13 Ed Schonberg + + * sem_ch4.adb (Constant_Indexing_OK): If the indexing is the + prefix of a procedure call assume that constant indexing is + not chosen. + +2015-11-13 Eric Botcazou + + * sigtramp.h: Fix formatting throughout, do not include other + headers, add missing preprocessor condition and 'extern' keywords. + * sigtramp-armdroid.c: Include . + * init.c [Android]: Likewise. + 2015-11-13 Eric Botcazou * init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC, diff --git a/gcc/ada/init.c b/gcc/ada/init.c index 65761b01873..f0afc406454 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -2530,6 +2530,7 @@ __gnat_install_handler (void) /*******************/ #include +#include #include "sigtramp.h" #define HAVE_GNAT_ADJUST_CONTEXT_FOR_RAISE diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 373c9e86fae..1b14550ba74 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -7296,7 +7296,8 @@ package body Sem_Ch4 is -- If the indexed component is a prefix it may be the first actual -- of a prefixed call. Retrieve the called entity, if any, and - -- check its first formal. + -- check its first formal. Determine if the context is a procedure + -- or function call. elsif Nkind (Parent (Par)) = N_Selected_Component then declare @@ -7306,9 +7307,19 @@ package body Sem_Ch4 is begin if Present (Nam) and then Is_Overloadable (Nam) - and then Present (First_Formal (Nam)) then - return Ekind (First_Formal (Nam)) = E_In_Parameter; + if Nkind (Parent (Parent (Par))) + = N_Procedure_Call_Statement + then + return False; + + else + if Ekind (Nam) = E_Function + and then Present (First_Formal (Nam)) + then + return Ekind (First_Formal (Nam)) = E_In_Parameter; + end if; + end if; end if; end; diff --git a/gcc/ada/sigtramp-armdroid.c b/gcc/ada/sigtramp-armdroid.c index a538064375a..d4f61b6e4e4 100644 --- a/gcc/ada/sigtramp-armdroid.c +++ b/gcc/ada/sigtramp-armdroid.c @@ -33,6 +33,8 @@ * ARM-Android version of the __gnat_sigtramp service * ******************************************************/ +#include + #include "sigtramp.h" /* See sigtramp.h for a general explanation of functionality. */ diff --git a/gcc/ada/sigtramp.h b/gcc/ada/sigtramp.h index 7af6be3466c..930365f8d57 100644 --- a/gcc/ada/sigtramp.h +++ b/gcc/ada/sigtramp.h @@ -29,44 +29,35 @@ * * ****************************************************************************/ -/* On targets where this is implemented, we resort to a signal handler - trampoline to set-up the DWARF Call Frame Information that let unwinders - walk through the signal frame up into the interrupted application code. - This file introduces the relevant declarations. */ - -/* This file should only be #included on targets that do implement the - trampoline, which needs to expose the following interface: */ +/* On targets where this is implemented, we resort to a signal trampoline to + set up the DWARF Call Frame Information that lets unwinders walk through + the signal frame up into the interrupted user code. This file introduces + the relevant declarations. It should only be #included on targets that do + implement the signal trampoline. */ #ifdef __cplusplus extern "C" { #endif -#ifdef __ANDROID__ -#include -#include -#endif - - /* This typedef signature sometimes conflicts with the sighandler_t from - system headers so call it something unique. */ - typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext); +/* This typedef signature sometimes conflicts with the sighandler_t from + system headers so call it something unique. */ +typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext); -#if CPU == SIMNT || CPU == SIMPENTIUM || CPU == SIMLINUX - /* Vxsim requires a specially compiled handler. */ - void __gnat_sigtramp_vxsim (int signo, void *siginfo, void *sigcontext, - __sigtramphandler_t * handler); +#if defined(__vxworks) && (CPU == SIMNT || CPU == SIMPENTIUM || CPU == SIMLINUX) +/* Vxsim requires a specially compiled handler. */ +extern void __gnat_sigtramp_vxsim (int signo, void *siginfo, void *sigcontext, + __sigtramphandler_t * handler); #else - void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext, - __sigtramphandler_t * handler); +extern void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext, + __sigtramphandler_t * handler); #endif - /* To be called from an established signal handler. Setup the DWARF CFI - bits letting unwinders walk through the signal frame up into the - interrupted application code, and then call HANDLER (SIGNO, SIGINFO, - SIGCONTEXT). +/* The signal trampoline is to be called from an established signal handler. + It sets up the DWARF CFI and calls HANDLER (SIGNO, SIGINFO, SIGCONTEXT). - The sigtramp construct makes it so that the unwinder jumps over it + the - signal handler + the kernel frame. For a typical backtrace from the raise - function: + The trampoline construct makes it so that the unwinder jumps over it + the + signal handler + the kernel frame. For a typical backtrace from the raise + function: #0 __gnat_Unwind_RaiseException #1 Raise_From_Signal_Handler @@ -76,11 +67,11 @@ extern "C" { #5 #6 interrupted function - The unwinder will unwind frames 0, 1 and 2 as usual. But the CFI of frame - 3 is set up as if the caller of frame 3 was frame 6 so, when frame 3 is - unwound, the unwinder ends up in frame 6 directly. It's possible to do so - since the kernel has saved the context of frame 6 and passed it on to - __gnat_sigtramp. */ + The unwinder will unwind frames 0, 1 and 2 as usual. But the CFI of frame + 3 is set up as if the caller of frame 3 was frame 6 so, when frame 3 is + unwound, the unwinder ends up in frame 6 directly. It's possible to do so + because the kernel has saved the context of frame 6 and passed it on to + __gnat_error_handler and __gnat_sigtramp. */ #ifdef __cplusplus } -- 2.30.2