Merge from mainline (gomp-merge-2005-02-26).
[official-gcc.git] / gcc / unwind-dw2-fde.c
blobab1f7bc571e35ccb00275aaf0ba89abc805fbbad
1 /* Subroutines needed for unwinding stack frames for exception handling. */
2 /* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Contributed by Jason Merrill <jason@cygnus.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 In addition to the permissions in the GNU General Public License, the
14 Free Software Foundation gives you unlimited permission to link the
15 compiled version of this file into combinations with other programs,
16 and to distribute those combinations without any restriction coming
17 from the use of this file. (The General Public License restrictions
18 do apply in other respects; for example, they cover modification of
19 the file, and distribution when not linked into a combine
20 executable.)
22 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
23 WARRANTY; without even the implied warranty of MERCHANTABILITY or
24 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 for more details.
27 You should have received a copy of the GNU General Public License
28 along with GCC; see the file COPYING. If not, write to the Free
29 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
30 02111-1307, USA. */
32 #ifndef _Unwind_Find_FDE
33 #include "tconfig.h"
34 #include "tsystem.h"
35 #include "coretypes.h"
36 #include "tm.h"
37 #include "dwarf2.h"
38 #include "unwind.h"
39 #define NO_BASE_OF_ENCODED_VALUE
40 #include "unwind-pe.h"
41 #include "unwind-dw2-fde.h"
42 #include "gthr.h"
43 #endif
45 /* The unseen_objects list contains objects that have been registered
46 but not yet categorized in any way. The seen_objects list has had
47 it's pc_begin and count fields initialized at minimum, and is sorted
48 by decreasing value of pc_begin. */
49 static struct object *unseen_objects;
50 static struct object *seen_objects;
52 #ifdef __GTHREAD_MUTEX_INIT
53 static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT;
54 #else
55 static __gthread_mutex_t object_mutex;
56 #endif
58 #ifdef __GTHREAD_MUTEX_INIT_FUNCTION
59 static void
60 init_object_mutex (void)
62 __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex);
65 static void
66 init_object_mutex_once (void)
68 static __gthread_once_t once = __GTHREAD_ONCE_INIT;
69 __gthread_once (&once, init_object_mutex);
71 #else
72 #define init_object_mutex_once()
73 #endif
75 /* Called from crtbegin.o to register the unwind info for an object. */
77 void
78 __register_frame_info_bases (const void *begin, struct object *ob,
79 void *tbase, void *dbase)
81 /* If .eh_frame is empty, don't register at all. */
82 if ((uword *) begin == 0 || *(uword *) begin == 0)
83 return;
85 ob->pc_begin = (void *)-1;
86 ob->tbase = tbase;
87 ob->dbase = dbase;
88 ob->u.single = begin;
89 ob->s.i = 0;
90 ob->s.b.encoding = DW_EH_PE_omit;
91 #ifdef DWARF2_OBJECT_END_PTR_EXTENSION
92 ob->fde_end = NULL;
93 #endif
95 init_object_mutex_once ();
96 __gthread_mutex_lock (&object_mutex);
98 ob->next = unseen_objects;
99 unseen_objects = ob;
101 __gthread_mutex_unlock (&object_mutex);
104 void
105 __register_frame_info (const void *begin, struct object *ob)
107 __register_frame_info_bases (begin, ob, 0, 0);
110 void
111 __register_frame (void *begin)
113 struct object *ob;
115 /* If .eh_frame is empty, don't register at all. */
116 if (*(uword *) begin == 0)
117 return;
119 ob = malloc (sizeof (struct object));
120 __register_frame_info (begin, ob);
123 /* Similar, but BEGIN is actually a pointer to a table of unwind entries
124 for different translation units. Called from the file generated by
125 collect2. */
127 void
128 __register_frame_info_table_bases (void *begin, struct object *ob,
129 void *tbase, void *dbase)
131 ob->pc_begin = (void *)-1;
132 ob->tbase = tbase;
133 ob->dbase = dbase;
134 ob->u.array = begin;
135 ob->s.i = 0;
136 ob->s.b.from_array = 1;
137 ob->s.b.encoding = DW_EH_PE_omit;
139 init_object_mutex_once ();
140 __gthread_mutex_lock (&object_mutex);
142 ob->next = unseen_objects;
143 unseen_objects = ob;
145 __gthread_mutex_unlock (&object_mutex);
148 void
149 __register_frame_info_table (void *begin, struct object *ob)
151 __register_frame_info_table_bases (begin, ob, 0, 0);
154 void
155 __register_frame_table (void *begin)
157 struct object *ob = malloc (sizeof (struct object));
158 __register_frame_info_table (begin, ob);
161 /* Called from crtbegin.o to deregister the unwind info for an object. */
162 /* ??? Glibc has for a while now exported __register_frame_info and
163 __deregister_frame_info. If we call __register_frame_info_bases
164 from crtbegin (wherein it is declared weak), and this object does
165 not get pulled from libgcc.a for other reasons, then the
166 invocation of __deregister_frame_info will be resolved from glibc.
167 Since the registration did not happen there, we'll abort.
169 Therefore, declare a new deregistration entry point that does the
170 exact same thing, but will resolve to the same library as
171 implements __register_frame_info_bases. */
173 void *
174 __deregister_frame_info_bases (const void *begin)
176 struct object **p;
177 struct object *ob = 0;
179 /* If .eh_frame is empty, we haven't registered. */
180 if ((uword *) begin == 0 || *(uword *) begin == 0)
181 return ob;
183 init_object_mutex_once ();
184 __gthread_mutex_lock (&object_mutex);
186 for (p = &unseen_objects; *p ; p = &(*p)->next)
187 if ((*p)->u.single == begin)
189 ob = *p;
190 *p = ob->next;
191 goto out;
194 for (p = &seen_objects; *p ; p = &(*p)->next)
195 if ((*p)->s.b.sorted)
197 if ((*p)->u.sort->orig_data == begin)
199 ob = *p;
200 *p = ob->next;
201 free (ob->u.sort);
202 goto out;
205 else
207 if ((*p)->u.single == begin)
209 ob = *p;
210 *p = ob->next;
211 goto out;
215 __gthread_mutex_unlock (&object_mutex);
216 abort ();
218 out:
219 __gthread_mutex_unlock (&object_mutex);
220 return (void *) ob;
223 void *
224 __deregister_frame_info (const void *begin)
226 return __deregister_frame_info_bases (begin);
229 void
230 __deregister_frame (void *begin)
232 /* If .eh_frame is empty, we haven't registered. */
233 if (*(uword *) begin != 0)
234 free (__deregister_frame_info (begin));
238 /* Like base_of_encoded_value, but take the base from a struct object
239 instead of an _Unwind_Context. */
241 static _Unwind_Ptr
242 base_from_object (unsigned char encoding, struct object *ob)
244 if (encoding == DW_EH_PE_omit)
245 return 0;
247 switch (encoding & 0x70)
249 case DW_EH_PE_absptr:
250 case DW_EH_PE_pcrel:
251 case DW_EH_PE_aligned:
252 return 0;
254 case DW_EH_PE_textrel:
255 return (_Unwind_Ptr) ob->tbase;
256 case DW_EH_PE_datarel:
257 return (_Unwind_Ptr) ob->dbase;
259 abort ();
262 /* Return the FDE pointer encoding from the CIE. */
263 /* ??? This is a subset of extract_cie_info from unwind-dw2.c. */
265 static int
266 get_cie_encoding (const struct dwarf_cie *cie)
268 const unsigned char *aug, *p;
269 _Unwind_Ptr dummy;
270 _Unwind_Word utmp;
271 _Unwind_Sword stmp;
273 aug = cie->augmentation;
274 if (aug[0] != 'z')
275 return DW_EH_PE_absptr;
277 p = aug + strlen ((const char *)aug) + 1; /* Skip the augmentation string. */
278 p = read_uleb128 (p, &utmp); /* Skip code alignment. */
279 p = read_sleb128 (p, &stmp); /* Skip data alignment. */
280 if (cie->version == 1) /* Skip return address column. */
281 p++;
282 else
283 p = read_uleb128 (p, &utmp);
285 aug++; /* Skip 'z' */
286 p = read_uleb128 (p, &utmp); /* Skip augmentation length. */
287 while (1)
289 /* This is what we're looking for. */
290 if (*aug == 'R')
291 return *p;
292 /* Personality encoding and pointer. */
293 else if (*aug == 'P')
295 /* ??? Avoid dereferencing indirect pointers, since we're
296 faking the base address. Gotta keep DW_EH_PE_aligned
297 intact, however. */
298 p = read_encoded_value_with_base (*p & 0x7F, 0, p + 1, &dummy);
300 /* LSDA encoding. */
301 else if (*aug == 'L')
302 p++;
303 /* Otherwise end of string, or unknown augmentation. */
304 else
305 return DW_EH_PE_absptr;
306 aug++;
310 static inline int
311 get_fde_encoding (const struct dwarf_fde *f)
313 return get_cie_encoding (get_cie (f));
317 /* Sorting an array of FDEs by address.
318 (Ideally we would have the linker sort the FDEs so we don't have to do
319 it at run time. But the linkers are not yet prepared for this.) */
321 /* Comparison routines. Three variants of increasing complexity. */
323 static int
324 fde_unencoded_compare (struct object *ob __attribute__((unused)),
325 const fde *x, const fde *y)
327 _Unwind_Ptr x_ptr = *(_Unwind_Ptr *) x->pc_begin;
328 _Unwind_Ptr y_ptr = *(_Unwind_Ptr *) y->pc_begin;
330 if (x_ptr > y_ptr)
331 return 1;
332 if (x_ptr < y_ptr)
333 return -1;
334 return 0;
337 static int
338 fde_single_encoding_compare (struct object *ob, const fde *x, const fde *y)
340 _Unwind_Ptr base, x_ptr, y_ptr;
342 base = base_from_object (ob->s.b.encoding, ob);
343 read_encoded_value_with_base (ob->s.b.encoding, base, x->pc_begin, &x_ptr);
344 read_encoded_value_with_base (ob->s.b.encoding, base, y->pc_begin, &y_ptr);
346 if (x_ptr > y_ptr)
347 return 1;
348 if (x_ptr < y_ptr)
349 return -1;
350 return 0;
353 static int
354 fde_mixed_encoding_compare (struct object *ob, const fde *x, const fde *y)
356 int x_encoding, y_encoding;
357 _Unwind_Ptr x_ptr, y_ptr;
359 x_encoding = get_fde_encoding (x);
360 read_encoded_value_with_base (x_encoding, base_from_object (x_encoding, ob),
361 x->pc_begin, &x_ptr);
363 y_encoding = get_fde_encoding (y);
364 read_encoded_value_with_base (y_encoding, base_from_object (y_encoding, ob),
365 y->pc_begin, &y_ptr);
367 if (x_ptr > y_ptr)
368 return 1;
369 if (x_ptr < y_ptr)
370 return -1;
371 return 0;
374 typedef int (*fde_compare_t) (struct object *, const fde *, const fde *);
377 /* This is a special mix of insertion sort and heap sort, optimized for
378 the data sets that actually occur. They look like
379 101 102 103 127 128 105 108 110 190 111 115 119 125 160 126 129 130.
380 I.e. a linearly increasing sequence (coming from functions in the text
381 section), with additionally a few unordered elements (coming from functions
382 in gnu_linkonce sections) whose values are higher than the values in the
383 surrounding linear sequence (but not necessarily higher than the values
384 at the end of the linear sequence!).
385 The worst-case total run time is O(N) + O(n log (n)), where N is the
386 total number of FDEs and n is the number of erratic ones. */
388 struct fde_accumulator
390 struct fde_vector *linear;
391 struct fde_vector *erratic;
394 static inline int
395 start_fde_sort (struct fde_accumulator *accu, size_t count)
397 size_t size;
398 if (! count)
399 return 0;
401 size = sizeof (struct fde_vector) + sizeof (const fde *) * count;
402 if ((accu->linear = malloc (size)))
404 accu->linear->count = 0;
405 if ((accu->erratic = malloc (size)))
406 accu->erratic->count = 0;
407 return 1;
409 else
410 return 0;
413 static inline void
414 fde_insert (struct fde_accumulator *accu, const fde *this_fde)
416 if (accu->linear)
417 accu->linear->array[accu->linear->count++] = this_fde;
420 /* Split LINEAR into a linear sequence with low values and an erratic
421 sequence with high values, put the linear one (of longest possible
422 length) into LINEAR and the erratic one into ERRATIC. This is O(N).
424 Because the longest linear sequence we are trying to locate within the
425 incoming LINEAR array can be interspersed with (high valued) erratic
426 entries. We construct a chain indicating the sequenced entries.
427 To avoid having to allocate this chain, we overlay it onto the space of
428 the ERRATIC array during construction. A final pass iterates over the
429 chain to determine what should be placed in the ERRATIC array, and
430 what is the linear sequence. This overlay is safe from aliasing. */
432 static inline void
433 fde_split (struct object *ob, fde_compare_t fde_compare,
434 struct fde_vector *linear, struct fde_vector *erratic)
436 static const fde *marker;
437 size_t count = linear->count;
438 const fde **chain_end = &marker;
439 size_t i, j, k;
441 /* This should optimize out, but it is wise to make sure this assumption
442 is correct. Should these have different sizes, we cannot cast between
443 them and the overlaying onto ERRATIC will not work. */
444 if (sizeof (const fde *) != sizeof (const fde **))
445 abort ();
447 for (i = 0; i < count; i++)
449 const fde **probe;
451 for (probe = chain_end;
452 probe != &marker && fde_compare (ob, linear->array[i], *probe) < 0;
453 probe = chain_end)
455 chain_end = (const fde **) erratic->array[probe - linear->array];
456 erratic->array[probe - linear->array] = NULL;
458 erratic->array[i] = (const fde *) chain_end;
459 chain_end = &linear->array[i];
462 /* Each entry in LINEAR which is part of the linear sequence we have
463 discovered will correspond to a non-NULL entry in the chain we built in
464 the ERRATIC array. */
465 for (i = j = k = 0; i < count; i++)
466 if (erratic->array[i])
467 linear->array[j++] = linear->array[i];
468 else
469 erratic->array[k++] = linear->array[i];
470 linear->count = j;
471 erratic->count = k;
474 #define SWAP(x,y) do { const fde * tmp = x; x = y; y = tmp; } while (0)
476 /* Convert a semi-heap to a heap. A semi-heap is a heap except possibly
477 for the first (root) node; push it down to its rightful place. */
479 static void
480 frame_downheap (struct object *ob, fde_compare_t fde_compare, const fde **a,
481 int lo, int hi)
483 int i, j;
485 for (i = lo, j = 2*i+1;
486 j < hi;
487 j = 2*i+1)
489 if (j+1 < hi && fde_compare (ob, a[j], a[j+1]) < 0)
490 ++j;
492 if (fde_compare (ob, a[i], a[j]) < 0)
494 SWAP (a[i], a[j]);
495 i = j;
497 else
498 break;
502 /* This is O(n log(n)). BSD/OS defines heapsort in stdlib.h, so we must
503 use a name that does not conflict. */
505 static void
506 frame_heapsort (struct object *ob, fde_compare_t fde_compare,
507 struct fde_vector *erratic)
509 /* For a description of this algorithm, see:
510 Samuel P. Harbison, Guy L. Steele Jr.: C, a reference manual, 2nd ed.,
511 p. 60-61. */
512 const fde ** a = erratic->array;
513 /* A portion of the array is called a "heap" if for all i>=0:
514 If i and 2i+1 are valid indices, then a[i] >= a[2i+1].
515 If i and 2i+2 are valid indices, then a[i] >= a[2i+2]. */
516 size_t n = erratic->count;
517 int m;
519 /* Expand our heap incrementally from the end of the array, heapifying
520 each resulting semi-heap as we go. After each step, a[m] is the top
521 of a heap. */
522 for (m = n/2-1; m >= 0; --m)
523 frame_downheap (ob, fde_compare, a, m, n);
525 /* Shrink our heap incrementally from the end of the array, first
526 swapping out the largest element a[0] and then re-heapifying the
527 resulting semi-heap. After each step, a[0..m) is a heap. */
528 for (m = n-1; m >= 1; --m)
530 SWAP (a[0], a[m]);
531 frame_downheap (ob, fde_compare, a, 0, m);
533 #undef SWAP
536 /* Merge V1 and V2, both sorted, and put the result into V1. */
537 static inline void
538 fde_merge (struct object *ob, fde_compare_t fde_compare,
539 struct fde_vector *v1, struct fde_vector *v2)
541 size_t i1, i2;
542 const fde * fde2;
544 i2 = v2->count;
545 if (i2 > 0)
547 i1 = v1->count;
550 i2--;
551 fde2 = v2->array[i2];
552 while (i1 > 0 && fde_compare (ob, v1->array[i1-1], fde2) > 0)
554 v1->array[i1+i2] = v1->array[i1-1];
555 i1--;
557 v1->array[i1+i2] = fde2;
559 while (i2 > 0);
560 v1->count += v2->count;
564 static inline void
565 end_fde_sort (struct object *ob, struct fde_accumulator *accu, size_t count)
567 fde_compare_t fde_compare;
569 if (accu->linear && accu->linear->count != count)
570 abort ();
572 if (ob->s.b.mixed_encoding)
573 fde_compare = fde_mixed_encoding_compare;
574 else if (ob->s.b.encoding == DW_EH_PE_absptr)
575 fde_compare = fde_unencoded_compare;
576 else
577 fde_compare = fde_single_encoding_compare;
579 if (accu->erratic)
581 fde_split (ob, fde_compare, accu->linear, accu->erratic);
582 if (accu->linear->count + accu->erratic->count != count)
583 abort ();
584 frame_heapsort (ob, fde_compare, accu->erratic);
585 fde_merge (ob, fde_compare, accu->linear, accu->erratic);
586 free (accu->erratic);
588 else
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);
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. */
601 static size_t
602 classify_object_over_fdes (struct object *ob, const fde *this_fde)
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;
609 for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
611 const struct dwarf_cie *this_cie;
612 _Unwind_Ptr mask, pc_begin;
614 /* Skip CIEs. */
615 if (this_fde->CIE_delta == 0)
616 continue;
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)
623 last_cie = this_cie;
624 encoding = get_cie_encoding (this_cie);
625 base = base_from_object (encoding, ob);
626 if (ob->s.b.encoding == DW_EH_PE_omit)
627 ob->s.b.encoding = encoding;
628 else if (ob->s.b.encoding != encoding)
629 ob->s.b.mixed_encoding = 1;
632 read_encoded_value_with_base (encoding, base, this_fde->pc_begin,
633 &pc_begin);
635 /* Take care to ignore link-once functions that were removed.
636 In these cases, the function address will be NULL, but if
637 the encoding is smaller than a pointer a true NULL may not
638 be representable. Assume 0 in the representable bits is NULL. */
639 mask = size_of_encoded_value (encoding);
640 if (mask < sizeof (void *))
641 mask = (1L << (mask << 3)) - 1;
642 else
643 mask = -1;
645 if ((pc_begin & mask) == 0)
646 continue;
648 count += 1;
649 if ((void *) pc_begin < ob->pc_begin)
650 ob->pc_begin = (void *) pc_begin;
653 return count;
656 static void
657 add_fdes (struct object *ob, struct fde_accumulator *accu, const fde *this_fde)
659 const struct dwarf_cie *last_cie = 0;
660 int encoding = ob->s.b.encoding;
661 _Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob);
663 for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
665 const struct dwarf_cie *this_cie;
667 /* Skip CIEs. */
668 if (this_fde->CIE_delta == 0)
669 continue;
671 if (ob->s.b.mixed_encoding)
673 /* Determine the encoding for this FDE. Note mixed encoded
674 objects for later. */
675 this_cie = get_cie (this_fde);
676 if (this_cie != last_cie)
678 last_cie = this_cie;
679 encoding = get_cie_encoding (this_cie);
680 base = base_from_object (encoding, ob);
684 if (encoding == DW_EH_PE_absptr)
686 if (*(_Unwind_Ptr *) this_fde->pc_begin == 0)
687 continue;
689 else
691 _Unwind_Ptr pc_begin, mask;
693 read_encoded_value_with_base (encoding, base, this_fde->pc_begin,
694 &pc_begin);
696 /* Take care to ignore link-once functions that were removed.
697 In these cases, the function address will be NULL, but if
698 the encoding is smaller than a pointer a true NULL may not
699 be representable. Assume 0 in the representable bits is NULL. */
700 mask = size_of_encoded_value (encoding);
701 if (mask < sizeof (void *))
702 mask = (1L << (mask << 3)) - 1;
703 else
704 mask = -1;
706 if ((pc_begin & mask) == 0)
707 continue;
710 fde_insert (accu, this_fde);
714 /* Set up a sorted array of pointers to FDEs for a loaded object. We
715 count up the entries before allocating the array because it's likely to
716 be faster. We can be called multiple times, should we have failed to
717 allocate a sorted fde array on a previous occasion. */
719 static inline void
720 init_object (struct object* ob)
722 struct fde_accumulator accu;
723 size_t count;
725 count = ob->s.b.count;
726 if (count == 0)
728 if (ob->s.b.from_array)
730 fde **p = ob->u.array;
731 for (count = 0; *p; ++p)
732 count += classify_object_over_fdes (ob, *p);
734 else
735 count = classify_object_over_fdes (ob, ob->u.single);
737 /* The count field we have in the main struct object is somewhat
738 limited, but should suffice for virtually all cases. If the
739 counted value doesn't fit, re-write a zero. The worst that
740 happens is that we re-count next time -- admittedly non-trivial
741 in that this implies some 2M fdes, but at least we function. */
742 ob->s.b.count = count;
743 if (ob->s.b.count != count)
744 ob->s.b.count = 0;
747 if (!start_fde_sort (&accu, count))
748 return;
750 if (ob->s.b.from_array)
752 fde **p;
753 for (p = ob->u.array; *p; ++p)
754 add_fdes (ob, &accu, *p);
756 else
757 add_fdes (ob, &accu, ob->u.single);
759 end_fde_sort (ob, &accu, count);
761 /* Save the original fde pointer, since this is the key by which the
762 DSO will deregister the object. */
763 accu.linear->orig_data = ob->u.single;
764 ob->u.sort = accu.linear;
766 ob->s.b.sorted = 1;
769 /* A linear search through a set of FDEs for the given PC. This is
770 used when there was insufficient memory to allocate and sort an
771 array. */
773 static const fde *
774 linear_search_fdes (struct object *ob, const fde *this_fde, void *pc)
776 const struct dwarf_cie *last_cie = 0;
777 int encoding = ob->s.b.encoding;
778 _Unwind_Ptr base = base_from_object (ob->s.b.encoding, ob);
780 for (; ! last_fde (ob, this_fde); this_fde = next_fde (this_fde))
782 const struct dwarf_cie *this_cie;
783 _Unwind_Ptr pc_begin, pc_range;
785 /* Skip CIEs. */
786 if (this_fde->CIE_delta == 0)
787 continue;
789 if (ob->s.b.mixed_encoding)
791 /* Determine the encoding for this FDE. Note mixed encoded
792 objects for later. */
793 this_cie = get_cie (this_fde);
794 if (this_cie != last_cie)
796 last_cie = this_cie;
797 encoding = get_cie_encoding (this_cie);
798 base = base_from_object (encoding, ob);
802 if (encoding == DW_EH_PE_absptr)
804 pc_begin = ((_Unwind_Ptr *) this_fde->pc_begin)[0];
805 pc_range = ((_Unwind_Ptr *) this_fde->pc_begin)[1];
806 if (pc_begin == 0)
807 continue;
809 else
811 _Unwind_Ptr mask;
812 const unsigned char *p;
814 p = read_encoded_value_with_base (encoding, base,
815 this_fde->pc_begin, &pc_begin);
816 read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range);
818 /* Take care to ignore link-once functions that were removed.
819 In these cases, the function address will be NULL, but if
820 the encoding is smaller than a pointer a true NULL may not
821 be representable. Assume 0 in the representable bits is NULL. */
822 mask = size_of_encoded_value (encoding);
823 if (mask < sizeof (void *))
824 mask = (1L << (mask << 3)) - 1;
825 else
826 mask = -1;
828 if ((pc_begin & mask) == 0)
829 continue;
832 if ((_Unwind_Ptr) pc - pc_begin < pc_range)
833 return this_fde;
836 return NULL;
839 /* Binary search for an FDE containing the given PC. Here are three
840 implementations of increasing complexity. */
842 static inline const fde *
843 binary_search_unencoded_fdes (struct object *ob, void *pc)
845 struct fde_vector *vec = ob->u.sort;
846 size_t lo, hi;
848 for (lo = 0, hi = vec->count; lo < hi; )
850 size_t i = (lo + hi) / 2;
851 const fde *f = vec->array[i];
852 void *pc_begin;
853 uaddr pc_range;
855 pc_begin = ((void **) f->pc_begin)[0];
856 pc_range = ((uaddr *) f->pc_begin)[1];
858 if (pc < pc_begin)
859 hi = i;
860 else if (pc >= pc_begin + pc_range)
861 lo = i + 1;
862 else
863 return f;
866 return NULL;
869 static inline const fde *
870 binary_search_single_encoding_fdes (struct object *ob, void *pc)
872 struct fde_vector *vec = ob->u.sort;
873 int encoding = ob->s.b.encoding;
874 _Unwind_Ptr base = base_from_object (encoding, ob);
875 size_t lo, hi;
877 for (lo = 0, hi = vec->count; lo < hi; )
879 size_t i = (lo + hi) / 2;
880 const fde *f = vec->array[i];
881 _Unwind_Ptr pc_begin, pc_range;
882 const unsigned char *p;
884 p = read_encoded_value_with_base (encoding, base, f->pc_begin,
885 &pc_begin);
886 read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range);
888 if ((_Unwind_Ptr) pc < pc_begin)
889 hi = i;
890 else if ((_Unwind_Ptr) pc >= pc_begin + pc_range)
891 lo = i + 1;
892 else
893 return f;
896 return NULL;
899 static inline const fde *
900 binary_search_mixed_encoding_fdes (struct object *ob, void *pc)
902 struct fde_vector *vec = ob->u.sort;
903 size_t lo, hi;
905 for (lo = 0, hi = vec->count; lo < hi; )
907 size_t i = (lo + hi) / 2;
908 const fde *f = vec->array[i];
909 _Unwind_Ptr pc_begin, pc_range;
910 const unsigned char *p;
911 int encoding;
913 encoding = get_fde_encoding (f);
914 p = read_encoded_value_with_base (encoding,
915 base_from_object (encoding, ob),
916 f->pc_begin, &pc_begin);
917 read_encoded_value_with_base (encoding & 0x0F, 0, p, &pc_range);
919 if ((_Unwind_Ptr) pc < pc_begin)
920 hi = i;
921 else if ((_Unwind_Ptr) pc >= pc_begin + pc_range)
922 lo = i + 1;
923 else
924 return f;
927 return NULL;
930 static const fde *
931 search_object (struct object* ob, void *pc)
933 /* If the data hasn't been sorted, try to do this now. We may have
934 more memory available than last time we tried. */
935 if (! ob->s.b.sorted)
937 init_object (ob);
939 /* Despite the above comment, the normal reason to get here is
940 that we've not processed this object before. A quick range
941 check is in order. */
942 if (pc < ob->pc_begin)
943 return NULL;
946 if (ob->s.b.sorted)
948 if (ob->s.b.mixed_encoding)
949 return binary_search_mixed_encoding_fdes (ob, pc);
950 else if (ob->s.b.encoding == DW_EH_PE_absptr)
951 return binary_search_unencoded_fdes (ob, pc);
952 else
953 return binary_search_single_encoding_fdes (ob, pc);
955 else
957 /* Long slow labourious linear search, cos we've no memory. */
958 if (ob->s.b.from_array)
960 fde **p;
961 for (p = ob->u.array; *p ; p++)
963 const fde *f = linear_search_fdes (ob, *p, pc);
964 if (f)
965 return f;
967 return NULL;
969 else
970 return linear_search_fdes (ob, ob->u.single, pc);
974 const fde *
975 _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
977 struct object *ob;
978 const fde *f = NULL;
980 init_object_mutex_once ();
981 __gthread_mutex_lock (&object_mutex);
983 /* Linear search through the classified objects, to find the one
984 containing the pc. Note that pc_begin is sorted descending, and
985 we expect objects to be non-overlapping. */
986 for (ob = seen_objects; ob; ob = ob->next)
987 if (pc >= ob->pc_begin)
989 f = search_object (ob, pc);
990 if (f)
991 goto fini;
992 break;
995 /* Classify and search the objects we've not yet processed. */
996 while ((ob = unseen_objects))
998 struct object **p;
1000 unseen_objects = ob->next;
1001 f = search_object (ob, pc);
1003 /* Insert the object into the classified list. */
1004 for (p = &seen_objects; *p ; p = &(*p)->next)
1005 if ((*p)->pc_begin < ob->pc_begin)
1006 break;
1007 ob->next = *p;
1008 *p = ob;
1010 if (f)
1011 goto fini;
1014 fini:
1015 __gthread_mutex_unlock (&object_mutex);
1017 if (f)
1019 int encoding;
1021 bases->tbase = ob->tbase;
1022 bases->dbase = ob->dbase;
1024 encoding = ob->s.b.encoding;
1025 if (ob->s.b.mixed_encoding)
1026 encoding = get_fde_encoding (f);
1027 read_encoded_value_with_base (encoding, base_from_object (encoding, ob),
1028 f->pc_begin, (_Unwind_Ptr *)&bases->func);
1031 return f;