From David Mosberger <davidm@hpl.hp.com>:
authorKevin Buettner <kevinb@redhat.com>
Sat, 13 Dec 2003 03:51:56 +0000 (03:51 +0000)
committerKevin Buettner <kevinb@redhat.com>
Sat, 13 Dec 2003 03:51:56 +0000 (03:51 +0000)
* libunwind-frame.c (unw_find_dyn_list_p): Replace most arguments
with a single unw_dyn_info_t pointer.
(libunwind_find_dyn_list): Likewise.
* libunwind-frame.h: Likewise.
* ia64-tdep.c (ia64_find_unwind_table): Switch to using
UNW_INFO_FORMAT_REMOTE_TABLE so we can avoid having to read in the
entire unwind-table at once.  Support for this table format has
been added to libunwind v0.95.
(ia64_find_proc_info_x): Adjust for remote-unwind-table changes.
(ia64_get_dyn_info_list): Adjust for interface change for
libunwind_find_dyn_list().

gdb/ChangeLog
gdb/ia64-tdep.c
gdb/libunwind-frame.c
gdb/libunwind-frame.h

index 862c048c54be20edb113037a163ce1874d098c6b..a7d30b8ab9136237d2c66f0975097dabe9599ead 100644 (file)
@@ -1,3 +1,18 @@
+2003-12-12  Kevin Buettner  <kevinb@redhat.com>
+
+       From David Mosberger  <davidm@hpl.hp.com>:
+       * libunwind-frame.c (unw_find_dyn_list_p): Replace most arguments
+       with a single unw_dyn_info_t pointer.
+       (libunwind_find_dyn_list): Likewise.
+       * libunwind-frame.h: Likewise.
+       * ia64-tdep.c (ia64_find_unwind_table): Switch to using
+       UNW_INFO_FORMAT_REMOTE_TABLE so we can avoid having to read in the
+       entire unwind-table at once.  Support for this table format has
+       been added to libunwind v0.95.
+       (ia64_find_proc_info_x): Adjust for remote-unwind-table changes.
+       (ia64_get_dyn_info_list): Adjust for interface change for
+       libunwind_find_dyn_list().
+
 2003-12-12  Jeff Johnston  <jjohnstn@redhat.com>
 
        * breakpoint.c (breakpoint_enabled): New function to test whether
index 19f18b7faa14a5d41ab1726c9fdb7bbb323e43f6..88e0e20c0725d5eb947789e00f2c5115dd538785 100644 (file)
@@ -2452,23 +2452,11 @@ ia64_find_unwind_table (struct objfile *objfile, unw_word_t ip,
   dip->start_ip = segbase;
   dip->end_ip = dip->start_ip + p_text->p_memsz;
   dip->gp = FIND_GLOBAL_POINTER (ip);
-  dip->format = UNW_INFO_FORMAT_TABLE;
-  dip->u.ti.name_ptr = (unw_word_t) bfd_get_filename (bfd);
-  dip->u.ti.segbase = segbase;
-  dip->u.ti.table_len = p_unwind->p_memsz / sizeof (unw_word_t);
-
-  /* The following can happen in corner cases where dynamically
-     generated code falls into the same page that contains the
-     data-segment and the page-offset of the code is within the first
-     page of the executable.  */
-  if (ip < dip->start_ip || ip >= dip->end_ip)
-    return -UNW_ENOINFO;
-
-  /* Read in the libunwind table.  */
-  *buf = xmalloc (p_unwind->p_memsz);
-  target_read_memory (p_unwind->p_vaddr + load_base, (char *)(*buf), p_unwind->p_memsz);
-
-  dip->u.ti.table_data = (unw_word_t *)(*buf);
+  dip->format = UNW_INFO_FORMAT_REMOTE_TABLE;
+  dip->u.rti.name_ptr = (unw_word_t) bfd_get_filename (bfd);
+  dip->u.rti.segbase = segbase;
+  dip->u.rti.table_len = p_unwind->p_memsz / sizeof (unw_word_t);
+  dip->u.rti.table_data = p_unwind->p_vaddr + load_base;
 
   return 0;
 }
@@ -2490,22 +2478,32 @@ ia64_find_proc_info_x (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
         version.  */
       if (get_kernel_table (ip, &di) < 0)
        return -UNW_ENOINFO;
+
+      if (gdbarch_debug >= 1)
+       fprintf_unfiltered (gdb_stdlog, "%s: %lx -> "
+                           "(name=`%s',segbase=%lx,start=%lx,end=%lx,gp=%lx,"
+                           "length=%lu,data=%p)\n", __FUNCTION__,
+                           ip, (char *)di.u.ti.name_ptr,
+                           di.u.ti.segbase, di.start_ip, di.end_ip,
+                           di.gp, di.u.ti.table_len, di.u.ti.table_data);
     }
   else
     {
       ret = ia64_find_unwind_table (sec->objfile, ip, &di, &buf);
       if (ret < 0)
        return ret;
-    }
 
-  if (gdbarch_debug >= 1)
-    fprintf_unfiltered (gdb_stdlog, "acquire_unwind_info: %lx -> "
-                       "(name=`%s',segbase=%lx,start=%lx,end=%lx,gp=%lx,"
-                       "length=%lu,data=%p)\n", ip, (char *)di.u.ti.name_ptr,
-                       di.u.ti.segbase, di.start_ip, di.end_ip,
-                       di.gp, di.u.ti.table_len, di.u.ti.table_data);
+      if (gdbarch_debug >= 1)
+       fprintf_unfiltered (gdb_stdlog, "%s: %lx -> "
+                           "(name=`%s',segbase=%lx,start=%lx,end=%lx,gp=%lx,"
+                           "length=%lu,data=%lx)\n", __FUNCTION__,
+                           ip, (char *)di.u.rti.name_ptr,
+                           di.u.rti.segbase, di.start_ip, di.end_ip,
+                           di.gp, di.u.rti.table_len, di.u.rti.table_data);
+    }
 
-  ret = libunwind_search_unwind_table (&as, ip, &di, pi, need_unwind_info, arg);
+  ret = libunwind_search_unwind_table (&as, ip, &di, pi, need_unwind_info,
+                                      arg);
 
   /* We no longer need the dyn info storage so free it.  */
   xfree (buf);
@@ -2545,10 +2543,7 @@ ia64_get_dyn_info_list (unw_addr_space_t as,
       ret = ia64_find_unwind_table (objfile, ip, &di, &buf);
       if (ret >= 0)
        {
-         addr = libunwind_find_dyn_list (as, di.u.ti.table_data,
-                                         (di.u.ti.table_len
-                                          * sizeof (di.u.ti.table_data[0])),
-                                         di.u.ti.segbase, di.gp, arg);
+         addr = libunwind_find_dyn_list (as, &di, arg);
          /* We no longer need the dyn info storage so free it.  */
          xfree (buf);
 
index d23ec56057e55e48d058f0e649370918f70ee97c..bf0c36d9f604a2be22d6001c7b9ab08ab80d3248 100644 (file)
@@ -58,8 +58,8 @@ static int (*unw_init_remote_p) (unw_cursor_t *, unw_addr_space_t, void *);
 static unw_addr_space_t (*unw_create_addr_space_p) (unw_accessors_t *, int);
 static int (*unw_search_unwind_table_p) (unw_addr_space_t, unw_word_t, unw_dyn_info_t *,
                                         unw_proc_info_t *, int, void *);
-static unw_word_t (*unw_find_dyn_list_p) (unw_addr_space_t, void *, size_t,
-                                         unw_word_t, unw_word_t, void *);
+static unw_word_t (*unw_find_dyn_list_p) (unw_addr_space_t, unw_dyn_info_t *,
+                                         void *);
 
 
 struct libunwind_frame_cache
@@ -170,11 +170,10 @@ libunwind_frame_cache (struct frame_info *next_frame, void **this_cache)
   return cache;
 }
 
-unw_word_t 
-libunwind_find_dyn_list (unw_addr_space_t as, void *table, size_t table_size,
-                        unw_word_t segbase, unw_word_t gp, void *arg)
+unw_word_t
+libunwind_find_dyn_list (unw_addr_space_t as, unw_dyn_info_t *di, void *arg)
 {
-  return unw_find_dyn_list_p (as, table, table_size, segbase, gp, arg);
+  return unw_find_dyn_list_p (as, di, arg);
 }
 
 static const struct frame_unwind libunwind_frame_unwind =
index c151ef9ab7120b4daa67afe7e2e4b9b52681734b..bacdf87a49aa61213495dfcc2091f7260a24615f 100644 (file)
@@ -55,9 +55,9 @@ int libunwind_is_initialized (void);
 int libunwind_search_unwind_table (void *as, long ip, void *di,
                                   void *pi, int need_unwind_info, void *args);
 
-unw_word_t libunwind_find_dyn_list (unw_addr_space_t, void *, size_t,
-                                   unw_word_t, unw_word_t, void *);
-     
+unw_word_t libunwind_find_dyn_list (unw_addr_space_t, unw_dyn_info_t *,
+                                   void *);
+
 #endif /* libunwind-frame.h */
 
 #endif /* HAVE_LIBUNWIND_H  */