diff options
-rw-r--r-- | gdb/ChangeLog | 20 | ||||
-rw-r--r-- | gdb/infrun.c | 26 | ||||
-rw-r--r-- | gdb/symtab.c | 47 | ||||
-rw-r--r-- | gdb/symtab.h | 62 |
4 files changed, 128 insertions, 27 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 01ac370..8038a68 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 <jsmith@pasanda.cygnus.co.uk> * configure.in (configdirs): Added support for the VR4300 default diff --git a/gdb/infrun.c b/gdb/infrun.c index a55744a..73647aa 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 a0337e3..fa3d2e5 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 ("<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 () diff --git a/gdb/symtab.h b/gdb/symtab.h index cd1ad34..777b107 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) */ |