mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-16 04:13:50 +08:00
* amd64-tdep.c (amd64_sigtramp_frame_sniffer): Rewrite to use new
sigtramp_p member of `struct gdbarch_tdep'. Also check whether the program counter is in the range specified by `struct gdbarch_tdep'. * amd64-linux-tdep.c: Include "symtab.h". (amd64_linux_pc_in_sigtramp): Remove function. (amd64_linux_sigtramp_p): New function. (amd64_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * amd64nbsd-tdep.c: Include "symtab.h". (amd64nbsd_sigtramp_p): New function. (amd64nbsd_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * amd64obsd-tdep.c: Include "symtab.h" and "objfiles.h". Add a few comments. (amd64obsd_pc_in_sigtramp): Remove function. (amd64obsd_sigtramp_p): New function. (amd64obsd_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-tdep.h (struct gdbarch_tdep): Add sigtramp_p member. (i386bsd_pc_ins_sigtramp): Remove prototype. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove prototypes. * i386-tdep.c (i386_sigtramp_frame_sniffer): Rewrite to use new sigtramp_p member of `struct gdbarch_tdep'. Also check whether the program counter is in the range specified by `struct gdbarch_tdep'. (i386_pc_in_sigtramp, i386_svr4_pc_in_sigtramp): Remove functions. (i386_sigtramp_p, i386_svr4_sigtramp_p): New functions. (i386_go32_pc_in_sigtramp): Remove function. (i386_svr4_init_abi): Don't set deprecated_pc_in_sigtramp. Initialize TDEP->sigtramp_p. (i386_go32_init_abi): Initialize TDEP->sigtramp_p to NULL. (i386_gdbarch_init): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-linux-tdep.c: Adjust comments. (i386_linux_pc_in_sigtramp): Remove function. (i386_linux_sigtramp_p): New function. (i386_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-nto-tdep.c: Update copyright year. (i386nto_pc_in_sigtramp): Remove function. (i386nto_sigtramp_p): New function. (i386nto_sigcontext_addr): Use I386_ESP_REGNUM instead of SP_REGNUM. (i386nto_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-sol2-tdep.c: Update copyright year. (i386_sol2_pc_in_sigtramp): Remove function. (i386_sol2_sigtramp_p): New function. (i386_sol2_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386bsd-tdep.c (i386bsd_pc_in_sigtramp): Remove function. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove functions. (i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp, deprecated_sigtramp_start and deprecated_sigtramp_end. * i386nbsd-tdep.c: Include "frame.h" and "symtab.h". (i386nbsd_pc_in_sigtramp): Remove function. (i386nbsd_sigtramp_p): New function. (i386nbsd_init_abi): Don't set deprecated_pc_in_sigtramp, deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize TDEP->sigtramp_start, TDEP->sigtramp_end and TDEP->sigtramp_p. * i386obsd-tdep.c: Include "frame.h", "symtab.h" and "objfiles.h". (i386obsd_pc_in_sigtramp): Remove function. (i386obsd_sigtramp_p): New function. (i386obsd_sigtramp_start, i386obsd_sigtramp_end): Remove functions. (i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp, deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize TDEP->sigtramp_p. * Makefile.in (amd64-linux-tdep.o, amd64nbsd-tdep.o, amd64obsd-tdep.o, i386nbsd-tdep.o, i386obsd-tdep.o): Update dependencies.
This commit is contained in:
@ -1,5 +1,78 @@
|
|||||||
2004-04-09 Mark Kettenis <kettenis@gnu.org>
|
2004-04-09 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
|
* amd64-tdep.c (amd64_sigtramp_frame_sniffer): Rewrite to use new
|
||||||
|
sigtramp_p member of `struct gdbarch_tdep'. Also check whether
|
||||||
|
the program counter is in the range specified by `struct
|
||||||
|
gdbarch_tdep'.
|
||||||
|
* amd64-linux-tdep.c: Include "symtab.h".
|
||||||
|
(amd64_linux_pc_in_sigtramp): Remove function.
|
||||||
|
(amd64_linux_sigtramp_p): New function.
|
||||||
|
(amd64_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* amd64nbsd-tdep.c: Include "symtab.h".
|
||||||
|
(amd64nbsd_sigtramp_p): New function.
|
||||||
|
(amd64nbsd_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* amd64obsd-tdep.c: Include "symtab.h" and "objfiles.h". Add a
|
||||||
|
few comments.
|
||||||
|
(amd64obsd_pc_in_sigtramp): Remove function.
|
||||||
|
(amd64obsd_sigtramp_p): New function.
|
||||||
|
(amd64obsd_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* i386-tdep.h (struct gdbarch_tdep): Add sigtramp_p member.
|
||||||
|
(i386bsd_pc_ins_sigtramp): Remove prototype.
|
||||||
|
(i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove prototypes.
|
||||||
|
* i386-tdep.c (i386_sigtramp_frame_sniffer): Rewrite to use new
|
||||||
|
sigtramp_p member of `struct gdbarch_tdep'. Also check whether
|
||||||
|
the program counter is in the range specified by `struct
|
||||||
|
gdbarch_tdep'.
|
||||||
|
(i386_pc_in_sigtramp, i386_svr4_pc_in_sigtramp): Remove functions.
|
||||||
|
(i386_sigtramp_p, i386_svr4_sigtramp_p): New functions.
|
||||||
|
(i386_go32_pc_in_sigtramp): Remove function.
|
||||||
|
(i386_svr4_init_abi): Don't set deprecated_pc_in_sigtramp.
|
||||||
|
Initialize TDEP->sigtramp_p.
|
||||||
|
(i386_go32_init_abi): Initialize TDEP->sigtramp_p to NULL.
|
||||||
|
(i386_gdbarch_init): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* i386-linux-tdep.c: Adjust comments.
|
||||||
|
(i386_linux_pc_in_sigtramp): Remove function.
|
||||||
|
(i386_linux_sigtramp_p): New function.
|
||||||
|
(i386_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* i386-nto-tdep.c: Update copyright year.
|
||||||
|
(i386nto_pc_in_sigtramp): Remove function.
|
||||||
|
(i386nto_sigtramp_p): New function.
|
||||||
|
(i386nto_sigcontext_addr): Use I386_ESP_REGNUM instead of
|
||||||
|
SP_REGNUM.
|
||||||
|
(i386nto_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* i386-sol2-tdep.c: Update copyright year.
|
||||||
|
(i386_sol2_pc_in_sigtramp): Remove function.
|
||||||
|
(i386_sol2_sigtramp_p): New function.
|
||||||
|
(i386_sol2_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||||
|
deprecated_pc_in_sigtramp.
|
||||||
|
* i386bsd-tdep.c (i386bsd_pc_in_sigtramp): Remove function.
|
||||||
|
(i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove functions.
|
||||||
|
(i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp,
|
||||||
|
deprecated_sigtramp_start and deprecated_sigtramp_end.
|
||||||
|
* i386nbsd-tdep.c: Include "frame.h" and "symtab.h".
|
||||||
|
(i386nbsd_pc_in_sigtramp): Remove function.
|
||||||
|
(i386nbsd_sigtramp_p): New function.
|
||||||
|
(i386nbsd_init_abi): Don't set deprecated_pc_in_sigtramp,
|
||||||
|
deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize
|
||||||
|
TDEP->sigtramp_start, TDEP->sigtramp_end and TDEP->sigtramp_p.
|
||||||
|
* i386obsd-tdep.c: Include "frame.h", "symtab.h" and "objfiles.h".
|
||||||
|
(i386obsd_pc_in_sigtramp): Remove function.
|
||||||
|
(i386obsd_sigtramp_p): New function.
|
||||||
|
(i386obsd_sigtramp_start, i386obsd_sigtramp_end): Remove
|
||||||
|
functions.
|
||||||
|
(i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp,
|
||||||
|
deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize
|
||||||
|
TDEP->sigtramp_p.
|
||||||
|
* Makefile.in (amd64-linux-tdep.o, amd64nbsd-tdep.o,
|
||||||
|
amd64obsd-tdep.o, i386nbsd-tdep.o, i386obsd-tdep.o): Update
|
||||||
|
dependencies.
|
||||||
|
|
||||||
* config/i386/i386aout.mt: Remove file.
|
* config/i386/i386aout.mt: Remove file.
|
||||||
|
|
||||||
* configure.tgt: Remove i[34567]86-*-go32*,
|
* configure.tgt: Remove i[34567]86-*-go32*,
|
||||||
|
@ -1533,20 +1533,21 @@ amd64-linux-nat.o: amd64-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
|
|||||||
$(gdb_proc_service_h) $(gregset_h) $(amd64_tdep_h) \
|
$(gdb_proc_service_h) $(gregset_h) $(amd64_tdep_h) \
|
||||||
$(i386_linux_tdep_h) $(amd64_nat_h)
|
$(i386_linux_tdep_h) $(amd64_nat_h)
|
||||||
amd64-linux-tdep.o: amd64-linux-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
amd64-linux-tdep.o: amd64-linux-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
||||||
$(regcache_h) $(osabi_h) $(gdb_string_h) $(amd64_tdep_h) \
|
$(regcache_h) $(osabi_h) $(symtab_h) $(gdb_string_h) \
|
||||||
$(solib_svr4_h)
|
$(amd64_tdep_h) $(solib_svr4_h)
|
||||||
amd64-nat.o: amd64-nat.c $(defs_h) $(gdbarch_h) $(regcache_h) \
|
amd64-nat.o: amd64-nat.c $(defs_h) $(gdbarch_h) $(regcache_h) \
|
||||||
$(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) $(amd64_tdep_h)
|
$(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) $(amd64_tdep_h)
|
||||||
amd64nbsd-nat.o: amd64nbsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
amd64nbsd-nat.o: amd64nbsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||||
$(amd64_nat_h)
|
$(amd64_nat_h)
|
||||||
amd64nbsd-tdep.o: amd64nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
amd64nbsd-tdep.o: amd64nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||||
$(gdbcore_h) $(osabi_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
$(gdbcore_h) $(osabi_h) $(symtab_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||||
$(nbsd_tdep_h) $(solib_svr4_h)
|
$(nbsd_tdep_h) $(solib_svr4_h)
|
||||||
amd64obsd-nat.o: amd64obsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
amd64obsd-nat.o: amd64obsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||||
$(amd64_nat_h)
|
$(amd64_nat_h)
|
||||||
amd64obsd-tdep.o: amd64obsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
amd64obsd-tdep.o: amd64obsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
||||||
$(osabi_h) $(regset_h) $(target_h) $(gdb_assert_h) $(gdb_string_h) \
|
$(symtab_h) $(objfiles_h) $(osabi_h) $(regset_h) $(target_h) \
|
||||||
$(amd64_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
|
$(gdb_assert_h) $(gdb_string_h) $(amd64_tdep_h) $(i387_tdep_h) \
|
||||||
|
$(solib_svr4_h)
|
||||||
amd64-tdep.o: amd64-tdep.c $(defs_h) $(arch_utils_h) $(block_h) \
|
amd64-tdep.o: amd64-tdep.c $(defs_h) $(arch_utils_h) $(block_h) \
|
||||||
$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
|
$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
|
||||||
$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
|
$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
|
||||||
@ -1863,16 +1864,18 @@ i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
|
|||||||
i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
|
i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
|
||||||
$(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h)
|
$(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h)
|
||||||
i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
|
i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
|
||||||
i386nbsd-tdep.o: i386nbsd-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \
|
i386nbsd-tdep.o: i386nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||||
$(regcache_h) $(regset_h) $(osabi_h) $(gdb_assert_h) $(gdb_string_h) \
|
$(gdbcore_h) $(regcache_h) $(regset_h) $(osabi_h) $(symtab_h) \
|
||||||
$(i386_tdep_h) $(i387_tdep_h) $(nbsd_tdep_h) $(solib_svr4_h)
|
$(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) $(i387_tdep_h) \
|
||||||
|
$(nbsd_tdep_h) $(solib_svr4_h)
|
||||||
i386-nto-tdep.o: i386-nto-tdep.c $(gdb_string_h) $(gdb_assert_h) $(defs_h) \
|
i386-nto-tdep.o: i386-nto-tdep.c $(gdb_string_h) $(gdb_assert_h) $(defs_h) \
|
||||||
$(frame_h) $(target_h) $(regcache_h) $(solib_svr4_h) $(i386_tdep_h) \
|
$(frame_h) $(target_h) $(regcache_h) $(solib_svr4_h) $(i386_tdep_h) \
|
||||||
$(nto_tdep_h) $(osabi_h) $(i387_tdep_h)
|
$(nto_tdep_h) $(osabi_h) $(i387_tdep_h)
|
||||||
i386obsd-nat.o: i386obsd-nat.c $(defs_h) $(i386_tdep_h)
|
i386obsd-nat.o: i386obsd-nat.c $(defs_h) $(i386_tdep_h)
|
||||||
i386obsd-tdep.o: i386obsd-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \
|
i386obsd-tdep.o: i386obsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||||
$(regcache_h) $(regset_h) $(osabi_h) $(target_h) $(gdb_assert_h) \
|
$(gdbcore_h) $(regcache_h) $(regset_h) $(symtab_h) $(objfiles_h) \
|
||||||
$(gdb_string_h) $(i386_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
|
$(osabi_h) $(target_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||||
|
$(i386_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
|
||||||
i386-sol2-tdep.o: i386-sol2-tdep.c $(defs_h) $(value_h) $(osabi_h) \
|
i386-sol2-tdep.o: i386-sol2-tdep.c $(defs_h) $(value_h) $(osabi_h) \
|
||||||
$(i386_tdep_h)
|
$(i386_tdep_h)
|
||||||
i386-stub.o: i386-stub.c
|
i386-stub.o: i386-stub.c
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "regcache.h"
|
#include "regcache.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
|
#include "symtab.h"
|
||||||
|
|
||||||
#include "gdb_string.h"
|
#include "gdb_string.h"
|
||||||
|
|
||||||
@ -116,11 +117,17 @@ amd64_linux_sigtramp_start (CORE_ADDR pc)
|
|||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return whether PC is in a GNU/Linux sigtramp routine. */
|
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||||
|
GNU/Linux sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
amd64_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
amd64_linux_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
|
|
||||||
/* If we have NAME, we can optimize the search. The trampoline is
|
/* If we have NAME, we can optimize the search. The trampoline is
|
||||||
named __restore_rt. However, it isn't dynamically exported from
|
named __restore_rt. However, it isn't dynamically exported from
|
||||||
the shared C library, so the trampoline may appear to be part of
|
the shared C library, so the trampoline may appear to be part of
|
||||||
@ -203,7 +210,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
|
|
||||||
amd64_init_abi (info, gdbarch);
|
amd64_init_abi (info, gdbarch);
|
||||||
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, amd64_linux_pc_in_sigtramp);
|
tdep->sigtramp_p = amd64_linux_sigtramp_p;
|
||||||
tdep->sigcontext_addr = amd64_linux_sigcontext_addr;
|
tdep->sigcontext_addr = amd64_linux_sigcontext_addr;
|
||||||
tdep->sc_reg_offset = amd64_linux_sc_reg_offset;
|
tdep->sc_reg_offset = amd64_linux_sc_reg_offset;
|
||||||
tdep->sc_num_regs = ARRAY_SIZE (amd64_linux_sc_reg_offset);
|
tdep->sc_num_regs = ARRAY_SIZE (amd64_linux_sc_reg_offset);
|
||||||
|
@ -967,15 +967,26 @@ static const struct frame_unwind amd64_sigtramp_frame_unwind =
|
|||||||
static const struct frame_unwind *
|
static const struct frame_unwind *
|
||||||
amd64_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
amd64_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
|
||||||
char *name;
|
|
||||||
|
|
||||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
/* We shouldn't even bother if we don't have a sigcontext_addr
|
||||||
if (DEPRECATED_PC_IN_SIGTRAMP (pc, name))
|
handler. */
|
||||||
|
if (tdep->sigcontext_addr == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (tdep->sigtramp_p != NULL)
|
||||||
{
|
{
|
||||||
gdb_assert (gdbarch_tdep (current_gdbarch)->sigcontext_addr);
|
if (tdep->sigtramp_p (next_frame))
|
||||||
|
return &amd64_sigtramp_frame_unwind;
|
||||||
|
}
|
||||||
|
|
||||||
return &amd64_sigtramp_frame_unwind;
|
if (tdep->sigtramp_start != 0)
|
||||||
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
|
||||||
|
gdb_assert (tdep->sigtramp_end != 0);
|
||||||
|
if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
|
||||||
|
return &amd64_sigtramp_frame_unwind;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
|
#include "symtab.h"
|
||||||
|
|
||||||
#include "gdb_assert.h"
|
#include "gdb_assert.h"
|
||||||
|
|
||||||
@ -33,6 +34,19 @@
|
|||||||
|
|
||||||
/* Support for signal handlers. */
|
/* Support for signal handlers. */
|
||||||
|
|
||||||
|
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||||
|
NetBSD sigtramp routine. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
amd64nbsd_sigtramp_p (struct frame_info *next_frame)
|
||||||
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
|
return nbsd_pc_in_sigtramp (pc, name);
|
||||||
|
}
|
||||||
|
|
||||||
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
|
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
|
||||||
routine, return the address of the associated sigcontext structure. */
|
routine, return the address of the associated sigcontext structure. */
|
||||||
|
|
||||||
@ -98,7 +112,7 @@ amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
tdep->jb_pc_offset = 7 * 8;
|
tdep->jb_pc_offset = 7 * 8;
|
||||||
|
|
||||||
/* NetBSD has its own convention for signal trampolines. */
|
/* NetBSD has its own convention for signal trampolines. */
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, nbsd_pc_in_sigtramp);
|
tdep->sigtramp_p = amd64nbsd_sigtramp_p;
|
||||||
tdep->sigcontext_addr = amd64nbsd_sigcontext_addr;
|
tdep->sigcontext_addr = amd64nbsd_sigcontext_addr;
|
||||||
|
|
||||||
/* Initialize the array with register offsets in `struct
|
/* Initialize the array with register offsets in `struct
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
|
#include "symtab.h"
|
||||||
|
#include "objfiles.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
#include "regset.h"
|
#include "regset.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
@ -75,11 +77,16 @@ amd64obsd_regset_from_core_section (struct gdbarch *gdbarch,
|
|||||||
|
|
||||||
/* Support for signal handlers. */
|
/* Support for signal handlers. */
|
||||||
|
|
||||||
|
/* Default page size. */
|
||||||
static const int amd64obsd_page_size = 4096;
|
static const int amd64obsd_page_size = 4096;
|
||||||
|
|
||||||
|
/* Return whether the frame preciding NEXT_FRAME corresponds to an
|
||||||
|
OpenBSD sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
amd64obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
amd64obsd_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
CORE_ADDR start_pc = (pc & ~(amd64obsd_page_size - 1));
|
CORE_ADDR start_pc = (pc & ~(amd64obsd_page_size - 1));
|
||||||
const char sigreturn[] =
|
const char sigreturn[] =
|
||||||
{
|
{
|
||||||
@ -87,9 +94,17 @@ amd64obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|||||||
0x67, 0x00, 0x00, 0x00, /* movq $SYS_sigreturn, %rax */
|
0x67, 0x00, 0x00, 0x00, /* movq $SYS_sigreturn, %rax */
|
||||||
0xcd, 0x80 /* int $0x80 */
|
0xcd, 0x80 /* int $0x80 */
|
||||||
};
|
};
|
||||||
char *buf;
|
char *name, *buf;
|
||||||
|
|
||||||
if (name)
|
/* If the function has a valid symbol name, it isn't a
|
||||||
|
trampoline. */
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
|
if (name != NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* If the function lives in a valid section (even without a starting
|
||||||
|
point) it isn't a trampoline. */
|
||||||
|
if (find_pc_section (pc) != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* If we can't read the instructions at START_PC, return zero. */
|
/* If we can't read the instructions at START_PC, return zero. */
|
||||||
@ -195,7 +210,7 @@ amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
|
|
||||||
tdep->jb_pc_offset = 7 * 8;
|
tdep->jb_pc_offset = 7 * 8;
|
||||||
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, amd64obsd_pc_in_sigtramp);
|
tdep->sigtramp_p = amd64obsd_sigtramp_p;
|
||||||
tdep->sigcontext_addr = amd64obsd_sigcontext_addr;
|
tdep->sigcontext_addr = amd64obsd_sigcontext_addr;
|
||||||
tdep->sc_reg_offset = amd64obsd_sc_reg_offset;
|
tdep->sc_reg_offset = amd64obsd_sc_reg_offset;
|
||||||
tdep->sc_num_regs = ARRAY_SIZE (amd64obsd_sc_reg_offset);
|
tdep->sc_num_regs = ARRAY_SIZE (amd64obsd_sc_reg_offset);
|
||||||
|
@ -83,13 +83,13 @@ i386_linux_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
|
|||||||
|
|
||||||
Checking for the code sequence should be somewhat reliable, because
|
Checking for the code sequence should be somewhat reliable, because
|
||||||
the effect is to call the system call sigreturn. This is unlikely
|
the effect is to call the system call sigreturn. This is unlikely
|
||||||
to occur anywhere other than a signal trampoline.
|
to occur anywhere other than in a signal trampoline.
|
||||||
|
|
||||||
It kind of sucks that we have to read memory from the process in
|
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
|
order to identify a signal trampoline, but there doesn't seem to be
|
||||||
any other way. The DEPRECATED_PC_IN_SIGTRAMP macro in tm-linux.h
|
any other way. Therefore we only do the memory reads if no
|
||||||
arranges to only call us if no function name could be identified,
|
function name could be identified, which should be the case since
|
||||||
which should be the case since the code is on the stack.
|
the code is on the stack.
|
||||||
|
|
||||||
Detection of signal trampolines for handlers that set the
|
Detection of signal trampolines for handlers that set the
|
||||||
SA_RESTORER flag is in general not possible. Unfortunately this is
|
SA_RESTORER flag is in general not possible. Unfortunately this is
|
||||||
@ -217,11 +217,17 @@ i386_linux_rt_sigtramp_start (CORE_ADDR pc)
|
|||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return whether PC is in a GNU/Linux sigtramp routine. */
|
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||||
|
GNU/Linux sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386_linux_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
|
|
||||||
/* If we have NAME, we can optimize the search. The trampolines are
|
/* If we have NAME, we can optimize the search. The trampolines are
|
||||||
named __restore and __restore_rt. However, they aren't dynamically
|
named __restore and __restore_rt. However, they aren't dynamically
|
||||||
exported from the shared C library, so the trampoline may appear to
|
exported from the shared C library, so the trampoline may appear to
|
||||||
@ -394,16 +400,11 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
|
|
||||||
tdep->jb_pc_offset = 20; /* From <bits/setjmp.h>. */
|
tdep->jb_pc_offset = 20; /* From <bits/setjmp.h>. */
|
||||||
|
|
||||||
|
tdep->sigtramp_p = i386_linux_sigtramp_p;
|
||||||
tdep->sigcontext_addr = i386_linux_sigcontext_addr;
|
tdep->sigcontext_addr = i386_linux_sigcontext_addr;
|
||||||
tdep->sc_reg_offset = i386_linux_sc_reg_offset;
|
tdep->sc_reg_offset = i386_linux_sc_reg_offset;
|
||||||
tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset);
|
tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset);
|
||||||
|
|
||||||
/* When the i386 Linux kernel calls a signal handler, the return
|
|
||||||
address points to a bit of code on the stack. This function is
|
|
||||||
used to identify this bit of code as a signal trampoline in order
|
|
||||||
to support backtracing through calls to signal handlers. */
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_linux_pc_in_sigtramp);
|
|
||||||
|
|
||||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||||
set_solib_svr4_fetch_link_map_offsets
|
set_solib_svr4_fetch_link_map_offsets
|
||||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* i386-nto-tdep.c - i386 specific functionality for QNX Neutrino.
|
/* Target-dependent code for QNX Neutrino x86.
|
||||||
|
|
||||||
Copyright 2003 Free Software Foundation, Inc.
|
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Contributed by QNX Software Systems Ltd.
|
Contributed by QNX Software Systems Ltd.
|
||||||
|
|
||||||
@ -225,9 +225,16 @@ i386nto_svr4_fetch_link_map_offsets (void)
|
|||||||
return lmp;
|
return lmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return whether the frame preceding NEXT_FRAME corresponds to a QNX
|
||||||
|
Neutrino sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386nto_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386nto_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
return name && strcmp ("__signalstub", name) == 0;
|
return name && strcmp ("__signalstub", name) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +249,7 @@ i386nto_sigcontext_addr (struct frame_info *next_frame)
|
|||||||
char buf[4];
|
char buf[4];
|
||||||
CORE_ADDR sp;
|
CORE_ADDR sp;
|
||||||
|
|
||||||
frame_unwind_register (next_frame, SP_REGNUM, buf);
|
frame_unwind_register (next_frame, I386_ESP_REGNUM, buf);
|
||||||
sp = extract_unsigned_integer (buf, 4);
|
sp = extract_unsigned_integer (buf, 4);
|
||||||
|
|
||||||
return sp + I386_NTO_SIGCONTEXT_OFFSET;
|
return sp + I386_NTO_SIGCONTEXT_OFFSET;
|
||||||
@ -278,7 +285,7 @@ i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||||
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386nto_pc_in_sigtramp);
|
tdep->sigtramp_p = i386nto_sigtramp_p;
|
||||||
tdep->sigcontext_addr = i386nto_sigcontext_addr;
|
tdep->sigcontext_addr = i386nto_sigcontext_addr;
|
||||||
tdep->sc_pc_offset = 56;
|
tdep->sc_pc_offset = 56;
|
||||||
tdep->sc_sp_offset = 68;
|
tdep->sc_sp_offset = 68;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* Target-dependent code for Solaris x86.
|
/* Target-dependent code for Solaris x86.
|
||||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
|
||||||
|
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GDB.
|
This file is part of GDB.
|
||||||
|
|
||||||
@ -46,8 +47,10 @@ static int i386_sol2_gregset_reg_offset[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386_sol2_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
|
||||||
/* Signal handler frames under Solaris 2 are recognized by a return
|
/* Signal handler frames under Solaris 2 are recognized by a return
|
||||||
address of 0xffffffff. */
|
address of 0xffffffff. */
|
||||||
return (pc == 0xffffffff);
|
return (pc == 0xffffffff);
|
||||||
@ -85,12 +88,11 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
tdep->sizeof_gregset = 19 * 4;
|
tdep->sizeof_gregset = 19 * 4;
|
||||||
tdep->sizeof_fpregset = 380;
|
tdep->sizeof_fpregset = 380;
|
||||||
|
|
||||||
|
/* Signal trampolines are slightly different from SVR4. */
|
||||||
|
tdep->sigtramp_p = i386_sol2_sigtramp_p;
|
||||||
tdep->sigcontext_addr = i386_sol2_mcontext_addr;
|
tdep->sigcontext_addr = i386_sol2_mcontext_addr;
|
||||||
tdep->sc_reg_offset = tdep->gregset_reg_offset;
|
tdep->sc_reg_offset = tdep->gregset_reg_offset;
|
||||||
tdep->sc_num_regs = tdep->gregset_num_regs;
|
tdep->sc_num_regs = tdep->gregset_num_regs;
|
||||||
|
|
||||||
/* Signal trampolines are slightly different from SVR4. */
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_sol2_pc_in_sigtramp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1051,17 +1051,27 @@ static const struct frame_unwind i386_sigtramp_frame_unwind =
|
|||||||
static const struct frame_unwind *
|
static const struct frame_unwind *
|
||||||
i386_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
i386_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
|
||||||
char *name;
|
|
||||||
|
|
||||||
/* We shouldn't even bother to try if the OSABI didn't register
|
/* We shouldn't even bother if we don't have a sigcontext_addr
|
||||||
a sigcontext_addr handler. */
|
handler. */
|
||||||
if (!gdbarch_tdep (current_gdbarch)->sigcontext_addr)
|
if (tdep->sigcontext_addr == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
if (tdep->sigtramp_p != NULL)
|
||||||
if (DEPRECATED_PC_IN_SIGTRAMP (pc, name))
|
{
|
||||||
return &i386_sigtramp_frame_unwind;
|
if (tdep->sigtramp_p (next_frame))
|
||||||
|
return &i386_sigtramp_frame_unwind;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdep->sigtramp_start != 0)
|
||||||
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
|
||||||
|
gdb_assert (tdep->sigtramp_end != 0);
|
||||||
|
if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
|
||||||
|
return &i386_sigtramp_frame_unwind;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1731,12 +1741,16 @@ i386_pe_skip_trampoline_code (CORE_ADDR pc, char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return non-zero if PC and NAME show that we are in a signal
|
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||||
trampoline. */
|
sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
return (name && strcmp ("_sigtramp", name) == 0);
|
return (name && strcmp ("_sigtramp", name) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1766,11 +1780,18 @@ i386_print_insn (bfd_vma pc, struct disassemble_info *info)
|
|||||||
|
|
||||||
/* System V Release 4 (SVR4). */
|
/* System V Release 4 (SVR4). */
|
||||||
|
|
||||||
|
/* Return whether the frame preciding NEXT_FRAME corresponds to a SVR4
|
||||||
|
sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386_svr4_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386_svr4_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
/* UnixWare uses _sigacthandler. The origin of the other symbols is
|
/* UnixWare uses _sigacthandler. The origin of the other symbols is
|
||||||
currently unknown. */
|
currently unknown. */
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
return (name && (strcmp ("_sigreturn", name) == 0
|
return (name && (strcmp ("_sigreturn", name) == 0
|
||||||
|| strcmp ("_sigacthandler", name) == 0
|
|| strcmp ("_sigacthandler", name) == 0
|
||||||
|| strcmp ("sigvechandler", name) == 0));
|
|| strcmp ("sigvechandler", name) == 0));
|
||||||
@ -1793,16 +1814,6 @@ i386_svr4_sigcontext_addr (struct frame_info *next_frame)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* DJGPP. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
i386_go32_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|
||||||
{
|
|
||||||
/* DJGPP doesn't have any special frames for signal handlers. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Generic ELF. */
|
/* Generic ELF. */
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1826,7 +1837,7 @@ i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||||
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_svr4_pc_in_sigtramp);
|
tdep->sigtramp_p = i386_svr4_sigtramp_p;
|
||||||
tdep->sigcontext_addr = i386_svr4_sigcontext_addr;
|
tdep->sigcontext_addr = i386_svr4_sigcontext_addr;
|
||||||
tdep->sc_pc_offset = 36 + 14 * 4;
|
tdep->sc_pc_offset = 36 + 14 * 4;
|
||||||
tdep->sc_sp_offset = 36 + 17 * 4;
|
tdep->sc_sp_offset = 36 + 17 * 4;
|
||||||
@ -1841,7 +1852,8 @@ i386_go32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
{
|
{
|
||||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_go32_pc_in_sigtramp);
|
/* DJGPP doesn't have any special frames for signal handlers. */
|
||||||
|
tdep->sigtramp_p = NULL;
|
||||||
|
|
||||||
tdep->jb_pc_offset = 36;
|
tdep->jb_pc_offset = 36;
|
||||||
}
|
}
|
||||||
@ -1973,6 +1985,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
tdep->struct_return = pcc_struct_return;
|
tdep->struct_return = pcc_struct_return;
|
||||||
tdep->sigtramp_start = 0;
|
tdep->sigtramp_start = 0;
|
||||||
tdep->sigtramp_end = 0;
|
tdep->sigtramp_end = 0;
|
||||||
|
tdep->sigtramp_p = i386_sigtramp_p;
|
||||||
tdep->sigcontext_addr = NULL;
|
tdep->sigcontext_addr = NULL;
|
||||||
tdep->sc_reg_offset = NULL;
|
tdep->sc_reg_offset = NULL;
|
||||||
tdep->sc_pc_offset = -1;
|
tdep->sc_pc_offset = -1;
|
||||||
@ -2034,7 +2047,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||||||
set_gdbarch_decr_pc_after_break (gdbarch, 1);
|
set_gdbarch_decr_pc_after_break (gdbarch, 1);
|
||||||
|
|
||||||
set_gdbarch_frame_args_skip (gdbarch, 8);
|
set_gdbarch_frame_args_skip (gdbarch, 8);
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_pc_in_sigtramp);
|
|
||||||
|
|
||||||
/* Wire in the MMX registers. */
|
/* Wire in the MMX registers. */
|
||||||
set_gdbarch_num_pseudo_regs (gdbarch, i386_num_mmx_regs);
|
set_gdbarch_num_pseudo_regs (gdbarch, i386_num_mmx_regs);
|
||||||
|
@ -89,6 +89,9 @@ struct gdbarch_tdep
|
|||||||
CORE_ADDR sigtramp_start;
|
CORE_ADDR sigtramp_start;
|
||||||
CORE_ADDR sigtramp_end;
|
CORE_ADDR sigtramp_end;
|
||||||
|
|
||||||
|
/* Detect sigtramp. */
|
||||||
|
int (*sigtramp_p) (struct frame_info *);
|
||||||
|
|
||||||
/* Get address of sigcontext for sigtramp. */
|
/* Get address of sigcontext for sigtramp. */
|
||||||
CORE_ADDR (*sigcontext_addr) (struct frame_info *);
|
CORE_ADDR (*sigcontext_addr) (struct frame_info *);
|
||||||
|
|
||||||
@ -217,9 +220,6 @@ extern void i386_svr4_init_abi (struct gdbarch_info, struct gdbarch *);
|
|||||||
/* Functions and variables exported from i386bsd-tdep.c. */
|
/* Functions and variables exported from i386bsd-tdep.c. */
|
||||||
|
|
||||||
extern void i386bsd_init_abi (struct gdbarch_info, struct gdbarch *);
|
extern void i386bsd_init_abi (struct gdbarch_info, struct gdbarch *);
|
||||||
extern int i386bsd_pc_in_sigtramp (CORE_ADDR pc, char *name);
|
|
||||||
extern CORE_ADDR i386bsd_sigtramp_start (CORE_ADDR pc);
|
|
||||||
extern CORE_ADDR i386bsd_sigtramp_end (CORE_ADDR pc);
|
|
||||||
extern CORE_ADDR i386fbsd_sigtramp_start_addr;
|
extern CORE_ADDR i386fbsd_sigtramp_start_addr;
|
||||||
extern CORE_ADDR i386fbsd_sigtramp_end_addr;
|
extern CORE_ADDR i386fbsd_sigtramp_end_addr;
|
||||||
extern CORE_ADDR i386obsd_sigtramp_start_addr;
|
extern CORE_ADDR i386obsd_sigtramp_start_addr;
|
||||||
|
@ -32,16 +32,6 @@
|
|||||||
|
|
||||||
/* Support for signal handlers. */
|
/* Support for signal handlers. */
|
||||||
|
|
||||||
/* Return whether PC is in a BSD sigtramp routine. */
|
|
||||||
|
|
||||||
int
|
|
||||||
i386bsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|
||||||
{
|
|
||||||
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
|
|
||||||
|
|
||||||
return (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
|
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
|
||||||
routine, return the address of the associated sigcontext structure. */
|
routine, return the address of the associated sigcontext structure. */
|
||||||
|
|
||||||
@ -56,22 +46,6 @@ i386bsd_sigcontext_addr (struct frame_info *next_frame)
|
|||||||
|
|
||||||
return read_memory_unsigned_integer (sp + 8, 4);
|
return read_memory_unsigned_integer (sp + 8, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the start address of the sigtramp routine. */
|
|
||||||
|
|
||||||
CORE_ADDR
|
|
||||||
i386bsd_sigtramp_start (CORE_ADDR pc)
|
|
||||||
{
|
|
||||||
return gdbarch_tdep (current_gdbarch)->sigtramp_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the end address of the sigtramp routine. */
|
|
||||||
|
|
||||||
CORE_ADDR
|
|
||||||
i386bsd_sigtramp_end (CORE_ADDR pc)
|
|
||||||
{
|
|
||||||
return gdbarch_tdep (current_gdbarch)->sigtramp_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Support for shared libraries. */
|
/* Support for shared libraries. */
|
||||||
@ -112,12 +86,6 @@ i386bsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
{
|
{
|
||||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
|
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386bsd_pc_in_sigtramp);
|
|
||||||
|
|
||||||
/* Allow the recognition of sigtramps as a function named <sigtramp>. */
|
|
||||||
set_gdbarch_deprecated_sigtramp_start (gdbarch, i386bsd_sigtramp_start);
|
|
||||||
set_gdbarch_deprecated_sigtramp_end (gdbarch, i386bsd_sigtramp_end);
|
|
||||||
|
|
||||||
/* Assume SunOS-style shared libraries. */
|
/* Assume SunOS-style shared libraries. */
|
||||||
set_gdbarch_in_solib_call_trampoline (gdbarch,
|
set_gdbarch_in_solib_call_trampoline (gdbarch,
|
||||||
i386bsd_aout_in_solib_call_trampoline);
|
i386bsd_aout_in_solib_call_trampoline);
|
||||||
|
@ -23,10 +23,12 @@
|
|||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "arch-utils.h"
|
#include "arch-utils.h"
|
||||||
|
#include "frame.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "regcache.h"
|
#include "regcache.h"
|
||||||
#include "regset.h"
|
#include "regset.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
|
#include "symtab.h"
|
||||||
|
|
||||||
#include "gdb_assert.h"
|
#include "gdb_assert.h"
|
||||||
#include "gdb_string.h"
|
#include "gdb_string.h"
|
||||||
@ -183,9 +185,16 @@ i386nbsd_sigtramp_offset (CORE_ADDR pc)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||||
|
NetBSD sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386nbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386nbsd_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
return (nbsd_pc_in_sigtramp (pc, name)
|
return (nbsd_pc_in_sigtramp (pc, name)
|
||||||
|| i386nbsd_sigtramp_offset (pc) >= 0);
|
|| i386nbsd_sigtramp_offset (pc) >= 0);
|
||||||
}
|
}
|
||||||
@ -225,12 +234,9 @@ i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
tdep->sizeof_gregset = 16 * 4;
|
tdep->sizeof_gregset = 16 * 4;
|
||||||
|
|
||||||
/* NetBSD has different signal trampoline conventions. */
|
/* NetBSD has different signal trampoline conventions. */
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386nbsd_pc_in_sigtramp);
|
tdep->sigtramp_start = 0;
|
||||||
/* FIXME: kettenis/20020906: We should probably provide
|
tdep->sigtramp_end = 0;
|
||||||
NetBSD-specific versions of these functions if we want to
|
tdep->sigtramp_p = i386nbsd_sigtramp_p;
|
||||||
recognize signal trampolines that live on the stack. */
|
|
||||||
set_gdbarch_deprecated_sigtramp_start (gdbarch, NULL);
|
|
||||||
set_gdbarch_deprecated_sigtramp_end (gdbarch, NULL);
|
|
||||||
|
|
||||||
/* NetBSD uses -freg-struct-return by default. */
|
/* NetBSD uses -freg-struct-return by default. */
|
||||||
tdep->struct_return = reg_struct_return;
|
tdep->struct_return = reg_struct_return;
|
||||||
|
@ -23,9 +23,12 @@
|
|||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "arch-utils.h"
|
#include "arch-utils.h"
|
||||||
|
#include "frame.h"
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "regcache.h"
|
#include "regcache.h"
|
||||||
#include "regset.h"
|
#include "regset.h"
|
||||||
|
#include "symtab.h"
|
||||||
|
#include "objfiles.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
|
|
||||||
@ -48,11 +51,13 @@
|
|||||||
/* Default page size. */
|
/* Default page size. */
|
||||||
static const int i386obsd_page_size = 4096;
|
static const int i386obsd_page_size = 4096;
|
||||||
|
|
||||||
/* Return whether PC is in an OpenBSD sigtramp routine. */
|
/* Return whether the frame preciding NEXT_FRAME corresponds to an
|
||||||
|
OpenBSD sigtramp routine. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
i386obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
i386obsd_sigtramp_p (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
||||||
const char sigreturn[] =
|
const char sigreturn[] =
|
||||||
{
|
{
|
||||||
@ -60,13 +65,17 @@ i386obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|||||||
0x67, 0x00, 0x00, 0x00, /* movl $SYS_sigreturn, %eax */
|
0x67, 0x00, 0x00, 0x00, /* movl $SYS_sigreturn, %eax */
|
||||||
0xcd, 0x80 /* int $0x80 */
|
0xcd, 0x80 /* int $0x80 */
|
||||||
};
|
};
|
||||||
char *buf;
|
char *name, *buf;
|
||||||
|
|
||||||
/* Avoid reading memory from the target if possible. If we're in a
|
/* If the function has a valid symbol name, it isn't a
|
||||||
named function, we're certainly not in a sigtramp routine
|
trampoline. */
|
||||||
provided by the kernel. Take synthetic function names into
|
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||||
account though. */
|
if (name != NULL)
|
||||||
if (name && name[0] != '<')
|
return 0;
|
||||||
|
|
||||||
|
/* If the function lives in a valid section (even without a starting
|
||||||
|
point) it isn't a trampoline. */
|
||||||
|
if (find_pc_section (pc) != NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* If we can't read the instructions at START_PC, return zero. */
|
/* If we can't read the instructions at START_PC, return zero. */
|
||||||
@ -78,34 +87,7 @@ i386obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|||||||
if (memcmp (buf, sigreturn, sizeof sigreturn) == 0)
|
if (memcmp (buf, sigreturn, sizeof sigreturn) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Check for a traditional BSD sigtramp routine. */
|
return 0;
|
||||||
return i386bsd_pc_in_sigtramp (pc, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the start address of the sigtramp routine. */
|
|
||||||
|
|
||||||
static CORE_ADDR
|
|
||||||
i386obsd_sigtramp_start (CORE_ADDR pc)
|
|
||||||
{
|
|
||||||
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
|
||||||
|
|
||||||
if (i386bsd_pc_in_sigtramp (pc, NULL))
|
|
||||||
return i386bsd_sigtramp_start (pc);
|
|
||||||
|
|
||||||
return start_pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the end address of the sigtramp routine. */
|
|
||||||
|
|
||||||
static CORE_ADDR
|
|
||||||
i386obsd_sigtramp_end (CORE_ADDR pc)
|
|
||||||
{
|
|
||||||
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
|
||||||
|
|
||||||
if (i386bsd_pc_in_sigtramp (pc, NULL))
|
|
||||||
return i386bsd_sigtramp_end (pc);
|
|
||||||
|
|
||||||
return start_pc + 0x22;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mapping between the general-purpose registers in `struct reg'
|
/* Mapping between the general-purpose registers in `struct reg'
|
||||||
@ -215,9 +197,7 @@ i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||||||
/* OpenBSD uses a different memory layout. */
|
/* OpenBSD uses a different memory layout. */
|
||||||
tdep->sigtramp_start = i386obsd_sigtramp_start_addr;
|
tdep->sigtramp_start = i386obsd_sigtramp_start_addr;
|
||||||
tdep->sigtramp_end = i386obsd_sigtramp_end_addr;
|
tdep->sigtramp_end = i386obsd_sigtramp_end_addr;
|
||||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386obsd_pc_in_sigtramp);
|
tdep->sigtramp_p = i386obsd_sigtramp_p;
|
||||||
set_gdbarch_deprecated_sigtramp_start (gdbarch, i386obsd_sigtramp_start);
|
|
||||||
set_gdbarch_deprecated_sigtramp_end (gdbarch, i386obsd_sigtramp_end);
|
|
||||||
|
|
||||||
/* OpenBSD has a `struct sigcontext' that's different from the
|
/* OpenBSD has a `struct sigcontext' that's different from the
|
||||||
original 4.3 BSD. */
|
original 4.3 BSD. */
|
||||||
|
Reference in New Issue
Block a user