*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / tramp-frame.c
index 7a8057e85e1592877b30949eaff0c0446543b672..6ea2e3f1ebe1f46da32f6320e74fabdb0e6ec3c3 100644 (file)
@@ -28,6 +28,7 @@
 #include "target.h"
 #include "trad-frame.h"
 #include "frame-base.h"
+#include "gdb_assert.h"
 
 struct frame_data
 {
@@ -84,23 +85,25 @@ 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
      instruction sequence around PC.  */
-  for (ti = 0; tramp->insn[ti] != 0; ti++)
+  for (ti = 0; tramp->insn[ti] != TRAMP_SENTINEL_INSN; ti++)
     {
       CORE_ADDR func = pc - tramp->insn_size * ti;
       int i;
       for (i = 0; 1; i++)
        {
-         bfd_byte buf[sizeof (LONGEST)];
-         CORE_ADDR insn;
-         if (tramp->insn[i] == 0)
+         bfd_byte buf[sizeof (tramp->insn[0])];
+         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)
@@ -132,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);
@@ -143,11 +146,21 @@ tramp_frame_sniffer (const struct frame_unwind *self,
 }
 
 void
-tramp_frame_append (struct gdbarch *gdbarch,
-                   const struct tramp_frame *tramp_frame)
+tramp_frame_prepend_unwinder (struct gdbarch *gdbarch,
+                             const struct tramp_frame *tramp_frame)
 {
   struct frame_data *data;
   struct frame_unwind *unwinder;
+  int i;
+
+  /* Check that the instruction sequence contains a sentinel.  */
+  for (i = 0; i < ARRAY_SIZE (tramp_frame->insn); i++)
+    {
+      if (tramp_frame->insn[i] == TRAMP_SENTINEL_INSN)
+       break;
+    }
+  gdb_assert (i < ARRAY_SIZE (tramp_frame->insn));
+  gdb_assert (tramp_frame->insn_size <= sizeof (tramp_frame->insn[0]));
 
   data = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_data);
   unwinder = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_unwind);
@@ -158,5 +171,5 @@ tramp_frame_append (struct gdbarch *gdbarch,
   unwinder->sniffer = tramp_frame_sniffer;
   unwinder->this_id = tramp_frame_this_id;
   unwinder->prev_register = tramp_frame_prev_register;
-  frame_unwind_register_unwinder (gdbarch, unwinder);
+  frame_unwind_prepend_unwinder (gdbarch, unwinder);
 }
This page took 0.025953 seconds and 4 git commands to generate.