* stabs.texinfo: N_MAIN is sometimes used for C.
[deliverable/binutils-gdb.git] / gdb / objfiles.h
index 8efaa93e11d4dae6b8e0332523837a97a298ca43..39129995fbcca78a3890664bcee12ead750b09eb 100644 (file)
@@ -114,6 +114,41 @@ struct entry_info
 };
 
 
+/* Sections in an objfile.
+
+   It is strange that we have both this notion of "sections"
+   and the one used by section_offsets.  Section as used
+   here, (currently at least) means a BFD section, and the sections
+   are set up from the BFD sections in allocate_objfile.
+
+   The sections in section_offsets have their meaning determined by
+   the symbol format, and they are set up by the sym_offsets function
+   for that symbol file format.
+
+   I'm not sure this could or should be changed, however.  */
+
+struct obj_section {
+  CORE_ADDR    addr;    /* lowest address in section */
+  CORE_ADDR    endaddr; /* 1+highest address in section */
+
+  /* This field is being used for nefarious purposes by syms_from_objfile.
+     It is said to be redundant with section_offsets; it's not really being
+     used that way, however, it's some sort of hack I don't understand
+     and am not going to try to eliminate (yet, anyway).  FIXME.
+
+     It was documented as "offset between (end)addr and actual memory
+     addresses", but that's not true; addr & endaddr are actual memory
+     addresses.  */
+  CORE_ADDR offset;
+     
+  sec_ptr      sec_ptr; /* BFD section pointer */
+
+  /* Objfile this section is part of.  Not currently used, but I'm sure
+     that someone will want the bfd that the sec_ptr goes with or something
+     like that before long.  */
+  struct objfile *objfile;
+};
+
 /* Master structure for keeping track of each input file from which
    gdb reads symbols.  One of these is allocated for each such file we
    access, e.g. the exec_file, symbol_file, and any shared library object
@@ -124,7 +159,18 @@ struct objfile
 
   /* All struct objfile's are chained together by their next pointers.
      The global variable "object_files" points to the first link in this
-     chain. */
+     chain.
+
+     FIXME:  There is a problem here if the objfile is reusable, and if
+     multiple users are to be supported.  The problem is that the objfile
+     list is linked through a member of the objfile struct itself, which
+     is only valid for one gdb process.  The list implementation needs to
+     be changed to something like:
+
+     struct list {struct list *next; struct objfile *objfile};
+
+     where the list structure is completely maintained separately within
+     each gdb process. */
 
   struct objfile *next;
 
@@ -205,6 +251,12 @@ struct objfile
 
   PTR md;
 
+  /* The file descriptor that was used to obtain the mmalloc descriptor
+     for this objfile.  If we call mmalloc_detach with the malloc descriptor
+     we should then close this file descriptor. */
+
+  int mmfd;
+
   /* Structure which keeps track of functions that manipulate objfile's
      of the same type as this objfile.  I.E. the function to read partial
      symbols for example.  Note that this structure is in statically
@@ -223,6 +275,31 @@ struct objfile
 
   PTR sym_private;
 
+  /* Hook for other info specific to this objfile.  This must point to
+     memory allocated on one of the obstacks in this objfile, so that it
+     gets freed automatically when reading a new object file. */
+
+  PTR obj_private;
+
+  /* Set of relocation offsets to apply to each section.
+     Currently on the psymbol_obstack (which makes no sense, but I'm
+     not sure it's harming anything).
+
+     These offsets indicate that all symbols (including partial and
+     minimal symbols) which have been read have been relocated by this
+     much.  Symbols which are yet to be read need to be relocated by
+     it.  */
+
+  struct section_offsets *section_offsets;
+  int num_sections;
+
+  /* set of section begin and end addresses used to map pc addresses
+     into sections.  Currently on the psymbol_obstack (which makes no
+     sense, but I'm not sure it's harming anything).  */
+
+  struct obj_section
+    *sections,
+    *sections_end;
 };
 
 /* Defines for the objfile flag word. */
@@ -236,6 +313,15 @@ struct objfile
 
 #define OBJF_MAPPED    (1 << 0)        /* Objfile data is mmap'd */
 
+/* When using mapped/remapped predigested gdb symbol information, we need
+   a flag that indicates that we have previously done an initial symbol
+   table read from this particular objfile.  We can't just look for the
+   absence of any of the three symbol tables (msymbols, psymtab, symtab)
+   because if the file has no symbols for example, none of these will
+   exist. */
+
+#define OBJF_SYMS      (1 << 1)        /* Have tried to read symbols */
+
 /* The object file that the main symbol table was loaded from (e.g. the
    argument to the "symbol-file" or "file" command).  */
 
@@ -266,12 +352,18 @@ extern struct objfile *object_files;
 extern struct objfile *
 allocate_objfile PARAMS ((bfd *, int));
 
+extern void
+unlink_objfile PARAMS ((struct objfile *));
+
 extern void
 free_objfile PARAMS ((struct objfile *));
 
 extern void
 free_all_objfiles PARAMS ((void));
 
+extern void
+objfile_relocate PARAMS ((struct objfile *, struct section_offsets *));
+
 extern int
 have_partial_symbols PARAMS ((void));
 
@@ -284,30 +376,54 @@ have_full_symbols PARAMS ((void));
 extern int
 have_minimal_symbols PARAMS ((void));
 
-extern PTR
-iterate_over_objfiles PARAMS ((PTR (*func) (struct objfile *,
-                                           PTR arg1, PTR arg2, PTR arg3),
-                              PTR arg1, PTR arg2, PTR arg3));
-
-extern PTR
-iterate_over_symtabs PARAMS ((PTR (*func) (struct objfile *, struct symtab *,
-                                          PTR arg1, PTR arg2, PTR arg3),
-                             PTR arg1, PTR arg2, PTR arg3));
-
-extern PTR 
-iterate_over_psymtabs PARAMS ((PTR (*func) (struct objfile *,
-                                           struct partial_symtab *,
-                                           PTR arg1, PTR arg2, PTR arg3),
-                              PTR arg1, PTR arg2, PTR arg3));
-
+extern struct obj_section *
+find_pc_section PARAMS((CORE_ADDR pc));
 
 /* Traverse all object files.  ALL_OBJFILES_SAFE works even if you delete
    the objfile during the traversal.  */
 
 #define        ALL_OBJFILES(obj) \
-  for ((obj)=object_files; (obj)!=NULL; (obj)=(obj)->next)
+  for ((obj) = object_files; (obj) != NULL; (obj) = (obj)->next)
 
 #define        ALL_OBJFILES_SAFE(obj,nxt) \
-  for ((obj)=object_files; (obj)!=NULL?((nxt)=(obj)->next,1):0; (obj)=(nxt))
+  for ((obj) = object_files;      \
+       (obj) != NULL? ((nxt)=(obj)->next,1) :0;        \
+       (obj) = (nxt))
+
+
+/* Traverse all symtabs in one objfile.  */
+
+#define        ALL_OBJFILE_SYMTABS(objfile, s) \
+    for ((s) = (objfile) -> symtabs; (s) != NULL; (s) = (s) -> next)
+
+/* Traverse all psymtabs in one objfile.  */
+
+#define        ALL_OBJFILE_PSYMTABS(objfile, p) \
+    for ((p) = (objfile) -> psymtabs; (p) != NULL; (p) = (p) -> next)
+
+/* Traverse all minimal symbols in one objfile.  */
+
+#define        ALL_OBJFILE_MSYMBOLS(objfile, m) \
+    for ((m) = (objfile) -> msymbols; SYMBOL_NAME(m) != NULL; (m)++)
+
+
+/* Traverse all symtabs in all objfiles.  */
+
+#define        ALL_SYMTABS(objfile, s) \
+  ALL_OBJFILES (objfile)        \
+    ALL_OBJFILE_SYMTABS (objfile, s)
+
+/* Traverse all psymtabs in all objfiles.  */
+
+#define        ALL_PSYMTABS(objfile, p) \
+  ALL_OBJFILES (objfile)        \
+    ALL_OBJFILE_PSYMTABS (objfile, p)
+
+/* Traverse all minimal symbols in all objfiles.  */
+
+#define        ALL_MSYMBOLS(objfile, m) \
+  ALL_OBJFILES (objfile)        \
+    if ((objfile)->msymbols)    \
+      ALL_OBJFILE_MSYMBOLS (objfile, m)
 
 #endif /* !defined (OBJFILES_H) */
This page took 0.024731 seconds and 4 git commands to generate.