Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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