1 /* DWARF2 exception handling and frame unwind runtime interface routines.
2 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
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)
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
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, 59 Temple Place - Suite 330, Boston, MA
33 #include "coretypes.h"
37 #ifdef __USING_SJLJ_EXCEPTIONS__
38 # define NO_SIZE_OF_ENCODED_VALUE
40 #include "unwind-pe.h"
41 #include "unwind-dw2-fde.h"
45 #ifndef __USING_SJLJ_EXCEPTIONS__
47 #ifndef STACK_GROWS_DOWNWARD
48 #define STACK_GROWS_DOWNWARD 0
50 #undef STACK_GROWS_DOWNWARD
51 #define STACK_GROWS_DOWNWARD 1
54 /* A target can override (perhaps for backward compatibility) how
55 many dwarf2 columns are unwound. */
56 #ifndef DWARF_FRAME_REGISTERS
57 #define DWARF_FRAME_REGISTERS FIRST_PSEUDO_REGISTER
60 /* Dwarf frame registers used for pre gcc 3.0 compiled glibc. */
61 #ifndef PRE_GCC3_DWARF_FRAME_REGISTERS
62 #define PRE_GCC3_DWARF_FRAME_REGISTERS DWARF_FRAME_REGISTERS
65 #ifndef DWARF_REG_TO_UNWIND_COLUMN
66 #define DWARF_REG_TO_UNWIND_COLUMN(REGNO) (REGNO)
69 /* A target can do some update context frobbing. */
70 #ifndef MD_FROB_UPDATE_CONTEXT
71 #define MD_FROB_UPDATE_CONTEXT(CTX, FS) do { } while (0)
74 /* This is the register and unwind state for a particular frame. This
75 provides the information necessary to unwind up past a frame and return
77 struct _Unwind_Context
79 void *reg[DWARF_FRAME_REGISTERS+1];
83 struct dwarf_eh_bases bases;
84 _Unwind_Word args_size;
87 /* Byte size of every register managed by these routines. */
88 static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS+1];
91 /* The result of interpreting the frame unwind info for a frame.
92 This is all symbolic at this point, as none of the values can
93 be resolved until the target pc is located. */
96 /* Each register save state can be described in terms of a CFA slot,
97 another register, or a location expression. */
98 struct frame_state_reg_info
103 _Unwind_Sword offset;
104 const unsigned char *exp;
112 } reg[DWARF_FRAME_REGISTERS+1];
114 /* Used to implement DW_CFA_remember_state. */
115 struct frame_state_reg_info *prev;
118 /* The CFA can be described in terms of a reg+offset or a
119 location expression. */
120 _Unwind_Sword cfa_offset;
121 _Unwind_Word cfa_reg;
122 const unsigned char *cfa_exp;
129 /* The PC described by the current frame state. */
132 /* The information we care about from the CIE/FDE. */
133 _Unwind_Personality_Fn personality;
134 _Unwind_Sword data_align;
135 _Unwind_Word code_align;
136 unsigned char retaddr_column;
137 unsigned char fde_encoding;
138 unsigned char lsda_encoding;
141 } _Unwind_FrameState;
143 /* Read unaligned data from the instruction buffer. */
148 unsigned u2 __attribute__ ((mode (HI)));
149 unsigned u4 __attribute__ ((mode (SI)));
150 unsigned u8 __attribute__ ((mode (DI)));
151 signed s2 __attribute__ ((mode (HI)));
152 signed s4 __attribute__ ((mode (SI)));
153 signed s8 __attribute__ ((mode (DI)));
154 } __attribute__ ((packed));
157 read_pointer (const void *p) { const union unaligned *up = p; return up->p; }
160 read_1u (const void *p) { return *(const unsigned char *) p; }
163 read_1s (const void *p) { return *(const signed char *) p; }
166 read_2u (const void *p) { const union unaligned *up = p; return up->u2; }
169 read_2s (const void *p) { const union unaligned *up = p; return up->s2; }
171 static inline unsigned int
172 read_4u (const void *p) { const union unaligned *up = p; return up->u4; }
175 read_4s (const void *p) { const union unaligned *up = p; return up->s4; }
177 static inline unsigned long
178 read_8u (const void *p) { const union unaligned *up = p; return up->u8; }
180 static inline unsigned long
181 read_8s (const void *p) { const union unaligned *up = p; return up->s8; }
183 /* Get the value of register REG as saved in CONTEXT. */
186 _Unwind_GetGR (struct _Unwind_Context *context, int index)
191 #ifdef DWARF_ZERO_REG
192 if (index == DWARF_ZERO_REG)
196 index = DWARF_REG_TO_UNWIND_COLUMN (index);
197 if (index >= (int) sizeof(dwarf_reg_size_table))
199 size = dwarf_reg_size_table[index];
200 ptr = context->reg[index];
202 /* This will segfault if the register hasn't been saved. */
203 if (size == sizeof(_Unwind_Ptr))
204 return * (_Unwind_Ptr *) ptr;
206 if (size == sizeof(_Unwind_Word))
207 return * (_Unwind_Word *) ptr;
213 _Unwind_GetPtr (struct _Unwind_Context *context, int index)
215 return (void *)(_Unwind_Ptr) _Unwind_GetGR (context, index);
218 /* Get the value of the CFA as saved in CONTEXT. */
221 _Unwind_GetCFA (struct _Unwind_Context *context)
223 return (_Unwind_Ptr) context->cfa;
226 /* Overwrite the saved value for register REG in CONTEXT with VAL. */
229 _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
234 index = DWARF_REG_TO_UNWIND_COLUMN (index);
235 if (index >= (int) sizeof(dwarf_reg_size_table))
237 size = dwarf_reg_size_table[index];
238 ptr = context->reg[index];
240 if (size == sizeof(_Unwind_Ptr))
241 * (_Unwind_Ptr *) ptr = val;
242 else if (size == sizeof(_Unwind_Word))
243 * (_Unwind_Word *) ptr = val;
248 /* Get the pointer to a register INDEX as saved in CONTEXT. */
251 _Unwind_GetGRPtr (struct _Unwind_Context *context, int index)
253 index = DWARF_REG_TO_UNWIND_COLUMN (index);
254 return context->reg[index];
257 /* Set the pointer to a register INDEX as saved in CONTEXT. */
260 _Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p)
262 index = DWARF_REG_TO_UNWIND_COLUMN (index);
263 context->reg[index] = p;
266 /* Retrieve the return address for CONTEXT. */
269 _Unwind_GetIP (struct _Unwind_Context *context)
271 return (_Unwind_Ptr) context->ra;
274 /* Overwrite the return address for CONTEXT with VAL. */
277 _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
279 context->ra = (void *) val;
283 _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
285 return context->lsda;
289 _Unwind_GetRegionStart (struct _Unwind_Context *context)
291 return (_Unwind_Ptr) context->bases.func;
295 _Unwind_FindEnclosingFunction (void *pc)
297 struct dwarf_eh_bases bases;
298 const struct dwarf_fde *fde = _Unwind_Find_FDE (pc-1, &bases);
307 _Unwind_GetDataRelBase (struct _Unwind_Context *context)
309 return (_Unwind_Ptr) context->bases.dbase;
313 _Unwind_GetTextRelBase (struct _Unwind_Context *context)
315 return (_Unwind_Ptr) context->bases.tbase;
319 /* Extract any interesting information from the CIE for the translation
320 unit F belongs to. Return a pointer to the byte after the augmentation,
321 or NULL if we encountered an undecipherable augmentation. */
323 static const unsigned char *
324 extract_cie_info (const struct dwarf_cie *cie, struct _Unwind_Context *context,
325 _Unwind_FrameState *fs)
327 const unsigned char *aug = cie->augmentation;
328 const unsigned char *p = aug + strlen (aug) + 1;
329 const unsigned char *ret = NULL;
332 /* g++ v2 "eh" has pointer immediately following augmentation string,
333 so it must be handled first. */
334 if (aug[0] == 'e' && aug[1] == 'h')
336 fs->eh_ptr = read_pointer (p);
337 p += sizeof (void *);
341 /* Immediately following the augmentation are the code and
342 data alignment and return address column. */
343 p = read_uleb128 (p, &fs->code_align);
344 p = read_sleb128 (p, &fs->data_align);
345 fs->retaddr_column = *p++;
346 fs->lsda_encoding = DW_EH_PE_omit;
348 /* If the augmentation starts with 'z', then a uleb128 immediately
349 follows containing the length of the augmentation field following
353 p = read_uleb128 (p, &utmp);
360 /* Iterate over recognized augmentation subsequences. */
363 /* "L" indicates a byte showing how the LSDA pointer is encoded. */
366 fs->lsda_encoding = *p++;
370 /* "R" indicates a byte indicating how FDE addresses are encoded. */
371 else if (aug[0] == 'R')
373 fs->fde_encoding = *p++;
377 /* "P" indicates a personality routine in the CIE augmentation. */
378 else if (aug[0] == 'P')
380 p = read_encoded_value (context, *p, p + 1,
381 (_Unwind_Ptr *) &fs->personality);
385 /* Otherwise we have an unknown augmentation string.
386 Bail unless we saw a 'z' prefix. */
391 return ret ? ret : p;
395 /* Decode a DW_OP stack program. Return the top of stack. Push INITIAL
396 onto the stack to start. */
399 execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end,
400 struct _Unwind_Context *context, _Unwind_Word initial)
402 _Unwind_Word stack[64]; /* ??? Assume this is enough. */
408 while (op_ptr < op_end)
410 enum dwarf_location_atom op = *op_ptr++;
411 _Unwind_Word result, reg, utmp;
412 _Unwind_Sword offset, stmp;
448 result = op - DW_OP_lit0;
452 result = (_Unwind_Word) (_Unwind_Ptr) read_pointer (op_ptr);
453 op_ptr += sizeof (void *);
457 result = read_1u (op_ptr);
461 result = read_1s (op_ptr);
465 result = read_2u (op_ptr);
469 result = read_2s (op_ptr);
473 result = read_4u (op_ptr);
477 result = read_4s (op_ptr);
481 result = read_8u (op_ptr);
485 result = read_8s (op_ptr);
489 op_ptr = read_uleb128 (op_ptr, &result);
492 op_ptr = read_sleb128 (op_ptr, &stmp);
528 result = _Unwind_GetGR (context, op - DW_OP_reg0);
531 op_ptr = read_uleb128 (op_ptr, ®);
532 result = _Unwind_GetGR (context, reg);
567 op_ptr = read_sleb128 (op_ptr, &offset);
568 result = _Unwind_GetGR (context, op - DW_OP_breg0) + offset;
571 op_ptr = read_uleb128 (op_ptr, ®);
572 op_ptr = read_sleb128 (op_ptr, &offset);
573 result = _Unwind_GetGR (context, reg) + offset;
579 result = stack[stack_elt - 1];
589 if (offset >= stack_elt - 1)
591 result = stack[stack_elt - 1 - offset];
597 result = stack[stack_elt - 2];
602 _Unwind_Word t1, t2, t3;
606 t1 = stack[stack_elt - 1];
607 t2 = stack[stack_elt - 2];
608 t3 = stack[stack_elt - 3];
609 stack[stack_elt - 1] = t2;
610 stack[stack_elt - 2] = t3;
611 stack[stack_elt - 3] = t1;
616 case DW_OP_deref_size:
620 case DW_OP_plus_uconst:
621 /* Unary operations. */
624 result = stack[stack_elt];
630 void *ptr = (void *) (_Unwind_Ptr) result;
631 result = (_Unwind_Ptr) read_pointer (ptr);
635 case DW_OP_deref_size:
637 void *ptr = (void *) (_Unwind_Ptr) result;
641 result = read_1u (ptr);
644 result = read_2u (ptr);
647 result = read_4u (ptr);
650 result = read_8u (ptr);
659 if ((_Unwind_Sword) result < 0)
668 case DW_OP_plus_uconst:
669 op_ptr = read_uleb128 (op_ptr, &utmp);
692 /* Binary operations. */
693 _Unwind_Word first, second;
694 if ((stack_elt -= 2) < 0)
696 second = stack[stack_elt];
697 first = stack[stack_elt + 1];
702 result = second & first;
705 result = (_Unwind_Sword) second / (_Unwind_Sword) first;
708 result = second - first;
711 result = (_Unwind_Sword) second % (_Unwind_Sword) first;
714 result = second * first;
717 result = second | first;
720 result = second + first;
723 result = second << first;
726 result = second >> first;
729 result = (_Unwind_Sword) second >> first;
732 result = second ^ first;
735 result = (_Unwind_Sword) first <= (_Unwind_Sword) second;
738 result = (_Unwind_Sword) first >= (_Unwind_Sword) second;
741 result = (_Unwind_Sword) first == (_Unwind_Sword) second;
744 result = (_Unwind_Sword) first < (_Unwind_Sword) second;
747 result = (_Unwind_Sword) first > (_Unwind_Sword) second;
750 result = (_Unwind_Sword) first != (_Unwind_Sword) second;
760 offset = read_2s (op_ptr);
768 offset = read_2s (op_ptr);
770 if (stack[stack_elt] != 0)
781 /* Most things push a result value. */
782 if ((size_t) stack_elt >= sizeof(stack)/sizeof(*stack))
784 stack[stack_elt++] = result;
788 /* We were executing this program to get a value. It should be
792 return stack[stack_elt];
796 /* Decode DWARF 2 call frame information. Takes pointers the
797 instruction sequence to decode, current register information and
798 CIE info, and the PC range to evaluate. */
801 execute_cfa_program (const unsigned char *insn_ptr,
802 const unsigned char *insn_end,
803 struct _Unwind_Context *context,
804 _Unwind_FrameState *fs)
806 struct frame_state_reg_info *unused_rs = NULL;
808 /* Don't allow remember/restore between CIE and FDE programs. */
809 fs->regs.prev = NULL;
811 /* The comparison with the return address uses < rather than <= because
812 we are only interested in the effects of code before the call; for a
813 noreturn function, the return address may point to unrelated code with
814 a different stack configuration that we are not interested in. We
815 assume that the call itself is unwind info-neutral; if not, or if
816 there are delay instructions that adjust the stack, these must be
817 reflected at the point immediately before the call insn. */
818 while (insn_ptr < insn_end && fs->pc < context->ra)
820 unsigned char insn = *insn_ptr++;
821 _Unwind_Word reg, utmp;
822 _Unwind_Sword offset, stmp;
824 if ((insn & 0xc0) == DW_CFA_advance_loc)
825 fs->pc += (insn & 0x3f) * fs->code_align;
826 else if ((insn & 0xc0) == DW_CFA_offset)
829 insn_ptr = read_uleb128 (insn_ptr, &utmp);
830 offset = (_Unwind_Sword) utmp * fs->data_align;
831 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
833 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
835 else if ((insn & 0xc0) == DW_CFA_restore)
838 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_UNSAVED;
843 insn_ptr = read_encoded_value (context, fs->fde_encoding,
844 insn_ptr, (_Unwind_Ptr *) &fs->pc);
847 case DW_CFA_advance_loc1:
848 fs->pc += read_1u (insn_ptr) * fs->code_align;
851 case DW_CFA_advance_loc2:
852 fs->pc += read_2u (insn_ptr) * fs->code_align;
855 case DW_CFA_advance_loc4:
856 fs->pc += read_4u (insn_ptr) * fs->code_align;
860 case DW_CFA_offset_extended:
861 insn_ptr = read_uleb128 (insn_ptr, ®);
862 insn_ptr = read_uleb128 (insn_ptr, &utmp);
863 offset = (_Unwind_Sword) utmp * fs->data_align;
864 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
866 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
869 case DW_CFA_restore_extended:
870 insn_ptr = read_uleb128 (insn_ptr, ®);
871 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED;
874 case DW_CFA_undefined:
875 case DW_CFA_same_value:
876 insn_ptr = read_uleb128 (insn_ptr, ®);
882 case DW_CFA_register:
885 insn_ptr = read_uleb128 (insn_ptr, ®);
886 insn_ptr = read_uleb128 (insn_ptr, ®2);
887 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_REG;
888 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.reg = reg2;
892 case DW_CFA_remember_state:
894 struct frame_state_reg_info *new_rs;
898 unused_rs = unused_rs->prev;
901 new_rs = __builtin_alloca (sizeof (struct frame_state_reg_info));
904 fs->regs.prev = new_rs;
908 case DW_CFA_restore_state:
910 struct frame_state_reg_info *old_rs = fs->regs.prev;
912 old_rs->prev = unused_rs;
918 insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
919 insn_ptr = read_uleb128 (insn_ptr, &utmp);
920 fs->cfa_offset = utmp;
921 fs->cfa_how = CFA_REG_OFFSET;
924 case DW_CFA_def_cfa_register:
925 insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
926 fs->cfa_how = CFA_REG_OFFSET;
929 case DW_CFA_def_cfa_offset:
930 insn_ptr = read_uleb128 (insn_ptr, &utmp);
931 fs->cfa_offset = utmp;
932 /* cfa_how deliberately not set. */
935 case DW_CFA_def_cfa_expression:
936 fs->cfa_exp = insn_ptr;
937 fs->cfa_how = CFA_EXP;
938 insn_ptr = read_uleb128 (insn_ptr, &utmp);
942 case DW_CFA_expression:
943 insn_ptr = read_uleb128 (insn_ptr, ®);
944 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_EXP;
945 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.exp = insn_ptr;
946 insn_ptr = read_uleb128 (insn_ptr, &utmp);
950 /* From the 2.1 draft. */
951 case DW_CFA_offset_extended_sf:
952 insn_ptr = read_uleb128 (insn_ptr, ®);
953 insn_ptr = read_sleb128 (insn_ptr, &stmp);
954 offset = stmp * fs->data_align;
955 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
957 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
960 case DW_CFA_def_cfa_sf:
961 insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
962 insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
963 fs->cfa_how = CFA_REG_OFFSET;
966 case DW_CFA_def_cfa_offset_sf:
967 insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
968 /* cfa_how deliberately not set. */
971 case DW_CFA_GNU_window_save:
972 /* ??? Hardcoded for SPARC register window configuration. */
973 for (reg = 16; reg < 32; ++reg)
975 fs->regs.reg[reg].how = REG_SAVED_OFFSET;
976 fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *);
980 case DW_CFA_GNU_args_size:
981 insn_ptr = read_uleb128 (insn_ptr, &context->args_size);
984 case DW_CFA_GNU_negative_offset_extended:
985 /* Obsoleted by DW_CFA_offset_extended_sf, but used by
986 older PowerPC code. */
987 insn_ptr = read_uleb128 (insn_ptr, ®);
988 insn_ptr = read_uleb128 (insn_ptr, &utmp);
989 offset = (_Unwind_Word) utmp * fs->data_align;
990 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
992 fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = -offset;
1001 /* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for
1002 its caller and decode it into FS. This function also sets the
1003 args_size and lsda members of CONTEXT, as they are really information
1004 about the caller's frame. */
1006 static _Unwind_Reason_Code
1007 uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1009 const struct dwarf_fde *fde;
1010 const struct dwarf_cie *cie;
1011 const unsigned char *aug, *insn, *end;
1013 memset (fs, 0, sizeof (*fs));
1014 context->args_size = 0;
1017 if (context->ra == 0)
1018 return _URC_END_OF_STACK;
1020 fde = _Unwind_Find_FDE (context->ra - 1, &context->bases);
1023 /* Couldn't find frame unwind info for this function. Try a
1024 target-specific fallback mechanism. This will necessarily
1025 not provide a personality routine or LSDA. */
1026 #ifdef MD_FALLBACK_FRAME_STATE_FOR
1027 MD_FALLBACK_FRAME_STATE_FOR (context, fs, success);
1028 return _URC_END_OF_STACK;
1030 return _URC_NO_REASON;
1032 return _URC_END_OF_STACK;
1036 fs->pc = context->bases.func;
1038 cie = get_cie (fde);
1039 insn = extract_cie_info (cie, context, fs);
1041 /* CIE contained unknown augmentation. */
1042 return _URC_FATAL_PHASE1_ERROR;
1044 /* First decode all the insns in the CIE. */
1045 end = (unsigned char *) next_fde ((struct dwarf_fde *) cie);
1046 execute_cfa_program (insn, end, context, fs);
1048 /* Locate augmentation for the fde. */
1049 aug = (unsigned char *) fde + sizeof (*fde);
1050 aug += 2 * size_of_encoded_value (fs->fde_encoding);
1055 aug = read_uleb128 (aug, &i);
1058 if (fs->lsda_encoding != DW_EH_PE_omit)
1059 aug = read_encoded_value (context, fs->lsda_encoding, aug,
1060 (_Unwind_Ptr *) &context->lsda);
1062 /* Then the insns in the FDE up to our target PC. */
1065 end = (unsigned char *) next_fde (fde);
1066 execute_cfa_program (insn, end, context, fs);
1068 return _URC_NO_REASON;
1071 typedef struct frame_state
1077 long reg_or_offset[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1078 unsigned short cfa_reg;
1079 unsigned short retaddr_column;
1080 char saved[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1083 struct frame_state * __frame_state_for (void *, struct frame_state *);
1085 /* Called from pre-G++ 3.0 __throw to find the registers to restore for
1086 a given PC_TARGET. The caller should allocate a local variable of
1087 `struct frame_state' and pass its address to STATE_IN. */
1089 struct frame_state *
1090 __frame_state_for (void *pc_target, struct frame_state *state_in)
1092 struct _Unwind_Context context;
1093 _Unwind_FrameState fs;
1096 memset (&context, 0, sizeof (struct _Unwind_Context));
1097 context.ra = pc_target + 1;
1099 if (uw_frame_state_for (&context, &fs) != _URC_NO_REASON)
1102 /* We have no way to pass a location expression for the CFA to our
1103 caller. It wouldn't understand it anyway. */
1104 if (fs.cfa_how == CFA_EXP)
1107 for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
1109 state_in->saved[reg] = fs.regs.reg[reg].how;
1110 switch (state_in->saved[reg])
1113 state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.reg;
1115 case REG_SAVED_OFFSET:
1116 state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.offset;
1119 state_in->reg_or_offset[reg] = 0;
1124 state_in->cfa_offset = fs.cfa_offset;
1125 state_in->cfa_reg = fs.cfa_reg;
1126 state_in->retaddr_column = fs.retaddr_column;
1127 state_in->args_size = context.args_size;
1128 state_in->eh_ptr = fs.eh_ptr;
1133 typedef union { _Unwind_Ptr ptr; _Unwind_Word word; } _Unwind_SpTmp;
1136 _Unwind_SetSpColumn (struct _Unwind_Context *context, void *cfa,
1137 _Unwind_SpTmp *tmp_sp)
1139 int size = dwarf_reg_size_table[__builtin_dwarf_sp_column ()];
1141 if (size == sizeof(_Unwind_Ptr))
1142 tmp_sp->ptr = (_Unwind_Ptr) cfa;
1143 else if (size == sizeof(_Unwind_Word))
1144 tmp_sp->word = (_Unwind_Ptr) cfa;
1147 _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), tmp_sp);
1151 uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1153 struct _Unwind_Context orig_context = *context;
1157 #ifdef EH_RETURN_STACKADJ_RTX
1158 /* Special handling here: Many machines do not use a frame pointer,
1159 and track the CFA only through offsets from the stack pointer from
1160 one frame to the next. In this case, the stack pointer is never
1161 stored, so it has no saved address in the context. What we do
1162 have is the CFA from the previous stack frame.
1164 In very special situations (such as unwind info for signal return),
1165 there may be location expressions that use the stack pointer as well.
1167 Do this conditionally for one frame. This allows the unwind info
1168 for one frame to save a copy of the stack pointer from the previous
1169 frame, and be able to use much easier CFA mechanisms to do it.
1170 Always zap the saved stack pointer value for the next frame; carrying
1171 the value over from one frame to another doesn't make sense. */
1173 _Unwind_SpTmp tmp_sp;
1175 if (!_Unwind_GetGRPtr (&orig_context, __builtin_dwarf_sp_column ()))
1176 _Unwind_SetSpColumn (&orig_context, context->cfa, &tmp_sp);
1177 _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), NULL);
1180 /* Compute this frame's CFA. */
1181 switch (fs->cfa_how)
1183 case CFA_REG_OFFSET:
1184 cfa = _Unwind_GetPtr (&orig_context, fs->cfa_reg);
1185 cfa += fs->cfa_offset;
1190 const unsigned char *exp = fs->cfa_exp;
1193 exp = read_uleb128 (exp, &len);
1194 cfa = (void *) (_Unwind_Ptr)
1195 execute_stack_op (exp, exp + len, &orig_context, 0);
1204 /* Compute the addresses of all registers saved in this frame. */
1205 for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i)
1206 switch (fs->regs.reg[i].how)
1211 case REG_SAVED_OFFSET:
1212 _Unwind_SetGRPtr (context, i,
1213 (void *) (cfa + fs->regs.reg[i].loc.offset));
1219 _Unwind_GetGRPtr (&orig_context, fs->regs.reg[i].loc.reg));
1224 const unsigned char *exp = fs->regs.reg[i].loc.exp;
1228 exp = read_uleb128 (exp, &len);
1229 val = execute_stack_op (exp, exp + len, &orig_context,
1231 _Unwind_SetGRPtr (context, i, (void *) val);
1236 MD_FROB_UPDATE_CONTEXT (context, fs);
1239 /* CONTEXT describes the unwind state for a frame, and FS describes the FDE
1240 of its caller. Update CONTEXT to refer to the caller as well. Note
1241 that the args_size and lsda members are not updated here, but later in
1242 uw_frame_state_for. */
1245 uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1247 uw_update_context_1 (context, fs);
1249 /* Compute the return address now, since the return address column
1250 can change from frame to frame. */
1251 context->ra = __builtin_extract_return_addr
1252 (_Unwind_GetPtr (context, fs->retaddr_column));
1255 /* Fill in CONTEXT for top-of-stack. The only valid registers at this
1256 level will be the return address and the CFA. */
1258 #define uw_init_context(CONTEXT) \
1261 /* Do any necessary initialization to access arbitrary stack frames. \
1262 On the SPARC, this means flushing the register windows. */ \
1263 __builtin_unwind_init (); \
1264 uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (), \
1265 __builtin_return_address (0)); \
1270 init_dwarf_reg_size_table (void)
1272 __builtin_init_dwarf_reg_size_table (dwarf_reg_size_table);
1276 uw_init_context_1 (struct _Unwind_Context *context,
1277 void *outer_cfa, void *outer_ra)
1279 void *ra = __builtin_extract_return_addr (__builtin_return_address (0));
1280 _Unwind_FrameState fs;
1281 _Unwind_SpTmp sp_slot;
1283 memset (context, 0, sizeof (struct _Unwind_Context));
1286 if (uw_frame_state_for (context, &fs) != _URC_NO_REASON)
1291 static __gthread_once_t once_regsizes = __GTHREAD_ONCE_INIT;
1292 if (__gthread_once (&once_regsizes, init_dwarf_reg_size_table) != 0
1293 || dwarf_reg_size_table[0] == 0)
1294 init_dwarf_reg_size_table ();
1297 if (dwarf_reg_size_table[0] == 0)
1298 init_dwarf_reg_size_table ();
1301 /* Force the frame state to use the known cfa value. */
1302 _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
1303 fs.cfa_how = CFA_REG_OFFSET;
1304 fs.cfa_reg = __builtin_dwarf_sp_column ();
1307 uw_update_context_1 (context, &fs);
1309 /* If the return address column was saved in a register in the
1310 initialization context, then we can't see it in the given
1311 call frame data. So have the initialization context tell us. */
1312 context->ra = __builtin_extract_return_addr (outer_ra);
1316 /* Install TARGET into CURRENT so that we can return to it. This is a
1317 macro because __builtin_eh_return must be invoked in the context of
1320 #define uw_install_context(CURRENT, TARGET) \
1323 long offset = uw_install_context_1 ((CURRENT), (TARGET)); \
1324 void *handler = __builtin_frob_return_addr ((TARGET)->ra); \
1325 __builtin_eh_return (offset, handler); \
1330 uw_install_context_1 (struct _Unwind_Context *current,
1331 struct _Unwind_Context *target)
1335 for (i = 0; i < DWARF_FRAME_REGISTERS; ++i)
1337 void *c = current->reg[i];
1338 void *t = target->reg[i];
1340 if (t && c && t != c)
1341 memcpy (c, t, dwarf_reg_size_table[i]);
1344 #ifdef EH_RETURN_STACKADJ_RTX
1348 /* If the last frame records a saved stack pointer, use it. */
1349 if (_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ()))
1350 target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ());
1352 target_cfa = target->cfa;
1354 /* We adjust SP by the difference between CURRENT and TARGET's CFA. */
1355 if (STACK_GROWS_DOWNWARD)
1356 return target_cfa - current->cfa + target->args_size;
1358 return current->cfa - target_cfa - target->args_size;
1365 static inline _Unwind_Ptr
1366 uw_identify_context (struct _Unwind_Context *context)
1368 return _Unwind_GetIP (context);
1372 #include "unwind.inc"
1374 #if defined (USE_GAS_SYMVER) && defined (SHARED) && defined (USE_LIBUNWIND_EXCEPTIONS)
1375 alias (_Unwind_Backtrace);
1376 alias (_Unwind_DeleteException);
1377 alias (_Unwind_FindEnclosingFunction);
1378 alias (_Unwind_FindTableEntry);
1379 alias (_Unwind_ForcedUnwind);
1380 alias (_Unwind_GetDataRelBase);
1381 alias (_Unwind_GetTextRelBase);
1382 alias (_Unwind_GetCFA);
1383 alias (_Unwind_GetGR);
1384 alias (_Unwind_GetIP);
1385 alias (_Unwind_GetLanguageSpecificData);
1386 alias (_Unwind_GetRegionStart);
1387 alias (_Unwind_RaiseException);
1388 alias (_Unwind_Resume);
1389 alias (_Unwind_Resume_or_Rethrow);
1390 alias (_Unwind_SetGR);
1391 alias (_Unwind_SetIP);
1394 #endif /* !USING_SJLJ_EXCEPTIONS */