mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-21 23:27:39 +01:00
70be1294ce
(Logical change 1.146)
86 lines
4.1 KiB
Text
86 lines
4.1 KiB
Text
- implement non-local versions of dwarf_readXX()
|
|
- 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
|
|
|
|
- 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. Rational: 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).
|
|
|
|
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)
|
|
|
|
=== taken care of:
|
|
|
|
+ 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
|