]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/tramp-frame.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / gdb / tramp-frame.c
index fe4ca0a9dbc44bfa982ecd736b773b176ea9b32f..692fdd5222556dc39418cfca98596a6421744a19 100644 (file)
@@ -1,12 +1,12 @@
 /* Signal trampoline unwinder, for GDB the GNU Debugger.
 
-   Copyright (C) 2004 Free Software Foundation, Inc.
+   Copyright (C) 2004-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "tramp-frame.h"
@@ -43,16 +41,16 @@ struct tramp_frame_cache
 };
 
 static struct trad_frame_cache *
-tramp_frame_cache (struct frame_info *next_frame,
+tramp_frame_cache (struct frame_info *this_frame,
                   void **this_cache)
 {
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
   struct tramp_frame_cache *tramp_cache = (*this_cache);
+
   if (tramp_cache->trad_cache == NULL)
     {
-      tramp_cache->trad_cache = trad_frame_cache_zalloc (next_frame);
+      tramp_cache->trad_cache = trad_frame_cache_zalloc (this_frame);
       tramp_cache->tramp_frame->init (tramp_cache->tramp_frame,
-                                     next_frame,
+                                     this_frame,
                                      tramp_cache->trad_cache,
                                      tramp_cache->func);
     }
@@ -60,52 +58,54 @@ tramp_frame_cache (struct frame_info *next_frame,
 }
 
 static void
-tramp_frame_this_id (struct frame_info *next_frame,
+tramp_frame_this_id (struct frame_info *this_frame,
                     void **this_cache,
                     struct frame_id *this_id)
 {
   struct trad_frame_cache *trad_cache
-    = tramp_frame_cache (next_frame, this_cache);
+    = tramp_frame_cache (this_frame, this_cache);
+
   trad_frame_get_id (trad_cache, this_id);
 }
 
-static void
-tramp_frame_prev_register (struct frame_info *next_frame,
+static struct value *
+tramp_frame_prev_register (struct frame_info *this_frame,
                           void **this_cache,
-                          int prev_regnum,
-                          int *optimizedp,
-                          enum lval_type * lvalp,
-                          CORE_ADDR *addrp,
-                          int *realnump, gdb_byte *valuep)
+                          int prev_regnum)
 {
   struct trad_frame_cache *trad_cache
-    = tramp_frame_cache (next_frame, this_cache);
-  trad_frame_get_register (trad_cache, next_frame, prev_regnum, optimizedp,
-                          lvalp, addrp, realnump, valuep);
+    = tramp_frame_cache (this_frame, this_cache);
+
+  return trad_frame_get_register (trad_cache, this_frame, prev_regnum);
 }
 
 static CORE_ADDR
 tramp_frame_start (const struct tramp_frame *tramp,
-                  struct frame_info *next_frame, CORE_ADDR pc)
+                  struct frame_info *this_frame, CORE_ADDR pc)
 {
+  struct gdbarch *gdbarch = get_frame_arch (this_frame);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int ti;
+
   /* Search through the trampoline for one that matches the
      instruction sequence around PC.  */
   for (ti = 0; tramp->insn[ti].bytes != TRAMP_SENTINEL_INSN; ti++)
     {
       CORE_ADDR func = pc - tramp->insn_size * ti;
       int i;
+
       for (i = 0; 1; i++)
        {
          gdb_byte buf[sizeof (tramp->insn[0])];
          ULONGEST insn;
+
          if (tramp->insn[i].bytes == TRAMP_SENTINEL_INSN)
            return func;
-         if (!safe_frame_unwind_memory (next_frame,
+         if (!safe_frame_unwind_memory (this_frame,
                                         func + i * tramp->insn_size,
                                         buf, tramp->insn_size))
            break;
-         insn = extract_unsigned_integer (buf, tramp->insn_size);
+         insn = extract_unsigned_integer (buf, tramp->insn_size, byte_order);
          if (tramp->insn[i].bytes != (insn & tramp->insn[i].mask))
            break;
        }
@@ -116,11 +116,11 @@ tramp_frame_start (const struct tramp_frame *tramp,
 
 static int
 tramp_frame_sniffer (const struct frame_unwind *self,
-                    struct frame_info *next_frame,
+                    struct frame_info *this_frame,
                     void **this_cache)
 {
   const struct tramp_frame *tramp = self->unwind_data->tramp_frame;
-  CORE_ADDR pc = frame_pc_unwind (next_frame);
+  CORE_ADDR pc = get_frame_pc (this_frame);
   CORE_ADDR func;
   struct tramp_frame_cache *tramp_cache;
 
@@ -128,7 +128,7 @@ tramp_frame_sniffer (const struct frame_unwind *self,
      section, then this is not a trampoline.  However, this assumption is
      false on HPUX which has a signal trampoline that has a name; it can
      also be false when using an alternative signal stack.  */
-  func = tramp_frame_start (tramp, next_frame, pc);
+  func = tramp_frame_start (tramp, this_frame, pc);
   if (func == 0)
     return 0;
   tramp_cache = FRAME_OBSTACK_ZALLOC (struct tramp_frame_cache);
@@ -162,6 +162,7 @@ tramp_frame_prepend_unwinder (struct gdbarch *gdbarch,
   unwinder->type = tramp_frame->frame_type;
   unwinder->unwind_data = data;
   unwinder->sniffer = tramp_frame_sniffer;
+  unwinder->stop_reason = default_frame_unwind_stop_reason;
   unwinder->this_id = tramp_frame_this_id;
   unwinder->prev_register = tramp_frame_prev_register;
   frame_unwind_prepend_unwinder (gdbarch, unwinder);