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
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
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
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
32 #ifndef _Unwind_Find_FDE
35 #include "coretypes.h"
39 #define NO_BASE_OF_ENCODED_VALUE
40 #include "unwind-pe.h"
41 #include "unwind-dw2-fde.h"
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
;
55 static __gthread_mutex_t object_mutex
;
58 #ifdef __GTHREAD_MUTEX_INIT_FUNCTION
60 init_object_mutex (void)
62 __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex
);
66 init_object_mutex_once (void)
68 static __gthread_once_t once
= __GTHREAD_ONCE_INIT
;
69 __gthread_once (&once
, init_object_mutex
);
72 #define init_object_mutex_once()
75 /* Called from crtbegin.o to register the unwind info for an object. */
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)
85 ob
->pc_begin
= (void *)-1;
90 ob
->s
.b
.encoding
= DW_EH_PE_omit
;
91 #ifdef DWARF2_OBJECT_END_PTR_EXTENSION
95 init_object_mutex_once ();
96 __gthread_mutex_lock (&object_mutex
);
98 ob
->next
= unseen_objects
;
101 __gthread_mutex_unlock (&object_mutex
);
105 __register_frame_info (const void *begin
, struct object
*ob
)
107 __register_frame_info_bases (begin
, ob
, 0, 0);
111 __register_frame (void *begin
)
115 /* If .eh_frame is empty, don't register at all. */
116 if (*(uword
*) begin
== 0)
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
128 __register_frame_info_table_bases (void *begin
, struct object
*ob
,
129 void *tbase
, void *dbase
)
131 ob
->pc_begin
= (void *)-1;
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
;
145 __gthread_mutex_unlock (&object_mutex
);
149 __register_frame_info_table (void *begin
, struct object
*ob
)
151 __register_frame_info_table_bases (begin
, ob
, 0, 0);
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. */
174 __deregister_frame_info_bases (const void *begin
)
177 struct object
*ob
= 0;
179 /* If .eh_frame is empty, we haven't registered. */
180 if ((uword
*) begin
== 0 || *(uword
*) begin
== 0)
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
)
194 for (p
= &seen_objects
; *p
; p
= &(*p
)->next
)
195 if ((*p
)->s
.b
.sorted
)
197 if ((*p
)->u
.sort
->orig_data
== begin
)
207 if ((*p
)->u
.single
== begin
)
215 __gthread_mutex_unlock (&object_mutex
);
219 __gthread_mutex_unlock (&object_mutex
);
224 __deregister_frame_info (const void *begin
)
226 return __deregister_frame_info_bases (begin
);
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. */
242 base_from_object (unsigned char encoding
, struct object
*ob
)
244 if (encoding
== DW_EH_PE_omit
)
247 switch (encoding
& 0x70)
249 case DW_EH_PE_absptr
:
251 case DW_EH_PE_aligned
:
254 case DW_EH_PE_textrel
:
255 return (_Unwind_Ptr
) ob
->tbase
;
256 case DW_EH_PE_datarel
:
257 return (_Unwind_Ptr
) ob
->dbase
;
262 /* Return the FDE pointer encoding from the CIE. */
263 /* ??? This is a subset of extract_cie_info from unwind-dw2.c. */
266 get_cie_encoding (const struct dwarf_cie
*cie
)
268 const unsigned char *aug
, *p
;
273 aug
= cie
->augmentation
;
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. */
283 p
= read_uleb128 (p
, &utmp
);
285 aug
++; /* Skip 'z' */
286 p
= read_uleb128 (p
, &utmp
); /* Skip augmentation length. */
289 /* This is what we're looking for. */
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
298 p
= read_encoded_value_with_base (*p
& 0x7F, 0, p
+ 1, &dummy
);
301 else if (*aug
== 'L')
303 /* Otherwise end of string, or unknown augmentation. */
305 return DW_EH_PE_absptr
;
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. */
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
;
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
);
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
);
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
;
395 start_fde_sort (struct fde_accumulator
*accu
, size_t count
)
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;
414 fde_insert (struct fde_accumulator
*accu
, const fde
*this_fde
)
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. */
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
;
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
**))
447 for (i
= 0; i
< count
; i
++)
451 for (probe
= chain_end
;
452 probe
!= &marker
&& fde_compare (ob
, linear
->array
[i
], *probe
) < 0;
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
];
469 erratic
->array
[k
++] = linear
->array
[i
];
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. */
480 frame_downheap (struct object
*ob
, fde_compare_t fde_compare
, const fde
**a
,
485 for (i
= lo
, j
= 2*i
+1;
489 if (j
+1 < hi
&& fde_compare (ob
, a
[j
], a
[j
+1]) < 0)
492 if (fde_compare (ob
, a
[i
], a
[j
]) < 0)
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. */
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.,
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
;
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
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
)
531 frame_downheap (ob
, fde_compare
, a
, 0, m
);
536 /* Merge V1 and V2, both sorted, and put the result into V1. */
538 fde_merge (struct object
*ob
, fde_compare_t fde_compare
,
539 struct fde_vector
*v1
, struct fde_vector
*v2
)
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];
557 v1
->array
[i1
+i2
] = fde2
;
560 v1
->count
+= v2
->count
;
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
)
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
;
577 fde_compare
= fde_single_encoding_compare
;
581 fde_split (ob
, fde_compare
, accu
->linear
, accu
->erratic
);
582 if (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
);
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. */
602 classify_object_over_fdes (struct object
*ob
, const fde
*this_fde
)
604 const struct dwarf_cie
*last_cie
= 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
;
615 if (this_fde
->CIE_delta
== 0)
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
)
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
,
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;
645 if ((pc_begin
& mask
) == 0)
649 if ((void *) pc_begin
< ob
->pc_begin
)
650 ob
->pc_begin
= (void *) pc_begin
;
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
;
668 if (this_fde
->CIE_delta
== 0)
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
)
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)
691 _Unwind_Ptr pc_begin
, mask
;
693 read_encoded_value_with_base (encoding
, base
, this_fde
->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;
706 if ((pc_begin
& mask
) == 0)
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. */
720 init_object (struct object
* ob
)
722 struct fde_accumulator accu
;
725 count
= ob
->s
.b
.count
;
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
);
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
)
747 if (!start_fde_sort (&accu
, count
))
750 if (ob
->s
.b
.from_array
)
753 for (p
= ob
->u
.array
; *p
; ++p
)
754 add_fdes (ob
, &accu
, *p
);
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
;
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
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
;
786 if (this_fde
->CIE_delta
== 0)
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
)
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];
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;
828 if ((pc_begin
& mask
) == 0)
832 if ((_Unwind_Ptr
) pc
- pc_begin
< pc_range
)
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
;
848 for (lo
= 0, hi
= vec
->count
; lo
< hi
; )
850 size_t i
= (lo
+ hi
) / 2;
851 const fde
*f
= vec
->array
[i
];
855 pc_begin
= ((void **) f
->pc_begin
)[0];
856 pc_range
= ((uaddr
*) f
->pc_begin
)[1];
860 else if (pc
>= pc_begin
+ pc_range
)
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
);
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
,
886 read_encoded_value_with_base (encoding
& 0x0F, 0, p
, &pc_range
);
888 if ((_Unwind_Ptr
) pc
< pc_begin
)
890 else if ((_Unwind_Ptr
) pc
>= pc_begin
+ pc_range
)
899 static inline const fde
*
900 binary_search_mixed_encoding_fdes (struct object
*ob
, void *pc
)
902 struct fde_vector
*vec
= ob
->u
.sort
;
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
;
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
)
921 else if ((_Unwind_Ptr
) pc
>= pc_begin
+ pc_range
)
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
)
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
)
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
);
953 return binary_search_single_encoding_fdes (ob
, pc
);
957 /* Long slow labourious linear search, cos we've no memory. */
958 if (ob
->s
.b
.from_array
)
961 for (p
= ob
->u
.array
; *p
; p
++)
963 const fde
*f
= linear_search_fdes (ob
, *p
, pc
);
970 return linear_search_fdes (ob
, ob
->u
.single
, pc
);
975 _Unwind_Find_FDE (void *pc
, struct dwarf_eh_bases
*bases
)
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
);
995 /* Classify and search the objects we've not yet processed. */
996 while ((ob
= unseen_objects
))
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
)
1015 __gthread_mutex_unlock (&object_mutex
);
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
);