Subversion Repositories Kolibri OS

Rev

Rev 4383 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4383 Serge 1
/* Subroutines needed for unwinding stack frames for exception handling.  */
5963 serge 2
/* Copyright (C) 1997-2013 Free Software Foundation, Inc.
4383 Serge 3
   Contributed by Jason Merrill .
4
 
5
This file is part of GCC.
6
 
7
GCC is free software; you can redistribute it and/or modify it under
8
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 3, or (at your option) any later
10
version.
11
 
12
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13
WARRANTY; without even the implied warranty of MERCHANTABILITY or
14
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15
for more details.
16
 
17
Under Section 7 of GPL version 3, you are granted additional
18
permissions described in the GCC Runtime Library Exception, version
19
3.1, as published by the Free Software Foundation.
20
 
21
You should have received a copy of the GNU General Public License and
22
a copy of the GCC Runtime Library Exception along with this program;
23
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24
.  */
25
 
26
#ifndef _Unwind_Find_FDE
27
#include "tconfig.h"
28
#include "tsystem.h"
29
#include "coretypes.h"
30
#include "tm.h"
31
#include "dwarf2.h"
32
#include "unwind.h"
33
#define NO_BASE_OF_ENCODED_VALUE
34
#include "unwind-pe.h"
35
#include "unwind-dw2-fde.h"
36
#include "gthr.h"
37
#endif
38
 
39
/* The unseen_objects list contains objects that have been registered
40
   but not yet categorized in any way.  The seen_objects list has had
41
   its pc_begin and count fields initialized at minimum, and is sorted
42
   by decreasing value of pc_begin.  */
43
static struct object *unseen_objects;
44
static struct object *seen_objects;
45
 
46
#ifdef __GTHREAD_MUTEX_INIT
47
static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT;
48
#else
49
static __gthread_mutex_t object_mutex;
50
#endif
51
 
52
#ifdef __GTHREAD_MUTEX_INIT_FUNCTION
53
static void
54
init_object_mutex (void)
55
{
56
  __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex);
57
}
58
 
59
static void
60
init_object_mutex_once (void)
61
{
62
  static __gthread_once_t once = __GTHREAD_ONCE_INIT;
63
  __gthread_once (&once, init_object_mutex);
64
}
65
#else
5963 serge 66
/* ???  Several targets include this file with stubbing parts of gthr.h
67
   and expect no locking to be done.  */
4383 Serge 68
#define init_object_mutex_once()
69
#endif
70
 
71
/* Called from crtbegin.o to register the unwind info for an object.  */
72
 
73
void
74
__register_frame_info_bases (const void *begin, struct object *ob,
75
			     void *tbase, void *dbase)
76
{
77
  /* If .eh_frame is empty, don't register at all.  */
78
  if ((const uword *) begin == 0 || *(const uword *) begin == 0)
79
    return;
80
 
81
  ob->pc_begin = (void *)-1;
82
  ob->tbase = tbase;
83
  ob->dbase = dbase;
84
  ob->u.single = begin;
85
  ob->s.i = 0;
86
  ob->s.b.encoding = DW_EH_PE_omit;
87
#ifdef DWARF2_OBJECT_END_PTR_EXTENSION
88
  ob->fde_end = NULL;
89
#endif
90
 
91
  init_object_mutex_once ();
92
  __gthread_mutex_lock (&object_mutex);
93
 
94
  ob->next = unseen_objects;
95
  unseen_objects = ob;
96
 
97
  __gthread_mutex_unlock (&object_mutex);
98
}
99
 
100
void
101
__register_frame_info (const void *begin, struct object *ob)
102
{
103
  __register_frame_info_bases (begin, ob, 0, 0);
104
}
105
 
106
void
107
__register_frame (void *begin)
108
{
109
  struct object *ob;
110
 
111
  /* If .eh_frame is empty, don't register at all.  */
112
  if (*(uword *) begin == 0)
113
    return;
114
 
115
  ob = malloc (sizeof (struct object));
116
  __register_frame_info (begin, ob);
117
}
118
 
119
/* Similar, but BEGIN is actually a pointer to a table of unwind entries
120
   for different translation units.  Called from the file generated by
121
   collect2.  */
122
 
123
void
124
__register_frame_info_table_bases (void *begin, struct object *ob,
125
				   void *tbase, void *dbase)
126
{
127
  ob->pc_begin = (void *)-1;
128
  ob->tbase = tbase;
129
  ob->dbase = dbase;
130
  ob->u.array = begin;
131
  ob->s.i = 0;
132
  ob->s.b.from_array = 1;
133
  ob->s.b.encoding = DW_EH_PE_omit;
134
 
135
  init_object_mutex_once ();
136
  __gthread_mutex_lock (&object_mutex);
137
 
138
  ob->next = unseen_objects;
139
  unseen_objects = ob;
140
 
141
  __gthread_mutex_unlock (&object_mutex);
142
}
143
 
144
void
145
__register_frame_info_table (void *begin, struct object *ob)
146
{
147
  __register_frame_info_table_bases (begin, ob, 0, 0);
148
}
149
 
150
void
151
__register_frame_table (void *begin)
152
{
153
  struct object *ob = malloc (sizeof (struct object));
154
  __register_frame_info_table (begin, ob);
155
}
156
 
157
/* Called from crtbegin.o to deregister the unwind info for an object.  */
158
/* ??? Glibc has for a while now exported __register_frame_info and
159
   __deregister_frame_info.  If we call __register_frame_info_bases
160
   from crtbegin (wherein it is declared weak), and this object does
161
   not get pulled from libgcc.a for other reasons, then the
162
   invocation of __deregister_frame_info will be resolved from glibc.
163
   Since the registration did not happen there, we'll die.
164
 
165
   Therefore, declare a new deregistration entry point that does the
166
   exact same thing, but will resolve to the same library as
167
   implements __register_frame_info_bases.  */
168
 
169
void *
170
__deregister_frame_info_bases (const void *begin)
171
{
172
  struct object **p;
173
  struct object *ob = 0;
174
 
175
  /* If .eh_frame is empty, we haven't registered.  */
176
  if ((const uword *) begin == 0 || *(const uword *) begin == 0)
177
    return ob;
178
 
179
  init_object_mutex_once ();
180
  __gthread_mutex_lock (&object_mutex);
181
 
182
  for (p = &unseen_objects; *p ; p = &(*p)->next)
183
    if ((*p)->u.single == begin)
184
      {
185
	ob = *p;
186
	*p = ob->next;
187
	goto out;
188
      }
189
 
190
  for (p = &seen_objects; *p ; p = &(*p)->next)
191
    if ((*p)->s.b.sorted)
192
      {
193
	if ((*p)->u.sort->orig_data == begin)
194
	  {
195
	    ob = *p;
196
	    *p = ob->next;
197
	    free (ob->u.sort);
198
	    goto out;
199
	  }
200
      }
201
    else
202
      {
203
	if ((*p)->u.single == begin)
204
	  {
205
	    ob = *p;
206
	    *p = ob->next;
207
	    goto out;
208
	  }
209
      }
210
 
211
 out:
212
  __gthread_mutex_unlock (&object_mutex);
213
  gcc_assert (ob);
214
  return (void *) ob;
215
}
216
 
217
void *
218
__deregister_frame_info (const void *begin)
219
{
220
  return __deregister_frame_info_bases (begin);
221
}
222
 
223
void
224
__deregister_frame (void *begin)
225
{
226
  /* If .eh_frame is empty, we haven't registered.  */
227
  if (*(uword *) begin != 0)
228
    free (__deregister_frame_info (begin));
229
}
230
 
231
/* Like base_of_encoded_value, but take the base from a struct object
232
   instead of an _Unwind_Context.  */
233
 
234
static _Unwind_Ptr
235
base_from_object (unsigned char encoding, struct object *ob)
236
{
237
  if (encoding == DW_EH_PE_omit)
238
    return 0;
239
 
240
  switch (encoding & 0x70)
241
    {
242
    case DW_EH_PE_absptr:
243
    case DW_EH_PE_pcrel:
244
    case DW_EH_PE_aligned:
245
      return 0;
246
 
247
    case DW_EH_PE_textrel:
248
      return (_Unwind_Ptr) ob->tbase;
249
    case DW_EH_PE_datarel:
250
      return (_Unwind_Ptr) ob->dbase;
251
    default:
252
      gcc_unreachable ();
253
    }
254
}
255
 
256
/* Return the FDE pointer encoding from the CIE.  */
257
/* ??? This is a subset of extract_cie_info from unwind-dw2.c.  */
258
 
259
static int
260
get_cie_encoding (const struct dwarf_cie *cie)
261
{
262
  const unsigned char *aug, *p;
263
  _Unwind_Ptr dummy;
264
  _uleb128_t utmp;
265
  _sleb128_t stmp;
266
 
267
  aug = cie->augmentation;
5963 serge 268
  p = aug + strlen ((const char *)aug) + 1; /* Skip the augmentation string.  */
269
  if (__builtin_expect (cie->version >= 4, 0))
270
    {
271
      if (p[0] != sizeof (void *) || p[1] != 0)
272
	return DW_EH_PE_omit;		/* We are not prepared to handle unexpected
273
					   address sizes or segment selectors.  */
274
      p += 2;				/* Skip address size and segment size.  */
275
    }
276
 
4383 Serge 277
  if (aug[0] != 'z')
278
    return DW_EH_PE_absptr;
279
 
280
  p = read_uleb128 (p, &utmp);		/* Skip code alignment.  */
281
  p = read_sleb128 (p, &stmp);		/* Skip data alignment.  */
282
  if (cie->version == 1)		/* Skip return address column.  */
283
    p++;
284
  else
285
    p = read_uleb128 (p, &utmp);
286
 
287
  aug++;				/* Skip 'z' */
288
  p = read_uleb128 (p, &utmp);		/* Skip augmentation length.  */
289
  while (1)
290
    {
291
      /* This is what we're looking for.  */
292
      if (*aug == 'R')
293
	return *p;
294
      /* Personality encoding and pointer.  */
295
      else if (*aug == 'P')
296
	{
297
	  /* ??? Avoid dereferencing indirect pointers, since we're
298
	     faking the base address.  Gotta keep DW_EH_PE_aligned
299
	     intact, however.  */
300
	  p = read_encoded_value_with_base (*p & 0x7F, 0, p + 1, &dummy);
301
	}
302
      /* LSDA encoding.  */
303
      else if (*aug == 'L')
304
	p++;
305
      /* Otherwise end of string, or unknown augmentation.  */
306
      else
307
	return DW_EH_PE_absptr;
308
      aug++;
309
    }
310
}
311
 
312
static inline int
313
get_fde_encoding (const struct dwarf_fde *f)
314
{
315
  return get_cie_encoding (get_cie (f));
316
}
317
 
5963 serge 318
 
4383 Serge 319
/* Sorting an array of FDEs by address.
320
   (Ideally we would have the linker sort the FDEs so we don't have to do
321
   it at run time. But the linkers are not yet prepared for this.)  */
322
 
323
/* Comparison routines.  Three variants of increasing complexity.  */
324
 
325
static int
326
fde_unencoded_compare (struct object *ob __attribute__((unused)),
327
		       const fde *x, const fde *y)
328
{
329
  _Unwind_Ptr x_ptr, y_ptr;
330
  memcpy (&x_ptr, x->pc_begin, sizeof (_Unwind_Ptr));
331
  memcpy (&y_ptr, y->pc_begin, sizeof (_Unwind_Ptr));
332
 
333
  if (x_ptr > y_ptr)
334
    return 1;
335
  if (x_ptr < y_ptr)
336
    return -1;
337
  return 0;
338
}
339
 
340
static int
341
fde_single_encoding_compare (struct object *ob, const fde *x, const fde *y)
342
{
343
  _Unwind_Ptr base, x_ptr, y_ptr;
344
 
345
  base = base_from_object (ob->s.b.encoding, ob);
346
  read_encoded_value_with_base (ob->s.b.encoding, base, x->pc_begin, &x_ptr);
347
  read_encoded_value_with_base (ob->s.b.encoding, base, y->pc_begin, &y_ptr);
348
 
349
  if (x_ptr > y_ptr)
350
    return 1;
351
  if (x_ptr < y_ptr)
352
    return -1;
353
  return 0;
354
}
355
 
356
static int
357
fde_mixed_encoding_compare (struct object *ob, const fde *x, const fde *y)
358
{
359
  int x_encoding, y_encoding;
360
  _Unwind_Ptr x_ptr, y_ptr;
361
 
362
  x_encoding = get_fde_encoding (x);
363
  read_encoded_value_with_base (x_encoding, base_from_object (x_encoding, ob),
364
				x->pc_begin, &x_ptr);
365
 
366
  y_encoding = get_fde_encoding (y);
367
  read_encoded_value_with_base (y_encoding, base_from_object (y_encoding, ob),
368
				y->pc_begin, &y_ptr);
369
 
370
  if (x_ptr > y_ptr)
371
    return 1;
372
  if (x_ptr < y_ptr)
373
    return -1;
374
  return 0;
375
}
376
 
377
typedef int (*fde_compare_t) (struct object *, const fde *, const fde *);
378
 
379
 
380
/* This is a special mix of insertion sort and heap sort, optimized for
381
   the data sets that actually occur. They look like
382
   101 102 103 127 128 105 108 110 190 111 115 119 125 160 126 129 130.
383
   I.e. a linearly increasing sequence (coming from functions in the text
384
   section), with additionally a few unordered elements (coming from functions
385
   in gnu_linkonce sections) whose values are higher than the values in the
386
   surrounding linear sequence (but not necessarily higher than the values
387
   at the end of the linear sequence!).
388
   The worst-case total run time is O(N) + O(n log (n)), where N is the
389
   total number of FDEs and n is the number of erratic ones.  */
390
 
391
struct fde_accumulator
392
{
393
  struct fde_vector *linear;
394
  struct fde_vector *erratic;
395
};
396
 
397
static inline int
398
start_fde_sort (struct fde_accumulator *accu, size_t count)
399
{
400
  size_t size;
401
  if (! count)
402
    return 0;
403
 
404
  size = sizeof (struct fde_vector) + sizeof (const fde *) * count;
405
  if ((accu->linear = malloc (size)))
406
    {
407
      accu->linear->count = 0;
408
      if ((accu->erratic = malloc (size)))
409
	accu->erratic->count = 0;
410
      return 1;
411
    }
412
  else
413
    return 0;
414
}
415
 
416
static inline void
417
fde_insert (struct fde_accumulator *accu, const fde *this_fde)
418
{
419
  if (accu->linear)
420
    accu->linear->array[accu->linear->count++] = this_fde;
421
}
422
 
423
/* Split LINEAR into a linear sequence with low values and an erratic
424
   sequence with high values, put the linear one (of longest possible
425
   length) into LINEAR and the erratic one into ERRATIC. This is O(N).
426
 
427
   Because the longest linear sequence we are trying to locate within the
428
   incoming LINEAR array can be interspersed with (high valued) erratic
429
   entries.  We construct a chain indicating the sequenced entries.
430
   To avoid having to allocate this chain, we overlay it onto the space of
431
   the ERRATIC array during construction.  A final pass iterates over the
432
   chain to determine what should be placed in the ERRATIC array, and
433
   what is the linear sequence.  This overlay is safe from aliasing.  */
434
 
435
static inline void
436
fde_split (struct object *ob, fde_compare_t fde_compare,
437
	   struct fde_vector *linear, struct fde_vector *erratic)
438
{
439
  static const fde *marker;
440
  size_t count = linear->count;
441
  const fde *const *chain_end = ▮
442
  size_t i, j, k;
443
 
444
  /* This should optimize out, but it is wise to make sure this assumption
445
     is correct. Should these have different sizes, we cannot cast between
446
     them and the overlaying onto ERRATIC will not work.  */
447
  gcc_assert (sizeof (const fde *) == sizeof (const fde **));
448
 
449
  for (i = 0; i < count; i++)
450
    {
451
      const fde *const *probe;
452
 
453
      for (probe = chain_end;
454
	   probe != &marker && fde_compare (ob, linear->array[i], *probe) < 0;
455
	   probe = chain_end)
456
	{
457
	  chain_end = (const fde *const*) erratic->array[probe - linear->array];
458
	  erratic->array[probe - linear->array] = NULL;
459
	}
460
      erratic->array[i] = (const fde *) chain_end;
461
      chain_end = &linear->array[i];
462
    }
463
 
464
  /* Each entry in LINEAR which is part of the linear sequence we have
465
     discovered will correspond to a non-NULL entry in the chain we built in
466
     the ERRATIC array.  */
467
  for (i = j = k = 0; i < count; i++)
468
    if (erratic->array[i])
469
      linear->array[j++] = linear->array[i];
470
    else
471
      erratic->array[k++] = linear->array[i];
472
  linear->count = j;
473
  erratic->count = k;
474
}
475
 
476
#define SWAP(x,y) do { const fde * tmp = x; x = y; y = tmp; } while (0)
477
 
478
/* Convert a semi-heap to a heap.  A semi-heap is a heap except possibly
479
   for the first (root) node; push it down to its rightful place.  */
480
 
481
static void
482
frame_downheap (struct object *ob, fde_compare_t fde_compare, const fde **a,
483
		int lo, int hi)
484
{
485
  int i, j;
486
 
487
  for (i = lo, j = 2*i+1;
488
       j < hi;
489
       j = 2*i+1)
490
    {
491
      if (j+1 < hi && fde_compare (ob, a[j], a[j+1]) < 0)
492
	++j;
493
 
494
      if (fde_compare (ob, a[i], a[j]) < 0)
495
	{
496
	  SWAP (a[i], a[j]);
497
	  i = j;
498
	}
499
      else
500
	break;
501
    }
502
}
503
 
504
/* This is O(n log(n)).  BSD/OS defines heapsort in stdlib.h, so we must
505
   use a name that does not conflict.  */
506
 
507
static void
508
frame_heapsort (struct object *ob, fde_compare_t fde_compare,
509
		struct fde_vector *erratic)
510
{
511
  /* For a description of this algorithm, see:
512
     Samuel P. Harbison, Guy L. Steele Jr.: C, a reference manual, 2nd ed.,
513
     p. 60-61.  */
514
  const fde ** a = erratic->array;
515
  /* A portion of the array is called a "heap" if for all i>=0:
516
     If i and 2i+1 are valid indices, then a[i] >= a[2i+1].
517
     If i and 2i+2 are valid indices, then a[i] >= a[2i+2].  */
518
  size_t n = erratic->count;
519
  int m;
520
 
521
  /* Expand our heap incrementally from the end of the array, heapifying
522
     each resulting semi-heap as we go.  After each step, a[m] is the top
523
     of a heap.  */
524
  for (m = n/2-1; m >= 0; --m)
525
    frame_downheap (ob, fde_compare, a, m, n);
526
 
527
  /* Shrink our heap incrementally from the end of the array, first
528
     swapping out the largest element a[0] and then re-heapifying the
529
     resulting semi-heap.  After each step, a[0..m) is a heap.  */
530
  for (m = n-1; m >= 1; --m)
531
    {
532
      SWAP (a[0], a[m]);
533
      frame_downheap (ob, fde_compare, a, 0, m);
534
    }
535
#undef SWAP
536
}
537
 
538
/* Merge V1 and V2, both sorted, and put the result into V1.  */
539
static inline void
540
fde_merge (struct object *ob, fde_compare_t fde_compare,
541
	   struct fde_vector *v1, struct fde_vector *v2)
542
{
543
  size_t i1, i2;
544
  const fde * fde2;
545
 
546
  i2 = v2->count;
547
  if (i2 > 0)
548
    {
549
      i1 = v1->count;
550
      do
551
	{
552
	  i2--;
553
	  fde2 = v2->array[i2];
554
	  while (i1 > 0 && fde_compare (ob, v1->array[i1-1], fde2) > 0)
555
	    {
556
	      v1->array[i1+i2] = v1->array[i1-1];
557
	      i1--;
558
	    }
559
	  v1->array[i1+i2] = fde2;
560
	}
561
      while (i2 > 0);
562
      v1->count += v2->count;
563
    }
564
}
565
 
566
static inline void
567
end_fde_sort (struct object *ob, struct fde_accumulator *accu, size_t count)
568
{
569
  fde_compare_t fde_compare;
570
 
571
  gcc_assert (!accu->linear || accu->linear->count == count);
572
 
573
  if (ob->s.b.mixed_encoding)
574
    fde_compare = fde_mixed_encoding_compare;
575
  else if (ob->s.b.encoding == DW_EH_PE_absptr)
576
    fde_compare = fde_unencoded_compare;
577
  else
578
    fde_compare = fde_single_encoding_compare;
579
 
580
  if (accu->erratic)
581
    {
582
      fde_split (ob, fde_compare, accu->linear, accu->erratic);
583
      gcc_assert (accu->linear->count + accu->erratic->count == count);
584
      frame_heapsort (ob, fde_compare, accu->erratic);
585
      fde_merge (ob, fde_compare, accu->linear, accu->erratic);
586
      free (accu->erratic);
587
    }
588
  else
589
    {
590
      /* We've not managed to malloc an erratic array,
591
	 so heap sort in the linear one.  */
592
      frame_heapsort (ob, fde_compare, accu->linear);
593
    }
594
}
595
 
596
 
597
/* Update encoding, mixed_encoding, and pc_begin for OB for the
598
   fde array beginning at THIS_FDE.  Return the number of fdes
599
   encountered along the way.  */
600
 
601
static size_t
602
classify_object_over_fdes (struct object *ob, const fde *this_fde)
603
{
604
  const struct dwarf_cie *last_cie = 0;
605
  size_t count = 0;
606
  int encoding = DW_EH_PE_absptr;
607
  _Unwind_Ptr base = 0;
608
 
609
  for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
610
    {
611
      const struct dwarf_cie *this_cie;
612
      _Unwind_Ptr mask, pc_begin;
613
 
614
      /* Skip CIEs.  */
615
      if (this_fde->CIE_delta == 0)
616
	continue;
617
 
618
      /* Determine the encoding for this FDE.  Note mixed encoded
619
	 objects for later.  */
620
      this_cie = get_cie (this_fde);
621
      if (this_cie != last_cie)
622
	{
623
	  last_cie = this_cie;
624
	  encoding = get_cie_encoding (this_cie);
5963 serge 625
	  if (encoding == DW_EH_PE_omit)
626
	    return -1;
4383 Serge 627
	  base = base_from_object (encoding, ob);
628
	  if (ob->s.b.encoding == DW_EH_PE_omit)
629
	    ob->s.b.encoding = encoding;
630
	  else if (ob->s.b.encoding != encoding)
631
	    ob->s.b.mixed_encoding = 1;
632
	}
633
 
634
      read_encoded_value_with_base (encoding, base, this_fde->pc_begin,
635
				    &pc_begin);
636
 
637
      /* Take care to ignore link-once functions that were removed.
638
	 In these cases, the function address will be NULL, but if
639
	 the encoding is smaller than a pointer a true NULL may not
640
	 be representable.  Assume 0 in the representable bits is NULL.  */
641
      mask = size_of_encoded_value (encoding);
642
      if (mask < sizeof (void *))
643
	mask = (((_Unwind_Ptr) 1) << (mask << 3)) - 1;
644
      else
645
	mask = -1;
646
 
647
      if ((pc_begin & mask) == 0)
648
	continue;
649
 
650
      count += 1;
651
      if ((void *) pc_begin < ob->pc_begin)
652
	ob->pc_begin = (void *) pc_begin;
653
    }
654
 
655
  return count;
656
}
657
 
658
static void
659
add_fdes (struct object *ob, struct fde_accumulator *accu, const fde *this_fde)
660
{
661
  const struct dwarf_cie *last_cie = 0;
662
  int encoding = ob->s.b.encoding;
663
  _Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob);
664
 
665
  for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
666
    {
667
      const struct dwarf_cie *this_cie;
668
 
669
      /* Skip CIEs.  */
670
      if (this_fde->CIE_delta == 0)
671
	continue;
672
 
673
      if (ob->s.b.mixed_encoding)
674
	{
675
	  /* Determine the encoding for this FDE.  Note mixed encoded
676
	     objects for later.  */
677
	  this_cie = get_cie (this_fde);
678
	  if (this_cie != last_cie)
679
	    {
680
	      last_cie = this_cie;
681
	      encoding = get_cie_encoding (this_cie);
682
	      base = base_from_object (encoding, ob);
683
	    }
684
	}
685
 
686
      if (encoding == DW_EH_PE_absptr)
687
	{
688
	  _Unwind_Ptr ptr;
689
	  memcpy (&ptr, this_fde->pc_begin, sizeof (_Unwind_Ptr));
690
	  if (ptr == 0)
691
	    continue;
692
	}
693
      else
694
	{
695
	  _Unwind_Ptr pc_begin, mask;
696
 
697
	  read_encoded_value_with_base (encoding, base, this_fde->pc_begin,
698
					&pc_begin);
699
 
700
	  /* Take care to ignore link-once functions that were removed.
701
	     In these cases, the function address will be NULL, but if
702
	     the encoding is smaller than a pointer a true NULL may not
703
	     be representable.  Assume 0 in the representable bits is NULL.  */
704
	  mask = size_of_encoded_value (encoding);
705
	  if (mask < sizeof (void *))
706
	    mask = (((_Unwind_Ptr) 1) << (mask << 3)) - 1;
707
	  else
708
	    mask = -1;
709
 
710
	  if ((pc_begin & mask) == 0)
711
	    continue;
712
	}
713
 
714
      fde_insert (accu, this_fde);
715
    }
716
}
717
 
718
/* Set up a sorted array of pointers to FDEs for a loaded object.  We
719
   count up the entries before allocating the array because it's likely to
720
   be faster.  We can be called multiple times, should we have failed to
721
   allocate a sorted fde array on a previous occasion.  */
722
 
723
static inline void
724
init_object (struct object* ob)
725
{
726
  struct fde_accumulator accu;
727
  size_t count;
728
 
729
  count = ob->s.b.count;
730
  if (count == 0)
731
    {
732
      if (ob->s.b.from_array)
733
	{
734
	  fde **p = ob->u.array;
735
	  for (count = 0; *p; ++p)
5963 serge 736
	    {
737
	      size_t cur_count = classify_object_over_fdes (ob, *p);
738
	      if (cur_count == (size_t) -1)
739
		goto unhandled_fdes;
740
	      count += cur_count;
741
	    }
4383 Serge 742
	}
743
      else
5963 serge 744
	{
745
	  count = classify_object_over_fdes (ob, ob->u.single);
746
	  if (count == (size_t) -1)
747
	    {
748
	      static const fde terminator;
749
	    unhandled_fdes:
750
	      ob->s.i = 0;
751
	      ob->s.b.encoding = DW_EH_PE_omit;
752
	      ob->u.single = &terminator;
753
	      return;
754
	    }
755
	}
4383 Serge 756
 
757
      /* The count field we have in the main struct object is somewhat
758
	 limited, but should suffice for virtually all cases.  If the
759
	 counted value doesn't fit, re-write a zero.  The worst that
760
	 happens is that we re-count next time -- admittedly non-trivial
761
	 in that this implies some 2M fdes, but at least we function.  */
762
      ob->s.b.count = count;
763
      if (ob->s.b.count != count)
764
	ob->s.b.count = 0;
765
    }
766
 
767
  if (!start_fde_sort (&accu, count))
768
    return;
769
 
770
  if (ob->s.b.from_array)
771
    {
772
      fde **p;
773
      for (p = ob->u.array; *p; ++p)
774
	add_fdes (ob, &accu, *p);
775
    }
776
  else
777
    add_fdes (ob, &accu, ob->u.single);
778
 
779
  end_fde_sort (ob, &accu, count);
780
 
781
  /* Save the original fde pointer, since this is the key by which the
782
     DSO will deregister the object.  */
783
  accu.linear->orig_data = ob->u.single;
784
  ob->u.sort = accu.linear;
785
 
786
  ob->s.b.sorted = 1;
787
}
788
 
789
/* A linear search through a set of FDEs for the given PC.  This is
790
   used when there was insufficient memory to allocate and sort an
791
   array.  */
792
 
793
static const fde *
794
linear_search_fdes (struct object *ob, const fde *this_fde, void *pc)
795
{
796
  const struct dwarf_cie *last_cie = 0;
797
  int encoding = ob->s.b.encoding;
798
  _Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob);
799
 
800
  for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
801
    {
802
      const struct dwarf_cie *this_cie;
803
      _Unwind_Ptr pc_begin, pc_range;
804
 
805
      /* Skip CIEs.  */
806
      if (this_fde->CIE_delta == 0)
807
	continue;
808
 
809
      if (ob->s.b.mixed_encoding)
810
	{
811
	  /* Determine the encoding for this FDE.  Note mixed encoded
812
	     objects for later.  */
813
	  this_cie = get_cie (this_fde);
814
	  if (this_cie != last_cie)
815
	    {
816
	      last_cie = this_cie;
817
	      encoding = get_cie_encoding (this_cie);
818
	      base = base_from_object (encoding, ob);
819
	    }
820
	}
821
 
822
      if (encoding == DW_EH_PE_absptr)
823
	{
824
	  const _Unwind_Ptr *pc_array = (const _Unwind_Ptr *) this_fde->pc_begin;
825
	  pc_begin = pc_array[0];
826
	  pc_range = pc_array[1];
827
	  if (pc_begin == 0)
828
	    continue;
829
	}
830
      else
831
	{
832
	  _Unwind_Ptr mask;
833
	  const unsigned char *p;
834
 
835
	  p = read_encoded_value_with_base (encoding, base,
836
					    this_fde->pc_begin, &pc_begin);
837
	  read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range);
838
 
839
	  /* Take care to ignore link-once functions that were removed.
840
	     In these cases, the function address will be NULL, but if
841
	     the encoding is smaller than a pointer a true NULL may not
842
	     be representable.  Assume 0 in the representable bits is NULL.  */
843
	  mask = size_of_encoded_value (encoding);
844
	  if (mask < sizeof (void *))
845
	    mask = (((_Unwind_Ptr) 1) << (mask << 3)) - 1;
846
	  else
847
	    mask = -1;
848
 
849
	  if ((pc_begin & mask) == 0)
850
	    continue;
851
	}
852
 
853
      if ((_Unwind_Ptr) pc - pc_begin < pc_range)
854
	return this_fde;
855
    }
856
 
857
  return NULL;
858
}
859
 
860
/* Binary search for an FDE containing the given PC.  Here are three
861
   implementations of increasing complexity.  */
862
 
863
static inline const fde *
864
binary_search_unencoded_fdes (struct object *ob, void *pc)
865
{
866
  struct fde_vector *vec = ob->u.sort;
867
  size_t lo, hi;
868
 
869
  for (lo = 0, hi = vec->count; lo < hi; )
870
    {
871
      size_t i = (lo + hi) / 2;
872
      const fde *const f = vec->array[i];
873
      void *pc_begin;
874
      uaddr pc_range;
875
      memcpy (&pc_begin, (const void * const *) f->pc_begin, sizeof (void *));
876
      memcpy (&pc_range, (const uaddr *) f->pc_begin + 1, sizeof (uaddr));
877
 
878
      if (pc < pc_begin)
879
	hi = i;
880
      else if (pc >= pc_begin + pc_range)
881
	lo = i + 1;
882
      else
883
	return f;
884
    }
885
 
886
  return NULL;
887
}
888
 
889
static inline const fde *
890
binary_search_single_encoding_fdes (struct object *ob, void *pc)
891
{
892
  struct fde_vector *vec = ob->u.sort;
893
  int encoding = ob->s.b.encoding;
894
  _Unwind_Ptr base = base_from_object (encoding, ob);
895
  size_t lo, hi;
896
 
897
  for (lo = 0, hi = vec->count; lo < hi; )
898
    {
899
      size_t i = (lo + hi) / 2;
900
      const fde *f = vec->array[i];
901
      _Unwind_Ptr pc_begin, pc_range;
902
      const unsigned char *p;
903
 
904
      p = read_encoded_value_with_base (encoding, base, f->pc_begin,
905
					&pc_begin);
906
      read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range);
907
 
908
      if ((_Unwind_Ptr) pc < pc_begin)
909
	hi = i;
910
      else if ((_Unwind_Ptr) pc >= pc_begin + pc_range)
911
	lo = i + 1;
912
      else
913
	return f;
914
    }
915
 
916
  return NULL;
917
}
918
 
919
static inline const fde *
920
binary_search_mixed_encoding_fdes (struct object *ob, void *pc)
921
{
922
  struct fde_vector *vec = ob->u.sort;
923
  size_t lo, hi;
924
 
925
  for (lo = 0, hi = vec->count; lo < hi; )
926
    {
927
      size_t i = (lo + hi) / 2;
928
      const fde *f = vec->array[i];
929
      _Unwind_Ptr pc_begin, pc_range;
930
      const unsigned char *p;
931
      int encoding;
932
 
933
      encoding = get_fde_encoding (f);
934
      p = read_encoded_value_with_base (encoding,
935
					base_from_object (encoding, ob),
936
					f->pc_begin, &pc_begin);
937
      read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range);
938
 
939
      if ((_Unwind_Ptr) pc < pc_begin)
940
	hi = i;
941
      else if ((_Unwind_Ptr) pc >= pc_begin + pc_range)
942
	lo = i + 1;
943
      else
944
	return f;
945
    }
946
 
947
  return NULL;
948
}
949
 
950
static const fde *
951
search_object (struct object* ob, void *pc)
952
{
953
  /* If the data hasn't been sorted, try to do this now.  We may have
954
     more memory available than last time we tried.  */
955
  if (! ob->s.b.sorted)
956
    {
957
      init_object (ob);
958
 
959
      /* Despite the above comment, the normal reason to get here is
960
	 that we've not processed this object before.  A quick range
961
	 check is in order.  */
962
      if (pc < ob->pc_begin)
963
	return NULL;
964
    }
965
 
966
  if (ob->s.b.sorted)
967
    {
968
      if (ob->s.b.mixed_encoding)
969
	return binary_search_mixed_encoding_fdes (ob, pc);
970
      else if (ob->s.b.encoding == DW_EH_PE_absptr)
971
	return binary_search_unencoded_fdes (ob, pc);
972
      else
973
	return binary_search_single_encoding_fdes (ob, pc);
974
    }
975
  else
976
    {
977
      /* Long slow laborious linear search, cos we've no memory.  */
978
      if (ob->s.b.from_array)
979
	{
980
	  fde **p;
981
	  for (p = ob->u.array; *p ; p++)
982
	    {
983
	      const fde *f = linear_search_fdes (ob, *p, pc);
984
	      if (f)
985
		return f;
986
	    }
987
	  return NULL;
988
	}
989
      else
990
	return linear_search_fdes (ob, ob->u.single, pc);
991
    }
992
}
993
 
994
const fde *
995
_Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
996
{
997
  struct object *ob;
998
  const fde *f = NULL;
999
 
1000
  init_object_mutex_once ();
1001
  __gthread_mutex_lock (&object_mutex);
1002
 
1003
  /* Linear search through the classified objects, to find the one
1004
     containing the pc.  Note that pc_begin is sorted descending, and
1005
     we expect objects to be non-overlapping.  */
1006
  for (ob = seen_objects; ob; ob = ob->next)
1007
    if (pc >= ob->pc_begin)
1008
      {
1009
	f = search_object (ob, pc);
1010
	if (f)
1011
	  goto fini;
1012
	break;
1013
      }
1014
 
1015
  /* Classify and search the objects we've not yet processed.  */
1016
  while ((ob = unseen_objects))
1017
    {
1018
      struct object **p;
1019
 
1020
      unseen_objects = ob->next;
1021
      f = search_object (ob, pc);
1022
 
1023
      /* Insert the object into the classified list.  */
1024
      for (p = &seen_objects; *p ; p = &(*p)->next)
1025
	if ((*p)->pc_begin < ob->pc_begin)
1026
	  break;
1027
      ob->next = *p;
1028
      *p = ob;
1029
 
1030
      if (f)
1031
	goto fini;
1032
    }
1033
 
1034
 fini:
1035
  __gthread_mutex_unlock (&object_mutex);
1036
 
1037
  if (f)
1038
    {
1039
      int encoding;
1040
      _Unwind_Ptr func;
1041
 
1042
      bases->tbase = ob->tbase;
1043
      bases->dbase = ob->dbase;
1044
 
1045
      encoding = ob->s.b.encoding;
1046
      if (ob->s.b.mixed_encoding)
1047
	encoding = get_fde_encoding (f);
1048
      read_encoded_value_with_base (encoding, base_from_object (encoding, ob),
1049
				    f->pc_begin, &func);
1050
      bases->func = (void *) func;
1051
    }
1052
 
1053
  return f;
1054
}