OSDN Git Service

PR c/12553
[pf3gnuchains/gcc-fork.git] / gcc / unwind-dw2.c
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.
4
5    This file is part of GCC.
6
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.
11
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.)
20
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.
25
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
29    02111-1307, USA.  */
30
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 #include "unwind-pe.h"
38 #include "unwind-dw2-fde.h"
39 #include "gthr.h"
40
41
42 #ifndef __USING_SJLJ_EXCEPTIONS__
43
44 #ifndef STACK_GROWS_DOWNWARD
45 #define STACK_GROWS_DOWNWARD 0
46 #else
47 #undef STACK_GROWS_DOWNWARD
48 #define STACK_GROWS_DOWNWARD 1
49 #endif
50
51 /* A target can override (perhaps for backward compatibility) how
52    many dwarf2 columns are unwound.  */
53 #ifndef DWARF_FRAME_REGISTERS
54 #define DWARF_FRAME_REGISTERS FIRST_PSEUDO_REGISTER
55 #endif
56
57 /* Dwarf frame registers used for pre gcc 3.0 compiled glibc.  */
58 #ifndef PRE_GCC3_DWARF_FRAME_REGISTERS
59 #define PRE_GCC3_DWARF_FRAME_REGISTERS DWARF_FRAME_REGISTERS
60 #endif
61
62 #ifndef DWARF_REG_TO_UNWIND_COLUMN
63 #define DWARF_REG_TO_UNWIND_COLUMN(REGNO) (REGNO)
64 #endif
65
66 /* A target can do some update context frobbing.  */
67 #ifndef MD_FROB_UPDATE_CONTEXT
68 #define MD_FROB_UPDATE_CONTEXT(CTX, FS) do { } while (0)
69 #endif
70
71 /* This is the register and unwind state for a particular frame.  This
72    provides the information necessary to unwind up past a frame and return
73    to its caller.  */
74 struct _Unwind_Context
75 {
76   void *reg[DWARF_FRAME_REGISTERS+1];
77   void *cfa;
78   void *ra;
79   void *lsda;
80   struct dwarf_eh_bases bases;
81   _Unwind_Word args_size;
82 };
83
84 /* Byte size of every register managed by these routines.  */
85 static unsigned char dwarf_reg_size_table[DWARF_FRAME_REGISTERS+1];
86
87 \f
88 /* The result of interpreting the frame unwind info for a frame.
89    This is all symbolic at this point, as none of the values can
90    be resolved until the target pc is located.  */
91 typedef struct
92 {
93   /* Each register save state can be described in terms of a CFA slot,
94      another register, or a location expression.  */
95   struct frame_state_reg_info
96   {
97     struct {
98       union {
99         _Unwind_Word reg;
100         _Unwind_Sword offset;
101         const unsigned char *exp;
102       } loc;
103       enum {
104         REG_UNSAVED,
105         REG_SAVED_OFFSET,
106         REG_SAVED_REG,
107         REG_SAVED_EXP,
108       } how;
109     } reg[DWARF_FRAME_REGISTERS+1];
110
111     /* Used to implement DW_CFA_remember_state.  */
112     struct frame_state_reg_info *prev;
113   } regs;
114
115   /* The CFA can be described in terms of a reg+offset or a
116      location expression.  */
117   _Unwind_Sword cfa_offset;
118   _Unwind_Word cfa_reg;
119   const unsigned char *cfa_exp;
120   enum {
121     CFA_UNSET,
122     CFA_REG_OFFSET,
123     CFA_EXP,
124   } cfa_how;
125
126   /* The PC described by the current frame state.  */
127   void *pc;
128
129   /* The information we care about from the CIE/FDE.  */
130   _Unwind_Personality_Fn personality;
131   _Unwind_Sword data_align;
132   _Unwind_Word code_align;
133   unsigned char retaddr_column;
134   unsigned char fde_encoding;
135   unsigned char lsda_encoding;
136   unsigned char saw_z;
137   void *eh_ptr;
138 } _Unwind_FrameState;
139 \f
140 /* Read unaligned data from the instruction buffer.  */
141
142 union unaligned
143 {
144   void *p;
145   unsigned u2 __attribute__ ((mode (HI)));
146   unsigned u4 __attribute__ ((mode (SI)));
147   unsigned u8 __attribute__ ((mode (DI)));
148   signed s2 __attribute__ ((mode (HI)));
149   signed s4 __attribute__ ((mode (SI)));
150   signed s8 __attribute__ ((mode (DI)));
151 } __attribute__ ((packed));
152
153 static inline void *
154 read_pointer (const void *p) { const union unaligned *up = p; return up->p; }
155
156 static inline int
157 read_1u (const void *p) { return *(const unsigned char *) p; }
158
159 static inline int
160 read_1s (const void *p) { return *(const signed char *) p; }
161
162 static inline int
163 read_2u (const void *p) { const union unaligned *up = p; return up->u2; }
164
165 static inline int
166 read_2s (const void *p) { const union unaligned *up = p; return up->s2; }
167
168 static inline unsigned int
169 read_4u (const void *p) { const union unaligned *up = p; return up->u4; }
170
171 static inline int
172 read_4s (const void *p) { const union unaligned *up = p; return up->s4; }
173
174 static inline unsigned long
175 read_8u (const void *p) { const union unaligned *up = p; return up->u8; }
176
177 static inline unsigned long
178 read_8s (const void *p) { const union unaligned *up = p; return up->s8; }
179 \f
180 /* Get the value of register REG as saved in CONTEXT.  */
181
182 inline _Unwind_Word
183 _Unwind_GetGR (struct _Unwind_Context *context, int index)
184 {
185   int size;
186   void *ptr;
187
188   index = DWARF_REG_TO_UNWIND_COLUMN (index);
189   if (index >= sizeof(dwarf_reg_size_table))
190     abort ();
191   size = dwarf_reg_size_table[index];
192   ptr = context->reg[index];
193
194   /* This will segfault if the register hasn't been saved.  */
195   if (size == sizeof(_Unwind_Ptr))
196     return * (_Unwind_Ptr *) ptr;
197
198   if (size == sizeof(_Unwind_Word))
199     return * (_Unwind_Word *) ptr;
200
201   abort ();
202 }
203
204 static inline void *
205 _Unwind_GetPtr (struct _Unwind_Context *context, int index)
206 {
207   return (void *)(_Unwind_Ptr) _Unwind_GetGR (context, index);
208 }
209
210 /* Get the value of the CFA as saved in CONTEXT.  */
211
212 _Unwind_Word
213 _Unwind_GetCFA (struct _Unwind_Context *context)
214 {
215   return (_Unwind_Ptr) context->cfa;
216 }
217
218 /* Overwrite the saved value for register REG in CONTEXT with VAL.  */
219
220 inline void
221 _Unwind_SetGR (struct _Unwind_Context *context, int index, _Unwind_Word val)
222 {
223   int size;
224   void *ptr;
225
226   index = DWARF_REG_TO_UNWIND_COLUMN (index);
227   if (index >= sizeof(dwarf_reg_size_table))
228     abort ();
229   size = dwarf_reg_size_table[index];
230   ptr = context->reg[index];
231
232   if (size == sizeof(_Unwind_Ptr))
233     * (_Unwind_Ptr *) ptr = val;
234   else if (size == sizeof(_Unwind_Word))
235     * (_Unwind_Word *) ptr = val;
236   else
237     abort ();
238 }
239
240 /* Get the pointer to a register INDEX as saved in CONTEXT.  */
241
242 static inline void *
243 _Unwind_GetGRPtr (struct _Unwind_Context *context, int index)
244 {
245   index = DWARF_REG_TO_UNWIND_COLUMN (index);
246   return context->reg[index];
247 }
248
249 /* Set the pointer to a register INDEX as saved in CONTEXT.  */
250
251 static inline void
252 _Unwind_SetGRPtr (struct _Unwind_Context *context, int index, void *p)
253 {
254   index = DWARF_REG_TO_UNWIND_COLUMN (index);
255   context->reg[index] = p;
256 }
257
258 /* Retrieve the return address for CONTEXT.  */
259
260 inline _Unwind_Ptr
261 _Unwind_GetIP (struct _Unwind_Context *context)
262 {
263   return (_Unwind_Ptr) context->ra;
264 }
265
266 /* Overwrite the return address for CONTEXT with VAL.  */
267
268 inline void
269 _Unwind_SetIP (struct _Unwind_Context *context, _Unwind_Ptr val)
270 {
271   context->ra = (void *) val;
272 }
273
274 void *
275 _Unwind_GetLanguageSpecificData (struct _Unwind_Context *context)
276 {
277   return context->lsda;
278 }
279
280 _Unwind_Ptr
281 _Unwind_GetRegionStart (struct _Unwind_Context *context)
282 {
283   return (_Unwind_Ptr) context->bases.func;
284 }
285
286 void *
287 _Unwind_FindEnclosingFunction (void *pc)
288 {
289   struct dwarf_eh_bases bases;
290   struct dwarf_fde *fde = _Unwind_Find_FDE (pc-1, &bases);
291   if (fde)
292     return bases.func;
293   else
294     return NULL;
295 }
296
297 #ifndef __ia64__
298 _Unwind_Ptr
299 _Unwind_GetDataRelBase (struct _Unwind_Context *context)
300 {
301   return (_Unwind_Ptr) context->bases.dbase;
302 }
303
304 _Unwind_Ptr
305 _Unwind_GetTextRelBase (struct _Unwind_Context *context)
306 {
307   return (_Unwind_Ptr) context->bases.tbase;
308 }
309 #endif
310 \f
311 /* Extract any interesting information from the CIE for the translation
312    unit F belongs to.  Return a pointer to the byte after the augmentation,
313    or NULL if we encountered an undecipherable augmentation.  */
314
315 static const unsigned char *
316 extract_cie_info (struct dwarf_cie *cie, struct _Unwind_Context *context,
317                   _Unwind_FrameState *fs)
318 {
319   const unsigned char *aug = cie->augmentation;
320   const unsigned char *p = aug + strlen (aug) + 1;
321   const unsigned char *ret = NULL;
322   _Unwind_Word utmp;
323
324   /* g++ v2 "eh" has pointer immediately following augmentation string,
325      so it must be handled first.  */
326   if (aug[0] == 'e' && aug[1] == 'h')
327     {
328       fs->eh_ptr = read_pointer (p);
329       p += sizeof (void *);
330       aug += 2;
331     }
332
333   /* Immediately following the augmentation are the code and
334      data alignment and return address column.  */
335   p = read_uleb128 (p, &fs->code_align);
336   p = read_sleb128 (p, &fs->data_align);
337   fs->retaddr_column = *p++;
338   fs->lsda_encoding = DW_EH_PE_omit;
339
340   /* If the augmentation starts with 'z', then a uleb128 immediately
341      follows containing the length of the augmentation field following
342      the size.  */
343   if (*aug == 'z')
344     {
345       p = read_uleb128 (p, &utmp);
346       ret = p + utmp;
347
348       fs->saw_z = 1;
349       ++aug;
350     }
351
352   /* Iterate over recognized augmentation subsequences.  */
353   while (*aug != '\0')
354     {
355       /* "L" indicates a byte showing how the LSDA pointer is encoded.  */
356       if (aug[0] == 'L')
357         {
358           fs->lsda_encoding = *p++;
359           aug += 1;
360         }
361
362       /* "R" indicates a byte indicating how FDE addresses are encoded.  */
363       else if (aug[0] == 'R')
364         {
365           fs->fde_encoding = *p++;
366           aug += 1;
367         }
368
369       /* "P" indicates a personality routine in the CIE augmentation.  */
370       else if (aug[0] == 'P')
371         {
372           p = read_encoded_value (context, *p, p + 1,
373                                   (_Unwind_Ptr *) &fs->personality);
374           aug += 1;
375         }
376
377       /* Otherwise we have an unknown augmentation string.
378          Bail unless we saw a 'z' prefix.  */
379       else
380         return ret;
381     }
382
383   return ret ? ret : p;
384 }
385
386
387 /* Decode a DW_OP stack program.  Return the top of stack.  Push INITIAL
388    onto the stack to start.  */
389
390 static _Unwind_Word
391 execute_stack_op (const unsigned char *op_ptr, const unsigned char *op_end,
392                   struct _Unwind_Context *context, _Unwind_Word initial)
393 {
394   _Unwind_Word stack[64];       /* ??? Assume this is enough.  */
395   int stack_elt;
396
397   stack[0] = initial;
398   stack_elt = 1;
399
400   while (op_ptr < op_end)
401     {
402       enum dwarf_location_atom op = *op_ptr++;
403       _Unwind_Word result, reg, utmp;
404       _Unwind_Sword offset, stmp;
405
406       switch (op)
407         {
408         case DW_OP_lit0:
409         case DW_OP_lit1:
410         case DW_OP_lit2:
411         case DW_OP_lit3:
412         case DW_OP_lit4:
413         case DW_OP_lit5:
414         case DW_OP_lit6:
415         case DW_OP_lit7:
416         case DW_OP_lit8:
417         case DW_OP_lit9:
418         case DW_OP_lit10:
419         case DW_OP_lit11:
420         case DW_OP_lit12:
421         case DW_OP_lit13:
422         case DW_OP_lit14:
423         case DW_OP_lit15:
424         case DW_OP_lit16:
425         case DW_OP_lit17:
426         case DW_OP_lit18:
427         case DW_OP_lit19:
428         case DW_OP_lit20:
429         case DW_OP_lit21:
430         case DW_OP_lit22:
431         case DW_OP_lit23:
432         case DW_OP_lit24:
433         case DW_OP_lit25:
434         case DW_OP_lit26:
435         case DW_OP_lit27:
436         case DW_OP_lit28:
437         case DW_OP_lit29:
438         case DW_OP_lit30:
439         case DW_OP_lit31:
440           result = op - DW_OP_lit0;
441           break;
442
443         case DW_OP_addr:
444           result = (_Unwind_Word) (_Unwind_Ptr) read_pointer (op_ptr);
445           op_ptr += sizeof (void *);
446           break;
447
448         case DW_OP_const1u:
449           result = read_1u (op_ptr);
450           op_ptr += 1;
451           break;
452         case DW_OP_const1s:
453           result = read_1s (op_ptr);
454           op_ptr += 1;
455           break;
456         case DW_OP_const2u:
457           result = read_2u (op_ptr);
458           op_ptr += 2;
459           break;
460         case DW_OP_const2s:
461           result = read_2s (op_ptr);
462           op_ptr += 2;
463           break;
464         case DW_OP_const4u:
465           result = read_4u (op_ptr);
466           op_ptr += 4;
467           break;
468         case DW_OP_const4s:
469           result = read_4s (op_ptr);
470           op_ptr += 4;
471           break;
472         case DW_OP_const8u:
473           result = read_8u (op_ptr);
474           op_ptr += 8;
475           break;
476         case DW_OP_const8s:
477           result = read_8s (op_ptr);
478           op_ptr += 8;
479           break;
480         case DW_OP_constu:
481           op_ptr = read_uleb128 (op_ptr, &result);
482           break;
483         case DW_OP_consts:
484           op_ptr = read_sleb128 (op_ptr, &stmp);
485           result = stmp;
486           break;
487
488         case DW_OP_reg0:
489         case DW_OP_reg1:
490         case DW_OP_reg2:
491         case DW_OP_reg3:
492         case DW_OP_reg4:
493         case DW_OP_reg5:
494         case DW_OP_reg6:
495         case DW_OP_reg7:
496         case DW_OP_reg8:
497         case DW_OP_reg9:
498         case DW_OP_reg10:
499         case DW_OP_reg11:
500         case DW_OP_reg12:
501         case DW_OP_reg13:
502         case DW_OP_reg14:
503         case DW_OP_reg15:
504         case DW_OP_reg16:
505         case DW_OP_reg17:
506         case DW_OP_reg18:
507         case DW_OP_reg19:
508         case DW_OP_reg20:
509         case DW_OP_reg21:
510         case DW_OP_reg22:
511         case DW_OP_reg23:
512         case DW_OP_reg24:
513         case DW_OP_reg25:
514         case DW_OP_reg26:
515         case DW_OP_reg27:
516         case DW_OP_reg28:
517         case DW_OP_reg29:
518         case DW_OP_reg30:
519         case DW_OP_reg31:
520           result = _Unwind_GetGR (context, op - DW_OP_reg0);
521           break;
522         case DW_OP_regx:
523           op_ptr = read_uleb128 (op_ptr, &reg);
524           result = _Unwind_GetGR (context, reg);
525           break;
526
527         case DW_OP_breg0:
528         case DW_OP_breg1:
529         case DW_OP_breg2:
530         case DW_OP_breg3:
531         case DW_OP_breg4:
532         case DW_OP_breg5:
533         case DW_OP_breg6:
534         case DW_OP_breg7:
535         case DW_OP_breg8:
536         case DW_OP_breg9:
537         case DW_OP_breg10:
538         case DW_OP_breg11:
539         case DW_OP_breg12:
540         case DW_OP_breg13:
541         case DW_OP_breg14:
542         case DW_OP_breg15:
543         case DW_OP_breg16:
544         case DW_OP_breg17:
545         case DW_OP_breg18:
546         case DW_OP_breg19:
547         case DW_OP_breg20:
548         case DW_OP_breg21:
549         case DW_OP_breg22:
550         case DW_OP_breg23:
551         case DW_OP_breg24:
552         case DW_OP_breg25:
553         case DW_OP_breg26:
554         case DW_OP_breg27:
555         case DW_OP_breg28:
556         case DW_OP_breg29:
557         case DW_OP_breg30:
558         case DW_OP_breg31:
559           op_ptr = read_sleb128 (op_ptr, &offset);
560           result = _Unwind_GetGR (context, op - DW_OP_breg0) + offset;
561           break;
562         case DW_OP_bregx:
563           op_ptr = read_uleb128 (op_ptr, &reg);
564           op_ptr = read_sleb128 (op_ptr, &offset);
565           result = _Unwind_GetGR (context, reg) + offset;
566           break;
567
568         case DW_OP_dup:
569           if (stack_elt < 1)
570             abort ();
571           result = stack[stack_elt - 1];
572           break;
573
574         case DW_OP_drop:
575           if (--stack_elt < 0)
576             abort ();
577           goto no_push;
578
579         case DW_OP_pick:
580           offset = *op_ptr++;
581           if (offset >= stack_elt - 1)
582             abort ();
583           result = stack[stack_elt - 1 - offset];
584           break;
585
586         case DW_OP_over:
587           if (stack_elt < 2)
588             abort ();
589           result = stack[stack_elt - 2];
590           break;
591
592         case DW_OP_rot:
593           {
594             _Unwind_Word t1, t2, t3;
595
596             if (stack_elt < 3)
597               abort ();
598             t1 = stack[stack_elt - 1];
599             t2 = stack[stack_elt - 2];
600             t3 = stack[stack_elt - 3];
601             stack[stack_elt - 1] = t2;
602             stack[stack_elt - 2] = t3;
603             stack[stack_elt - 3] = t1;
604             goto no_push;
605           }
606
607         case DW_OP_deref:
608         case DW_OP_deref_size:
609         case DW_OP_abs:
610         case DW_OP_neg:
611         case DW_OP_not:
612         case DW_OP_plus_uconst:
613           /* Unary operations.  */
614           if (--stack_elt < 0)
615             abort ();
616           result = stack[stack_elt];
617
618           switch (op)
619             {
620             case DW_OP_deref:
621               {
622                 void *ptr = (void *) (_Unwind_Ptr) result;
623                 result = (_Unwind_Ptr) read_pointer (ptr);
624               }
625               break;
626
627             case DW_OP_deref_size:
628               {
629                 void *ptr = (void *) (_Unwind_Ptr) result;
630                 switch (*op_ptr++)
631                   {
632                   case 1:
633                     result = read_1u (ptr);
634                     break;
635                   case 2:
636                     result = read_2u (ptr);
637                     break;
638                   case 4:
639                     result = read_4u (ptr);
640                     break;
641                   case 8:
642                     result = read_8u (ptr);
643                     break;
644                   default:
645                     abort ();
646                   }
647               }
648               break;
649
650             case DW_OP_abs:
651               if ((_Unwind_Sword) result < 0)
652                 result = -result;
653               break;
654             case DW_OP_neg:
655               result = -result;
656               break;
657             case DW_OP_not:
658               result = ~result;
659               break;
660             case DW_OP_plus_uconst:
661               op_ptr = read_uleb128 (op_ptr, &utmp);
662               result += utmp;
663               break;
664
665             default:
666               abort ();
667             }
668           break;
669
670         case DW_OP_and:
671         case DW_OP_div:
672         case DW_OP_minus:
673         case DW_OP_mod:
674         case DW_OP_mul:
675         case DW_OP_or:
676         case DW_OP_plus:
677         case DW_OP_le:
678         case DW_OP_ge:
679         case DW_OP_eq:
680         case DW_OP_lt:
681         case DW_OP_gt:
682         case DW_OP_ne:
683           {
684             /* Binary operations.  */
685             _Unwind_Word first, second;
686             if ((stack_elt -= 2) < 0)
687               abort ();
688             second = stack[stack_elt];
689             first = stack[stack_elt + 1];
690
691             switch (op)
692               {
693               case DW_OP_and:
694                 result = second & first;
695                 break;
696               case DW_OP_div:
697                 result = (_Unwind_Sword) second / (_Unwind_Sword) first;
698                 break;
699               case DW_OP_minus:
700                 result = second - first;
701                 break;
702               case DW_OP_mod:
703                 result = (_Unwind_Sword) second % (_Unwind_Sword) first;
704                 break;
705               case DW_OP_mul:
706                 result = second * first;
707                 break;
708               case DW_OP_or:
709                 result = second | first;
710                 break;
711               case DW_OP_plus:
712                 result = second + first;
713                 break;
714               case DW_OP_shl:
715                 result = second << first;
716                 break;
717               case DW_OP_shr:
718                 result = second >> first;
719                 break;
720               case DW_OP_shra:
721                 result = (_Unwind_Sword) second >> first;
722                 break;
723               case DW_OP_xor:
724                 result = second ^ first;
725                 break;
726               case DW_OP_le:
727                 result = (_Unwind_Sword) first <= (_Unwind_Sword) second;
728                 break;
729               case DW_OP_ge:
730                 result = (_Unwind_Sword) first >= (_Unwind_Sword) second;
731                 break;
732               case DW_OP_eq:
733                 result = (_Unwind_Sword) first == (_Unwind_Sword) second;
734                 break;
735               case DW_OP_lt:
736                 result = (_Unwind_Sword) first < (_Unwind_Sword) second;
737                 break;
738               case DW_OP_gt:
739                 result = (_Unwind_Sword) first > (_Unwind_Sword) second;
740                 break;
741               case DW_OP_ne:
742                 result = (_Unwind_Sword) first != (_Unwind_Sword) second;
743                 break;
744
745               default:
746                 abort ();
747               }
748           }
749           break;
750
751         case DW_OP_skip:
752           offset = read_2s (op_ptr);
753           op_ptr += 2;
754           op_ptr += offset;
755           goto no_push;
756
757         case DW_OP_bra:
758           if (--stack_elt < 0)
759             abort ();
760           offset = read_2s (op_ptr);
761           op_ptr += 2;
762           if (stack[stack_elt] != 0)
763             op_ptr += offset;
764           goto no_push;
765
766         case DW_OP_nop:
767           goto no_push;
768
769         default:
770           abort ();
771         }
772
773       /* Most things push a result value.  */
774       if ((size_t) stack_elt >= sizeof(stack)/sizeof(*stack))
775         abort ();
776       stack[stack_elt++] = result;
777     no_push:;
778     }
779
780   /* We were executing this program to get a value.  It should be
781      at top of stack.  */
782   if (--stack_elt < 0)
783     abort ();
784   return stack[stack_elt];
785 }
786
787
788 /* Decode DWARF 2 call frame information. Takes pointers the
789    instruction sequence to decode, current register information and
790    CIE info, and the PC range to evaluate.  */
791
792 static void
793 execute_cfa_program (const unsigned char *insn_ptr,
794                      const unsigned char *insn_end,
795                      struct _Unwind_Context *context,
796                      _Unwind_FrameState *fs)
797 {
798   struct frame_state_reg_info *unused_rs = NULL;
799
800   /* Don't allow remember/restore between CIE and FDE programs.  */
801   fs->regs.prev = NULL;
802
803   /* The comparison with the return address uses < rather than <= because
804      we are only interested in the effects of code before the call; for a
805      noreturn function, the return address may point to unrelated code with
806      a different stack configuration that we are not interested in.  We
807      assume that the call itself is unwind info-neutral; if not, or if
808      there are delay instructions that adjust the stack, these must be
809      reflected at the point immediately before the call insn.  */
810   while (insn_ptr < insn_end && fs->pc < context->ra)
811     {
812       unsigned char insn = *insn_ptr++;
813       _Unwind_Word reg, utmp;
814       _Unwind_Sword offset, stmp;
815
816       if ((insn & 0xc0) == DW_CFA_advance_loc)
817         fs->pc += (insn & 0x3f) * fs->code_align;
818       else if ((insn & 0xc0) == DW_CFA_offset)
819         {
820           reg = insn & 0x3f;
821           insn_ptr = read_uleb128 (insn_ptr, &utmp);
822           offset = (_Unwind_Sword) utmp * fs->data_align;
823           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
824             = REG_SAVED_OFFSET;
825           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
826         }
827       else if ((insn & 0xc0) == DW_CFA_restore)
828         {
829           reg = insn & 0x3f;
830           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_UNSAVED;
831         }
832       else switch (insn)
833         {
834         case DW_CFA_set_loc:
835           insn_ptr = read_encoded_value (context, fs->fde_encoding,
836                                          insn_ptr, (_Unwind_Ptr *) &fs->pc);
837           break;
838
839         case DW_CFA_advance_loc1:
840           fs->pc += read_1u (insn_ptr) * fs->code_align;
841           insn_ptr += 1;
842           break;
843         case DW_CFA_advance_loc2:
844           fs->pc += read_2u (insn_ptr) * fs->code_align;
845           insn_ptr += 2;
846           break;
847         case DW_CFA_advance_loc4:
848           fs->pc += read_4u (insn_ptr) * fs->code_align;
849           insn_ptr += 4;
850           break;
851
852         case DW_CFA_offset_extended:
853           insn_ptr = read_uleb128 (insn_ptr, &reg);
854           insn_ptr = read_uleb128 (insn_ptr, &utmp);
855           offset = (_Unwind_Sword) utmp * fs->data_align;
856           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
857             = REG_SAVED_OFFSET;
858           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
859           break;
860
861         case DW_CFA_restore_extended:
862           insn_ptr = read_uleb128 (insn_ptr, &reg);
863           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED;
864           break;
865
866         case DW_CFA_undefined:
867         case DW_CFA_same_value:
868           insn_ptr = read_uleb128 (insn_ptr, &reg);
869           break;
870
871         case DW_CFA_nop:
872           break;
873
874         case DW_CFA_register:
875           {
876             _Unwind_Word reg2;
877             insn_ptr = read_uleb128 (insn_ptr, &reg);
878             insn_ptr = read_uleb128 (insn_ptr, &reg2);
879             fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_REG;
880             fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.reg = reg2;
881           }
882           break;
883
884         case DW_CFA_remember_state:
885           {
886             struct frame_state_reg_info *new_rs;
887             if (unused_rs)
888               {
889                 new_rs = unused_rs;
890                 unused_rs = unused_rs->prev;
891               }
892             else
893               new_rs = __builtin_alloca (sizeof (struct frame_state_reg_info));
894
895             *new_rs = fs->regs;
896             fs->regs.prev = new_rs;
897           }
898           break;
899
900         case DW_CFA_restore_state:
901           {
902             struct frame_state_reg_info *old_rs = fs->regs.prev;
903             fs->regs = *old_rs;
904             old_rs->prev = unused_rs;
905             unused_rs = old_rs;
906           }
907           break;
908
909         case DW_CFA_def_cfa:
910           insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
911           insn_ptr = read_uleb128 (insn_ptr, &utmp);
912           fs->cfa_offset = utmp;
913           fs->cfa_how = CFA_REG_OFFSET;
914           break;
915
916         case DW_CFA_def_cfa_register:
917           insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
918           fs->cfa_how = CFA_REG_OFFSET;
919           break;
920
921         case DW_CFA_def_cfa_offset:
922           insn_ptr = read_uleb128 (insn_ptr, &utmp);
923           fs->cfa_offset = utmp;
924           /* cfa_how deliberately not set.  */
925           break;
926
927         case DW_CFA_def_cfa_expression:
928           fs->cfa_exp = insn_ptr;
929           fs->cfa_how = CFA_EXP;
930           insn_ptr = read_uleb128 (insn_ptr, &utmp);
931           insn_ptr += utmp;
932           break;
933
934         case DW_CFA_expression:
935           insn_ptr = read_uleb128 (insn_ptr, &reg);
936           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how = REG_SAVED_EXP;
937           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.exp = insn_ptr;
938           insn_ptr = read_uleb128 (insn_ptr, &utmp);
939           insn_ptr += utmp;
940           break;
941
942           /* From the 2.1 draft.  */
943         case DW_CFA_offset_extended_sf:
944           insn_ptr = read_uleb128 (insn_ptr, &reg);
945           insn_ptr = read_sleb128 (insn_ptr, &stmp);
946           offset = stmp * fs->data_align;
947           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
948             = REG_SAVED_OFFSET;
949           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = offset;
950           break;
951
952         case DW_CFA_def_cfa_sf:
953           insn_ptr = read_uleb128 (insn_ptr, &fs->cfa_reg);
954           insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
955           fs->cfa_how = CFA_REG_OFFSET;
956           break;
957
958         case DW_CFA_def_cfa_offset_sf:
959           insn_ptr = read_sleb128 (insn_ptr, &fs->cfa_offset);
960           /* cfa_how deliberately not set.  */
961           break;
962
963         case DW_CFA_GNU_window_save:
964           /* ??? Hardcoded for SPARC register window configuration.  */
965           for (reg = 16; reg < 32; ++reg)
966             {
967               fs->regs.reg[reg].how = REG_SAVED_OFFSET;
968               fs->regs.reg[reg].loc.offset = (reg - 16) * sizeof (void *);
969             }
970           break;
971
972         case DW_CFA_GNU_args_size:
973           insn_ptr = read_uleb128 (insn_ptr, &context->args_size);
974           break;
975
976         case DW_CFA_GNU_negative_offset_extended:
977           /* Obsoleted by DW_CFA_offset_extended_sf, but used by
978              older PowerPC code.  */
979           insn_ptr = read_uleb128 (insn_ptr, &reg);
980           insn_ptr = read_uleb128 (insn_ptr, &utmp);
981           offset = (_Unwind_Word) utmp * fs->data_align;
982           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].how
983             = REG_SAVED_OFFSET;
984           fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (reg)].loc.offset = -offset;
985           break;
986
987         default:
988           abort ();
989         }
990     }
991 }
992 \f
993 /* Given the _Unwind_Context CONTEXT for a stack frame, look up the FDE for
994    its caller and decode it into FS.  This function also sets the
995    args_size and lsda members of CONTEXT, as they are really information
996    about the caller's frame.  */
997
998 static _Unwind_Reason_Code
999 uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1000 {
1001   struct dwarf_fde *fde;
1002   struct dwarf_cie *cie;
1003   const unsigned char *aug, *insn, *end;
1004
1005   memset (fs, 0, sizeof (*fs));
1006   context->args_size = 0;
1007   context->lsda = 0;
1008
1009   if (context->ra == 0)
1010     return _URC_END_OF_STACK;
1011
1012   fde = _Unwind_Find_FDE (context->ra - 1, &context->bases);
1013   if (fde == NULL)
1014     {
1015       /* Couldn't find frame unwind info for this function.  Try a
1016          target-specific fallback mechanism.  This will necessarily
1017          not provide a personality routine or LSDA.  */
1018 #ifdef MD_FALLBACK_FRAME_STATE_FOR
1019       MD_FALLBACK_FRAME_STATE_FOR (context, fs, success);
1020       return _URC_END_OF_STACK;
1021     success:
1022       return _URC_NO_REASON;
1023 #else
1024       return _URC_END_OF_STACK;
1025 #endif
1026     }
1027
1028   fs->pc = context->bases.func;
1029
1030   cie = get_cie (fde);
1031   insn = extract_cie_info (cie, context, fs);
1032   if (insn == NULL)
1033     /* CIE contained unknown augmentation.  */
1034     return _URC_FATAL_PHASE1_ERROR;
1035
1036   /* First decode all the insns in the CIE.  */
1037   end = (unsigned char *) next_fde ((struct dwarf_fde *) cie);
1038   execute_cfa_program (insn, end, context, fs);
1039
1040   /* Locate augmentation for the fde.  */
1041   aug = (unsigned char *) fde + sizeof (*fde);
1042   aug += 2 * size_of_encoded_value (fs->fde_encoding);
1043   insn = NULL;
1044   if (fs->saw_z)
1045     {
1046       _Unwind_Word i;
1047       aug = read_uleb128 (aug, &i);
1048       insn = aug + i;
1049     }
1050   if (fs->lsda_encoding != DW_EH_PE_omit)
1051     aug = read_encoded_value (context, fs->lsda_encoding, aug,
1052                               (_Unwind_Ptr *) &context->lsda);
1053
1054   /* Then the insns in the FDE up to our target PC.  */
1055   if (insn == NULL)
1056     insn = aug;
1057   end = (unsigned char *) next_fde (fde);
1058   execute_cfa_program (insn, end, context, fs);
1059
1060   return _URC_NO_REASON;
1061 }
1062 \f
1063 typedef struct frame_state
1064 {
1065   void *cfa;
1066   void *eh_ptr;
1067   long cfa_offset;
1068   long args_size;
1069   long reg_or_offset[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1070   unsigned short cfa_reg;
1071   unsigned short retaddr_column;
1072   char saved[PRE_GCC3_DWARF_FRAME_REGISTERS+1];
1073 } frame_state;
1074
1075 struct frame_state * __frame_state_for (void *, struct frame_state *);
1076
1077 /* Called from pre-G++ 3.0 __throw to find the registers to restore for
1078    a given PC_TARGET.  The caller should allocate a local variable of
1079    `struct frame_state' and pass its address to STATE_IN.  */
1080
1081 struct frame_state *
1082 __frame_state_for (void *pc_target, struct frame_state *state_in)
1083 {
1084   struct _Unwind_Context context;
1085   _Unwind_FrameState fs;
1086   int reg;
1087
1088   memset (&context, 0, sizeof (struct _Unwind_Context));
1089   context.ra = pc_target + 1;
1090
1091   if (uw_frame_state_for (&context, &fs) != _URC_NO_REASON)
1092     return 0;
1093
1094   /* We have no way to pass a location expression for the CFA to our
1095      caller.  It wouldn't understand it anyway.  */
1096   if (fs.cfa_how == CFA_EXP)
1097     return 0;
1098
1099   for (reg = 0; reg < PRE_GCC3_DWARF_FRAME_REGISTERS + 1; reg++)
1100     {
1101       state_in->saved[reg] = fs.regs.reg[reg].how;
1102       switch (state_in->saved[reg])
1103         {
1104         case REG_SAVED_REG:
1105           state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.reg;
1106           break;
1107         case REG_SAVED_OFFSET:
1108           state_in->reg_or_offset[reg] = fs.regs.reg[reg].loc.offset;
1109           break;
1110         default:
1111           state_in->reg_or_offset[reg] = 0;
1112           break;
1113         }
1114     }
1115
1116   state_in->cfa_offset = fs.cfa_offset;
1117   state_in->cfa_reg = fs.cfa_reg;
1118   state_in->retaddr_column = fs.retaddr_column;
1119   state_in->args_size = context.args_size;
1120   state_in->eh_ptr = fs.eh_ptr;
1121
1122   return state_in;
1123 }
1124 \f
1125 typedef union { _Unwind_Ptr ptr; _Unwind_Word word; } _Unwind_SpTmp;
1126
1127 static inline void
1128 _Unwind_SetSpColumn (struct _Unwind_Context *context, void *cfa,
1129                      _Unwind_SpTmp *tmp_sp)
1130 {
1131   int size = dwarf_reg_size_table[__builtin_dwarf_sp_column ()];
1132   
1133   if (size == sizeof(_Unwind_Ptr))
1134     tmp_sp->ptr = (_Unwind_Ptr) cfa;
1135   else if (size == sizeof(_Unwind_Word))
1136     tmp_sp->word = (_Unwind_Ptr) cfa;
1137   else
1138     abort ();
1139   _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), tmp_sp);
1140 }
1141
1142 static void
1143 uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1144 {
1145   struct _Unwind_Context orig_context = *context;
1146   void *cfa;
1147   long i;
1148
1149 #ifdef EH_RETURN_STACKADJ_RTX
1150   /* Special handling here: Many machines do not use a frame pointer,
1151      and track the CFA only through offsets from the stack pointer from
1152      one frame to the next.  In this case, the stack pointer is never
1153      stored, so it has no saved address in the context.  What we do
1154      have is the CFA from the previous stack frame.
1155
1156      In very special situations (such as unwind info for signal return),
1157      there may be location expressions that use the stack pointer as well.
1158
1159      Do this conditionally for one frame.  This allows the unwind info
1160      for one frame to save a copy of the stack pointer from the previous
1161      frame, and be able to use much easier CFA mechanisms to do it.
1162      Always zap the saved stack pointer value for the next frame; carrying
1163      the value over from one frame to another doesn't make sense.  */
1164
1165   _Unwind_SpTmp tmp_sp;
1166
1167   if (!_Unwind_GetGRPtr (&orig_context, __builtin_dwarf_sp_column ()))
1168     _Unwind_SetSpColumn (&orig_context, context->cfa, &tmp_sp);
1169   _Unwind_SetGRPtr (context, __builtin_dwarf_sp_column (), NULL);
1170 #endif
1171
1172   /* Compute this frame's CFA.  */
1173   switch (fs->cfa_how)
1174     {
1175     case CFA_REG_OFFSET:
1176       cfa = _Unwind_GetPtr (&orig_context, fs->cfa_reg);
1177       cfa += fs->cfa_offset;
1178       break;
1179
1180     case CFA_EXP:
1181       {
1182         const unsigned char *exp = fs->cfa_exp;
1183         _Unwind_Word len;
1184
1185         exp = read_uleb128 (exp, &len);
1186         cfa = (void *) (_Unwind_Ptr)
1187           execute_stack_op (exp, exp + len, &orig_context, 0);
1188         break;
1189       }
1190
1191     default:
1192       abort ();
1193     }
1194   context->cfa = cfa;
1195
1196   /* Compute the addresses of all registers saved in this frame.  */
1197   for (i = 0; i < DWARF_FRAME_REGISTERS + 1; ++i)
1198     switch (fs->regs.reg[i].how)
1199       {
1200       case REG_UNSAVED:
1201         break;
1202
1203       case REG_SAVED_OFFSET:
1204         _Unwind_SetGRPtr (context, i,
1205                           (void *) (cfa + fs->regs.reg[i].loc.offset));
1206         break;
1207
1208       case REG_SAVED_REG:
1209         _Unwind_SetGRPtr
1210           (context, i,
1211            _Unwind_GetGRPtr (&orig_context, fs->regs.reg[i].loc.reg));
1212         break;
1213
1214       case REG_SAVED_EXP:
1215         {
1216           const unsigned char *exp = fs->regs.reg[i].loc.exp;
1217           _Unwind_Word len;
1218           _Unwind_Ptr val;
1219
1220           exp = read_uleb128 (exp, &len);
1221           val = execute_stack_op (exp, exp + len, &orig_context,
1222                                   (_Unwind_Ptr) cfa);
1223           _Unwind_SetGRPtr (context, i, (void *) val);
1224         }
1225         break;
1226       }
1227
1228   MD_FROB_UPDATE_CONTEXT (context, fs);
1229 }
1230
1231 /* CONTEXT describes the unwind state for a frame, and FS describes the FDE
1232    of its caller.  Update CONTEXT to refer to the caller as well.  Note
1233    that the args_size and lsda members are not updated here, but later in
1234    uw_frame_state_for.  */
1235
1236 static void
1237 uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
1238 {
1239   uw_update_context_1 (context, fs);
1240
1241   /* Compute the return address now, since the return address column
1242      can change from frame to frame.  */
1243   context->ra = __builtin_extract_return_addr
1244     (_Unwind_GetPtr (context, fs->retaddr_column));
1245 }
1246 \f
1247 /* Fill in CONTEXT for top-of-stack.  The only valid registers at this
1248    level will be the return address and the CFA.  */
1249
1250 #define uw_init_context(CONTEXT)                                           \
1251   do                                                                       \
1252     {                                                                      \
1253       /* Do any necessary initialization to access arbitrary stack frames. \
1254          On the SPARC, this means flushing the register windows.  */       \
1255       __builtin_unwind_init ();                                            \
1256       uw_init_context_1 (CONTEXT, __builtin_dwarf_cfa (),                  \
1257                          __builtin_return_address (0));                    \
1258     }                                                                      \
1259   while (0)
1260
1261 static inline void
1262 init_dwarf_reg_size_table (void)
1263 {
1264   __builtin_init_dwarf_reg_size_table (dwarf_reg_size_table);
1265 }
1266
1267 static void
1268 uw_init_context_1 (struct _Unwind_Context *context,
1269                    void *outer_cfa, void *outer_ra)
1270 {
1271   void *ra = __builtin_extract_return_addr (__builtin_return_address (0));
1272   _Unwind_FrameState fs;
1273   _Unwind_SpTmp sp_slot;
1274
1275   memset (context, 0, sizeof (struct _Unwind_Context));
1276   context->ra = ra;
1277
1278   if (uw_frame_state_for (context, &fs) != _URC_NO_REASON)
1279     abort ();
1280
1281 #if __GTHREADS
1282   {
1283     static __gthread_once_t once_regsizes = __GTHREAD_ONCE_INIT;
1284     if (__gthread_once (&once_regsizes, init_dwarf_reg_size_table) != 0
1285         || dwarf_reg_size_table[0] == 0)
1286       init_dwarf_reg_size_table ();
1287   }
1288 #else
1289   if (dwarf_reg_size_table[0] == 0)
1290     init_dwarf_reg_size_table ();
1291 #endif
1292
1293   /* Force the frame state to use the known cfa value.  */
1294   _Unwind_SetSpColumn (context, outer_cfa, &sp_slot);
1295   fs.cfa_how = CFA_REG_OFFSET;
1296   fs.cfa_reg = __builtin_dwarf_sp_column ();
1297   fs.cfa_offset = 0;
1298
1299   uw_update_context_1 (context, &fs);
1300
1301   /* If the return address column was saved in a register in the
1302      initialization context, then we can't see it in the given
1303      call frame data.  So have the initialization context tell us.  */
1304   context->ra = __builtin_extract_return_addr (outer_ra);
1305 }
1306
1307
1308 /* Install TARGET into CURRENT so that we can return to it.  This is a
1309    macro because __builtin_eh_return must be invoked in the context of
1310    our caller.  */
1311
1312 #define uw_install_context(CURRENT, TARGET)                              \
1313   do                                                                     \
1314     {                                                                    \
1315       long offset = uw_install_context_1 ((CURRENT), (TARGET));          \
1316       void *handler = __builtin_frob_return_addr ((TARGET)->ra);         \
1317       __builtin_eh_return (offset, handler);                             \
1318     }                                                                    \
1319   while (0)
1320
1321 static long
1322 uw_install_context_1 (struct _Unwind_Context *current,
1323                       struct _Unwind_Context *target)
1324 {
1325   long i;
1326
1327   for (i = 0; i < DWARF_FRAME_REGISTERS; ++i)
1328     {
1329       void *c = current->reg[i];
1330       void *t = target->reg[i];
1331
1332       if (t && c && t != c)
1333         memcpy (c, t, dwarf_reg_size_table[i]);
1334     }
1335
1336 #ifdef EH_RETURN_STACKADJ_RTX
1337   {
1338     void *target_cfa;
1339
1340     /* If the last frame records a saved stack pointer, use it.  */
1341     if (_Unwind_GetGRPtr (target, __builtin_dwarf_sp_column ()))
1342       target_cfa = _Unwind_GetPtr (target, __builtin_dwarf_sp_column ());
1343     else
1344       target_cfa = target->cfa;
1345
1346     /* We adjust SP by the difference between CURRENT and TARGET's CFA.  */
1347     if (STACK_GROWS_DOWNWARD)
1348       return target_cfa - current->cfa + target->args_size;
1349     else
1350       return current->cfa - target_cfa - target->args_size;
1351   }
1352 #else
1353   return 0;
1354 #endif
1355 }
1356
1357 static inline _Unwind_Ptr
1358 uw_identify_context (struct _Unwind_Context *context)
1359 {
1360   return _Unwind_GetIP (context);
1361 }
1362
1363
1364 #include "unwind.inc"
1365
1366 #endif /* !USING_SJLJ_EXCEPTIONS */