]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/emul_aix.c
* testsuite/Makefile.am (memory_test.o): New target.
[thirdparty/binutils-gdb.git] / binutils / emul_aix.c
CommitLineData
eb1e0e80 1/* Binutils emulation layer.
aa820537 2 Copyright 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
ad94be02 3 Written by Tom Rix, Red Hat Inc.
eb1e0e80
NC
4
5 This file is part of GNU Binutils.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
32866df7 9 the Free Software Foundation; either version 3 of the License, or
eb1e0e80
NC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
32866df7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
eb1e0e80
NC
21
22#include "binemul.h"
23#include "bfdlink.h"
24#include "coff/internal.h"
25#include "coff/xcoff.h"
26#include "libcoff.h"
27#include "libxcoff.h"
28
29/* Default to <bigaf>. */
b34976b6 30static bfd_boolean big_archive = TRUE;
eb1e0e80
NC
31
32/* Whether to include 32 bit objects. */
b34976b6 33static bfd_boolean X32 = TRUE;
eb1e0e80
NC
34
35/* Whether to include 64 bit objects. */
b34976b6
AM
36static bfd_boolean X64 = FALSE;
37
eb1e0e80 38static void
2da42df6 39ar_emul_aix_usage (FILE *fp)
eb1e0e80
NC
40{
41 AR_EMUL_USAGE_PRINT_OPTION_HEADER (fp);
42 /* xgettext:c-format */
43 fprintf (fp, _(" [-g] - 32 bit small archive\n"));
44 fprintf (fp, _(" [-X32] - ignores 64 bit objects\n"));
45 fprintf (fp, _(" [-X64] - ignores 32 bit objects\n"));
46 fprintf (fp, _(" [-X32_64] - accepts 32 and 64 bit objects\n"));
47}
48
b34976b6 49static bfd_boolean
a8da6403
NC
50ar_emul_aix_internal (bfd ** after_bfd,
51 char * file_name,
52 bfd_boolean verbose,
53 const char * target_name,
54 bfd_boolean is_append,
55 bfd_boolean flatten ATTRIBUTE_UNUSED)
eb1e0e80
NC
56{
57 bfd *temp;
58 bfd *try_bfd;
59
60 temp = *after_bfd;
61
62 /* Try 64 bit. */
63 try_bfd = bfd_openr (file_name, target_name);
64
65 /* Failed or the object is possibly 32 bit. */
66 if (NULL == try_bfd || ! bfd_check_format (try_bfd, bfd_object))
67 try_bfd = bfd_openr (file_name, "aixcoff-rs6000");
68
69 AR_EMUL_ELEMENT_CHECK (try_bfd, file_name);
70
71 if (bfd_xcoff_is_xcoff64 (try_bfd) && (! X64))
b34976b6 72 return FALSE;
eb1e0e80 73
26044998 74 if (bfd_xcoff_is_xcoff32 (try_bfd)
eb1e0e80 75 && bfd_check_format (try_bfd, bfd_object) && (! X32))
b34976b6 76 return FALSE;
eb1e0e80
NC
77
78 if (is_append)
79 {
80 AR_EMUL_APPEND_PRINT_VERBOSE (verbose, file_name);
81 }
82 else
83 {
84 AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
85 }
86
87 *after_bfd = try_bfd;
c3de112b 88 (*after_bfd)->archive_next = temp;
eb1e0e80 89
b34976b6 90 return TRUE;
eb1e0e80
NC
91}
92
93
b34976b6 94static bfd_boolean
a8da6403
NC
95ar_emul_aix_append (bfd **after_bfd, char *file_name, bfd_boolean verbose,
96 bfd_boolean flatten)
eb1e0e80
NC
97{
98 return ar_emul_aix_internal (after_bfd, file_name, verbose,
a8da6403 99 "aixcoff64-rs6000", TRUE, flatten);
eb1e0e80
NC
100}
101
b34976b6 102static bfd_boolean
a8da6403
NC
103ar_emul_aix5_append (bfd **after_bfd, char *file_name, bfd_boolean verbose,
104 bfd_boolean flatten)
eb1e0e80
NC
105{
106 return ar_emul_aix_internal (after_bfd, file_name, verbose,
a8da6403 107 "aix5coff64-rs6000", TRUE, flatten);
eb1e0e80
NC
108}
109
b34976b6 110static bfd_boolean
2da42df6 111ar_emul_aix_replace (bfd **after_bfd, char *file_name, bfd_boolean verbose)
eb1e0e80
NC
112{
113 return ar_emul_aix_internal (after_bfd, file_name, verbose,
a8da6403 114 "aixcoff64-rs6000", FALSE, FALSE);
eb1e0e80
NC
115}
116
b34976b6 117static bfd_boolean
2da42df6 118ar_emul_aix5_replace (bfd **after_bfd, char *file_name, bfd_boolean verbose)
eb1e0e80
NC
119{
120 return ar_emul_aix_internal (after_bfd, file_name, verbose,
a8da6403 121 "aix5coff64-rs6000", FALSE, FALSE);
eb1e0e80
NC
122}
123
b34976b6 124static bfd_boolean
2da42df6 125ar_emul_aix_parse_arg (char *arg)
eb1e0e80 126{
0112cd26 127 if (CONST_STRNEQ (arg, "-X32_64"))
eb1e0e80 128 {
b34976b6
AM
129 big_archive = TRUE;
130 X32 = TRUE;
131 X64 = TRUE;
eb1e0e80 132 }
0112cd26 133 else if (CONST_STRNEQ (arg, "-X32"))
eb1e0e80 134 {
b34976b6
AM
135 big_archive = TRUE;
136 X32 = TRUE;
137 X64 = FALSE;
eb1e0e80 138 }
0112cd26 139 else if (CONST_STRNEQ (arg, "-X64"))
eb1e0e80 140 {
b34976b6
AM
141 big_archive = TRUE;
142 X32 = FALSE;
143 X64 = TRUE;
eb1e0e80 144 }
0112cd26 145 else if (CONST_STRNEQ (arg, "-g"))
eb1e0e80 146 {
b34976b6
AM
147 big_archive = FALSE;
148 X32 = TRUE;
149 X64 = FALSE;
eb1e0e80
NC
150 }
151 else
b34976b6 152 return FALSE;
eb1e0e80 153
b34976b6 154 return TRUE;
eb1e0e80
NC
155}
156
26044998 157struct bin_emulation_xfer_struct bin_aix_emulation =
eb1e0e80
NC
158{
159 ar_emul_aix_usage,
160 ar_emul_aix_append,
161 ar_emul_aix_replace,
eb1e0e80
NC
162 ar_emul_aix_parse_arg,
163};
164
26044998 165struct bin_emulation_xfer_struct bin_aix5_emulation =
eb1e0e80
NC
166{
167 ar_emul_aix_usage,
168 ar_emul_aix5_append,
169 ar_emul_aix5_replace,
eb1e0e80
NC
170 ar_emul_aix_parse_arg,
171};