gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / binutils / binemul.c
index 67aaba8623856233d4d5f1f0d798c6e4e5c768d5..7c71b5b78c1a25116862696b7dee536f377e1c7d 100644 (file)
@@ -1,12 +1,12 @@
 /* Binutils emulation layer.
-   Copyright 2002 Free Software Foundation, Inc.
-   Written by Tom Rix, Redhat.
+   Copyright (C) 2002-2020 Free Software Foundation, Inc.
+   Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
 
    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,
 
    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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 #include "binemul.h"
 
 extern bin_emulation_xfer_type bin_dummy_emulation;
 
 void
-ar_emul_usage (fp)
-     FILE *fp;
+ar_emul_usage (FILE *fp)
 {
   if (bin_dummy_emulation.ar_usage)
     bin_dummy_emulation.ar_usage (fp);
 }
 
 void
-ar_emul_default_usage (fp)
-     FILE *fp;
+ar_emul_default_usage (FILE *fp)
 {
   AR_EMUL_USAGE_PRINT_OPTION_HEADER (fp);
   /* xgettext:c-format */
@@ -40,116 +39,101 @@ ar_emul_default_usage (fp)
 }
 
 bfd_boolean
-ar_emul_append (after_bfd, file_name, verbose)
-     bfd **after_bfd;
-     char *file_name;
-     bfd_boolean verbose;
+ar_emul_append (bfd **after_bfd, char *file_name, const char *target,
+               bfd_boolean verbose, bfd_boolean flatten)
 {
   if (bin_dummy_emulation.ar_append)
-    return bin_dummy_emulation.ar_append (after_bfd, file_name, verbose);
+    return bin_dummy_emulation.ar_append (after_bfd, file_name, target,
+                                         verbose, flatten);
 
   return FALSE;
 }
 
-bfd_boolean
-ar_emul_default_append (after_bfd, file_name, verbose)
-     bfd **after_bfd;
-     char *file_name;
-     bfd_boolean verbose;
+static bfd_boolean
+any_ok (bfd *new_bfd ATTRIBUTE_UNUSED)
 {
-  bfd *temp;
-
-  temp = *after_bfd;
-  *after_bfd = bfd_openr (file_name, NULL);
-
-  AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name);
-  AR_EMUL_APPEND_PRINT_VERBOSE (verbose, file_name);
-
-  (*after_bfd)->next = temp;
-
   return TRUE;
 }
 
 bfd_boolean
-ar_emul_replace (after_bfd, file_name, verbose)
-     bfd **after_bfd;
-     char *file_name;
-     bfd_boolean verbose;
+do_ar_emul_append (bfd **after_bfd, bfd *new_bfd,
+                  bfd_boolean verbose, bfd_boolean flatten,
+                  bfd_boolean (*check) (bfd *))
 {
-  if (bin_dummy_emulation.ar_replace)
-    return bin_dummy_emulation.ar_replace (after_bfd, file_name, verbose);
+  /* When flattening, add the members of an archive instead of the
+     archive itself.  */
+  if (flatten && bfd_check_format (new_bfd, bfd_archive))
+    {
+      bfd *elt;
+      bfd_boolean added = FALSE;
+
+      for (elt = bfd_openr_next_archived_file (new_bfd, NULL);
+           elt;
+           elt = bfd_openr_next_archived_file (new_bfd, elt))
+        {
+          if (do_ar_emul_append (after_bfd, elt, verbose, TRUE, check))
+            {
+              added = TRUE;
+              after_bfd = &((*after_bfd)->archive_next);
+            }
+        }
+
+      return added;
+    }
 
-  return FALSE;
-}
+  if (!check (new_bfd))
+    return FALSE;
 
-bfd_boolean
-ar_emul_default_replace (after_bfd, file_name, verbose)
-     bfd **after_bfd;
-     char *file_name;
-     bfd_boolean verbose;
-{
-  bfd *temp;
+  AR_EMUL_APPEND_PRINT_VERBOSE (verbose, bfd_get_filename (new_bfd));
 
-  temp = *after_bfd;
-  *after_bfd = bfd_openr (file_name, NULL);
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
 
-  AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name);
-  AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
+  return TRUE;
+}
 
-  (*after_bfd)->next = temp;
+bfd_boolean
+ar_emul_default_append (bfd **after_bfd, char *file_name,
+                       const char *target, bfd_boolean verbose,
+                       bfd_boolean flatten)
+{
+  bfd *new_bfd;
 
-  return TRUE;
+  new_bfd = bfd_openr (file_name, target);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
+  return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok);
 }
 
 bfd_boolean
-ar_emul_create (abfd_out, archive_file_name, file_name)
-     bfd **abfd_out;
-     char *archive_file_name;
-     char *file_name;
+ar_emul_replace (bfd **after_bfd, char *file_name, const char *target,
+                bfd_boolean verbose)
 {
-  if (bin_dummy_emulation.ar_create)
-    return bin_dummy_emulation.ar_create (abfd_out, archive_file_name,
-                                         file_name);
+  if (bin_dummy_emulation.ar_replace)
+    return bin_dummy_emulation.ar_replace (after_bfd, file_name,
+                                          target, verbose);
 
   return FALSE;
 }
 
 bfd_boolean
-ar_emul_default_create (abfd_out, archive_file_name, file_name)
-     bfd **abfd_out;
-     char *archive_file_name;
-     char *file_name;
+ar_emul_default_replace (bfd **after_bfd, char *file_name,
+                        const char *target, bfd_boolean verbose)
 {
-  char *target = NULL;
+  bfd *new_bfd;
 
-  /* Try to figure out the target to use for the archive from the
-     first object on the list.  */
-  if (file_name != NULL)
-    {
-      bfd *obj;
-
-      obj = bfd_openr (file_name, NULL);
-      if (obj != NULL)
-       {
-         if (bfd_check_format (obj, bfd_object))
-           target = bfd_get_target (obj);
-         (void) bfd_close (obj);
-       }
-    }
+  new_bfd = bfd_openr (file_name, target);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
+
+  AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
 
-  /* Create an empty archive.  */
-  *abfd_out = bfd_openw (archive_file_name, target);
-  if (*abfd_out == NULL
-      || ! bfd_set_format (*abfd_out, bfd_archive)
-      || ! bfd_close (*abfd_out))
-    bfd_fatal (archive_file_name);
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
 
   return TRUE;
 }
 
 bfd_boolean
-ar_emul_parse_arg (arg)
-     char *arg;
+ar_emul_parse_arg (char *arg)
 {
   if (bin_dummy_emulation.ar_parse_arg)
     return bin_dummy_emulation.ar_parse_arg (arg);
@@ -158,8 +142,7 @@ ar_emul_parse_arg (arg)
 }
 
 bfd_boolean
-ar_emul_default_parse_arg (arg)
-     char *arg ATTRIBUTE_UNUSED;
+ar_emul_default_parse_arg (char *arg ATTRIBUTE_UNUSED)
 {
   return FALSE;
 }
This page took 0.039024 seconds and 4 git commands to generate.