[multiple changes]
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. From-SVN: r230304
This commit is contained in:
parent
746fb0c5cd
commit
4e9ee5951c
5 changed files with 54 additions and 36 deletions
|
@ -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>
|
2015-11-13 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
* init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC,
|
* init.c [Darwin/arm64] (__gnat_sigtramp): Do not increment PC,
|
||||||
|
|
|
@ -2530,6 +2530,7 @@ __gnat_install_handler (void)
|
||||||
/*******************/
|
/*******************/
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <sys/ucontext.h>
|
||||||
#include "sigtramp.h"
|
#include "sigtramp.h"
|
||||||
|
|
||||||
#define HAVE_GNAT_ADJUST_CONTEXT_FOR_RAISE
|
#define HAVE_GNAT_ADJUST_CONTEXT_FOR_RAISE
|
||||||
|
|
|
@ -7296,7 +7296,8 @@ package body Sem_Ch4 is
|
||||||
|
|
||||||
-- If the indexed component is a prefix it may be the first actual
|
-- If the indexed component is a prefix it may be the first actual
|
||||||
-- of a prefixed call. Retrieve the called entity, if any, and
|
-- 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
|
elsif Nkind (Parent (Par)) = N_Selected_Component then
|
||||||
declare
|
declare
|
||||||
|
@ -7306,9 +7307,19 @@ package body Sem_Ch4 is
|
||||||
begin
|
begin
|
||||||
if Present (Nam)
|
if Present (Nam)
|
||||||
and then Is_Overloadable (Nam)
|
and then Is_Overloadable (Nam)
|
||||||
and then Present (First_Formal (Nam))
|
|
||||||
then
|
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 if;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
* ARM-Android version of the __gnat_sigtramp service *
|
* ARM-Android version of the __gnat_sigtramp service *
|
||||||
******************************************************/
|
******************************************************/
|
||||||
|
|
||||||
|
#include <sys/ucontext.h>
|
||||||
|
|
||||||
#include "sigtramp.h"
|
#include "sigtramp.h"
|
||||||
/* See sigtramp.h for a general explanation of functionality. */
|
/* See sigtramp.h for a general explanation of functionality. */
|
||||||
|
|
||||||
|
|
|
@ -29,44 +29,35 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* On targets where this is implemented, we resort to a signal handler
|
/* On targets where this is implemented, we resort to a signal trampoline to
|
||||||
trampoline to set-up the DWARF Call Frame Information that let unwinders
|
set up the DWARF Call Frame Information that lets unwinders walk through
|
||||||
walk through the signal frame up into the interrupted application code.
|
the signal frame up into the interrupted user code. This file introduces
|
||||||
This file introduces the relevant declarations. */
|
the relevant declarations. It should only be #included on targets that do
|
||||||
|
implement the signal trampoline. */
|
||||||
/* This file should only be #included on targets that do implement the
|
|
||||||
trampoline, which needs to expose the following interface: */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
/* This typedef signature sometimes conflicts with the sighandler_t from
|
||||||
#include <stdlib.h>
|
system headers so call it something unique. */
|
||||||
#include <sys/ucontext.h>
|
typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This typedef signature sometimes conflicts with the sighandler_t from
|
#if defined(__vxworks) && (CPU == SIMNT || CPU == SIMPENTIUM || CPU == SIMLINUX)
|
||||||
system headers so call it something unique. */
|
/* Vxsim requires a specially compiled handler. */
|
||||||
typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext);
|
extern void __gnat_sigtramp_vxsim (int signo, void *siginfo, void *sigcontext,
|
||||||
|
__sigtramphandler_t * handler);
|
||||||
#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);
|
|
||||||
#else
|
#else
|
||||||
void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext,
|
extern void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext,
|
||||||
__sigtramphandler_t * handler);
|
__sigtramphandler_t * handler);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* To be called from an established signal handler. Setup the DWARF CFI
|
/* The signal trampoline is to be called from an established signal handler.
|
||||||
bits letting unwinders walk through the signal frame up into the
|
It sets up the DWARF CFI and calls HANDLER (SIGNO, SIGINFO, SIGCONTEXT).
|
||||||
interrupted application code, and then call HANDLER (SIGNO, SIGINFO,
|
|
||||||
SIGCONTEXT).
|
|
||||||
|
|
||||||
The sigtramp construct makes it so that the unwinder jumps over it + the
|
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
|
signal handler + the kernel frame. For a typical backtrace from the raise
|
||||||
function:
|
function:
|
||||||
|
|
||||||
#0 __gnat_Unwind_RaiseException
|
#0 __gnat_Unwind_RaiseException
|
||||||
#1 Raise_From_Signal_Handler
|
#1 Raise_From_Signal_Handler
|
||||||
|
@ -76,11 +67,11 @@ extern "C" {
|
||||||
#5 <kernel frame>
|
#5 <kernel frame>
|
||||||
#6 interrupted function
|
#6 interrupted function
|
||||||
|
|
||||||
The unwinder will unwind frames 0, 1 and 2 as usual. But the CFI of frame
|
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
|
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
|
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
|
because the kernel has saved the context of frame 6 and passed it on to
|
||||||
__gnat_sigtramp. */
|
__gnat_error_handler and __gnat_sigtramp. */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue