+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
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"
/* 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
&& !(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. */
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. */
/* 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. */
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;
}
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 ()
/* 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.
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
#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. */
? 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
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
/* 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
};
#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
/* 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,
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;
((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). */
extern struct objfile *current_objfile;
+/* From utils.c. */
+extern int demangle;
+extern int asm_demangle;
+
extern struct symtab *
lookup_symtab PARAMS ((char *));
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));
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;
/* source.c */
-extern int frame_file_full_name; /* in stack.c */
-
extern int
identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
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) */