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