* 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.
This commit is contained in:
Ulrich Weigand
2007-06-15 22:39:52 +00:00
parent 0b1b3e423a
commit 52f729a724
26 changed files with 134 additions and 63 deletions

View 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> 2007-06-15 Ulrich Weigand <uweigand@de.ibm.com>
* gdbarch.sh (software_single_step): Replace REGCACHE argument by * gdbarch.sh (software_single_step): Replace REGCACHE argument by
@ -65,7 +124,6 @@
* spu-tdep.c (spu_software_single_step): Replace REGCACHE argument * spu-tdep.c (spu_software_single_step): Replace REGCACHE argument
by FRAME. Read registers from FRAME instead of REGCACHE. by FRAME. Read registers from FRAME instead of REGCACHE.
2007-06-15 Ulrich Weigand <uweigand@de.ibm.com> 2007-06-15 Ulrich Weigand <uweigand@de.ibm.com>
* arm-tdep.c (arm_print_float_info): Use register value from FRAME * arm-tdep.c (arm_print_float_info): Use register value from FRAME

View File

@ -96,7 +96,7 @@ legacy_register_sim_regno (int regnum)
} }
CORE_ADDR CORE_ADDR
generic_skip_trampoline_code (CORE_ADDR pc) generic_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
{ {
return 0; return 0;
} }

View File

@ -77,7 +77,8 @@ int cannot_register_not (int regnum);
extern gdbarch_virtual_frame_pointer_ftype legacy_virtual_frame_pointer; 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, extern CORE_ADDR generic_skip_solib_resolver (struct gdbarch *gdbarch,
CORE_ADDR pc); CORE_ADDR pc);

View File

@ -2380,7 +2380,7 @@ arm_in_call_stub (CORE_ADDR pc, char *name)
are r0-r9, sl, fp, ip, sp, and lr. */ are r0-r9, sl, fp, ip, sp, and lr. */
CORE_ADDR CORE_ADDR
arm_skip_stub (CORE_ADDR pc) arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
{ {
char *name; char *name;
CORE_ADDR start_addr; CORE_ADDR start_addr;
@ -2402,7 +2402,7 @@ arm_skip_stub (CORE_ADDR pc)
for (regno = 0; regno <= 14; regno++) for (regno = 0; regno <= 14; regno++)
if (strcmp (&name[10], table[regno]) == 0) if (strcmp (&name[10], table[regno]) == 0)
return read_register (regno); return get_frame_register_unsigned (frame, regno);
} }
return 0; /* not a stub */ return 0; /* not a stub */

View File

@ -122,11 +122,11 @@ cplus_make_method_ptr (gdb_byte *contents, CORE_ADDR value, int is_virtual)
} }
CORE_ADDR 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) if (current_cp_abi.skip_trampoline == NULL)
return 0; return 0;
return (*current_cp_abi.skip_trampoline) (stop_pc); return (*current_cp_abi.skip_trampoline) (frame, stop_pc);
} }
struct value * struct value *

View File

@ -31,6 +31,7 @@ struct fn_field;
struct type; struct type;
struct value; struct value;
struct ui_file; struct ui_file;
struct frame_info;
/* The functions here that attempt to determine what sort of thing a /* 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 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 /* 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. */ 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 struct cp_abi_ops
{ {
@ -197,7 +198,7 @@ struct cp_abi_ops
int (*method_ptr_size) (void); int (*method_ptr_size) (void);
void (*make_method_ptr) (gdb_byte *, CORE_ADDR, int); void (*make_method_ptr) (gdb_byte *, CORE_ADDR, int);
struct value * (*method_ptr_to_value) (struct value **, struct value *); 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);
}; };

View File

@ -2769,13 +2769,13 @@ set_gdbarch_print_insn (struct gdbarch *gdbarch,
} }
CORE_ADDR 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 != NULL);
gdb_assert (gdbarch->skip_trampoline_code != NULL); gdb_assert (gdbarch->skip_trampoline_code != NULL);
if (gdbarch_debug >= 2) if (gdbarch_debug >= 2)
fprintf_unfiltered (gdb_stdlog, "gdbarch_skip_trampoline_code called\n"); fprintf_unfiltered (gdb_stdlog, "gdbarch_skip_trampoline_code called\n");
return gdbarch->skip_trampoline_code (pc); return gdbarch->skip_trampoline_code (frame, pc);
} }
void void

View 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)) #define TARGET_PRINT_INSN(vma, info) (gdbarch_print_insn (current_gdbarch, vma, info))
#endif #endif
typedef CORE_ADDR (gdbarch_skip_trampoline_code_ftype) (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, 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); 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 /* If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER

View File

@ -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 # FIXME: cagney/2003-08-28: Need to find a better way of selecting the
# disassembler. Perhaps objdump can handle it? # disassembler. Perhaps objdump can handle it?
f:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, struct disassemble_info *info:vma, info::0: 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 # If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER

View 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. */ of the routine we are thunking to and continue to there instead. */
static CORE_ADDR 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; CORE_ADDR real_stop_pc, method_stop_pc;
struct minimal_symbol *thunk_sym, *fn_sym; struct minimal_symbol *thunk_sym, *fn_sym;
struct obj_section *section; struct obj_section *section;
char *thunk_name, *fn_name; 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) if (real_stop_pc == 0)
real_stop_pc = stop_pc; real_stop_pc = stop_pc;
@ -710,7 +711,7 @@ gnuv3_skip_trampoline (CORE_ADDR stop_pc)
method_stop_pc = SYMBOL_VALUE_ADDRESS (fn_sym); method_stop_pc = SYMBOL_VALUE_ADDRESS (fn_sym);
real_stop_pc = gdbarch_skip_trampoline_code real_stop_pc = gdbarch_skip_trampoline_code
(current_gdbarch, method_stop_pc); (current_gdbarch, frame, method_stop_pc);
if (real_stop_pc == 0) if (real_stop_pc == 0)
real_stop_pc = method_stop_pc; real_stop_pc = method_stop_pc;

View File

@ -299,7 +299,7 @@ hppa_hpux_in_solib_return_trampoline (CORE_ADDR pc, char *name)
used in dynamic executables. */ used in dynamic executables. */
static CORE_ADDR 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 orig_pc = pc;
long prev_inst, curr_inst, loc; 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. */ of the function. So we may have to do something special. */
if (pc == hppa_symbol_address("$$dyncall")) 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 /* 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 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")) 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 = (CORE_ADDR) read_memory_integer
(pc & ~0x3, gdbarch_ptr_bit (current_gdbarch) / 8); (pc & ~0x3, gdbarch_ptr_bit (current_gdbarch) / 8);
} }
else if (pc == hppa_symbol_address("_sr4export")) 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 /* Get the unwind descriptor corresponding to PC, return zero
if no unwind was found. */ if no unwind was found. */
@ -500,8 +500,11 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
/* Yup. See if the previous instruction loaded /* Yup. See if the previous instruction loaded
rp from sp - 8. */ rp from sp - 8. */
if (prev_inst == 0x4bc23ff1) 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 else
{ {
warning (_("Unable to find restore of %%rp before bv (%%rp).")); 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) else if ((curr_inst & 0xffe0f000) == 0xe840d000)
{ {
return (read_memory_integer 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; 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 I guess we could check for the previous instruction being
mtsp %r1,%sr0 if we want to do sanity checking. */ mtsp %r1,%sr0 if we want to do sanity checking. */
return (read_memory_integer 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; gdbarch_ptr_bit (current_gdbarch) / 8)) & ~0x3;
} }

View File

@ -2941,7 +2941,7 @@ hppa_in_solib_call_trampoline (CORE_ADDR pc, char *name)
systems: $$dyncall, import stubs and PLT stubs. */ systems: $$dyncall, import stubs and PLT stubs. */
CORE_ADDR 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]; unsigned int insn[HPPA_MAX_INSN_PATTERN_LEN];
int dp_rel; int dp_rel;
@ -2949,7 +2949,7 @@ hppa_skip_trampoline_code (CORE_ADDR pc)
/* $$dyncall handles both PLABELs and direct addresses. */ /* $$dyncall handles both PLABELs and direct addresses. */
if (hppa_in_dyncall (pc)) 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. */ /* PLABELs have bit 30 set; if it's a PLABEL, then dereference it. */
if (pc & 0x2) 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]); pc = hppa_extract_21 (insn[0]) + hppa_extract_14 (insn[1]);
if (dp_rel) if (dp_rel)
pc += read_register (HPPA_DP_REGNUM); pc += get_frame_register_unsigned (frame, HPPA_DP_REGNUM);
else else
pc += read_register (HPPA_R0_REGNUM + 19); pc += get_frame_register_unsigned (frame, HPPA_R0_REGNUM + 19);
/* fallthrough */ /* fallthrough */
} }

View File

@ -246,6 +246,6 @@ extern struct hppa_objfile_private *
hppa_init_objfile_priv_data (struct objfile *objfile); hppa_init_objfile_priv_data (struct objfile *objfile);
extern int hppa_in_solib_call_trampoline (CORE_ADDR pc, char *name); 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 */ #endif /* hppa-tdep.h */

View File

@ -27,7 +27,7 @@
#include "i386-tdep.h" #include "i386-tdep.h"
static CORE_ADDR 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); return i386_pe_skip_trampoline_code (pc, NULL);
} }

View File

@ -2456,9 +2456,10 @@ process_event_stop_test:
function. That's what tells us (a) whether we want to step 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 into it at all, and (b) what prologue we want to run to the
end of, if we do step into it. */ 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) 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) if (real_stop_pc != 0)
ecs->stop_func_start = real_stop_pc; ecs->stop_func_start = real_stop_pc;
@ -2520,8 +2521,9 @@ process_event_stop_test:
stop_pc, ecs->stop_func_name)) stop_pc, ecs->stop_func_name))
{ {
/* Determine where this trampoline returns. */ /* Determine where this trampoline returns. */
CORE_ADDR real_stop_pc = gdbarch_skip_trampoline_code CORE_ADDR real_stop_pc;
(current_gdbarch, stop_pc); real_stop_pc = gdbarch_skip_trampoline_code
(current_gdbarch, get_current_frame (), stop_pc);
if (debug_infrun) if (debug_infrun)
fprintf_unfiltered (gdb_stdlog, "infrun: stepped into solib return tramp\n"); fprintf_unfiltered (gdb_stdlog, "infrun: stepped into solib return tramp\n");

View 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 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 */ /* Forward declaration */
extern const struct language_defn unknown_language_defn; 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 Return the result from the first that returns non-zero, or 0 if all
`fail'. */ `fail'. */
CORE_ADDR CORE_ADDR
skip_language_trampoline (CORE_ADDR pc) skip_language_trampoline (struct frame_info *frame, CORE_ADDR pc)
{ {
int i; int i;
@ -1013,7 +1013,7 @@ skip_language_trampoline (CORE_ADDR pc)
{ {
if (languages[i]->skip_trampoline) 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) if (real_pc)
return 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.")); 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; return 0;
} }

View File

@ -29,6 +29,7 @@
/* Forward decls for prototypes */ /* Forward decls for prototypes */
struct value; struct value;
struct objfile; struct objfile;
struct frame_info;
struct expression; struct expression;
struct ui_file; struct ui_file;
@ -221,7 +222,7 @@ struct language_defn
If that PC falls in a trampoline belonging to this language, If that PC falls in a trampoline belonging to this language,
return the address of the first pc in the real function, or 0 return the address of the first pc in the real function, or 0
if it isn't a language tramp for this language. */ 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. */ /* 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. */ /* 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. */ /* Return demangled language symbol, or NULL. */
extern char *language_demangle (const struct language_defn *current_language, extern char *language_demangle (const struct language_defn *current_language,

View File

@ -2332,7 +2332,7 @@ m32c_return_value (struct gdbarch *gdbarch,
code sequence seems more fragile. */ code sequence seems more fragile. */
static CORE_ADDR 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); struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);

View File

@ -1047,7 +1047,7 @@ lookup_solib_trampoline_symbol_by_pc (CORE_ADDR pc)
a duplicate function in case this matters someday. */ a duplicate function in case this matters someday. */
CORE_ADDR CORE_ADDR
find_solib_trampoline_target (CORE_ADDR pc) find_solib_trampoline_target (struct frame_info *frame, CORE_ADDR pc)
{ {
struct objfile *objfile; struct objfile *objfile;
struct minimal_symbol *msymbol; struct minimal_symbol *msymbol;

View File

@ -4603,7 +4603,7 @@ mips_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
gory details. */ gory details. */
static CORE_ADDR static CORE_ADDR
mips_skip_trampoline_code (CORE_ADDR pc) mips_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
{ {
char *name; char *name;
CORE_ADDR start_addr; CORE_ADDR start_addr;
@ -4616,14 +4616,14 @@ mips_skip_trampoline_code (CORE_ADDR pc)
target PC is in $31 ($ra). */ target PC is in $31 ($ra). */
if (strcmp (name, "__mips16_ret_sf") == 0 if (strcmp (name, "__mips16_ret_sf") == 0
|| strcmp (name, "__mips16_ret_df") == 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 (strncmp (name, "__mips16_call_stub_", 19) == 0)
{ {
/* If the PC is in __mips16_call_stub_{1..10}, this is a call stub /* If the PC is in __mips16_call_stub_{1..10}, this is a call stub
and the target PC is in $2. */ and the target PC is in $2. */
if (name[19] >= '0' && name[19] <= '9') 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. /* 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 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 So scan down to the lui/addi and extract the target
address from those two instructions. */ 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; ULONGEST inst;
int i; int i;
@ -4676,7 +4676,7 @@ mips_skip_trampoline_code (CORE_ADDR pc)
else else
/* This is the 'return' part of a call stub. The return /* This is the 'return' part of a call stub. The return
address is in $r18. */ address is in $r18. */
return read_signed_register (18); return get_frame_register_signed (frame, 18);
} }
} }
return 0; /* not a stub */ return 0; /* not a stub */

View 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 for the user since they are only interested in stepping into the
method function anyway. */ method function anyway. */
static CORE_ADDR 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 real_stop_pc;
CORE_ADDR method_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) if (real_stop_pc != 0)
find_objc_msgcall (real_stop_pc, &method_stop_pc); find_objc_msgcall (real_stop_pc, &method_stop_pc);
@ -591,7 +592,7 @@ objc_skip_trampoline (CORE_ADDR stop_pc)
if (method_stop_pc) if (method_stop_pc)
{ {
real_stop_pc = gdbarch_skip_trampoline_code real_stop_pc = gdbarch_skip_trampoline_code
(current_gdbarch, method_stop_pc); (current_gdbarch, frame, method_stop_pc);
if (real_stop_pc == 0) if (real_stop_pc == 0)
real_stop_pc = method_stop_pc; real_stop_pc = method_stop_pc;
} }

View File

@ -34,5 +34,5 @@ obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc) if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
return frame_pc_unwind (get_current_frame ()); return frame_pc_unwind (get_current_frame ());
else else
return find_solib_trampoline_target (pc); return find_solib_trampoline_target (get_current_frame (), pc);
} }

View File

@ -86,7 +86,7 @@
static CORE_ADDR 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]; gdb_byte buf[4];
struct obj_section *sect; 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 standard linkage function will send them. (This doesn't deal with
dynamic linker lazy symbol resolution stubs.) */ dynamic linker lazy symbol resolution stubs.) */
static CORE_ADDR 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 /* The address of the function descriptor this linkage function
references. */ references. */
CORE_ADDR desc 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_d_field (insn[0]) << 16)
+ insn_ds_field (insn[2])); + 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 /* Given that we've begun executing a call trampoline at PC, return
the entry point of the function the trampoline will go to. */ the entry point of the function the trampoline will go to. */
static CORE_ADDR 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]; unsigned int ppc64_standard_linkage_insn[PPC64_STANDARD_LINKAGE_LEN];
if (insns_match_pattern (pc, ppc64_standard_linkage, if (insns_match_pattern (pc, ppc64_standard_linkage,
ppc64_standard_linkage_insn)) 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 else
return 0; return 0;
} }

View File

@ -1972,7 +1972,7 @@ rs6000_in_solib_return_trampoline (CORE_ADDR pc, char *name)
code that should be skipped. */ code that should be skipped. */
CORE_ADDR CORE_ADDR
rs6000_skip_trampoline_code (CORE_ADDR pc) rs6000_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc)
{ {
unsigned int ii, op; unsigned int ii, op;
int rel; int rel;
@ -2009,7 +2009,7 @@ rs6000_skip_trampoline_code (CORE_ADDR pc)
} }
/* If pc is in a shared library trampoline, return its target. */ /* 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) if (solib_target_pc)
return solib_target_pc; return solib_target_pc;
@ -2019,7 +2019,7 @@ rs6000_skip_trampoline_code (CORE_ADDR pc)
if (op != trampoline_code[ii]) if (op != trampoline_code[ii])
return 0; 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 */ pc = read_memory_addr (ii, gdbarch_tdep (current_gdbarch)->wordsize); /* (r11) value */
return pc; return pc;
} }

View File

@ -1191,7 +1191,7 @@ extern struct minimal_symbol *lookup_minimal_symbol_by_pc_section (CORE_ADDR,
extern struct minimal_symbol extern struct minimal_symbol
*lookup_solib_trampoline_symbol_by_pc (CORE_ADDR); *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); extern void init_minimal_symbol_collection (void);

View File

@ -573,7 +573,7 @@ xstormy16_find_jmp_table_entry (CORE_ADDR faddr)
} }
static CORE_ADDR 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); CORE_ADDR tmp = xstormy16_resolve_jmp_table_entry (pc);