]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - binutils/binemul.c
Merge commit 'upstream/2.20'
[msp430-binutils.git] / binutils / binemul.c
index 0eb1c816c1aeddd8d30ad89f9bb2c9db5c5202ff..2931bdac799b1511c6212fd0b2f8b0619b6df048 100644 (file)
@@ -1,5 +1,5 @@
 /* Binutils emulation layer.
-   Copyright 2002, 2003, 2007 Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
@@ -39,29 +39,58 @@ ar_emul_default_usage (FILE *fp)
 }
 
 bfd_boolean
-ar_emul_append (bfd **after_bfd, char *file_name, bfd_boolean verbose)
+ar_emul_append (bfd **after_bfd, char *file_name, 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, verbose,
+                                          flatten);
 
   return FALSE;
 }
 
+static bfd_boolean
+do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
+                       bfd_boolean verbose, bfd_boolean flatten)
+  {
+  /* 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_default_append (after_bfd, elt, verbose, TRUE))
+            {
+              added = TRUE;
+              after_bfd = &((*after_bfd)->archive_next);
+            }
+        }
+
+      return added;
+    }
+
+  AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
+
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
+
+  return TRUE;
+}
+
 bfd_boolean
 ar_emul_default_append (bfd **after_bfd, char *file_name,
-                       bfd_boolean verbose)
+                       bfd_boolean verbose, bfd_boolean flatten)
 {
-  bfd *temp;
+  bfd *new_bfd;
 
-  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)->archive_next = temp;
-
-  return TRUE;
+  new_bfd = bfd_openr (file_name, NULL);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
+  return do_ar_emul_default_append (after_bfd, new_bfd, verbose, flatten);
 }
 
 bfd_boolean