* mips-tdep.c (mips_in_call_stub, mips_in_return_stub,
authorMark Alexander <marka@cygnus>
Thu, 3 Apr 1997 19:43:39 +0000 (19:43 +0000)
committerMark Alexander <marka@cygnus>
Thu, 3 Apr 1997 19:43:39 +0000 (19:43 +0000)
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
gdb/config/mips/tm-mips.h
gdb/infrun.c

index 98d0f9d5fc992910c3fd087117a920b93e7184b6..3d45b9b369bba218f8fa70065d600d99a9c167b3 100644 (file)
@@ -1,3 +1,22 @@
+Thu Apr  3 10:31:12 1997  Mark Alexander  <marka@cygnus.com>
+
+       * 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  <dje@canuck.cygnus.com>
 
        * remote-sim.c (gdbsim_open): Check return code from sim_open.
index 64a26b55846462e5084d955f1ecb3ae110b0befb..e052810949dc681be7fb8b90218b42649dce8569 100644 (file)
@@ -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
index 4cc423c6f5c1dabd13f8f6009a53fd9b00429e92..2e1dc95f63a1e05c87ff566d70cd3790971df4f1 100644 (file)
@@ -34,13 +34,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include <signal.h>
 
-/* unistd.h is needed to #define X_OK */
-#ifdef USG
-#include <unistd.h>
-#else
-#include <sys/file.h>
-#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.  */