From 4eb4b87e13548a3cdf14f779d52dd51f50bff5e6 Mon Sep 17 00:00:00 2001 From: Mark Alexander Date: Thu, 3 Apr 1997 19:43:39 +0000 Subject: [PATCH] * mips-tdep.c (mips_in_call_stub, mips_in_return_stub, mips_skip_stub, mips_ignore_helper): New functions for dealing with MIPS16 call/return thunks. (mips_init_frame_pc_first): New function to implement INIT_FRAME_PC_FIRST macro; includes code from old macro plus new code to skip over MIPS16 thunks. (mips_frame_chain): Skip over MIPS16 thunks. * config/mips/tm-mips.h (mips_in_call_stub, mips_in_return_stub, mips_skip_stub, mips_ignore_helper): Declare. (IN_SOLIB_CALL_TRAMPOLINE, IN_SOLIB_RETURN_TRAMPOLINE, SKIP_TRAMPOLINE_CODE, IGNORE_HELPER_CALL): New macros that invoke the above functions. (INIT_FRAME_PC_FIRST): Change to invoke mips_init_frame_pc. (mips_init_frame_pc): Declare. * infrun.c (wait_for_inferior): Use new IGNORE_HELPER_CALL macro to decide if certain library function calls should be ignored. --- gdb/ChangeLog | 19 +++++++++++++ gdb/config/mips/tm-mips.h | 14 ++++++++-- gdb/infrun.c | 57 ++++++++++++++++++++------------------- 3 files changed, 60 insertions(+), 30 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 98d0f9d5fc9..3d45b9b369b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,22 @@ +Thu Apr 3 10:31:12 1997 Mark Alexander + + * mips-tdep.c (mips_in_call_stub, mips_in_return_stub, + mips_skip_stub, mips_ignore_helper): New functions for dealing + with MIPS16 call/return thunks. + (mips_init_frame_pc_first): New function to implement + INIT_FRAME_PC_FIRST macro; includes code from old macro plus + new code to skip over MIPS16 thunks. + (mips_frame_chain): Skip over MIPS16 thunks. + * config/mips/tm-mips.h (mips_in_call_stub, mips_in_return_stub, + mips_skip_stub, mips_ignore_helper): Declare. + (IN_SOLIB_CALL_TRAMPOLINE, IN_SOLIB_RETURN_TRAMPOLINE, + SKIP_TRAMPOLINE_CODE, IGNORE_HELPER_CALL): New macros that invoke + the above functions. + (INIT_FRAME_PC_FIRST): Change to invoke mips_init_frame_pc. + (mips_init_frame_pc): Declare. + * infrun.c (wait_for_inferior): Use new IGNORE_HELPER_CALL macro + to decide if certain library function calls should be ignored. + Wed Apr 2 14:16:51 1997 Doug Evans * remote-sim.c (gdbsim_open): Check return code from sim_open. diff --git a/gdb/config/mips/tm-mips.h b/gdb/config/mips/tm-mips.h index 64a26b55846..e052810949d 100644 --- a/gdb/config/mips/tm-mips.h +++ b/gdb/config/mips/tm-mips.h @@ -425,8 +425,8 @@ extern void mips_pop_frame PARAMS ((void)); #define INIT_FRAME_PC(fromleaf, prev) /* nada */ #define INIT_FRAME_PC_FIRST(fromleaf, prev) \ - (prev)->pc = ((fromleaf) ? SAVED_PC_AFTER_CALL ((prev)->next) : \ - (prev)->next ? FRAME_SAVED_PC ((prev)->next) : read_pc ()); + mips_init_frame_pc_first(fromleaf, prev) +extern void mips_init_frame_pc_first PARAMS ((int, struct frame_info *)); /* Special symbol found in blocks associated with routines. We can hang mips_extra_func_info_t's off of this. */ @@ -505,6 +505,16 @@ extern void fixup_sigtramp PARAMS ((void)); /* Defined in mips-tdep.c and used in remote-mips.c */ extern char *mips_read_processor_type PARAMS ((void)); +/* Functions for dealing with MIPS16 call and return stubs. */ +#define IN_SOLIB_CALL_TRAMPOLINE(pc, name) mips_in_call_stub (pc, name) +#define IN_SOLIB_RETURN_TRAMPOLINE(pc, name) mips_in_return_stub (pc, name) +#define SKIP_TRAMPOLINE_CODE(pc) mips_skip_stub (pc) +#define IGNORE_HELPER_CALL(pc) mips_ignore_helper (pc) +extern int mips_in_call_stub PARAMS ((CORE_ADDR pc, char *name)); +extern int mips_in_return_stub PARAMS ((CORE_ADDR pc, char *name)); +extern CORE_ADDR mips_skip_stub PARAMS ((CORE_ADDR pc)); +extern int mips_ignore_helper PARAMS ((CORE_ADDR pc)); + #ifndef TARGET_MIPS #define TARGET_MIPS #endif diff --git a/gdb/infrun.c b/gdb/infrun.c index 4cc423c6f5c..2e1dc95f63a 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -34,13 +34,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -/* unistd.h is needed to #define X_OK */ -#ifdef USG -#include -#else -#include -#endif - /* Prototypes for local functions */ static void signals_info PARAMS ((char *, int)); @@ -104,6 +97,14 @@ static void delete_breakpoint_current_contents PARAMS ((PTR)); #define IN_SOLIB_RETURN_TRAMPOLINE(pc,name) 0 #endif +/* On MIPS16, a function that returns a floating point value may call + a library helper function to copy the return value to a floating point + register. The IGNORE_HELPER_CALL macro returns non-zero if we + should ignore (i.e. step over) this function call. */ +#ifndef IGNORE_HELPER_CALL +#define IGNORE_HELPER_CALL(pc) 0 +#endif + /* On some systems, the PC may be left pointing at an instruction that won't actually be executed. This is usually indicated by a bit in the PSW. If we find ourselves in such a state, then we step the target beyond the @@ -304,7 +305,7 @@ proceed (addr, siggnal, step) step one instruction before inserting breakpoints so that we do not stop right away. */ - if (breakpoint_here_p (read_pc ())) + if (read_pc () == stop_pc && breakpoint_here_p (read_pc ())) oneproc = 1; #ifdef STEP_SKIPS_DELAY @@ -797,6 +798,7 @@ wait_for_inferior () #endif stop_func_start = 0; + stop_func_end = 0; stop_func_name = 0; /* Don't care about return value; stop_func_start and stop_func_name will both be 0 if it doesn't work. */ @@ -857,7 +859,7 @@ wait_for_inferior () /* See if there is a breakpoint at the current PC. */ stop_bpstat = bpstat_stop_status (&stop_pc, -#if DECR_PC_AFTER_BREAK + (DECR_PC_AFTER_BREAK ? /* Notice the case of stepping through a jump that lands just after a breakpoint. Don't confuse that with hitting the breakpoint. @@ -865,10 +867,8 @@ wait_for_inferior () and 2) the pc before the last insn does not match the address of the breakpoint before the current pc. */ (prev_pc != stop_pc - DECR_PC_AFTER_BREAK - && CURRENTLY_STEPPING ()) -#else /* DECR_PC_AFTER_BREAK zero */ - 0 -#endif /* DECR_PC_AFTER_BREAK zero */ + && CURRENTLY_STEPPING ()) : + 0) ); /* Following in case break condition called a function. */ @@ -1080,10 +1080,13 @@ wait_for_inferior () breakpoint_re_set. */ target_terminal_ours_for_output (); SOLIB_ADD (NULL, 0, NULL); - re_enable_breakpoints_in_shlibs (); target_terminal_inferior (); } + /* Try to reenable shared library breakpoints, additional + code segments in shared libraries might be mapped in now. */ + re_enable_breakpoints_in_shlibs (); + /* If requested, stop when the dynamic linker notifies gdb of events. This allows the user to get control and place breakpoints in initializer routines for @@ -1203,9 +1206,8 @@ wait_for_inferior () { struct symtab_and_line sr_sal; + INIT_SAL (&sr_sal); /* initialize to zeroes */ sr_sal.pc = prev_pc; - sr_sal.symtab = NULL; - sr_sal.line = 0; /* We could probably be setting the frame to step_frame_address; I don't think anyone thought to try it. */ step_resume_breakpoint = @@ -1320,7 +1322,7 @@ wait_for_inferior () break; } - if (step_over_calls > 0) + if (step_over_calls > 0 || IGNORE_HELPER_CALL (stop_pc)) /* We're doing a "next". */ goto step_over_function; @@ -1338,10 +1340,10 @@ wait_for_inferior () if (tmp) { struct symtab_and_line xxx; - + /* Why isn't this s_a_l called "sr_sal", like all of the + other s_a_l's where this code is duplicated? */ + INIT_SAL (&xxx); /* initialize to zeroes */ xxx.pc = tmp; - xxx.symtab = NULL; - xxx.line = 0; step_resume_breakpoint = set_momentary_breakpoint (xxx, NULL, bp_step_resume); insert_breakpoints (); @@ -1368,11 +1370,11 @@ step_over_function: { /* Set a special breakpoint after the return */ struct symtab_and_line sr_sal; + + INIT_SAL (&sr_sal); /* initialize to zeroes */ sr_sal.pc = ADDR_BITS_REMOVE (SAVED_PC_AFTER_CALL (get_current_frame ())); - sr_sal.symtab = NULL; - sr_sal.line = 0; step_resume_breakpoint = set_momentary_breakpoint (sr_sal, get_current_frame (), bp_step_resume); @@ -1418,9 +1420,8 @@ step_into_function: { struct symtab_and_line sr_sal; + INIT_SAL (&sr_sal); /* initialize to zeroes */ sr_sal.pc = stop_func_start; - sr_sal.symtab = NULL; - sr_sal.line = 0; /* Do not specify what the fp should be when we stop since on some machines the prologue is where the new fp value is established. */ @@ -1462,9 +1463,8 @@ step_into_function: /* And put the step-breakpoint there and go until there. */ struct symtab_and_line sr_sal; + INIT_SAL (&sr_sal); /* initialize to zeroes */ sr_sal.pc = tmp; - sr_sal.symtab = NULL; - sr_sal.line = 0; /* Do not specify what the fp should be when we stop since on some machines the prologue is where the new fp value is established. */ @@ -1520,6 +1520,8 @@ step_into_function: step_range_start = sal.pc; step_range_end = sal.end; step_frame_address = FRAME_FP (get_current_frame ()); + current_line = sal.line; + current_symtab = sal.symtab; goto keep_going; check_sigtramp2: @@ -1540,9 +1542,8 @@ step_into_function: it says "exceedingly difficult"). */ struct symtab_and_line sr_sal; + INIT_SAL (&sr_sal); /* initialize to zeroes */ sr_sal.pc = prev_pc; - sr_sal.symtab = NULL; - sr_sal.line = 0; /* 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. */ -- 2.30.2