/* Minimal symbol table definitions for GDB.
- Copyright (C) 2011-2016 Free Software Foundation, Inc.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
This file is part of GDB.
#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. */
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 *record_full (const char *name,
- int name_len,
- int copy_name,
+ 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:
- - uses strlen to compute NAME_LEN,
- - passes COPY_NAME = 1,
+ - 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 *, CORE_ADDR, enum minimal_symbol_type);
+ void record (const char *name, CORE_ADDR address,
+ enum minimal_symbol_type ms_type);
/* Like record_full, but:
- - uses strlen to compute NAME_LEN,
- - passes COPY_NAME = 1. */
+ - computes the length of NAME
+ - passes COPY_NAME = true.
+
+ This variant does not return the new symbol. */
- struct minimal_symbol *record_with_info (const char *name,
- CORE_ADDR address,
- enum minimal_symbol_type ms_type,
- int section)
+ void record_with_info (const char *name, CORE_ADDR address,
+ enum minimal_symbol_type ms_type,
+ int section)
{
- return record_full (name, strlen (name), 1, address, ms_type, section);
+ record_full (name, true, address, ms_type, section);
}
private:
- /* No need for these. They are intentionally not defined anywhere. */
- minimal_symbol_reader &operator=
- (const minimal_symbol_reader &);
- minimal_symbol_reader (const minimal_symbol_reader &);
+ DISABLE_COPY_AND_ASSIGN (minimal_symbol_reader);
struct objfile *m_objfile;
int m_msym_count;
};
-/* 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]. */
+\f
-void terminate_minimal_symbol_table (struct objfile *objfile);
+/* 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. */
-\f
+bool msymbol_is_function (struct objfile *objfile,
+ minimal_symbol *minsym,
+ CORE_ADDR *func_address_p = NULL);
-/* Compute a hash code for the string argument. */
+/* 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 *);
requirements. */
#define SYMBOL_HASH_NEXT(hash, c) \
- ((hash) * 67 + tolower ((unsigned char) (c)) - 113)
+ ((hash) * 67 + TOLOWER ((unsigned char) (c)) - 113)
\f
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
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.
+/* 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. */
- This function only searches the mangled (linkage) names. */
-
-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,
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).
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<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
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 */