Make add_separate_debug_objfile static
[deliverable/binutils-gdb.git] / gdb / objfiles.c
index f9e7d20bab5e525d5ff6356ed6a349ad0611b02a..0ee5720cf67bc671359db45e42a020728b7be359 100644 (file)
@@ -473,10 +473,31 @@ separate_debug_iterator::operator++ ()
   return *this;
 }
 
+/* Unlink OBJFILE from the list of known objfiles.  */
+
+static void
+unlink_objfile (struct objfile *objfile)
+{
+  struct objfile **objpp;
+
+  for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
+    {
+      if (*objpp == objfile)
+       {
+         *objpp = (*objpp)->next;
+         objfile->next = NULL;
+         return;
+       }
+    }
+
+  internal_error (__FILE__, __LINE__,
+                 _("unlink_objfile: objfile already unlinked"));
+}
+
 /* Put one object file before a specified on in the global list.
    This can be used to make sure an object file is destroyed before
    another when using objfiles_safe to free all objfiles.  */
-void
+static void
 put_objfile_before (struct objfile *objfile, struct objfile *before_this)
 {
   struct objfile **objp;
@@ -497,41 +518,9 @@ put_objfile_before (struct objfile *objfile, struct objfile *before_this)
                  _("put_objfile_before: before objfile not in list"));
 }
 
-/* Unlink OBJFILE from the list of known objfiles, if it is found in the
-   list.
-
-   It is not a bug, or error, to call this function if OBJFILE is not known
-   to be in the current list.  This is done in the case of mapped objfiles,
-   for example, just to ensure that the mapped objfile doesn't appear twice
-   in the list.  Since the list is threaded, linking in a mapped objfile
-   twice would create a circular list.
-
-   If OBJFILE turns out to be in the list, we zap it's NEXT pointer after
-   unlinking it, just to ensure that we have completely severed any linkages
-   between the OBJFILE and the list.  */
-
-void
-unlink_objfile (struct objfile *objfile)
-{
-  struct objfile **objpp;
-
-  for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
-    {
-      if (*objpp == objfile)
-       {
-         *objpp = (*objpp)->next;
-         objfile->next = NULL;
-         return;
-       }
-    }
-
-  internal_error (__FILE__, __LINE__,
-                 _("unlink_objfile: objfile already unlinked"));
-}
-
 /* Add OBJFILE as a separate debug objfile of PARENT.  */
 
-void
+static void
 add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
 {
   gdb_assert (objfile && parent);
@@ -552,6 +541,18 @@ add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
   put_objfile_before (objfile, parent);
 }
 
+/* See objfiles.h.  */
+
+objfile *
+objfile::make (bfd *bfd_, const char *name_, objfile_flags flags_,
+              objfile *parent)
+{
+  objfile *result = new objfile (bfd_, name_, flags_);
+  if (parent != nullptr)
+    add_separate_debug_objfile (result, parent);
+  return result;
+}
+
 /* Free all separate debug objfile of OBJFILE, but don't free OBJFILE
    itself.  */
 
@@ -1019,18 +1020,16 @@ have_minimal_symbols (void)
 
 /* Qsort comparison function.  */
 
-static int
-qsort_cmp (const void *a, const void *b)
+static bool
+sort_cmp (const struct obj_section *sect1, const obj_section *sect2)
 {
-  const struct obj_section *sect1 = *(const struct obj_section **) a;
-  const struct obj_section *sect2 = *(const struct obj_section **) b;
   const CORE_ADDR sect1_addr = obj_section_addr (sect1);
   const CORE_ADDR sect2_addr = obj_section_addr (sect2);
 
   if (sect1_addr < sect2_addr)
-    return -1;
+    return true;
   else if (sect1_addr > sect2_addr)
-    return 1;
+    return false;
   else
     {
       /* Sections are at the same address.  This could happen if
@@ -1047,29 +1046,33 @@ qsort_cmp (const void *a, const void *b)
          /* Case A.  The ordering doesn't matter: separate debuginfo files
             will be filtered out later.  */
 
-         return 0;
+         return false;
        }
 
       /* Case B.  Maintain stable sort order, so bugs in GDB are easier to
         triage.  This section could be slow (since we iterate over all
-        objfiles in each call to qsort_cmp), but this shouldn't happen
+        objfiles in each call to sort_cmp), but this shouldn't happen
         very often (GDB is already in a confused state; one hopes this
         doesn't happen at all).  If you discover that significant time is
         spent in the loops below, do 'set complaints 100' and examine the
         resulting complaints.  */
-
       if (objfile1 == objfile2)
        {
-         /* Both sections came from the same objfile.  We are really confused.
-            Sort on sequence order of sections within the objfile.  */
+         /* Both sections came from the same objfile.  We are really
+            confused.  Sort on sequence order of sections within the
+            objfile.  The order of checks is important here, if we find a
+            match on SECT2 first then either SECT2 is before SECT1, or,
+            SECT2 == SECT1, in both cases we should return false.  The
+            second case shouldn't occur during normal use, but std::sort
+            does check that '!(a < a)' when compiled in debug mode.  */
 
          const struct obj_section *osect;
 
          ALL_OBJFILE_OSECTIONS (objfile1, osect)
-           if (osect == sect1)
-             return -1;
-           else if (osect == sect2)
-             return 1;
+           if (osect == sect2)
+             return false;
+           else if (osect == sect1)
+             return true;
 
          /* We should have found one of the sections before getting here.  */
          gdb_assert_not_reached ("section not found");
@@ -1080,9 +1083,9 @@ qsort_cmp (const void *a, const void *b)
 
          for (objfile *objfile : current_program_space->objfiles ())
            if (objfile == objfile1)
-             return -1;
+             return true;
            else if (objfile == objfile2)
-             return 1;
+             return false;
 
          /* We should have found one of the objfiles before getting here.  */
          gdb_assert_not_reached ("objfile not found");
@@ -1091,7 +1094,7 @@ qsort_cmp (const void *a, const void *b)
 
   /* Unreachable.  */
   gdb_assert_not_reached ("unexpected code path");
-  return 0;
+  return false;
 }
 
 /* Select "better" obj_section to keep.  We prefer the one that came from
@@ -1283,7 +1286,7 @@ update_section_map (struct program_space *pspace,
       if (insert_section_p (objfile->obfd, s->the_bfd_section))
        map[i++] = s;
 
-  qsort (map, alloc_size, sizeof (*map), qsort_cmp);
+  std::sort (map, map + alloc_size, sort_cmp);
   map_size = filter_debuginfo_sections(map, alloc_size);
   map_size = filter_overlapping_sections(map, map_size);
 
@@ -1437,7 +1440,7 @@ shared_objfile_contains_address_p (struct program_space *pspace,
    searching the objfiles in the order they are stored internally,
    ignoring CURRENT_OBJFILE.
 
-   On most platorms, it should be close enough to doing the best
+   On most platforms, it should be close enough to doing the best
    we can without some knowledge specific to the architecture.  */
 
 void
This page took 0.032608 seconds and 4 git commands to generate.