From 5e2e79f859325ef28cbc98c6704a72de847e5711 Mon Sep 17 00:00:00 2001 From: Fred Fish Date: Sat, 21 Mar 1992 01:56:01 +0000 Subject: [PATCH] Many changes, most related to creating entry point information on a per-objfile basis. See comments in objfiles.h and details in ChangeLog. Also remove redundant definitions of FRAME_CHAIN_VALID from most of the tm-* files and use a default definition in frame.h. --- gdb/.Sanitize | 1 + gdb/ChangeLog | 64 +++++++++++ gdb/buildsym.c | 3 +- gdb/buildsym.h | 3 - gdb/dwarfread.c | 25 ++--- gdb/elfread.c | 1 + gdb/gdbtypes.c | 1 + gdb/m88k-tdep.c | 2 +- gdb/minsyms.c | 1 + gdb/mips-tdep.c | 22 ++-- gdb/mipsread.c | 19 ++-- gdb/objfiles.c | 7 +- gdb/objfiles.h | 313 +++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/partial-stab.h | 10 +- gdb/tm-29k.h | 2 +- gdb/tm-68k.h | 30 +---- gdb/tm-convex.h | 8 +- gdb/tm-h8300.h | 11 +- gdb/tm-i386v.h | 10 +- gdb/tm-irix3.h | 8 +- gdb/tm-merlin.h | 10 +- gdb/tm-mips.h | 8 +- gdb/tm-pyr.h | 8 +- gdb/tm-rs6000.h | 10 +- gdb/tm-sparc.h | 8 +- gdb/tm-sun386.h | 10 +- gdb/tm-symmetry.h | 2 +- gdb/tm-tahoe.h | 10 +- gdb/tm-umax.h | 10 +- gdb/tm-vax.h | 10 +- gdb/xcoffexec.c | 1 + gdb/xcoffread.c | 15 +-- 32 files changed, 458 insertions(+), 185 deletions(-) create mode 100644 gdb/objfiles.h diff --git a/gdb/.Sanitize b/gdb/.Sanitize index ca13c67..2b04929 100644 --- a/gdb/.Sanitize +++ b/gdb/.Sanitize @@ -132,6 +132,7 @@ nindy-tdep.c ns32k-opcode.h ns32k-pinsn.c objfiles.c +objfiles.h os68k-xdep.c parse.c parser-defs.h diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 346d718..21b29cc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,67 @@ +Fri Mar 20 17:43:27 1992 Fred Fish (fnf@cygnus.com) + + * objfiles.h: New file + * Makefile.in (HFILES): Add objfiles.h + * blockframe.c: Remove entry_scope_lowpc, entry_scope_highpc, + main_scope_lowpc, main_scope_highpc. + * blockframe.c, buildsym.c, coffread.c, dbxread.c, dwarfread.c, + elfread.c, gdbtypes.h, minsyms.c, mipsread.c, objfiles.c, solib.c, + source.c, symfile.c, symmisc.c, symtab.c, target.c, xcoffexec.c, + xcoffread.c, : Include objfiles.h. + * tm-29k.h, tm-i386v.h, tm-merlin.h, tm-rs6000.h, tm-sun386.h, + tm-symmetry.h, tm-tahoe.h, tm-umax.h, tm-vax.h, m88k-tdep.c, + mips-tdep.c (FRAME_CHAIN): Renamed outside_startup_file to + inside_entry_file() and logic changed appropriately. + * blockframe.c (outside_startup_file): Renamed to + inside_entry_file() and logic changed appropriately. + * blockframe.c (inside_main_scope): Renamed to inside_main_func() + and logic changed to use per-objfile specific fields. + * blockframe.c (inside_entry_scope): Renamed to + inside_entry_func() and logic changed to use per-objfile specific + fields. + * blockframe.c, buildsym.h, coffread.c, dwarfread.c, mipsread.c, + symfile.c, mips-tdep.c (startup_file_start, startup_file_end): + Remove extern decls. + * symfile.c, symfile.h (entry_point): Remove extern decl. + * coffread.c (coff_symfile_init): Common entry point init code + moved to symfiles.c, call init_entry_point_info(). + * coffread.c (complete_symtab): Use new per-objfile entry info. + * mip-tdep.c (mips_frame_chain): Use new per-objfile entry info. + * mipsread.c (parse_partial_symbols): Use new per-objfile entry + info. + * dbxread.c (read_dbx_symtab): Use new per-objfile entry info. + * defs.h (inside_entry_scope, outside_startup_file, + inside_main_scope): Prototypes changed for renames to + inside_entry_func, inside_entry_file, inside_main_func, + respectively. + * symfile.c (syms_from_objfile): Common entry point init code + moved to init_entry_point_info() and call init_entry_point_info(). + * symfile.h (init_entry_point_info): Include prototype. + * xcoffread.c (aixcoff_symfile_init): Common entry point init code + moved to symfiles.c and call init_entry_point_info(). + * dwarfread.c (entry_scope_lowpc, entry_scope_highpc, + main_scope_lowpc, main_scope_highpc): Remove extern decls. + * dwarfread.c (read_func_scope, read_file_scope): Use new per- + objfile entry info. + * frame.h (FRAME_CHAIN_VALID): Provide default definition that + works for the majority of targets. + * tm-68k.h, tm-convex.h, tm-h8300.h, tm-i386v.h, tm-irix3.h, + tm-merlin.h, tm-mips.h, tm-pyr.h, tm-rs6000.h, tm-sparc.h, + tm-sun386.h, tm-tahoe.h, tm-umax.h, tm-vax.h (FRAME_CHAIN_VALID): + Use default definition in frame.h. + * frame.h (selected_frame_level): Make decl extern. + * objfiles.c, symfile.c (current_objfile): Moved to objfiles.c + * objfiles.c, symfile.c (symfile_objfile): Moved to objfiles.c + * partial-stab.h: Use new per-objfile entry info. + * symfile.h (struct objfile): Removed, moved to objfiles.h. + * symfile.h, objfiles.h (allocate_objfile, free_objfile, + free_all_objfiles, iterate_over_objfiles, iterate_over_symtabs, + iterate_over_psymtabs, have_partial_symbols, have_full_symbols, + have_minimal_symbols): Prototypes moved to objfiles.h. + * symfile.h, objfiles.h (ALL_OBJFILES, ALL_OBJFILES_SAFE): + Macros moved to objfiles.h. + * tm-h8300.h, tm-i386v4.h (FRAME_CHAIN_VALID_ALTERNATE): Define. + Thu Mar 19 18:49:45 1992 Per Bothner (bothner@cygnus.com) More C++ improvements (pointers to members, qualified names). diff --git a/gdb/buildsym.c b/gdb/buildsym.c index d5deff1..c74ea1e 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -31,7 +31,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "breakpoint.h" #include "gdbcore.h" /* for bfd stuff for symfile.h */ #include "symfile.h" /* Needed for "struct complaint" */ -#include "aout/stab_gnu.h" /* We always use GNU stabs, not native */ +#include "objfiles.h" +#include "aout/stab_gnu.h" /* We always use GNU stabs, not native */ #include #include diff --git a/gdb/buildsym.h b/gdb/buildsym.h index 41b8aa8..19f3f55 100644 --- a/gdb/buildsym.h +++ b/gdb/buildsym.h @@ -185,9 +185,6 @@ struct pending_block EXTERN struct pending_block *pending_blocks; -extern CORE_ADDR startup_file_start; /* From blockframe.c */ -extern CORE_ADDR startup_file_end; /* From blockframe.c */ - /* Global variable which, when set, indicates that we are processing a .o file compiled with gcc */ diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index c74d2db..269a691 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -62,6 +62,7 @@ other things to work on, if you get bored. :-) #include "symtab.h" #include "gdbtypes.h" #include "symfile.h" +#include "objfiles.h" #include "elf/dwarf.h" #include "buildsym.h" @@ -95,12 +96,6 @@ typedef unsigned int DIEREF; /* Reference to a DIE */ /* External variables referenced. */ -extern CORE_ADDR startup_file_start; /* From blockframe.c */ -extern CORE_ADDR startup_file_end; /* From blockframe.c */ -extern CORE_ADDR entry_scope_lowpc; /* From blockframe.c */ -extern CORE_ADDR entry_scope_highpc; /* From blockframe.c */ -extern CORE_ADDR main_scope_lowpc; /* From blockframe.c */ -extern CORE_ADDR main_scope_highpc; /* From blockframe.c */ extern int info_verbose; /* From main.c; nonzero => verbose */ extern char *warning_pre_print; /* From utils.c */ @@ -1439,15 +1434,16 @@ read_func_scope (dip, thisdie, enddie, objfile) { register struct context_stack *new; - if (entry_point >= dip -> at_low_pc && entry_point < dip -> at_high_pc) + if (objfile -> ei.entry_point >= dip -> at_low_pc && + objfile -> ei.entry_point < dip -> at_high_pc) { - entry_scope_lowpc = dip -> at_low_pc; - entry_scope_highpc = dip -> at_high_pc; + objfile -> ei.entry_func_lowpc = dip -> at_low_pc; + objfile -> ei.entry_func_highpc = dip -> at_high_pc; } if (STREQ (dip -> at_name, "main")) /* FIXME: hardwired name */ { - main_scope_lowpc = dip -> at_low_pc; - main_scope_highpc = dip -> at_high_pc; + objfile -> ei.main_func_lowpc = dip -> at_low_pc; + objfile -> ei.main_func_highpc = dip -> at_high_pc; } new = push_context (0, dip -> at_low_pc); new -> name = new_symbol (dip, objfile); @@ -1492,10 +1488,11 @@ read_file_scope (dip, thisdie, enddie, objfile) struct cleanup *back_to; struct symtab *symtab; - if (entry_point >= dip -> at_low_pc && entry_point < dip -> at_high_pc) + if (objfile -> ei.entry_point >= dip -> at_low_pc && + objfile -> ei.entry_point < dip -> at_high_pc) { - startup_file_start = dip -> at_low_pc; - startup_file_end = dip -> at_high_pc; + objfile -> ei.entry_file_lowpc = dip -> at_low_pc; + objfile -> ei.entry_file_highpc = dip -> at_high_pc; } if (dip -> at_producer != NULL) { diff --git a/gdb/elfread.c b/gdb/elfread.c index f49916c..ada668d 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -39,6 +39,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "bfd.h" #include "symtab.h" #include "symfile.h" +#include "objfiles.h" #define STREQ(a,b) (strcmp((a),(b))==0) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 41f2978..4d6eaa7 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "bfd.h" #include "symtab.h" #include "symfile.h" +#include "objfiles.h" #include "gdbtypes.h" #include "expression.h" #include "language.h" diff --git a/gdb/m88k-tdep.c b/gdb/m88k-tdep.c index d9a55c0..1d71a51 100644 --- a/gdb/m88k-tdep.c +++ b/gdb/m88k-tdep.c @@ -91,7 +91,7 @@ frame_chain_valid (chain, thisframe) struct frame_info *thisframe; { return (chain != 0 - && outside_startup_file (FRAME_SAVED_PC (thisframe))); + && !inside_entry_file (FRAME_SAVED_PC (thisframe))); } void diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 1d7faaa..d3f6c7b 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -41,6 +41,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "symtab.h" #include "bfd.h" #include "symfile.h" +#include "objfiles.h" /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE. At the end, copy them all into one newly allocated location on an objfile's diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 98520d4..134bc74 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -1,5 +1,5 @@ /* Target-dependent code for the MIPS architecture, for GDB, the GNU Debugger. - Copyright 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. + Copyright 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc. Contributed by Alessandro Forin(af@cs.cmu.edu) at CMU and by Per Bothner(bothner@cs.wisc.edu) at U.Wisconsin. @@ -141,7 +141,7 @@ CORE_ADDR heuristic_proc_start(pc) { CORE_ADDR start_pc = pc; - CORE_ADDR fence = start_pc - 10000; + CORE_ADDR fence = start_pc - 200; if (fence < VM_MIN_ADDRESS) fence = VM_MIN_ADDRESS; /* search back for previous return */ for (start_pc -= 4; ; start_pc -= 4) @@ -182,6 +182,7 @@ heuristic_proc_desc(start_pc, limit_pc, next_frame) status = read_memory_nobpt (cur_pc, &word, 4); if (status) memory_error (status, cur_pc); + SWAP_TARGET_AND_HOST (&word, sizeof (word)); if ((word & 0xFFFF0000) == 0x27bd0000) /* addiu $sp,$sp,-i */ frame_size += (-word) & 0xFFFF; else if ((word & 0xFFFF0000) == 0x23bd0000) /* addu $sp,$sp,-i */ @@ -284,12 +285,11 @@ mips_extra_func_info_t cached_proc_desc; FRAME_ADDR mips_frame_chain(frame) FRAME frame; { - extern CORE_ADDR startup_file_start; /* From blockframe.c */ mips_extra_func_info_t proc_desc; CORE_ADDR saved_pc = FRAME_SAVED_PC(frame); - if (startup_file_start) + if (current_objfile -> ei.entry_file_lowpc) { /* has at least the __start symbol */ - if (saved_pc == 0 || !outside_startup_file (saved_pc)) return 0; + if (saved_pc == 0 || inside_entry_file (saved_pc)) return 0; } else { /* This hack depends on the internals of __start. */ @@ -539,11 +539,16 @@ static mips_print_register(regnum, all) int regnum, all; { - unsigned char raw_buffer[8]; + unsigned char raw_buffer[MAX_REGISTER_RAW_SIZE]; REGISTER_TYPE val; - read_relative_register_raw_bytes (regnum, raw_buffer); - + /* Get the data in raw format. */ + if (read_relative_register_raw_bytes (regnum, raw_buffer)) + { + printf_filtered ("%s: [Invalid]", reg_names[regnum]); + return; + } + /* If an even floating pointer register, also print as double. */ if (regnum >= FP0_REGNUM && regnum < FP0_REGNUM+32 && !((regnum-FP0_REGNUM) & 1)) { @@ -573,6 +578,7 @@ mips_print_register(regnum, all) long val; bcopy (raw_buffer, &val, sizeof (long)); + SWAP_TARGET_AND_HOST ((char *)&val, sizeof (long)); if (val == 0) printf_filtered ("0"); else if (all) diff --git a/gdb/mipsread.c b/gdb/mipsread.c index 0504649..e07203f 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -54,6 +54,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "gdbtypes.h" #include "gdbcore.h" #include "symfile.h" +#include "objfiles.h" #include "obstack.h" #include "buildsym.h" #include @@ -260,11 +261,6 @@ static char* mips_next_symbol_text (); CORE_ADDR sigtramp_address, sigtramp_end; -/* The entry point (starting address) of the file, if it is an executable. */ - -extern CORE_ADDR startup_file_start; /* From blockframe.c */ -extern CORE_ADDR startup_file_end; /* From blockframe.c */ - void mipscoff_new_init (objfile) struct objfile *objfile; @@ -2100,14 +2096,15 @@ parse_partial_symbols(end_of_text_seg, objfile) end_psymtab (save_pst, psymtab_include_list, includes_used, -1, save_pst->texthigh, dependency_list, dependencies_used); - if (entry_point < save_pst->texthigh - && entry_point >= save_pst->textlow) { - startup_file_start = save_pst->textlow; - startup_file_end = save_pst->texthigh; - } + if (objfile -> ei.entry_point >= save_pst->textlow && + objfile -> ei.entry_point < save_pst->texthigh) + { + objfile -> ei.entry_file_lowpc = save_pst->textlow; + objfile -> ei.entry_file_highpc = save_pst->texthigh; + } } - /* Mark the last code address, and remember it for later */ + /* Mark the last code address, and remember it for later */ hdr->cbDnOffset = end_of_text_seg; /* Now scan the FDRs for dependencies */ diff --git a/gdb/objfiles.c b/gdb/objfiles.c index c243005..35121a9 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -25,6 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "bfd.h" /* Binary File Description */ #include "symtab.h" #include "symfile.h" +#include "objfiles.h" #include #include @@ -39,9 +40,13 @@ open_mapped_file PARAMS ((char *filename, long mtime, int mapped)); static CORE_ADDR map_to_address PARAMS ((void)); -/* Externally visible variables that are owned by this module. */ +/* Externally visible variables that are owned by this module. + See declarations in objfile.h for more info. */ struct objfile *object_files; /* Linked list of all objfiles */ +struct objfile *current_objfile; /* For symbol file being read in */ +struct objfile *symfile_objfile; /* Main symbol table loaded from */ + int mapped_symbol_files; /* Try to use mapped symbol files */ /* Given a pointer to an initialized bfd (ABFD) and a flag that indicates diff --git a/gdb/objfiles.h b/gdb/objfiles.h new file mode 100644 index 0000000..8efaa93 --- /dev/null +++ b/gdb/objfiles.h @@ -0,0 +1,313 @@ +/* Definitions for symbol file management in GDB. + Copyright (C) 1992 Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +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. */ + +#if !defined (OBJFILES_H) +#define OBJFILES_H + +/* This structure maintains information on a per-objfile basis about the + "entry point" of the objfile, and the scope within which the entry point + exists. It is possible that gdb will see more than one objfile that is + executable, each with it's own entry point. + + For example, for dynamically linked executables in SVR4, the dynamic linker + code is contained within the shared C library, which is actually executable + and is run by the kernel first when an exec is done of a user executable + that is dynamically linked. The dynamic linker within the shared C library + then maps in the various program segments in the user executable and jumps + to the user executable's recorded entry point, as if the call had been made + directly by the kernel. + + The traditional gdb method of using this info is to use the recorded entry + point to set the variables entry_file_lowpc and entry_file_highpc from + the debugging information, where these values are the starting address + (inclusive) and ending address (exclusive) of the instruction space in the + executable which correspond to the "startup file", I.E. crt0.o in most + cases. This file is assumed to be a startup file and frames with pc's + inside it are treated as nonexistent. Setting these variables is necessary + so that backtraces do not fly off the bottom of the stack (or top, depending + upon your stack orientation). + + Gdb also supports an alternate method to avoid running off the top/bottom + of the stack. + + There are two frames that are "special", the frame for the function + containing the process entry point, since it has no predecessor frame, + and the frame for the function containing the user code entry point + (the main() function), since all the predecessor frames are for the + process startup code. Since we have no guarantee that the linked + in startup modules have any debugging information that gdb can use, + we need to avoid following frame pointers back into frames that might + have been built in the startup code, as we might get hopelessly + confused. However, we almost always have debugging information + available for main(). + + These variables are used to save the range of PC values which are valid + within the main() function and within the function containing the process + entry point. If we always consider the frame for main() as the outermost + frame when debugging user code, and the frame for the process entry + point function as the outermost frame when debugging startup code, then + all we have to do is have FRAME_CHAIN_VALID return false whenever a + frame's current PC is within the range specified by these variables. + In essence, we set "ceilings" in the frame chain beyond which we will + not proceed when following the frame chain back up the stack. + + A nice side effect is that we can still debug startup code without + running off the end of the frame chain, assuming that we have usable + debugging information in the startup modules, and if we choose to not + use the block at main, or can't find it for some reason, everything + still works as before. And if we have no startup code debugging + information but we do have usable information for main(), backtraces + from user code don't go wandering off into the startup code. + + To use this method, define your FRAME_CHAIN_VALID macro like: + + #define FRAME_CHAIN_VALID(chain, thisframe) \ + (chain != 0 \ + && !(inside_main_func ((thisframe)->pc)) \ + && !(inside_entry_func ((thisframe)->pc))) + + and add initializations of the four scope controlling variables inside + the object file / debugging information processing modules. */ + +struct entry_info +{ + + /* The value we should use for this objects entry point. + The illegal/unknown value needs to be something other than 0, ~0 + for instance, which is much less likely than 0. */ + + CORE_ADDR entry_point; + + /* Start (inclusive) and end (exclusive) of function containing the + entry point. */ + + CORE_ADDR entry_func_lowpc; + CORE_ADDR entry_func_highpc; + + /* Start (inclusive) and end (exclusive) of object file containing the + entry point. */ + + CORE_ADDR entry_file_lowpc; + CORE_ADDR entry_file_highpc; + + /* Start (inclusive) and end (exclusive) of the user code main() function. */ + + CORE_ADDR main_func_lowpc; + CORE_ADDR main_func_highpc; + +}; + + +/* Master structure for keeping track of each input file from which + gdb reads symbols. One of these is allocated for each such file we + access, e.g. the exec_file, symbol_file, and any shared library object + files. */ + +struct objfile +{ + + /* All struct objfile's are chained together by their next pointers. + The global variable "object_files" points to the first link in this + chain. */ + + struct objfile *next; + + /* The object file's name. Malloc'd; free it if you free this struct. */ + + char *name; + + /* Some flag bits for this objfile. */ + + unsigned short flags; + + /* Each objfile points to a linked list of symtabs derived from this file, + one symtab structure for each compilation unit (source file). Each link + in the symtab list contains a backpointer to this objfile. */ + + struct symtab *symtabs; + + /* Each objfile points to a linked list of partial symtabs derived from + this file, one partial symtab structure for each compilation unit + (source file). */ + + struct partial_symtab *psymtabs; + + /* List of freed partial symtabs, available for re-use */ + + struct partial_symtab *free_psymtabs; + + /* The object file's BFD. Can be null, in which case bfd_open (name) and + put the result here. */ + + bfd *obfd; + + /* The modification timestamp of the object file, as of the last time + we read its symbols. */ + + long mtime; + + /* Obstacks to hold objects that should be freed when we load a new symbol + table from this object file. */ + + struct obstack psymbol_obstack; /* Partial symbols */ + struct obstack symbol_obstack; /* Full symbols */ + struct obstack type_obstack; /* Types */ + + /* Vectors of all partial symbols read in from file. The actual data + is stored in the psymbol_obstack. */ + + struct psymbol_allocation_list global_psymbols; + struct psymbol_allocation_list static_psymbols; + + /* Each file contains a pointer to an array of minimal symbols for all + global symbols that are defined within the file. The array is terminated + by a "null symbol", one that has a NULL pointer for the name and a zero + value for the address. This makes it easy to walk through the array + when passed a pointer to somewhere in the middle of it. There is also + a count of the number of symbols, which does include the terminating + null symbol. The array itself, as well as all the data that it points + to, should be allocated on the symbol_obstack for this file. */ + + struct minimal_symbol *msymbols; + int minimal_symbol_count; + + /* For object file formats which don't specify fundamental types, gdb + can create such types. For now, it maintains a vector of pointers + to these internally created fundamental types on a per objfile basis, + however it really should ultimately keep them on a per-compilation-unit + basis, to account for linkage-units that consist of a number of + compilation units that may have different fundamental types, such as + linking C modules with ADA modules, or linking C modules that are + compiled with 32-bit ints with C modules that are compiled with 64-bit + ints (not inherently evil with a smarter linker). */ + + struct type **fundamental_types; + + /* The mmalloc() malloc-descriptor for this objfile if we are using + the memory mapped malloc() package to manage storage for this objfile's + data. NULL if we are not. */ + + PTR md; + + /* Structure which keeps track of functions that manipulate objfile's + of the same type as this objfile. I.E. the function to read partial + symbols for example. Note that this structure is in statically + allocated memory, and is shared by all objfiles that use the + object module reader of this type. */ + + struct sym_fns *sf; + + /* The per-objfile information about the entry point, the scope (file/func) + containing the entry point, and the scope of the user's main() func. */ + + struct entry_info ei; + + /* Hook for information which is shared by sym_init and sym_read for + this objfile. It is typically a pointer to malloc'd memory. */ + + PTR sym_private; + +}; + +/* Defines for the objfile flag word. */ + +/* Gdb can arrange to allocate storage for all objects related to a + particular objfile in a designated section of it's address space, + managed at a low level by mmap() and using a special version of + malloc that handles malloc/free/realloc on top of the mmap() interface. + This allows the "internal gdb state" for a particular objfile to be + dumped to a gdb state file and subsequently reloaded at a later time. */ + +#define OBJF_MAPPED (1 << 0) /* Objfile data is mmap'd */ + +/* The object file that the main symbol table was loaded from (e.g. the + argument to the "symbol-file" or "file" command). */ + +extern struct objfile *symfile_objfile; + +/* When we need to allocate a new type, we need to know which type_obstack + to allocate the type on, since there is one for each objfile. The places + where types are allocated are deeply buried in function call hierarchies + which know nothing about objfiles, so rather than trying to pass a + particular objfile down to them, we just do an end run around them and + set current_objfile to be whatever objfile we expect to be using at the + time types are being allocated. For instance, when we start reading + symbols for a particular objfile, we set current_objfile to point to that + objfile, and when we are done, we set it back to NULL, to ensure that we + never put a type someplace other than where we are expecting to put it. + FIXME: Maybe we should review the entire type handling system and + see if there is a better way to avoid this problem. */ + +extern struct objfile *current_objfile; + +/* All known objfiles are kept in a linked list. This points to the + root of this list. */ + +extern struct objfile *object_files; + +/* Declarations for functions defined in objfiles.c */ + +extern struct objfile * +allocate_objfile PARAMS ((bfd *, int)); + +extern void +free_objfile PARAMS ((struct objfile *)); + +extern void +free_all_objfiles PARAMS ((void)); + +extern int +have_partial_symbols PARAMS ((void)); + +extern int +have_full_symbols PARAMS ((void)); + +/* Functions for dealing with the minimal symbol table, really a misc + address<->symbol mapping for things we don't have debug symbols for. */ + +extern int +have_minimal_symbols PARAMS ((void)); + +extern PTR +iterate_over_objfiles PARAMS ((PTR (*func) (struct objfile *, + PTR arg1, PTR arg2, PTR arg3), + PTR arg1, PTR arg2, PTR arg3)); + +extern PTR +iterate_over_symtabs PARAMS ((PTR (*func) (struct objfile *, struct symtab *, + PTR arg1, PTR arg2, PTR arg3), + PTR arg1, PTR arg2, PTR arg3)); + +extern PTR +iterate_over_psymtabs PARAMS ((PTR (*func) (struct objfile *, + struct partial_symtab *, + PTR arg1, PTR arg2, PTR arg3), + PTR arg1, PTR arg2, PTR arg3)); + + +/* Traverse all object files. ALL_OBJFILES_SAFE works even if you delete + the objfile during the traversal. */ + +#define ALL_OBJFILES(obj) \ + for ((obj)=object_files; (obj)!=NULL; (obj)=(obj)->next) + +#define ALL_OBJFILES_SAFE(obj,nxt) \ + for ((obj)=object_files; (obj)!=NULL?((nxt)=(obj)->next,1):0; (obj)=(nxt)) + +#endif /* !defined (OBJFILES_H) */ diff --git a/gdb/partial-stab.h b/gdb/partial-stab.h index 72864ba..350d781 100644 --- a/gdb/partial-stab.h +++ b/gdb/partial-stab.h @@ -71,12 +71,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ || (namestring [(nsl = strlen (namestring)) - 1] == 'o' && namestring [nsl - 2] == '.')) { - if (entry_point < CUR_SYMBOL_VALUE - && entry_point >= last_o_file_start - && addr == 0) /* FIXME nogood nomore */ + if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE && + objfile -> ei.entry_point >= last_o_file_start && + addr == 0) /* FIXME nogood nomore */ { - startup_file_start = last_o_file_start; - startup_file_end = CUR_SYMBOL_VALUE; + objfile -> ei.entry_file_lowpc = last_o_file_start; + objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE; } if (past_first_source_file && pst /* The gould NP1 uses low values for .o and -l symbols diff --git a/gdb/tm-29k.h b/gdb/tm-29k.h index 8e970d0..73d9638 100644 --- a/gdb/tm-29k.h +++ b/gdb/tm-29k.h @@ -459,7 +459,7 @@ void init_frame_pc (); FIXME!!! However, allow a pc in a call dummy. */ #define FRAME_CHAIN_VALID(chain, thisframe) \ - (outside_startup_file (FRAME_SAVED_PC (thisframe))) + (!inside_entry_file (FRAME_SAVED_PC (thisframe))) /* Define other aspects of the stack frame. */ diff --git a/gdb/tm-68k.h b/gdb/tm-68k.h index 4f1f417..b769ebe 100644 --- a/gdb/tm-68k.h +++ b/gdb/tm-68k.h @@ -288,38 +288,16 @@ extern const struct ext_format ext_format_68881; /* Describe the pointer in each stack frame to the previous stack frame (its caller). */ -/* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ - -/* In the case of the 68000, the frame's nominal address +/* FRAME_CHAIN takes a frame's nominal address and produces the frame's + chain-pointer. + In the case of the 68000, the frame's nominal address is the address of a 4-byte word containing the calling frame's address. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#if defined (FRAME_CHAIN_VALID_ALTERNATE) - -/* Use the alternate method of avoiding running up off the end of - the frame chain or following frames back into the startup code. - See the comments in blockframe.c */ - -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 \ - && !(inside_main_scope ((thisframe)->pc)) \ - && !(inside_entry_scope ((thisframe)->pc))) - -#else - -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && outside_startup_file (FRAME_SAVED_PC (thisframe))) - -#endif /* FRAME_CHAIN_VALID_ALTERNATE */ - /* Define other aspects of the stack frame. */ /* A macro that tells us whether the function invocation represented diff --git a/gdb/tm-convex.h b/gdb/tm-convex.h index a343509..f0d236b 100644 --- a/gdb/tm-convex.h +++ b/gdb/tm-convex.h @@ -295,18 +295,12 @@ extern struct value *value_of_trapped_internalvar (); (its caller). */ /* FRAME_CHAIN takes a frame_info with a frame's nominal address in fi->frame, - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* (caller fp is saved at 8(fp)) */ #define FRAME_CHAIN(fi) (read_memory_integer ((fi)->frame + 8, 4)) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* We need the boundaries of the text in the exec file, as a kludge, diff --git a/gdb/tm-h8300.h b/gdb/tm-h8300.h index 12e5b05..b4217df 100644 --- a/gdb/tm-h8300.h +++ b/gdb/tm-h8300.h @@ -220,18 +220,11 @@ UNSIGNED_SHORT(read_memory_integer (read_register (SP_REGNUM), 2)) /* In the case of the H8/300, the frame's nominal address is the address of a 2-byte word containing the calling frame's address. */ - - - /* Use the alternate method of avoiding running up off the end of the frame chain or following frames back into the startup code. - See the comments in blockframe.c */ - -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 \ - && !(inside_main_scope ((thisframe)->pc)) \ - && !(inside_entry_scope ((thisframe)->pc))) + See the comments in objfile.h */ +#define FRAME_CHAIN_VALID_ALTERNATE /* Define other aspects of the stack frame. */ diff --git a/gdb/tm-i386v.h b/gdb/tm-i386v.h index 01644e8..21fca33 100644 --- a/gdb/tm-i386v.h +++ b/gdb/tm-i386v.h @@ -225,19 +225,13 @@ i386_skip_prologue PARAMS ((int)); (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* A macro that tells us whether the function invocation represented diff --git a/gdb/tm-irix3.h b/gdb/tm-irix3.h index f5f3469..2a99f62 100644 --- a/gdb/tm-irix3.h +++ b/gdb/tm-irix3.h @@ -200,16 +200,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ #define FRAME_CHAIN(thisframe) (FRAME_ADDR)mips_frame_chain(thisframe) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ diff --git a/gdb/tm-merlin.h b/gdb/tm-merlin.h index 49287f0..b73aa27 100644 --- a/gdb/tm-merlin.h +++ b/gdb/tm-merlin.h @@ -204,22 +204,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the Merlin, the frame's nominal address is the FP value, and at that address is saved previous FP value as a 4-byte word. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ #define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 4, 4)) diff --git a/gdb/tm-mips.h b/gdb/tm-mips.h index bf726d2..0716c9f 100644 --- a/gdb/tm-mips.h +++ b/gdb/tm-mips.h @@ -224,16 +224,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ #define FRAME_CHAIN(thisframe) (FRAME_ADDR)mips_frame_chain(thisframe) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ diff --git a/gdb/tm-pyr.h b/gdb/tm-pyr.h index a977a52..0e2fea4 100644 --- a/gdb/tm-pyr.h +++ b/gdb/tm-pyr.h @@ -305,10 +305,7 @@ do { \ } while (0); /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the pyr, the frame's nominal address is the address of parameter register 0. The previous frame is found 32 words up. */ @@ -316,9 +313,6 @@ do { \ #define FRAME_CHAIN(thisframe) \ ( (thisframe) -> frame - CONTROL_STACK_FRAME_SIZE) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /*((thisframe) >= CONTROL_STACK_ADDR))*/ /* Define other aspects of the stack frame. */ diff --git a/gdb/tm-rs6000.h b/gdb/tm-rs6000.h index 30d3a04..6472058 100644 --- a/gdb/tm-rs6000.h +++ b/gdb/tm-rs6000.h @@ -405,22 +405,16 @@ extern unsigned int rs6000_struct_return_address; (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the RS6000, the frame's nominal address is the address of a 4-byte word containing the calling frame's address. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* A macro that tells us whether the function invocation represented diff --git a/gdb/tm-sparc.h b/gdb/tm-sparc.h index f10f48e..a1ca17e 100644 --- a/gdb/tm-sparc.h +++ b/gdb/tm-sparc.h @@ -300,10 +300,7 @@ sparc_extract_struct_value_address PARAMS ((char [REGISTER_BYTES])); #include /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the Sun 4, the frame-chain's nominal address is held in the frame pointer register. @@ -336,9 +333,6 @@ sparc_extract_struct_value_address PARAMS ((char [REGISTER_BYTES])); #define FRAME_CHAIN(thisframe) (sparc_frame_chain (thisframe)) CORE_ADDR sparc_frame_chain (); -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* A macro that tells us whether the function invocation represented diff --git a/gdb/tm-sun386.h b/gdb/tm-sun386.h index 3c5b696..e4da6a6 100644 --- a/gdb/tm-sun386.h +++ b/gdb/tm-sun386.h @@ -228,19 +228,13 @@ double_to_i387 PARAMS ((char *, char *)); (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* A macro that tells us whether the function invocation represented diff --git a/gdb/tm-symmetry.h b/gdb/tm-symmetry.h index c964ca5..389d4eb 100644 --- a/gdb/tm-symmetry.h +++ b/gdb/tm-symmetry.h @@ -257,7 +257,7 @@ double_to_i387 PARAMS ((char *, char *)); is right on top of that. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer((thisframe)->frame, 4) :\ 0) diff --git a/gdb/tm-tahoe.h b/gdb/tm-tahoe.h index e20c7f9..4640b95 100644 --- a/gdb/tm-tahoe.h +++ b/gdb/tm-tahoe.h @@ -208,22 +208,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ (its caller). FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the Tahoe, the frame's nominal address is the FP value, and it points to the old FP */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* Saved PC */ diff --git a/gdb/tm-umax.h b/gdb/tm-umax.h index 22a4277..08f7e95 100644 --- a/gdb/tm-umax.h +++ b/gdb/tm-umax.h @@ -212,22 +212,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the ns32000 series, the frame's nominal address is the FP value, and at that address is saved previous FP value as a 4-byte word. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ #define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 4, 4)) diff --git a/gdb/tm-vax.h b/gdb/tm-vax.h index a91a3c7..e6e27d6 100644 --- a/gdb/tm-vax.h +++ b/gdb/tm-vax.h @@ -218,22 +218,16 @@ fix to bug-gdb@prep.ai.mit.edu. */ (its caller). */ /* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. - - However, if FRAME_CHAIN_VALID returns zero, - it means the given frame is the outermost one and has no caller. */ + and produces the frame's chain-pointer. */ /* In the case of the Vax, the frame's nominal address is the FP value, and 12 bytes later comes the saved previous FP value as a 4-byte word. */ #define FRAME_CHAIN(thisframe) \ - (outside_startup_file ((thisframe)->pc) ? \ + (!inside_entry_file ((thisframe)->pc) ? \ read_memory_integer ((thisframe)->frame + 12, 4) :\ 0) -#define FRAME_CHAIN_VALID(chain, thisframe) \ - (chain != 0 && (outside_startup_file (FRAME_SAVED_PC (thisframe)))) - /* Define other aspects of the stack frame. */ /* A macro that tells us whether the function invocation represented diff --git a/gdb/xcoffexec.c b/gdb/xcoffexec.c index 453e503..8588ffb 100644 --- a/gdb/xcoffexec.c +++ b/gdb/xcoffexec.c @@ -37,6 +37,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "gdbcmd.h" #include "gdbcore.h" #include "symfile.h" +#include "objfiles.h" #include "libbfd.h" /* BFD internals (sigh!) FIXME */ diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 09981a7..93fe780 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -44,6 +44,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "symtab.h" #include "gdbtypes.h" #include "symfile.h" +#include "objfiles.h" #include "buildsym.h" #include "coff/internal.h" /* FIXME, internal data from BFD */ @@ -2018,19 +2019,7 @@ aixcoff_symfile_init (objfile) /* Allocate struct to keep track of the symfile */ objfile -> sym_private = xmmalloc (objfile -> md, sizeof (struct coff_symfile_info)); - - /* - * Save startup file's range of PC addresses to help - * blockframe.c decide where the bottom of the stack is. - */ - if (bfd_get_file_flags(abfd) & EXEC_P) { - entry_point = bfd_get_start_address(abfd); - } else { - entry_point = ~0; - /* set the startup file to be an empty range. */ - startup_file_start = 0; - startup_file_end = 0; - } + init_entry_point_info (objfile); } /* Perform any local cleanups required when we are done with a particular -- 2.7.4