/* Definitions for reading symbol files into GDB.
- Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 1990-2013 Free Software Foundation, Inc.
This file is part of GDB.
/* This file requires that you first include "bfd.h". */
#include "symtab.h"
+#include "probe.h"
/* Opaque declarations. */
struct target_section;
struct obj_section;
struct obstack;
struct block;
+struct probe;
+struct value;
+struct frame_info;
+struct agent_expr;
+struct axs_value;
/* Comparison function for symbol look ups. */
/* Forget all cached full file names for OBJFILE. */
void (*forget_cached_source_info) (struct objfile *objfile);
- /* Look up the symbol table, in OBJFILE, of a source file named
- NAME. If there is no '/' in the name, a match after a '/' in the
- symbol table's file name will also work. FULL_PATH is the
- absolute file name, and REAL_PATH is the same, run through
- gdb_realpath.
-
- If no such symbol table can be found, returns 0.
-
- Otherwise, sets *RESULT to the symbol table and returns 1. This
- might return 1 and set *RESULT to NULL if the requested file is
- an include file that does not have a symtab of its own. */
- int (*lookup_symtab) (struct objfile *objfile,
- const char *name,
- const char *full_path,
- const char *real_path,
- struct symtab **result);
+ /* Expand and iterate over each "partial" symbol table in OBJFILE
+ where the source file is named NAME.
+
+ If NAME is not absolute, a match after a '/' in the symbol table's
+ file name will also work, REAL_PATH is NULL then. If NAME is
+ absolute then REAL_PATH is non-NULL absolute file name as resolved
+ via gdb_realpath from NAME.
+
+ If a match is found, the "partial" symbol table is expanded.
+ Then, this calls iterate_over_some_symtabs (or equivalent) over
+ all newly-created symbol tables, passing CALLBACK and DATA to it.
+ The result of this call is returned. */
+ int (*map_symtabs_matching_filename) (struct objfile *objfile,
+ const char *name,
+ const char *real_path,
+ int (*callback) (struct symtab *,
+ void *),
+ void *data);
/* Check to see if the symbol is defined in a "partial" symbol table
of OBJFILE. KIND should be either GLOBAL_BLOCK or STATIC_BLOCK,
indicates what sort of symbol to search for.
Returns the newly-expanded symbol table in which the symbol is
- defined, or NULL if no such symbol table exists. */
+ defined, or NULL if no such symbol table exists. If OBJFILE
+ contains !TYPE_OPAQUE symbol prefer its symtab. If it contains
+ only TYPE_OPAQUE symbol(s), return at least that symtab. */
struct symtab *(*lookup_symbol) (struct objfile *objfile,
int kind, const char *name,
domain_enum domain);
- /* This is called to expand symbol tables before looking up a
- symbol. A backend can choose to implement this and then have its
- `lookup_symbol' hook always return NULL, or the reverse. (It
- doesn't make sense to implement both.) The arguments are as for
- `lookup_symbol'. */
- void (*pre_expand_symtabs_matching) (struct objfile *objfile,
- enum block_enum block_kind,
- const char *name,
- domain_enum domain);
-
/* Print statistics about any indices loaded for OBJFILE. The
statistics should be printed to gdb_stdout. This is used for
"maint print statistics". */
/* This is called by objfile_relocate to relocate any indices loaded
for OBJFILE. */
void (*relocate) (struct objfile *objfile,
- struct section_offsets *new_offsets,
- struct section_offsets *delta);
+ const struct section_offsets *new_offsets,
+ const struct section_offsets *delta);
/* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
the corresponding symbol tables are loaded. */
/* Read all symbol tables associated with OBJFILE. */
void (*expand_all_symtabs) (struct objfile *objfile);
- /* Read all symbol tables associated with OBJFILE which have the
- file name FILENAME.
+ /* Read all symbol tables associated with OBJFILE which have
+ symtab_to_fullname equal to FULLNAME.
This is for the purposes of examining code only, e.g., expand_line_sal.
The routine may ignore debug info that is known to not be useful with
code, e.g., DW_TAG_type_unit for dwarf debug info. */
- void (*expand_symtabs_with_filename) (struct objfile *objfile,
- const char *filename);
-
- /* Return the file name of the file holding the global symbol in OBJFILE
- named NAME. If no such symbol exists in OBJFILE, return NULL. */
- const char *(*find_symbol_file) (struct objfile *objfile, const char *name);
+ void (*expand_symtabs_with_fullname) (struct objfile *objfile,
+ const char *fullname);
/* Find global or static symbols in all tables that are in NAMESPACE
and for which MATCH (symbol name, NAME) == 0, passing each to
CALLBACK returns 0 to indicate that the scan should continue, or
non-zero to indicate that the scan should be terminated. */
- void (*map_matching_symbols) (const char *name, domain_enum namespace,
- struct objfile *, int global,
+ void (*map_matching_symbols) (struct objfile *,
+ const char *name, domain_enum namespace,
+ int global,
int (*callback) (struct block *,
struct symbol *, void *),
void *data,
FILE_MATCHER is called for each file in OBJFILE. The file name
and the DATA argument are passed to it. If it returns zero, this
file is skipped. If FILE_MATCHER is NULL such file is not skipped.
+ If BASENAMES is non-zero the function should consider only base name of
+ DATA (passed file name is already only the lbasename part).
Otherwise, if KIND does not match this symbol is skipped.
-
- If even KIND matches, then NAME_MATCHER is called for each symbol defined
- in the file. The symbol's "natural" name and DATA are passed to
- NAME_MATCHER.
+
+ If even KIND matches, then NAME_MATCHER is called for each symbol
+ defined in the file. The symbol "search" name and DATA are passed
+ to NAME_MATCHER.
If NAME_MATCHER returns zero, then this symbol is skipped.
DATA is user data that is passed unmodified to the callback
functions. */
- void (*expand_symtabs_matching) (struct objfile *objfile,
- int (*file_matcher) (const char *, void *),
- int (*name_matcher) (const char *, void *),
- enum search_domain kind,
- void *data);
+ void (*expand_symtabs_matching)
+ (struct objfile *objfile,
+ int (*file_matcher) (const char *, void *, int basenames),
+ int (*name_matcher) (const char *, void *),
+ enum search_domain kind,
+ void *data);
/* Return the symbol table from OBJFILE that contains PC and
SECTION. Return NULL if there is no such symbol table. This
int need_fullname);
};
-/* Structure to keep track of symbol reading functions for various
- object file types. */
+/* Structure of functions used for probe support. If one of these functions
+ is provided, all must be. */
-struct sym_fns
+struct sym_probe_fns
{
+ /* If non-NULL, return an array of probe objects.
- /* BFD flavour that we handle, or (as a special kludge, see
- xcoffread.c, (enum bfd_flavour)-1 for xcoff). */
+ The returned value does not have to be freed and it has lifetime of the
+ OBJFILE. */
+ VEC (probe_p) *(*sym_get_probes) (struct objfile *);
+
+ /* Return the number of arguments available to PROBE. PROBE will
+ have come from a call to this objfile's sym_get_probes method.
+ If you provide an implementation of sym_get_probes, you must
+ implement this method as well. */
+ unsigned (*sym_get_probe_argument_count) (struct probe *probe);
+
+ /* Return 1 if the probe interface can evaluate the arguments of probe
+ PROBE, zero otherwise. This function can be probe-specific, informing
+ whether only the arguments of PROBE can be evaluated, of generic,
+ informing whether the probe interface is able to evaluate any kind of
+ argument. If you provide an implementation of sym_get_probes, you must
+ implement this method as well. */
+ int (*can_evaluate_probe_arguments) (struct probe *probe);
+
+ /* Evaluate the Nth argument available to PROBE. PROBE will have
+ come from a call to this objfile's sym_get_probes method. N will
+ be between 0 and the number of arguments available to this probe.
+ FRAME is the frame in which the evaluation is done; the frame's
+ PC will match the address of the probe. If you provide an
+ implementation of sym_get_probes, you must implement this method
+ as well. */
+ struct value *(*sym_evaluate_probe_argument) (struct probe *probe,
+ unsigned n);
+
+ /* Compile the Nth probe argument to an agent expression. PROBE
+ will have come from a call to this objfile's sym_get_probes
+ method. N will be between 0 and the number of arguments
+ available to this probe. EXPR and VALUE are the agent expression
+ that is being updated. */
+ void (*sym_compile_to_ax) (struct probe *probe,
+ struct agent_expr *expr,
+ struct axs_value *value,
+ unsigned n);
+
+ /* Relocate the probe section of OBJFILE. */
+ void (*sym_relocate_probe) (struct objfile *objfile,
+ const struct section_offsets *new_offsets,
+ const struct section_offsets *delta);
+};
- enum bfd_flavour sym_flavour;
+/* Structure to keep track of symbol reading functions for various
+ object file types. */
+struct sym_fns
+{
/* Initializes anything that is global to the entire symbol table.
It is called during symbol_file_add, when we begin debugging an
entirely new program. */
probably be changed to a string, where NULL means the default,
and others are parsed in a file dependent way. */
- void (*sym_offsets) (struct objfile *, struct section_addr_info *);
+ void (*sym_offsets) (struct objfile *, const struct section_addr_info *);
/* This function produces a format-independent description of
the segments of ABFD. Each segment is a unit of the file
the line table cannot be read while processing the debugging
information. */
- void (*sym_read_linetable) (void);
+ void (*sym_read_linetable) (struct objfile *);
/* Relocate the contents of a debug section SECTP. The
contents are stored in BUF if it is non-NULL, or returned in a
bfd_byte *(*sym_relocate) (struct objfile *, asection *sectp, bfd_byte *buf);
+ /* If non-NULL, this objfile has probe support, and all the probe
+ functions referred to here will be non-NULL. */
+ const struct sym_probe_fns *sym_probe_fns;
+
/* The "quick" (aka partial) symbol functions for this symbol
reader. */
const struct quick_symbol_functions *qf;
extern void relative_addr_info_to_section_offsets
(struct section_offsets *section_offsets, int num_sections,
- struct section_addr_info *addrs);
+ const struct section_addr_info *addrs);
extern void addr_info_make_relative (struct section_addr_info *addrs,
bfd *abfd);
do anything special. */
extern void default_symfile_offsets (struct objfile *objfile,
- struct section_addr_info *);
+ const struct section_addr_info *);
/* The default version of sym_fns.sym_segments for readers that don't
do anything special. */
extern bfd_byte *default_symfile_relocate (struct objfile *objfile,
asection *sectp, bfd_byte *buf);
-extern struct symtab *allocate_symtab (const char *, struct objfile *);
+extern struct symtab *allocate_symtab (const char *, struct objfile *)
+ ATTRIBUTE_NONNULL (1);
-extern void add_symtab_fns (const struct sym_fns *);
+extern void add_symtab_fns (enum bfd_flavour flavour, const struct sym_fns *);
/* This enum encodes bit-flags passed as ADD_FLAGS parameter to
- syms_from_objfile, symbol_file_add, etc. */
+ symbol_file_add, etc. */
enum symfile_add_flags
{
SYMFILE_NO_READ = 1 << 4
};
-extern void syms_from_objfile (struct objfile *,
- struct section_addr_info *,
- struct section_offsets *, int, int);
-
extern void new_symfile_objfile (struct objfile *, int);
-extern struct objfile *symbol_file_add (char *, int,
+extern struct objfile *symbol_file_add (const char *, int,
struct section_addr_info *, int);
-extern struct objfile *symbol_file_add_from_bfd (bfd *, int,
+extern struct objfile *symbol_file_add_from_bfd (bfd *, const char *, int,
struct section_addr_info *,
int, struct objfile *parent);
-extern void symbol_file_add_separate (bfd *, int, struct objfile *);
+extern void symbol_file_add_separate (bfd *, const char *, int,
+ struct objfile *);
extern char *find_separate_debug_file_by_debuglink (struct objfile *);
extern void free_section_addr_info (struct section_addr_info *);
-/* Make a copy of the string at PTR with SIZE characters in the symbol
- obstack (and add a null character at the end in the copy). Returns
- the address of the copy. */
-
-extern char *obsavestring (const char *, int, struct obstack *);
-
-/* Concatenate NULL terminated variable argument list of `const char
- *' strings; return the new string. Space is found in the OBSTACKP.
- Argument list must be terminated by a sentinel expression `(char *)
- NULL'. */
-
-extern char *obconcat (struct obstack *obstackp, ...) ATTRIBUTE_SENTINEL;
-
/* Variables */
/* If non-zero, shared library symbols will be added automatically
extern void find_lowest_section (bfd *, asection *, void *);
-extern bfd *symfile_bfd_open (char *);
+extern bfd *symfile_bfd_open (const char *);
-extern bfd *bfd_open_maybe_remote (const char *);
+extern bfd *gdb_bfd_open_maybe_remote (const char *);
extern int get_section_index (struct objfile *, char *);
extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, struct obj_section *);
/* Load symbols from a file. */
-extern void symbol_file_add_main (char *args, int from_tty);
+extern void symbol_file_add_main (const char *args, int from_tty);
/* Clear GDB symbol tables. */
extern void symbol_file_clear (int from_tty);
bfd_byte *);
extern int symfile_map_offsets_to_segments (bfd *,
- struct symfile_segment_data *,
+ const struct symfile_segment_data *,
struct section_offsets *,
int, const CORE_ADDR *);
struct symfile_segment_data *get_symfile_segment_data (bfd *abfd);
struct dwarf2_section_names str;
struct dwarf2_section_names ranges;
struct dwarf2_section_names types;
+ struct dwarf2_section_names addr;
struct dwarf2_section_names frame;
struct dwarf2_section_names eh_frame;
struct dwarf2_section_names gdb_index;
extern void dwarf2_get_section_info (struct objfile *,
enum dwarf2_section_enum,
- asection **, gdb_byte **,
+ asection **, const gdb_byte **,
bfd_size_type *);
extern int dwarf2_initialize_objfile (struct objfile *);
/* From mdebugread.c */
-/* Hack to force structures to exist before use in parameter list. */
-struct ecoff_debug_hack
-{
- struct ecoff_debug_swap *a;
- struct ecoff_debug_info *b;
-};
-
extern void mdebug_build_psymtabs (struct objfile *,
const struct ecoff_debug_swap *,
struct ecoff_debug_info *);
const struct ecoff_debug_swap *,
asection *);
+/* From minidebug.c. */
+
+extern bfd *find_separate_debug_file_in_section (struct objfile *);
+
#endif /* !defined(SYMFILE_H) */