diff options
author | John Gilmore <gnu@cygnus> | 1991-10-26 07:21:30 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1991-10-26 07:21:30 +0000 |
commit | c030245775e5c6a10511b5950da1add5513727c2 (patch) | |
tree | 9d53270df733b54ec3ca8190a5ca59f16c9fe3b9 /gdb/buildsym.h | |
parent | bcccec8c8d084669c7469b8578448fa18ddbe2f3 (diff) | |
download | gdb-c030245775e5c6a10511b5950da1add5513727c2.zip gdb-c030245775e5c6a10511b5950da1add5513727c2.tar.gz gdb-c030245775e5c6a10511b5950da1add5513727c2.tar.bz2 |
Break out symbol-table-building routines
from dbxread.c, so they can be shared with xcoffread.c.
Diffstat (limited to 'gdb/buildsym.h')
-rw-r--r-- | gdb/buildsym.h | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/gdb/buildsym.h b/gdb/buildsym.h new file mode 100644 index 0000000..7cef879 --- /dev/null +++ b/gdb/buildsym.h @@ -0,0 +1,274 @@ +/* Build symbol tables in GDB's internal format. + Copyright (C) 1986-1991 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. */ + +/* This module provides definitions used for creating and adding to + the symbol table. These routines are called from various symbol- + file-reading routines. + + They originated in dbxread.c of gdb-4.2, and were split out to + make xcoffread.c more maintainable by sharing code. + + Variables declared in this file can be defined by #define-ing + the name EXTERN to null. It is used to declare variables that + are normally extern, but which get defined in a single module + using this technique. */ + +#ifndef 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 + +/* Name of source file whose symbol data we are now processing. + 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. */ + +EXTERN CORE_ADDR last_source_start_addr; + +/* The list of sub-source-files within the current individual compilation. + Each file gets its own symtab with its own linetable and associated info, + but they all share one blockvector. */ + +struct subfile +{ + struct subfile *next; + char *name; + char *dirname; + struct linetable *line_vector; + int line_vector_length; + int line_vector_index; + int prev_line_number; +}; + +EXTERN struct subfile *subfiles; + +EXTERN struct subfile *current_subfile; + +/* Global variable which, when set, indicates that we are processing a + .o file compiled with gcc */ + +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; + +/* Index of next entry to go in line_vector_index. */ + +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. */ + +#define HASHSIZE 127 +EXTERN struct symbol *global_sym_chain[HASHSIZE]; + +/* Record the symbols defined for each context in a list. + We don't create a struct block for the context until we + know how long to make it. */ + +#define PENDINGSIZE 100 + +struct pending +{ + struct pending *next; + int nsyms; + struct symbol *symbol[PENDINGSIZE]; +}; + +/* List of free `struct pending' structures for reuse. */ +EXTERN struct pending *free_pendings; + +/* Here are the three lists that symbols are put on. */ + +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; + +/* Stack representing unclosed lexical contexts + (that will become blocks, eventually). */ + +struct context_stack +{ + struct pending *locals; + struct pending_block *old_blocks; + struct symbol *name; + CORE_ADDR start_addr; + CORE_ADDR end_addr; /* Temp slot for exception handling. */ + 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; + +/* Nonzero if within a function (so symbols should be local, + if nothing says specifically). */ + +EXTERN int within_function; + +/* List of blocks already made (lexical contexts already closed). + This is used at the end to make the blockvector. */ + +struct pending_block +{ + struct pending_block *next; + struct block *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 */ + +EXTERN unsigned char processing_gcc_compilation; + +/* Setup a define to deal cleanly with the underscore problem */ + +#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 struct header_file *header_files; + +EXTERN int n_header_files; + +EXTERN int n_allocated_header_files; + +/* 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. + + 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 int *this_object_header_files; + +EXTERN int n_this_object_header_files; + +EXTERN int n_allocated_this_object_header_files; |