111
|
1 /****************************************************************************
|
|
2 * *
|
|
3 * GNAT COMPILER COMPONENTS *
|
|
4 * *
|
|
5 * S I G T R A M P *
|
|
6 * *
|
|
7 * C Header File *
|
|
8 * *
|
131
|
9 * Copyright (C) 2011-2018, Free Software Foundation, Inc. *
|
111
|
10 * *
|
|
11 * GNAT is free software; you can redistribute it and/or modify it under *
|
|
12 * terms of the GNU General Public License as published by the Free Soft- *
|
|
13 * ware Foundation; either version 3, or (at your option) any later ver- *
|
|
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
|
|
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
|
|
16 * or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
17 * *
|
|
18 * As a special exception under Section 7 of GPL version 3, you are granted *
|
|
19 * additional permissions described in the GCC Runtime Library Exception, *
|
|
20 * version 3.1, as published by the Free Software Foundation. *
|
|
21 * *
|
|
22 * You should have received a copy of the GNU General Public License and *
|
|
23 * a copy of the GCC Runtime Library Exception along with this program; *
|
|
24 * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see *
|
|
25 * <http://www.gnu.org/licenses/>. *
|
|
26 * *
|
|
27 * GNAT was originally developed by the GNAT team at New York University. *
|
|
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
|
|
29 * *
|
|
30 ****************************************************************************/
|
|
31
|
|
32 /* On targets where this is implemented, we resort to a signal trampoline to
|
|
33 set up the DWARF Call Frame Information that lets unwinders walk through
|
|
34 the signal frame up into the interrupted user code. This file introduces
|
|
35 the relevant declarations. It should only be #included on targets that do
|
|
36 implement the signal trampoline. */
|
|
37
|
|
38 #ifdef __cplusplus
|
|
39 extern "C" {
|
|
40 #endif
|
|
41
|
|
42 /* This typedef signature sometimes conflicts with the sighandler_t from
|
|
43 system headers so call it something unique. */
|
|
44 typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext);
|
|
45
|
|
46 /* The vxsim target has a different sigcontext structure than the one we're
|
|
47 compiling the run-time with. We thus need to adjust it in this case */
|
|
48 #if defined(__vxworks) && (defined (__i386__) || defined (__x86_64__)) && !defined (VTHREADS)
|
|
49 #define __HANDLE_VXSIM_SC
|
|
50 extern void __gnat_set_is_vxsim(int val);
|
|
51 #endif
|
|
52
|
|
53 extern void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext,
|
|
54 __sigtramphandler_t * handler);
|
|
55
|
|
56 /* The signal trampoline is to be called from an established signal handler.
|
|
57 It sets up the DWARF CFI and calls HANDLER (SIGNO, SIGINFO, SIGCONTEXT).
|
|
58
|
|
59 The trampoline construct makes it so that the unwinder jumps over it + the
|
|
60 signal handler + the kernel frame. For a typical backtrace from the raise
|
|
61 function:
|
|
62
|
|
63 #0 __gnat_Unwind_RaiseException
|
|
64 #1 Raise_From_Signal_Handler
|
|
65 #2 __gnat_map_signal
|
|
66 #3 __gnat_sigtramp
|
|
67 #4 __gnat_error_handler
|
|
68 #5 <kernel frame>
|
|
69 #6 interrupted function
|
|
70
|
|
71 The unwinder will unwind frames 0, 1 and 2 as usual. But the CFI of frame
|
|
72 3 is set up as if the caller of frame 3 was frame 6 so, when frame 3 is
|
|
73 unwound, the unwinder ends up in frame 6 directly. It's possible to do so
|
|
74 because the kernel has saved the context of frame 6 and passed it on to
|
|
75 __gnat_error_handler and __gnat_sigtramp. */
|
|
76
|
|
77 #ifdef __cplusplus
|
|
78 }
|
|
79 #endif
|