* 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:
parent
0b1b3e423a
commit
52f729a724
26 changed files with 134 additions and 63 deletions
|
@ -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
|
||||
|
@ -65,7 +124,6 @@
|
|||
* 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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
10
gdb/infrun.c
10
gdb/infrun.c
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue