unwind-dw2.c revision 1.11 1 1.1 mrg /* DWARF2 exception handling and frame unwind runtime interface routines.
2 1.11 mrg Copyright (C) 1997-2024 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify it
7 1.1 mrg under the terms of the GNU General Public License as published by
8 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
9 1.1 mrg any later version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT
12 1.1 mrg ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 1.1 mrg License for more details.
15 1.1 mrg
16 1.1 mrg Under Section 7 of GPL version 3, you are granted additional
17 1.1 mrg permissions described in the GCC Runtime Library Exception, version
18 1.1 mrg 3.1, as published by the Free Software Foundation.
19 1.1 mrg
20 1.1 mrg You should have received a copy of the GNU General Public License and
21 1.1 mrg a copy of the GCC Runtime Library Exception along with this program;
22 1.1 mrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 1.1 mrg <http://www.gnu.org/licenses/>. */
24 1.1 mrg
25 1.1 mrg #include "tconfig.h"
26 1.1 mrg #include "tsystem.h"
27 1.1 mrg #include "coretypes.h"
28 1.1 mrg #include "tm.h"
29 1.1 mrg #include "libgcc_tm.h"
30 1.1 mrg #include "dwarf2.h"
31 1.1 mrg #include "unwind.h"
32 1.1 mrg #ifdef __USING_SJLJ_EXCEPTIONS__
33 1.1 mrg # define NO_SIZE_OF_ENCODED_VALUE
34 1.1 mrg #endif
35 1.1 mrg #include "unwind-pe.h"
36 1.1 mrg #include "unwind-dw2-fde.h"
37 1.1 mrg #include "gthr.h"
38 1.1 mrg #include "unwind-dw2.h"
39 1.11 mrg #include <stddef.h>
40 1.1 mrg
41 1.1 mrg #ifdef HAVE_SYS_SDT_H
42 1.1 mrg #include <sys/sdt.h>
43 1.1 mrg #endif
44 1.1 mrg
45 1.1 mrg #ifndef __USING_SJLJ_EXCEPTIONS__
46 1.1 mrg
47 1.4 mrg #ifndef __LIBGCC_STACK_GROWS_DOWNWARD__
48 1.4 mrg #define __LIBGCC_STACK_GROWS_DOWNWARD__ 0
49 1.1 mrg #else
50 1.4 mrg #undef __LIBGCC_STACK_GROWS_DOWNWARD__
51 1.4 mrg #define __LIBGCC_STACK_GROWS_DOWNWARD__ 1
52 1.1 mrg #endif
53 1.1 mrg
54 1.1 mrg /* Dwarf frame registers used for pre gcc 3.0 compiled glibc. */
55 1.1 mrg #ifndef PRE_GCC3_DWARF_FRAME_REGISTERS
56 1.4 mrg #define PRE_GCC3_DWARF_FRAME_REGISTERS __LIBGCC_DWARF_FRAME_REGISTERS__
57 1.1 mrg #endif
58 1.1 mrg
59 1.1 mrg /* ??? For the public function interfaces, we tend to gcc_assert that the
60 1.1 mrg column numbers are in range. For the dwarf2 unwind info this does happen,
61 1.1 mrg although so far in a case that doesn't actually matter.
62 1.1 mrg
63 1.1 mrg See PR49146, in which a call from x86_64 ms abi to x86_64 unix abi stores
64 1.1 mrg the call-saved xmm registers and annotates them. We havn't bothered
65 1.1 mrg providing support for the xmm registers for the x86_64 port primarily
66 1.1 mrg because the 64-bit windows targets don't use dwarf2 unwind, using sjlj or
67 1.1 mrg SEH instead. Adding the support for unix targets would generally be a
68 1.1 mrg waste. However, some runtime libraries supplied with ICC do contain such
69 1.1 mrg an unorthodox transition, as well as the unwind info to match. This loss
70 1.1 mrg of register restoration doesn't matter in practice, because the exception
71 1.1 mrg is caught in the native unix abi, where all of the xmm registers are
72 1.1 mrg call clobbered.
73 1.1 mrg
74 1.1 mrg Ideally, we'd record some bit to notice when we're failing to restore some
75 1.1 mrg register recorded in the unwind info, but to do that we need annotation on
76 1.1 mrg the unix->ms abi edge, so that we know when the register data may be
77 1.1 mrg discarded. And since this edge is also within the ICC library, we're
78 1.1 mrg unlikely to be able to get the new annotation.
79 1.1 mrg
80 1.1 mrg Barring a magic solution to restore the ms abi defined 128-bit xmm registers
81 1.1 mrg (as distictly opposed to the full runtime width) without causing extra
82 1.1 mrg overhead for normal unix abis, the best solution seems to be to simply
83 1.1 mrg ignore unwind data for unknown columns. */
84 1.1 mrg
85 1.1 mrg #define UNWIND_COLUMN_IN_RANGE(x) \
86 1.4 mrg __builtin_expect((x) <= __LIBGCC_DWARF_FRAME_REGISTERS__, 1)
87 1.1 mrg
88 1.1 mrg #ifdef REG_VALUE_IN_UNWIND_CONTEXT
89 1.1 mrg typedef _Unwind_Word _Unwind_Context_Reg_Val;
90 1.1 mrg
91 1.1 mrg #ifndef ASSUME_EXTENDED_UNWIND_CONTEXT
92 1.1 mrg #define ASSUME_EXTENDED_UNWIND_CONTEXT 1
93 1.1 mrg #endif
94 1.1 mrg
95 1.1 mrg static inline _Unwind_Word
96 1.1 mrg _Unwind_Get_Unwind_Word (_Unwind_Context_Reg_Val val)
97 1.1 mrg {
98 1.1 mrg return val;
99 1.1 mrg }
100 1.1 mrg
101 1.1 mrg static inline _Unwind_Context_Reg_Val
102 1.1 mrg _Unwind_Get_Unwind_Context_Reg_Val (_Unwind_Word val)
103 1.1 mrg {
104 1.1 mrg return val;
105 1.1 mrg }
106 1.1 mrg #else
107 1.1 mrg typedef void *_Unwind_Context_Reg_Val;
108 1.1 mrg
109 1.1 mrg static inline _Unwind_Word
110 1.1 mrg _Unwind_Get_Unwind_Word (_Unwind_Context_Reg_Val val)
111 1.1 mrg {
112 1.1 mrg return (_Unwind_Word) (_Unwind_Internal_Ptr) val;
113 1.1 mrg }
114 1.1 mrg
115 1.1 mrg static inline _Unwind_Context_Reg_Val
116 1.1 mrg _Unwind_Get_Unwind_Context_Reg_Val (_Unwind_Word val)
117 1.1 mrg {
118 1.1 mrg return (_Unwind_Context_Reg_Val) (_Unwind_Internal_Ptr) val;
119 1.1 mrg }
120 1.1 mrg #endif
121 1.1 mrg
122 1.1 mrg #ifndef ASSUME_EXTENDED_UNWIND_CONTEXT
123 1.1 mrg #define ASSUME_EXTENDED_UNWIND_CONTEXT 0
124 1.1 mrg #endif
125 1.1 mrg
126 1.1 mrg /* This is the register and unwind state for a particular frame. This
127 1.1 mrg provides the information necessary to unwind up past a frame and return
128 1.1 mrg to its caller. */
129 1.1 mrg struct _Unwind_Context
130 1.1 mrg {
131 1.4 mrg _Unwind_Context_Reg_Val reg[__LIBGCC_DWARF_FRAME_REGISTERS__+1];
132 1.1 mrg void *cfa;
133 1.1 mrg void *ra;
134 1.1 mrg void *lsda;
135 1.1 mrg struct dwarf_eh_bases bases;
136 1.1 mrg /* Signal frame context. */
137 1.1 mrg #define SIGNAL_FRAME_BIT ((~(_Unwind_Word) 0 >> 1) + 1)
138 1.1 mrg /* Context which has version/args_size/by_value fields. */
139 1.1 mrg #define EXTENDED_CONTEXT_BIT ((~(_Unwind_Word) 0 >> 2) + 1)
140 1.1 mrg _Unwind_Word flags;
141 1.1 mrg /* 0 for now, can be increased when further fields are added to
142 1.1 mrg struct _Unwind_Context. */
143 1.1 mrg _Unwind_Word version;
144 1.1 mrg _Unwind_Word args_size;
145 1.4 mrg char by_value[__LIBGCC_DWARF_FRAME_REGISTERS__+1];
146 1.1 mrg };
147 1.1 mrg
148 1.1 mrg /* Byte size of every register managed by these routines. */
149 1.4 mrg static unsigned char dwarf_reg_size_table[__LIBGCC_DWARF_FRAME_REGISTERS__+1];
150 1.1 mrg
151 1.1 mrg
152 1.1 mrg /* Read unaligned data from the instruction buffer. */
154 1.1 mrg
155 1.1 mrg union unaligned
156 1.1 mrg {
157 1.1 mrg void *p;
158 1.1 mrg unsigned u2 __attribute__ ((mode (HI)));
159 1.1 mrg unsigned u4 __attribute__ ((mode (SI)));
160 1.1 mrg unsigned u8 __attribute__ ((mode (DI)));
161 1.1 mrg signed s2 __attribute__ ((mode (HI)));
162 1.1 mrg signed s4 __attribute__ ((mode (SI)));
163 1.1 mrg signed s8 __attribute__ ((mode (DI)));
164 1.1 mrg } __attribute__ ((packed));
165 1.1 mrg
166 1.1 mrg static void uw_update_context (struct _Unwind_Context *, _Unwind_FrameState *);
167 1.1 mrg static _Unwind_Reason_Code uw_frame_state_for (struct _Unwind_Context *,
168 1.1 mrg _Unwind_FrameState *);
169 1.1 mrg
170 1.1 mrg static inline void *
171 1.1 mrg read_pointer (const void *p) { const union unaligned *up = p; return up->p; }
172 1.1 mrg
173 1.1 mrg static inline int
174 1.1 mrg read_1u (const void *p) { return *(const unsigned char *) p; }
175 1.1 mrg
176 1.1 mrg static inline int
177 1.1 mrg read_1s (const void *p) { return *(const signed char *) p; }
178 1.1 mrg
179 1.1 mrg static inline int
180 1.1 mrg read_2u (const void *p) { const union unaligned *up = p; return up->u2; }
181 1.1 mrg
182 1.1 mrg static inline int
183 1.1 mrg read_2s (const void *p) { const union unaligned *up = p; return up->s2; }
184 1.1 mrg
185 1.1 mrg static inline unsigned int
186 1.1 mrg read_4u (const void *p) { const union unaligned *up = p; return up->u4; }
187 1.1 mrg
188 1.1 mrg static inline int
189 1.1 mrg read_4s (const void *p) { const union unaligned *up = p; return up->s4; }
190 1.1 mrg
191 1.1 mrg static inline unsigned long
192 1.1 mrg read_8u (const void *p) { const union unaligned *up = p; return up->u8; }
193 1.1 mrg
194 1.1 mrg static inline unsigned long
195 1.1 mrg read_8s (const void *p) { const union unaligned *up = p; return up->s8; }
196 1.1 mrg
197 1.1 mrg static inline _Unwind_Word
199 1.1 mrg _Unwind_IsSignalFrame (struct _Unwind_Context *context)
200 1.1 mrg {
201 1.1 mrg return (context->flags & SIGNAL_FRAME_BIT) ? 1 : 0;
202 1.1 mrg }
203 1.1 mrg
204 1.1 mrg static inline void
205 1.1 mrg _Unwind_SetSignalFrame (struct _Unwind_Context *context, int val)
206 1.1 mrg {
207 1.1 mrg if (val)
208 1.1 mrg context->flags |= SIGNAL_FRAME_BIT;
209 1.1 mrg else
210 1.1 mrg context->flags &= ~SIGNAL_FRAME_BIT;
211 1.1 mrg }
212 1.1 mrg
213 1.1 mrg static inline _Unwind_Word
214 1.1 mrg _Unwind_IsExtendedContext (struct _Unwind_Context *context)
215 1.1 mrg {
216 1.1 mrg return (ASSUME_EXTENDED_UNWIND_CONTEXT
217 1.1 mrg || (context->flags & EXTENDED_CONTEXT_BIT));
218 1.7 mrg }
219 1.1 mrg
220 1.1 mrg /* Get the value of register REGNO as saved in CONTEXT. */
222 1.1 mrg
223 1.7 mrg inline _Unwind_Word
224 1.1 mrg _Unwind_GetGR (struct _Unwind_Context *context, int regno)
225 1.1 mrg {
226 1.1 mrg int size, index;
227 1.7 mrg _Unwind_Context_Reg_Val val;
228 1.1 mrg
229 1.1 mrg #ifdef DWARF_ZERO_REG
230 1.1 mrg if (regno == DWARF_ZERO_REG)
231 1.7 mrg return 0;
232 1.1 mrg #endif
233 1.1 mrg
234 1.1 mrg index = DWARF_REG_TO_UNWIND_COLUMN (regno);
235 1.1 mrg gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
236 1.1 mrg size = dwarf_reg_size_table[index];
237 1.1 mrg val = context->reg[index];
238 1.1 mrg
239 1.7 mrg if (_Unwind_IsExtendedContext (context) && context->by_value[index])
240 1.7 mrg return _Unwind_Get_Unwind_Word (val);
241 1.7 mrg
242 1.7 mrg #ifdef DWARF_LAZY_REGISTER_VALUE
243 1.7 mrg {
244 1.7 mrg _Unwind_Word value;
245 1.7 mrg if (DWARF_LAZY_REGISTER_VALUE (regno, &value))
246 1.7 mrg return value;
247 1.1 mrg }
248 1.1 mrg #endif
249 1.1 mrg
250 1.1 mrg /* This will segfault if the register hasn't been saved. */
251 1.1 mrg if (size == sizeof(_Unwind_Ptr))
252 1.1 mrg return * (_Unwind_Ptr *) (_Unwind_Internal_Ptr) val;
253 1.1 mrg else
254 1.1 mrg {
255 1.1 mrg gcc_assert (size == sizeof(_Unwind_Word));
256 1.1 mrg return * (_Unwind_Word *) (_Unwind_Internal_Ptr) val;
257 1.1 mrg }
258 1.1 mrg }
259 1.1 mrg
260 1.1 mrg static inline void *
261 1.1 mrg _Unwind_GetPtr (struct _Unwind_Context *context, int index)
262 1.1 mrg {
263 1.1 mrg return (void *)(_Unwind_Ptr) _Unwind_GetGR (context, index);
264 1.1 mrg }
265 1.1 mrg
266 1.1 mrg /* Get the value of the CFA as saved in CONTEXT. */
267 1.1 mrg
268 1.1 mrg _Unwind_Word
269 1.1 mrg _Unwind_GetCFA (struct _Unwind_Context *context)
270 1.1 mrg {
271 1.1 mrg return (_Unwind_Ptr) context->cfa;
272 1.1 mrg }
273 1.1 mrg
274 1.1 mrg /* Overwrite the saved value for register INDEX in CONTEXT with VAL. */
275 1.1 mrg
276 1.1 mrg inline void
277 1.1 mrg _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
278 1.1 mrg {
279 1.1 mrg int size;
280 1.1 mrg void *ptr;
281 1.1 mrg
282 1.1 mrg index = DWARF_REG_TO_UNWIND_COLUMN (index);
283 1.1 mrg gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
284 1.1 mrg size = dwarf_reg_size_table[index];
285 1.1 mrg
286 1.1 mrg if (_Unwind_IsExtendedContext (context) && context->by_value[index])
287 1.1 mrg {
288 1.1 mrg context->reg[index] = _Unwind_Get_Unwind_Context_Reg_Val (val);
289 1.1 mrg return;
290 1.1 mrg }
291 1.1 mrg
292 1.1 mrg ptr = (void *) (_Unwind_Internal_Ptr) context->reg[index];
293 1.1 mrg
294 1.1 mrg if (size == sizeof(_Unwind_Ptr))
295 1.1 mrg * (_Unwind_Ptr *) ptr = val;
296 1.1 mrg else
297 1.1 mrg {
298 1.1 mrg gcc_assert (size == sizeof(_Unwind_Word));
299 1.1 mrg * (_Unwind_Word *) ptr = val;
300 1.1 mrg }
301 1.1 mrg }
302 1.1 mrg
303 1.1 mrg /* Get the pointer to a register INDEX as saved in CONTEXT. */
304 1.1 mrg
305 1.1 mrg static inline void *
306 1.1 mrg _Unwind_GetGRPtr (struct _Unwind_Context *context, int index)
307 1.1 mrg {
308 1.1 mrg index = DWARF_REG_TO_UNWIND_COLUMN (index);
309 1.1 mrg if (_Unwind_IsExtendedContext (context) && context->by_value[index])
310 1.1 mrg return &context->reg[index];
311 1.1 mrg return (void *) (_Unwind_Internal_Ptr) context->reg[index];
312 1.1 mrg }
313 1.1 mrg
314 1.1 mrg /* Set the pointer to a register INDEX as saved in CONTEXT. */
315 1.1 mrg
316 1.1 mrg static inline void
317 1.1 mrg _Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p)
318 1.1 mrg {
319 1.1 mrg index = DWARF_REG_TO_UNWIND_COLUMN (index);
320 1.1 mrg if (_Unwind_IsExtendedContext (context))
321 1.1 mrg context->by_value[index] = 0;
322 1.1 mrg context->reg[index] = (_Unwind_Context_Reg_Val) (_Unwind_Internal_Ptr) p;
323 1.1 mrg }
324 1.1 mrg
325 1.1 mrg /* Overwrite the saved value for register INDEX in CONTEXT with VAL. */
326 1.1 mrg
327 1.1 mrg static inline void
328 1.1 mrg _Unwind_SetGRValue (struct _Unwind_Context *context, int index,
329 1.1 mrg _Unwind_Word val)
330 1.1 mrg {
331 1.1 mrg index = DWARF_REG_TO_UNWIND_COLUMN (index);
332 1.1 mrg gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
333 1.1 mrg /* Return column size may be smaller than _Unwind_Context_Reg_Val. */
334 1.1 mrg gcc_assert (dwarf_reg_size_table[index] <= sizeof (_Unwind_Context_Reg_Val));
335 1.1 mrg
336 1.1 mrg context->by_value[index] = 1;
337 1.1 mrg context->reg[index] = _Unwind_Get_Unwind_Context_Reg_Val (val);
338 1.1 mrg }
339 1.1 mrg
340 1.1 mrg /* Return nonzero if register INDEX is stored by value rather than
341 1.1 mrg by reference. */
342 1.1 mrg
343 1.1 mrg static inline int
344 1.1 mrg _Unwind_GRByValue (struct _Unwind_Context *context, int index)
345 1.1 mrg {
346 1.1 mrg index = DWARF_REG_TO_UNWIND_COLUMN (index);
347 1.1 mrg return context->by_value[index];
348 1.1 mrg }
349 1.1 mrg
350 1.1 mrg /* Retrieve the return address for CONTEXT. */
351 1.1 mrg
352 1.1 mrg inline _Unwind_Ptr
353 1.1 mrg _Unwind_GetIP (struct _Unwind_Context *context)
354 1.1 mrg {
355 1.1 mrg return (_Unwind_Ptr) context->ra;
356 1.1 mrg }
357 1.1 mrg
358 1.1 mrg /* Retrieve the return address and flag whether that IP is before
359 1.1 mrg or after first not yet fully executed instruction. */
360 1.1 mrg
361 1.1 mrg inline _Unwind_Ptr
362 1.1 mrg _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
363 1.1 mrg {
364 1.1 mrg *ip_before_insn = _Unwind_IsSignalFrame (context);
365 1.1 mrg return (_Unwind_Ptr) context->ra;
366 1.1 mrg }
367 1.1 mrg
368 1.1 mrg /* Overwrite the return address for CONTEXT with VAL. */
369 1.1 mrg
370 1.1 mrg inline void
371 1.1 mrg _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
372 1.1 mrg {
373 1.2 joerg context->ra = (void *) val;
374 1.1 mrg }
375 1.1 mrg
376 1.3 joerg _Unwind_Ptr
377 1.1 mrg _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
378 1.1 mrg {
379 1.1 mrg return (_Unwind_Ptr) context->lsda;
380 1.1 mrg }
381 1.1 mrg
382 1.1 mrg _Unwind_Ptr
383 1.1 mrg _Unwind_GetRegionStart (struct _Unwind_Context *context)
384 1.1 mrg {
385 1.1 mrg return (_Unwind_Ptr) context->bases.func;
386 1.1 mrg }
387 1.1 mrg
388 1.1 mrg void *
389 1.1 mrg _Unwind_FindEnclosingFunction (void *pc)
390 1.1 mrg {
391 1.1 mrg struct dwarf_eh_bases bases;
392 1.1 mrg const struct dwarf_fde *fde = _Unwind_Find_FDE (pc-1, &bases);
393 1.1 mrg if (fde)
394 1.1 mrg return bases.func;
395 1.1 mrg else
396 1.1 mrg return NULL;
397 1.1 mrg }
398 1.1 mrg
399 1.1 mrg #ifndef __ia64__
400 1.1 mrg _Unwind_Ptr
401 1.1 mrg _Unwind_GetDataRelBase (struct _Unwind_Context *context)
402 1.1 mrg {
403 1.1 mrg return (_Unwind_Ptr) context->bases.dbase;
404 1.1 mrg }
405 1.1 mrg
406 1.1 mrg _Unwind_Ptr
407 1.1 mrg _Unwind_GetTextRelBase (struct _Unwind_Context *context)
408 1.1 mrg {
409 1.1 mrg return (_Unwind_Ptr) context->bases.tbase;
410 1.1 mrg }
411 1.1 mrg #endif
412 1.1 mrg
413 1.1 mrg #include "md-unwind-support.h"
414 1.1 mrg
415 1.1 mrg /* Extract any interesting information from the CIE for the translation
417 1.1 mrg unit F belongs to. Return a pointer to the byte after the augmentation,
418 1.1 mrg or NULL if we encountered an undecipherable augmentation. */
419 1.1 mrg
420 1.1 mrg static const unsigned char *
421 1.1 mrg extract_cie_info (const struct dwarf_cie *cie, struct _Unwind_Context *context,
422 1.1 mrg _Unwind_FrameState *fs)
423 1.1 mrg {
424 1.1 mrg const unsigned char *aug = cie->augmentation;
425 1.1 mrg const unsigned char *p = aug + strlen ((const char *)aug) + 1;
426 1.1 mrg const unsigned char *ret = NULL;
427 1.1 mrg _uleb128_t utmp;
428 1.1 mrg _sleb128_t stmp;
429 1.1 mrg
430 1.1 mrg /* g++ v2 "eh" has pointer immediately following augmentation string,
431 1.1 mrg so it must be handled first. */
432 1.1 mrg if (aug[0] == 'e' && aug[1] == 'h')
433 1.1 mrg {
434 1.1 mrg fs->eh_ptr = read_pointer (p);
435 1.1 mrg p += sizeof (void *);
436 1.1 mrg aug += 2;
437 1.1 mrg }
438 1.1 mrg
439 1.1 mrg /* After the augmentation resp. pointer for "eh" augmentation
440 1.1 mrg follows for CIE version >= 4 address size byte and
441 1.1 mrg segment size byte. */
442 1.1 mrg if (__builtin_expect (cie->version >= 4, 0))
443 1.1 mrg {
444 1.1 mrg if (p[0] != sizeof (void *) || p[1] != 0)
445 1.1 mrg return NULL;
446 1.1 mrg p += 2;
447 1.1 mrg }
448 1.1 mrg /* Immediately following this are the code and
449 1.1 mrg data alignment and return address column. */
450 1.1 mrg p = read_uleb128 (p, &utmp);
451 1.1 mrg fs->code_align = (_Unwind_Word)utmp;
452 1.1 mrg p = read_sleb128 (p, &stmp);
453 1.1 mrg fs->data_align = (_Unwind_Sword)stmp;
454 1.1 mrg if (cie->version == 1)
455 1.1 mrg fs->retaddr_column = *p++;
456 1.1 mrg else
457 1.1 mrg {
458 1.1 mrg p = read_uleb128 (p, &utmp);
459 1.1 mrg fs->retaddr_column = (_Unwind_Word)utmp;
460 1.1 mrg }
461 1.1 mrg fs->lsda_encoding = DW_EH_PE_omit;
462 1.1 mrg
463 1.1 mrg /* If the augmentation starts with 'z', then a uleb128 immediately
464 1.1 mrg follows containing the length of the augmentation field following
465 1.1 mrg the size. */
466 1.1 mrg if (*aug == 'z')
467 1.1 mrg {
468 1.1 mrg p = read_uleb128 (p, &utmp);
469 1.1 mrg ret = p + utmp;
470 1.1 mrg
471 1.1 mrg fs->saw_z = 1;
472 1.1 mrg ++aug;
473 1.1 mrg }
474 1.1 mrg
475 1.1 mrg /* Iterate over recognized augmentation subsequences. */
476 1.1 mrg while (*aug != '\0')
477 1.1 mrg {
478 1.1 mrg /* "L" indicates a byte showing how the LSDA pointer is encoded. */
479 1.1 mrg if (aug[0] == 'L')
480 1.1 mrg {
481 1.1 mrg fs->lsda_encoding = *p++;
482 1.1 mrg aug += 1;
483 1.1 mrg }
484 1.1 mrg
485 1.1 mrg /* "R" indicates a byte indicating how FDE addresses are encoded. */
486 1.1 mrg else if (aug[0] == 'R')
487 1.1 mrg {
488 1.1 mrg fs->fde_encoding = *p++;
489 1.1 mrg aug += 1;
490 1.1 mrg }
491 1.1 mrg
492 1.1 mrg /* "P" indicates a personality routine in the CIE augmentation. */
493 1.1 mrg else if (aug[0] == 'P')
494 1.1 mrg {
495 1.1 mrg _Unwind_Ptr personality;
496 1.1 mrg
497 1.1 mrg p = read_encoded_value (context, *p, p + 1, &personality);
498 1.1 mrg fs->personality = (_Unwind_Personality_Fn) personality;
499 1.1 mrg aug += 1;
500 1.1 mrg }
501 1.1 mrg
502 1.1 mrg /* "S" indicates a signal frame. */
503 1.1 mrg else if (aug[0] == 'S')
504 1.9 mrg {
505 1.9 mrg fs->signal_frame = 1;
506 1.9 mrg aug += 1;
507 1.9 mrg }
508 1.9 mrg /* aarch64 B-key pointer authentication. */
509 1.1 mrg else if (aug[0] == 'B')
510 1.1 mrg {
511 1.1 mrg aug += 1;
512 1.1 mrg }
513 1.1 mrg
514 1.1 mrg /* Otherwise we have an unknown augmentation string.
515 1.1 mrg Bail unless we saw a 'z' prefix. */
516 1.1 mrg else
517 1.1 mrg return ret;
518 1.1 mrg }
519 1.1 mrg
520 1.1 mrg return ret ? ret : p;
521 1.1 mrg }
522 1.1 mrg
523 1.1 mrg
524 1.1 mrg /* Decode a DW_OP stack program. Return the top of stack. Push INITIAL
525 1.1 mrg onto the stack to start. */
526 1.1 mrg
527 1.1 mrg static _Unwind_Word
528 1.1 mrg execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end,
529 1.1 mrg struct _Unwind_Context *context, _Unwind_Word initial)
530 1.1 mrg {
531 1.1 mrg _Unwind_Word stack[64]; /* ??? Assume this is enough. */
532 1.1 mrg int stack_elt;
533 1.1 mrg
534 1.1 mrg stack[0] = initial;
535 1.1 mrg stack_elt = 1;
536 1.1 mrg
537 1.1 mrg while (op_ptr < op_end)
538 1.1 mrg {
539 1.1 mrg enum dwarf_location_atom op = *op_ptr++;
540 1.1 mrg _Unwind_Word result;
541 1.1 mrg _uleb128_t reg, utmp;
542 1.1 mrg _sleb128_t offset, stmp;
543 1.1 mrg
544 1.1 mrg switch (op)
545 1.1 mrg {
546 1.1 mrg case DW_OP_lit0:
547 1.1 mrg case DW_OP_lit1:
548 1.1 mrg case DW_OP_lit2:
549 1.1 mrg case DW_OP_lit3:
550 1.1 mrg case DW_OP_lit4:
551 1.1 mrg case DW_OP_lit5:
552 1.1 mrg case DW_OP_lit6:
553 1.1 mrg case DW_OP_lit7:
554 1.1 mrg case DW_OP_lit8:
555 1.1 mrg case DW_OP_lit9:
556 1.1 mrg case DW_OP_lit10:
557 1.1 mrg case DW_OP_lit11:
558 1.1 mrg case DW_OP_lit12:
559 1.1 mrg case DW_OP_lit13:
560 1.1 mrg case DW_OP_lit14:
561 1.1 mrg case DW_OP_lit15:
562 1.1 mrg case DW_OP_lit16:
563 1.1 mrg case DW_OP_lit17:
564 1.1 mrg case DW_OP_lit18:
565 1.1 mrg case DW_OP_lit19:
566 1.1 mrg case DW_OP_lit20:
567 1.1 mrg case DW_OP_lit21:
568 1.1 mrg case DW_OP_lit22:
569 1.1 mrg case DW_OP_lit23:
570 1.1 mrg case DW_OP_lit24:
571 1.1 mrg case DW_OP_lit25:
572 1.1 mrg case DW_OP_lit26:
573 1.1 mrg case DW_OP_lit27:
574 1.1 mrg case DW_OP_lit28:
575 1.1 mrg case DW_OP_lit29:
576 1.1 mrg case DW_OP_lit30:
577 1.1 mrg case DW_OP_lit31:
578 1.1 mrg result = op - DW_OP_lit0;
579 1.1 mrg break;
580 1.1 mrg
581 1.1 mrg case DW_OP_addr:
582 1.1 mrg result = (_Unwind_Word) (_Unwind_Ptr) read_pointer (op_ptr);
583 1.1 mrg op_ptr += sizeof (void *);
584 1.1 mrg break;
585 1.1 mrg
586 1.1 mrg case DW_OP_GNU_encoded_addr:
587 1.1 mrg {
588 1.1 mrg _Unwind_Ptr presult;
589 1.1 mrg op_ptr = read_encoded_value (context, *op_ptr, op_ptr+1, &presult);
590 1.1 mrg result = presult;
591 1.1 mrg }
592 1.1 mrg break;
593 1.1 mrg
594 1.1 mrg case DW_OP_const1u:
595 1.1 mrg result = read_1u (op_ptr);
596 1.1 mrg op_ptr += 1;
597 1.1 mrg break;
598 1.1 mrg case DW_OP_const1s:
599 1.1 mrg result = read_1s (op_ptr);
600 1.1 mrg op_ptr += 1;
601 1.1 mrg break;
602 1.1 mrg case DW_OP_const2u:
603 1.1 mrg result = read_2u (op_ptr);
604 1.1 mrg op_ptr += 2;
605 1.1 mrg break;
606 1.1 mrg case DW_OP_const2s:
607 1.1 mrg result = read_2s (op_ptr);
608 1.1 mrg op_ptr += 2;
609 1.1 mrg break;
610 1.1 mrg case DW_OP_const4u:
611 1.1 mrg result = read_4u (op_ptr);
612 1.1 mrg op_ptr += 4;
613 1.1 mrg break;
614 1.1 mrg case DW_OP_const4s:
615 1.1 mrg result = read_4s (op_ptr);
616 1.1 mrg op_ptr += 4;
617 1.1 mrg break;
618 1.1 mrg case DW_OP_const8u:
619 1.1 mrg result = read_8u (op_ptr);
620 1.1 mrg op_ptr += 8;
621 1.1 mrg break;
622 1.1 mrg case DW_OP_const8s:
623 1.1 mrg result = read_8s (op_ptr);
624 1.1 mrg op_ptr += 8;
625 1.1 mrg break;
626 1.1 mrg case DW_OP_constu:
627 1.1 mrg op_ptr = read_uleb128 (op_ptr, &utmp);
628 1.1 mrg result = (_Unwind_Word)utmp;
629 1.1 mrg break;
630 1.1 mrg case DW_OP_consts:
631 1.1 mrg op_ptr = read_sleb128 (op_ptr, &stmp);
632 1.1 mrg result = (_Unwind_Sword)stmp;
633 1.1 mrg break;
634 1.1 mrg
635 1.1 mrg case DW_OP_reg0:
636 1.1 mrg case DW_OP_reg1:
637 1.1 mrg case DW_OP_reg2:
638 1.1 mrg case DW_OP_reg3:
639 1.1 mrg case DW_OP_reg4:
640 1.1 mrg case DW_OP_reg5:
641 1.1 mrg case DW_OP_reg6:
642 1.1 mrg case DW_OP_reg7:
643 1.1 mrg case DW_OP_reg8:
644 1.1 mrg case DW_OP_reg9:
645 1.1 mrg case DW_OP_reg10:
646 1.1 mrg case DW_OP_reg11:
647 1.1 mrg case DW_OP_reg12:
648 1.1 mrg case DW_OP_reg13:
649 1.1 mrg case DW_OP_reg14:
650 1.1 mrg case DW_OP_reg15:
651 1.1 mrg case DW_OP_reg16:
652 1.1 mrg case DW_OP_reg17:
653 1.1 mrg case DW_OP_reg18:
654 1.1 mrg case DW_OP_reg19:
655 1.1 mrg case DW_OP_reg20:
656 1.1 mrg case DW_OP_reg21:
657 1.1 mrg case DW_OP_reg22:
658 1.1 mrg case DW_OP_reg23:
659 1.1 mrg case DW_OP_reg24:
660 1.1 mrg case DW_OP_reg25:
661 1.1 mrg case DW_OP_reg26:
662 1.1 mrg case DW_OP_reg27:
663 1.1 mrg case DW_OP_reg28:
664 1.1 mrg case DW_OP_reg29:
665 1.1 mrg case DW_OP_reg30:
666 1.1 mrg case DW_OP_reg31:
667 1.1 mrg result = _Unwind_GetGR (context, op - DW_OP_reg0);
668 1.1 mrg break;
669 1.1 mrg case DW_OP_regx:
670 1.1 mrg op_ptr = read_uleb128 (op_ptr, ®);
671 1.1 mrg result = _Unwind_GetGR (context, reg);
672 1.1 mrg break;
673 1.1 mrg
674 1.1 mrg case DW_OP_breg0:
675 1.1 mrg case DW_OP_breg1:
676 1.1 mrg case DW_OP_breg2:
677 1.1 mrg case DW_OP_breg3:
678 1.1 mrg case DW_OP_breg4:
679 1.1 mrg case DW_OP_breg5:
680 1.1 mrg case DW_OP_breg6:
681 1.1 mrg case DW_OP_breg7:
682 1.1 mrg case DW_OP_breg8:
683 1.1 mrg case DW_OP_breg9:
684 1.1 mrg case DW_OP_breg10:
685 1.1 mrg case DW_OP_breg11:
686 1.1 mrg case DW_OP_breg12:
687 1.1 mrg case DW_OP_breg13:
688 1.1 mrg case DW_OP_breg14:
689 1.1 mrg case DW_OP_breg15:
690 1.1 mrg case DW_OP_breg16:
691 1.1 mrg case DW_OP_breg17:
692 1.1 mrg case DW_OP_breg18:
693 1.1 mrg case DW_OP_breg19:
694 1.1 mrg case DW_OP_breg20:
695 1.1 mrg case DW_OP_breg21:
696 1.1 mrg case DW_OP_breg22:
697 1.1 mrg case DW_OP_breg23:
698 1.1 mrg case DW_OP_breg24:
699 1.1 mrg case DW_OP_breg25:
700 1.1 mrg case DW_OP_breg26:
701 1.1 mrg case DW_OP_breg27:
702 1.1 mrg case DW_OP_breg28:
703 1.1 mrg case DW_OP_breg29:
704 1.1 mrg case DW_OP_breg30:
705 1.1 mrg case DW_OP_breg31:
706 1.1 mrg op_ptr = read_sleb128 (op_ptr, &offset);
707 1.1 mrg result = _Unwind_GetGR (context, op - DW_OP_breg0) + offset;
708 1.1 mrg break;
709 1.1 mrg case DW_OP_bregx:
710 1.1 mrg op_ptr = read_uleb128 (op_ptr, ®);
711 1.1 mrg op_ptr = read_sleb128 (op_ptr, &offset);
712 1.1 mrg result = _Unwind_GetGR (context, reg) + (_Unwind_Word)offset;
713 1.1 mrg break;
714 1.1 mrg
715 1.1 mrg case DW_OP_dup:
716 1.1 mrg gcc_assert (stack_elt);
717 1.1 mrg result = stack[stack_elt - 1];
718 1.1 mrg break;
719 1.1 mrg
720 1.1 mrg case DW_OP_drop:
721 1.1 mrg gcc_assert (stack_elt);
722 1.1 mrg stack_elt -= 1;
723 1.1 mrg goto no_push;
724 1.1 mrg
725 1.1 mrg case DW_OP_pick:
726 1.1 mrg offset = *op_ptr++;
727 1.1 mrg gcc_assert (offset < stack_elt - 1);
728 1.1 mrg result = stack[stack_elt - 1 - offset];
729 1.1 mrg break;
730 1.1 mrg
731 1.1 mrg case DW_OP_over:
732 1.1 mrg gcc_assert (stack_elt >= 2);
733 1.1 mrg result = stack[stack_elt - 2];
734 1.1 mrg break;
735 1.1 mrg
736 1.1 mrg case DW_OP_swap:
737 1.1 mrg {
738 1.1 mrg _Unwind_Word t;
739 1.1 mrg gcc_assert (stack_elt >= 2);
740 1.1 mrg t = stack[stack_elt - 1];
741 1.1 mrg stack[stack_elt - 1] = stack[stack_elt - 2];
742 1.1 mrg stack[stack_elt - 2] = t;
743 1.1 mrg goto no_push;
744 1.1 mrg }
745 1.1 mrg
746 1.1 mrg case DW_OP_rot:
747 1.1 mrg {
748 1.1 mrg _Unwind_Word t1, t2, t3;
749 1.1 mrg
750 1.1 mrg gcc_assert (stack_elt >= 3);
751 1.1 mrg t1 = stack[stack_elt - 1];
752 1.1 mrg t2 = stack[stack_elt - 2];
753 1.1 mrg t3 = stack[stack_elt - 3];
754 1.1 mrg stack[stack_elt - 1] = t2;
755 1.1 mrg stack[stack_elt - 2] = t3;
756 1.1 mrg stack[stack_elt - 3] = t1;
757 1.1 mrg goto no_push;
758 1.1 mrg }
759 1.1 mrg
760 1.1 mrg case DW_OP_deref:
761 1.1 mrg case DW_OP_deref_size:
762 1.1 mrg case DW_OP_abs:
763 1.1 mrg case DW_OP_neg:
764 1.1 mrg case DW_OP_not:
765 1.1 mrg case DW_OP_plus_uconst:
766 1.1 mrg /* Unary operations. */
767 1.1 mrg gcc_assert (stack_elt);
768 1.1 mrg stack_elt -= 1;
769 1.1 mrg
770 1.1 mrg result = stack[stack_elt];
771 1.1 mrg
772 1.1 mrg switch (op)
773 1.1 mrg {
774 1.1 mrg case DW_OP_deref:
775 1.1 mrg {
776 1.1 mrg void *ptr = (void *) (_Unwind_Ptr) result;
777 1.1 mrg result = (_Unwind_Ptr) read_pointer (ptr);
778 1.1 mrg }
779 1.1 mrg break;
780 1.1 mrg
781 1.1 mrg case DW_OP_deref_size:
782 1.1 mrg {
783 1.1 mrg void *ptr = (void *) (_Unwind_Ptr) result;
784 1.1 mrg switch (*op_ptr++)
785 1.1 mrg {
786 1.1 mrg case 1:
787 1.1 mrg result = read_1u (ptr);
788 1.1 mrg break;
789 1.1 mrg case 2:
790 1.1 mrg result = read_2u (ptr);
791 1.1 mrg break;
792 1.1 mrg case 4:
793 1.1 mrg result = read_4u (ptr);
794 1.1 mrg break;
795 1.1 mrg case 8:
796 1.1 mrg result = read_8u (ptr);
797 1.1 mrg break;
798 1.1 mrg default:
799 1.1 mrg gcc_unreachable ();
800 1.1 mrg }
801 1.1 mrg }
802 1.1 mrg break;
803 1.1 mrg
804 1.1 mrg case DW_OP_abs:
805 1.1 mrg if ((_Unwind_Sword) result < 0)
806 1.1 mrg result = -result;
807 1.1 mrg break;
808 1.1 mrg case DW_OP_neg:
809 1.1 mrg result = -result;
810 1.1 mrg break;
811 1.1 mrg case DW_OP_not:
812 1.1 mrg result = ~result;
813 1.1 mrg break;
814 1.1 mrg case DW_OP_plus_uconst:
815 1.1 mrg op_ptr = read_uleb128 (op_ptr, &utmp);
816 1.1 mrg result += (_Unwind_Word)utmp;
817 1.1 mrg break;
818 1.1 mrg
819 1.1 mrg default:
820 1.1 mrg gcc_unreachable ();
821 1.1 mrg }
822 1.1 mrg break;
823 1.1 mrg
824 1.1 mrg case DW_OP_and:
825 1.1 mrg case DW_OP_div:
826 1.1 mrg case DW_OP_minus:
827 1.1 mrg case DW_OP_mod:
828 1.1 mrg case DW_OP_mul:
829 1.1 mrg case DW_OP_or:
830 1.1 mrg case DW_OP_plus:
831 1.1 mrg case DW_OP_shl:
832 1.1 mrg case DW_OP_shr:
833 1.1 mrg case DW_OP_shra:
834 1.1 mrg case DW_OP_xor:
835 1.1 mrg case DW_OP_le:
836 1.1 mrg case DW_OP_ge:
837 1.1 mrg case DW_OP_eq:
838 1.1 mrg case DW_OP_lt:
839 1.1 mrg case DW_OP_gt:
840 1.1 mrg case DW_OP_ne:
841 1.1 mrg {
842 1.1 mrg /* Binary operations. */
843 1.1 mrg _Unwind_Word first, second;
844 1.1 mrg gcc_assert (stack_elt >= 2);
845 1.1 mrg stack_elt -= 2;
846 1.1 mrg
847 1.1 mrg second = stack[stack_elt];
848 1.1 mrg first = stack[stack_elt + 1];
849 1.1 mrg
850 1.1 mrg switch (op)
851 1.1 mrg {
852 1.1 mrg case DW_OP_and:
853 1.1 mrg result = second & first;
854 1.1 mrg break;
855 1.1 mrg case DW_OP_div:
856 1.1 mrg result = (_Unwind_Sword) second / (_Unwind_Sword) first;
857 1.1 mrg break;
858 1.1 mrg case DW_OP_minus:
859 1.1 mrg result = second - first;
860 1.1 mrg break;
861 1.1 mrg case DW_OP_mod:
862 1.1 mrg result = second % first;
863 1.1 mrg break;
864 1.1 mrg case DW_OP_mul:
865 1.1 mrg result = second * first;
866 1.1 mrg break;
867 1.1 mrg case DW_OP_or:
868 1.1 mrg result = second | first;
869 1.1 mrg break;
870 1.1 mrg case DW_OP_plus:
871 1.1 mrg result = second + first;
872 1.1 mrg break;
873 1.1 mrg case DW_OP_shl:
874 1.1 mrg result = second << first;
875 1.1 mrg break;
876 1.1 mrg case DW_OP_shr:
877 1.1 mrg result = second >> first;
878 1.1 mrg break;
879 1.1 mrg case DW_OP_shra:
880 1.1 mrg result = (_Unwind_Sword) second >> first;
881 1.1 mrg break;
882 1.1 mrg case DW_OP_xor:
883 1.1 mrg result = second ^ first;
884 1.1 mrg break;
885 1.1 mrg case DW_OP_le:
886 1.1 mrg result = (_Unwind_Sword) second <= (_Unwind_Sword) first;
887 1.1 mrg break;
888 1.1 mrg case DW_OP_ge:
889 1.1 mrg result = (_Unwind_Sword) second >= (_Unwind_Sword) first;
890 1.1 mrg break;
891 1.1 mrg case DW_OP_eq:
892 1.1 mrg result = (_Unwind_Sword) second == (_Unwind_Sword) first;
893 1.1 mrg break;
894 1.1 mrg case DW_OP_lt:
895 1.1 mrg result = (_Unwind_Sword) second < (_Unwind_Sword) first;
896 1.1 mrg break;
897 1.1 mrg case DW_OP_gt:
898 1.1 mrg result = (_Unwind_Sword) second > (_Unwind_Sword) first;
899 1.1 mrg break;
900 1.1 mrg case DW_OP_ne:
901 1.1 mrg result = (_Unwind_Sword) second != (_Unwind_Sword) first;
902 1.1 mrg break;
903 1.1 mrg
904 1.1 mrg default:
905 1.1 mrg gcc_unreachable ();
906 1.1 mrg }
907 1.1 mrg }
908 1.1 mrg break;
909 1.1 mrg
910 1.1 mrg case DW_OP_skip:
911 1.1 mrg offset = read_2s (op_ptr);
912 1.1 mrg op_ptr += 2;
913 1.1 mrg op_ptr += offset;
914 1.1 mrg goto no_push;
915 1.1 mrg
916 1.1 mrg case DW_OP_bra:
917 1.1 mrg gcc_assert (stack_elt);
918 1.1 mrg stack_elt -= 1;
919 1.1 mrg
920 1.1 mrg offset = read_2s (op_ptr);
921 1.1 mrg op_ptr += 2;
922 1.1 mrg if (stack[stack_elt] != 0)
923 1.1 mrg op_ptr += offset;
924 1.1 mrg goto no_push;
925 1.1 mrg
926 1.1 mrg case DW_OP_nop:
927 1.1 mrg goto no_push;
928 1.1 mrg
929 1.1 mrg default:
930 1.1 mrg gcc_unreachable ();
931 1.1 mrg }
932 1.1 mrg
933 1.1 mrg /* Most things push a result value. */
934 1.1 mrg gcc_assert ((size_t) stack_elt < sizeof(stack)/sizeof(*stack));
935 1.1 mrg stack[stack_elt++] = result;
936 1.1 mrg no_push:;
937 1.1 mrg }
938 1.1 mrg
939 1.1 mrg /* We were executing this program to get a value. It should be
940 1.1 mrg at top of stack. */
941 1.1 mrg gcc_assert (stack_elt);
942 1.1 mrg stack_elt -= 1;
943 1.1 mrg return stack[stack_elt];
944 1.1 mrg }
945 1.1 mrg
946 1.1 mrg
947 1.11 mrg /* Decode DWARF 2 call frame information. Takes pointers the
948 1.11 mrg instruction sequence to decode, current register information and
949 1.11 mrg CIE info, and the PC range to evaluate. */
950 1.11 mrg
951 1.11 mrg static void __attribute__ ((__noinline__))
952 1.11 mrg execute_cfa_program_generic (const unsigned char *insn_ptr,
953 1.11 mrg const unsigned char *insn_end,
954 1.11 mrg struct _Unwind_Context *context,
955 1.11 mrg _Unwind_FrameState *fs)
956 1.11 mrg {
957 1.11 mrg #define DATA_ALIGN fs->data_align
958 1.11 mrg #define CODE_ALIGN fs->code_align
959 1.11 mrg #include "unwind-dw2-execute_cfa.h"
960 1.11 mrg }
961 1.11 mrg
962 1.11 mrg static inline void
963 1.11 mrg execute_cfa_program_specialized (const unsigned char *insn_ptr,
964 1.11 mrg const unsigned char *insn_end,
965 1.11 mrg struct _Unwind_Context *context,
966 1.11 mrg _Unwind_FrameState *fs)
967 1.11 mrg {
968 1.11 mrg #define DATA_ALIGN __LIBGCC_DWARF_CIE_DATA_ALIGNMENT__
969 1.11 mrg /* GCC always uses 1 even on architectures with a fixed instruction
970 1.11 mrg width. */
971 1.1 mrg #define CODE_ALIGN 1
972 1.1 mrg #include "unwind-dw2-execute_cfa.h"
973 1.1 mrg }
974 1.1 mrg
975 1.1 mrg static void
976 1.1 mrg execute_cfa_program (const unsigned char *insn_ptr,
977 1.11 mrg const unsigned char *insn_end,
978 1.11 mrg struct _Unwind_Context *context,
979 1.11 mrg _Unwind_FrameState *fs)
980 1.11 mrg {
981 1.11 mrg if (fs->data_align == __LIBGCC_DWARF_CIE_DATA_ALIGNMENT__
982 1.11 mrg && fs->code_align == 1)
983 1.1 mrg execute_cfa_program_specialized (insn_ptr, insn_end, context, fs);
984 1.1 mrg else
985 1.1 mrg execute_cfa_program_generic (insn_ptr, insn_end, context, fs);
986 1.1 mrg }
987 1.1 mrg
988 1.1 mrg
989 1.1 mrg /* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for
991 1.1 mrg its caller and decode it into FS. This function also sets the
992 1.1 mrg args_size and lsda members of CONTEXT, as they are really information
993 1.1 mrg about the caller's frame. */
994 1.1 mrg
995 1.1 mrg static _Unwind_Reason_Code
996 1.1 mrg uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
997 1.11 mrg {
998 1.11 mrg const struct dwarf_fde *fde;
999 1.1 mrg const struct dwarf_cie *cie;
1000 1.1 mrg const unsigned char *aug, *insn, *end;
1001 1.1 mrg
1002 1.1 mrg memset (&fs->regs.how[0], 0,
1003 1.1 mrg sizeof (*fs) - offsetof (_Unwind_FrameState, regs.how[0]));
1004 1.1 mrg context->args_size = 0;
1005 1.1 mrg context->lsda = 0;
1006 1.1 mrg
1007 1.1 mrg if (context->ra == 0)
1008 1.1 mrg return _URC_END_OF_STACK;
1009 1.1 mrg
1010 1.1 mrg fde = _Unwind_Find_FDE (context->ra + _Unwind_IsSignalFrame (context) - 1,
1011 1.1 mrg &context->bases);
1012 1.1 mrg if (fde == NULL)
1013 1.1 mrg {
1014 1.1 mrg #ifdef MD_FALLBACK_FRAME_STATE_FOR
1015 1.1 mrg /* Couldn't find frame unwind info for this function. Try a
1016 1.1 mrg target-specific fallback mechanism. This will necessarily
1017 1.1 mrg not provide a personality routine or LSDA. */
1018 1.1 mrg return MD_FALLBACK_FRAME_STATE_FOR (context, fs);
1019 1.1 mrg #else
1020 1.1 mrg return _URC_END_OF_STACK;
1021 1.1 mrg #endif
1022 1.1 mrg }
1023 1.1 mrg
1024 1.1 mrg fs->pc = context->bases.func;
1025 1.1 mrg
1026 1.1 mrg cie = get_cie (fde);
1027 1.1 mrg insn = extract_cie_info (cie, context, fs);
1028 1.1 mrg if (insn == NULL)
1029 1.1 mrg /* CIE contained unknown augmentation. */
1030 1.1 mrg return _URC_FATAL_PHASE1_ERROR;
1031 1.1 mrg
1032 1.1 mrg /* First decode all the insns in the CIE. */
1033 1.1 mrg end = (const unsigned char *) next_fde ((const struct dwarf_fde *) cie);
1034 1.1 mrg execute_cfa_program (insn, end, context, fs);
1035 1.1 mrg
1036 1.1 mrg /* Locate augmentation for the fde. */
1037 1.1 mrg aug = (const unsigned char *) fde + sizeof (*fde);
1038 1.1 mrg aug += 2 * size_of_encoded_value (fs->fde_encoding);
1039 1.1 mrg insn = NULL;
1040 1.1 mrg if (fs->saw_z)
1041 1.1 mrg {
1042 1.1 mrg _uleb128_t i;
1043 1.1 mrg aug = read_uleb128 (aug, &i);
1044 1.1 mrg insn = aug + i;
1045 1.1 mrg }
1046 1.1 mrg if (fs->lsda_encoding != DW_EH_PE_omit)
1047 1.1 mrg {
1048 1.1 mrg _Unwind_Ptr lsda;
1049 1.1 mrg
1050 1.1 mrg aug = read_encoded_value (context, fs->lsda_encoding, aug, &lsda);
1051 1.1 mrg context->lsda = (void *) lsda;
1052 1.1 mrg }
1053 1.1 mrg
1054 1.1 mrg /* Then the insns in the FDE up to our target PC. */
1055 1.1 mrg if (insn == NULL)
1056 1.1 mrg insn = aug;
1057 1.1 mrg end = (const unsigned char *) next_fde (fde);
1058 1.1 mrg execute_cfa_program (insn, end, context, fs);
1059 1.1 mrg
1060 1.1 mrg return _URC_NO_REASON;
1061 1.1 mrg }
1062 1.1 mrg
1063 1.1 mrg typedef struct frame_state
1065 1.1 mrg {
1066 1.1 mrg void *cfa;
1067 1.1 mrg void *eh_ptr;
1068 1.1 mrg long cfa_offset;
1069 1.1 mrg long args_size;
1070 1.1 mrg long reg_or_offset[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1071 1.1 mrg unsigned short cfa_reg;
1072 1.1 mrg unsigned short retaddr_column;
1073 1.1 mrg char saved[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1074 1.1 mrg } frame_state;
1075 1.1 mrg
1076 1.1 mrg struct frame_state * __frame_state_for (void *, struct frame_state *);
1077 1.1 mrg
1078 1.1 mrg /* Called from pre-G++ 3.0 __throw to find the registers to restore for
1079 1.1 mrg a given PC_TARGET. The caller should allocate a local variable of
1080 1.1 mrg `struct frame_state' and pass its address to STATE_IN. */
1081 1.1 mrg
1082 1.1 mrg struct frame_state *
1083 1.1 mrg __frame_state_for (void *pc_target, struct frame_state *state_in)
1084 1.1 mrg {
1085 1.1 mrg struct _Unwind_Context context;
1086 1.1 mrg _Unwind_FrameState fs;
1087 1.1 mrg int reg;
1088 1.1 mrg
1089 1.1 mrg memset (&context, 0, sizeof (struct _Unwind_Context));
1090 1.1 mrg if (!ASSUME_EXTENDED_UNWIND_CONTEXT)
1091 1.1 mrg context.flags = EXTENDED_CONTEXT_BIT;
1092 1.1 mrg context.ra = pc_target + 1;
1093 1.1 mrg
1094 1.1 mrg if (uw_frame_state_for (&context, &fs) != _URC_NO_REASON)
1095 1.1 mrg return 0;
1096 1.1 mrg
1097 1.1 mrg /* We have no way to pass a location expression for the CFA to our
1098 1.11 mrg caller. It wouldn't understand it anyway. */
1099 1.1 mrg if (fs.regs.cfa_how == CFA_EXP)
1100 1.1 mrg return 0;
1101 1.1 mrg
1102 1.1 mrg for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
1103 1.1 mrg {
1104 1.1 mrg state_in->saved[reg] = fs.regs.how[reg];
1105 1.1 mrg switch (state_in->saved[reg])
1106 1.1 mrg {
1107 1.1 mrg case REG_SAVED_REG:
1108 1.1 mrg state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.reg;
1109 1.1 mrg break;
1110 1.1 mrg case REG_SAVED_OFFSET:
1111 1.1 mrg state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.offset;
1112 1.1 mrg break;
1113 1.1 mrg default:
1114 1.1 mrg state_in->reg_or_offset[reg] = 0;
1115 1.1 mrg break;
1116 1.1 mrg }
1117 1.1 mrg }
1118 1.1 mrg
1119 1.1 mrg state_in->cfa_offset = fs.regs.cfa_offset;
1120 1.1 mrg state_in->cfa_reg = fs.regs.cfa_reg;
1121 1.1 mrg state_in->retaddr_column = fs.retaddr_column;
1122 1.1 mrg state_in->args_size = context.args_size;
1123 1.1 mrg state_in->eh_ptr = fs.eh_ptr;
1124 1.1 mrg
1125 1.1 mrg return state_in;
1126 1.1 mrg }
1127 1.1 mrg
1128 1.1 mrg typedef union { _Unwind_Ptr ptr; _Unwind_Word word; } _Unwind_SpTmp;
1130 1.1 mrg
1131 1.1 mrg static inline void
1132 1.1 mrg _Unwind_SetSpColumn (struct _Unwind_Context *context, void *cfa,
1133 1.1 mrg _Unwind_SpTmp *tmp_sp)
1134 1.1 mrg {
1135 1.1 mrg int size = dwarf_reg_size_table[__builtin_dwarf_sp_column ()];
1136 1.1 mrg
1137 1.1 mrg if (size == sizeof(_Unwind_Ptr))
1138 1.1 mrg tmp_sp->ptr = (_Unwind_Ptr) cfa;
1139 1.1 mrg else
1140 1.1 mrg {
1141 1.1 mrg gcc_assert (size == sizeof(_Unwind_Word));
1142 1.1 mrg tmp_sp->word = (_Unwind_Ptr) cfa;
1143 1.1 mrg }
1144 1.1 mrg _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), tmp_sp);
1145 1.1 mrg }
1146 1.1 mrg
1147 1.4 mrg static void
1148 1.1 mrg uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1149 1.1 mrg {
1150 1.1 mrg struct _Unwind_Context orig_context = *context;
1151 1.1 mrg void *cfa;
1152 1.1 mrg long i;
1153 1.1 mrg
1154 1.1 mrg #ifdef __LIBGCC_EH_RETURN_STACKADJ_RTX__
1155 1.1 mrg /* Special handling here: Many machines do not use a frame pointer,
1156 1.1 mrg and track the CFA only through offsets from the stack pointer from
1157 1.1 mrg one frame to the next. In this case, the stack pointer is never
1158 1.1 mrg stored, so it has no saved address in the context. What we do
1159 1.1 mrg have is the CFA from the previous stack frame.
1160 1.1 mrg
1161 1.1 mrg In very special situations (such as unwind info for signal return),
1162 1.1 mrg there may be location expressions that use the stack pointer as well.
1163 1.1 mrg
1164 1.1 mrg Do this conditionally for one frame. This allows the unwind info
1165 1.1 mrg for one frame to save a copy of the stack pointer from the previous
1166 1.1 mrg frame, and be able to use much easier CFA mechanisms to do it.
1167 1.1 mrg Always zap the saved stack pointer value for the next frame; carrying
1168 1.1 mrg the value over from one frame to another doesn't make sense. */
1169 1.1 mrg
1170 1.1 mrg _Unwind_SpTmp tmp_sp;
1171 1.1 mrg
1172 1.1 mrg if (!_Unwind_GetGRPtr (&orig_context, __builtin_dwarf_sp_column ()))
1173 1.1 mrg _Unwind_SetSpColumn (&orig_context, context->cfa, &tmp_sp);
1174 1.1 mrg _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), NULL);
1175 1.1 mrg #endif
1176 1.1 mrg
1177 1.1 mrg /* Compute this frame's CFA. */
1178 1.1 mrg switch (fs->regs.cfa_how)
1179 1.1 mrg {
1180 1.1 mrg case CFA_REG_OFFSET:
1181 1.1 mrg cfa = _Unwind_GetPtr (&orig_context, fs->regs.cfa_reg);
1182 1.1 mrg cfa += fs->regs.cfa_offset;
1183 1.1 mrg break;
1184 1.1 mrg
1185 1.1 mrg case CFA_EXP:
1186 1.1 mrg {
1187 1.1 mrg const unsigned char *exp = fs->regs.cfa_exp;
1188 1.1 mrg _uleb128_t len;
1189 1.1 mrg
1190 1.1 mrg exp = read_uleb128 (exp, &len);
1191 1.1 mrg cfa = (void *) (_Unwind_Ptr)
1192 1.1 mrg execute_stack_op (exp, exp + len, &orig_context, 0);
1193 1.1 mrg break;
1194 1.1 mrg }
1195 1.4 mrg
1196 1.11 mrg default:
1197 1.1 mrg gcc_unreachable ();
1198 1.1 mrg }
1199 1.1 mrg context->cfa = cfa;
1200 1.11 mrg
1201 1.1 mrg /* Compute the addresses of all registers saved in this frame. */
1202 1.1 mrg for (i = 0; i < __LIBGCC_DWARF_FRAME_REGISTERS__ + 1; ++i)
1203 1.1 mrg switch (fs->regs.how[i])
1204 1.1 mrg {
1205 1.1 mrg case REG_UNSAVED:
1206 1.1 mrg case REG_UNDEFINED:
1207 1.1 mrg case REG_UNSAVED_ARCHEXT:
1208 1.1 mrg break;
1209 1.1 mrg
1210 1.1 mrg case REG_SAVED_OFFSET:
1211 1.1 mrg _Unwind_SetGRPtr (context, i,
1212 1.1 mrg (void *) (cfa + fs->regs.reg[i].loc.offset));
1213 1.1 mrg break;
1214 1.1 mrg
1215 1.1 mrg case REG_SAVED_REG:
1216 1.1 mrg if (_Unwind_GRByValue (&orig_context, fs->regs.reg[i].loc.reg))
1217 1.1 mrg _Unwind_SetGRValue (context, i,
1218 1.1 mrg _Unwind_GetGR (&orig_context,
1219 1.1 mrg fs->regs.reg[i].loc.reg));
1220 1.1 mrg else
1221 1.1 mrg _Unwind_SetGRPtr (context, i,
1222 1.1 mrg _Unwind_GetGRPtr (&orig_context,
1223 1.1 mrg fs->regs.reg[i].loc.reg));
1224 1.1 mrg break;
1225 1.1 mrg
1226 1.1 mrg case REG_SAVED_EXP:
1227 1.1 mrg {
1228 1.1 mrg const unsigned char *exp = fs->regs.reg[i].loc.exp;
1229 1.1 mrg _uleb128_t len;
1230 1.1 mrg _Unwind_Ptr val;
1231 1.1 mrg
1232 1.1 mrg exp = read_uleb128 (exp, &len);
1233 1.1 mrg val = execute_stack_op (exp, exp + len, &orig_context,
1234 1.1 mrg (_Unwind_Ptr) cfa);
1235 1.1 mrg _Unwind_SetGRPtr (context, i, (void *) val);
1236 1.1 mrg }
1237 1.1 mrg break;
1238 1.1 mrg
1239 1.1 mrg case REG_SAVED_VAL_OFFSET:
1240 1.1 mrg _Unwind_SetGRValue (context, i,
1241 1.1 mrg (_Unwind_Internal_Ptr)
1242 1.1 mrg (cfa + fs->regs.reg[i].loc.offset));
1243 1.1 mrg break;
1244 1.1 mrg
1245 1.1 mrg case REG_SAVED_VAL_EXP:
1246 1.1 mrg {
1247 1.1 mrg const unsigned char *exp = fs->regs.reg[i].loc.exp;
1248 1.1 mrg _uleb128_t len;
1249 1.1 mrg _Unwind_Ptr val;
1250 1.1 mrg
1251 1.1 mrg exp = read_uleb128 (exp, &len);
1252 1.1 mrg val = execute_stack_op (exp, exp + len, &orig_context,
1253 1.1 mrg (_Unwind_Ptr) cfa);
1254 1.1 mrg _Unwind_SetGRValue (context, i, val);
1255 1.1 mrg }
1256 1.1 mrg break;
1257 1.1 mrg }
1258 1.1 mrg
1259 1.1 mrg _Unwind_SetSignalFrame (context, fs->signal_frame);
1260 1.1 mrg
1261 1.1 mrg #ifdef MD_FROB_UPDATE_CONTEXT
1262 1.1 mrg MD_FROB_UPDATE_CONTEXT (context, fs);
1263 1.1 mrg #endif
1264 1.1 mrg }
1265 1.1 mrg
1266 1.1 mrg /* CONTEXT describes the unwind state for a frame, and FS describes the FDE
1267 1.1 mrg of its caller. Update CONTEXT to refer to the caller as well. Note
1268 1.1 mrg that the args_size and lsda members are not updated here, but later in
1269 1.1 mrg uw_frame_state_for. */
1270 1.1 mrg
1271 1.1 mrg static void
1272 1.1 mrg uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1273 1.1 mrg {
1274 1.1 mrg uw_update_context_1 (context, fs);
1275 1.11 mrg
1276 1.1 mrg /* In general this unwinder doesn't make any distinction between
1277 1.1 mrg undefined and same_value rule. Call-saved registers are assumed
1278 1.1 mrg to have same_value rule by default and explicit undefined
1279 1.1 mrg rule is handled like same_value. The only exception is
1280 1.1 mrg DW_CFA_undefined on retaddr_column which is supposed to
1281 1.6 mrg mark outermost frame in DWARF 3. */
1282 1.6 mrg if (fs->regs.how[DWARF_REG_TO_UNWIND_COLUMN (fs->retaddr_column)]
1283 1.6 mrg == REG_UNDEFINED)
1284 1.9 mrg /* uw_frame_state_for uses context->ra == 0 check to find outermost
1285 1.9 mrg stack frame. */
1286 1.9 mrg context->ra = 0;
1287 1.9 mrg else
1288 1.9 mrg {
1289 1.9 mrg /* Compute the return address now, since the return address column
1290 1.6 mrg can change from frame to frame. */
1291 1.9 mrg void *ret_addr;
1292 1.6 mrg #ifdef MD_DEMANGLE_RETURN_ADDR
1293 1.1 mrg _Unwind_Word ra = _Unwind_GetGR (context, fs->retaddr_column);
1294 1.1 mrg ret_addr = MD_DEMANGLE_RETURN_ADDR (context, fs, ra);
1295 1.1 mrg #else
1296 1.1 mrg ret_addr = _Unwind_GetPtr (context, fs->retaddr_column);
1297 1.1 mrg #endif
1298 1.1 mrg context->ra = __builtin_extract_return_addr (ret_addr);
1299 1.1 mrg }
1300 1.1 mrg }
1301 1.1 mrg
1302 1.1 mrg static void
1303 1.1 mrg uw_advance_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1304 1.1 mrg {
1305 1.1 mrg uw_update_context (context, fs);
1306 1.1 mrg }
1307 1.1 mrg
1308 1.1 mrg /* Fill in CONTEXT for top-of-stack. The only valid registers at this
1310 1.1 mrg level will be the return address and the CFA. */
1311 1.1 mrg
1312 1.1 mrg #define uw_init_context(CONTEXT) \
1313 1.1 mrg do \
1314 1.1 mrg { \
1315 1.1 mrg /* Do any necessary initialization to access arbitrary stack frames. \
1316 1.1 mrg On the SPARC, this means flushing the register windows. */ \
1317 1.1 mrg __builtin_unwind_init (); \
1318 1.1 mrg uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (), \
1319 1.1 mrg __builtin_return_address (0)); \
1320 1.1 mrg } \
1321 1.1 mrg while (0)
1322 1.1 mrg
1323 1.1 mrg static inline void
1324 1.1 mrg init_dwarf_reg_size_table (void)
1325 1.1 mrg {
1326 1.1 mrg __builtin_init_dwarf_reg_size_table (dwarf_reg_size_table);
1327 1.1 mrg }
1328 1.1 mrg
1329 1.1 mrg static void __attribute__((noinline))
1330 1.1 mrg uw_init_context_1 (struct _Unwind_Context *context,
1331 1.1 mrg void *outer_cfa, void *outer_ra)
1332 1.1 mrg {
1333 1.1 mrg void *ra = __builtin_extract_return_addr (__builtin_return_address (0));
1334 1.1 mrg _Unwind_FrameState fs;
1335 1.1 mrg _Unwind_SpTmp sp_slot;
1336 1.1 mrg _Unwind_Reason_Code code;
1337 1.1 mrg
1338 1.1 mrg memset (context, 0, sizeof (struct _Unwind_Context));
1339 1.1 mrg context->ra = ra;
1340 1.1 mrg if (!ASSUME_EXTENDED_UNWIND_CONTEXT)
1341 1.1 mrg context->flags = EXTENDED_CONTEXT_BIT;
1342 1.1 mrg
1343 1.1 mrg code = uw_frame_state_for (context, &fs);
1344 1.1 mrg gcc_assert (code == _URC_NO_REASON);
1345 1.1 mrg
1346 1.1 mrg #if __GTHREADS
1347 1.1 mrg {
1348 1.1 mrg static __gthread_once_t once_regsizes = __GTHREAD_ONCE_INIT;
1349 1.1 mrg if (__gthread_once (&once_regsizes, init_dwarf_reg_size_table) != 0
1350 1.1 mrg && dwarf_reg_size_table[0] == 0)
1351 1.1 mrg init_dwarf_reg_size_table ();
1352 1.1 mrg }
1353 1.1 mrg #else
1354 1.1 mrg if (dwarf_reg_size_table[0] == 0)
1355 1.1 mrg init_dwarf_reg_size_table ();
1356 1.1 mrg #endif
1357 1.1 mrg
1358 1.1 mrg /* Force the frame state to use the known cfa value. */
1359 1.1 mrg _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
1360 1.1 mrg fs.regs.cfa_how = CFA_REG_OFFSET;
1361 1.1 mrg fs.regs.cfa_reg = __builtin_dwarf_sp_column ();
1362 1.1 mrg fs.regs.cfa_offset = 0;
1363 1.1 mrg
1364 1.1 mrg uw_update_context_1 (context, &fs);
1365 1.1 mrg
1366 1.1 mrg /* If the return address column was saved in a register in the
1367 1.1 mrg initialization context, then we can't see it in the given
1368 1.1 mrg call frame data. So have the initialization context tell us. */
1369 1.1 mrg context->ra = __builtin_extract_return_addr (outer_ra);
1370 1.1 mrg }
1371 1.1 mrg
1372 1.1 mrg static void _Unwind_DebugHook (void *, void *)
1373 1.1 mrg __attribute__ ((__noinline__, __used__, __noclone__));
1374 1.1 mrg
1375 1.1 mrg /* This function is called during unwinding. It is intended as a hook
1376 1.1 mrg for a debugger to intercept exceptions. CFA is the CFA of the
1377 1.1 mrg target frame. HANDLER is the PC to which control will be
1378 1.1 mrg transferred. */
1379 1.1 mrg static void
1380 1.1 mrg _Unwind_DebugHook (void *cfa __attribute__ ((__unused__)),
1381 1.1 mrg void *handler __attribute__ ((__unused__)))
1382 1.1 mrg {
1383 1.1 mrg /* We only want to use stap probes starting with v3. Earlier
1384 1.1 mrg versions added too much startup cost. */
1385 1.1 mrg #if defined (HAVE_SYS_SDT_H) && defined (STAP_PROBE2) && _SDT_NOTE_TYPE >= 3
1386 1.7 mrg STAP_PROBE2 (libgcc, unwind, cfa, handler);
1387 1.7 mrg #else
1388 1.7 mrg asm ("");
1389 1.7 mrg #endif
1390 1.1 mrg }
1391 1.7 mrg
1392 1.1 mrg /* Install TARGET into CURRENT so that we can return to it. This is a
1393 1.1 mrg macro because __builtin_eh_return must be invoked in the context of
1394 1.1 mrg our caller. FRAMES is a number of frames to be unwind.
1395 1.9 mrg _Unwind_Frames_Extra is a macro to do additional work during unwinding
1396 1.1 mrg if needed, for example shadow stack pointer adjustment for Intel CET
1397 1.7 mrg technology. */
1398 1.1 mrg
1399 1.1 mrg #define uw_install_context(CURRENT, TARGET, FRAMES) \
1400 1.1 mrg do \
1401 1.1 mrg { \
1402 1.1 mrg long offset = uw_install_context_1 ((CURRENT), (TARGET)); \
1403 1.1 mrg void *handler = __builtin_frob_return_addr ((TARGET)->ra); \
1404 1.1 mrg _Unwind_DebugHook ((TARGET)->cfa, handler); \
1405 1.1 mrg _Unwind_Frames_Extra (FRAMES); \
1406 1.1 mrg __builtin_eh_return (offset, handler); \
1407 1.1 mrg } \
1408 1.1 mrg while (0)
1409 1.1 mrg
1410 1.1 mrg static long
1411 1.1 mrg uw_install_context_1 (struct _Unwind_Context *current,
1412 1.1 mrg struct _Unwind_Context *target)
1413 1.1 mrg {
1414 1.4 mrg long i;
1415 1.1 mrg _Unwind_SpTmp sp_slot;
1416 1.1 mrg
1417 1.1 mrg /* If the target frame does not have a saved stack pointer,
1418 1.1 mrg then set up the target's CFA. */
1419 1.1 mrg if (!_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ()))
1420 1.1 mrg _Unwind_SetSpColumn (target, target->cfa, &sp_slot);
1421 1.1 mrg
1422 1.1 mrg for (i = 0; i < __LIBGCC_DWARF_FRAME_REGISTERS__; ++i)
1423 1.1 mrg {
1424 1.1 mrg void *c = (void *) (_Unwind_Internal_Ptr) current->reg[i];
1425 1.1 mrg void *t = (void *) (_Unwind_Internal_Ptr)target->reg[i];
1426 1.1 mrg
1427 1.1 mrg gcc_assert (current->by_value[i] == 0);
1428 1.1 mrg if (target->by_value[i] && c)
1429 1.1 mrg {
1430 1.1 mrg _Unwind_Word w;
1431 1.1 mrg _Unwind_Ptr p;
1432 1.1 mrg if (dwarf_reg_size_table[i] == sizeof (_Unwind_Word))
1433 1.1 mrg {
1434 1.1 mrg w = (_Unwind_Internal_Ptr) t;
1435 1.1 mrg memcpy (c, &w, sizeof (_Unwind_Word));
1436 1.1 mrg }
1437 1.1 mrg else
1438 1.1 mrg {
1439 1.1 mrg gcc_assert (dwarf_reg_size_table[i] == sizeof (_Unwind_Ptr));
1440 1.1 mrg p = (_Unwind_Internal_Ptr) t;
1441 1.1 mrg memcpy (c, &p, sizeof (_Unwind_Ptr));
1442 1.1 mrg }
1443 1.1 mrg }
1444 1.1 mrg else if (t && c && t != c)
1445 1.1 mrg memcpy (c, t, dwarf_reg_size_table[i]);
1446 1.1 mrg }
1447 1.1 mrg
1448 1.1 mrg /* If the current frame doesn't have a saved stack pointer, then we
1449 1.1 mrg need to rely on EH_RETURN_STACKADJ_RTX to get our target stack
1450 1.4 mrg pointer value reloaded. */
1451 1.1 mrg if (!_Unwind_GetGRPtr (current, __builtin_dwarf_sp_column ()))
1452 1.1 mrg {
1453 1.1 mrg void *target_cfa;
1454 1.1 mrg
1455 1.1 mrg target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ());
1456 1.1 mrg
1457 1.1 mrg /* We adjust SP by the difference between CURRENT and TARGET's CFA. */
1458 1.1 mrg if (__LIBGCC_STACK_GROWS_DOWNWARD__)
1459 1.1 mrg return target_cfa - current->cfa + target->args_size;
1460 1.1 mrg else
1461 1.1 mrg return current->cfa - target_cfa - target->args_size;
1462 1.1 mrg }
1463 1.1 mrg return 0;
1464 1.4 mrg }
1465 1.1 mrg
1466 1.1 mrg static inline _Unwind_Ptr
1467 1.1 mrg uw_identify_context (struct _Unwind_Context *context)
1468 1.1 mrg {
1469 1.1 mrg /* The CFA is not sufficient to disambiguate the context of a function
1470 1.1 mrg interrupted by a signal before establishing its frame and the context
1471 1.1 mrg of the signal itself. */
1472 1.1 mrg if (__LIBGCC_STACK_GROWS_DOWNWARD__)
1473 1.1 mrg return _Unwind_GetCFA (context) - _Unwind_IsSignalFrame (context);
1474 1.1 mrg else
1475 1.1 mrg return _Unwind_GetCFA (context) + _Unwind_IsSignalFrame (context);
1476 1.1 mrg }
1477 1.1 mrg
1478 1.1 mrg
1479 1.1 mrg #include "unwind.inc"
1480 1.1 mrg
1481 1.1 mrg #if defined (USE_GAS_SYMVER) && defined (SHARED) && defined (USE_LIBUNWIND_EXCEPTIONS)
1482 1.1 mrg alias (_Unwind_Backtrace);
1483 1.1 mrg alias (_Unwind_DeleteException);
1484 1.1 mrg alias (_Unwind_FindEnclosingFunction);
1485 1.1 mrg alias (_Unwind_ForcedUnwind);
1486 1.1 mrg alias (_Unwind_GetDataRelBase);
1487 1.1 mrg alias (_Unwind_GetTextRelBase);
1488 1.1 mrg alias (_Unwind_GetCFA);
1489 1.1 mrg alias (_Unwind_GetGR);
1490 1.1 mrg alias (_Unwind_GetIP);
1491 1.1 mrg alias (_Unwind_GetLanguageSpecificData);
1492 1.1 mrg alias (_Unwind_GetRegionStart);
1493 alias (_Unwind_RaiseException);
1494 alias (_Unwind_Resume);
1495 alias (_Unwind_Resume_or_Rethrow);
1496 alias (_Unwind_SetGR);
1497 alias (_Unwind_SetIP);
1498 #endif
1499
1500 #endif /* !USING_SJLJ_EXCEPTIONS */
1501