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