|  | /* Include file for stabs debugging format support functions. | 
|  | Copyright (C) 1986-2024 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 3 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, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef GDB_STABSREAD_H | 
|  | #define GDB_STABSREAD_H | 
|  |  | 
|  | struct objfile; | 
|  | struct legacy_psymtab; | 
|  | enum language; | 
|  |  | 
|  | /* Definitions, prototypes, etc for stabs debugging format support | 
|  | functions.  */ | 
|  |  | 
|  | #define HASHSIZE 127		/* Size of things hashed via | 
|  | hashname().  */ | 
|  |  | 
|  | /* Compute a small integer hash code for the given name.  */ | 
|  |  | 
|  | extern int hashname (const char *name); | 
|  |  | 
|  | /* Count symbols as they are processed, for error messages.  */ | 
|  |  | 
|  | extern unsigned int symnum; | 
|  |  | 
|  | #define next_symbol_text(objfile) (*next_symbol_text_func)(objfile) | 
|  |  | 
|  | /* Function to invoke get the next symbol.  Return the symbol name.  */ | 
|  |  | 
|  | extern const char *(*next_symbol_text_func) (struct objfile *); | 
|  |  | 
|  | /* Global variable which, when set, indicates that we are processing a | 
|  | .o file compiled with gcc */ | 
|  |  | 
|  | extern unsigned char processing_gcc_compilation; | 
|  |  | 
|  | /* Nonzero if within a function (so symbols should be local, if | 
|  | nothing says specifically).  */ | 
|  |  | 
|  | extern int within_function; | 
|  |  | 
|  | /* Hash table of global symbols whose values are not known yet. | 
|  | They are chained through 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, and | 
|  | the such LOC_BLOCK symbols use their fields in nonstandard ways.  */ | 
|  |  | 
|  | extern struct symbol *global_sym_chain[HASHSIZE]; | 
|  |  | 
|  | extern void common_block_start (const char *, struct objfile *); | 
|  | extern void common_block_end (struct objfile *); | 
|  |  | 
|  | /* Kludge for xcoffread.c */ | 
|  |  | 
|  | struct pending_stabs | 
|  | { | 
|  | int count; | 
|  | int length; | 
|  | char *stab[1]; | 
|  | }; | 
|  |  | 
|  | extern struct pending_stabs *global_stabs; | 
|  |  | 
|  | /* The type code that process_one_symbol saw on its previous invocation. | 
|  | Used to detect pairs of N_SO symbols.  */ | 
|  |  | 
|  | extern int previous_stab_code; | 
|  |  | 
|  | /* 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 | 
|  | { | 
|  |  | 
|  | /* Name of header file */ | 
|  |  | 
|  | char *name; | 
|  |  | 
|  | /* Numeric code distinguishing instances of one header file that | 
|  | produced different results when included.  It comes from the | 
|  | N_BINCL or N_EXCL.  */ | 
|  |  | 
|  | int instance; | 
|  |  | 
|  | /* Pointer to vector of types */ | 
|  |  | 
|  | struct type **vector; | 
|  |  | 
|  | /* Allocated length (# elts) of that vector */ | 
|  |  | 
|  | int length; | 
|  |  | 
|  | }; | 
|  |  | 
|  | /* The table of header_files of this OBJFILE.  */ | 
|  | #define HEADER_FILES(OBJFILE) (DBX_SYMFILE_INFO (OBJFILE)->header_files) | 
|  |  | 
|  | /* The actual length of HEADER_FILES.  */ | 
|  | #define N_HEADER_FILES(OBJFILE) (DBX_SYMFILE_INFO (OBJFILE)->n_header_files) | 
|  |  | 
|  | /* The allocated lengh of HEADER_FILES.  */ | 
|  | #define N_ALLOCATED_HEADER_FILES(OBJFILE) \ | 
|  | (DBX_SYMFILE_INFO (OBJFILE)->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 == 0 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; | 
|  |  | 
|  | extern void cleanup_undefined_stabs_types (struct objfile *); | 
|  |  | 
|  | extern long read_number (char **, int); | 
|  |  | 
|  | extern struct symbol *define_symbol (CORE_ADDR, const char *, int, int, | 
|  | struct objfile *); | 
|  |  | 
|  | extern void stabsread_init (void); | 
|  |  | 
|  | extern void stabsread_new_init (void); | 
|  |  | 
|  | extern void start_stabs (void); | 
|  |  | 
|  | extern void end_stabs (void); | 
|  |  | 
|  | extern void finish_global_stabs (struct objfile *objfile); | 
|  |  | 
|  | class psymtab_storage; | 
|  |  | 
|  | /* Functions exported by dbxread.c.  These are not in stabsread.c because | 
|  | they are only used by some stabs readers.  */ | 
|  |  | 
|  | extern legacy_psymtab *stabs_end_psymtab | 
|  | (struct objfile *objfile, psymtab_storage *partial_symtabs, | 
|  | legacy_psymtab *pst, | 
|  | const char **include_list, int num_includes, | 
|  | int capping_symbol_offset, unrelocated_addr capping_text, | 
|  | legacy_psymtab **dependency_list, int number_dependencies, | 
|  | int textlow_not_set); | 
|  |  | 
|  | extern void process_one_symbol (int, int, CORE_ADDR, const char *, | 
|  | const section_offsets &, | 
|  | struct objfile *, enum language); | 
|  |  | 
|  | /* Setup partial_symtab's describing each source file for which | 
|  | debugging information is available.  */ | 
|  |  | 
|  | void | 
|  | read_stabs_symtab (struct objfile *, symfile_add_flags); | 
|  |  | 
|  | extern void elfstab_build_psymtabs (struct objfile *objfile, | 
|  | asection *stabsect, | 
|  | file_ptr stabstroffset, | 
|  | unsigned int stabstrsize); | 
|  |  | 
|  | extern void coffstab_build_psymtabs | 
|  | (struct objfile *objfile, | 
|  | CORE_ADDR textaddr, unsigned int textsize, | 
|  | const std::vector<asection *> &stabs, | 
|  | file_ptr stabstroffset, unsigned int stabstrsize); | 
|  |  | 
|  | extern int symbol_reference_defined (const char **); | 
|  |  | 
|  | extern void ref_add (int, struct symbol *, const char *, CORE_ADDR); | 
|  |  | 
|  | extern struct symbol *ref_search (int); | 
|  |  | 
|  | extern void free_header_files (void); | 
|  |  | 
|  | extern void init_header_files (void); | 
|  |  | 
|  | /* Scan through all of the global symbols defined in the object file, | 
|  | assigning values to the debugging symbols that need to be assigned | 
|  | to.  Get these symbols from the minimal symbol table.  */ | 
|  |  | 
|  | extern void scan_file_globals (struct objfile *objfile); | 
|  |  | 
|  | /* Complaints about the symbols we have encountered.  */ | 
|  |  | 
|  | void | 
|  | unknown_symtype_complaint (const char *); | 
|  |  | 
|  | void | 
|  | lbrac_mismatch_complaint (int); | 
|  |  | 
|  | void | 
|  | repeated_header_complaint (const char *, int); | 
|  |  | 
|  | bound_minimal_symbol | 
|  | find_stab_function (const char *, const char *, struct objfile *); | 
|  |  | 
|  | /* This handles a single symbol from the symbol-file, building symbols | 
|  | into a GDB symtab.  It takes these arguments and an implicit argument. | 
|  |  | 
|  | TYPE is the type field of the ".stab" symbol entry. | 
|  | DESC is the desc field of the ".stab" entry. | 
|  | VALU is the value field of the ".stab" entry. | 
|  | NAME is the symbol name, in our address space. | 
|  | SECTION_OFFSETS is a set of amounts by which the sections of this | 
|  | object file were relocated when it was loaded into memory.  Note | 
|  | that these section_offsets are not the objfile->section_offsets but | 
|  | the pst->section_offsets.  All symbols that refer to memory | 
|  | locations need to be offset by these amounts. | 
|  | OBJFILE is the object file from which we are reading symbols.  It | 
|  | is used in end_compunit_symtab. | 
|  | LANGUAGE is the language of the symtab. | 
|  | */ | 
|  |  | 
|  | void | 
|  | process_one_symbol (int, int, CORE_ADDR, const char *, | 
|  | const section_offsets &, | 
|  | struct objfile *, enum language); | 
|  |  | 
|  | #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff) | 
|  | #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen) | 
|  | #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private)) | 
|  | #define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size) | 
|  | #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset) | 
|  | #define STRING_OFFSET(p) (SYMLOC(p)->string_offset) | 
|  | #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset) | 
|  | #define PST_LANGUAGE(p) (SYMLOC(p)->pst_language) | 
|  |  | 
|  | #define INTERNALIZE_SYMBOL(intern, extern, abfd)			\ | 
|  | {									\ | 
|  | (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);		\ | 
|  | (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);		\ | 
|  | (intern).n_other = 0;						\ | 
|  | (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);  		\ | 
|  | if (bfd_get_sign_extend_vma (abfd))					\ | 
|  | (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value);	\ | 
|  | else								\ | 
|  | (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);	\ | 
|  | } | 
|  |  | 
|  | /* We put a pointer to this structure in the read_symtab_private field | 
|  | of the psymtab.  */ | 
|  |  | 
|  | struct symloc | 
|  | { | 
|  | /* Offset within the file symbol table of first local symbol for this | 
|  | file.  */ | 
|  |  | 
|  | int ldsymoff; | 
|  |  | 
|  | /* Length (in bytes) of the section of the symbol table devoted to | 
|  | this file's symbols (actually, the section bracketed may contain | 
|  | more than just this file's symbols).  If ldsymlen is 0, the only | 
|  | reason for this thing's existence is the dependency list.  Nothing | 
|  | else will happen when it is read in.  */ | 
|  |  | 
|  | int ldsymlen; | 
|  |  | 
|  | /* The size of each symbol in the symbol file (in external form).  */ | 
|  |  | 
|  | int symbol_size; | 
|  |  | 
|  | /* Further information needed to locate the symbols if they are in | 
|  | an ELF file.  */ | 
|  |  | 
|  | int symbol_offset; | 
|  | int string_offset; | 
|  | int file_string_offset; | 
|  | enum language pst_language; | 
|  | }; | 
|  | #endif /* GDB_STABSREAD_H */ |