123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- /* Minimal symbol table definitions for GDB.
- Copyright (C) 2011-2022 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 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. */
- struct bound_minimal_symbol
- {
- bound_minimal_symbol (struct minimal_symbol *msym, struct objfile *objf)
- : minsym (msym),
- objfile (objf)
- {
- }
- bound_minimal_symbol () = default;
- /* The minimal symbol that was found, or NULL if no minimal symbol
- was found. */
- struct minimal_symbol *minsym = nullptr;
- /* If MINSYM is not NULL, then this is the objfile in which the
- symbol is defined. */
- struct objfile *objfile = nullptr;
- /* Return the obj_section from OBJFILE for MINSYM. */
- struct obj_section *obj_section () const
- {
- return minsym->obj_section (objfile);
- }
- };
- /* This header declares most of the API for dealing with minimal
- symbols and minimal symbol tables. A few things are declared
- elsewhere; see below.
- A minimal symbol is a symbol for which there is no direct debug
- information. For example, for an ELF binary, minimal symbols are
- created from the ELF symbol table.
- For the definition of the minimal symbol structure, see struct
- minimal_symbol in symtab.h.
- Minimal symbols are stored in tables attached to an objfile; see
- objfiles.h for details. Code should generally treat these tables
- as opaque and use functions provided by minsyms.c to inspect them.
- */
- struct msym_bunch;
- /* An RAII-based object that is used to record minimal symbols while
- they are being read. */
- class minimal_symbol_reader
- {
- public:
- /* Prepare to start collecting minimal symbols. This should be
- called by a symbol reader to initialize the minimal symbol
- module. */
- explicit minimal_symbol_reader (struct objfile *);
- ~minimal_symbol_reader ();
- /* 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.
-
- 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.
-
- 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);
- /* Like record_full, but:
- - computes the length of NAME
- - passes COPY_NAME = true,
- - and passes a default SECTION, depending on the type
- This variant does not return the new symbol. */
- void record (const char *name, CORE_ADDR address,
- enum minimal_symbol_type ms_type);
- /* Like record_full, but:
- - computes the length of NAME
- - passes COPY_NAME = true.
- This variant does not return the new symbol. */
- 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);
- }
- private:
- DISABLE_COPY_AND_ASSIGN (minimal_symbol_reader);
- 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;
- };
- /* 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 *);
- /* Like msymbol_hash, but compute a hash code that is compatible with
- strcmp_iw. */
- unsigned int msymbol_hash_iw (const char *);
- /* Compute the next hash value from previous HASH and the character C. This
- is only a GDB in-memory computed value with no external files compatibility
- requirements. */
- #define SYMBOL_HASH_NEXT(hash, c) \
- ((hash) * 67 + TOLOWER ((unsigned char) (c)) - 113)
- /* Look through all the current minimal symbol tables and find the
- first minimal symbol that matches NAME. If OBJF is non-NULL, limit
- the search to that objfile. If SFILE is non-NULL, the only
- file-scope symbols considered will be from that source file (global
- symbols are still preferred). Returns a bound minimal symbol that
- matches, or an empty bound minimal symbol if no match is found. */
- struct bound_minimal_symbol lookup_minimal_symbol (const char *,
- const char *,
- struct objfile *);
- /* Like lookup_minimal_symbol, but searches all files and
- objfiles. */
- struct bound_minimal_symbol lookup_bound_minimal_symbol (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
- minimal symbol that matches, or an "empty" bound minimal symbol
- otherwise.
- This function only searches the mangled (linkage) names. */
- struct bound_minimal_symbol lookup_minimal_symbol_text (const char *,
- struct objfile *);
- /* 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. */
- 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,
- limit the search to that objfile. Returns a pointer to the minimal
- symbol that matches, or NULL if no match is found. */
- 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_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.
- 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 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).
-
- This is a wrapper that calls lookup_minimal_symbol_by_pc_section
- with a NULL section argument. */
- struct bound_minimal_symbol lookup_minimal_symbol_by_pc (CORE_ADDR);
- /* Iterate over all the minimal symbols in the objfile OBJF which
- match NAME. Both the ordinary and demangled names of each symbol
- 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. */
- void iterate_over_minimal_symbols
- (struct objfile *objf, const lookup_name_info &name,
- gdb::function_view<bool (struct minimal_symbol *)> 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
- size, it is used. Otherwise use the lesser of the next minimal
- symbol in the same section, or the end of the section, as the end
- of the function. */
- 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 */
|