annotate gcc/ada/sigtramp-qnx.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /****************************************************************************
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 * GNAT COMPILER COMPONENTS *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 * S I G T R A M P *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 * Asm Implementation File *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 * Copyright (C) 2017-2018, Free Software Foundation, Inc. *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 * GNAT is free software; you can redistribute it and/or modify it under *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 * terms of the GNU General Public License as published by the Free Soft- *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 * ware Foundation; either version 3, or (at your option) any later ver- *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 * sion. GNAT is distributed in the hope that it will be useful, but WITH- *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 * or FITNESS FOR A PARTICULAR PURPOSE. *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 * As a special exception under Section 7 of GPL version 3, you are granted *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 * additional permissions described in the GCC Runtime Library Exception, *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 * version 3.1, as published by the Free Software Foundation. *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 * In particular, you can freely distribute your programs built with the *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 * GNAT Pro compiler, including any required library run-time units, using *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 * any licensing terms of your choosing. See the AdaCore Software License *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 * for full details. *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 * GNAT was originally developed by the GNAT team at New York University. *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 * Extensive contributions were provided by Ada Core Technologies Inc. *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 * *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 ****************************************************************************/
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 /**********************************************
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 * QNX version of the __gnat_sigtramp service *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 **********************************************/
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 #include <ucontext.h>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 #include "sigtramp.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 /* See sigtramp.h for a general explanation of functionality. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 extern void __gnat_sigtramp_common
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 (int signo, void *siginfo, void *sigcontext,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 __sigtramphandler_t * handler);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 void __gnat_sigtramp (int signo, void *si, void *sc,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 __sigtramphandler_t * handler)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 __attribute__((optimize(2)));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 void __gnat_sigtramp (int signo, void *si, void *ucontext,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 __sigtramphandler_t * handler)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 struct sigcontext *mcontext = &((ucontext_t *) ucontext)->uc_mcontext;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 __gnat_sigtramp_common (signo, si, mcontext, handler);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 /* asm string construction helpers. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 #define STR(TEXT) #TEXT
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 /* stringify expanded TEXT, surrounding it with double quotes. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 #define S(E) STR(E)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 /* stringify E, which will resolve as text but may contain macros
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 still to be expanded. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 /* asm (TEXT) outputs <tab>TEXT. These facilitate the output of
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 multiline contents: */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 #define TAB(S) "\t" S
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 #define CR(S) S "\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 #undef TCR
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 #define TCR(S) TAB(CR(S))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 /* Trampoline body block
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 --------------------- */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 #define COMMON_CFI(REG) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 ".cfi_offset " S(REGNO_##REG) "," S(REG_OFFSET_##REG)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 #ifdef __x86_64__
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 /*****************************************
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 * x86-64 *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 *****************************************/
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 // CFI register numbers
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 #define REGNO_RAX 0
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 #define REGNO_RDX 1
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 #define REGNO_RCX 2
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 #define REGNO_RBX 3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 #define REGNO_RSI 4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 #define REGNO_RDI 5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 #define REGNO_RBP 6
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 #define REGNO_RSP 7
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 #define REGNO_R8 8
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 #define REGNO_R9 9
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 #define REGNO_R10 10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 #define REGNO_R11 11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 #define REGNO_R12 12
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 #define REGNO_R13 13
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 #define REGNO_R14 14
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 #define REGNO_R15 15 /* Used as CFA */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 #define REGNO_RPC 16 /* aka %rip */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 // Registers offset from the regset structure
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 #define REG_OFFSET_RDI 0x00
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 #define REG_OFFSET_RSI 0x08
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 #define REG_OFFSET_RDX 0x10
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 #define REG_OFFSET_R10 0x18
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 #define REG_OFFSET_R8 0x20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 #define REG_OFFSET_R9 0x28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 #define REG_OFFSET_RAX 0x30
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 #define REG_OFFSET_RBX 0x38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 #define REG_OFFSET_RBP 0x40
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 #define REG_OFFSET_RCX 0x48
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 #define REG_OFFSET_R11 0x50
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 #define REG_OFFSET_R12 0x58
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 #define REG_OFFSET_R13 0x60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 #define REG_OFFSET_R14 0x68
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 #define REG_OFFSET_R15 0x70
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 #define REG_OFFSET_RPC 0x78 /* RIP */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 #define REG_OFFSET_RSP 0x90
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 #define CFI_COMMON_REGS \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 CR("# CFI for common registers\n") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 TCR(COMMON_CFI(RSP)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 TCR(COMMON_CFI(R15)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 TCR(COMMON_CFI(R14)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 TCR(COMMON_CFI(R13)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 TCR(COMMON_CFI(R12)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 TCR(COMMON_CFI(R11)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 TCR(COMMON_CFI(RCX)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 TCR(COMMON_CFI(RBP)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 TCR(COMMON_CFI(RBX)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 TCR(COMMON_CFI(RAX)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 TCR(COMMON_CFI(R9)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 TCR(COMMON_CFI(R8)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 TCR(COMMON_CFI(R10)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 TCR(COMMON_CFI(RSI)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 TCR(COMMON_CFI(RDI)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 TCR(COMMON_CFI(RDX)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 TCR(COMMON_CFI(RPC)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 TCR(".cfi_return_column " S(REGNO_RPC))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 #define SIGTRAMP_BODY \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 TCR(".cfi_def_cfa 15, 0") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 CFI_COMMON_REGS \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 CR("") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 TCR("# Allocate frame and save the non-volatile") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 TCR("# registers we're going to modify") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 TCR("subq $8, %rsp") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 TCR("# Setup CFA_REG = context, which we'll retrieve as our CFA value") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 TCR("movq %rdx, %r15") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 TCR("# Call the real handler. The signo, siginfo and sigcontext") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 TCR("# arguments are the same as those we received") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 TCR("call *%rcx") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 TCR("# This part should never be executed") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 TCR("addq $8, %rsp") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 TCR("ret")
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 #ifdef __aarch64__
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 /*****************************************
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 * Aarch64 *
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 *****************************************/
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 /* CFA reg: any callee saved register will do */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 #define CFA_REG 19
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 /* General purpose registers */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 #define REG_OFFSET_GR(n) (n * 8)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 #define REGNO_GR(n) n
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 /* ELR value offset withing the mcontext registers list */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 #define REG_OFFSET_ELR (32 * 8)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 /* The register used to hold the PC value to restore. We need a scratch
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 register. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 #define REGNO_PC 9
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 #define CFI_DEF_CFA \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180 TCR(".cfi_def_cfa " S(CFA_REG) ", 0")
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 /* This restores the callee-saved registers, the FP, the LR, and the SP.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 A scratch register is used as return column to indicate the new value
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 for PC */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 #define CFI_COMMON_REGS \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 CR("# CFI for common registers\n") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 TCR(COMMON_CFI(GR(18))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188 TCR(COMMON_CFI(GR(19))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 TCR(COMMON_CFI(GR(20))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 TCR(COMMON_CFI(GR(21))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 TCR(COMMON_CFI(GR(22))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192 TCR(COMMON_CFI(GR(23))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 TCR(COMMON_CFI(GR(24))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 TCR(COMMON_CFI(GR(25))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195 TCR(COMMON_CFI(GR(26))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 TCR(COMMON_CFI(GR(27))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 TCR(COMMON_CFI(GR(28))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 TCR(COMMON_CFI(GR(29))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199 TCR(COMMON_CFI(GR(30))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 TCR(COMMON_CFI(GR(31))) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 TCR(".cfi_offset " S(REGNO_PC) "," S(REG_OFFSET_ELR)) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 TCR(".cfi_return_column " S(REGNO_PC))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 #define SIGTRAMP_BODY \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 CFI_DEF_CFA \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 CFI_COMMON_REGS \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207 TCR("# Allocate the frame (16bytes aligned) and push FP and LR") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 TCR("stp x29, x30, [sp, #-32]!") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209 TCR("add x29, sp, 0") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 TCR("# Push register used to hold the CFA on stack") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 TCR("str x" S(CFA_REG) ", [sp, 16]") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 TCR("# Set the CFA: x2 value") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213 TCR("mov x" S(CFA_REG) ", x2") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214 TCR("# Call the handler") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 TCR("blr x3") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 TCR("# Release our frame and return (should never get here!).") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 TCR("ldr x" S(CFA_REG) ", [sp, 16]") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218 TCR("ldp x29, x30, [sp], 32") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 TCR("ret")
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 #endif /* AARCH64 */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 /* Symbol definition block
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224 ----------------------- */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 #if defined (__x86_64__) || defined (__aarch64__)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 #define FUNC_ALIGN TCR(".p2align 4,,15")
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228 #else
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 #define FUNC_ALIGN
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 #define SIGTRAMP_START(SYM) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 CR("# " S(SYM) " cfi trampoline") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 TCR(".type " S(SYM) ", @function") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 CR("") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236 FUNC_ALIGN \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 CR(S(SYM) ":") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 TCR(".cfi_startproc") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239 TCR(".cfi_signal_frame")
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 /* Symbol termination block
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 ------------------------ */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 #define SIGTRAMP_END(SYM) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 CR(".cfi_endproc") \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246 TCR(".size " S(SYM) ", .-" S(SYM))
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 /*----------------------------
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249 -- And now, the real code --
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 ---------------------------- */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 /* Text section start. The compiler isn't aware of that switch. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 asm (".text\n"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 TCR(".align 2"));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 /* sigtramp stub for common registers. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259 #define TRAMP_COMMON __gnat_sigtramp_common
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261 asm (SIGTRAMP_START(TRAMP_COMMON));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 asm (SIGTRAMP_BODY);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263 asm (SIGTRAMP_END(TRAMP_COMMON));