aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog13
-rw-r--r--gcc/ada/init.c1
-rw-r--r--gcc/ada/sem_ch4.adb17
-rw-r--r--gcc/ada/sigtramp-armdroid.c2
-rw-r--r--gcc/ada/sigtramp.h57
5 files changed, 54 insertions, 36 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 22fa12f..90910ca 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,16 @@
+2015-11-13 Ed Schonberg <schonberg@adacore.com>
+
+ * 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 <ebotcazou@adacore.com>
+
+ * sigtramp.h: Fix formatting throughout, do not include other
+ headers, add missing preprocessor condition and 'extern' keywords.
+ * sigtramp-armdroid.c: Include <sys/ucontext.h>.
+ * init.c [Android]: Likewise.
+
2015-11-13 Eric Botcazou <ebotcazou@adacore.com>
* init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC,
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 65761b0..f0afc40 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -2530,6 +2530,7 @@ __gnat_install_handler (void)
/*******************/
#include <signal.h>
+#include <sys/ucontext.h>
#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 373c9e8..1b14550 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 a538064..d4f61b6 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 <sys/ucontext.h>
+
#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 7af6be3..930365f 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 <stdlib.h>
-#include <sys/ucontext.h>
-#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 <kernel frame>
#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
}