Browse Source

* 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.
gdb_7_3-branch
Alan Modra 16 years ago
parent
commit
13485ea2e5
  1. 14
      binutils/ChangeLog
  2. 33
      binutils/binemul.c
  3. 3
      binutils/binemul.h
  4. 2
      binutils/configure.tgt
  5. 104
      binutils/emul_aix.c

14
binutils/ChangeLog

@ -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.

33
binutils/binemul.c

@ -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;
}

3
binutils/binemul.h

@ -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 *,

2
binutils/configure.tgt

@ -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*)

104
binutils/emul_aix.c

@ -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,
};

Loading…
Cancel
Save