* h8-cfg.texi, all-cfg.texi: new flag GDBSERVER
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index 5e22be95c97a04ccdfd3a31a56eab486e46e5a33..060409d703335beecbfebebca9447946ae43d588 100644 (file)
@@ -60,6 +60,53 @@ struct objfile *symfile_objfile;     /* Main symbol table loaded from */
 
 int mapped_symbol_files;               /* Try to use mapped symbol files */
 
+/* Locate all mappable sections of a BFD file. 
+   objfile_p_char is a char * to get it through
+   bfd_map_over_sections; we cast it back to its proper type.  */
+
+static void
+add_to_objfile_sections (abfd, asect, objfile_p_char)
+     bfd *abfd;
+     sec_ptr asect;
+     PTR objfile_p_char;
+{
+  struct objfile *objfile = (struct objfile *) objfile_p_char;
+  struct obj_section section;
+  flagword aflag;
+
+  aflag = bfd_get_section_flags (abfd, asect);
+  /* FIXME, we need to handle BSS segment here...it alloc's but doesn't load */
+  if (!(aflag & SEC_LOAD))
+    return;
+  if (0 == bfd_section_size (abfd, asect))
+    return;
+  section.offset = 0;
+  section.objfile = objfile;
+  section.sec_ptr = asect;
+  section.addr = bfd_section_vma (abfd, asect);
+  section.endaddr = section.addr + bfd_section_size (abfd, asect);
+  obstack_grow (&objfile->psymbol_obstack, &section, sizeof(section));
+  objfile->sections_end = (struct obj_section *) (((int) objfile->sections_end) + 1);
+}
+
+/* Builds a section table for OBJFILE.
+   Returns 0 if OK, 1 on error.  */
+
+static int
+build_objfile_section_table (objfile)
+     struct objfile *objfile;
+{
+  if (objfile->sections)
+    abort();
+
+  objfile->sections_end = 0;
+  bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *)objfile);
+  objfile->sections = (struct obj_section *)
+    obstack_finish (&objfile->psymbol_obstack);
+  objfile->sections_end = objfile->sections + (int) objfile->sections_end;
+  return(0);
+}
+
 /* Given a pointer to an initialized bfd (ABFD) and a flag that indicates
    whether or not an objfile is to be mapped (MAPPED), allocate a new objfile
    struct, fill it in as best we can, link it into the list of all known
@@ -126,15 +173,15 @@ allocate_objfile (abfd, mapped)
          objfile -> mmfd = fd;
          objfile -> flags |= OBJF_MAPPED;
          mmalloc_setkey (objfile -> md, 0, objfile);
-         obstack_alloc_arg (&objfile -> psymbol_obstack, objfile -> md);
-         obstack_full_begin (&objfile -> psymbol_obstack, 0, 0, xmmalloc,
-                             mfree);
-         obstack_alloc_arg (&objfile -> symbol_obstack, objfile -> md);
-         obstack_full_begin (&objfile -> symbol_obstack, 0, 0, xmmalloc,
-                             mfree);
-         obstack_alloc_arg (&objfile -> type_obstack, objfile -> md);
-         obstack_full_begin (&objfile -> type_obstack, 0, 0, xmmalloc,
-                             mfree);
+         obstack_specify_allocation_with_arg (&objfile -> psymbol_obstack,
+                                              0, 0, xmmalloc, mfree,
+                                              objfile -> md);
+         obstack_specify_allocation_with_arg (&objfile -> symbol_obstack,
+                                              0, 0, xmmalloc, mfree,
+                                              objfile -> md);
+         obstack_specify_allocation_with_arg (&objfile -> type_obstack,
+                                              0, 0, xmmalloc, mfree,
+                                              objfile -> md);
        }
     }
 
@@ -168,9 +215,12 @@ allocate_objfile (abfd, mapped)
       objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
       memset (objfile, 0, sizeof (struct objfile));
       objfile -> md = NULL;
-      obstack_full_begin (&objfile -> psymbol_obstack, 0, 0, xmalloc, free);
-      obstack_full_begin (&objfile -> symbol_obstack, 0, 0, xmalloc, free);
-      obstack_full_begin (&objfile -> type_obstack, 0, 0, xmalloc, free);
+      obstack_specify_allocation (&objfile -> psymbol_obstack, 0, 0, xmalloc,
+                                 free);
+      obstack_specify_allocation (&objfile -> symbol_obstack, 0, 0, xmalloc,
+                                 free);
+      obstack_specify_allocation (&objfile -> type_obstack, 0, 0, xmalloc,
+                                 free);
     }
 
   /* Update the per-objfile information that comes from the bfd, ensuring
@@ -185,6 +235,14 @@ allocate_objfile (abfd, mapped)
   objfile -> name = mstrsave (objfile -> md, bfd_get_filename (abfd));
   objfile -> mtime = bfd_get_mtime (abfd);
 
+  /* Build section table.  */
+
+  if (build_objfile_section_table (objfile))
+    {
+      error ("Can't find the file sections in `%s': %s", 
+            objfile -> name, bfd_errmsg (bfd_error));
+    }
+
   /* Push this file onto the head of the linked list of other such files. */
 
   objfile -> next = object_files;
@@ -278,7 +336,6 @@ free_objfile (objfile)
      is unknown, but we play it safe for now and keep each action until
      it is shown to be no longer needed. */
      
-  clear_symtab_users_once ();
 #if defined (CLEAR_SOLIB)
   CLEAR_SOLIB ();
 #endif
@@ -326,7 +383,7 @@ free_objfile (objfile)
 }
 
 
-/* Free all the object files at once.  */
+/* Free all the object files at once and clean up their users.  */
 
 void
 free_all_objfiles ()
@@ -337,8 +394,98 @@ free_all_objfiles ()
     {
       free_objfile (objfile);
     }
+  clear_symtab_users ();
 }
-
+\f
+/* Relocate OBJFILE to NEW_OFFSETS.  There should be OBJFILE->NUM_SECTIONS
+   entries in new_offsets.  */
+void
+objfile_relocate (objfile, new_offsets)
+     struct objfile *objfile;
+     struct section_offsets *new_offsets;
+{
+  struct section_offsets *delta = (struct section_offsets *) alloca
+    (sizeof (struct section_offsets)
+     + objfile->num_sections * sizeof (delta->offsets));
+
+  {
+    int i;
+    int something_changed = 0;
+    for (i = 0; i < objfile->num_sections; ++i)
+      {
+       ANOFFSET (delta, i) =
+         ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i);
+       if (ANOFFSET (delta, i) != 0)
+         something_changed = 1;
+      }
+    if (!something_changed)
+      return;
+  }
+
+  /* OK, get all the symtabs.  */
+  {
+    struct symtab *s;
+
+    for (s = objfile->symtabs; s; s = s->next)
+      {
+       struct linetable *l;
+       struct blockvector *bv;
+       int i;
+       
+       /* First the line table.  */
+       l = LINETABLE (s);
+       if (l)
+         {
+           for (i = 0; i < l->nitems; ++i)
+             l->item[i].pc += ANOFFSET (delta, s->block_line_section);
+         }
+
+       /* Don't relocate a shared blockvector more than once.  */
+       if (!s->primary)
+         continue;
+
+       bv = BLOCKVECTOR (s);
+       for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
+         {
+           struct block *b;
+           int j;
+           
+           b = BLOCKVECTOR_BLOCK (bv, i);
+           BLOCK_START (b) += ANOFFSET (delta, s->block_line_section);
+           BLOCK_END (b) += ANOFFSET (delta, s->block_line_section);
+
+           for (j = 0; j < BLOCK_NSYMS (b); ++j)
+             {
+               struct symbol *sym = BLOCK_SYM (b, j);
+               /* The RS6000 code from which this was taken skipped
+                  any symbols in STRUCT_NAMESPACE or UNDEF_NAMESPACE.
+                  But I'm leaving out that test, on the theory that
+                  they can't possibly pass the tests below.  */
+               if ((SYMBOL_CLASS (sym) == LOC_LABEL
+                    || SYMBOL_CLASS (sym) == LOC_STATIC)
+                   && SYMBOL_SECTION (sym) >= 0)
+                 {
+                   SYMBOL_VALUE_ADDRESS (sym) +=
+                     ANOFFSET (delta, SYMBOL_SECTION (sym));
+                 }
+             }
+         }
+      }
+  }
+
+  {
+    struct minimal_symbol *msym;
+    ALL_OBJFILE_MSYMBOLS (objfile, msym)
+      SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym));
+  }
+
+  {
+    int i;
+    for (i = 0; i < objfile->num_sections; ++i)
+      ANOFFSET (objfile->section_offsets, i) = ANOFFSET (new_offsets, i);
+  }
+}
+\f
 /* Many places in gdb want to test just to see if we have any partial
    symbols available.  This function returns zero if none are currently
    available, nonzero otherwise. */
@@ -432,7 +579,8 @@ open_existing_mapped_file (symsfilename, mtime, mapped)
        {
          if (!mapped)
            {
-             warning ("mapped symbol file `%s' is out of date", symsfilename);
+             warning ("mapped symbol file `%s' is out of date, ignored it",
+                      symsfilename);
            }
        }
       else if ((fd = open (symsfilename, O_RDWR)) < 0)
@@ -566,3 +714,20 @@ map_to_address ()
 
 #endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */
 
+/* Returns a section whose range includes PC or NULL if none found. */
+
+struct obj_section *
+find_pc_section(pc)
+     CORE_ADDR pc;
+{
+  struct obj_section *s;
+  struct objfile *objfile;
+  
+  ALL_OBJFILES (objfile)
+    for (s = objfile->sections; s < objfile->sections_end; ++s)
+      if (s->addr <= pc
+         && pc < s->endaddr)
+       return(s);
+
+  return(NULL);
+}
This page took 0.03188 seconds and 4 git commands to generate.