* binemul.h (do_ar_emul_append): Declare.
authorAlan Modra <amodra@gmail.com>
Fri, 10 Dec 2010 08:51:47 +0000 (08:51 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 10 Dec 2010 08:51:47 +0000 (08:51 +0000)
* binemul.c (any_ok): New function.
(do_ar_emul_append): Rename from do_ar_emul_default_append.  Make
global, add check arg.  Adjust callers.
(ar_emul_default_replace): Tidy.
* configure.tgt (powerpc-*-aix[5-9]*,rs6000-*-aix[5-9]*): Use
bin_aix_emulation.
* emul_aix.c (bin_aix5_emulation, ar_emul_aix_internal): Delete.
(ar_emul_aix5_append, ar_emul_aix5_replace): Delete.
(check_aix): New function.
(ar_emul_aix_append, ar_emul_aix_replace): Rewrite.

binutils/ChangeLog
binutils/binemul.c
binutils/binemul.h
binutils/configure.tgt
binutils/emul_aix.c

index 014d8af..803d7b6 100644 (file)
@@ -1,3 +1,17 @@
+2010-12-10  Alan Modra  <amodra@gmail.com>
+
+       * binemul.h (do_ar_emul_append): Declare.
+       * binemul.c (any_ok): New function.
+       (do_ar_emul_append): Rename from do_ar_emul_default_append.  Make
+       global, add check arg.  Adjust callers.
+       (ar_emul_default_replace): Tidy.
+       * configure.tgt (powerpc-*-aix[5-9]*,rs6000-*-aix[5-9]*): Use
+       bin_aix_emulation.
+       * emul_aix.c (bin_aix5_emulation, ar_emul_aix_internal): Delete.
+       (ar_emul_aix5_append, ar_emul_aix5_replace): Delete.
+       (check_aix): New function.
+       (ar_emul_aix_append, ar_emul_aix_replace): Rewrite.
+
 2010-12-09  Mike Frysinger  <vapier@gentoo.org>
 
        * .gitignore: New file.
 2010-12-09  Mike Frysinger  <vapier@gentoo.org>
 
        * .gitignore: New file.
index 35587db..6bfcb15 100644 (file)
@@ -1,5 +1,6 @@
 /* Binutils emulation layer.
 /* Binutils emulation layer.
-   Copyright 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2005, 2007, 2008, 2010
+   Free Software Foundation, Inc.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
@@ -50,9 +51,16 @@ ar_emul_append (bfd **after_bfd, char *file_name, const char *target,
 }
 
 static bfd_boolean
 }
 
 static bfd_boolean
-do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
-                          bfd_boolean verbose, bfd_boolean flatten)
-  {
+any_ok (bfd *new_bfd ATTRIBUTE_UNUSED)
+{
+  return TRUE;
+}
+
+bfd_boolean
+do_ar_emul_append (bfd **after_bfd, bfd *new_bfd,
+                  bfd_boolean verbose, bfd_boolean flatten,
+                  bfd_boolean (*check) (bfd *))
+{
   /* When flattening, add the members of an archive instead of the
      archive itself.  */
   if (flatten && bfd_check_format (new_bfd, bfd_archive))
   /* When flattening, add the members of an archive instead of the
      archive itself.  */
   if (flatten && bfd_check_format (new_bfd, bfd_archive))
@@ -64,7 +72,7 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
            elt;
            elt = bfd_openr_next_archived_file (new_bfd, elt))
         {
            elt;
            elt = bfd_openr_next_archived_file (new_bfd, elt))
         {
-          if (do_ar_emul_default_append (after_bfd, elt, verbose, TRUE))
+          if (do_ar_emul_append (after_bfd, elt, verbose, TRUE, check))
             {
               added = TRUE;
               after_bfd = &((*after_bfd)->archive_next);
             {
               added = TRUE;
               after_bfd = &((*after_bfd)->archive_next);
@@ -74,6 +82,9 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
       return added;
     }
 
       return added;
     }
 
+  if (!check (new_bfd))
+    return FALSE;
+
   AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
 
   new_bfd->archive_next = *after_bfd;
   AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
 
   new_bfd->archive_next = *after_bfd;
@@ -91,7 +102,7 @@ ar_emul_default_append (bfd **after_bfd, char *file_name,
 
   new_bfd = bfd_openr (file_name, target);
   AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
 
   new_bfd = bfd_openr (file_name, target);
   AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
-  return do_ar_emul_default_append (after_bfd, new_bfd, verbose, flatten);
+  return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok);
 }
 
 bfd_boolean
 }
 
 bfd_boolean
@@ -109,15 +120,15 @@ bfd_boolean
 ar_emul_default_replace (bfd **after_bfd, char *file_name,
                         const char *target, bfd_boolean verbose)
 {
 ar_emul_default_replace (bfd **after_bfd, char *file_name,
                         const char *target, bfd_boolean verbose)
 {
-  bfd *temp;
+  bfd *new_bfd;
 
 
-  temp = *after_bfd;
-  *after_bfd = bfd_openr (file_name, target);
+  new_bfd = bfd_openr (file_name, target);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
 
 
-  AR_EMUL_ELEMENT_CHECK (*after_bfd, file_name);
   AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
 
   AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
 
-  (*after_bfd)->archive_next = temp;
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
 
   return TRUE;
 }
 
   return TRUE;
 }
index f85cc09..a93b7b0 100644 (file)
@@ -32,6 +32,9 @@ extern bfd_boolean ar_emul_append (bfd **, char *, const char *,
                                   bfd_boolean, bfd_boolean);
 extern bfd_boolean ar_emul_default_append (bfd **, char *, const char *,
                                           bfd_boolean, bfd_boolean);
                                   bfd_boolean, bfd_boolean);
 extern bfd_boolean ar_emul_default_append (bfd **, char *, const char *,
                                           bfd_boolean, bfd_boolean);
+extern bfd_boolean do_ar_emul_append (bfd **, bfd *,
+                                     bfd_boolean, bfd_boolean,
+                                     bfd_boolean (*)(bfd *));
 extern bfd_boolean ar_emul_replace (bfd **, char *, const char *,
                                    bfd_boolean);
 extern bfd_boolean ar_emul_default_replace (bfd **, char *,
 extern bfd_boolean ar_emul_replace (bfd **, char *, const char *,
                                    bfd_boolean);
 extern bfd_boolean ar_emul_default_replace (bfd **, char *,
index 253f731..4753d48 100644 (file)
@@ -11,7 +11,7 @@
 case "${targ}" in
     powerpc-*-aix[5-9]* | rs6000-*-aix[5-9]*)
        targ_emul=aix 
 case "${targ}" in
     powerpc-*-aix[5-9]* | rs6000-*-aix[5-9]*)
        targ_emul=aix 
-       targ_emul_vector=bin_aix5_emulation 
+       targ_emul_vector=bin_aix_emulation 
         ;;
 
     powerpc-*-aix4.3* | rs6000-*-aix4.3*)
         ;;
 
     powerpc-*-aix4.3* | rs6000-*-aix4.3*)
index dd5c97e..2f6a3e4 100644 (file)
@@ -1,5 +1,6 @@
 /* Binutils emulation layer.
 /* Binutils emulation layer.
-   Copyright 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright 2002, 2003, 2005, 2006, 2007, 2008, 2010
+   Free Software Foundation, Inc.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
    Written by Tom Rix, Red Hat Inc.
 
    This file is part of GNU Binutils.
@@ -27,6 +28,7 @@
 #include "libxcoff.h"
 
 /* Default to <bigaf>.  */
 #include "libxcoff.h"
 
 /* Default to <bigaf>.  */
+/* FIXME: write only variable.  */
 static bfd_boolean big_archive = TRUE;
 
 /* Whether to include 32 bit objects.  */
 static bfd_boolean big_archive = TRUE;
 
 /* Whether to include 32 bit objects.  */
@@ -47,88 +49,54 @@ ar_emul_aix_usage (FILE *fp)
 }
 
 static bfd_boolean
 }
 
 static bfd_boolean
-ar_emul_aix_internal (bfd **       after_bfd,
-                     char *       file_name,
-                     bfd_boolean  verbose,
-                     const char * target_name,
-                     bfd_boolean  is_append,
-                     bfd_boolean  flatten ATTRIBUTE_UNUSED)
+check_aix (bfd *try_bfd)
 {
 {
-  bfd *temp;
-  bfd *try_bfd;
+  extern const bfd_target rs6000coff_vec;
+  extern const bfd_target rs6000coff64_vec;
+  extern const bfd_target aix5coff64_vec;
 
 
-  temp = *after_bfd;
-
-  /* Try 64 bit.  */
-  try_bfd = bfd_openr (file_name, target_name);
-
-  /* Failed or the object is possibly 32 bit.  */
-  if (NULL == try_bfd || ! bfd_check_format (try_bfd, bfd_object))
-    try_bfd = bfd_openr (file_name, "aixcoff-rs6000");
-
-  AR_EMUL_ELEMENT_CHECK (try_bfd, file_name);
-
-  if (bfd_xcoff_is_xcoff64 (try_bfd) && (! X64))
-    return FALSE;
-
-  if (bfd_xcoff_is_xcoff32 (try_bfd)
-      && bfd_check_format (try_bfd, bfd_object) && (! X32))
-    return FALSE;
-
-  if (is_append)
+  if (bfd_check_format (try_bfd, bfd_object))
     {
     {
-      AR_EMUL_APPEND_PRINT_VERBOSE (verbose, file_name);
-    }
-  else
-    {
-      AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
-    }
-
-  *after_bfd = try_bfd;
-  (*after_bfd)->archive_next = temp;
+      if (!X32 && try_bfd->xvec == &rs6000coff_vec)
+       return FALSE;
 
 
+      if (!X64 && (try_bfd->xvec == &rs6000coff64_vec
+                  || try_bfd->xvec == &aix5coff64_vec))
+       return FALSE;
+    }
   return TRUE;
 }
 
   return TRUE;
 }
 
-
 static bfd_boolean
 ar_emul_aix_append (bfd **after_bfd, char *file_name, const char *target,
                    bfd_boolean verbose, bfd_boolean flatten)
 {
 static bfd_boolean
 ar_emul_aix_append (bfd **after_bfd, char *file_name, const char *target,
                    bfd_boolean verbose, bfd_boolean flatten)
 {
-  if (target)
-    non_fatal (_("target `%s' ignored."), target);
-  return ar_emul_aix_internal (after_bfd, file_name, verbose,
-                              "aixcoff64-rs6000", TRUE, flatten);
-}
+  bfd *new_bfd;
 
 
-static bfd_boolean
-ar_emul_aix5_append (bfd **after_bfd, char *file_name, const char *target,
-                    bfd_boolean verbose, bfd_boolean flatten)
-{
-  if (target)
-    non_fatal (_("target `%s' ignored."), target);
-  return ar_emul_aix_internal (after_bfd, file_name, verbose,
-                              "aix5coff64-rs6000", TRUE, flatten);
+  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, check_aix);
 }
 
 static bfd_boolean
 ar_emul_aix_replace (bfd **after_bfd, char *file_name, const char *target,
                     bfd_boolean verbose)
 {
 }
 
 static bfd_boolean
 ar_emul_aix_replace (bfd **after_bfd, char *file_name, const char *target,
                     bfd_boolean verbose)
 {
-  if (target)
-    non_fatal (_("target `%s' ignored."), target);
-  return ar_emul_aix_internal (after_bfd, file_name, verbose,
-                              "aixcoff64-rs6000", FALSE, FALSE);
-}
+  bfd *new_bfd;
 
 
-static bfd_boolean
-ar_emul_aix5_replace (bfd **after_bfd, char *file_name,
-                     const char *target, bfd_boolean verbose)
-{
-  if (target)
-    non_fatal (_("target `%s' ignored."), target);
-  return ar_emul_aix_internal (after_bfd, file_name, verbose,
-                              "aix5coff64-rs6000", FALSE, FALSE);
+  new_bfd = bfd_openr (file_name, target);
+  AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
+
+  if (!check_aix (new_bfd))
+    return FALSE;
+
+  AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
+
+  new_bfd->archive_next = *after_bfd;
+  *after_bfd = new_bfd;
+
+  return TRUE;
 }
 
 static bfd_boolean
 }
 
 static bfd_boolean
@@ -171,11 +139,3 @@ struct bin_emulation_xfer_struct bin_aix_emulation =
   ar_emul_aix_replace,
   ar_emul_aix_parse_arg,
 };
   ar_emul_aix_replace,
   ar_emul_aix_parse_arg,
 };
-
-struct bin_emulation_xfer_struct bin_aix5_emulation =
-{
-  ar_emul_aix_usage,
-  ar_emul_aix5_append,
-  ar_emul_aix5_replace,
-  ar_emul_aix_parse_arg,
-};