diff options
author | mostang.com!davidm <mostang.com!davidm> | 2002-12-19 07:16:50 +0000 |
---|---|---|
committer | mostang.com!davidm <mostang.com!davidm> | 2002-12-19 07:16:50 +0000 |
commit | a35b8d4710bae6cf384c676c05c34e969d2b18c6 (patch) | |
tree | bbd60d19b6ad78f3bd9fb31a4d838bf96a7ba5c3 /src | |
parent | 6fd20088619b83c1553755c386bd40d913fe347c (diff) | |
download | libunwind-a35b8d4710bae6cf384c676c05c34e969d2b18c6.tar.gz |
Rename: src/Gfind_dynamic_proc_info-ia64.c -> src/Gfind_dynamic_proc_info.c
(Logical change 1.32)
Diffstat (limited to 'src')
-rw-r--r-- | src/Gfind_dynamic_proc_info.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/Gfind_dynamic_proc_info.c b/src/Gfind_dynamic_proc_info.c index e69de29b..aabfb9bc 100644 --- a/src/Gfind_dynamic_proc_info.c +++ b/src/Gfind_dynamic_proc_info.c @@ -0,0 +1,60 @@ +#include <stdio.h> + +#include "internal.h" + +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; +} + +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 +} |