| #include <stdio.h> |
| |
| #include "internal.h" |
| #include "tdep.h" |
| |
| #ifndef UNW_REMOTE_ONLY |
| |
| static inline int |
| local_find_proc_info (unw_addr_space_t as, unw_word_t ip, |
| unw_proc_info_t *pi, |
| int need_unwind_info, void *arg) |
| { |
| unw_dyn_info_t *di; |
| |
| for (di = _U_dyn_info_list.first; di; di = di->next) |
| if (ip >= di->start_ip && ip < di->end_ip) |
| return unwi_extract_dynamic_proc_info (as, ip, pi, di, need_unwind_info, |
| arg); |
| return -UNW_ENOINFO; |
| } |
| |
| #endif /* UNW_REMOTE_ONLY */ |
| |
| static inline int |
| remote_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, |
| int need_unwind_info, void *arg) |
| { |
| unw_word_t generation; |
| int ret; |
| |
| ret = unwi_dyn_remote_find_proc_info (as, ip, pi, &generation, |
| need_unwind_info, arg); |
| if (ret < 0) |
| return ret; |
| |
| /* Note: this can't go into dyn-remote.c because that file get's |
| compiled exactly once (there are no separate local/general |
| versions) and the call to unw_flush_cache() must evaluate to |
| either the local or generic version. */ |
| if (as->dyn_generation != generation) |
| { |
| unw_flush_cache (as, 0, 0); |
| as->dyn_generation = generation; |
| } |
| return 0; |
| } |
| |
| HIDDEN int |
| unwi_find_dynamic_proc_info (unw_addr_space_t as, unw_word_t ip, |
| unw_proc_info_t *pi, int need_unwind_info, |
| void *arg) |
| { |
| #ifdef UNW_LOCAL_ONLY |
| return local_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| #else |
| # ifdef UNW_REMOTE_ONLY |
| return remote_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| # else |
| if (as == unw_local_addr_space) |
| return local_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| else |
| return remote_find_proc_info (as, ip, pi, need_unwind_info, arg); |
| # endif |
| #endif |
| } |