2002-04-21 Andrew Cagney * 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. Index: doc/ChangeLog 2002-04-21 Andrew Cagney * gdbint.texinfo (Target Architecture Definition): Replace IN_SIGTRAMP with PC_IN_SIGTRAMP. Index: alpha-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/alpha-tdep.c,v retrieving revision 1.20 diff -u -r1.20 alpha-tdep.c --- alpha-tdep.c 19 Apr 2002 05:11:52 -0000 1.20 +++ alpha-tdep.c 21 Apr 2002 17:18:34 -0000 @@ -236,7 +236,7 @@ { 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; @@ -968,7 +968,7 @@ 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); Index: arch-utils.c =================================================================== RCS file: /cvs/src/src/gdb/arch-utils.c,v retrieving revision 1.52 diff -u -r1.52 arch-utils.c --- arch-utils.c 18 Apr 2002 18:08:58 -0000 1.52 +++ arch-utils.c 21 Apr 2002 17:18:35 -0000 @@ -423,6 +423,24 @@ 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. */ Index: arch-utils.h =================================================================== RCS file: /cvs/src/src/gdb/arch-utils.h,v retrieving revision 1.29 diff -u -r1.29 arch-utils.h --- arch-utils.h 6 Feb 2002 13:00:44 -0000 1.29 +++ arch-utils.h 21 Apr 2002 17:18:35 -0000 @@ -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. @@ -155,6 +156,9 @@ /* Assume the virtual size of registers corresponds to the virtual type. */ 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. */ Index: arm-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/arm-tdep.c,v retrieving revision 1.49 diff -u -r1.49 arm-tdep.c --- arm-tdep.c 21 Apr 2002 03:46:44 -0000 1.49 +++ arm-tdep.c 21 Apr 2002 17:18:46 -0000 @@ -1075,20 +1075,20 @@ 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); Index: blockframe.c =================================================================== RCS file: /cvs/src/src/gdb/blockframe.c,v retrieving revision 1.24 diff -u -r1.24 blockframe.c --- blockframe.c 14 Apr 2002 13:38:06 -0000 1.24 +++ blockframe.c 21 Apr 2002 17:18:58 -0000 @@ -227,7 +227,7 @@ 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 @@ 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 @@ /* 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); Index: breakpoint.c =================================================================== RCS file: /cvs/src/src/gdb/breakpoint.c,v retrieving revision 1.72 diff -u -r1.72 breakpoint.c --- breakpoint.c 9 Apr 2002 22:33:25 -0000 1.72 +++ breakpoint.c 21 Apr 2002 17:19:16 -0000 @@ -2850,7 +2850,7 @@ /* 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 (?). */ Index: gdbarch.sh =================================================================== RCS file: /cvs/src/src/gdb/gdbarch.sh,v retrieving revision 1.128 diff -u -r1.128 gdbarch.sh --- gdbarch.sh 20 Apr 2002 17:41:18 -0000 1.128 +++ gdbarch.sh 21 Apr 2002 17:19:34 -0000 @@ -608,6 +608,27 @@ # 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() Index: hppa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.c,v retrieving revision 1.25 diff -u -r1.25 hppa-tdep.c --- hppa-tdep.c 12 Apr 2002 18:18:57 -0000 1.25 +++ hppa-tdep.c 21 Apr 2002 17:19:49 -0000 @@ -633,7 +633,8 @@ 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 @@ 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; Index: i386-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/i386-linux-tdep.c,v retrieving revision 1.11 diff -u -r1.11 i386-linux-tdep.c --- i386-linux-tdep.c 24 Feb 2002 22:31:19 -0000 1.11 +++ i386-linux-tdep.c 21 Apr 2002 17:19:49 -0000 @@ -92,7 +92,7 @@ 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 @@ 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, Index: inferior.h =================================================================== RCS file: /cvs/src/src/gdb/inferior.h,v retrieving revision 1.26 diff -u -r1.26 inferior.h --- inferior.h 10 Apr 2002 22:00:20 -0000 1.26 +++ inferior.h 21 Apr 2002 17:19:52 -0000 @@ -403,29 +403,6 @@ 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 Index: infrun.c =================================================================== RCS file: /cvs/src/src/gdb/infrun.c,v retrieving revision 1.56 diff -u -r1.56 infrun.c --- infrun.c 18 Mar 2002 02:26:31 -0000 1.56 +++ infrun.c 21 Apr 2002 17:20:24 -0000 @@ -2640,8 +2640,8 @@ 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 @@ { /* 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 @@ 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 Index: mips-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/mips-tdep.c,v retrieving revision 1.70 diff -u -r1.70 mips-tdep.c --- mips-tdep.c 18 Apr 2002 18:09:02 -0000 1.70 +++ mips-tdep.c 21 Apr 2002 17:20:29 -0000 @@ -2108,7 +2108,7 @@ 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 @@ 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))); Index: ppc-linux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/ppc-linux-tdep.c,v retrieving revision 1.15 diff -u -r1.15 ppc-linux-tdep.c --- ppc-linux-tdep.c 18 Apr 2002 18:09:06 -0000 1.15 +++ ppc-linux-tdep.c 21 Apr 2002 17:20:29 -0000 @@ -106,10 +106,11 @@ /* 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 @@ 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) Index: doc/gdbint.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdbint.texinfo,v retrieving revision 1.77 diff -u -r1.77 gdbint.texinfo --- doc/gdbint.texinfo 21 Apr 2002 15:52:35 -0000 1.77 +++ doc/gdbint.texinfo 21 Apr 2002 17:21:26 -0000 @@ -3095,11 +3095,6 @@ 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}) @@ -3297,6 +3292,16 @@ @item PC_IN_CALL_DUMMY @findex PC_IN_CALL_DUMMY See @file{inferior.h}. + +@item PC_IN_SIGTRAMP (@var{pc}, @var{name}) +@findex PC_IN_SIGTRAMP +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 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