OSDN Git Service

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