2010-02-10 Sterling Augustine <sterling@tensilica.com>
[deliverable/binutils-gdb.git] / gdb / symfile.h
index baf61bef0c113bfd1b90c48ce5e077dfa5d8edd5..302c29f60287c0e38104f63d8f0fb7c26c1ff292 100644 (file)
@@ -1,13 +1,14 @@
 /* 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 Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010
+   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 2 of the License, or
+   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,
@@ -16,9 +17,7 @@
    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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #if !defined (SYMFILE_H)
 #define SYMFILE_H
@@ -27,8 +26,9 @@
 #include "symtab.h"
 
 /* Opaque declarations.  */
-struct section_table;
+struct target_section;
 struct objfile;
+struct obj_section;
 struct obstack;
 struct block;
 
@@ -84,6 +84,31 @@ struct section_addr_info
   } other[1];
 };
 
+
+/* A table listing the load segments in a symfile, and which segment
+   each BFD section belongs to.  */
+struct symfile_segment_data
+{
+  /* How many segments are present in this file.  If there are
+     two, the text segment is the first one and the data segment
+     is the second one.  */
+  int num_segments;
+
+  /* If NUM_SEGMENTS is greater than zero, the original base address
+     of each segment.  */
+  CORE_ADDR *segment_bases;
+
+  /* If NUM_SEGMENTS is greater than zero, the memory size of each
+     segment.  */
+  CORE_ADDR *segment_sizes;
+
+  /* If NUM_SEGMENTS is greater than zero, this is an array of entries
+     recording which segment contains each BFD section.
+     SEGMENT_INFO[I] is S+1 if the I'th BFD section belongs to segment
+     S, or zero if it is not in any segment.  */
+  int *segment_info;
+};
+
 /* Structure to keep track of symbol reading functions for various
    object file types.  */
 
@@ -107,11 +132,10 @@ struct sym_fns
 
   void (*sym_init) (struct objfile *);
 
-  /* sym_read (objfile, mainline) Reads a symbol file into a psymtab
+  /* sym_read (objfile, symfile_flags) Reads a symbol file into a psymtab
      (or possibly a symtab).  OBJFILE is the objfile struct for the
-     file we are reading.  MAINLINE is 1 if this is the main symbol
-     table being read, and 0 if a secondary symbol file (e.g. shared
-     library or dynamically loaded file) is being read.  */
+     file we are reading.  SYMFILE_FLAGS are the flags passed to
+     symbol_file_add & co.  */
 
   void (*sym_read) (struct objfile *, int);
 
@@ -130,6 +154,24 @@ struct sym_fns
 
   void (*sym_offsets) (struct objfile *, struct section_addr_info *);
 
+  /* This function produces a format-independent description of
+     the segments of ABFD.  Each segment is a unit of the file
+     which may be relocated independently.  */
+
+  struct symfile_segment_data *(*sym_segments) (bfd *abfd);
+
+  /* This function should read the linetable from the objfile when
+     the line table cannot be read while processing the debugging
+     information.  */
+
+  void (*sym_read_linetable) (void);
+
+  /* Relocate the contents of a debug section SECTP.  The
+     contents are stored in BUF if it is non-NULL, or returned in a
+     malloc'd buffer otherwise.  */
+
+  bfd_byte *(*sym_relocate) (struct objfile *, asection *sectp, bfd_byte *buf);
+
   /* Finds the next struct sym_fns.  They are allocated and
      initialized in whatever module implements the functions pointed
      to; an initializer calls add_symtab_fns to add them to the global
@@ -139,12 +181,32 @@ struct sym_fns
 
 };
 
+extern struct section_addr_info *
+          build_section_addr_info_from_objfile (const struct objfile *objfile);
+
+extern void relative_addr_info_to_section_offsets
+  (struct section_offsets *section_offsets, int num_sections,
+   struct section_addr_info *addrs);
+
+extern void addr_info_make_relative (struct section_addr_info *addrs,
+                                    bfd *abfd);
+
 /* The default version of sym_fns.sym_offsets for readers that don't
    do anything special.  */
 
 extern void default_symfile_offsets (struct objfile *objfile,
                                     struct section_addr_info *);
 
+/* The default version of sym_fns.sym_segments for readers that don't
+   do anything special.  */
+
+extern struct symfile_segment_data *default_symfile_segments (bfd *abfd);
+
+/* The default version of sym_fns.sym_relocate for readers that don't
+   do anything special.  */
+
+extern bfd_byte *default_symfile_relocate (struct objfile *objfile,
+                                           asection *sectp, bfd_byte *buf);
 
 extern void extend_psymbol_list (struct psymbol_allocation_list *,
                                 struct objfile *);
@@ -154,63 +216,65 @@ extern void extend_psymbol_list (struct psymbol_allocation_list *,
 /* #include "demangle.h" */
 
 extern const
-struct partial_symbol *add_psymbol_to_list (char *, int, domain_enum,
+struct partial_symbol *add_psymbol_to_list (char *, int, int, domain_enum,
                                            enum address_class,
                                            struct psymbol_allocation_list *,
                                            long, CORE_ADDR,
                                            enum language, struct objfile *);
 
-extern void add_psymbol_with_dem_name_to_list (char *, int, char *, int,
-                                              domain_enum,
-                                              enum address_class,
-                                              struct psymbol_allocation_list
-                                              *, long, CORE_ADDR,
-                                              enum language,
-                                              struct objfile *);
-
-
 extern void init_psymbol_list (struct objfile *, int);
 
 extern void sort_pst_symbols (struct partial_symtab *);
 
 extern struct symtab *allocate_symtab (char *, struct objfile *);
 
-extern int free_named_symtabs (char *);
+extern void add_symtab_fns (struct sym_fns *);
+
+/* This enum encodes bit-flags passed as ADD_FLAGS parameter to
+   syms_from_objfile, symbol_file_add, etc.  */
+
+enum symfile_add_flags
+  {
+    /* Be chatty about what you are doing.  */
+    SYMFILE_VERBOSE = 1 << 1,
 
-extern void fill_in_vptr_fieldno (struct type *);
+    /* This is the main symbol file (as opposed to symbol file for dynamically
+       loaded code).  */
+    SYMFILE_MAINLINE = 1 << 2,
 
-extern void add_symtab_fns (struct sym_fns *);
+    /* Do not call breakpoint_re_set when adding this symbol file.  */
+    SYMFILE_DEFER_BP_RESET = 1 << 3
+  };
 
 extern void syms_from_objfile (struct objfile *,
                               struct section_addr_info *,
-                              struct section_offsets *, int, int, int);
+                              struct section_offsets *, int, int);
 
-extern void new_symfile_objfile (struct objfile *, int, int);
+extern void new_symfile_objfile (struct objfile *, int);
 
 extern struct objfile *symbol_file_add (char *, int,
-                                       struct section_addr_info *, int, int);
+                                       struct section_addr_info *, int);
 
 extern struct objfile *symbol_file_add_from_bfd (bfd *, int,
                                                  struct section_addr_info *,
-                                                 int, int);
+                                                 int);
+
+extern void symbol_file_add_separate (bfd *, int, struct objfile *);
+
+extern char *find_separate_debug_file_by_debuglink (struct objfile *);
 
 /* Create a new section_addr_info, with room for NUM_SECTIONS.  */
 
 extern struct section_addr_info *alloc_section_addr_info (size_t
                                                          num_sections);
 
-/* Return a freshly allocated copy of ADDRS.  The section names, if
-   any, are also freshly allocated copies of those in ADDRS.  */
-extern struct section_addr_info *(copy_section_addr_info 
-                                  (struct section_addr_info *addrs));
-
 /* Build (allocate and populate) a section_addr_info struct from an
    existing section table.  */
 
 extern struct section_addr_info
-  *build_section_addr_info_from_section_table (const struct section_table
+  *build_section_addr_info_from_section_table (const struct target_section
                                               *start,
-                                              const struct section_table
+                                              const struct target_section
                                               *end);
 
 /* Free all memory allocated by
@@ -221,7 +285,7 @@ extern void free_section_addr_info (struct section_addr_info *);
 
 extern struct partial_symtab *start_psymtab_common (struct objfile *,
                                                    struct section_offsets *,
-                                                   char *, CORE_ADDR,
+                                                   const char *, CORE_ADDR,
                                                    struct partial_symbol **,
                                                    struct partial_symbol **);
 
@@ -262,7 +326,10 @@ extern int auto_solib_limit;
 
 /* From symfile.c */
 
-extern struct partial_symtab *allocate_psymtab (char *, struct objfile *);
+extern void set_initial_language (void);
+
+extern struct partial_symtab *allocate_psymtab (const char *,
+                                               struct objfile *);
 
 extern void discard_psymtab (struct partial_symtab *);
 
@@ -270,6 +337,8 @@ extern void find_lowest_section (bfd *, asection *, void *);
 
 extern bfd *symfile_bfd_open (char *);
 
+extern bfd *bfd_open_maybe_remote (const char *);
+
 extern int get_section_index (struct objfile *, char *);
 
 /* Utility functions for overlay sections: */
@@ -282,32 +351,32 @@ extern enum overlay_debugging_state
 extern int overlay_cache_invalid;
 
 /* Return the "mapped" overlay section containing the PC.  */
-extern asection *find_pc_mapped_section (CORE_ADDR);
+extern struct obj_section *find_pc_mapped_section (CORE_ADDR);
 
 /* Return any overlay section containing the PC (even in its LMA
    region).  */
-extern asection *find_pc_overlay (CORE_ADDR);
+extern struct obj_section *find_pc_overlay (CORE_ADDR);
 
 /* Return true if the section is an overlay.  */
-extern int section_is_overlay (asection *);
+extern int section_is_overlay (struct obj_section *);
 
 /* Return true if the overlay section is currently "mapped".  */
-extern int section_is_mapped (asection *);
+extern int section_is_mapped (struct obj_section *);
 
 /* Return true if pc belongs to section's VMA.  */
-extern CORE_ADDR pc_in_mapped_range (CORE_ADDR, asection *);
+extern CORE_ADDR pc_in_mapped_range (CORE_ADDR, struct obj_section *);
 
 /* Return true if pc belongs to section's LMA.  */
-extern CORE_ADDR pc_in_unmapped_range (CORE_ADDR, asection *);
+extern CORE_ADDR pc_in_unmapped_range (CORE_ADDR, struct obj_section *);
 
 /* Map an address from a section's LMA to its VMA.  */
-extern CORE_ADDR overlay_mapped_address (CORE_ADDR, asection *);
+extern CORE_ADDR overlay_mapped_address (CORE_ADDR, struct obj_section *);
 
 /* Map an address from a section's VMA to its LMA.  */
-extern CORE_ADDR overlay_unmapped_address (CORE_ADDR, asection *);
+extern CORE_ADDR overlay_unmapped_address (CORE_ADDR, struct obj_section *);
 
 /* Convert an address in an overlay section (force into VMA range).  */
-extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *);
+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);
@@ -315,16 +384,28 @@ extern void symbol_file_add_main (char *args, int from_tty);
 /* Clear GDB symbol tables.  */
 extern void symbol_file_clear (int from_tty);
 
-extern bfd_byte *symfile_relocate_debug_section (bfd *abfd, asection *sectp,
-                                                bfd_byte * buf);
+/* Default overlay update function.  */
+extern void simple_overlay_update (struct obj_section *);
+
+extern bfd_byte *symfile_relocate_debug_section (struct objfile *, asection *,
+                                                bfd_byte *);
+
+extern int symfile_map_offsets_to_segments (bfd *,
+                                           struct symfile_segment_data *,
+                                           struct section_offsets *,
+                                           int, const CORE_ADDR *);
+struct symfile_segment_data *get_symfile_segment_data (bfd *abfd);
+void free_symfile_segment_data (struct symfile_segment_data *data);
 
 /* From dwarf2read.c */
 
 extern int dwarf2_has_info (struct objfile *);
 
-extern void dwarf2_build_psymtabs (struct objfile *, int);
+extern void dwarf2_build_psymtabs (struct objfile *);
 extern void dwarf2_build_frame_info (struct objfile *);
 
+void dwarf2_free_objfile (struct objfile *);
+
 /* From mdebugread.c */
 
 /* Hack to force structures to exist before use in parameter list.  */
This page took 0.037435 seconds and 4 git commands to generate.