* infrun.c (wait_for_inferior): Disable questionable code near
authorStu Grossman <grossman@cygnus>
Tue, 24 Oct 1995 21:22:56 +0000 (21:22 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 24 Oct 1995 21:22:56 +0000 (21:22 +0000)
the step range test.  Replace call detection test with much
simpler (and more efficient) test that doesn't require prologue
examination (as often).
* symtab.c symtab.h (in_prologue):  New function that indicates
whether or not we are in a function prologue.  This uses the
symbol table, and then falls back to prologue examination if that
fails.  It's much more efficient for remote debugging because it
avoids examining memory, which is very slow.  This is used in
wait_for_inferior to determine if we've made a function call that
needs to be skipped over (for next/nexti).
* mips-tdep.c (after_prologue):  New function, returns the PC
after the prologue.  Uses PDRs and the symbol table.
(mips_find_saved_regs):  Use in_prologue() to avoid costly
prologue examination if possible.
(mips_skip_prologue):  Use after_prologue() if possible to avoid
costly prologue examination.

gdb/ChangeLog
gdb/infrun.c
gdb/symtab.c
gdb/symtab.h

index 01ac370de1309fc9318a833c038f037376188732..8038a683e2af9a6941251e7adc949e51643a8983 100644 (file)
@@ -1,3 +1,23 @@
+Tue Oct 24 12:26:14 1995  Stu Grossman  (grossman@cygnus.com)
+
+       * infrun.c (wait_for_inferior):  Disable questionable code near
+       the step range test.  Replace call detection test with much
+       simpler (and more efficient) test that doesn't require prologue
+       examination (as often).
+       * symtab.c symtab.h (in_prologue):  New function that indicates
+       whether or not we are in a function prologue.  This uses the
+       symbol table, and then falls back to prologue examination if that
+       fails.  It's much more efficient for remote debugging because it
+       avoids examining memory, which is very slow.  This is used in
+       wait_for_inferior to determine if we've made a function call that
+       needs to be skipped over (for next/nexti).
+       * mips-tdep.c (after_prologue):  New function, returns the PC
+       after the prologue.  Uses PDRs and the symbol table.
+       (mips_find_saved_regs):  Use in_prologue() to avoid costly
+       prologue examination if possible.
+       (mips_skip_prologue):  Use after_prologue() if possible to avoid
+       costly prologue examination.
+
 Mon Oct 23 16:03:33 1995  James G. Smith  <jsmith@pasanda.cygnus.co.uk>
 
        * configure.in (configdirs): Added support for the VR4300 default
index a55744a20c092ece68a3ddc88bc5699c0f6b78dd..73647aa35d205448dc5e95e62ad9efe51bdf2fd5 100644 (file)
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -1068,6 +1068,10 @@ wait_for_inferior ()
       /* If stepping through a line, keep going if still within it.  */
       if (stop_pc >= step_range_start
          && stop_pc < step_range_end
+#if 0
+/* I haven't a clue what might trigger this clause, and it seems wrong anyway,
+   so I've disabled it until someone complains.  -Stu 10/24/95 */
+
          /* The step range might include the start of the
             function, so if we are at the start of the
             step range and either the stack or frame pointers
@@ -1075,7 +1079,9 @@ wait_for_inferior ()
          && !(stop_pc == step_range_start
               && FRAME_FP (get_current_frame ())
               && (read_sp () INNER_THAN step_sp
-                  || FRAME_FP (get_current_frame ()) != step_frame_address)))
+                  || FRAME_FP (get_current_frame ()) != step_frame_address))
+#endif
+)
        {
          /* We might be doing a BPSTAT_WHAT_SINGLE and getting a signal.
             So definately need to check for sigtramp here.  */
@@ -1131,7 +1137,13 @@ wait_for_inferior ()
          goto keep_going;
        }
 
-#if 1
+#if 0
+      /* I disabled this test because it was too complicated and slow.  The
+        SKIP_PROLOGUE was especially slow, because it caused unnecessary
+        prologue examination on various architectures.  The code in the #else
+        clause has been tested on the Sparc, Mips, PA, and Power
+        architectures, so it's pretty likely to be correct.  -Stu 10/24/95 */
+
       /* See if we left the step range due to a subroutine call that
         we should proceed to the end of.  */
 
@@ -1199,10 +1211,12 @@ wait_for_inferior ()
 /* This is experimental code which greatly simplifies the subroutine call
    test.  I've actually tested on the Alpha, and it works great. -Stu */
 
-       if (in_prologue (stop_pc, NULL)
-           || (prev_func_start != 0
-               && stop_func_start == 0))
+       if (stop_pc == stop_func_start /* Quick test */
+           || in_prologue (stop_pc, stop_func_start)
+           || IN_SOLIB_CALL_TRAMPOLINE (stop_pc, stop_func_name)
+           || stop_func_start == 0)
 #endif
+
        {
          /* It's a subroutine call.  */
 
index a0337e3435d5d494f1722d2aeeacb1effd6cae14..fa3d2e54e37dae2ff08815c7194b26d4593d4ae5 100644 (file)
@@ -2874,7 +2874,7 @@ list_symbols (regexp, class, bpt, from_tty)
                           if (bpt)
                             {
                               break_command (SYMBOL_NAME (msymbol), from_tty);
-                              printf_filtered ("<function, no debug info>%s;\n",
+                              printf_filtered ("<function, no debug info> %s;\n",
                                                SYMBOL_SOURCE_NAME (msymbol));
                               continue;
                             }
@@ -3240,6 +3240,51 @@ make_symbol_completion_list (text, word)
   return (return_val);
 }
 
+/* Determine if PC is in the prologue of a function.  The prologue is the area
+   between the first instruction of a function, and the first executable line.
+   Returns 1 if PC *might* be in prologue, 0 if definately *not* in prologue.
+ */
+
+int
+in_prologue (pc, func_start)
+     CORE_ADDR pc;
+     CORE_ADDR func_start;
+{
+  struct symtab_and_line sal;
+  CORE_ADDR func_addr, func_end;
+
+  if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
+    goto nosyms;               /* Might be in prologue */
+
+  sal = find_pc_line (func_addr, 0);
+
+  if (sal.line == 0)
+    goto nosyms;
+
+  if (sal.end > func_addr
+      && sal.end <= func_end)  /* Is prologue in function? */
+    return pc < sal.end;       /* Yes, is pc in prologue? */
+
+  /* The line after the prologue seems to be outside the function.  In this
+     case, tell the caller to find the prologue the hard way.  */
+
+  return 1;
+
+/* Come here when symtabs don't contain line # info.  In this case, it is
+   likely that the user has stepped into a library function w/o symbols, or
+   is doing a stepi/nexti through code without symbols.  */
+
+ nosyms:
+
+/* We need to call the target-specific prologue skipping functions with the
+   function's start address because PC may be pointing at an instruction that
+   could be mistakenly considered part of the prologue.  */
+
+  SKIP_PROLOGUE (func_start);
+
+  return pc < func_start;
+}
+
 \f
 void
 _initialize_symtab ()
index cd1ad34ee2e686976fb77f4c2d644b40963f5d97..777b1079d1550366d2aa23fb2d0b581f2609988e 100644 (file)
@@ -1,5 +1,5 @@
 /* Symbol table definitions for GDB.
-   Copyright 1986, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1986, 1989, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -15,7 +15,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #if !defined (SYMTAB_H)
 #define SYMTAB_H 1
@@ -121,9 +121,6 @@ struct general_symbol_info
 #define SYMBOL_CPLUS_DEMANGLED_NAME(symbol)    \
   (symbol)->ginfo.language_specific.cplus_specific.demangled_name
 
-
-extern int demangle;   /* We reference it, so go ahead and declare it. */
-
 /* Macro that initializes the language dependent portion of a symbol
    depending upon the language for the symbol. */
 
@@ -232,10 +229,6 @@ extern int demangle;       /* We reference it, so go ahead and declare it. */
    ? SYMBOL_DEMANGLED_NAME (symbol)                                    \
    : SYMBOL_NAME (symbol))
 
-/* From utils.c.  */
-extern int demangle;
-extern int asm_demangle;
-
 /* Macro that tests a symbol for a match against a specified name string.
    First test the unencoded name, then looks for and test a C++ encoded
    name if it exists.  Note that whitespace is ignored while attempting to
@@ -291,6 +284,11 @@ struct minimal_symbol
 
   char *info;
 
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+  /* Which source file is this symbol in?  Only relevant for mst_file_*.  */
+  char *filename;
+#endif
+
   /* Classification types for this symbol.  These should be taken as "advisory
      only", since if gdb can't easily figure out a classification it simply
      selects mst_unknown.  It may also have to guess when it can't figure out
@@ -584,7 +582,7 @@ struct symbol
 
   /* Address class */
 
-  enum address_class class BYTE_BITFIELD;
+  enum address_class aclass BYTE_BITFIELD;
 
   /* Line number of definition.  FIXME:  Should we really make the assumption
      that nobody will try to debug files longer than 64K lines?  What about
@@ -604,7 +602,7 @@ struct symbol
 };
 
 #define SYMBOL_NAMESPACE(symbol)       (symbol)->namespace
-#define SYMBOL_CLASS(symbol)           (symbol)->class
+#define SYMBOL_CLASS(symbol)           (symbol)->aclass
 #define SYMBOL_TYPE(symbol)            (symbol)->type
 #define SYMBOL_LINE(symbol)            (symbol)->line
 #define SYMBOL_BASEREG(symbol)         (symbol)->aux_value.basereg
@@ -629,12 +627,12 @@ struct partial_symbol
 
   /* Address class (for info_symbols) */
 
-  enum address_class class BYTE_BITFIELD;
+  enum address_class aclass BYTE_BITFIELD;
 
 };
 
 #define PSYMBOL_NAMESPACE(psymbol)     (psymbol)->namespace
-#define PSYMBOL_CLASS(psymbol)         (psymbol)->class
+#define PSYMBOL_CLASS(psymbol)         (psymbol)->aclass
 
 \f
 /* Source-file information.  This describes the relation between source files,
@@ -728,7 +726,7 @@ struct symtab
     struct linetable *linetable;
 
     /* Section in objfile->section_offsets for the blockvector and
-       the linetable.  */
+       the linetable.  Probably always SECT_OFF_TEXT.  */
 
     int block_line_section;
 
@@ -924,10 +922,14 @@ struct partial_symtab
   ((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
 
 /* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
-   names.  Note that this macro is g++ specific (FIXME).  */
+   names.  Note that this macro is g++ specific (FIXME).
+   '_vt$' is the old cfront-style vtables; '_VT$' is the new
+   style, using thunks (where '$' is really CPLUS_MARKER). */
 
 #define VTBL_PREFIX_P(NAME) \
-  ((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
+  ((NAME)[3] == CPLUS_MARKER && (NAME)[0] == '_' \
+   && (((NAME)[1] == 'V' && (NAME)[2] == 'T') \
+       || ((NAME)[1] == 'v' && (NAME)[2] == 't')))
 
 /* Macro that yields non-zero value iff NAME is the prefix for C++ destructor
    names.  Note that this macro is g++ specific (FIXME).  */
@@ -950,6 +952,10 @@ extern int current_source_line;
 
 extern struct objfile *current_objfile;
 
+/* From utils.c.  */
+extern int demangle;
+extern int asm_demangle;
+
 extern struct symtab *
 lookup_symtab PARAMS ((char *));
 
@@ -1020,14 +1026,23 @@ extern void prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
                                                enum minimal_symbol_type,
                                                struct objfile *));
 
-extern void prim_record_minimal_symbol_and_info
+extern struct minimal_symbol *prim_record_minimal_symbol_and_info
   PARAMS ((const char *, CORE_ADDR,
           enum minimal_symbol_type,
           char *info, int section,
           struct objfile *));
 
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+extern CORE_ADDR find_stab_function_addr PARAMS ((char *,
+                                                 struct partial_symtab *,
+                                                 struct objfile *));
+#endif
+
 extern struct minimal_symbol *
-lookup_minimal_symbol PARAMS ((const char *, struct objfile *));
+lookup_minimal_symbol PARAMS ((const char *, const char *, struct objfile *));
+
+extern struct minimal_symbol *
+lookup_minimal_symbol_text PARAMS ((const char *, const char *, struct objfile *));
 
 extern struct minimal_symbol *
 lookup_minimal_symbol_by_pc PARAMS ((CORE_ADDR));
@@ -1047,6 +1062,10 @@ discard_minimal_symbols PARAMS ((int));
 extern void
 install_minimal_symbols PARAMS ((struct objfile *));
 
+/* Sort all the minimal symbols in OBJFILE.  */
+
+extern void msymbols_sort PARAMS ((struct objfile *objfile));
+
 struct symtab_and_line
 {
   struct symtab *symtab;
@@ -1140,8 +1159,6 @@ symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int));
 
 /* source.c */
 
-extern int frame_file_full_name; /* in stack.c */
-
 extern int
 identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
 
@@ -1174,4 +1191,9 @@ clear_symtab_users PARAMS ((void));
 extern enum language
 deduce_language_from_filename PARAMS ((char *));
 
+/* symtab.c */
+
+extern int
+in_prologue PARAMS ((CORE_ADDR pc, CORE_ADDR func_start));
+
 #endif /* !defined(SYMTAB_H) */