* tree-ssa-phiopt.c (conditional_replacement): Construct proper SSA
[official-gcc.git] / gcc / unwind-dw2.c
blob5a4375fa92779a08163d30364ad9b749326d724f
1 /* DWARF2 exception handling and frame unwind runtime interface routines.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file into combinations with other programs,
15 and to distribute those combinations without any restriction coming
16 from the use of this file. (The General Public License restrictions
17 do apply in other respects; for example, they cover modification of
18 the file, and distribution when not linked into a combined
19 executable.)
21 GCC is distributed in the hope that it will be useful, but WITHOUT
22 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
23 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
24 License for more details.
26 You should have received a copy of the GNU General Public License
27 along with GCC; see the file COPYING. If not, write to the Free
28 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
29 02110-1301, USA. */
31 #include "tconfig.h"
32 #include "tsystem.h"
33 #include "coretypes.h"
34 #include "tm.h"
35 #include "dwarf2.h"
36 #include "unwind.h"
37 #ifdef __USING_SJLJ_EXCEPTIONS__
38 # define NO_SIZE_OF_ENCODED_VALUE
39 #endif
40 #include "unwind-pe.h"
41 #include "unwind-dw2-fde.h"
42 #include "gthr.h"
43 #include "unwind-dw2.h"
45 #ifndef __USING_SJLJ_EXCEPTIONS__
47 #ifndef STACK_GROWS_DOWNWARD
48 #define STACK_GROWS_DOWNWARD 0
49 #else
50 #undef STACK_GROWS_DOWNWARD
51 #define STACK_GROWS_DOWNWARD 1
52 #endif
54 /* Dwarf frame registers used for pre gcc 3.0 compiled glibc. */
55 #ifndef PRE_GCC3_DWARF_FRAME_REGISTERS
56 #define PRE_GCC3_DWARF_FRAME_REGISTERS DWARF_FRAME_REGISTERS
57 #endif
59 #ifndef DWARF_REG_TO_UNWIND_COLUMN
60 #define DWARF_REG_TO_UNWIND_COLUMN(REGNO) (REGNO)
61 #endif
63 /* This is the register and unwind state for a particular frame. This
64 provides the information necessary to unwind up past a frame and return
65 to its caller. */
66 struct _Unwind_Context
68 void *reg[DWARF_FRAME_REGISTERS+1];
69 void *cfa;
70 void *ra;
71 void *lsda;
72 struct dwarf_eh_bases bases;
73 _Unwind_Word args_size;
76 /* Byte size of every register managed by these routines. */
77 static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS+1];
80 /* Read unaligned data from the instruction buffer. */
82 union unaligned
84 void *p;
85 unsigned u2 __attribute__ ((mode (HI)));
86 unsigned u4 __attribute__ ((mode (SI)));
87 unsigned u8 __attribute__ ((mode (DI)));
88 signed s2 __attribute__ ((mode (HI)));
89 signed s4 __attribute__ ((mode (SI)));
90 signed s8 __attribute__ ((mode (DI)));
91 } __attribute__ ((packed));
93 static inline void *
94 read_pointer (const void *p) { const union unaligned *up = p; return up->p; }
96 static inline int
97 read_1u (const void *p) { return *(const unsigned char *) p; }
99 static inline int
100 read_1s (const void *p) { return *(const signed char *) p; }
102 static inline int
103 read_2u (const void *p) { const union unaligned *up = p; return up->u2; }
105 static inline int
106 read_2s (const void *p) { const union unaligned *up = p; return up->s2; }
108 static inline unsigned int
109 read_4u (const void *p) { const union unaligned *up = p; return up->u4; }
111 static inline int
112 read_4s (const void *p) { const union unaligned *up = p; return up->s4; }
114 static inline unsigned long
115 read_8u (const void *p) { const union unaligned *up = p; return up->u8; }
117 static inline unsigned long
118 read_8s (const void *p) { const union unaligned *up = p; return up->s8; }
120 /* Get the value of register REG as saved in CONTEXT. */
122 inline _Unwind_Word
123 _Unwind_GetGR (struct _Unwind_Context *context, int index)
125 int size;
126 void *ptr;
128 #ifdef DWARF_ZERO_REG
129 if (index == DWARF_ZERO_REG)
130 return 0;
131 #endif
133 index = DWARF_REG_TO_UNWIND_COLUMN (index);
134 gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
135 size = dwarf_reg_size_table[index];
136 ptr = context->reg[index];
138 /* This will segfault if the register hasn't been saved. */
139 if (size == sizeof(_Unwind_Ptr))
140 return * (_Unwind_Ptr *) ptr;
141 else
143 gcc_assert (size == sizeof(_Unwind_Word));
144 return * (_Unwind_Word *) ptr;
148 static inline void *
149 _Unwind_GetPtr (struct _Unwind_Context *context, int index)
151 return (void *)(_Unwind_Ptr) _Unwind_GetGR (context, index);
154 /* Get the value of the CFA as saved in CONTEXT. */
156 _Unwind_Word
157 _Unwind_GetCFA (struct _Unwind_Context *context)
159 return (_Unwind_Ptr) context->cfa;
162 /* Overwrite the saved value for register REG in CONTEXT with VAL. */
164 inline void
165 _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
167 int size;
168 void *ptr;
170 index = DWARF_REG_TO_UNWIND_COLUMN (index);
171 gcc_assert (index < (int) sizeof(dwarf_reg_size_table));
172 size = dwarf_reg_size_table[index];
173 ptr = context->reg[index];
175 if (size == sizeof(_Unwind_Ptr))
176 * (_Unwind_Ptr *) ptr = val;
177 else
179 gcc_assert (size == sizeof(_Unwind_Word));
180 * (_Unwind_Word *) ptr = val;
184 /* Get the pointer to a register INDEX as saved in CONTEXT. */
186 static inline void *
187 _Unwind_GetGRPtr (struct _Unwind_Context *context, int index)
189 index = DWARF_REG_TO_UNWIND_COLUMN (index);
190 return context->reg[index];
193 /* Set the pointer to a register INDEX as saved in CONTEXT. */
195 static inline void
196 _Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p)
198 index = DWARF_REG_TO_UNWIND_COLUMN (index);
199 context->reg[index] = p;
202 /* Retrieve the return address for CONTEXT. */
204 inline _Unwind_Ptr
205 _Unwind_GetIP (struct _Unwind_Context *context)
207 return (_Unwind_Ptr) context->ra;
210 /* Overwrite the return address for CONTEXT with VAL. */
212 inline void
213 _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
215 context->ra = (void *) val;
218 void *
219 _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
221 return context->lsda;
224 _Unwind_Ptr
225 _Unwind_GetRegionStart (struct _Unwind_Context *context)
227 return (_Unwind_Ptr) context->bases.func;
230 void *
231 _Unwind_FindEnclosingFunction (void *pc)
233 struct dwarf_eh_bases bases;
234 const struct dwarf_fde *fde = _Unwind_Find_FDE (pc-1, &bases);
235 if (fde)
236 return bases.func;
237 else
238 return NULL;
241 #ifndef __ia64__
242 _Unwind_Ptr
243 _Unwind_GetDataRelBase (struct _Unwind_Context *context)
245 return (_Unwind_Ptr) context->bases.dbase;
248 _Unwind_Ptr
249 _Unwind_GetTextRelBase (struct _Unwind_Context *context)
251 return (_Unwind_Ptr) context->bases.tbase;
253 #endif
255 #ifdef MD_UNWIND_SUPPORT
256 #include MD_UNWIND_SUPPORT
257 #endif
259 /* Extract any interesting information from the CIE for the translation
260 unit F belongs to. Return a pointer to the byte after the augmentation,
261 or NULL if we encountered an undecipherable augmentation. */
263 static const unsigned char *
264 extract_cie_info (const struct dwarf_cie *cie, struct _Unwind_Context *context,
265 _Unwind_FrameState *fs)
267 const unsigned char *aug = cie->augmentation;
268 const unsigned char *p = aug + strlen ((const char *)aug) + 1;
269 const unsigned char *ret = NULL;
270 _Unwind_Word utmp;
272 /* g++ v2 "eh" has pointer immediately following augmentation string,
273 so it must be handled first. */
274 if (aug[0] == 'e' && aug[1] == 'h')
276 fs->eh_ptr = read_pointer (p);
277 p += sizeof (void *);
278 aug += 2;
281 /* Immediately following the augmentation are the code and
282 data alignment and return address column. */
283 p = read_uleb128 (p, &fs->code_align);
284 p = read_sleb128 (p, &fs->data_align);
285 if (cie->version == 1)
286 fs->retaddr_column = *p++;
287 else
288 p = read_uleb128 (p, &fs->retaddr_column);
289 fs->lsda_encoding = DW_EH_PE_omit;
291 /* If the augmentation starts with 'z', then a uleb128 immediately
292 follows containing the length of the augmentation field following
293 the size. */
294 if (*aug == 'z')
296 p = read_uleb128 (p, &utmp);
297 ret = p + utmp;
299 fs->saw_z = 1;
300 ++aug;
303 /* Iterate over recognized augmentation subsequences. */
304 while (*aug != '\0')
306 /* "L" indicates a byte showing how the LSDA pointer is encoded. */
307 if (aug[0] == 'L')
309 fs->lsda_encoding = *p++;
310 aug += 1;
313 /* "R" indicates a byte indicating how FDE addresses are encoded. */
314 else if (aug[0] == 'R')
316 fs->fde_encoding = *p++;
317 aug += 1;
320 /* "P" indicates a personality routine in the CIE augmentation. */
321 else if (aug[0] == 'P')
323 _Unwind_Ptr personality;
325 p = read_encoded_value (context, *p, p + 1, &personality);
326 fs->personality = (_Unwind_Personality_Fn) personality;
327 aug += 1;
330 /* Otherwise we have an unknown augmentation string.
331 Bail unless we saw a 'z' prefix. */
332 else
333 return ret;
336 return ret ? ret : p;
340 /* Decode a DW_OP stack program. Return the top of stack. Push INITIAL
341 onto the stack to start. */
343 static _Unwind_Word
344 execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end,
345 struct _Unwind_Context *context, _Unwind_Word initial)
347 _Unwind_Word stack[64]; /* ??? Assume this is enough. */
348 int stack_elt;
350 stack[0] = initial;
351 stack_elt = 1;
353 while (op_ptr < op_end)
355 enum dwarf_location_atom op = *op_ptr++;
356 _Unwind_Word result, reg, utmp;
357 _Unwind_Sword offset, stmp;
359 switch (op)
361 case DW_OP_lit0:
362 case DW_OP_lit1:
363 case DW_OP_lit2:
364 case DW_OP_lit3:
365 case DW_OP_lit4:
366 case DW_OP_lit5:
367 case DW_OP_lit6:
368 case DW_OP_lit7:
369 case DW_OP_lit8:
370 case DW_OP_lit9:
371 case DW_OP_lit10:
372 case DW_OP_lit11:
373 case DW_OP_lit12:
374 case DW_OP_lit13:
375 case DW_OP_lit14:
376 case DW_OP_lit15:
377 case DW_OP_lit16:
378 case DW_OP_lit17:
379 case DW_OP_lit18:
380 case DW_OP_lit19:
381 case DW_OP_lit20:
382 case DW_OP_lit21:
383 case DW_OP_lit22:
384 case DW_OP_lit23:
385 case DW_OP_lit24:
386 case DW_OP_lit25:
387 case DW_OP_lit26:
388 case DW_OP_lit27:
389 case DW_OP_lit28:
390 case DW_OP_lit29:
391 case DW_OP_lit30:
392 case DW_OP_lit31:
393 result = op - DW_OP_lit0;
394 break;
396 case DW_OP_addr:
397 result = (_Unwind_Word) (_Unwind_Ptr) read_pointer (op_ptr);
398 op_ptr += sizeof (void *);
399 break;
401 case DW_OP_const1u:
402 result = read_1u (op_ptr);
403 op_ptr += 1;
404 break;
405 case DW_OP_const1s:
406 result = read_1s (op_ptr);
407 op_ptr += 1;
408 break;
409 case DW_OP_const2u:
410 result = read_2u (op_ptr);
411 op_ptr += 2;
412 break;
413 case DW_OP_const2s:
414 result = read_2s (op_ptr);
415 op_ptr += 2;
416 break;
417 case DW_OP_const4u:
418 result = read_4u (op_ptr);
419 op_ptr += 4;
420 break;
421 case DW_OP_const4s:
422 result = read_4s (op_ptr);
423 op_ptr += 4;
424 break;
425 case DW_OP_const8u:
426 result = read_8u (op_ptr);
427 op_ptr += 8;
428 break;
429 case DW_OP_const8s:
430 result = read_8s (op_ptr);
431 op_ptr += 8;
432 break;
433 case DW_OP_constu:
434 op_ptr = read_uleb128 (op_ptr, &result);
435 break;
436 case DW_OP_consts:
437 op_ptr = read_sleb128 (op_ptr, &stmp);
438 result = stmp;
439 break;
441 case DW_OP_reg0:
442 case DW_OP_reg1:
443 case DW_OP_reg2:
444 case DW_OP_reg3:
445 case DW_OP_reg4:
446 case DW_OP_reg5:
447 case DW_OP_reg6:
448 case DW_OP_reg7:
449 case DW_OP_reg8:
450 case DW_OP_reg9:
451 case DW_OP_reg10:
452 case DW_OP_reg11:
453 case DW_OP_reg12:
454 case DW_OP_reg13:
455 case DW_OP_reg14:
456 case DW_OP_reg15:
457 case DW_OP_reg16:
458 case DW_OP_reg17:
459 case DW_OP_reg18:
460 case DW_OP_reg19:
461 case DW_OP_reg20:
462 case DW_OP_reg21:
463 case DW_OP_reg22:
464 case DW_OP_reg23:
465 case DW_OP_reg24:
466 case DW_OP_reg25:
467 case DW_OP_reg26:
468 case DW_OP_reg27:
469 case DW_OP_reg28:
470 case DW_OP_reg29:
471 case DW_OP_reg30:
472 case DW_OP_reg31:
473 result = _Unwind_GetGR (context, op - DW_OP_reg0);
474 break;
475 case DW_OP_regx:
476 op_ptr = read_uleb128 (op_ptr, &reg);
477 result = _Unwind_GetGR (context, reg);
478 break;
480 case DW_OP_breg0:
481 case DW_OP_breg1:
482 case DW_OP_breg2:
483 case DW_OP_breg3:
484 case DW_OP_breg4:
485 case DW_OP_breg5:
486 case DW_OP_breg6:
487 case DW_OP_breg7:
488 case DW_OP_breg8:
489 case DW_OP_breg9:
490 case DW_OP_breg10:
491 case DW_OP_breg11:
492 case DW_OP_breg12:
493 case DW_OP_breg13:
494 case DW_OP_breg14:
495 case DW_OP_breg15:
496 case DW_OP_breg16:
497 case DW_OP_breg17:
498 case DW_OP_breg18:
499 case DW_OP_breg19:
500 case DW_OP_breg20:
501 case DW_OP_breg21:
502 case DW_OP_breg22:
503 case DW_OP_breg23:
504 case DW_OP_breg24:
505 case DW_OP_breg25:
506 case DW_OP_breg26:
507 case DW_OP_breg27:
508 case DW_OP_breg28:
509 case DW_OP_breg29:
510 case DW_OP_breg30:
511 case DW_OP_breg31:
512 op_ptr = read_sleb128 (op_ptr, &offset);
513 result = _Unwind_GetGR (context, op - DW_OP_breg0) + offset;
514 break;
515 case DW_OP_bregx:
516 op_ptr = read_uleb128 (op_ptr, &reg);
517 op_ptr = read_sleb128 (op_ptr, &offset);
518 result = _Unwind_GetGR (context, reg) + offset;
519 break;
521 case DW_OP_dup:
522 gcc_assert (stack_elt);
523 result = stack[stack_elt - 1];
524 break;
526 case DW_OP_drop:
527 gcc_assert (stack_elt);
528 stack_elt -= 1;
529 goto no_push;
531 case DW_OP_pick:
532 offset = *op_ptr++;
533 gcc_assert (offset < stack_elt - 1);
534 result = stack[stack_elt - 1 - offset];
535 break;
537 case DW_OP_over:
538 gcc_assert (stack_elt >= 2);
539 result = stack[stack_elt - 2];
540 break;
542 case DW_OP_rot:
544 _Unwind_Word t1, t2, t3;
546 gcc_assert (stack_elt >= 3);
547 t1 = stack[stack_elt - 1];
548 t2 = stack[stack_elt - 2];
549 t3 = stack[stack_elt - 3];
550 stack[stack_elt - 1] = t2;
551 stack[stack_elt - 2] = t3;
552 stack[stack_elt - 3] = t1;
553 goto no_push;
556 case DW_OP_deref:
557 case DW_OP_deref_size:
558 case DW_OP_abs:
559 case DW_OP_neg:
560 case DW_OP_not:
561 case DW_OP_plus_uconst:
562 /* Unary operations. */
563 gcc_assert (stack_elt);
564 stack_elt -= 1;
566 result = stack[stack_elt];
568 switch (op)
570 case DW_OP_deref:
572 void *ptr = (void *) (_Unwind_Ptr) result;
573 result = (_Unwind_Ptr) read_pointer (ptr);
575 break;
577 case DW_OP_deref_size:
579 void *ptr = (void *) (_Unwind_Ptr) result;
580 switch (*op_ptr++)
582 case 1:
583 result = read_1u (ptr);
584 break;
585 case 2:
586 result = read_2u (ptr);
587 break;
588 case 4:
589 result = read_4u (ptr);
590 break;
591 case 8:
592 result = read_8u (ptr);
593 break;
594 default:
595 gcc_unreachable ();
598 break;
600 case DW_OP_abs:
601 if ((_Unwind_Sword) result < 0)
602 result = -result;
603 break;
604 case DW_OP_neg:
605 result = -result;
606 break;
607 case DW_OP_not:
608 result = ~result;
609 break;
610 case DW_OP_plus_uconst:
611 op_ptr = read_uleb128 (op_ptr, &utmp);
612 result += utmp;
613 break;
615 default:
616 gcc_unreachable ();
618 break;
620 case DW_OP_and:
621 case DW_OP_div:
622 case DW_OP_minus:
623 case DW_OP_mod:
624 case DW_OP_mul:
625 case DW_OP_or:
626 case DW_OP_plus:
627 case DW_OP_shl:
628 case DW_OP_shr:
629 case DW_OP_shra:
630 case DW_OP_xor:
631 case DW_OP_le:
632 case DW_OP_ge:
633 case DW_OP_eq:
634 case DW_OP_lt:
635 case DW_OP_gt:
636 case DW_OP_ne:
638 /* Binary operations. */
639 _Unwind_Word first, second;
640 gcc_assert (stack_elt >= 2);
641 stack_elt -= 2;
643 second = stack[stack_elt];
644 first = stack[stack_elt + 1];
646 switch (op)
648 case DW_OP_and:
649 result = second & first;
650 break;
651 case DW_OP_div:
652 result = (_Unwind_Sword) second / (_Unwind_Sword) first;
653 break;
654 case DW_OP_minus:
655 result = second - first;
656 break;
657 case DW_OP_mod:
658 result = (_Unwind_Sword) second % (_Unwind_Sword) first;
659 break;
660 case DW_OP_mul:
661 result = second * first;
662 break;
663 case DW_OP_or:
664 result = second | first;
665 break;
666 case DW_OP_plus:
667 result = second + first;
668 break;
669 case DW_OP_shl:
670 result = second << first;
671 break;
672 case DW_OP_shr:
673 result = second >> first;
674 break;
675 case DW_OP_shra:
676 result = (_Unwind_Sword) second >> first;
677 break;
678 case DW_OP_xor:
679 result = second ^ first;
680 break;
681 case DW_OP_le:
682 result = (_Unwind_Sword) first <= (_Unwind_Sword) second;
683 break;
684 case DW_OP_ge:
685 result = (_Unwind_Sword) first >= (_Unwind_Sword) second;
686 break;
687 case DW_OP_eq:
688 result = (_Unwind_Sword) first == (_Unwind_Sword) second;
689 break;
690 case DW_OP_lt:
691 result = (_Unwind_Sword) first < (_Unwind_Sword) second;
692 break;
693 case DW_OP_gt:
694 result = (_Unwind_Sword) first > (_Unwind_Sword) second;
695 break;
696 case DW_OP_ne:
697 result = (_Unwind_Sword) first != (_Unwind_Sword) second;
698 break;
700 default:
701 gcc_unreachable ();
704 break;
706 case DW_OP_skip:
707 offset = read_2s (op_ptr);
708 op_ptr += 2;
709 op_ptr += offset;
710 goto no_push;
712 case DW_OP_bra:
713 gcc_assert (stack_elt);
714 stack_elt -= 1;
716 offset = read_2s (op_ptr);
717 op_ptr += 2;
718 if (stack[stack_elt] != 0)
719 op_ptr += offset;
720 goto no_push;
722 case DW_OP_nop:
723 goto no_push;
725 default:
726 gcc_unreachable ();
729 /* Most things push a result value. */
730 gcc_assert ((size_t) stack_elt < sizeof(stack)/sizeof(*stack));
731 stack[stack_elt++] = result;
732 no_push:;
735 /* We were executing this program to get a value. It should be
736 at top of stack. */
737 gcc_assert (stack_elt);
738 stack_elt -= 1;
739 return stack[stack_elt];
743 /* Decode DWARF 2 call frame information. Takes pointers the
744 instruction sequence to decode, current register information and
745 CIE info, and the PC range to evaluate. */
747 static void
748 execute_cfa_program (const unsigned char *insn_ptr,
749 const unsigned char *insn_end,
750 struct _Unwind_Context *context,
751 _Unwind_FrameState *fs)
753 struct frame_state_reg_info *unused_rs = NULL;
755 /* Don't allow remember/restore between CIE and FDE programs. */
756 fs->regs.prev = NULL;
758 /* The comparison with the return address uses < rather than <= because
759 we are only interested in the effects of code before the call; for a
760 noreturn function, the return address may point to unrelated code with
761 a different stack configuration that we are not interested in. We
762 assume that the call itself is unwind info-neutral; if not, or if
763 there are delay instructions that adjust the stack, these must be
764 reflected at the point immediately before the call insn. */
765 while (insn_ptr < insn_end && fs->pc < context->ra)
767 unsigned char insn = *insn_ptr++;
768 _Unwind_Word reg, utmp;
769 _Unwind_Sword offset, stmp;
771 if ((insn & 0xc0) == DW_CFA_advance_loc)
772 fs->pc += (insn & 0x3f) * fs->code_align;
773 else if ((insn & 0xc0) == DW_CFA_offset)
775 reg = insn & 0x3f;
776 insn_ptr = read_uleb128 (insn_ptr, &utmp);
777 offset = (_Unwind_Sword) utmp * fs->data_align;
778 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
779 = REG_SAVED_OFFSET;
780 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
782 else if ((insn & 0xc0) == DW_CFA_restore)
784 reg = insn & 0x3f;
785 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_UNSAVED;
787 else switch (insn)
789 case DW_CFA_set_loc:
791 _Unwind_Ptr pc;
793 insn_ptr = read_encoded_value (context, fs->fde_encoding,
794 insn_ptr, &pc);
795 fs->pc = (void *) pc;
797 break;
799 case DW_CFA_advance_loc1:
800 fs->pc += read_1u (insn_ptr) * fs->code_align;
801 insn_ptr += 1;
802 break;
803 case DW_CFA_advance_loc2:
804 fs->pc += read_2u (insn_ptr) * fs->code_align;
805 insn_ptr += 2;
806 break;
807 case DW_CFA_advance_loc4:
808 fs->pc += read_4u (insn_ptr) * fs->code_align;
809 insn_ptr += 4;
810 break;
812 case DW_CFA_offset_extended:
813 insn_ptr = read_uleb128 (insn_ptr, &reg);
814 insn_ptr = read_uleb128 (insn_ptr, &utmp);
815 offset = (_Unwind_Sword) utmp * fs->data_align;
816 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
817 = REG_SAVED_OFFSET;
818 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
819 break;
821 case DW_CFA_restore_extended:
822 insn_ptr = read_uleb128 (insn_ptr, &reg);
823 /* FIXME, this is wrong; the CIE might have said that the
824 register was saved somewhere. */
825 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED;
826 break;
828 case DW_CFA_undefined:
829 case DW_CFA_same_value:
830 insn_ptr = read_uleb128 (insn_ptr, &reg);
831 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED;
832 break;
834 case DW_CFA_nop:
835 break;
837 case DW_CFA_register:
839 _Unwind_Word reg2;
840 insn_ptr = read_uleb128 (insn_ptr, &reg);
841 insn_ptr = read_uleb128 (insn_ptr, &reg2);
842 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_REG;
843 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.reg = reg2;
845 break;
847 case DW_CFA_remember_state:
849 struct frame_state_reg_info *new_rs;
850 if (unused_rs)
852 new_rs = unused_rs;
853 unused_rs = unused_rs->prev;
855 else
856 new_rs = alloca (sizeof (struct frame_state_reg_info));
858 *new_rs = fs->regs;
859 fs->regs.prev = new_rs;
861 break;
863 case DW_CFA_restore_state:
865 struct frame_state_reg_info *old_rs = fs->regs.prev;
866 fs->regs = *old_rs;
867 old_rs->prev = unused_rs;
868 unused_rs = old_rs;
870 break;
872 case DW_CFA_def_cfa:
873 insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
874 insn_ptr = read_uleb128 (insn_ptr, &utmp);
875 fs->cfa_offset = utmp;
876 fs->cfa_how = CFA_REG_OFFSET;
877 break;
879 case DW_CFA_def_cfa_register:
880 insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
881 fs->cfa_how = CFA_REG_OFFSET;
882 break;
884 case DW_CFA_def_cfa_offset:
885 insn_ptr = read_uleb128 (insn_ptr, &utmp);
886 fs->cfa_offset = utmp;
887 /* cfa_how deliberately not set. */
888 break;
890 case DW_CFA_def_cfa_expression:
891 fs->cfa_exp = insn_ptr;
892 fs->cfa_how = CFA_EXP;
893 insn_ptr = read_uleb128 (insn_ptr, &utmp);
894 insn_ptr += utmp;
895 break;
897 case DW_CFA_expression:
898 insn_ptr = read_uleb128 (insn_ptr, &reg);
899 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_EXP;
900 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.exp = insn_ptr;
901 insn_ptr = read_uleb128 (insn_ptr, &utmp);
902 insn_ptr += utmp;
903 break;
905 /* From the 2.1 draft. */
906 case DW_CFA_offset_extended_sf:
907 insn_ptr = read_uleb128 (insn_ptr, &reg);
908 insn_ptr = read_sleb128 (insn_ptr, &stmp);
909 offset = stmp * fs->data_align;
910 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
911 = REG_SAVED_OFFSET;
912 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
913 break;
915 case DW_CFA_def_cfa_sf:
916 insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
917 insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
918 fs->cfa_how = CFA_REG_OFFSET;
919 break;
921 case DW_CFA_def_cfa_offset_sf:
922 insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
923 /* cfa_how deliberately not set. */
924 break;
926 case DW_CFA_GNU_window_save:
927 /* ??? Hardcoded for SPARC register window configuration. */
928 for (reg = 16; reg < 32; ++reg)
930 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
931 fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *);
933 break;
935 case DW_CFA_GNU_args_size:
936 insn_ptr = read_uleb128 (insn_ptr, &context->args_size);
937 break;
939 case DW_CFA_GNU_negative_offset_extended:
940 /* Obsoleted by DW_CFA_offset_extended_sf, but used by
941 older PowerPC code. */
942 insn_ptr = read_uleb128 (insn_ptr, &reg);
943 insn_ptr = read_uleb128 (insn_ptr, &utmp);
944 offset = (_Unwind_Word) utmp * fs->data_align;
945 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
946 = REG_SAVED_OFFSET;
947 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = -offset;
948 break;
950 default:
951 gcc_unreachable ();
956 /* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for
957 its caller and decode it into FS. This function also sets the
958 args_size and lsda members of CONTEXT, as they are really information
959 about the caller's frame. */
961 static _Unwind_Reason_Code
962 uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
964 const struct dwarf_fde *fde;
965 const struct dwarf_cie *cie;
966 const unsigned char *aug, *insn, *end;
968 memset (fs, 0, sizeof (*fs));
969 context->args_size = 0;
970 context->lsda = 0;
972 if (context->ra == 0)
973 return _URC_END_OF_STACK;
975 fde = _Unwind_Find_FDE (context->ra - 1, &context->bases);
976 if (fde == NULL)
978 #ifdef MD_FALLBACK_FRAME_STATE_FOR
979 /* Couldn't find frame unwind info for this function. Try a
980 target-specific fallback mechanism. This will necessarily
981 not provide a personality routine or LSDA. */
982 return MD_FALLBACK_FRAME_STATE_FOR (context, fs);
983 #else
984 return _URC_END_OF_STACK;
985 #endif
988 fs->pc = context->bases.func;
990 cie = get_cie (fde);
991 insn = extract_cie_info (cie, context, fs);
992 if (insn == NULL)
993 /* CIE contained unknown augmentation. */
994 return _URC_FATAL_PHASE1_ERROR;
996 /* First decode all the insns in the CIE. */
997 end = (unsigned char *) next_fde ((struct dwarf_fde *) cie);
998 execute_cfa_program (insn, end, context, fs);
1000 /* Locate augmentation for the fde. */
1001 aug = (unsigned char *) fde + sizeof (*fde);
1002 aug += 2 * size_of_encoded_value (fs->fde_encoding);
1003 insn = NULL;
1004 if (fs->saw_z)
1006 _Unwind_Word i;
1007 aug = read_uleb128 (aug, &i);
1008 insn = aug + i;
1010 if (fs->lsda_encoding != DW_EH_PE_omit)
1012 _Unwind_Ptr lsda;
1014 aug = read_encoded_value (context, fs->lsda_encoding, aug, &lsda);
1015 context->lsda = (void *) lsda;
1018 /* Then the insns in the FDE up to our target PC. */
1019 if (insn == NULL)
1020 insn = aug;
1021 end = (unsigned char *) next_fde (fde);
1022 execute_cfa_program (insn, end, context, fs);
1024 return _URC_NO_REASON;
1027 typedef struct frame_state
1029 void *cfa;
1030 void *eh_ptr;
1031 long cfa_offset;
1032 long args_size;
1033 long reg_or_offset[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1034 unsigned short cfa_reg;
1035 unsigned short retaddr_column;
1036 char saved[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1037 } frame_state;
1039 struct frame_state * __frame_state_for (void *, struct frame_state *);
1041 /* Called from pre-G++ 3.0 __throw to find the registers to restore for
1042 a given PC_TARGET. The caller should allocate a local variable of
1043 `struct frame_state' and pass its address to STATE_IN. */
1045 struct frame_state *
1046 __frame_state_for (void *pc_target, struct frame_state *state_in)
1048 struct _Unwind_Context context;
1049 _Unwind_FrameState fs;
1050 int reg;
1052 memset (&context, 0, sizeof (struct _Unwind_Context));
1053 context.ra = pc_target + 1;
1055 if (uw_frame_state_for (&context, &fs) != _URC_NO_REASON)
1056 return 0;
1058 /* We have no way to pass a location expression for the CFA to our
1059 caller. It wouldn't understand it anyway. */
1060 if (fs.cfa_how == CFA_EXP)
1061 return 0;
1063 for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
1065 state_in->saved[reg] = fs.regs.reg[reg].how;
1066 switch (state_in->saved[reg])
1068 case REG_SAVED_REG:
1069 state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.reg;
1070 break;
1071 case REG_SAVED_OFFSET:
1072 state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.offset;
1073 break;
1074 default:
1075 state_in->reg_or_offset[reg] = 0;
1076 break;
1080 state_in->cfa_offset = fs.cfa_offset;
1081 state_in->cfa_reg = fs.cfa_reg;
1082 state_in->retaddr_column = fs.retaddr_column;
1083 state_in->args_size = context.args_size;
1084 state_in->eh_ptr = fs.eh_ptr;
1086 return state_in;
1089 typedef union { _Unwind_Ptr ptr; _Unwind_Word word; } _Unwind_SpTmp;
1091 static inline void
1092 _Unwind_SetSpColumn (struct _Unwind_Context *context, void *cfa,
1093 _Unwind_SpTmp *tmp_sp)
1095 int size = dwarf_reg_size_table[__builtin_dwarf_sp_column ()];
1097 if (size == sizeof(_Unwind_Ptr))
1098 tmp_sp->ptr = (_Unwind_Ptr) cfa;
1099 else
1101 gcc_assert (size == sizeof(_Unwind_Word));
1102 tmp_sp->word = (_Unwind_Ptr) cfa;
1104 _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), tmp_sp);
1107 static void
1108 uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1110 struct _Unwind_Context orig_context = *context;
1111 void *cfa;
1112 long i;
1114 #ifdef EH_RETURN_STACKADJ_RTX
1115 /* Special handling here: Many machines do not use a frame pointer,
1116 and track the CFA only through offsets from the stack pointer from
1117 one frame to the next. In this case, the stack pointer is never
1118 stored, so it has no saved address in the context. What we do
1119 have is the CFA from the previous stack frame.
1121 In very special situations (such as unwind info for signal return),
1122 there may be location expressions that use the stack pointer as well.
1124 Do this conditionally for one frame. This allows the unwind info
1125 for one frame to save a copy of the stack pointer from the previous
1126 frame, and be able to use much easier CFA mechanisms to do it.
1127 Always zap the saved stack pointer value for the next frame; carrying
1128 the value over from one frame to another doesn't make sense. */
1130 _Unwind_SpTmp tmp_sp;
1132 if (!_Unwind_GetGRPtr (&orig_context, __builtin_dwarf_sp_column ()))
1133 _Unwind_SetSpColumn (&orig_context, context->cfa, &tmp_sp);
1134 _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), NULL);
1135 #endif
1137 /* Compute this frame's CFA. */
1138 switch (fs->cfa_how)
1140 case CFA_REG_OFFSET:
1141 cfa = _Unwind_GetPtr (&orig_context, fs->cfa_reg);
1142 cfa += fs->cfa_offset;
1143 break;
1145 case CFA_EXP:
1147 const unsigned char *exp = fs->cfa_exp;
1148 _Unwind_Word len;
1150 exp = read_uleb128 (exp, &len);
1151 cfa = (void *) (_Unwind_Ptr)
1152 execute_stack_op (exp, exp + len, &orig_context, 0);
1153 break;
1156 default:
1157 gcc_unreachable ();
1159 context->cfa = cfa;
1161 /* Compute the addresses of all registers saved in this frame. */
1162 for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i)
1163 switch (fs->regs.reg[i].how)
1165 case REG_UNSAVED:
1166 break;
1168 case REG_SAVED_OFFSET:
1169 _Unwind_SetGRPtr (context, i,
1170 (void *) (cfa + fs->regs.reg[i].loc.offset));
1171 break;
1173 case REG_SAVED_REG:
1174 _Unwind_SetGRPtr
1175 (context, i,
1176 _Unwind_GetGRPtr (&orig_context, fs->regs.reg[i].loc.reg));
1177 break;
1179 case REG_SAVED_EXP:
1181 const unsigned char *exp = fs->regs.reg[i].loc.exp;
1182 _Unwind_Word len;
1183 _Unwind_Ptr val;
1185 exp = read_uleb128 (exp, &len);
1186 val = execute_stack_op (exp, exp + len, &orig_context,
1187 (_Unwind_Ptr) cfa);
1188 _Unwind_SetGRPtr (context, i, (void *) val);
1190 break;
1193 #ifdef MD_FROB_UPDATE_CONTEXT
1194 MD_FROB_UPDATE_CONTEXT (context, fs);
1195 #endif
1198 /* CONTEXT describes the unwind state for a frame, and FS describes the FDE
1199 of its caller. Update CONTEXT to refer to the caller as well. Note
1200 that the args_size and lsda members are not updated here, but later in
1201 uw_frame_state_for. */
1203 static void
1204 uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1206 uw_update_context_1 (context, fs);
1208 /* Compute the return address now, since the return address column
1209 can change from frame to frame. */
1210 context->ra = __builtin_extract_return_addr
1211 (_Unwind_GetPtr (context, fs->retaddr_column));
1214 /* Fill in CONTEXT for top-of-stack. The only valid registers at this
1215 level will be the return address and the CFA. */
1217 #define uw_init_context(CONTEXT) \
1218 do \
1220 /* Do any necessary initialization to access arbitrary stack frames. \
1221 On the SPARC, this means flushing the register windows. */ \
1222 __builtin_unwind_init (); \
1223 uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (), \
1224 __builtin_return_address (0)); \
1226 while (0)
1228 static inline void
1229 init_dwarf_reg_size_table (void)
1231 __builtin_init_dwarf_reg_size_table (dwarf_reg_size_table);
1234 static void
1235 uw_init_context_1 (struct _Unwind_Context *context,
1236 void *outer_cfa, void *outer_ra)
1238 void *ra = __builtin_extract_return_addr (__builtin_return_address (0));
1239 _Unwind_FrameState fs;
1240 _Unwind_SpTmp sp_slot;
1241 _Unwind_Reason_Code code;
1243 memset (context, 0, sizeof (struct _Unwind_Context));
1244 context->ra = ra;
1246 code = uw_frame_state_for (context, &fs);
1247 gcc_assert (code == _URC_NO_REASON);
1249 #if __GTHREADS
1251 static __gthread_once_t once_regsizes = __GTHREAD_ONCE_INIT;
1252 if (__gthread_once (&once_regsizes, init_dwarf_reg_size_table) != 0
1253 || dwarf_reg_size_table[0] == 0)
1254 init_dwarf_reg_size_table ();
1256 #else
1257 if (dwarf_reg_size_table[0] == 0)
1258 init_dwarf_reg_size_table ();
1259 #endif
1261 /* Force the frame state to use the known cfa value. */
1262 _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
1263 fs.cfa_how = CFA_REG_OFFSET;
1264 fs.cfa_reg = __builtin_dwarf_sp_column ();
1265 fs.cfa_offset = 0;
1267 uw_update_context_1 (context, &fs);
1269 /* If the return address column was saved in a register in the
1270 initialization context, then we can't see it in the given
1271 call frame data. So have the initialization context tell us. */
1272 context->ra = __builtin_extract_return_addr (outer_ra);
1276 /* Install TARGET into CURRENT so that we can return to it. This is a
1277 macro because __builtin_eh_return must be invoked in the context of
1278 our caller. */
1280 #define uw_install_context(CURRENT, TARGET) \
1281 do \
1283 long offset = uw_install_context_1 ((CURRENT), (TARGET)); \
1284 void *handler = __builtin_frob_return_addr ((TARGET)->ra); \
1285 __builtin_eh_return (offset, handler); \
1287 while (0)
1289 static long
1290 uw_install_context_1 (struct _Unwind_Context *current,
1291 struct _Unwind_Context *target)
1293 long i;
1294 _Unwind_SpTmp sp_slot;
1296 /* If the target frame does not have a saved stack pointer,
1297 then set up the target's CFA. */
1298 if (!_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ()))
1299 _Unwind_SetSpColumn (target, target->cfa, &sp_slot);
1301 for (i = 0; i < DWARF_FRAME_REGISTERS; ++i)
1303 void *c = current->reg[i];
1304 void *t = target->reg[i];
1306 if (t && c && t != c)
1307 memcpy (c, t, dwarf_reg_size_table[i]);
1310 /* If the current frame doesn't have a saved stack pointer, then we
1311 need to rely on EH_RETURN_STACKADJ_RTX to get our target stack
1312 pointer value reloaded. */
1313 if (!_Unwind_GetGRPtr (current, __builtin_dwarf_sp_column ()))
1315 void *target_cfa;
1317 target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ());
1319 /* We adjust SP by the difference between CURRENT and TARGET's CFA. */
1320 if (STACK_GROWS_DOWNWARD)
1321 return target_cfa - current->cfa + target->args_size;
1322 else
1323 return current->cfa - target_cfa - target->args_size;
1325 return 0;
1328 static inline _Unwind_Ptr
1329 uw_identify_context (struct _Unwind_Context *context)
1331 return _Unwind_GetIP (context);
1335 #include "unwind.inc"
1337 #if defined (USE_GAS_SYMVER) && defined (SHARED) && defined (USE_LIBUNWIND_EXCEPTIONS)
1338 alias (_Unwind_Backtrace);
1339 alias (_Unwind_DeleteException);
1340 alias (_Unwind_FindEnclosingFunction);
1341 alias (_Unwind_ForcedUnwind);
1342 alias (_Unwind_GetDataRelBase);
1343 alias (_Unwind_GetTextRelBase);
1344 alias (_Unwind_GetCFA);
1345 alias (_Unwind_GetGR);
1346 alias (_Unwind_GetIP);
1347 alias (_Unwind_GetLanguageSpecificData);
1348 alias (_Unwind_GetRegionStart);
1349 alias (_Unwind_RaiseException);
1350 alias (_Unwind_Resume);
1351 alias (_Unwind_Resume_or_Rethrow);
1352 alias (_Unwind_SetGR);
1353 alias (_Unwind_SetIP);
1354 #endif
1356 #endif /* !USING_SJLJ_EXCEPTIONS */