/* Minimal symbol table definitions for GDB.
- Copyright (C) 2011-2012 Free Software Foundation, Inc.
+ Copyright (C) 2011-2018 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. */
+
+struct bound_minimal_symbol
+{
+ /* The minimal symbol that was found, or NULL if no minimal symbol
+ was found. */
+
+ struct minimal_symbol *minsym;
+
+ /* If MINSYM is not NULL, then this is the objfile in which the
+ symbol is defined. */
+
+ struct objfile *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.
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;
-void init_minimal_symbol_collection (void);
+/* An RAII-based object that is used to record minimal symbols while
+ they are being read. */
+class minimal_symbol_reader
+{
+ public:
-/* 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. */
+ /* Prepare to start collecting minimal symbols. This should be
+ called by a symbol reader to initialize the minimal symbol
+ module. */
-struct cleanup *make_cleanup_discard_minimal_symbols (void);
+ explicit minimal_symbol_reader (struct objfile *);
-/* 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.
+ ~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.
- 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
- BFD_SECTION - the symbol's BFD section; used to find the
- 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,
- asection *bfd_section,
- struct objfile *objfile);
-
-/* Like prim_record_minimal_symbol_full, but:
- - uses strlen to compute NAME_LEN,
- - passes COPY_NAME = 0,
- - passes SECTION = 0,
- - and passes BFD_SECTION = NULL.
+ 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:
-void prim_record_minimal_symbol (const char *, CORE_ADDR,
- enum minimal_symbol_type,
- struct objfile *);
+ 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
+ */
-/* Like prim_record_minimal_symbol_full, but:
- - uses strlen to compute NAME_LEN,
- - passes COPY_NAME = 0. */
+ struct minimal_symbol *record_full (const char *name,
+ int name_len,
+ bool copy_name,
+ CORE_ADDR address,
+ enum minimal_symbol_type ms_type,
+ int section);
-struct minimal_symbol *prim_record_minimal_symbol_and_info
- (const char *,
- CORE_ADDR,
- enum minimal_symbol_type,
- int section,
- asection *bfd_section,
- struct objfile *);
+ /* Like record_full, but:
+ - uses strlen to compute NAME_LEN,
+ - 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:
+ - uses strlen to compute NAME_LEN,
+ - passes COPY_NAME = true. */
+
+ struct minimal_symbol *record_with_info (const char *name,
+ CORE_ADDR address,
+ enum minimal_symbol_type ms_type,
+ int section)
+ {
+ return record_full (name, strlen (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 &);
+
+ struct objfile *m_objfile;
+
+ /* Bunch currently being filled up.
+ The next field points to chain of filled bunches. */
-/* 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. */
+ struct msym_bunch *m_msym_bunch;
-void install_minimal_symbols (struct objfile *);
+ /* 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;
+};
/* Create the terminating entry of OBJFILE's minimal symbol table.
If OBJFILE->msymbols is zero, allocate a single entry from
void terminate_minimal_symbol_table (struct objfile *objfile);
-/* 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. */
+\f
-void msymbols_sort (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. */
requirements. */
#define SYMBOL_HASH_NEXT(hash, c) \
- ((hash) * 67 + tolower ((unsigned char) (c)) - 113)
-
-\f
-
-/* Return the objfile that holds the minimal symbol SYM. Every
- minimal symbols is held by some objfile; this will never return
- NULL. */
-
-struct objfile *msymbol_objfile (struct minimal_symbol *sym);
+ ((hash) * 67 + TOLOWER ((unsigned char) (c)) - 113)
\f
/* 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 pointer to the minimal symbol that
- matches, or NULL if no match is found. */
+ 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 minimal_symbol *lookup_minimal_symbol (const char *,
- const char *,
- struct objfile *);
+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 *);
/* Find the minimal symbol named NAME, and return both the minsym
- struct and its objfile. This only checks the linkage name. Sets
- *OBJFILE_P and returns the minimal symbol, if it is found. If it
- is not found, returns NULL. */
+ struct and its objfile. This only checks the linkage name. */
-struct minimal_symbol *lookup_minimal_symbol_and_objfile (const char *,
- struct objfile **);
+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 pointer
- to the minimal symbol that matches, or NULL if no match is found.
+ 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 minimal_symbol *lookup_minimal_symbol_text (const char *,
- struct objfile *);
+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.
This function only searches the mangled (linkage) names. */
-struct minimal_symbol *lookup_minimal_symbol_solib_trampoline
+struct bound_minimal_symbol lookup_minimal_symbol_solib_trampoline
(const char *,
struct objfile *);
If SECTION is NULL, this uses the result of find_pc_section
instead.
- Returns a pointer to the minimal symbol if such a symbol is found,
- or NULL if PC is not in a suitable range. */
+ The result has a non-NULL 'minsym' member if such a symbol is
+ found, or NULL if PC is not in a suitable range. */
-struct minimal_symbol *lookup_minimal_symbol_by_pc_section
+struct bound_minimal_symbol lookup_minimal_symbol_by_pc_section
(CORE_ADDR,
struct obj_section *);
This is a wrapper that calls lookup_minimal_symbol_by_pc_section
with a NULL section argument. */
-struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
-
-/* Check if PC is in a shared library trampoline code stub.
- Return minimal symbol for the trampoline entry or NULL if PC is not
- in a trampoline code stub. */
-
-struct minimal_symbol *lookup_solib_trampoline_symbol_by_pc (CORE_ADDR);
+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
USER_DATA as arguments. */
void iterate_over_minimal_symbols (struct objfile *objf,
- const char *name,
+ const lookup_name_info &name,
void (*callback) (struct minimal_symbol *,
void *),
void *user_data);
+/* 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 */