| - Update the libunwind man page for the new/fixed cache-flushing behavior. |
| Effectively, that unw_flush_cache() doesn't have to be called by |
| applications except for extraordinary circumstances (e.g., if application |
| implements its own runtime loader). |
| - document split local-only/generic libraries and separate libunwind-ptrace.a |
| convenience-library |
| - document new "tdep" member in unw_proc_info_t structure |
| - for DWARF 2, use a dummy CIE entry with an augmentation that |
| provides the dyn-info-list-address |
| |
| === taken care of: |
| |
| Testing: |
| + ensure that saving r4-r7 in a stacked register properly preserves |
| the NaT bit, even in the face of register-rotation |
| + ensure that IA64_INSN_MOVE_STACKED works correctly in the face of |
| register rotation |
| + on Linux, test access to f32-f127 in a signal handler (e.g., verify |
| that fph partition gets initialized properly) |
| + According to Nicholas S. Wourms <nwourms@netscape.net>, adding this to the |
| Makefile.am: |
| AUTOMAKE_OPTIONS = 1.6 subdir-objects |
| ensures that object-files are build in separate subdirectories and that |
| in turn makes it possible for source files in different directories to |
| have the same filename, thus avoiding the need for those ugly -x86, -ia64, |
| etc., postfixes. |
| + Switch ia64 (and rest over) to using Debug() instead of debug() |
| + implement non-local versions of dwarf_readXX() |
| + consolidate mostly architecture-independent code such as |
| unw_get_accessors() into shared files |
| + caching is pretty fundamentally broken, what should happen is this: |
| o On unw_init_local()/unw_init_remote(), libunwind should validate |
| that the cached information is still valid and, if not, flush the |
| cache on its own. Rationale: once unw_init_local() has been |
| called, it is clear that the unwind info for the calling thread |
| cannot change (otherwise the program would be buggy anyhow) and |
| hence it is sufficient to validate the cache at this point. |
| Similarly, once unw_init_remote() has been called, the target |
| address space must have been stopped, because the unwinding would |
| otherwise be unreliable anyhow. |
| o glibc currently lacks a feature for dl_iterate_phdr() to support |
| safe caching; I proposed on 12/16/2003 that glibc maintain two |
| atomic counters which get inremented whenever something is added |
| to/removed from the dl_iterate_phdr-list. Once we have such counters, |
| we can use them in libunwind to implement an efficient version of a |
| cache-validation routine. |
| Once this has been fixed, update the libunwind man page accordingly. |
| Effectively, what this means is that unw_flush_cache() doesn't have |
| to be called by applications except for extraordinary circumstances |
| (e.g., if application implements its own runtime loader). |
| + man-page for unw_is_fpreg() |
| + man-page for _U_dyn_cancel() |
| + man-page for _U_dyn_register() |
| + global data is not protected by a lock; causes problems if two threads |
| call ia64_init() at almost the same time |
| + cache the value of *cfm_loc; each rotate_FOO() call needs it! |
| + implement the remote-lookup of the dynamic registration list |
| + when doing sigreturn, must restore fp regs (and perhaps other regs) the same |
| way as the (user-level) gate.S sigreturn path does! |
| + unw_resume() must at least restore gp (r1)! consider restoring all |
| scratch regs (but what's the performance impact on exception handling?); |
| alternative: restore scratch regs that may be used during procedure |
| call/return (e.g., r8-r11, f8-f11) |
| + implement unw_resume() for the case where the current register frame is split |
| across multiple backing stores |
| + document restricions on using unw_resume(): |
| + implement remote cases of unw_resume() |
| + test both with UNW_LOCAL_ONLY and without where this makes sense |
| + allow region-length (insn_count) in unw_dyn_region_info_t to be negative |
| to indicate counting from the end of the procedure (to make it possible |
| for differently-sized procedures to share the same region list if they |
| share the same prologue/epilogue). |
| + it appears that it is currently not possible to read register UNW_IA64_TP; |
| fix that => no, attempts to access r13 will result in access_reg() callbacks, |
| as desired; for local-case, access to r13 will fail though (since |
| getcontext() doesn't, and shouldn't, capture r13) |
| + document the special nature of UNW_IA64_GP: read-only, but adjusted |
| automatically if the IP is changed |
| + use pthread-mutexes where necessary, atomic ops where possible |
| + man-page for unw_init_local() |
| + man-page for unw_init_remote() |
| + man-page for unw_create_addr_space() |
| + man-page for unw_destroy_addr_space() |
| + man-page for unw_get_proc_info() |
| + man-page for unw_get_proc_name() |
| + man-page for unw_get_accessors() |
| + man-page for unw_regname() |
| + man-page for unw_flush_cache() |
| + man-page for unw_set_caching_policy() |
| + man-page for unw_getcontext() |
| + man-page for unw_is_signal_frame() |
| + man-page for unw_step() |
| + man-page for unw_get_reg() |
| + man-page for unw_set_reg() |
| + man-page for unw_get_fpreg() |
| + man-page for unw_set_fpreg() |
| + test with Intel compiler |