mostang.com!davidm | a35b8d4 | 2002-12-19 07:16:50 +0000 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | |
| 3 | #include "internal.h" |
mostang.com!davidm | d098282 | 2003-03-06 06:14:36 +0000 | [diff] [blame] | 4 | #include "tdep.h" |
mostang.com!davidm | a35b8d4 | 2002-12-19 07:16:50 +0000 | [diff] [blame] | 5 | |
hp.com!davidm | 89344cf | 2003-02-15 03:10:30 +0000 | [diff] [blame] | 6 | #ifndef UNW_REMOTE_ONLY |
| 7 | |
mostang.com!davidm | a35b8d4 | 2002-12-19 07:16:50 +0000 | [diff] [blame] | 8 | static inline int |
| 9 | local_find_proc_info (unw_addr_space_t as, unw_word_t ip, |
| 10 | unw_proc_info_t *pi, |
| 11 | int need_unwind_info, void *arg) |
| 12 | { |
| 13 | unw_dyn_info_t *di; |
| 14 | |
| 15 | for (di = _U_dyn_info_list.first; di; di = di->next) |
| 16 | if (ip >= di->start_ip && ip < di->end_ip) |
| 17 | return unwi_extract_dynamic_proc_info (as, ip, pi, di, need_unwind_info, |
| 18 | arg); |
| 19 | return -UNW_ENOINFO; |
| 20 | } |
| 21 | |
hp.com!davidm | 89344cf | 2003-02-15 03:10:30 +0000 | [diff] [blame] | 22 | #endif /* UNW_REMOTE_ONLY */ |
| 23 | |
mostang.com!davidm | a35b8d4 | 2002-12-19 07:16:50 +0000 | [diff] [blame] | 24 | static inline int |
| 25 | remote_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, |
| 26 | int need_unwind_info, void *arg) |
| 27 | { |
| 28 | unw_word_t generation; |
| 29 | int ret; |
| 30 | |
| 31 | ret = unwi_dyn_remote_find_proc_info (as, ip, pi, &generation, |
| 32 | need_unwind_info, arg); |
| 33 | if (ret < 0) |
| 34 | return ret; |
| 35 | |
| 36 | /* Note: this can't go into dyn-remote.c because that file get's |
| 37 | compiled exactly once (there are no separate local/general |
| 38 | versions) and the call to unw_flush_cache() must evaluate to |
| 39 | either the local or generic version. */ |
| 40 | if (as->dyn_generation != generation) |
| 41 | { |
| 42 | unw_flush_cache (as, 0, 0); |
| 43 | as->dyn_generation = generation; |
| 44 | } |
| 45 | return 0; |
| 46 | } |
| 47 | |
| 48 | HIDDEN int |
| 49 | unwi_find_dynamic_proc_info (unw_addr_space_t as, unw_word_t ip, |
| 50 | unw_proc_info_t *pi, int need_unwind_info, |
| 51 | void *arg) |
| 52 | { |
| 53 | #ifdef UNW_LOCAL_ONLY |
| 54 | return local_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| 55 | #else |
| 56 | # ifdef UNW_REMOTE_ONLY |
| 57 | return remote_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| 58 | # else |
| 59 | if (as == unw_local_addr_space) |
| 60 | return local_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| 61 | else |
| 62 | return remote_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| 63 | # endif |
| 64 | #endif |
| 65 | } |