mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
* arch-utils.h: Update copyright.
* gdbarch.sh (PC_IN_SIGTRAMP): Add. * gdbarch.h, gdbarch.c: Re-generate. * inferior.h (IN_SIGTRAMP): Delete definition. * arch-utils.c (legacy_pc_in_sigtramp): New function. * arch-utils.h (legacy_pc_in_sigtramp): Declare. * mips-tdep.c (mips_init_extra_frame_info): Use PC_IN_SIGTRAMP. (mips_dump_tdep): Do not print value of IN_SIGTRAMP. * hppa-tdep.c (pc_in_interrupt_handler): Use PC_IN_SIGTRAMP. (find_proc_framesize): Ditto. * alpha-tdep.c (alpha_osf_skip_sigtramp_frame): Ditto. (alpha_init_extra_frame_info): Ditto. * infrun.c (handle_inferior_event): Ditto. (handle_inferior_event): Ditto. (check_sigtramp2): Ditto. * blockframe.c (create_new_frame): Ditto. (get_prev_frame): Ditto. * ppc-linux-tdep.c: Update comments. * i386-linux-tdep.c: Update comments. * breakpoint.c (bpstat_what): Update comment. * gdbint.texinfo (Target Architecture Definition): Replace IN_SIGTRAMP with PC_IN_SIGTRAMP.
This commit is contained in:
parent
d06f167ab3
commit
d7bd68ca3c
@ -1,3 +1,29 @@
|
||||
2002-04-24 Andrew Cagney <ac131313@redhat.com>
|
||||
|
||||
* arch-utils.h: Update copyright.
|
||||
|
||||
* gdbarch.sh (PC_IN_SIGTRAMP): Add.
|
||||
* gdbarch.h, gdbarch.c: Re-generate.
|
||||
|
||||
* inferior.h (IN_SIGTRAMP): Delete definition.
|
||||
* arch-utils.c (legacy_pc_in_sigtramp): New function.
|
||||
* arch-utils.h (legacy_pc_in_sigtramp): Declare.
|
||||
|
||||
* mips-tdep.c (mips_init_extra_frame_info): Use PC_IN_SIGTRAMP.
|
||||
(mips_dump_tdep): Do not print value of IN_SIGTRAMP.
|
||||
* hppa-tdep.c (pc_in_interrupt_handler): Use PC_IN_SIGTRAMP.
|
||||
(find_proc_framesize): Ditto.
|
||||
* alpha-tdep.c (alpha_osf_skip_sigtramp_frame): Ditto.
|
||||
(alpha_init_extra_frame_info): Ditto.
|
||||
* infrun.c (handle_inferior_event): Ditto.
|
||||
(handle_inferior_event): Ditto.
|
||||
(check_sigtramp2): Ditto.
|
||||
* blockframe.c (create_new_frame): Ditto.
|
||||
(get_prev_frame): Ditto.
|
||||
* ppc-linux-tdep.c: Update comments.
|
||||
* i386-linux-tdep.c: Update comments.
|
||||
* breakpoint.c (bpstat_what): Update comment.
|
||||
|
||||
2002-04-24 Michal Ludvig <mludvig@suse.cz>
|
||||
|
||||
* gdbserver/linux-low.c (regsets_fetch_inferior_registers),
|
||||
|
@ -208,7 +208,7 @@ alpha_osf_skip_sigtramp_frame (struct frame_info *frame, CORE_ADDR pc)
|
||||
{
|
||||
char *name;
|
||||
find_pc_partial_function (pc, &name, (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
|
||||
if (IN_SIGTRAMP (pc, name))
|
||||
if (PC_IN_SIGTRAMP (pc, name))
|
||||
return frame->frame;
|
||||
else
|
||||
return 0;
|
||||
@ -991,7 +991,7 @@ alpha_init_extra_frame_info (int fromleaf, struct frame_info *frame)
|
||||
We can't use frame->signal_handler_caller, it is not yet set. */
|
||||
find_pc_partial_function (frame->pc, &name,
|
||||
(CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
|
||||
if (!IN_SIGTRAMP (frame->pc, name))
|
||||
if (!PC_IN_SIGTRAMP (frame->pc, name))
|
||||
{
|
||||
frame->saved_regs = (CORE_ADDR *)
|
||||
frame_obstack_alloc (SIZEOF_FRAME_SAVED_REGS);
|
||||
|
@ -419,6 +419,24 @@ generic_register_virtual_size (int regnum)
|
||||
return TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (regnum));
|
||||
}
|
||||
|
||||
#if !defined (IN_SIGTRAMP)
|
||||
#if defined (SIGTRAMP_START)
|
||||
#define IN_SIGTRAMP(pc, name) \
|
||||
((pc) >= SIGTRAMP_START(pc) \
|
||||
&& (pc) < SIGTRAMP_END(pc) \
|
||||
)
|
||||
#else
|
||||
#define IN_SIGTRAMP(pc, name) \
|
||||
(name && STREQ ("_sigtramp", name))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int
|
||||
legacy_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
return IN_SIGTRAMP(pc, name);
|
||||
}
|
||||
|
||||
|
||||
/* Functions to manipulate the endianness of the target. */
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
/* Dynamic architecture support for GDB, the GNU debugger.
|
||||
Copyright 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||
|
||||
Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
@ -156,6 +157,9 @@ extern int generic_register_raw_size (int regnum);
|
||||
|
||||
extern int generic_register_virtual_size (int regnum);
|
||||
|
||||
/* Prop up old targets that use various IN_SIGTRAMP() macros. */
|
||||
extern int legacy_pc_in_sigtramp (CORE_ADDR pc, char *name);
|
||||
|
||||
/* Initialize a ``struct info''. Can't use memset(0) since some
|
||||
default values are not zero. */
|
||||
extern void gdbarch_info_init (struct gdbarch_info *info);
|
||||
|
@ -1096,20 +1096,20 @@ arm_init_extra_frame_info (int fromleaf, struct frame_info *fi)
|
||||
sp = (fi->next->frame - fi->next->extra_info->frameoffset
|
||||
+ fi->next->extra_info->framesize);
|
||||
|
||||
/* Determine whether or not we're in a sigtramp frame.
|
||||
/* Determine whether or not we're in a sigtramp frame.
|
||||
Unfortunately, it isn't sufficient to test
|
||||
fi->signal_handler_caller because this value is sometimes set
|
||||
after invoking INIT_EXTRA_FRAME_INFO. So we test *both*
|
||||
fi->signal_handler_caller and IN_SIGTRAMP to determine if we need
|
||||
to use the sigcontext addresses for the saved registers.
|
||||
fi->signal_handler_caller and PC_IN_SIGTRAMP to determine if we
|
||||
need to use the sigcontext addresses for the saved registers.
|
||||
|
||||
Note: If an ARM IN_SIGTRAMP method ever needs to compare against
|
||||
the name of the function, the code below will have to be changed
|
||||
to first fetch the name of the function and then pass this name
|
||||
to IN_SIGTRAMP. */
|
||||
Note: If an ARM PC_IN_SIGTRAMP method ever needs to compare
|
||||
against the name of the function, the code below will have to be
|
||||
changed to first fetch the name of the function and then pass
|
||||
this name to PC_IN_SIGTRAMP. */
|
||||
|
||||
if (SIGCONTEXT_REGISTER_ADDRESS_P ()
|
||||
&& (fi->signal_handler_caller || IN_SIGTRAMP (fi->pc, (char *)0)))
|
||||
&& (fi->signal_handler_caller || PC_IN_SIGTRAMP (fi->pc, (char *)0)))
|
||||
{
|
||||
for (reg = 0; reg < NUM_REGS; reg++)
|
||||
fi->saved_regs[reg] = SIGCONTEXT_REGISTER_ADDRESS (sp, fi->pc, reg);
|
||||
|
@ -227,7 +227,7 @@ create_new_frame (CORE_ADDR addr, CORE_ADDR pc)
|
||||
fi->frame = addr;
|
||||
fi->pc = pc;
|
||||
find_pc_partial_function (pc, &name, (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
|
||||
fi->signal_handler_caller = IN_SIGTRAMP (fi->pc, name);
|
||||
fi->signal_handler_caller = PC_IN_SIGTRAMP (fi->pc, name);
|
||||
|
||||
if (INIT_EXTRA_FRAME_INFO_P ())
|
||||
INIT_EXTRA_FRAME_INFO (0, fi);
|
||||
@ -458,7 +458,7 @@ get_prev_frame (struct frame_info *next_frame)
|
||||
|
||||
find_pc_partial_function (prev->pc, &name,
|
||||
(CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
|
||||
if (IN_SIGTRAMP (prev->pc, name))
|
||||
if (PC_IN_SIGTRAMP (prev->pc, name))
|
||||
prev->signal_handler_caller = 1;
|
||||
|
||||
return prev;
|
||||
@ -747,7 +747,7 @@ find_pc_sect_partial_function (CORE_ADDR pc, asection *section, char **name,
|
||||
/* If sigtramp is in the u area, it counts as a function (especially
|
||||
important for step_1). */
|
||||
#if defined SIGTRAMP_START
|
||||
if (IN_SIGTRAMP (mapped_pc, (char *) NULL))
|
||||
if (PC_IN_SIGTRAMP (mapped_pc, (char *) NULL))
|
||||
{
|
||||
cache_pc_function_low = SIGTRAMP_START (mapped_pc);
|
||||
cache_pc_function_high = SIGTRAMP_END (mapped_pc);
|
||||
|
@ -2850,7 +2850,7 @@ bpstat_what (bpstat bs)
|
||||
|
||||
/* step_resume entries: a step resume breakpoint overrides another
|
||||
breakpoint of signal handling (see comment in wait_for_inferior
|
||||
at first IN_SIGTRAMP where we set the step_resume breakpoint). */
|
||||
at first PC_IN_SIGTRAMP where we set the step_resume breakpoint). */
|
||||
/* We handle the through_sigtramp_breakpoint the same way; having both
|
||||
one of those and a step_resume_breakpoint is probably very rare (?). */
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2002-04-24 Andrew Cagney <ac131313@redhat.com>
|
||||
|
||||
* gdbint.texinfo (Target Architecture Definition): Replace
|
||||
IN_SIGTRAMP with PC_IN_SIGTRAMP.
|
||||
|
||||
2002-04-24 David S. Miller <davem@redhat.com>
|
||||
|
||||
* gdbint.texinfo (REGISTER_IN_WINDOW): Delete definition.
|
||||
|
@ -3090,11 +3090,6 @@ The epilogue of a function is defined as the part of a function where
|
||||
the stack frame of the function already has been destroyed up to the
|
||||
final `return from function call' instruction.
|
||||
|
||||
@item IN_SIGTRAMP (@var{pc}, @var{name})
|
||||
@findex IN_SIGTRAMP
|
||||
Define this to return non-zero if the given @var{pc} and/or @var{name}
|
||||
indicates that the current function is a @code{sigtramp}.
|
||||
|
||||
@item SIGTRAMP_START (@var{pc})
|
||||
@findex SIGTRAMP_START
|
||||
@itemx SIGTRAMP_END (@var{pc})
|
||||
@ -3293,6 +3288,18 @@ them.
|
||||
@findex PC_IN_CALL_DUMMY
|
||||
See @file{inferior.h}.
|
||||
|
||||
@item PC_IN_SIGTRAMP (@var{pc}, @var{name})
|
||||
@findex PC_IN_SIGTRAMP
|
||||
@cindex sigtramp
|
||||
The @dfn{sigtramp} is a routine that the kernel calls (which then calls
|
||||
the signal handler). On most machines it is a library routine that is
|
||||
linked into the executable.
|
||||
|
||||
This function, given a program counter value in @var{pc} and the
|
||||
(possibly NULL) name of the function in which that @var{pc} resides,
|
||||
returns nonzero if the @var{pc} and/or @var{name} show that we are in
|
||||
sigtramp.
|
||||
|
||||
@item PC_LOAD_SEGMENT
|
||||
@findex PC_LOAD_SEGMENT
|
||||
If defined, print information about the load segment for the program
|
||||
|
@ -250,6 +250,7 @@ struct gdbarch
|
||||
gdbarch_print_insn_ftype *print_insn;
|
||||
gdbarch_skip_trampoline_code_ftype *skip_trampoline_code;
|
||||
gdbarch_in_solib_call_trampoline_ftype *in_solib_call_trampoline;
|
||||
gdbarch_pc_in_sigtramp_ftype *pc_in_sigtramp;
|
||||
gdbarch_in_function_epilogue_p_ftype *in_function_epilogue_p;
|
||||
gdbarch_construct_inferior_arguments_ftype *construct_inferior_arguments;
|
||||
gdbarch_dwarf2_build_frame_info_ftype *dwarf2_build_frame_info;
|
||||
@ -396,6 +397,7 @@ struct gdbarch startup_gdbarch =
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
generic_in_function_epilogue_p,
|
||||
construct_inferior_arguments,
|
||||
0,
|
||||
@ -516,6 +518,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
|
||||
current_gdbarch->print_insn = legacy_print_insn;
|
||||
current_gdbarch->skip_trampoline_code = generic_skip_trampoline_code;
|
||||
current_gdbarch->in_solib_call_trampoline = generic_in_solib_call_trampoline;
|
||||
current_gdbarch->pc_in_sigtramp = legacy_pc_in_sigtramp;
|
||||
current_gdbarch->in_function_epilogue_p = generic_in_function_epilogue_p;
|
||||
current_gdbarch->construct_inferior_arguments = construct_inferior_arguments;
|
||||
current_gdbarch->elf_make_msymbol_special = default_elf_make_msymbol_special;
|
||||
@ -764,6 +767,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
|
||||
/* Skip verify of print_insn, invalid_p == 0 */
|
||||
/* Skip verify of skip_trampoline_code, invalid_p == 0 */
|
||||
/* Skip verify of in_solib_call_trampoline, invalid_p == 0 */
|
||||
/* Skip verify of pc_in_sigtramp, invalid_p == 0 */
|
||||
/* Skip verify of in_function_epilogue_p, invalid_p == 0 */
|
||||
/* Skip verify of construct_inferior_arguments, invalid_p == 0 */
|
||||
/* Skip verify of dwarf2_build_frame_info, has predicate */
|
||||
@ -1461,6 +1465,17 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
|
||||
(long) current_gdbarch->pc_in_call_dummy
|
||||
/*PC_IN_CALL_DUMMY ()*/);
|
||||
#endif
|
||||
#ifdef PC_IN_SIGTRAMP
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: %s # %s\n",
|
||||
"PC_IN_SIGTRAMP(pc, name)",
|
||||
XSTRING (PC_IN_SIGTRAMP (pc, name)));
|
||||
if (GDB_MULTI_ARCH)
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: PC_IN_SIGTRAMP = 0x%08lx\n",
|
||||
(long) current_gdbarch->pc_in_sigtramp
|
||||
/*PC_IN_SIGTRAMP ()*/);
|
||||
#endif
|
||||
#ifdef PC_REGNUM
|
||||
fprintf_unfiltered (file,
|
||||
"gdbarch_dump: PC_REGNUM # %s\n",
|
||||
@ -4408,6 +4423,24 @@ set_gdbarch_in_solib_call_trampoline (struct gdbarch *gdbarch,
|
||||
gdbarch->in_solib_call_trampoline = in_solib_call_trampoline;
|
||||
}
|
||||
|
||||
int
|
||||
gdbarch_pc_in_sigtramp (struct gdbarch *gdbarch, CORE_ADDR pc, char *name)
|
||||
{
|
||||
if (gdbarch->pc_in_sigtramp == 0)
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"gdbarch: gdbarch_pc_in_sigtramp invalid");
|
||||
if (gdbarch_debug >= 2)
|
||||
fprintf_unfiltered (gdb_stdlog, "gdbarch_pc_in_sigtramp called\n");
|
||||
return gdbarch->pc_in_sigtramp (pc, name);
|
||||
}
|
||||
|
||||
void
|
||||
set_gdbarch_pc_in_sigtramp (struct gdbarch *gdbarch,
|
||||
gdbarch_pc_in_sigtramp_ftype pc_in_sigtramp)
|
||||
{
|
||||
gdbarch->pc_in_sigtramp = pc_in_sigtramp;
|
||||
}
|
||||
|
||||
int
|
||||
gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR addr)
|
||||
{
|
||||
|
@ -2268,6 +2268,44 @@ extern void set_gdbarch_in_solib_call_trampoline (struct gdbarch *gdbarch, gdbar
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Sigtramp is a routine that the kernel calls (which then calls the
|
||||
signal handler). On most machines it is a library routine that is
|
||||
linked into the executable.
|
||||
|
||||
This macro, given a program counter value and the name of the
|
||||
function in which that PC resides (which can be null if the name is
|
||||
not known), returns nonzero if the PC and name show that we are in
|
||||
sigtramp.
|
||||
|
||||
On most machines just see if the name is sigtramp (and if we have
|
||||
no name, assume we are not in sigtramp).
|
||||
|
||||
FIXME: cagney/2002-04-21: The function find_pc_partial_function
|
||||
calls find_pc_sect_partial_function() which calls PC_IN_SIGTRAMP.
|
||||
This means PC_IN_SIGTRAMP function can't be implemented by doing its
|
||||
own local NAME lookup.
|
||||
|
||||
FIXME: cagney/2002-04-21: PC_IN_SIGTRAMP is something of a mess.
|
||||
Some code also depends on SIGTRAMP_START and SIGTRAMP_END but other
|
||||
does not. */
|
||||
|
||||
/* Default (function) for non- multi-arch platforms. */
|
||||
#if (!GDB_MULTI_ARCH) && !defined (PC_IN_SIGTRAMP)
|
||||
#define PC_IN_SIGTRAMP(pc, name) (legacy_pc_in_sigtramp (pc, name))
|
||||
#endif
|
||||
|
||||
typedef int (gdbarch_pc_in_sigtramp_ftype) (CORE_ADDR pc, char *name);
|
||||
extern int gdbarch_pc_in_sigtramp (struct gdbarch *gdbarch, CORE_ADDR pc, char *name);
|
||||
extern void set_gdbarch_pc_in_sigtramp (struct gdbarch *gdbarch, gdbarch_pc_in_sigtramp_ftype *pc_in_sigtramp);
|
||||
#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (PC_IN_SIGTRAMP)
|
||||
#error "Non multi-arch definition of PC_IN_SIGTRAMP"
|
||||
#endif
|
||||
#if GDB_MULTI_ARCH
|
||||
#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (PC_IN_SIGTRAMP)
|
||||
#define PC_IN_SIGTRAMP(pc, name) (gdbarch_pc_in_sigtramp (current_gdbarch, pc, name))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* A target might have problems with watchpoints as soon as the stack
|
||||
frame of the current function has been destroyed. This mostly happens
|
||||
as the first action in a funtion's epilogue. in_function_epilogue_p()
|
||||
|
@ -608,6 +608,27 @@ f:2:SKIP_TRAMPOLINE_CODE:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc:::generi
|
||||
# trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE evaluates
|
||||
# to nonzero if we are current stopped in one of these.
|
||||
f:2:IN_SOLIB_CALL_TRAMPOLINE:int:in_solib_call_trampoline:CORE_ADDR pc, char *name:pc, name:::generic_in_solib_call_trampoline::0
|
||||
# Sigtramp is a routine that the kernel calls (which then calls the
|
||||
# signal handler). On most machines it is a library routine that is
|
||||
# linked into the executable.
|
||||
#
|
||||
# This macro, given a program counter value and the name of the
|
||||
# function in which that PC resides (which can be null if the name is
|
||||
# not known), returns nonzero if the PC and name show that we are in
|
||||
# sigtramp.
|
||||
#
|
||||
# On most machines just see if the name is sigtramp (and if we have
|
||||
# no name, assume we are not in sigtramp).
|
||||
#
|
||||
# FIXME: cagney/2002-04-21: The function find_pc_partial_function
|
||||
# calls find_pc_sect_partial_function() which calls PC_IN_SIGTRAMP.
|
||||
# This means PC_IN_SIGTRAMP function can't be implemented by doing its
|
||||
# own local NAME lookup.
|
||||
#
|
||||
# FIXME: cagney/2002-04-21: PC_IN_SIGTRAMP is something of a mess.
|
||||
# Some code also depends on SIGTRAMP_START and SIGTRAMP_END but other
|
||||
# does not.
|
||||
f:2:PC_IN_SIGTRAMP:int:pc_in_sigtramp:CORE_ADDR pc, char *name:pc, name:::legacy_pc_in_sigtramp::0
|
||||
# A target might have problems with watchpoints as soon as the stack
|
||||
# frame of the current function has been destroyed. This mostly happens
|
||||
# as the first action in a funtion's epilogue. in_function_epilogue_p()
|
||||
|
@ -633,7 +633,8 @@ pc_in_interrupt_handler (CORE_ADDR pc)
|
||||
its frame isn't a pure interrupt frame. Deal with this. */
|
||||
msym_us = lookup_minimal_symbol_by_pc (pc);
|
||||
|
||||
return u->HP_UX_interrupt_marker && !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us));
|
||||
return (u->HP_UX_interrupt_marker
|
||||
&& !PC_IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)));
|
||||
}
|
||||
|
||||
/* Called when no unwind descriptor was found for PC. Returns 1 if it
|
||||
@ -751,7 +752,7 @@ find_proc_framesize (CORE_ADDR pc)
|
||||
if (u->Save_SP
|
||||
&& !pc_in_interrupt_handler (pc)
|
||||
&& msym_us
|
||||
&& !IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)))
|
||||
&& !PC_IN_SIGTRAMP (pc, SYMBOL_NAME (msym_us)))
|
||||
return -1;
|
||||
|
||||
return u->Total_frame_size << 3;
|
||||
|
@ -92,7 +92,7 @@ i386_linux_register_raw_size (int reg)
|
||||
|
||||
It kind of sucks that we have to read memory from the process in
|
||||
order to identify a signal trampoline, but there doesn't seem to be
|
||||
any other way. The IN_SIGTRAMP macro in tm-linux.h arranges to
|
||||
any other way. The PC_IN_SIGTRAMP macro in tm-linux.h arranges to
|
||||
only call us if no function name could be identified, which should
|
||||
be the case since the code is on the stack.
|
||||
|
||||
@ -317,7 +317,7 @@ i386_linux_sigtramp_saved_sp (struct frame_info *frame)
|
||||
in progress when the signal trampoline was entered. GDB mostly
|
||||
treats this frame pointer value as a magic cookie. We detect the
|
||||
case of a signal trampoline by looking at the SIGNAL_HANDLER_CALLER
|
||||
field, which is set based on IN_SIGTRAMP.
|
||||
field, which is set based on PC_IN_SIGTRAMP.
|
||||
|
||||
When a signal trampoline is invoked from a frameless function, we
|
||||
essentially have two frameless functions in a row. In this case,
|
||||
|
@ -403,29 +403,6 @@ extern char *stop_registers;
|
||||
|
||||
extern int attach_flag;
|
||||
|
||||
/* Sigtramp is a routine that the kernel calls (which then calls the
|
||||
signal handler). On most machines it is a library routine that
|
||||
is linked into the executable.
|
||||
|
||||
This macro, given a program counter value and the name of the
|
||||
function in which that PC resides (which can be null if the
|
||||
name is not known), returns nonzero if the PC and name show
|
||||
that we are in sigtramp.
|
||||
|
||||
On most machines just see if the name is sigtramp (and if we have
|
||||
no name, assume we are not in sigtramp). */
|
||||
#if !defined (IN_SIGTRAMP)
|
||||
#if defined (SIGTRAMP_START)
|
||||
#define IN_SIGTRAMP(pc, name) \
|
||||
((pc) >= SIGTRAMP_START(pc) \
|
||||
&& (pc) < SIGTRAMP_END(pc) \
|
||||
)
|
||||
#else
|
||||
#define IN_SIGTRAMP(pc, name) \
|
||||
(name && STREQ ("_sigtramp", name))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Possible values for CALL_DUMMY_LOCATION. */
|
||||
#define ON_STACK 1
|
||||
#define BEFORE_TEXT_END 2
|
||||
|
10
gdb/infrun.c
10
gdb/infrun.c
@ -2640,8 +2640,8 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||
ecs->update_step_sp = 1;
|
||||
|
||||
/* Did we just take a signal? */
|
||||
if (IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
|
||||
&& !IN_SIGTRAMP (prev_pc, prev_func_name)
|
||||
if (PC_IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
|
||||
&& !PC_IN_SIGTRAMP (prev_pc, prev_func_name)
|
||||
&& INNER_THAN (read_sp (), step_sp))
|
||||
{
|
||||
/* We've just taken a signal; go until we are back to
|
||||
@ -2752,7 +2752,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||
{
|
||||
/* We're doing a "next". */
|
||||
|
||||
if (IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
|
||||
if (PC_IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
|
||||
&& INNER_THAN (step_frame_address, read_sp()))
|
||||
/* We stepped out of a signal handler, and into its
|
||||
calling trampoline. This is misdetected as a
|
||||
@ -2961,8 +2961,8 @@ static void
|
||||
check_sigtramp2 (struct execution_control_state *ecs)
|
||||
{
|
||||
if (trap_expected
|
||||
&& IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
|
||||
&& !IN_SIGTRAMP (prev_pc, prev_func_name)
|
||||
&& PC_IN_SIGTRAMP (stop_pc, ecs->stop_func_name)
|
||||
&& !PC_IN_SIGTRAMP (prev_pc, prev_func_name)
|
||||
&& INNER_THAN (read_sp (), step_sp))
|
||||
{
|
||||
/* What has happened here is that we have just stepped the
|
||||
|
@ -2108,7 +2108,7 @@ mips_init_extra_frame_info (int fromleaf, struct frame_info *fci)
|
||||
We can't use fci->signal_handler_caller, it is not yet set. */
|
||||
find_pc_partial_function (fci->pc, &name,
|
||||
(CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
|
||||
if (!IN_SIGTRAMP (fci->pc, name))
|
||||
if (!PC_IN_SIGTRAMP (fci->pc, name))
|
||||
{
|
||||
frame_saved_regs_zalloc (fci);
|
||||
memcpy (fci->saved_regs, temp_saved_regs, SIZEOF_FRAME_SAVED_REGS);
|
||||
@ -4576,9 +4576,6 @@ mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
|
||||
fprintf_unfiltered (file,
|
||||
"mips_dump_tdep: IGNORE_HELPER_CALL # %s\n",
|
||||
XSTRING (IGNORE_HELPER_CALL (PC)));
|
||||
fprintf_unfiltered (file,
|
||||
"mips_dump_tdep: IN_SIGTRAMP # %s\n",
|
||||
XSTRING (IN_SIGTRAMP (PC, NAME)));
|
||||
fprintf_unfiltered (file,
|
||||
"mips_dump_tdep: IN_SOLIB_CALL_TRAMPOLINE # %s\n",
|
||||
XSTRING (IN_SOLIB_CALL_TRAMPOLINE (PC, NAME)));
|
||||
|
@ -106,10 +106,11 @@ static int ppc_linux_at_sigtramp_return_path (CORE_ADDR pc);
|
||||
/* Determine if pc is in a signal trampoline...
|
||||
|
||||
Ha! That's not what this does at all. wait_for_inferior in
|
||||
infrun.c calls IN_SIGTRAMP in order to detect entry into a signal
|
||||
trampoline just after delivery of a signal. But on GNU/Linux,
|
||||
signal trampolines are used for the return path only. The kernel
|
||||
sets things up so that the signal handler is called directly.
|
||||
infrun.c calls PC_IN_SIGTRAMP in order to detect entry into a
|
||||
signal trampoline just after delivery of a signal. But on
|
||||
GNU/Linux, signal trampolines are used for the return path only.
|
||||
The kernel sets things up so that the signal handler is called
|
||||
directly.
|
||||
|
||||
If we use in_sigtramp2() in place of in_sigtramp() (see below)
|
||||
we'll (often) end up with stop_pc in the trampoline and prev_pc in
|
||||
@ -141,11 +142,11 @@ static int ppc_linux_at_sigtramp_return_path (CORE_ADDR pc);
|
||||
first instruction long after the fact, just in case the observed
|
||||
behavior is ever fixed.)
|
||||
|
||||
IN_SIGTRAMP is called from blockframe.c as well in order to set
|
||||
PC_IN_SIGTRAMP is called from blockframe.c as well in order to set
|
||||
the signal_handler_caller flag. Because of our strange definition
|
||||
of in_sigtramp below, we can't rely on signal_handler_caller getting
|
||||
set correctly from within blockframe.c. This is why we take pains
|
||||
to set it in init_extra_frame_info(). */
|
||||
of in_sigtramp below, we can't rely on signal_handler_caller
|
||||
getting set correctly from within blockframe.c. This is why we
|
||||
take pains to set it in init_extra_frame_info(). */
|
||||
|
||||
int
|
||||
ppc_linux_in_sigtramp (CORE_ADDR pc, char *func_name)
|
||||
|
Loading…
Reference in New Issue
Block a user