From 253ceee6d0db442542eb06d811108f55560e0a8c Mon Sep 17 00:00:00 2001 From: Ron Unrau Date: Wed, 9 Sep 1998 17:41:59 +0000 Subject: [PATCH] Merges from SKY branch: * blockframe.c(find_pc_sect_partial_function): look for min syms in the same section when trying to guess the end of a function. * symfile.c(list_overlays_command): use print_address_numeric * remote-sim.c: export simulator_command * tm-r5900.h: add COP0 registers * txvu-tdep.c: printvector and printvector-order commands * tm-txvu.h: add COP0 registers * mips-tdep.c: use NUM_CORE_REGS --- gdb/ChangeLog | 15 ++++ gdb/blockframe.c | 226 ++++++++++++++++++++++++++++++++++------------- gdb/remote-sim.c | 4 +- 3 files changed, 183 insertions(+), 62 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ccf0cf5fa5..532ccceb00 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +Wed Sep 9 11:39:05 1998 Ron Unrau + + * blockframe.c(find_pc_sect_partial_function): look for min syms in + the same section when trying to guess the end of a function. + * symfile.c(list_overlays_command): use print_address_numeric + * remote-sim.c: export simulator_command +start-sanitize-r5900 + * tm-r5900.h: add COP0 registers +end-sanitize-r5900 +start-sanitize-sky + * txvu-tdep.c: printvector and printvector-order commands + * tm-txvu.h: add COP0 registers + * mips-tdep.c: use NUM_CORE_REGS +end-sanitize-sky + 1998-09-08 Jason Molenda (jsm@bugshack.cygnus.com) * breakpoint.c (bpstat_stop_status): Declare a bp match if the diff --git a/gdb/blockframe.c b/gdb/blockframe.c index 3a84ae7b78..85fd61fffd 100644 --- a/gdb/blockframe.c +++ b/gdb/blockframe.c @@ -87,8 +87,10 @@ CORE_ADDR pc; mainsym = lookup_symbol ("main", NULL, VAR_NAMESPACE, NULL, NULL); if (mainsym && SYMBOL_CLASS(mainsym) == LOC_BLOCK) { - symfile_objfile->ei.main_func_lowpc = BLOCK_START (SYMBOL_BLOCK_VALUE (mainsym)); - symfile_objfile->ei.main_func_highpc = BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym)); + symfile_objfile->ei.main_func_lowpc = + BLOCK_START (SYMBOL_BLOCK_VALUE (mainsym)); + symfile_objfile->ei.main_func_highpc = + BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym)); } } return (symfile_objfile -> ei.main_func_lowpc <= pc && @@ -535,27 +537,32 @@ get_frame_function (frame) return block_function (bl); } + /* Return the blockvector immediately containing the innermost lexical block - containing the specified pc value, or 0 if there is none. + containing the specified pc value and section, or 0 if there is none. PINDEX is a pointer to the index value of the block. If PINDEX is NULL, we don't pass this information back to the caller. */ struct blockvector * -blockvector_for_pc (pc, pindex) +blockvector_for_pc_sect (pc, section, pindex, symtab) register CORE_ADDR pc; + struct sec *section; int *pindex; + struct symtab *symtab; + { register struct block *b; register int bot, top, half; - register struct symtab *s; struct blockvector *bl; - /* First search all symtabs for one whose file contains our pc */ - s = find_pc_symtab (pc); - if (s == 0) - return 0; + if (symtab == 0) /* if no symtab specified by caller */ + { + /* First search all symtabs for one whose file contains our pc */ + if ((symtab = find_pc_sect_symtab (pc, section)) == 0) + return 0; + } - bl = BLOCKVECTOR (s); + bl = BLOCKVECTOR (symtab); b = BLOCKVECTOR_BLOCK (bl, 0); /* Then search that symtab for the smallest block that wins. */ @@ -587,45 +594,80 @@ blockvector_for_pc (pc, pindex) } bot--; } - return 0; } -/* Return the innermost lexical block containing the specified pc value, - or 0 if there is none. */ +/* Return the blockvector immediately containing the innermost lexical block + containing the specified pc value, or 0 if there is none. + Backward compatibility, no section. */ + +struct blockvector * +blockvector_for_pc (pc, pindex) + register CORE_ADDR pc; + int *pindex; +{ + return blockvector_for_pc_sect (pc, find_pc_mapped_section (pc), + pindex, NULL); +} + +/* Return the innermost lexical block containing the specified pc value + in the specified section, or 0 if there is none. */ struct block * -block_for_pc (pc) +block_for_pc_sect (pc, section) register CORE_ADDR pc; + struct sec *section; { register struct blockvector *bl; int index; - bl = blockvector_for_pc (pc, &index); + bl = blockvector_for_pc_sect (pc, section, &index, NULL); if (bl) return BLOCKVECTOR_BLOCK (bl, index); return 0; } -/* Return the function containing pc value PC. +/* Return the innermost lexical block containing the specified pc value, + or 0 if there is none. Backward compatibility, no section. */ + +struct block * +block_for_pc (pc) + register CORE_ADDR pc; +{ + return block_for_pc_sect (pc, find_pc_mapped_section (pc)); +} + +/* Return the function containing pc value PC in section SECTION. Returns 0 if function is not known. */ struct symbol * -find_pc_function (pc) +find_pc_sect_function (pc, section) CORE_ADDR pc; + struct sec *section; { - register struct block *b = block_for_pc (pc); + register struct block *b = block_for_pc_sect (pc, section); if (b == 0) return 0; return block_function (b); } +/* Return the function containing pc value PC. + Returns 0 if function is not known. Backward compatibility, no section */ + +struct symbol * +find_pc_function (pc) + CORE_ADDR pc; +{ + return find_pc_sect_function (pc, find_pc_mapped_section (pc)); +} + /* These variables are used to cache the most recent result * of find_pc_partial_function. */ -static CORE_ADDR cache_pc_function_low = 0; -static CORE_ADDR cache_pc_function_high = 0; -static char *cache_pc_function_name = 0; +static CORE_ADDR cache_pc_function_low = 0; +static CORE_ADDR cache_pc_function_high = 0; +static char *cache_pc_function_name = 0; +static struct sec *cache_pc_function_section = NULL; /* Clear cache, e.g. when symbol table is discarded. */ @@ -635,50 +677,58 @@ clear_pc_function_cache() cache_pc_function_low = 0; cache_pc_function_high = 0; cache_pc_function_name = (char *)0; + cache_pc_function_section = NULL; } /* Finds the "function" (text symbol) that is smaller than PC but - greatest of all of the potential text symbols. Sets *NAME and/or - *ADDRESS conditionally if that pointer is non-null. If ENDADDR is - non-null, then set *ENDADDR to be the end of the function - (exclusive), but passing ENDADDR as non-null means that the - function might cause symbols to be read. This function either + greatest of all of the potential text symbols in SECTION. Sets + *NAME and/or *ADDRESS conditionally if that pointer is non-null. + If ENDADDR is non-null, then set *ENDADDR to be the end of the + function (exclusive), but passing ENDADDR as non-null means that + the function might cause symbols to be read. This function either succeeds or fails (not halfway succeeds). If it succeeds, it sets *NAME, *ADDRESS, and *ENDADDR to real information and returns 1. - If it fails, it sets *NAME, *ADDRESS, and *ENDADDR to zero - and returns 0. */ + If it fails, it sets *NAME, *ADDRESS, and *ENDADDR to zero and + returns 0. */ int -find_pc_partial_function (pc, name, address, endaddr) - CORE_ADDR pc; - char **name; +find_pc_sect_partial_function (pc, section, name, address, endaddr) + CORE_ADDR pc; + asection *section; + char **name; CORE_ADDR *address; CORE_ADDR *endaddr; { struct partial_symtab *pst; - struct symbol *f; + struct symbol *f; struct minimal_symbol *msymbol; struct partial_symbol *psb; - struct obj_section *sec; + struct obj_section *osect; + int i; + CORE_ADDR mapped_pc; - if (pc >= cache_pc_function_low && pc < cache_pc_function_high) + mapped_pc = overlay_mapped_address (pc, section); + + if (mapped_pc >= cache_pc_function_low && + mapped_pc < cache_pc_function_high && + section == cache_pc_function_section) goto return_cached_value; /* If sigtramp is in the u area, it counts as a function (especially important for step_1). */ #if defined SIGTRAMP_START - if (IN_SIGTRAMP (pc, (char *)NULL)) + if (IN_SIGTRAMP (mapped_pc, (char *)NULL)) { - cache_pc_function_low = SIGTRAMP_START (pc); - cache_pc_function_high = SIGTRAMP_END (pc); - cache_pc_function_name = ""; - + cache_pc_function_low = SIGTRAMP_START (mapped_pc); + cache_pc_function_high = SIGTRAMP_END (mapped_pc); + cache_pc_function_name = ""; + cache_pc_function_section = section; goto return_cached_value; } #endif - msymbol = lookup_minimal_symbol_by_pc (pc); - pst = find_pc_psymtab (pc); + msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section); + pst = find_pc_sect_psymtab (mapped_pc, section); if (pst) { /* Need to read the symbols to get a good value for the end address. */ @@ -694,15 +744,16 @@ find_pc_partial_function (pc, name, address, endaddr) { /* Checking whether the msymbol has a larger value is for the "pathological" case mentioned in print_frame_info. */ - f = find_pc_function (pc); + f = find_pc_sect_function (mapped_pc, section); if (f != NULL && (msymbol == NULL || (BLOCK_START (SYMBOL_BLOCK_VALUE (f)) >= SYMBOL_VALUE_ADDRESS (msymbol)))) { - cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f)); - cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f)); - cache_pc_function_name = SYMBOL_NAME (f); + cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f)); + cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f)); + cache_pc_function_name = SYMBOL_NAME (f); + cache_pc_function_section = section; goto return_cached_value; } } @@ -711,7 +762,7 @@ find_pc_partial_function (pc, name, address, endaddr) /* Now that static symbols go in the minimal symbol table, perhaps we could just ignore the partial symbols. But at least for now we use the partial or minimal symbol, whichever is larger. */ - psb = find_pc_psymbol (pst, pc); + psb = find_pc_sect_psymbol (pst, mapped_pc, section); if (psb && (msymbol == NULL || @@ -734,9 +785,9 @@ find_pc_partial_function (pc, name, address, endaddr) of the text seg doesn't appear to be part of the last function in the text segment. */ - sec = find_pc_section (pc); + osect = find_pc_sect_section (mapped_pc, section); - if (!sec) + if (!osect) msymbol = NULL; /* Must be in the minimal symbol table. */ @@ -752,30 +803,70 @@ find_pc_partial_function (pc, name, address, endaddr) return 0; } - cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol); - cache_pc_function_name = SYMBOL_NAME (msymbol); + cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol); + cache_pc_function_name = SYMBOL_NAME (msymbol); + cache_pc_function_section = section; - /* Use the lesser of the next minimal symbol, or the end of the section, as - the end of the function. */ + /* Use the lesser of the next minimal symbol in the same section, or the end + of the section, as the end of the function. Step over other symbols at + this same address to find the next one. */ - if (SYMBOL_NAME (msymbol + 1) != NULL - && SYMBOL_VALUE_ADDRESS (msymbol + 1) < sec->endaddr) - cache_pc_function_high = SYMBOL_VALUE_ADDRESS (msymbol + 1); + for (i=1; SYMBOL_NAME (msymbol+i) != NULL + && (SYMBOL_VALUE_ADDRESS(msymbol+i) == SYMBOL_VALUE_ADDRESS (msymbol) + || SYMBOL_BFD_SECTION(msymbol+i) != section); + i++) /* empty */; + + if (SYMBOL_NAME (msymbol + i) != NULL + && SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr) + cache_pc_function_high = SYMBOL_VALUE_ADDRESS (msymbol + i); else /* We got the start address from the last msymbol in the objfile. So the end address is the end of the section. */ - cache_pc_function_high = sec->endaddr; + cache_pc_function_high = osect->endaddr; return_cached_value: + if (address) - *address = cache_pc_function_low; + if (pc_in_unmapped_range (pc, section)) + *address = overlay_unmapped_address (cache_pc_function_low, section); + else + *address = cache_pc_function_low; + if (name) *name = cache_pc_function_name; + if (endaddr) - *endaddr = cache_pc_function_high; + if (pc_in_unmapped_range (pc, section)) + { + /* Because the high address is actually beyond the end of + the function (and therefore possibly beyond the end of + the overlay), we must actually convert (high - 1) + and then add one to that. */ + + *endaddr = 1 + overlay_unmapped_address (cache_pc_function_high - 1, + section); + } + else + *endaddr = cache_pc_function_high; + return 1; } +/* Backward compatibility, no section argument */ + +int +find_pc_partial_function (pc, name, address, endaddr) + CORE_ADDR pc; + char **name; + CORE_ADDR *address; + CORE_ADDR *endaddr; +{ + asection *section; + + section = find_pc_overlay (pc); + return find_pc_sect_partial_function (pc, section, name, address, endaddr); +} + /* Return the innermost stack frame executing inside of BLOCK, or NULL if there is no such frame. If BLOCK is NULL, just return NULL. */ @@ -967,6 +1058,21 @@ generic_push_dummy_frame () dummy_frame_stack = dummy_frame; } +/* Function: pop_frame + Restore the machine state from either the saved dummy stack or a + real stack frame. */ + +void +generic_pop_current_frame (pop) + void (*pop) PARAMS ((struct frame_info *frame)); +{ + struct frame_info *frame = get_current_frame (); + if (PC_IN_CALL_DUMMY(frame->pc, frame->frame, frame->frame)) + generic_pop_dummy_frame (); + else + pop (frame); +} + /* Function: pop_dummy_frame Restore the machine state from a saved dummy stack frame. */ @@ -982,6 +1088,7 @@ generic_pop_dummy_frame () error ("Can't pop dummy frame!"); dummy_frame_stack = dummy_frame->next; write_register_bytes (0, dummy_frame->regs, REGISTER_BYTES); + flush_cached_frames (); free (dummy_frame); } @@ -998,7 +1105,7 @@ generic_frame_chain_valid (fp, fi) return 1; /* don't prune CALL_DUMMY frames */ else /* fall back to default algorithm (see frame.h) */ return (fp != 0 - && fi->frame INNER_THAN fp + && (fi->frame INNER_THAN fp || fi->frame == fp) && !inside_entry_file (FRAME_SAVED_PC(fi))); } @@ -1035,7 +1142,6 @@ generic_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval) int regnum; enum lval_type *lval; { - CORE_ADDR addr; struct frame_saved_regs fsr; if (!target_has_registers) diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c index 53d0155624..f641d6f965 100644 --- a/gdb/remote-sim.c +++ b/gdb/remote-sim.c @@ -97,7 +97,7 @@ static void gdbsim_mourn_inferior PARAMS ((void)); static void gdbsim_stop PARAMS ((void)); -static void simulator_command PARAMS ((char *args, int from_tty)); +void simulator_command PARAMS ((char *args, int from_tty)); /* Naming convention: @@ -889,7 +889,7 @@ gdbsim_remove_breakpoint (addr, contents_cache) /* Pass the command argument through to the simulator verbatim. The simulator must do any command interpretation work. */ -static void +void simulator_command (args, from_tty) char *args; int from_tty;