* gdbarch.sh (skip_trampoline_code): Add FRAME argument.
authorUlrich Weigand <uweigand@de.ibm.com>
Fri, 15 Jun 2007 22:39:52 +0000 (22:39 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Fri, 15 Jun 2007 22:39:52 +0000 (22:39 +0000)
* gdbarch.c, gdbarch.h: Regenerate.
* arch-utils.c (generic_skip_trampoline_code): Add FRAME argument.
* arch-utils.h (generic_skip_trampoline_code): Likewise.
* infrun.c (handle_inferior_event): Pass current frame to
gdbarch_skip_trampoline_code and skip_language_trampoline.

* language.c (unk_lang_trampoline): Add FRAME argument.
(skip_language_trampoline): Add FRAME argument.  Pass it to
skip_trampoline callback.
* language.h: Add forward declaration of struct frame_info.
(struct language_defn): Add FRAME argument to skip_trampoline.
(skip_language_trampoline): Add FRAME argument.
* cp-abi.c (cplus_skip_trampoline): Add FRAME argument.  Pass it
to skip_trampoline callback.
* cp-abi.h: Add forward declaration of struct frame_info.
(cplus_skip_trampoline): Add FRAME argument.
(struct cp_abi_ops): Add FRAME argument to skip_trampoline callback.
* gnu-v3-abi.c (gnuv3_skip_trampoline): Add FRAME argument.  Pass it
to gdbarch_skip_trampoline_code.
* objc-lang.c (objc_skip_trampoline): Add FRAME argument.  Pass it
to gdbarch_skip_trampoline_code.

* minsyms.c (find_solib_trampoline_target): Add FRAME argument.
* symtab.h (find_solib_trampoline_target): Likewise.
* obsd-tdep.c (obsd_skip_solib_resolver): Pass current frame to
find_solib_trampoline_target.

* arm-tdep.c (arm_skip_stub): Add FRAME argument.  Read registers
from FRAME instead of calling read_register.

* hppa-hpux-tdep.c (hppa_hpux_skip_trampoline_code): Add FRAME
argument.  Read registers from FRAME instead of using read_register.
* hppa-tdep.c (hppa_skip_trampoline_code): Likewise.
* hppa-tdep.h (hppa_skip_trampoline_code): Add FRAME argument.

* i386-cygwin-tdep.c (i386_cygwin_skip_trampoline_code): Add FRAME
argument.

* m32c-tdep.c (m32c_skip_trampoline_code): Add FRAME argument.

* mips-tdep.c (mips_skip_trampoline_code): Add FRAME argument.  Read
registers from FRAME instead of using read_signed_register.

* ppc-linux-tdep.c (ppc_linux_skip_trampoline_code): Add FRAME
argument.
(ppc64_standard_linkage_target): Likewise.  Read registers from FRAME
instead of using read_register.
(ppc64_skip_trampoline_code): Add FRAME argument.  Pass it to
ppc64_standard_linkage_target.
* rs6000-tdep.c (rs6000_skip_trampoline_code): Add FRAME argument.
Pass it to find_solib_trampoline_target.  Read registers from FRAME
instead of using read_register.

* xstormy16-tdep.c (xstormy16_skip_trampoline_code): Add FRAME
argument.

26 files changed:
gdb/ChangeLog
gdb/arch-utils.c
gdb/arch-utils.h
gdb/arm-tdep.c
gdb/cp-abi.c
gdb/cp-abi.h
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/gnu-v3-abi.c
gdb/hppa-hpux-tdep.c
gdb/hppa-tdep.c
gdb/hppa-tdep.h
gdb/i386-cygwin-tdep.c
gdb/infrun.c
gdb/language.c
gdb/language.h
gdb/m32c-tdep.c
gdb/minsyms.c
gdb/mips-tdep.c
gdb/objc-lang.c
gdb/obsd-tdep.c
gdb/ppc-linux-tdep.c
gdb/rs6000-tdep.c
gdb/symtab.h
gdb/xstormy16-tdep.c

index 94c0223bbff3962a29a27c86a6bcff810eab2583..1dc943077b483f36dbdb4dee363433123cc837fb 100644 (file)
@@ -1,3 +1,62 @@
+2007-06-15  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * gdbarch.sh (skip_trampoline_code): Add FRAME argument.
+       * gdbarch.c, gdbarch.h: Regenerate.
+       * arch-utils.c (generic_skip_trampoline_code): Add FRAME argument.
+       * arch-utils.h (generic_skip_trampoline_code): Likewise.
+       * infrun.c (handle_inferior_event): Pass current frame to
+       gdbarch_skip_trampoline_code and skip_language_trampoline.
+
+       * language.c (unk_lang_trampoline): Add FRAME argument.
+       (skip_language_trampoline): Add FRAME argument.  Pass it to
+       skip_trampoline callback.
+       * language.h: Add forward declaration of struct frame_info.
+       (struct language_defn): Add FRAME argument to skip_trampoline.
+       (skip_language_trampoline): Add FRAME argument.
+       * cp-abi.c (cplus_skip_trampoline): Add FRAME argument.  Pass it
+       to skip_trampoline callback.
+       * cp-abi.h: Add forward declaration of struct frame_info.
+       (cplus_skip_trampoline): Add FRAME argument.
+       (struct cp_abi_ops): Add FRAME argument to skip_trampoline callback.
+       * gnu-v3-abi.c (gnuv3_skip_trampoline): Add FRAME argument.  Pass it
+       to gdbarch_skip_trampoline_code.
+       * objc-lang.c (objc_skip_trampoline): Add FRAME argument.  Pass it
+       to gdbarch_skip_trampoline_code.
+
+       * minsyms.c (find_solib_trampoline_target): Add FRAME argument.
+       * symtab.h (find_solib_trampoline_target): Likewise.
+       * obsd-tdep.c (obsd_skip_solib_resolver): Pass current frame to
+       find_solib_trampoline_target.
+
+       * arm-tdep.c (arm_skip_stub): Add FRAME argument.  Read registers
+       from FRAME instead of calling read_register.
+
+       * hppa-hpux-tdep.c (hppa_hpux_skip_trampoline_code): Add FRAME
+       argument.  Read registers from FRAME instead of using read_register.
+       * hppa-tdep.c (hppa_skip_trampoline_code): Likewise.
+       * hppa-tdep.h (hppa_skip_trampoline_code): Add FRAME argument.
+
+       * i386-cygwin-tdep.c (i386_cygwin_skip_trampoline_code): Add FRAME
+       argument.
+
+       * m32c-tdep.c (m32c_skip_trampoline_code): Add FRAME argument.
+
+       * mips-tdep.c (mips_skip_trampoline_code): Add FRAME argument.  Read
+       registers from FRAME instead of using read_signed_register.
+
+       * ppc-linux-tdep.c (ppc_linux_skip_trampoline_code): Add FRAME
+       argument.
+       (ppc64_standard_linkage_target): Likewise.  Read registers from FRAME
+       instead of using read_register.
+       (ppc64_skip_trampoline_code): Add FRAME argument.  Pass it to
+       ppc64_standard_linkage_target.
+       * rs6000-tdep.c (rs6000_skip_trampoline_code): Add FRAME argument.
+       Pass it to find_solib_trampoline_target.  Read registers from FRAME
+       instead of using read_register.
+
+       * xstormy16-tdep.c (xstormy16_skip_trampoline_code): Add FRAME
+       argument.
+
 2007-06-15  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * gdbarch.sh (software_single_step): Replace REGCACHE argument by
        * spu-tdep.c (spu_software_single_step): Replace REGCACHE argument
        by FRAME.  Read registers from FRAME instead of REGCACHE.
 
-
 2007-06-15  Ulrich Weigand  <uweigand@de.ibm.com>
 
        * arm-tdep.c (arm_print_float_info): Use register value from FRAME
index 4a46e3535db05de767413ce2c9d5a672247c4ffd..50768e93d663d17e858c11e2965d03093f6596e5 100644 (file)
@@ -96,7 +96,7 @@ legacy_register_sim_regno (int regnum)
 }
 
 CORE_ADDR
-generic_skip_trampoline_code (CORE_ADDR pc)
+generic_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   return 0;
 }
index 625a37e6c8c257771c9c640d9938e668bb6dbf64..8520b33326c40221bed06869aad493ef0d5c52cb 100644 (file)
@@ -77,7 +77,8 @@ int cannot_register_not (int regnum);
 
 extern gdbarch_virtual_frame_pointer_ftype legacy_virtual_frame_pointer;
 
-extern CORE_ADDR generic_skip_trampoline_code (CORE_ADDR pc);
+extern CORE_ADDR generic_skip_trampoline_code (struct frame_info *frame,
+                                              CORE_ADDR pc);
 
 extern CORE_ADDR generic_skip_solib_resolver (struct gdbarch *gdbarch,
                                              CORE_ADDR pc);
index fc7c6bd20255e19a752881e8368740c79595a495..0935add6a13ec28ad63d9e5a06076c31c370e5af 100644 (file)
@@ -2380,7 +2380,7 @@ arm_in_call_stub (CORE_ADDR pc, char *name)
    are r0-r9, sl, fp, ip, sp, and lr.  */
 
 CORE_ADDR
-arm_skip_stub (CORE_ADDR pc)
+arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
 {
   char *name;
   CORE_ADDR start_addr;
@@ -2402,7 +2402,7 @@ arm_skip_stub (CORE_ADDR pc)
 
       for (regno = 0; regno <= 14; regno++)
        if (strcmp (&name[10], table[regno]) == 0)
-         return read_register (regno);
+         return get_frame_register_unsigned (frame, regno);
     }
 
   return 0;                    /* not a stub */
index 7bc15525977dd39a504675dfbff05c662cc222d6..2ca5a0bf637f0fb0b66d074b606125512c201fbb 100644 (file)
@@ -122,11 +122,11 @@ cplus_make_method_ptr (gdb_byte *contents, CORE_ADDR value, int is_virtual)
 }
 
 CORE_ADDR
-cplus_skip_trampoline (CORE_ADDR stop_pc)
+cplus_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
 {
   if (current_cp_abi.skip_trampoline == NULL)
     return 0;
-  return (*current_cp_abi.skip_trampoline) (stop_pc);
+  return (*current_cp_abi.skip_trampoline) (frame, stop_pc);
 }
 
 struct value *
index 91d89b340b01790678ce8a018fc9157534fdedf6..04c6a7d3603641a8c0a3b66fbcc490250768d6b7 100644 (file)
@@ -31,6 +31,7 @@ struct fn_field;
 struct type;
 struct value;
 struct ui_file;
+struct frame_info;
 
 /* The functions here that attempt to determine what sort of thing a
    mangled name refers to may well be revised in the future.  It would
@@ -173,7 +174,7 @@ void cplus_make_method_ptr (gdb_byte *CONTENTS, CORE_ADDR address,
 /* Determine if we are currently in a C++ thunk.  If so, get the address
    of the routine we are thunking to and continue to there instead.  */
 
-CORE_ADDR cplus_skip_trampoline (CORE_ADDR stop_pc);
+CORE_ADDR cplus_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc);
 
 struct cp_abi_ops
 {
@@ -197,7 +198,7 @@ struct cp_abi_ops
   int (*method_ptr_size) (void);
   void (*make_method_ptr) (gdb_byte *, CORE_ADDR, int);
   struct value * (*method_ptr_to_value) (struct value **, struct value *);
-  CORE_ADDR (*skip_trampoline) (CORE_ADDR);
+  CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR);
 };
 
 
index df7676684721f84c2b5194e43ccae220da5ac8fd..a7fa046abf9395218d3cc8bd8dae4bfcfd95e0c0 100644 (file)
@@ -2769,13 +2769,13 @@ set_gdbarch_print_insn (struct gdbarch *gdbarch,
 }
 
 CORE_ADDR
-gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, CORE_ADDR pc)
+gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, struct frame_info *frame, CORE_ADDR pc)
 {
   gdb_assert (gdbarch != NULL);
   gdb_assert (gdbarch->skip_trampoline_code != NULL);
   if (gdbarch_debug >= 2)
     fprintf_unfiltered (gdb_stdlog, "gdbarch_skip_trampoline_code called\n");
-  return gdbarch->skip_trampoline_code (pc);
+  return gdbarch->skip_trampoline_code (frame, pc);
 }
 
 void
index dcaf5eb44215253c509ba8b9f874cba282c97dc9..92fa95b55ba6903c6456ba21f7f21a86f3cafb1e 100644 (file)
@@ -734,8 +734,8 @@ extern void set_gdbarch_print_insn (struct gdbarch *gdbarch, gdbarch_print_insn_
 #define TARGET_PRINT_INSN(vma, info) (gdbarch_print_insn (current_gdbarch, vma, info))
 #endif
 
-typedef CORE_ADDR (gdbarch_skip_trampoline_code_ftype) (CORE_ADDR pc);
-extern CORE_ADDR gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, CORE_ADDR pc);
+typedef CORE_ADDR (gdbarch_skip_trampoline_code_ftype) (struct frame_info *frame, CORE_ADDR pc);
+extern CORE_ADDR gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, struct frame_info *frame, CORE_ADDR pc);
 extern void set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype *skip_trampoline_code);
 
 /* If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER
index 1f7d1506298630fb9642d2abd7500b8a1a8729c8..ee7669be7d680f634c42f7702c28b151af98b654 100755 (executable)
@@ -616,7 +616,7 @@ M::int:single_step_through_delay:struct frame_info *frame:frame
 # FIXME: cagney/2003-08-28: Need to find a better way of selecting the
 # disassembler.  Perhaps objdump can handle it?
 f:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, struct disassemble_info *info:vma, info::0:
-f::CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc::generic_skip_trampoline_code::0
+f::CORE_ADDR:skip_trampoline_code:struct frame_info *frame, CORE_ADDR pc:frame, pc::generic_skip_trampoline_code::0
 
 
 # If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER
index 0f9f420844ae56371cef89dda6bae636180f5c40..4914b4692cbb35c8d245544fb42924b5a610bd42 100644 (file)
@@ -679,14 +679,15 @@ gnuv3_method_ptr_to_value (struct value **this_p, struct value *method_ptr)
    of the routine we are thunking to and continue to there instead.  */
 
 static CORE_ADDR 
-gnuv3_skip_trampoline (CORE_ADDR stop_pc)
+gnuv3_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
 {
   CORE_ADDR real_stop_pc, method_stop_pc;
   struct minimal_symbol *thunk_sym, *fn_sym;
   struct obj_section *section;
   char *thunk_name, *fn_name;
   
-  real_stop_pc = gdbarch_skip_trampoline_code (current_gdbarch, stop_pc);
+  real_stop_pc = gdbarch_skip_trampoline_code
+                  (current_gdbarch, frame, stop_pc);
   if (real_stop_pc == 0)
     real_stop_pc = stop_pc;
 
@@ -710,7 +711,7 @@ gnuv3_skip_trampoline (CORE_ADDR stop_pc)
 
   method_stop_pc = SYMBOL_VALUE_ADDRESS (fn_sym);
   real_stop_pc = gdbarch_skip_trampoline_code
-                  (current_gdbarch, method_stop_pc);
+                  (current_gdbarch, frame, method_stop_pc);
   if (real_stop_pc == 0)
     real_stop_pc = method_stop_pc;
 
index 1510d87edc97dc05637a700d82ed041ddde1d381..195d90780458f02a71737f22e081f38db0c0360a 100644 (file)
@@ -299,7 +299,7 @@ hppa_hpux_in_solib_return_trampoline (CORE_ADDR pc, char *name)
    used in dynamic executables.  */
 
 static CORE_ADDR
-hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
+hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   long orig_pc = pc;
   long prev_inst, curr_inst, loc;
@@ -310,7 +310,7 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
      of the function.  So we may have to do something special.  */
   if (pc == hppa_symbol_address("$$dyncall"))
     {
-      pc = (CORE_ADDR) read_register (22);
+      pc = (CORE_ADDR) get_frame_register_unsigned (frame, 22);
 
       /* If bit 30 (counting from the left) is on, then pc is the address of
          the PLT entry for this function, not the address of the function
@@ -321,12 +321,12 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
     }
   if (pc == hppa_symbol_address("$$dyncall_external"))
     {
-      pc = (CORE_ADDR) read_register (22);
+      pc = (CORE_ADDR) get_frame_register_unsigned (frame, 22);
       pc = (CORE_ADDR) read_memory_integer
                         (pc & ~0x3, gdbarch_ptr_bit (current_gdbarch) / 8);
     }
   else if (pc == hppa_symbol_address("_sr4export"))
-    pc = (CORE_ADDR) (read_register (22));
+    pc = (CORE_ADDR) get_frame_register_unsigned (frame, 22);
 
   /* Get the unwind descriptor corresponding to PC, return zero
      if no unwind was found.  */
@@ -500,8 +500,11 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
          /* Yup.  See if the previous instruction loaded
             rp from sp - 8.  */
          if (prev_inst == 0x4bc23ff1)
-           return (read_memory_integer
-                   (read_register (HPPA_SP_REGNUM) - 8, 4)) & ~0x3;
+           {
+             CORE_ADDR sp;
+             sp = get_frame_register_unsigned (frame, HPPA_SP_REGNUM);
+             return read_memory_integer (sp - 8, 4) & ~0x3;
+           }
          else
            {
              warning (_("Unable to find restore of %%rp before bv (%%rp)."));
@@ -515,7 +518,7 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
       else if ((curr_inst & 0xffe0f000) == 0xe840d000)
        {
          return (read_memory_integer
-                 (read_register (HPPA_SP_REGNUM) - 24,
+                 (get_frame_register_unsigned (frame, HPPA_SP_REGNUM) - 24,
                   gdbarch_ptr_bit (current_gdbarch) / 8)) & ~0x3;
        }
 
@@ -528,7 +531,7 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
             I guess we could check for the previous instruction being
             mtsp %r1,%sr0 if we want to do sanity checking.  */
          return (read_memory_integer
-                 (read_register (HPPA_SP_REGNUM) - 24,
+                 (get_frame_register_unsigned (frame, HPPA_SP_REGNUM) - 24,
                   gdbarch_ptr_bit (current_gdbarch) / 8)) & ~0x3;
        }
 
index c46d977b5cb348d6af520758b904dd1a03dbd8e5..1810a6091c3fdd7602615b5f222d8568e4145e06 100644 (file)
@@ -2941,7 +2941,7 @@ hppa_in_solib_call_trampoline (CORE_ADDR pc, char *name)
    systems: $$dyncall, import stubs and PLT stubs.  */
 
 CORE_ADDR
-hppa_skip_trampoline_code (CORE_ADDR pc)
+hppa_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   unsigned int insn[HPPA_MAX_INSN_PATTERN_LEN];
   int dp_rel;
@@ -2949,7 +2949,7 @@ hppa_skip_trampoline_code (CORE_ADDR pc)
   /* $$dyncall handles both PLABELs and direct addresses.  */
   if (hppa_in_dyncall (pc))
     {
-      pc = read_register (HPPA_R0_REGNUM + 22);
+      pc = get_frame_register_unsigned (frame, HPPA_R0_REGNUM + 22);
 
       /* PLABELs have bit 30 set; if it's a PLABEL, then dereference it.  */
       if (pc & 0x2)
@@ -2965,9 +2965,9 @@ hppa_skip_trampoline_code (CORE_ADDR pc)
       pc = hppa_extract_21 (insn[0]) + hppa_extract_14 (insn[1]);
 
       if (dp_rel)
-        pc += read_register (HPPA_DP_REGNUM);
+        pc += get_frame_register_unsigned (frame, HPPA_DP_REGNUM);
       else
-        pc += read_register (HPPA_R0_REGNUM + 19);
+        pc += get_frame_register_unsigned (frame, HPPA_R0_REGNUM + 19);
 
       /* fallthrough */
     }
index 25fd2f333e1b98aca18b43394b5005acba8f6110..f469afc6571de0d573ea159c99a6670e60b78cf0 100644 (file)
@@ -246,6 +246,6 @@ extern struct hppa_objfile_private *
 hppa_init_objfile_priv_data (struct objfile *objfile);
 
 extern int hppa_in_solib_call_trampoline (CORE_ADDR pc, char *name);
-extern CORE_ADDR hppa_skip_trampoline_code (CORE_ADDR pc);
+extern CORE_ADDR hppa_skip_trampoline_code (struct frame_info *, CORE_ADDR pc);
 
 #endif  /* hppa-tdep.h */
index a444e5a7257df1b847920c464fdb91e3462173d9..a999d39a7a98069a813a75ee588af2db7157788f 100644 (file)
@@ -27,7 +27,7 @@
 #include "i386-tdep.h"
 
 static CORE_ADDR
-i386_cygwin_skip_trampoline_code (CORE_ADDR pc)
+i386_cygwin_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   return i386_pe_skip_trampoline_code (pc, NULL);
 }
index ae530b77e212115361e7b6e0991b91dd063176f8..1eea281ddb58a393c91bb7cd49a9eabeb71f3896 100644 (file)
@@ -2456,9 +2456,10 @@ process_event_stop_test:
          function.  That's what tells us (a) whether we want to step
          into it at all, and (b) what prologue we want to run to the
          end of, if we do step into it.  */
-      real_stop_pc = skip_language_trampoline (stop_pc);
+      real_stop_pc = skip_language_trampoline (get_current_frame (), stop_pc);
       if (real_stop_pc == 0)
-       real_stop_pc = gdbarch_skip_trampoline_code (current_gdbarch, stop_pc);
+       real_stop_pc = gdbarch_skip_trampoline_code
+                        (current_gdbarch, get_current_frame (), stop_pc);
       if (real_stop_pc != 0)
        ecs->stop_func_start = real_stop_pc;
 
@@ -2520,8 +2521,9 @@ process_event_stop_test:
                                          stop_pc, ecs->stop_func_name))
     {
       /* Determine where this trampoline returns.  */
-      CORE_ADDR real_stop_pc = gdbarch_skip_trampoline_code
-                                (current_gdbarch, stop_pc);
+      CORE_ADDR real_stop_pc;
+      real_stop_pc = gdbarch_skip_trampoline_code
+                      (current_gdbarch, get_current_frame (), stop_pc);
 
       if (debug_infrun)
         fprintf_unfiltered (gdb_stdlog, "infrun: stepped into solib return tramp\n");
index d1efac7b3e88b35227c6d041e83577b66ce9aaed..16e385155f70c2172f96123e7e9d74d7ae621179 100644 (file)
@@ -77,7 +77,7 @@ static void unk_lang_print_type (struct type *, char *, struct ui_file *,
 
 static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint);
 
-static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc);
+static CORE_ADDR unk_lang_trampoline (struct frame_info *, CORE_ADDR pc);
 
 /* Forward declaration */
 extern const struct language_defn unknown_language_defn;
@@ -1005,7 +1005,7 @@ add_language (const struct language_defn *lang)
    Return the result from the first that returns non-zero, or 0 if all
    `fail'.  */
 CORE_ADDR 
-skip_language_trampoline (CORE_ADDR pc)
+skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
 {
   int i;
 
@@ -1013,7 +1013,7 @@ skip_language_trampoline (CORE_ADDR pc)
     {
       if (languages[i]->skip_trampoline)
        {
-         CORE_ADDR real_pc = (languages[i]->skip_trampoline) (pc);
+         CORE_ADDR real_pc = (languages[i]->skip_trampoline) (frame, pc);
          if (real_pc)
            return real_pc;
        }
@@ -1130,7 +1130,7 @@ unk_lang_value_print (struct value *val, struct ui_file *stream, int format,
   error (_("internal error - unimplemented function unk_lang_value_print called."));
 }
 
-static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc)
+static CORE_ADDR unk_lang_trampoline (struct frame_info *frame, CORE_ADDR pc)
 {
   return 0;
 }
index b40f855445c90de3af7d57bac7e855b0549c1bc1..f81064358eca6d9177a4bf9be170bd493d3f3c67 100644 (file)
@@ -29,6 +29,7 @@
 /* Forward decls for prototypes */
 struct value;
 struct objfile;
+struct frame_info;
 struct expression;
 struct ui_file;
 
@@ -221,7 +222,7 @@ struct language_defn
        If that PC falls in a trampoline belonging to this language,
        return the address of the first pc in the real function, or 0
        if it isn't a language tramp for this language.  */
-    CORE_ADDR (*skip_trampoline) (CORE_ADDR pc);
+    CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR);
 
     /* Now come some hooks for lookup_symbol.  */
 
@@ -453,7 +454,7 @@ extern enum language get_frame_language (void);     /* In stack.c */
 
 /* Check for a language-specific trampoline. */
 
-extern CORE_ADDR skip_language_trampoline (CORE_ADDR pc);
+extern CORE_ADDR skip_language_trampoline (struct frame_info *, CORE_ADDR pc);
 
 /* Return demangled language symbol, or NULL.  */
 extern char *language_demangle (const struct language_defn *current_language, 
index 02b0541af883cb918742d6a3a621191a7db1fdb0..d66e0d9554a26da755b4259d7eaf73e2c280e7f0 100644 (file)
@@ -2332,7 +2332,7 @@ m32c_return_value (struct gdbarch *gdbarch,
    code sequence seems more fragile.  */
 
 static CORE_ADDR
-m32c_skip_trampoline_code (CORE_ADDR stop_pc)
+m32c_skip_trampoline_code (struct frame_info *frame, CORE_ADDR stop_pc)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
 
index e4b0356b868f1addd18350369eb2dab420f08e91..45f0c2f301b8f5bece1e725ec0c01401088fbe72 100644 (file)
@@ -1047,7 +1047,7 @@ lookup_solib_trampoline_symbol_by_pc (CORE_ADDR pc)
    a duplicate function in case this matters someday.  */
 
 CORE_ADDR
-find_solib_trampoline_target (CORE_ADDR pc)
+find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
 {
   struct objfile *objfile;
   struct minimal_symbol *msymbol;
index dfa10ab460935a6ace25628eecbd635ca0d2c0b6..da46b35208a81a3b2ef68f9246cf8add9ce3d8e5 100644 (file)
@@ -4603,7 +4603,7 @@ mips_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
    gory details.  */
 
 static CORE_ADDR
-mips_skip_trampoline_code (CORE_ADDR pc)
+mips_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   char *name;
   CORE_ADDR start_addr;
@@ -4616,14 +4616,14 @@ mips_skip_trampoline_code (CORE_ADDR pc)
      target PC is in $31 ($ra).  */
   if (strcmp (name, "__mips16_ret_sf") == 0
       || strcmp (name, "__mips16_ret_df") == 0)
-    return read_signed_register (MIPS_RA_REGNUM);
+    return get_frame_register_signed (frame, MIPS_RA_REGNUM);
 
   if (strncmp (name, "__mips16_call_stub_", 19) == 0)
     {
       /* If the PC is in __mips16_call_stub_{1..10}, this is a call stub
          and the target PC is in $2.  */
       if (name[19] >= '0' && name[19] <= '9')
-       return read_signed_register (2);
+       return get_frame_register_signed (frame, 2);
 
       /* If the PC at the start of __mips16_call_stub_{s,d}f_{0..10}, i.e.
          before the jal instruction, this is effectively a call stub
@@ -4645,7 +4645,7 @@ mips_skip_trampoline_code (CORE_ADDR pc)
                 So scan down to the lui/addi and extract the target
                 address from those two instructions.  */
 
-             CORE_ADDR target_pc = read_signed_register (2);
+             CORE_ADDR target_pc = get_frame_register_signed (frame, 2);
              ULONGEST inst;
              int i;
 
@@ -4676,7 +4676,7 @@ mips_skip_trampoline_code (CORE_ADDR pc)
          else
            /* This is the 'return' part of a call stub.  The return
               address is in $r18.  */
-           return read_signed_register (18);
+           return get_frame_register_signed (frame, 18);
        }
     }
   return 0;                    /* not a stub */
index 5ab4bb2433e51bcbc0832db8727c67bf31191a8b..2567ed2b3095d7b247ce9ba09ab785985c8b7d9c 100644 (file)
@@ -576,12 +576,13 @@ objc_create_fundamental_type (struct objfile *objfile, int typeid)
    for the user since they are only interested in stepping into the
    method function anyway.  */
 static CORE_ADDR 
-objc_skip_trampoline (CORE_ADDR stop_pc)
+objc_skip_trampoline (struct frame_info *frame, CORE_ADDR stop_pc)
 {
   CORE_ADDR real_stop_pc;
   CORE_ADDR method_stop_pc;
   
-  real_stop_pc = gdbarch_skip_trampoline_code (current_gdbarch, stop_pc);
+  real_stop_pc = gdbarch_skip_trampoline_code
+                  (current_gdbarch, frame, stop_pc);
 
   if (real_stop_pc != 0)
     find_objc_msgcall (real_stop_pc, &method_stop_pc);
@@ -591,7 +592,7 @@ objc_skip_trampoline (CORE_ADDR stop_pc)
   if (method_stop_pc)
     {
       real_stop_pc = gdbarch_skip_trampoline_code
-                      (current_gdbarch, method_stop_pc);
+                      (current_gdbarch, frame, method_stop_pc);
       if (real_stop_pc == 0)
        real_stop_pc = method_stop_pc;
     }
index 7fd6d2f5c7b317cf15952d30c8b6ec4165275d27..22477824280bf60f47e5786815bb093dcae25fb0 100644 (file)
@@ -34,5 +34,5 @@ obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
   if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
     return frame_pc_unwind (get_current_frame ());
   else
-    return find_solib_trampoline_target (pc);
+    return find_solib_trampoline_target (get_current_frame (), pc);
 }
index 9eff5b0f71a695b428398c4ae4b13088cde92cc8..5834b6d2de4513335b708665c3d77f310821333a 100644 (file)
@@ -86,7 +86,7 @@
 
 
 static CORE_ADDR
-ppc_linux_skip_trampoline_code (CORE_ADDR pc)
+ppc_linux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   gdb_byte buf[4];
   struct obj_section *sect;
@@ -557,14 +557,16 @@ static struct insn_pattern ppc64_standard_linkage[] =
    standard linkage function will send them.  (This doesn't deal with
    dynamic linker lazy symbol resolution stubs.)  */
 static CORE_ADDR
-ppc64_standard_linkage_target (CORE_ADDR pc, unsigned int *insn)
+ppc64_standard_linkage_target (struct frame_info *frame,
+                              CORE_ADDR pc, unsigned int *insn)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (frame));
 
   /* The address of the function descriptor this linkage function
      references.  */
   CORE_ADDR desc
-    = ((CORE_ADDR) read_register (tdep->ppc_gp0_regnum + 2)
+    = ((CORE_ADDR) get_frame_register_unsigned (frame,
+                                               tdep->ppc_gp0_regnum + 2)
        + (insn_d_field (insn[0]) << 16)
        + insn_ds_field (insn[2]));
 
@@ -576,13 +578,14 @@ ppc64_standard_linkage_target (CORE_ADDR pc, unsigned int *insn)
 /* Given that we've begun executing a call trampoline at PC, return
    the entry point of the function the trampoline will go to.  */
 static CORE_ADDR
-ppc64_skip_trampoline_code (CORE_ADDR pc)
+ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   unsigned int ppc64_standard_linkage_insn[PPC64_STANDARD_LINKAGE_LEN];
 
   if (insns_match_pattern (pc, ppc64_standard_linkage,
                            ppc64_standard_linkage_insn))
-    return ppc64_standard_linkage_target (pc, ppc64_standard_linkage_insn);
+    return ppc64_standard_linkage_target (frame, pc,
+                                         ppc64_standard_linkage_insn);
   else
     return 0;
 }
index 20d76cf9ff8e05999bcd81c149792b614ed93323..8e80837190770d80cf922ee7d20054e68a33f13e 100644 (file)
@@ -1972,7 +1972,7 @@ rs6000_in_solib_return_trampoline (CORE_ADDR pc, char *name)
    code that should be skipped.  */
 
 CORE_ADDR
-rs6000_skip_trampoline_code (CORE_ADDR pc)
+rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   unsigned int ii, op;
   int rel;
@@ -2009,7 +2009,7 @@ rs6000_skip_trampoline_code (CORE_ADDR pc)
     }
 
   /* If pc is in a shared library trampoline, return its target.  */
-  solib_target_pc = find_solib_trampoline_target (pc);
+  solib_target_pc = find_solib_trampoline_target (frame, pc);
   if (solib_target_pc)
     return solib_target_pc;
 
@@ -2019,7 +2019,7 @@ rs6000_skip_trampoline_code (CORE_ADDR pc)
       if (op != trampoline_code[ii])
        return 0;
     }
-  ii = read_register (11);     /* r11 holds destination addr   */
+  ii = get_frame_register_unsigned (frame, 11);        /* r11 holds destination addr   */
   pc = read_memory_addr (ii, gdbarch_tdep (current_gdbarch)->wordsize); /* (r11) value */
   return pc;
 }
index c0a83a914b84311de0b8c64edbb444974619e4ab..db6a0a9d71cd70ccfb3ea9c1d811ab936d277065 100644 (file)
@@ -1191,7 +1191,7 @@ extern struct minimal_symbol *lookup_minimal_symbol_by_pc_section (CORE_ADDR,
 extern struct minimal_symbol
   *lookup_solib_trampoline_symbol_by_pc (CORE_ADDR);
 
-extern CORE_ADDR find_solib_trampoline_target (CORE_ADDR);
+extern CORE_ADDR find_solib_trampoline_target (struct frame_info *, CORE_ADDR);
 
 extern void init_minimal_symbol_collection (void);
 
index e03498fc6c1bd50e55362fe6f22a0737c207a041..a4de0e90ae5d4e084f946e5f1a0a0ccc7a7900c2 100644 (file)
@@ -573,7 +573,7 @@ xstormy16_find_jmp_table_entry (CORE_ADDR faddr)
 }
 
 static CORE_ADDR
-xstormy16_skip_trampoline_code (CORE_ADDR pc)
+xstormy16_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
 {
   CORE_ADDR tmp = xstormy16_resolve_jmp_table_entry (pc);