Fix a failure in the libiberty testsuite by increasing the recursion limit to 2048.
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index 98e81c48c467cac139b1a635a0414f12033e115a..a9b8fa7c582f74d2548dc84d4b642afb726dd770 100644 (file)
@@ -144,18 +144,14 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
          storage
            = ((struct objfile_per_bfd_storage *)
               bfd_alloc (abfd, sizeof (struct objfile_per_bfd_storage)));
+         /* objfile_per_bfd_storage is not trivially constructible, must
+            call the ctor manually.  */
+         storage = new (storage) objfile_per_bfd_storage ();
          set_bfd_data (abfd, objfiles_bfd_data, storage);
        }
       else
-       {
-         storage = (objfile_per_bfd_storage *)
-           obstack_alloc (&objfile->objfile_obstack,
-                          sizeof (objfile_per_bfd_storage));
-       }
-
-      /* objfile_per_bfd_storage is not trivially constructible, must
-        call the ctor manually.  */
-      storage = new (storage) objfile_per_bfd_storage ();
+       storage
+         = obstack_new<objfile_per_bfd_storage> (&objfile->objfile_obstack);
 
       /* Look up the gdbarch associated with the BFD.  */
       if (abfd != NULL)
@@ -269,8 +265,7 @@ objfile_register_static_link (struct objfile *objfile,
   slot = htab_find_slot (objfile->static_links, &lookup_entry, INSERT);
   gdb_assert (*slot == NULL);
 
-  entry = (struct static_link_htab_entry *) obstack_alloc
-           (&objfile->objfile_obstack, sizeof (*entry));
+  entry = XOBNEW (&objfile->objfile_obstack, static_link_htab_entry);
   entry->block = block;
   entry->static_link = static_link;
   *slot = (void *) entry;
@@ -778,15 +773,13 @@ static int
 objfile_relocate1 (struct objfile *objfile, 
                   const struct section_offsets *new_offsets)
 {
-  struct obj_section *s;
   struct section_offsets *delta =
     ((struct section_offsets *) 
      alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
 
-  int i;
   int something_changed = 0;
 
-  for (i = 0; i < objfile->num_sections; ++i)
+  for (int i = 0; i < objfile->num_sections; ++i)
     {
       delta->offsets[i] =
        ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i);
@@ -804,13 +797,12 @@ objfile_relocate1 (struct objfile *objfile,
     ALL_OBJFILE_FILETABS (objfile, cust, s)
     {
       struct linetable *l;
-      int i;
 
       /* First the line table.  */
       l = SYMTAB_LINETABLE (s);
       if (l)
        {
-         for (i = 0; i < l->nitems; ++i)
+         for (int i = 0; i < l->nitems; ++i)
            l->item[i].pc += ANOFFSET (delta,
                                       COMPUNIT_BLOCK_LINE_SECTION
                                         (cust));
@@ -826,7 +818,7 @@ objfile_relocate1 (struct objfile *objfile,
        addrmap_relocate (BLOCKVECTOR_MAP (bv),
                          ANOFFSET (delta, block_line_section));
 
-      for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
+      for (int i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
        {
          struct block *b;
          struct symbol *sym;
@@ -836,6 +828,14 @@ objfile_relocate1 (struct objfile *objfile,
          BLOCK_START (b) += ANOFFSET (delta, block_line_section);
          BLOCK_END (b) += ANOFFSET (delta, block_line_section);
 
+         if (BLOCK_RANGES (b) != nullptr)
+           for (int j = 0; j < BLOCK_NRANGES (b); j++)
+             {
+               BLOCK_RANGE_START (b, j)
+                 += ANOFFSET (delta, block_line_section);
+               BLOCK_RANGE_END (b, j) += ANOFFSET (delta, block_line_section);
+             }
+
          /* We only want to iterate over the local symbols, not any
             symbols in included symtabs.  */
          ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
@@ -846,6 +846,10 @@ objfile_relocate1 (struct objfile *objfile,
     }
   }
 
+  /* This stores relocated addresses and so must be cleared.  This
+     will cause it to be recreated on demand.  */
+  objfile->psymbol_map.clear ();
+
   /* Relocate isolated symbols.  */
   {
     struct symbol *iter;
@@ -854,13 +858,6 @@ objfile_relocate1 (struct objfile *objfile,
       relocate_one_symbol (iter, objfile, delta);
   }
 
-  if (objfile->psymtabs_addrmap)
-    addrmap_relocate (objfile->psymtabs_addrmap,
-                     ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
-
-  if (objfile->sf)
-    objfile->sf->qf->relocate (objfile, new_offsets, delta);
-
   {
     int i;
 
@@ -872,6 +869,7 @@ objfile_relocate1 (struct objfile *objfile,
   get_objfile_pspace_data (objfile->pspace)->section_map_dirty = 1;
 
   /* Update the table in exec_ops, used to read memory.  */
+  struct obj_section *s;
   ALL_OBJFILE_OSECTIONS (objfile, s)
     {
       int idx = s - objfile->sections;
@@ -1289,8 +1287,7 @@ filter_overlapping_sections (struct obj_section **map, int map_size)
 
              struct gdbarch *const gdbarch = get_objfile_arch (objf1);
 
-             complaint (&symfile_complaints,
-                        _("unexpected overlap between:\n"
+             complaint (_("unexpected overlap between:\n"
                           " (A) section `%s' from `%s' [%s, %s)\n"
                           " (B) section `%s' from `%s' [%s, %s).\n"
                           "Will ignore section B"),
@@ -1461,26 +1458,11 @@ objfiles_changed (void)
 
 /* See comments in objfiles.h.  */
 
-void
+scoped_restore_tmpl<int>
 inhibit_section_map_updates (struct program_space *pspace)
 {
-  get_objfile_pspace_data (pspace)->inhibit_updates = 1;
-}
-
-/* See comments in objfiles.h.  */
-
-void
-resume_section_map_updates (struct program_space *pspace)
-{
-  get_objfile_pspace_data (pspace)->inhibit_updates = 0;
-}
-
-/* See comments in objfiles.h.  */
-
-void
-resume_section_map_updates_cleanup (void *arg)
-{
-  resume_section_map_updates ((struct program_space *) arg);
+  return scoped_restore_tmpl<int>
+    (&get_objfile_pspace_data (pspace)->inhibit_updates, 1);
 }
 
 /* Return 1 if ADDR maps into one of the sections of OBJFILE and 0
This page took 0.02584 seconds and 4 git commands to generate.