1 /* Subroutines needed for unwinding stack frames for exception handling. */
2 /* Copyright (C) 1997-2013 Free Software Foundation, Inc.
3 Contributed by Jason Merrill <jason@cygnus.com>.
5 This file is part of GCC.
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
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
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.
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 <http://www.gnu.org/licenses/>. */
26 #ifndef _Unwind_Find_FDE
29 #include "coretypes.h"
31 #include "libgcc_tm.h"
34 #define NO_BASE_OF_ENCODED_VALUE
35 #include "unwind-pe.h"
36 #include "unwind-dw2-fde.h"
40 /* The unseen_objects list contains objects that have been registered
41 but not yet categorized in any way. The seen_objects list has had
42 its pc_begin and count fields initialized at minimum, and is sorted
43 by decreasing value of pc_begin. */
44 static struct object
*unseen_objects
;
45 static struct object
*seen_objects
;
47 #ifdef __GTHREAD_MUTEX_INIT
48 static __gthread_mutex_t object_mutex
= __GTHREAD_MUTEX_INIT
;
49 #define init_object_mutex_once()
51 #ifdef __GTHREAD_MUTEX_INIT_FUNCTION
52 static __gthread_mutex_t object_mutex
;
55 init_object_mutex (void)
57 __GTHREAD_MUTEX_INIT_FUNCTION (&object_mutex
);
61 init_object_mutex_once (void)
63 static __gthread_once_t once
= __GTHREAD_ONCE_INIT
;
64 __gthread_once (&once
, init_object_mutex
);
67 /* ??? Several targets include this file with stubbing parts of gthr.h
68 and expect no locking to be done. */
69 #define init_object_mutex_once()
70 static __gthread_mutex_t object_mutex
;
74 /* Called from crtbegin.o to register the unwind info for an object. */
77 __register_frame_info_bases (const void *begin
, struct object
*ob
,
78 void *tbase
, void *dbase
)
80 /* If .eh_frame is empty, don't register at all. */
81 if ((const uword
*) begin
== 0 || *(const uword
*) begin
== 0)
84 ob
->pc_begin
= (void *)-1;
89 ob
->s
.b
.encoding
= DW_EH_PE_omit
;
90 #ifdef DWARF2_OBJECT_END_PTR_EXTENSION
94 init_object_mutex_once ();
95 __gthread_mutex_lock (&object_mutex
);
97 ob
->next
= unseen_objects
;
100 __gthread_mutex_unlock (&object_mutex
);
104 __register_frame_info (const void *begin
, struct object
*ob
)
106 __register_frame_info_bases (begin
, ob
, 0, 0);
110 __register_frame (void *begin
)
114 /* If .eh_frame is empty, don't register at all. */
115 if (*(uword
*) begin
== 0)
118 ob
= malloc (sizeof (struct object
));
119 __register_frame_info (begin
, ob
);
122 /* Similar, but BEGIN is actually a pointer to a table of unwind entries
123 for different translation units. Called from the file generated by
127 __register_frame_info_table_bases (void *begin
, struct object
*ob
,
128 void *tbase
, void *dbase
)
130 ob
->pc_begin
= (void *)-1;
135 ob
->s
.b
.from_array
= 1;
136 ob
->s
.b
.encoding
= DW_EH_PE_omit
;
138 init_object_mutex_once ();
139 __gthread_mutex_lock (&object_mutex
);
141 ob
->next
= unseen_objects
;
144 __gthread_mutex_unlock (&object_mutex
);
148 __register_frame_info_table (void *begin
, struct object
*ob
)
150 __register_frame_info_table_bases (begin
, ob
, 0, 0);
154 __register_frame_table (void *begin
)
156 struct object
*ob
= malloc (sizeof (struct object
));
157 __register_frame_info_table (begin
, ob
);
160 /* Called from crtbegin.o to deregister the unwind info for an object. */
161 /* ??? Glibc has for a while now exported __register_frame_info and
162 __deregister_frame_info. If we call __register_frame_info_bases
163 from crtbegin (wherein it is declared weak), and this object does
164 not get pulled from libgcc.a for other reasons, then the
165 invocation of __deregister_frame_info will be resolved from glibc.
166 Since the registration did not happen there, we'll die.
168 Therefore, declare a new deregistration entry point that does the
169 exact same thing, but will resolve to the same library as
170 implements __register_frame_info_bases. */
173 __deregister_frame_info_bases (const void *begin
)
176 struct object
*ob
= 0;
178 /* If .eh_frame is empty, we haven't registered. */
179 if ((const uword
*) begin
== 0 || *(const uword
*) begin
== 0)
182 init_object_mutex_once ();
183 __gthread_mutex_lock (&object_mutex
);
185 for (p
= &unseen_objects
; *p
; p
= &(*p
)->next
)
186 if ((*p
)->u
.single
== begin
)
193 for (p
= &seen_objects
; *p
; p
= &(*p
)->next
)
194 if ((*p
)->s
.b
.sorted
)
196 if ((*p
)->u
.sort
->orig_data
== begin
)
206 if ((*p
)->u
.single
== begin
)
215 __gthread_mutex_unlock (&object_mutex
);
221 __deregister_frame_info (const void *begin
)
223 return __deregister_frame_info_bases (begin
);
227 __deregister_frame (void *begin
)
229 /* If .eh_frame is empty, we haven't registered. */
230 if (*(uword
*) begin
!= 0)
231 free (__deregister_frame_info (begin
));
235 /* Like base_of_encoded_value, but take the base from a struct object
236 instead of an _Unwind_Context. */
239 base_from_object (unsigned char encoding
, struct object
*ob
)
241 if (encoding
== DW_EH_PE_omit
)
244 switch (encoding
& 0x70)
246 case DW_EH_PE_absptr
:
248 case DW_EH_PE_aligned
:
251 case DW_EH_PE_textrel
:
252 return (_Unwind_Ptr
) ob
->tbase
;
253 case DW_EH_PE_datarel
:
254 return (_Unwind_Ptr
) ob
->dbase
;
260 /* Return the FDE pointer encoding from the CIE. */
261 /* ??? This is a subset of extract_cie_info from unwind-dw2.c. */
264 get_cie_encoding (const struct dwarf_cie
*cie
)
266 const unsigned char *aug
, *p
;
271 aug
= cie
->augmentation
;
272 p
= aug
+ strlen ((const char *)aug
) + 1; /* Skip the augmentation string. */
273 if (__builtin_expect (cie
->version
>= 4, 0))
275 if (p
[0] != sizeof (void *) || p
[1] != 0)
276 return DW_EH_PE_omit
; /* We are not prepared to handle unexpected
277 address sizes or segment selectors. */
278 p
+= 2; /* Skip address size and segment size. */
282 return DW_EH_PE_absptr
;
284 p
= read_uleb128 (p
, &utmp
); /* Skip code alignment. */
285 p
= read_sleb128 (p
, &stmp
); /* Skip data alignment. */
286 if (cie
->version
== 1) /* Skip return address column. */
289 p
= read_uleb128 (p
, &utmp
);
291 aug
++; /* Skip 'z' */
292 p
= read_uleb128 (p
, &utmp
); /* Skip augmentation length. */
295 /* This is what we're looking for. */
298 /* Personality encoding and pointer. */
299 else if (*aug
== 'P')
301 /* ??? Avoid dereferencing indirect pointers, since we're
302 faking the base address. Gotta keep DW_EH_PE_aligned
304 p
= read_encoded_value_with_base (*p
& 0x7F, 0, p
+ 1, &dummy
);
307 else if (*aug
== 'L')
309 /* Otherwise end of string, or unknown augmentation. */
311 return DW_EH_PE_absptr
;
317 get_fde_encoding (const struct dwarf_fde
*f
)
319 return get_cie_encoding (get_cie (f
));
323 /* Sorting an array of FDEs by address.
324 (Ideally we would have the linker sort the FDEs so we don't have to do
325 it at run time. But the linkers are not yet prepared for this.) */
327 /* Comparison routines. Three variants of increasing complexity. */
330 fde_unencoded_compare (struct object
*ob
__attribute__((unused
)),
331 const fde
*x
, const fde
*y
)
333 _Unwind_Ptr x_ptr
, y_ptr
;
334 memcpy (&x_ptr
, x
->pc_begin
, sizeof (_Unwind_Ptr
));
335 memcpy (&y_ptr
, y
->pc_begin
, sizeof (_Unwind_Ptr
));
345 fde_single_encoding_compare (struct object
*ob
, const fde
*x
, const fde
*y
)
347 _Unwind_Ptr base
, x_ptr
, y_ptr
;
349 base
= base_from_object (ob
->s
.b
.encoding
, ob
);
350 read_encoded_value_with_base (ob
->s
.b
.encoding
, base
, x
->pc_begin
, &x_ptr
);
351 read_encoded_value_with_base (ob
->s
.b
.encoding
, base
, y
->pc_begin
, &y_ptr
);
361 fde_mixed_encoding_compare (struct object
*ob
, const fde
*x
, const fde
*y
)
363 int x_encoding
, y_encoding
;
364 _Unwind_Ptr x_ptr
, y_ptr
;
366 x_encoding
= get_fde_encoding (x
);
367 read_encoded_value_with_base (x_encoding
, base_from_object (x_encoding
, ob
),
368 x
->pc_begin
, &x_ptr
);
370 y_encoding
= get_fde_encoding (y
);
371 read_encoded_value_with_base (y_encoding
, base_from_object (y_encoding
, ob
),
372 y
->pc_begin
, &y_ptr
);
381 typedef int (*fde_compare_t
) (struct object
*, const fde
*, const fde
*);
384 /* This is a special mix of insertion sort and heap sort, optimized for
385 the data sets that actually occur. They look like
386 101 102 103 127 128 105 108 110 190 111 115 119 125 160 126 129 130.
387 I.e. a linearly increasing sequence (coming from functions in the text
388 section), with additionally a few unordered elements (coming from functions
389 in gnu_linkonce sections) whose values are higher than the values in the
390 surrounding linear sequence (but not necessarily higher than the values
391 at the end of the linear sequence!).
392 The worst-case total run time is O(N) + O(n log (n)), where N is the
393 total number of FDEs and n is the number of erratic ones. */
395 struct fde_accumulator
397 struct fde_vector
*linear
;
398 struct fde_vector
*erratic
;
402 start_fde_sort (struct fde_accumulator
*accu
, size_t count
)
408 size
= sizeof (struct fde_vector
) + sizeof (const fde
*) * count
;
409 if ((accu
->linear
= malloc (size
)))
411 accu
->linear
->count
= 0;
412 if ((accu
->erratic
= malloc (size
)))
413 accu
->erratic
->count
= 0;
421 fde_insert (struct fde_accumulator
*accu
, const fde
*this_fde
)
424 accu
->linear
->array
[accu
->linear
->count
++] = this_fde
;
427 /* Split LINEAR into a linear sequence with low values and an erratic
428 sequence with high values, put the linear one (of longest possible
429 length) into LINEAR and the erratic one into ERRATIC. This is O(N).
431 Because the longest linear sequence we are trying to locate within the
432 incoming LINEAR array can be interspersed with (high valued) erratic
433 entries. We construct a chain indicating the sequenced entries.
434 To avoid having to allocate this chain, we overlay it onto the space of
435 the ERRATIC array during construction. A final pass iterates over the
436 chain to determine what should be placed in the ERRATIC array, and
437 what is the linear sequence. This overlay is safe from aliasing. */
440 fde_split (struct object
*ob
, fde_compare_t fde_compare
,
441 struct fde_vector
*linear
, struct fde_vector
*erratic
)
443 static const fde
*marker
;
444 size_t count
= linear
->count
;
445 const fde
*const *chain_end
= &marker
;
448 /* This should optimize out, but it is wise to make sure this assumption
449 is correct. Should these have different sizes, we cannot cast between
450 them and the overlaying onto ERRATIC will not work. */
451 gcc_assert (sizeof (const fde
*) == sizeof (const fde
**));
453 for (i
= 0; i
< count
; i
++)
455 const fde
*const *probe
;
457 for (probe
= chain_end
;
458 probe
!= &marker
&& fde_compare (ob
, linear
->array
[i
], *probe
) < 0;
461 chain_end
= (const fde
*const*) erratic
->array
[probe
- linear
->array
];
462 erratic
->array
[probe
- linear
->array
] = NULL
;
464 erratic
->array
[i
] = (const fde
*) chain_end
;
465 chain_end
= &linear
->array
[i
];
468 /* Each entry in LINEAR which is part of the linear sequence we have
469 discovered will correspond to a non-NULL entry in the chain we built in
470 the ERRATIC array. */
471 for (i
= j
= k
= 0; i
< count
; i
++)
472 if (erratic
->array
[i
])
473 linear
->array
[j
++] = linear
->array
[i
];
475 erratic
->array
[k
++] = linear
->array
[i
];
480 #define SWAP(x,y) do { const fde * tmp = x; x = y; y = tmp; } while (0)
482 /* Convert a semi-heap to a heap. A semi-heap is a heap except possibly
483 for the first (root) node; push it down to its rightful place. */
486 frame_downheap (struct object
*ob
, fde_compare_t fde_compare
, const fde
**a
,
491 for (i
= lo
, j
= 2*i
+1;
495 if (j
+1 < hi
&& fde_compare (ob
, a
[j
], a
[j
+1]) < 0)
498 if (fde_compare (ob
, a
[i
], a
[j
]) < 0)
508 /* This is O(n log(n)). BSD/OS defines heapsort in stdlib.h, so we must
509 use a name that does not conflict. */
512 frame_heapsort (struct object
*ob
, fde_compare_t fde_compare
,
513 struct fde_vector
*erratic
)
515 /* For a description of this algorithm, see:
516 Samuel P. Harbison, Guy L. Steele Jr.: C, a reference manual, 2nd ed.,
518 const fde
** a
= erratic
->array
;
519 /* A portion of the array is called a "heap" if for all i>=0:
520 If i and 2i+1 are valid indices, then a[i] >= a[2i+1].
521 If i and 2i+2 are valid indices, then a[i] >= a[2i+2]. */
522 size_t n
= erratic
->count
;
525 /* Expand our heap incrementally from the end of the array, heapifying
526 each resulting semi-heap as we go. After each step, a[m] is the top
528 for (m
= n
/2-1; m
>= 0; --m
)
529 frame_downheap (ob
, fde_compare
, a
, m
, n
);
531 /* Shrink our heap incrementally from the end of the array, first
532 swapping out the largest element a[0] and then re-heapifying the
533 resulting semi-heap. After each step, a[0..m) is a heap. */
534 for (m
= n
-1; m
>= 1; --m
)
537 frame_downheap (ob
, fde_compare
, a
, 0, m
);
542 /* Merge V1 and V2, both sorted, and put the result into V1. */
544 fde_merge (struct object
*ob
, fde_compare_t fde_compare
,
545 struct fde_vector
*v1
, struct fde_vector
*v2
)
557 fde2
= v2
->array
[i2
];
558 while (i1
> 0 && fde_compare (ob
, v1
->array
[i1
-1], fde2
) > 0)
560 v1
->array
[i1
+i2
] = v1
->array
[i1
-1];
563 v1
->array
[i1
+i2
] = fde2
;
566 v1
->count
+= v2
->count
;
571 end_fde_sort (struct object
*ob
, struct fde_accumulator
*accu
, size_t count
)
573 fde_compare_t fde_compare
;
575 gcc_assert (!accu
->linear
|| accu
->linear
->count
== count
);
577 if (ob
->s
.b
.mixed_encoding
)
578 fde_compare
= fde_mixed_encoding_compare
;
579 else if (ob
->s
.b
.encoding
== DW_EH_PE_absptr
)
580 fde_compare
= fde_unencoded_compare
;
582 fde_compare
= fde_single_encoding_compare
;
586 fde_split (ob
, fde_compare
, accu
->linear
, accu
->erratic
);
587 gcc_assert (accu
->linear
->count
+ accu
->erratic
->count
== count
);
588 frame_heapsort (ob
, fde_compare
, accu
->erratic
);
589 fde_merge (ob
, fde_compare
, accu
->linear
, accu
->erratic
);
590 free (accu
->erratic
);
594 /* We've not managed to malloc an erratic array,
595 so heap sort in the linear one. */
596 frame_heapsort (ob
, fde_compare
, accu
->linear
);
601 /* Update encoding, mixed_encoding, and pc_begin for OB for the
602 fde array beginning at THIS_FDE. Return the number of fdes
603 encountered along the way. */
606 classify_object_over_fdes (struct object
*ob
, const fde
*this_fde
)
608 const struct dwarf_cie
*last_cie
= 0;
610 int encoding
= DW_EH_PE_absptr
;
611 _Unwind_Ptr base
= 0;
613 for (; ! last_fde (ob
, this_fde
); this_fde
= next_fde (this_fde
))
615 const struct dwarf_cie
*this_cie
;
616 _Unwind_Ptr mask
, pc_begin
;
619 if (this_fde
->CIE_delta
== 0)
622 /* Determine the encoding for this FDE. Note mixed encoded
623 objects for later. */
624 this_cie
= get_cie (this_fde
);
625 if (this_cie
!= last_cie
)
628 encoding
= get_cie_encoding (this_cie
);
629 if (encoding
== DW_EH_PE_omit
)
631 base
= base_from_object (encoding
, ob
);
632 if (ob
->s
.b
.encoding
== DW_EH_PE_omit
)
633 ob
->s
.b
.encoding
= encoding
;
634 else if (ob
->s
.b
.encoding
!= encoding
)
635 ob
->s
.b
.mixed_encoding
= 1;
638 read_encoded_value_with_base (encoding
, base
, this_fde
->pc_begin
,
641 /* Take care to ignore link-once functions that were removed.
642 In these cases, the function address will be NULL, but if
643 the encoding is smaller than a pointer a true NULL may not
644 be representable. Assume 0 in the representable bits is NULL. */
645 mask
= size_of_encoded_value (encoding
);
646 if (mask
< sizeof (void *))
647 mask
= (((_Unwind_Ptr
) 1) << (mask
<< 3)) - 1;
651 if ((pc_begin
& mask
) == 0)
655 if ((void *) pc_begin
< ob
->pc_begin
)
656 ob
->pc_begin
= (void *) pc_begin
;
663 add_fdes (struct object
*ob
, struct fde_accumulator
*accu
, const fde
*this_fde
)
665 const struct dwarf_cie
*last_cie
= 0;
666 int encoding
= ob
->s
.b
.encoding
;
667 _Unwind_Ptr base
= base_from_object (ob
->s
.b
.encoding
, ob
);
669 for (; ! last_fde (ob
, this_fde
); this_fde
= next_fde (this_fde
))
671 const struct dwarf_cie
*this_cie
;
674 if (this_fde
->CIE_delta
== 0)
677 if (ob
->s
.b
.mixed_encoding
)
679 /* Determine the encoding for this FDE. Note mixed encoded
680 objects for later. */
681 this_cie
= get_cie (this_fde
);
682 if (this_cie
!= last_cie
)
685 encoding
= get_cie_encoding (this_cie
);
686 base
= base_from_object (encoding
, ob
);
690 if (encoding
== DW_EH_PE_absptr
)
693 memcpy (&ptr
, this_fde
->pc_begin
, sizeof (_Unwind_Ptr
));
699 _Unwind_Ptr pc_begin
, mask
;
701 read_encoded_value_with_base (encoding
, base
, this_fde
->pc_begin
,
704 /* Take care to ignore link-once functions that were removed.
705 In these cases, the function address will be NULL, but if
706 the encoding is smaller than a pointer a true NULL may not
707 be representable. Assume 0 in the representable bits is NULL. */
708 mask
= size_of_encoded_value (encoding
);
709 if (mask
< sizeof (void *))
710 mask
= (((_Unwind_Ptr
) 1) << (mask
<< 3)) - 1;
714 if ((pc_begin
& mask
) == 0)
718 fde_insert (accu
, this_fde
);
722 /* Set up a sorted array of pointers to FDEs for a loaded object. We
723 count up the entries before allocating the array because it's likely to
724 be faster. We can be called multiple times, should we have failed to
725 allocate a sorted fde array on a previous occasion. */
728 init_object (struct object
* ob
)
730 struct fde_accumulator accu
;
733 count
= ob
->s
.b
.count
;
736 if (ob
->s
.b
.from_array
)
738 fde
**p
= ob
->u
.array
;
739 for (count
= 0; *p
; ++p
)
741 size_t cur_count
= classify_object_over_fdes (ob
, *p
);
742 if (cur_count
== (size_t) -1)
749 count
= classify_object_over_fdes (ob
, ob
->u
.single
);
750 if (count
== (size_t) -1)
752 static const fde terminator
;
755 ob
->s
.b
.encoding
= DW_EH_PE_omit
;
756 ob
->u
.single
= &terminator
;
761 /* The count field we have in the main struct object is somewhat
762 limited, but should suffice for virtually all cases. If the
763 counted value doesn't fit, re-write a zero. The worst that
764 happens is that we re-count next time -- admittedly non-trivial
765 in that this implies some 2M fdes, but at least we function. */
766 ob
->s
.b
.count
= count
;
767 if (ob
->s
.b
.count
!= count
)
771 if (!start_fde_sort (&accu
, count
))
774 if (ob
->s
.b
.from_array
)
777 for (p
= ob
->u
.array
; *p
; ++p
)
778 add_fdes (ob
, &accu
, *p
);
781 add_fdes (ob
, &accu
, ob
->u
.single
);
783 end_fde_sort (ob
, &accu
, count
);
785 /* Save the original fde pointer, since this is the key by which the
786 DSO will deregister the object. */
787 accu
.linear
->orig_data
= ob
->u
.single
;
788 ob
->u
.sort
= accu
.linear
;
793 /* A linear search through a set of FDEs for the given PC. This is
794 used when there was insufficient memory to allocate and sort an
798 linear_search_fdes (struct object
*ob
, const fde
*this_fde
, void *pc
)
800 const struct dwarf_cie
*last_cie
= 0;
801 int encoding
= ob
->s
.b
.encoding
;
802 _Unwind_Ptr base
= base_from_object (ob
->s
.b
.encoding
, ob
);
804 for (; ! last_fde (ob
, this_fde
); this_fde
= next_fde (this_fde
))
806 const struct dwarf_cie
*this_cie
;
807 _Unwind_Ptr pc_begin
, pc_range
;
810 if (this_fde
->CIE_delta
== 0)
813 if (ob
->s
.b
.mixed_encoding
)
815 /* Determine the encoding for this FDE. Note mixed encoded
816 objects for later. */
817 this_cie
= get_cie (this_fde
);
818 if (this_cie
!= last_cie
)
821 encoding
= get_cie_encoding (this_cie
);
822 base
= base_from_object (encoding
, ob
);
826 if (encoding
== DW_EH_PE_absptr
)
828 const _Unwind_Ptr
*pc_array
= (const _Unwind_Ptr
*) this_fde
->pc_begin
;
829 pc_begin
= pc_array
[0];
830 pc_range
= pc_array
[1];
837 const unsigned char *p
;
839 p
= read_encoded_value_with_base (encoding
, base
,
840 this_fde
->pc_begin
, &pc_begin
);
841 read_encoded_value_with_base (encoding
& 0x0F, 0, p
, &pc_range
);
843 /* Take care to ignore link-once functions that were removed.
844 In these cases, the function address will be NULL, but if
845 the encoding is smaller than a pointer a true NULL may not
846 be representable. Assume 0 in the representable bits is NULL. */
847 mask
= size_of_encoded_value (encoding
);
848 if (mask
< sizeof (void *))
849 mask
= (((_Unwind_Ptr
) 1) << (mask
<< 3)) - 1;
853 if ((pc_begin
& mask
) == 0)
857 if ((_Unwind_Ptr
) pc
- pc_begin
< pc_range
)
864 /* Binary search for an FDE containing the given PC. Here are three
865 implementations of increasing complexity. */
867 static inline const fde
*
868 binary_search_unencoded_fdes (struct object
*ob
, void *pc
)
870 struct fde_vector
*vec
= ob
->u
.sort
;
873 for (lo
= 0, hi
= vec
->count
; lo
< hi
; )
875 size_t i
= (lo
+ hi
) / 2;
876 const fde
*const f
= vec
->array
[i
];
879 memcpy (&pc_begin
, (const void * const *) f
->pc_begin
, sizeof (void *));
880 memcpy (&pc_range
, (const uaddr
*) f
->pc_begin
+ 1, sizeof (uaddr
));
884 else if (pc
>= pc_begin
+ pc_range
)
893 static inline const fde
*
894 binary_search_single_encoding_fdes (struct object
*ob
, void *pc
)
896 struct fde_vector
*vec
= ob
->u
.sort
;
897 int encoding
= ob
->s
.b
.encoding
;
898 _Unwind_Ptr base
= base_from_object (encoding
, ob
);
901 for (lo
= 0, hi
= vec
->count
; lo
< hi
; )
903 size_t i
= (lo
+ hi
) / 2;
904 const fde
*f
= vec
->array
[i
];
905 _Unwind_Ptr pc_begin
, pc_range
;
906 const unsigned char *p
;
908 p
= read_encoded_value_with_base (encoding
, base
, f
->pc_begin
,
910 read_encoded_value_with_base (encoding
& 0x0F, 0, p
, &pc_range
);
912 if ((_Unwind_Ptr
) pc
< pc_begin
)
914 else if ((_Unwind_Ptr
) pc
>= pc_begin
+ pc_range
)
923 static inline const fde
*
924 binary_search_mixed_encoding_fdes (struct object
*ob
, void *pc
)
926 struct fde_vector
*vec
= ob
->u
.sort
;
929 for (lo
= 0, hi
= vec
->count
; lo
< hi
; )
931 size_t i
= (lo
+ hi
) / 2;
932 const fde
*f
= vec
->array
[i
];
933 _Unwind_Ptr pc_begin
, pc_range
;
934 const unsigned char *p
;
937 encoding
= get_fde_encoding (f
);
938 p
= read_encoded_value_with_base (encoding
,
939 base_from_object (encoding
, ob
),
940 f
->pc_begin
, &pc_begin
);
941 read_encoded_value_with_base (encoding
& 0x0F, 0, p
, &pc_range
);
943 if ((_Unwind_Ptr
) pc
< pc_begin
)
945 else if ((_Unwind_Ptr
) pc
>= pc_begin
+ pc_range
)
955 search_object (struct object
* ob
, void *pc
)
957 /* If the data hasn't been sorted, try to do this now. We may have
958 more memory available than last time we tried. */
959 if (! ob
->s
.b
.sorted
)
963 /* Despite the above comment, the normal reason to get here is
964 that we've not processed this object before. A quick range
965 check is in order. */
966 if (pc
< ob
->pc_begin
)
972 if (ob
->s
.b
.mixed_encoding
)
973 return binary_search_mixed_encoding_fdes (ob
, pc
);
974 else if (ob
->s
.b
.encoding
== DW_EH_PE_absptr
)
975 return binary_search_unencoded_fdes (ob
, pc
);
977 return binary_search_single_encoding_fdes (ob
, pc
);
981 /* Long slow laborious linear search, cos we've no memory. */
982 if (ob
->s
.b
.from_array
)
985 for (p
= ob
->u
.array
; *p
; p
++)
987 const fde
*f
= linear_search_fdes (ob
, *p
, pc
);
994 return linear_search_fdes (ob
, ob
->u
.single
, pc
);
999 _Unwind_Find_FDE (void *pc
, struct dwarf_eh_bases
*bases
)
1002 const fde
*f
= NULL
;
1004 init_object_mutex_once ();
1005 __gthread_mutex_lock (&object_mutex
);
1007 /* Linear search through the classified objects, to find the one
1008 containing the pc. Note that pc_begin is sorted descending, and
1009 we expect objects to be non-overlapping. */
1010 for (ob
= seen_objects
; ob
; ob
= ob
->next
)
1011 if (pc
>= ob
->pc_begin
)
1013 f
= search_object (ob
, pc
);
1019 /* Classify and search the objects we've not yet processed. */
1020 while ((ob
= unseen_objects
))
1024 unseen_objects
= ob
->next
;
1025 f
= search_object (ob
, pc
);
1027 /* Insert the object into the classified list. */
1028 for (p
= &seen_objects
; *p
; p
= &(*p
)->next
)
1029 if ((*p
)->pc_begin
< ob
->pc_begin
)
1039 __gthread_mutex_unlock (&object_mutex
);
1046 bases
->tbase
= ob
->tbase
;
1047 bases
->dbase
= ob
->dbase
;
1049 encoding
= ob
->s
.b
.encoding
;
1050 if (ob
->s
.b
.mixed_encoding
)
1051 encoding
= get_fde_encoding (f
);
1052 read_encoded_value_with_base (encoding
, base_from_object (encoding
, ob
),
1053 f
->pc_begin
, &func
);
1054 bases
->func
= (void *) func
;