inferior_ptid = ecs->ptid;
}
-/* Wrapper for DEPRECATED_PC_IN_SIGTRAMP that takes care of the need
- to find the function's name.
-
- In a classic example of "left hand VS right hand", "infrun.c" was
- trying to improve GDB's performance by caching the result of calls
- to calls to find_pc_partial_funtion, while at the same time
- find_pc_partial_function was also trying to ramp up performance by
- caching its most recent return value. The below makes the the
- function find_pc_partial_function solely responsibile for
- performance issues (the local cache that relied on a global
- variable - arrrggg - deleted).
-
- Using the testsuite and gcov, it was found that dropping the local
- "infrun.c" cache and instead relying on find_pc_partial_function
- increased the number of calls to 12000 (from 10000), but the number
- of times find_pc_partial_function's cache missed (this is what
- matters) was only increased by only 4 (to 3569). (A quick back of
- envelope caculation suggests that the extra 2000 function calls
- @1000 extra instructions per call make the 1 MIP VAX testsuite run
- take two extra seconds, oops :-)
-
- Long term, this function can be eliminated, replaced by the code:
- get_frame_type(current_frame()) == SIGTRAMP_FRAME (for new
- architectures this is very cheap). */
-
-static int
-pc_in_sigtramp (CORE_ADDR pc)
-{
- char *name;
- find_pc_partial_function (pc, &name, NULL, NULL);
- return DEPRECATED_PC_IN_SIGTRAMP (pc, name);
-}
-
/* Handle the inferior event in the cases when we just stepped
into a function. */
static void
check_sigtramp2 (struct execution_control_state *ecs)
{
- if (trap_expected
- && pc_in_sigtramp (stop_pc)
- && !pc_in_sigtramp (prev_pc)
- && INNER_THAN (read_sp (), step_sp))
- {
- /* What has happened here is that we have just stepped the
- inferior with a signal (because it is a signal which
- shouldn't make us stop), thus stepping into sigtramp.
+ char *name;
+ struct symtab_and_line sr_sal;
- So we need to set a step_resume_break_address breakpoint and
- continue until we hit it, and then step. FIXME: This should
- be more enduring than a step_resume breakpoint; we should
- know that we will later need to keep going rather than
- re-hitting the breakpoint here (see the testsuite,
- gdb.base/signals.exp where it says "exceedingly difficult"). */
+ /* Check that what has happened here is that we have just stepped
+ the inferior with a signal (because it is a signal which
+ shouldn't make us stop), thus stepping into sigtramp. */
+
+ if (!trap_expected)
+ return;
+ if (get_frame_type (get_current_frame ()) != SIGTRAMP_FRAME)
+ return;
+ /* Long term, this function can be eliminated, replaced by the code:
+ get_frame_type(current_frame()) == SIGTRAMP_FRAME (for new
+ architectures this is very cheap). */
+ find_pc_partial_function (prev_pc, &name, NULL, NULL);
+ if (DEPRECATED_PC_IN_SIGTRAMP (prev_pc, name))
+ return;
+ if (!INNER_THAN (read_sp (), step_sp))
+ return;
- struct symtab_and_line sr_sal;
+ /* So we need to set a step_resume_break_address breakpoint and
+ continue until we hit it, and then step. FIXME: This should be
+ more enduring than a step_resume breakpoint; we should know that
+ we will later need to keep going rather than re-hitting the
+ breakpoint here (see the testsuite, gdb.base/signals.exp where it
+ says "exceedingly difficult"). */
- init_sal (&sr_sal); /* initialize to zeroes */
- sr_sal.pc = prev_pc;
- sr_sal.section = find_pc_overlay (sr_sal.pc);
- /* We perhaps could set the frame if we kept track of what the
- frame corresponding to prev_pc was. But we don't, so don't. */
- through_sigtramp_breakpoint =
- set_momentary_breakpoint (sr_sal, null_frame_id, bp_through_sigtramp);
- if (breakpoints_inserted)
- insert_breakpoints ();
+ init_sal (&sr_sal); /* initialize to zeroes */
+ sr_sal.pc = prev_pc;
+ sr_sal.section = find_pc_overlay (sr_sal.pc);
+ /* We perhaps could set the frame if we kept track of what the frame
+ corresponding to prev_pc was. But we don't, so don't. */
+ through_sigtramp_breakpoint =
+ set_momentary_breakpoint (sr_sal, null_frame_id, bp_through_sigtramp);
+ if (breakpoints_inserted)
+ insert_breakpoints ();
- ecs->remove_breakpoints_on_following_step = 1;
- ecs->another_trap = 1;
- }
+ ecs->remove_breakpoints_on_following_step = 1;
+ ecs->another_trap = 1;
}
/* Subroutine call with source code we should not step over. Do step