* 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.
This commit is contained in:
Stu Grossman 1995-10-24 21:22:56 +00:00
parent 43b428a7bf
commit 3f687c7896
4 changed files with 128 additions and 27 deletions

View 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

View 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. */

View 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;
}
void
_initialize_symtab ()

View 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
/* 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) */