On 08/12/2011 07:14 AM, Arun Sharma wrote:
On Mon, Aug 8, 2011 at 1:03 PM, Ken Werner<[email protected]>  wrote:
Could we make just the callback from dl_iterate_phdr target dependent?

You mean to register a target dependent callback with dl_iterate_phdr or to
call a target dependent routine from the callback itself? In both cases we'd
want check for .eh_frame/.ARM.exidx infos and fall back to DWARF
(.debug_frame) parsing if there are no unwind infos for the given IP.
The tdep_find_proc_info is supposed to find the corresponding unwind info
which means to populate unw_proc_info. Since this is a fairly complicated
task the implementations of that routine (e.g. dwarf_search_unwind_table,
_UPT_find_proc_info or GDB) only walk the program headers to find ELF
segments that contain unwind informations (unw_dyn_info) and call back to
libunwinds tdep_search_unwind_table (sometimes multiple times) to get a
proper unw_proc_info. I didn't want to change this sequence because these
two functions are part of the public API. Maybe I'm missing something. Any
suggestions are welcome.

Something along the lines of:

--- a/include/tdep-arm/libunwind_i.h
+++ b/include/tdep-arm/libunwind_i.h
@@ -243,9 +243,6 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t
loc, unw_word_t val)
  #define tdep_trace(cur,addr,n)         (-UNW_ENOINFO)

  #ifdef UNW_LOCAL_ONLY
-# define tdep_find_proc_info(c,ip,n)                           \
-       dwarf_find_proc_info((c)->as, (ip),&(c)->pi, (n),      \
-                                      (c)->as_arg)
  # define tdep_put_unwind_info(as,pi,arg)               \
         dwarf_put_unwind_info((as), (pi), (arg))
  #else
diff --git a/src/dwarf/Gfind_proc_info-lsb.c b/src/dwarf/Gfind_proc_info-lsb.c
index d65342c..bec3c24 100644
--- a/src/dwarf/Gfind_proc_info-lsb.c
+++ b/src/dwarf/Gfind_proc_info-lsb.c
@@ -570,8 +570,8 @@ dwarf_find_debug_frame (int found, unw_dyn_info_t *di_debug,
  /* ptr is a pointer to a callback_data structure and, on entry,
     member ip contains the instruction-pointer we're looking
     for.  */
-static int
-callback (struct dl_phdr_info *info, size_t size, void *ptr)
+HIDDEN int
+dwarf_callback (struct dl_phdr_info *info, size_t size, void *ptr)
  {
    struct callback_data *cb_data = ptr;
    unw_dyn_info_t *di =&cb_data->di;
@@ -768,7 +768,7 @@ dwarf_find_proc_info (unw_addr_space_t as, unw_word_t ip,
    cb_data.di_debug.format = -1;

    SIGPROCMASK (SIG_SETMASK,&unwi_full_mask,&saved_mask);
-  ret = dl_iterate_phdr (callback,&cb_data);
+  ret = dl_iterate_phdr (dwarf_callback,&cb_data);
    SIGPROCMASK (SIG_SETMASK,&saved_mask, NULL);

    if (ret<= 0)

And implement  tdep_find_proc_info() in src/arm. This would be similar
to src/ia64, except that ia64 doesn't use any of the dwarf code. You
could have a arm_callback() that reuses the code in dwarf_callback().

Ah, I didn't think of making the dwarf dl_iterate_phdr callback available within libunwind. I'll do so by declaring the renamed callback and the corresponding structure at the dwarf.h header file and rework my code to make use of this.

Thanks,
Ken

_______________________________________________
Libunwind-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/libunwind-devel

Reply via email to