* 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>
* .gitignore: New file.

View File

@ -1,5 +1,6 @@
/* 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.
@ -50,9 +51,16 @@ ar_emul_append (bfd **after_bfd, char *file_name, const char *target,
}
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))
@ -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))
{
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);
@ -74,6 +82,9 @@ do_ar_emul_default_append (bfd **after_bfd, bfd *new_bfd,
return added;
}
if (!check (new_bfd))
return FALSE;
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);
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
@ -109,15 +120,15 @@ bfd_boolean
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);
(*after_bfd)->archive_next = temp;
new_bfd->archive_next = *after_bfd;
*after_bfd = new_bfd;
return TRUE;
}

View 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);
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 *,

View File

@ -11,7 +11,7 @@
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*)

View File

@ -1,5 +1,6 @@
/* 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.
@ -27,6 +28,7 @@
#include "libxcoff.h"
/* Default to <bigaf>. */
/* FIXME: write only variable. */
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
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;
}
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)
{
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
@ -171,11 +139,3 @@ struct bin_emulation_xfer_struct bin_aix_emulation =
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,
};