2004-04-02 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 2 Apr 2004 19:44:25 +0000 (19:44 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 2 Apr 2004 19:44:25 +0000 (19:44 +0000)
* frame.c (safe_frame_unwind_memory): New function.
* frame.h (safe_frame_unwind_memory): Declare.  Update description
of /safe_/ methods.
* tramp-frame.c (tramp_frame_start): Re-order parmeters, add
"next_frame".  Use safe_frame_unwind_memory.
(tramp_frame_sniffer): Update call to tramp_frame_start.

gdb/ChangeLog
gdb/frame.c
gdb/frame.h
gdb/tramp-frame.c

index b2a9ad26a81860789b22763c7b31c03de990f5d7..cf9cbdd426b69c522f455046e33042ef0d8dbb7c 100644 (file)
@@ -1,3 +1,12 @@
+2004-04-02  Andrew Cagney  <cagney@redhat.com>
+
+       * frame.c (safe_frame_unwind_memory): New function.
+       * frame.h (safe_frame_unwind_memory): Declare.  Update description
+       of /safe_/ methods.
+       * tramp-frame.c (tramp_frame_start): Re-order parmeters, add
+       "next_frame".  Use safe_frame_unwind_memory.
+       (tramp_frame_sniffer): Update call to tramp_frame_start.
+
 2004-04-01  Daniel Jacobowitz  <drow@mvista.com>
 
        * dwarf2read.c (dwarf2_objfile_data_key): New.
index d725e8758dd331e12a9316fa4b23ffab41828150..bc04397947389cb90c2fbd633447003fba27ccc8 100644 (file)
@@ -2270,6 +2270,14 @@ get_frame_memory_unsigned (struct frame_info *this_frame, CORE_ADDR addr,
   return read_memory_unsigned_integer (addr, len);
 }
 
+int
+safe_frame_unwind_memory (struct frame_info *this_frame,
+                         CORE_ADDR addr, void *buf, int len)
+{
+  /* NOTE: read_memory_nobpt returns zero on success!  */
+  return !read_memory_nobpt (addr, buf, len);
+}
+
 /* Architecture method.  */
 
 struct gdbarch *
index 3e38c6106b52ecb79342771f1e1433984629884a..32b3efaa26b8acbb2fb689a9927cfc3e39224223 100644 (file)
@@ -40,8 +40,8 @@
    strongly hinting at its unsafeness)
 
    safe_....(): Safer version of various functions, doesn't throw an
-   error (leave this for later?).  Returns non-zero if the fetch
-   succeeds.   Return a freshly allocated error message?
+   error (leave this for later?).  Returns non-zero / non-NULL if the
+   request succeeds, zero / NULL otherwize.
 
    Suffixes:
 
@@ -461,6 +461,11 @@ extern LONGEST get_frame_memory_signed (struct frame_info *this_frame,
 extern ULONGEST get_frame_memory_unsigned (struct frame_info *this_frame,
                                           CORE_ADDR memaddr, int len);
 
+/* Same as above, but return non-zero when the entire memory read
+   succeeds, zero otherwize.  */
+extern int safe_frame_unwind_memory (struct frame_info *this_frame,
+                                    CORE_ADDR addr, void *buf, int len);
+
 /* Return this frame's architecture.  */
 
 extern struct gdbarch *get_frame_arch (struct frame_info *this_frame);
index ee3635f743b81ac9e80caecabcdfb49f89537e49..528603c745257387232baa24cf4db3cd2620be41 100644 (file)
@@ -85,7 +85,8 @@ tramp_frame_prev_register (struct frame_info *next_frame,
 }
 
 static CORE_ADDR
-tramp_frame_start (CORE_ADDR pc, const struct tramp_frame *tramp)
+tramp_frame_start (const struct tramp_frame *tramp,
+                  struct frame_info *next_frame, CORE_ADDR pc)
 {
   int ti;
   /* Search through the trampoline for one that matches the
@@ -100,8 +101,9 @@ tramp_frame_start (CORE_ADDR pc, const struct tramp_frame *tramp)
          ULONGEST insn;
          if (tramp->insn[i] == TRAMP_SENTINEL_INSN)
            return func;
-         if (target_read_memory (func + i * tramp->insn_size, buf,
-                                 tramp->insn_size) != 0)
+         if (!safe_frame_unwind_memory (next_frame,
+                                        func + i * tramp->insn_size,
+                                        buf, tramp->insn_size))
            break;
          insn = extract_unsigned_integer (buf, tramp->insn_size);
          if (tramp->insn[i] != insn)
@@ -133,7 +135,7 @@ tramp_frame_sniffer (const struct frame_unwind *self,
   if (find_pc_section (pc) != NULL)
     return 0;
   /* Finally, check that the trampoline matches at PC.  */
-  func = tramp_frame_start (pc, tramp);
+  func = tramp_frame_start (tramp, next_frame, pc);
   if (func == 0)
     return 0;
   tramp_cache = FRAME_OBSTACK_ZALLOC (struct tramp_frame_cache);