* 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-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.
/* 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.
-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))
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);
+ 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;
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);
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)
{
- 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;
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 *,
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*)
/* 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.
#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. */
-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;
+ }
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);
-}
-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);
-}
-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;
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,
-};