X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/c030245775e5c6a10511b5950da1add5513727c2..9c38eb65ac759526a693246efbc70d6f4b590a9d:/gdb/buildsym.h diff --git a/gdb/buildsym.h b/gdb/buildsym.h index 7cef879c0f..e034863f39 100644 --- a/gdb/buildsym.h +++ b/gdb/buildsym.h @@ -17,6 +17,9 @@ 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 (BUILDSYM_H) +#define BUILDSYM_H 1 + /* This module provides definitions used for creating and adding to the symbol table. These routines are called from various symbol- file-reading routines. @@ -30,41 +33,18 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ using this technique. */ #ifndef EXTERN -#define EXTERN extern +#define EXTERN extern #endif -extern void add_symbol_to_list (); -extern void process_one_symbol (); -extern struct type *read_type (); -extern struct type *read_range_type (); -extern struct type *read_enum_type (); -extern struct type *read_struct_type (); -extern struct type *read_array_type (); -extern struct type **read_args (); -extern struct type **dbx_lookup_type (); -extern long read_number (); -extern void finish_block (); -extern struct blockvector *make_blockvector (); -extern void add_undefined_type (); -extern void really_free_pendings (); -extern struct symtab *end_symtab (); -extern void scan_file_globals (); -extern void buildsym_new_init (); -extern void buildsym_init (); - -/* Convert stab register number (from `r' declaration) to a gdb REGNUM. */ - -#ifndef STAB_REG_TO_REGNUM -#define STAB_REG_TO_REGNUM(VALUE) (VALUE) -#endif - +#define HASHSIZE 127 /* Size of things hashed via hashname() */ + /* Name of source file whose symbol data we are now processing. - This comes from a symbol of type N_SO. */ + This comes from a symbol of type N_SO. */ EXTERN char *last_source_file; /* Core address of start of text of current source file. - This too comes from the N_SO symbol. */ + This too comes from the N_SO symbol. */ EXTERN CORE_ADDR last_source_start_addr; @@ -79,8 +59,7 @@ struct subfile char *dirname; struct linetable *line_vector; int line_vector_length; - int line_vector_index; - int prev_line_number; + enum language language; }; EXTERN struct subfile *subfiles; @@ -92,46 +71,17 @@ EXTERN struct subfile *current_subfile; EXTERN unsigned char processing_gcc_compilation; -/* Count symbols as they are processed, for error messages. */ - -EXTERN unsigned int symnum; - -/* Vector of types defined so far, indexed by their dbx type numbers. - (In newer sun systems, dbx uses a pair of numbers in parens, - as in "(SUBFILENUM,NUMWITHINSUBFILE)". Then these numbers must be - translated through the type_translations hash table to get - the index into the type vector.) */ - -EXTERN struct type **type_vector; - -/* Number of elements allocated for type_vector currently. */ - -EXTERN int type_vector_length; - -/* Vector of line number information. */ - -EXTERN struct linetable *line_vector; +/* When set, we are processing a .o file compiled by sun acc. This is + misnamed; it refers to all stabs-in-elf implementations which use + N_UNDF the way Sun does, including Solaris gcc. Hopefully all + stabs-in-elf implementations ever invented will choose to be + compatible. */ -/* Index of next entry to go in line_vector_index. */ +EXTERN unsigned char processing_acc_compilation; -EXTERN int line_vector_index; - -/* Last line number recorded in the line vector. */ - -EXTERN int prev_line_number; - -/* Number of elements allocated for line_vector currently. */ - -EXTERN int line_vector_length; - -/* Hash table of global symbols whose values are not known yet. - They are chained thru the SYMBOL_VALUE_CHAIN, since we don't - have the correct data for that slot yet. */ -/* The use of the LOC_BLOCK code in this chain is nonstandard-- - it refers to a FORTRAN common block rather than the usual meaning. */ +/* Count symbols as they are processed, for error messages. */ -#define HASHSIZE 127 -EXTERN struct symbol *global_sym_chain[HASHSIZE]; +EXTERN unsigned int symnum; /* Record the symbols defined for each context in a list. We don't create a struct block for the context until we @@ -147,6 +97,7 @@ struct pending }; /* List of free `struct pending' structures for reuse. */ + EXTERN struct pending *free_pendings; /* Here are the three lists that symbols are put on. */ @@ -155,39 +106,55 @@ EXTERN struct pending *file_symbols; /* static at top level, and types */ EXTERN struct pending *global_symbols; /* global functions and variables */ -EXTERN struct pending *local_symbols; /* everything local to lexical context */ - -/* List of symbols declared since the last BCOMM. This list is a tail - of local_symbols. When ECOMM is seen, the symbols on the list - are noted so their proper addresses can be filled in later, - using the common block base address gotten from the assembler - stabs. */ - -EXTERN struct pending *common_block; -EXTERN int common_block_i; +EXTERN struct pending *local_symbols; /* everything local to lexic context */ /* Stack representing unclosed lexical contexts (that will become blocks, eventually). */ struct context_stack { + /* Outer locals at the time we entered */ + struct pending *locals; + + /* Pointer into blocklist as of entry */ + struct pending_block *old_blocks; + + /* Name of function, if any, defining context*/ + struct symbol *name; + + /* PC where this context starts */ + CORE_ADDR start_addr; - CORE_ADDR end_addr; /* Temp slot for exception handling. */ + + /* Temp slot for exception handling. */ + + CORE_ADDR end_addr; + + /* For error-checking matching push/pop */ + int depth; + }; EXTERN struct context_stack *context_stack; /* Index of first unused entry in context stack. */ + EXTERN int context_stack_depth; /* Currently allocated size of context stack. */ EXTERN int context_stack_size; +/* Macro "function" for popping contexts from the stack. Pushing is done + by a real function, push_context. This returns a pointer to a struct + context_stack. */ + +#define pop_context() (&context_stack[--context_stack_depth]); + /* Nonzero if within a function (so symbols should be local, if nothing says specifically). */ @@ -204,71 +171,89 @@ 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 */ + +struct subfile_stack +{ + struct subfile_stack *next; + char *name; +}; -/* Global variable which, when set, indicates that we are processing a - .o file compiled with gcc */ +EXTERN struct subfile_stack *subfile_stack; -EXTERN unsigned char processing_gcc_compilation; +#define next_symbol_text() (*next_symbol_text_func)() -/* Setup a define to deal cleanly with the underscore problem */ +/* Function to invoke get the next symbol. Return the symbol name. */ -#ifdef NAMES_HAVE_UNDERSCORE -#define HASH_OFFSET 1 -#else -#define HASH_OFFSET 0 -#endif - -/* Support for Sun changes to dbx symbol format */ - -/* For each identified header file, we have a table of types defined - in that header file. - - header_files maps header file names to their type tables. - It is a vector of n_header_files elements. - Each element describes one header file. - It contains a vector of types. - - Sometimes it can happen that the same header file produces - different results when included in different places. - This can result from conditionals or from different - things done before including the file. - When this happens, there are multiple entries for the file in this table, - one entry for each distinct set of results. - The entries are distinguished by the INSTANCE field. - The INSTANCE field appears in the N_BINCL and N_EXCL symbol table and is - used to match header-file references to their corresponding data. */ - -struct header_file -{ - char *name; /* Name of header file */ - int instance; /* Numeric code distinguishing instances - of one header file that produced - different results when included. - It comes from the N_BINCL or N_EXCL. */ - struct type **vector; /* Pointer to vector of types */ - int length; /* Allocated length (# elts) of that vector */ -}; +EXTERN char *(*next_symbol_text_func) PARAMS ((void)); + +/* Vector of types defined so far, indexed by their type numbers. + Used for both stabs and coff. + (In newer sun systems, dbx uses a pair of numbers in parens, + as in "(SUBFILENUM,NUMWITHINSUBFILE)". Then these numbers must be + translated through the type_translations hash table to get + the index into the type vector.) */ + +EXTERN struct type **type_vector; + +/* Number of elements allocated for type_vector currently. */ + +EXTERN int type_vector_length; + +/* Initial size of type vector. Is realloc'd larger if needed, + and realloc'd down to the size actually used, when completed. */ + +#define INITIAL_TYPE_VECTOR_LENGTH 160 + +extern void +add_symbol_to_list PARAMS ((struct symbol *, struct pending **)); + +extern struct symbol * +find_symbol_in_list PARAMS ((struct pending *, char *, int)); + +extern void +finish_block PARAMS ((struct symbol *, struct pending **, + struct pending_block *, CORE_ADDR, CORE_ADDR, + struct objfile *)); + +extern void +really_free_pendings PARAMS ((int foo)); + +extern void +start_subfile PARAMS ((char *, char *)); + +extern void +patch_subfile_names PARAMS ((struct subfile *subfile, char *name)); + +extern void +push_subfile PARAMS ((void)); + +extern char * +pop_subfile PARAMS ((void)); + +extern struct symtab * +end_symtab PARAMS ((CORE_ADDR, int, int, struct objfile *, int)); + +extern void +scan_file_globals PARAMS ((struct objfile *)); -EXTERN struct header_file *header_files; +extern void +buildsym_new_init PARAMS ((void)); -EXTERN int n_header_files; +extern void +buildsym_init PARAMS ((void)); -EXTERN int n_allocated_header_files; +extern struct context_stack * +push_context PARAMS ((int, CORE_ADDR)); -/* Within each object file, various header files are assigned numbers. - A type is defined or referred to with a pair of numbers - (FILENUM,TYPENUM) where FILENUM is the number of the header file - and TYPENUM is the number within that header file. - TYPENUM is the index within the vector of types for that header file. +extern void +record_line PARAMS ((struct subfile *, int, CORE_ADDR)); - FILENUM == 1 is special; it refers to the main source of the object file, - and not to any header file. FILENUM != 1 is interpreted by looking it up - in the following table, which contains indices in header_files. */ +extern void +start_symtab PARAMS ((char *, char *, CORE_ADDR)); -EXTERN int *this_object_header_files; +extern int +hashname PARAMS ((char *)); -EXTERN int n_this_object_header_files; +#undef EXTERN -EXTERN int n_allocated_this_object_header_files; +#endif /* defined (BUILDSYM_H) */