From: Stu Grossman Date: Tue, 24 Oct 1995 21:22:56 +0000 (+0000) Subject: * infrun.c (wait_for_inferior): Disable questionable code near X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3f687c7896795bac80f4e2e15f565562f34b4e30;p=binutils-gdb.git * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 01ac370de13..8038a683e2a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 * configure.in (configdirs): Added support for the VR4300 default diff --git a/gdb/infrun.c b/gdb/infrun.c index a55744a20c0..73647aa35d2 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -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. */ diff --git a/gdb/symtab.c b/gdb/symtab.c index a0337e3435d..fa3d2e54e37 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -2874,7 +2874,7 @@ list_symbols (regexp, class, bpt, from_tty) if (bpt) { break_command (SYMBOL_NAME (msymbol), from_tty); - printf_filtered ("%s;\n", + printf_filtered (" %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 () diff --git a/gdb/symtab.h b/gdb/symtab.h index cd1ad34ee2e..777b1079d15 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -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) */