X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fminsyms.h;h=11c46ebb8c63040c2257a7d2403231f91f4b2bfa;hb=37ab86550b9da31d6c32c2d3384bd27f0426e935;hp=a11b5e88acaf98619411a800dadd61d0ff7e6f28;hpb=3b7344d5ab495cd82b6c72ec5e00d018549837fb;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/minsyms.h b/gdb/minsyms.h index a11b5e88ac..11c46ebb8c 100644 --- a/gdb/minsyms.h +++ b/gdb/minsyms.h @@ -1,6 +1,6 @@ /* Minimal symbol table definitions for GDB. - Copyright (C) 2011-2014 Free Software Foundation, Inc. + Copyright (C) 2011-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -20,6 +20,8 @@ #ifndef MINSYMS_H #define MINSYMS_H +struct type; + /* Several lookup functions return both a minimal symbol and the objfile in which it is found. This structure is used in these cases. */ @@ -53,98 +55,110 @@ struct bound_minimal_symbol as opaque and use functions provided by minsyms.c to inspect them. */ -/* Prepare to start collecting minimal symbols. This should be called - by a symbol reader to initialize the minimal symbol module. - Currently, minimal symbol table creation is not reentrant; it - relies on global (static) variables in minsyms.c. */ +struct msym_bunch; + +/* An RAII-based object that is used to record minimal symbols while + they are being read. */ +class minimal_symbol_reader +{ + public: -void init_minimal_symbol_collection (void); + /* Prepare to start collecting minimal symbols. This should be + called by a symbol reader to initialize the minimal symbol + module. */ -/* Return a cleanup which is used to clean up the global state left - over by minimal symbol creation. After calling - init_minimal_symbol_collection, a symbol reader should call this - function. Then, after all minimal symbols have been read, - regardless of whether they are installed or not, the cleanup - returned by this function should be run. */ + explicit minimal_symbol_reader (struct objfile *); -struct cleanup *make_cleanup_discard_minimal_symbols (void); + ~minimal_symbol_reader (); -/* Record a new minimal symbol. This is the "full" entry point; - simpler convenience entry points are also provided below. - - This returns a new minimal symbol. It is ok to modify the returned - minimal symbol (though generally not necessary). It is not ok, - though, to stash the pointer anywhere; as minimal symbols may be - moved after creation. The memory for the returned minimal symbol - is still owned by the minsyms.c code, and should not be freed. + /* Install the minimal symbols that have been collected into the + given objfile. */ + + void install (); + + /* Record a new minimal symbol. This is the "full" entry point; + simpler convenience entry points are also provided below. - Arguments are: - - NAME - the symbol's name - NAME_LEN - the length of the name - COPY_NAME - if true, the minsym code must make a copy of NAME. If - false, then NAME must be NUL-terminated, and must have a lifetime - that is at least as long as OBJFILE's lifetime. - ADDRESS - the address of the symbol - MS_TYPE - the type of the symbol - SECTION - the symbol's section - appropriate obj_section for the minimal symbol. This can be NULL. - OBJFILE - the objfile associated with the minimal symbol. */ - -struct minimal_symbol *prim_record_minimal_symbol_full - (const char *name, - int name_len, - int copy_name, - CORE_ADDR address, - enum minimal_symbol_type ms_type, - int section, - struct objfile *objfile); - -/* Like prim_record_minimal_symbol_full, but: - - uses strlen to compute NAME_LEN, - - passes COPY_NAME = 0, - - and passes a default SECTION, depending on the type + This returns a new minimal symbol. It is ok to modify the returned + minimal symbol (though generally not necessary). It is not ok, + though, to stash the pointer anywhere; as minimal symbols may be + moved after creation. The memory for the returned minimal symbol + is still owned by the minsyms.c code, and should not be freed. - This variant does not return the new symbol. */ + Arguments are: + + NAME - the symbol's name + COPY_NAME - if true, the minsym code must make a copy of NAME. If + false, then NAME must be NUL-terminated, and must have a lifetime + that is at least as long as OBJFILE's lifetime. + ADDRESS - the address of the symbol + MS_TYPE - the type of the symbol + SECTION - the symbol's section + */ + + struct minimal_symbol *record_full (gdb::string_view name, + bool copy_name, + CORE_ADDR address, + enum minimal_symbol_type ms_type, + int section); -void prim_record_minimal_symbol (const char *, CORE_ADDR, - enum minimal_symbol_type, - struct objfile *); + /* Like record_full, but: + - computes the length of NAME + - passes COPY_NAME = true, + - and passes a default SECTION, depending on the type -/* Like prim_record_minimal_symbol_full, but: - - uses strlen to compute NAME_LEN, - - passes COPY_NAME = 0. */ + This variant does not return the new symbol. */ -struct minimal_symbol *prim_record_minimal_symbol_and_info - (const char *, - CORE_ADDR, - enum minimal_symbol_type, - int section, - struct objfile *); + void record (const char *name, CORE_ADDR address, + enum minimal_symbol_type ms_type); -/* Install the minimal symbols that have been collected into the given - objfile. After this is called, the cleanup returned by - make_cleanup_discard_minimal_symbols should be run in order to - clean up global state. */ + /* Like record_full, but: + - computes the length of NAME + - passes COPY_NAME = true. -void install_minimal_symbols (struct objfile *); + This variant does not return the new symbol. */ -/* Create the terminating entry of OBJFILE's minimal symbol table. - If OBJFILE->msymbols is zero, allocate a single entry from - OBJFILE->objfile_obstack; otherwise, just initialize - OBJFILE->msymbols[OBJFILE->minimal_symbol_count]. */ + void record_with_info (const char *name, CORE_ADDR address, + enum minimal_symbol_type ms_type, + int section) + { + record_full (name, true, address, ms_type, section); + } -void terminate_minimal_symbol_table (struct objfile *objfile); + private: -/* Sort all the minimal symbols in OBJFILE. This should be only be - called after relocating symbols; it ensures that the minimal - symbols are properly sorted by address. */ + DISABLE_COPY_AND_ASSIGN (minimal_symbol_reader); -void msymbols_sort (struct objfile *objfile); + struct objfile *m_objfile; + + /* Bunch currently being filled up. + The next field points to chain of filled bunches. */ + + struct msym_bunch *m_msym_bunch; + + /* Number of slots filled in current bunch. */ + + int m_msym_bunch_index; + + /* Total number of minimal symbols recorded so far for the + objfile. */ + + int m_msym_count; +}; -/* Compute a hash code for the string argument. */ +/* Return whether MSYMBOL is a function/method. If FUNC_ADDRESS_P is + non-NULL, and the MSYMBOL is a function, then *FUNC_ADDRESS_P is + set to the function's address, already resolved if MINSYM points to + a function descriptor. */ + +bool msymbol_is_function (struct objfile *objfile, + minimal_symbol *minsym, + CORE_ADDR *func_address_p = NULL); + +/* Compute a hash code for the string argument. Unlike htab_hash_string, + this is a case-insensitive hash to support "set case-sensitive off". */ unsigned int msymbol_hash (const char *); @@ -158,7 +172,7 @@ unsigned int msymbol_hash_iw (const char *); requirements. */ #define SYMBOL_HASH_NEXT(hash, c) \ - ((hash) * 67 + tolower ((unsigned char) (c)) - 113) + ((hash) * 67 + TOLOWER ((unsigned char) (c)) - 113) @@ -178,11 +192,6 @@ struct bound_minimal_symbol lookup_minimal_symbol (const char *, struct bound_minimal_symbol lookup_bound_minimal_symbol (const char *); -/* Find the minimal symbol named NAME, and return both the minsym - struct and its objfile. This only checks the linkage name. */ - -struct bound_minimal_symbol lookup_minimal_symbol_and_objfile (const char *); - /* Look through all the current minimal symbol tables and find the first minimal symbol that matches NAME and has text type. If OBJF is non-NULL, limit the search to that objfile. Returns a bound @@ -194,17 +203,16 @@ struct bound_minimal_symbol lookup_minimal_symbol_and_objfile (const char *); struct bound_minimal_symbol lookup_minimal_symbol_text (const char *, struct objfile *); -/* Look through all the current minimal symbol tables and find the - first minimal symbol that matches NAME and is a solib trampoline. - If OBJF is non-NULL, limit the search to that objfile. Returns a - pointer to the minimal symbol that matches, or NULL if no match is - found. - - This function only searches the mangled (linkage) names. */ +/* Look through the minimal symbols in OBJF (and its separate debug + objfiles) for a global (not file-local) minsym whose linkage name + is NAME. This is somewhat similar to lookup_minimal_symbol_text, + only data symbols (not text symbols) are considered, and a non-NULL + objfile is not accepted. Returns a bound minimal symbol that + matches, or an "empty" bound minimal symbol otherwise. */ -struct bound_minimal_symbol lookup_minimal_symbol_solib_trampoline - (const char *, - struct objfile *); +extern struct bound_minimal_symbol lookup_minimal_symbol_linkage + (const char *name, struct objfile *objf) + ATTRIBUTE_NONNULL (1) ATTRIBUTE_NONNULL (2); /* Look through all the current minimal symbol tables and find the first minimal symbol that matches NAME and PC. If OBJF is non-NULL, @@ -214,19 +222,46 @@ struct bound_minimal_symbol lookup_minimal_symbol_solib_trampoline struct minimal_symbol *lookup_minimal_symbol_by_pc_name (CORE_ADDR, const char *, struct objfile *); +enum class lookup_msym_prefer +{ + /* Prefer mst_text symbols. */ + TEXT, + + /* Prefer mst_solib_trampoline symbols when there are text and + trampoline symbols at the same address. Otherwise prefer + mst_text symbols. */ + TRAMPOLINE, + + /* Prefer mst_text_gnu_ifunc symbols when there are text and ifunc + symbols at the same address. Otherwise prefer mst_text + symbols. */ + GNU_IFUNC, +}; + /* Search through the minimal symbol table for each objfile and find the symbol whose address is the largest address that is still less - than or equal to PC, and which matches SECTION. + than or equal to PC_IN, and which matches SECTION. A matching symbol + must either be zero sized and have address PC_IN, or PC_IN must fall + within the range of addresses covered by the matching symbol. If SECTION is NULL, this uses the result of find_pc_section instead. The result has a non-NULL 'minsym' member if such a symbol is - found, or NULL if PC is not in a suitable range. */ + found, or NULL if PC is not in a suitable range. + + See definition of lookup_msym_prefer for description of PREFER. By + default mst_text symbols are preferred. + + If the PREVIOUS pointer is non-NULL, and no matching symbol is found, + then the contents will be set to reference the closest symbol before + PC_IN. */ struct bound_minimal_symbol lookup_minimal_symbol_by_pc_section - (CORE_ADDR, - struct obj_section *); + (CORE_ADDR pc_in, + struct obj_section *section, + lookup_msym_prefer prefer = lookup_msym_prefer::TEXT, + bound_minimal_symbol *previous = nullptr); /* Backward compatibility: search through the minimal symbol table for a matching PC (no section given). @@ -241,14 +276,11 @@ struct bound_minimal_symbol lookup_minimal_symbol_by_pc (CORE_ADDR); are considered. The caller is responsible for canonicalizing NAME, should that need to be done. - For each matching symbol, CALLBACK is called with the symbol and - USER_DATA as arguments. */ + For each matching symbol, CALLBACK is called with the symbol. */ -void iterate_over_minimal_symbols (struct objfile *objf, - const char *name, - void (*callback) (struct minimal_symbol *, - void *), - void *user_data); +void iterate_over_minimal_symbols + (struct objfile *objf, const lookup_name_info &name, + gdb::function_view callback); /* Compute the upper bound of MINSYM. The upper bound is the last address thought to be part of the symbol. If the symbol has a @@ -258,4 +290,11 @@ void iterate_over_minimal_symbols (struct objfile *objf, CORE_ADDR minimal_symbol_upper_bound (struct bound_minimal_symbol minsym); +/* Return the type of MSYMBOL, a minimal symbol of OBJFILE. If + ADDRESS_P is not NULL, set it to the MSYMBOL's resolved + address. */ + +type *find_minsym_type_and_address (minimal_symbol *msymbol, objfile *objf, + CORE_ADDR *address_p); + #endif /* MINSYMS_H */