* 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.
This commit is contained in:
Alan Modra 2010-12-10 08:51:47 +00:00
parent b9e33f301e
commit 13485ea2e5
5 changed files with 72 additions and 84 deletions

View 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> 2010-12-09 Mike Frysinger <vapier@gentoo.org>
* .gitignore: New file. * .gitignore: New file.

View 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. Written by Tom Rix, Red Hat Inc.
This file is part of GNU Binutils. 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, any_ok (bfd *new_bfd ATTRIBUTE_UNUSED)
bfd_boolean verbose, bfd_boolean flatten) {
{ 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 /* When flattening, add the members of an archive instead of the
archive itself. */ archive itself. */
if (flatten && bfd_check_format (new_bfd, bfd_archive)) 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;
elt = bfd_openr_next_archived_file (new_bfd, 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; added = TRUE;
after_bfd = &((*after_bfd)->archive_next); 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); AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
new_bfd->archive_next = *after_bfd; 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); new_bfd = bfd_openr (file_name, target);
AR_EMUL_ELEMENT_CHECK (new_bfd, file_name); 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, ar_emul_default_replace (bfd **after_bfd, char *file_name,
const char *target, bfd_boolean verbose) const char *target, bfd_boolean verbose)
{ {
bfd *temp; bfd *new_bfd;
temp = *after_bfd; new_bfd = bfd_openr (file_name, target);
*after_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;
} }

View File

@ -32,6 +32,9 @@ extern bfd_boolean ar_emul_append (bfd **, char *, const char *,
bfd_boolean, bfd_boolean); bfd_boolean, bfd_boolean);
extern bfd_boolean ar_emul_default_append (bfd **, char *, const char *, extern bfd_boolean ar_emul_default_append (bfd **, char *, const char *,
bfd_boolean, bfd_boolean); 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 *, extern bfd_boolean ar_emul_replace (bfd **, char *, const char *,
bfd_boolean); bfd_boolean);
extern bfd_boolean ar_emul_default_replace (bfd **, char *, extern bfd_boolean ar_emul_default_replace (bfd **, char *,

View File

@ -11,7 +11,7 @@
case "${targ}" in case "${targ}" in
powerpc-*-aix[5-9]* | rs6000-*-aix[5-9]*) powerpc-*-aix[5-9]* | rs6000-*-aix[5-9]*)
targ_emul=aix 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*)

View 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. Written by Tom Rix, Red Hat Inc.
This file is part of GNU Binutils. This file is part of GNU Binutils.
@ -27,6 +28,7 @@
#include "libxcoff.h" #include "libxcoff.h"
/* Default to <bigaf>. */ /* Default to <bigaf>. */
/* FIXME: write only variable. */
static bfd_boolean big_archive = TRUE; static bfd_boolean big_archive = TRUE;
/* Whether to include 32 bit objects. */ /* 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, check_aix (bfd *try_bfd)
char * file_name,
bfd_boolean verbose,
const char * target_name,
bfd_boolean is_append,
bfd_boolean flatten ATTRIBUTE_UNUSED)
{ {
bfd *temp; extern const bfd_target rs6000coff_vec;
bfd *try_bfd; extern const bfd_target rs6000coff64_vec;
extern const bfd_target aix5coff64_vec;
temp = *after_bfd; if (bfd_check_format (try_bfd, bfd_object))
/* 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)
{ {
AR_EMUL_APPEND_PRINT_VERBOSE (verbose, file_name); if (!X32 && try_bfd->xvec == &rs6000coff_vec)
} return FALSE;
else
{
AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
}
*after_bfd = try_bfd;
(*after_bfd)->archive_next = temp;
if (!X64 && (try_bfd->xvec == &rs6000coff64_vec
|| try_bfd->xvec == &aix5coff64_vec))
return FALSE;
}
return TRUE; return TRUE;
} }
static bfd_boolean static bfd_boolean
ar_emul_aix_append (bfd **after_bfd, char *file_name, const char *target, ar_emul_aix_append (bfd **after_bfd, char *file_name, const char *target,
bfd_boolean verbose, bfd_boolean flatten) bfd_boolean verbose, bfd_boolean flatten)
{ {
if (target) bfd *new_bfd;
non_fatal (_("target `%s' ignored."), target);
return ar_emul_aix_internal (after_bfd, file_name, verbose,
"aixcoff64-rs6000", TRUE, flatten);
}
static bfd_boolean new_bfd = bfd_openr (file_name, target);
ar_emul_aix5_append (bfd **after_bfd, char *file_name, const char *target, AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
bfd_boolean verbose, bfd_boolean flatten)
{ return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, check_aix);
if (target)
non_fatal (_("target `%s' ignored."), target);
return ar_emul_aix_internal (after_bfd, file_name, verbose,
"aix5coff64-rs6000", TRUE, flatten);
} }
static bfd_boolean static bfd_boolean
ar_emul_aix_replace (bfd **after_bfd, char *file_name, const char *target, ar_emul_aix_replace (bfd **after_bfd, char *file_name, const char *target,
bfd_boolean verbose) bfd_boolean verbose)
{ {
if (target) bfd *new_bfd;
non_fatal (_("target `%s' ignored."), target);
return ar_emul_aix_internal (after_bfd, file_name, verbose,
"aixcoff64-rs6000", FALSE, FALSE);
}
static bfd_boolean new_bfd = bfd_openr (file_name, target);
ar_emul_aix5_replace (bfd **after_bfd, char *file_name, AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
const char *target, bfd_boolean verbose)
{ if (!check_aix (new_bfd))
if (target) return FALSE;
non_fatal (_("target `%s' ignored."), target);
return ar_emul_aix_internal (after_bfd, file_name, verbose, AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
"aix5coff64-rs6000", FALSE, FALSE);
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_replace,
ar_emul_aix_parse_arg, 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,
};