as.c revision 1.10 1 1.1 christos /* as.c - GAS main program.
2 1.10 christos Copyright (C) 1987-2025 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of GAS, the GNU Assembler.
5 1.1 christos
6 1.1 christos GAS is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3, or (at your option)
9 1.1 christos any later version.
10 1.1 christos
11 1.1 christos GAS is distributed in the hope that it will be useful, but WITHOUT
12 1.1 christos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 1.1 christos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 1.1 christos License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with GAS; see the file COPYING. If not, write to the Free
18 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 1.1 christos 02110-1301, USA. */
20 1.1 christos
21 1.1 christos /* Main program for AS; a 32-bit assembler of GNU.
22 1.1 christos Understands command arguments.
23 1.1 christos Has a few routines that don't fit in other modules because they
24 1.1 christos are shared.
25 1.3 christos
26 1.1 christos bugs
27 1.3 christos
28 1.1 christos : initialisers
29 1.1 christos Since no-one else says they will support them in future: I
30 1.1 christos don't support them now. */
31 1.1 christos
32 1.1 christos #define COMMON
33 1.1 christos
34 1.6 christos /* Disable code to set FAKE_LABEL_NAME in obj-multi.h, to avoid circular
35 1.6 christos reference. */
36 1.6 christos #define INITIALIZING_EMULS
37 1.6 christos
38 1.1 christos #include "as.h"
39 1.1 christos #include "subsegs.h"
40 1.1 christos #include "output-file.h"
41 1.1 christos #include "sb.h"
42 1.1 christos #include "macro.h"
43 1.1 christos #include "dwarf2dbg.h"
44 1.1 christos #include "dw2gencfi.h"
45 1.9 christos #include "codeview.h"
46 1.1 christos #include "bfdver.h"
47 1.6 christos #include "write.h"
48 1.9 christos #include "ginsn.h"
49 1.1 christos
50 1.1 christos #ifdef HAVE_ITBL_CPU
51 1.1 christos #include "itbl-ops.h"
52 1.1 christos #else
53 1.1 christos #define itbl_init()
54 1.1 christos #endif
55 1.1 christos
56 1.1 christos #ifdef USING_CGEN
57 1.1 christos /* Perform any cgen specific initialisation for gas. */
58 1.1 christos extern void gas_cgen_begin (void);
59 1.1 christos #endif
60 1.1 christos
61 1.1 christos /* We build a list of defsyms as we read the options, and then define
62 1.1 christos them after we have initialized everything. */
63 1.1 christos struct defsym_list
64 1.1 christos {
65 1.1 christos struct defsym_list *next;
66 1.1 christos char *name;
67 1.1 christos valueT value;
68 1.1 christos };
69 1.1 christos
70 1.1 christos
71 1.1 christos /* True if a listing is wanted. */
72 1.1 christos int listing;
73 1.1 christos
74 1.1 christos /* Type of debugging to generate. */
75 1.1 christos enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
76 1.1 christos int use_gnu_debug_info_extensions = 0;
77 1.1 christos
78 1.1 christos #ifndef MD_DEBUG_FORMAT_SELECTOR
79 1.1 christos #define MD_DEBUG_FORMAT_SELECTOR NULL
80 1.1 christos #endif
81 1.1 christos static enum debug_info_type (*md_debug_format_selector) (int *) = MD_DEBUG_FORMAT_SELECTOR;
82 1.1 christos
83 1.1 christos /* Maximum level of macro nesting. */
84 1.1 christos int max_macro_nest = 100;
85 1.1 christos
86 1.1 christos /* argv[0] */
87 1.1 christos static char * myname;
88 1.1 christos
89 1.1 christos /* The default obstack chunk size. If we set this to zero, the
90 1.1 christos obstack code will use whatever will fit in a 4096 byte block. */
91 1.1 christos int chunksize = 0;
92 1.1 christos
93 1.1 christos /* To monitor memory allocation more effectively, make this non-zero.
94 1.1 christos Then the chunk sizes for gas and bfd will be reduced. */
95 1.1 christos int debug_memory = 0;
96 1.1 christos
97 1.1 christos /* Enable verbose mode. */
98 1.1 christos int verbose = 0;
99 1.1 christos
100 1.7 christos /* Which version of DWARF CIE to produce. This default value of -1
101 1.7 christos indicates that this value has not been set yet, a default value is
102 1.7 christos provided in dwarf2_init. A different value can also be supplied by the
103 1.7 christos command line flag --gdwarf-cie-version, or by a target in
104 1.7 christos MD_AFTER_PARSE_ARGS. */
105 1.7 christos int flag_dwarf_cie_version = -1;
106 1.7 christos
107 1.8 christos /* The maximum level of DWARF DEBUG information we should manufacture.
108 1.8 christos This defaults to 3 unless overridden by a command line option. */
109 1.8 christos unsigned int dwarf_level = 3;
110 1.8 christos
111 1.5 christos #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
112 1.5 christos int flag_use_elf_stt_common = DEFAULT_GENERATE_ELF_STT_COMMON;
113 1.8 christos bool flag_generate_build_notes = DEFAULT_GENERATE_BUILD_NOTES;
114 1.5 christos #endif
115 1.5 christos
116 1.1 christos segT reg_section;
117 1.1 christos segT expr_section;
118 1.1 christos segT text_section;
119 1.1 christos segT data_section;
120 1.1 christos segT bss_section;
121 1.1 christos
122 1.1 christos /* Name of listing file. */
123 1.1 christos static char *listing_filename = NULL;
124 1.1 christos
125 1.1 christos static struct defsym_list *defsyms;
126 1.1 christos
127 1.1 christos static long start_time;
128 1.1 christos
129 1.1 christos
130 1.1 christos #ifdef USE_EMULATIONS
132 1.1 christos #define EMULATION_ENVIRON "AS_EMULATION"
133 1.1 christos
134 1.1 christos static struct emulation *const emulations[] = { EMULATIONS };
135 1.1 christos static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
136 1.1 christos
137 1.1 christos static void
138 1.1 christos select_emulation_mode (int argc, char **argv)
139 1.1 christos {
140 1.5 christos int i;
141 1.5 christos char *p;
142 1.1 christos const char *em = NULL;
143 1.1 christos
144 1.8 christos for (i = 1; i < argc; i++)
145 1.1 christos if (startswith (argv[i], "--em"))
146 1.1 christos break;
147 1.1 christos
148 1.1 christos if (i == argc)
149 1.1 christos goto do_default;
150 1.1 christos
151 1.1 christos p = strchr (argv[i], '=');
152 1.1 christos if (p)
153 1.1 christos p++;
154 1.1 christos else
155 1.1 christos p = argv[i + 1];
156 1.1 christos
157 1.1 christos if (!p || !*p)
158 1.1 christos as_fatal (_("missing emulation mode name"));
159 1.1 christos em = p;
160 1.1 christos
161 1.1 christos do_default:
162 1.1 christos if (em == 0)
163 1.1 christos em = getenv (EMULATION_ENVIRON);
164 1.1 christos if (em == 0)
165 1.1 christos em = DEFAULT_EMULATION;
166 1.1 christos
167 1.1 christos if (em)
168 1.1 christos {
169 1.1 christos for (i = 0; i < n_emulations; i++)
170 1.1 christos if (!strcmp (emulations[i]->name, em))
171 1.1 christos break;
172 1.1 christos if (i == n_emulations)
173 1.1 christos as_fatal (_("unrecognized emulation name `%s'"), em);
174 1.1 christos this_emulation = emulations[i];
175 1.1 christos }
176 1.1 christos else
177 1.1 christos this_emulation = emulations[0];
178 1.1 christos
179 1.1 christos this_emulation->init ();
180 1.1 christos }
181 1.1 christos
182 1.1 christos void
183 1.1 christos common_emul_init (void)
184 1.1 christos {
185 1.1 christos this_format = this_emulation->format;
186 1.1 christos
187 1.1 christos if (this_emulation->leading_underscore == 2)
188 1.1 christos this_emulation->leading_underscore = this_format->dfl_leading_underscore;
189 1.1 christos
190 1.1 christos if (this_emulation->default_endian != 2)
191 1.1 christos target_big_endian = this_emulation->default_endian;
192 1.1 christos
193 1.1 christos if (this_emulation->fake_label_name == 0)
194 1.1 christos {
195 1.6 christos if (this_emulation->leading_underscore)
196 1.1 christos this_emulation->fake_label_name = FAKE_LABEL_NAME;
197 1.1 christos else
198 1.6 christos /* What other parameters should we test? */
199 1.1 christos this_emulation->fake_label_name = "." FAKE_LABEL_NAME;
200 1.1 christos }
201 1.1 christos }
202 1.1 christos #endif
203 1.1 christos
204 1.1 christos void
205 1.1 christos print_version_id (void)
206 1.1 christos {
207 1.1 christos static int printed;
208 1.1 christos
209 1.1 christos if (printed)
210 1.1 christos return;
211 1.1 christos printed = 1;
212 1.1 christos
213 1.1 christos fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s\n"),
214 1.1 christos VERSION, TARGET_ALIAS, BFD_VERSION_STRING);
215 1.1 christos }
216 1.3 christos
217 1.3 christos #ifdef DEFAULT_FLAG_COMPRESS_DEBUG
218 1.9 christos enum compressed_debug_section_type flag_compress_debug
219 1.9 christos = DEFAULT_COMPRESSED_DEBUG_ALGORITHM;
220 1.9 christos #define DEFAULT_COMPRESSED_DEBUG_ALGORITHM_HELP \
221 1.9 christos DEFAULT_COMPRESSED_DEBUG_ALGORITHM
222 1.9 christos #else
223 1.3 christos #define DEFAULT_COMPRESSED_DEBUG_ALGORITHM_HELP COMPRESS_DEBUG_NONE
224 1.3 christos #endif
225 1.1 christos
226 1.1 christos static void
227 1.1 christos show_usage (FILE * stream)
228 1.1 christos {
229 1.1 christos fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
230 1.1 christos
231 1.1 christos fprintf (stream, _("\
232 1.1 christos Options:\n\
233 1.1 christos -a[sub-option...] turn on listings\n\
234 1.1 christos Sub-options [default hls]:\n\
235 1.1 christos c omit false conditionals\n\
236 1.1 christos d omit debugging directives\n\
237 1.1 christos g include general info\n\
238 1.9 christos h include high-level source\n\
239 1.1 christos i include ginsn and synthesized CFI info\n\
240 1.1 christos l include assembly\n\
241 1.1 christos m include macro expansions\n\
242 1.1 christos n omit forms processing\n\
243 1.1 christos s include symbols\n\
244 1.1 christos =FILE list to FILE (must be last sub-option)\n"));
245 1.1 christos
246 1.1 christos fprintf (stream, _("\
247 1.3 christos --alternate initially turn on alternate macro syntax\n"));
248 1.9 christos fprintf (stream, _("\
249 1.9 christos --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi|zstd}]\n\
250 1.9 christos compress DWARF debug sections\n")),
251 1.9 christos fprintf (stream, _("\
252 1.9 christos Default: %s\n"),
253 1.9 christos bfd_get_compression_algorithm_name
254 1.9 christos (DEFAULT_COMPRESSED_DEBUG_ALGORITHM_HELP));
255 1.1 christos
256 1.3 christos fprintf (stream, _("\
257 1.3 christos --nocompress-debug-sections\n\
258 1.3 christos don't compress DWARF debug sections\n"));
259 1.9 christos fprintf (stream, _("\
260 1.1 christos -D produce assembler debugging messages\n"));
261 1.9 christos fprintf (stream, _("\
262 1.1 christos --dump-config display how the assembler is configured and then exit\n"));
263 1.1 christos fprintf (stream, _("\
264 1.1 christos --debug-prefix-map OLD=NEW\n\
265 1.1 christos map OLD to NEW in debug information\n"));
266 1.1 christos fprintf (stream, _("\
267 1.1 christos --defsym SYM=VAL define symbol SYM to given value\n"));
268 1.1 christos #ifdef USE_EMULATIONS
269 1.1 christos {
270 1.5 christos int i;
271 1.1 christos const char *def_em;
272 1.1 christos
273 1.9 christos fprintf (stream, "\
274 1.1 christos --emulation=[");
275 1.1 christos for (i = 0; i < n_emulations - 1; i++)
276 1.1 christos fprintf (stream, "%s | ", emulations[i]->name);
277 1.1 christos fprintf (stream, "%s]\n", emulations[i]->name);
278 1.1 christos
279 1.1 christos def_em = getenv (EMULATION_ENVIRON);
280 1.1 christos if (!def_em)
281 1.1 christos def_em = DEFAULT_EMULATION;
282 1.1 christos fprintf (stream, _("\
283 1.1 christos emulate output (default %s)\n"), def_em);
284 1.1 christos }
285 1.1 christos #endif
286 1.1 christos #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
287 1.1 christos fprintf (stream, _("\
288 1.1 christos --execstack require executable stack for this object\n"));
289 1.1 christos fprintf (stream, _("\
290 1.1 christos --noexecstack don't require executable stack for this object\n"));
291 1.1 christos fprintf (stream, _("\
292 1.1 christos --size-check=[error|warning]\n\
293 1.3 christos ELF .size directive check (default --size-check=error)\n"));
294 1.7 christos fprintf (stream, _("\
295 1.7 christos --elf-stt-common=[no|yes] "));
296 1.7 christos if (DEFAULT_GENERATE_ELF_STT_COMMON)
297 1.7 christos fprintf (stream, _("(default: yes)\n"));
298 1.7 christos else
299 1.7 christos fprintf (stream, _("(default: no)\n"));
300 1.5 christos fprintf (stream, _("\
301 1.5 christos generate ELF common symbols with STT_COMMON type\n"));
302 1.3 christos fprintf (stream, _("\
303 1.6 christos --sectname-subst enable section name substitution sequences\n"));
304 1.6 christos
305 1.6 christos fprintf (stream, _("\
306 1.6 christos --generate-missing-build-notes=[no|yes] "));
307 1.6 christos #if DEFAULT_GENERATE_BUILD_NOTES
308 1.6 christos fprintf (stream, _("(default: yes)\n"));
309 1.6 christos #else
310 1.1 christos fprintf (stream, _("(default: no)\n"));
311 1.1 christos #endif
312 1.6 christos fprintf (stream, _("\
313 1.9 christos generate GNU Build notes if none are present in the input\n"));
314 1.10 christos fprintf (stream, _("\
315 1.10 christos --gsframe[={no|yes}] whether to generate SFrame stack trace information\n\
316 1.9 christos (default: no)\n"));
317 1.9 christos # if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN)
318 1.9 christos fprintf (stream, _("\
319 1.9 christos --scfi=experimental Synthesize DWARF CFI for hand-written asm\n\
320 1.9 christos (experimental support)\n"));
321 1.6 christos # endif
322 1.6 christos #endif /* OBJ_ELF */
323 1.6 christos
324 1.1 christos fprintf (stream, _("\
325 1.1 christos -f skip whitespace and comment preprocessing\n"));
326 1.10 christos fprintf (stream, _("\
327 1.1 christos -g, --gen-debug generate debugging information\n"));
328 1.1 christos fprintf (stream, _("\
329 1.1 christos --gstabs generate STABS debugging information\n"));
330 1.1 christos fprintf (stream, _("\
331 1.1 christos --gstabs+ generate STABS debug info with GNU extensions\n"));
332 1.8 christos fprintf (stream, _("\
333 1.1 christos --gdwarf-<N> generate DWARF<N> debugging information. 2 <= <N> <= 5\n"));
334 1.9 christos fprintf (stream, _("\
335 1.9 christos --gdwarf-cie-version=<N> generate version 1, 3 or 4 DWARF CIEs\n"));
336 1.3 christos fprintf (stream, _("\
337 1.9 christos --gdwarf-sections generate per-function section names for DWARF line information\n"));
338 1.9 christos #if defined (TE_PE) && defined (O_secrel)
339 1.9 christos fprintf (stream, _("\
340 1.9 christos --gcodeview generate CodeView debugging information\n"));
341 1.9 christos #endif
342 1.9 christos fprintf (stream, _("\
343 1.9 christos --hash-size=<N> ignored\n"));
344 1.9 christos fprintf (stream, _("\
345 1.3 christos --help show all assembler options\n"));
346 1.1 christos fprintf (stream, _("\
347 1.1 christos --target-help show target specific options\n"));
348 1.1 christos fprintf (stream, _("\
349 1.1 christos -I DIR add DIR to search list for .include directives\n"));
350 1.1 christos fprintf (stream, _("\
351 1.1 christos -J don't warn about signed overflow\n"));
352 1.1 christos fprintf (stream, _("\
353 1.1 christos -K warn when differences altered for long displacements\n"));
354 1.10 christos fprintf (stream, _("\
355 1.1 christos -L, --keep-locals keep local symbols (e.g. starting with `L')\n"));
356 1.10 christos fprintf (stream, _("\
357 1.1 christos -M, --mri assemble in MRI compatibility mode\n"));
358 1.1 christos fprintf (stream, _("\
359 1.1 christos --MD FILE write dependency information in FILE (default none)\n"));
360 1.9 christos fprintf (stream, _("\
361 1.9 christos --multibyte-handling=<method>\n\
362 1.9 christos what to do with multibyte characters encountered in the input\n"));
363 1.1 christos fprintf (stream, _("\
364 1.1 christos -nocpp ignored\n"));
365 1.5 christos fprintf (stream, _("\
366 1.5 christos -no-pad-sections do not pad the end of sections to alignment boundaries\n"));
367 1.1 christos fprintf (stream, _("\
368 1.1 christos -o OBJFILE name the object-file output OBJFILE (default a.out)\n"));
369 1.1 christos fprintf (stream, _("\
370 1.1 christos -R fold data section into text section\n"));
371 1.9 christos fprintf (stream, _("\
372 1.9 christos --reduce-memory-overheads ignored\n"));
373 1.1 christos fprintf (stream, _("\
374 1.1 christos --statistics print various measured statistics from execution\n"));
375 1.1 christos fprintf (stream, _("\
376 1.1 christos --strip-local-absolute strip local absolute symbols\n"));
377 1.1 christos fprintf (stream, _("\
378 1.1 christos --traditional-format Use same format as native assembler when possible\n"));
379 1.1 christos fprintf (stream, _("\
380 1.1 christos --version print assembler version number and exit\n"));
381 1.10 christos fprintf (stream, _("\
382 1.1 christos -W, --no-warn suppress warnings\n"));
383 1.1 christos fprintf (stream, _("\
384 1.1 christos --warn don't suppress warnings\n"));
385 1.1 christos fprintf (stream, _("\
386 1.10 christos --fatal-warnings treat warnings as errors\n"));
387 1.10 christos fprintf (stream, _("\
388 1.10 christos --no-info suppress information messages\n"));
389 1.10 christos fprintf (stream, _("\
390 1.1 christos --info don't suppress information messages\n"));
391 1.1 christos #ifdef HAVE_ITBL_CPU
392 1.1 christos fprintf (stream, _("\
393 1.1 christos --itbl INSTTBL extend instruction set to include instructions\n\
394 1.1 christos matching the specifications defined in file INSTTBL\n"));
395 1.1 christos #endif
396 1.1 christos fprintf (stream, _("\
397 1.1 christos -w ignored\n"));
398 1.1 christos fprintf (stream, _("\
399 1.1 christos -X ignored\n"));
400 1.1 christos fprintf (stream, _("\
401 1.1 christos -Z generate object file even after errors\n"));
402 1.1 christos fprintf (stream, _("\
403 1.1 christos --listing-lhs-width set the width in words of the output data column of\n\
404 1.1 christos the listing\n"));
405 1.1 christos fprintf (stream, _("\
406 1.1 christos --listing-lhs-width2 set the width in words of the continuation lines\n\
407 1.1 christos of the output data column; ignored if smaller than\n\
408 1.1 christos the width of the first line\n"));
409 1.1 christos fprintf (stream, _("\
410 1.1 christos --listing-rhs-width set the max width in characters of the lines from\n\
411 1.1 christos the source file\n"));
412 1.1 christos fprintf (stream, _("\
413 1.1 christos --listing-cont-lines set the maximum number of continuation lines used\n\
414 1.1 christos for the output data column of the listing\n"));
415 1.3 christos fprintf (stream, _("\
416 1.1 christos @FILE read options from FILE\n"));
417 1.1 christos
418 1.1 christos md_show_usage (stream);
419 1.1 christos
420 1.1 christos fputc ('\n', stream);
421 1.1 christos
422 1.1 christos if (REPORT_BUGS_TO[0] && stream == stdout)
423 1.1 christos fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
424 1.1 christos }
425 1.1 christos
426 1.1 christos /* Since it is easy to do here we interpret the special arg "-"
427 1.1 christos to mean "use stdin" and we set that argv[] pointing to "".
428 1.1 christos After we have munged argv[], the only things left are source file
429 1.1 christos name(s) and ""(s) denoting stdin. These file names are used
430 1.1 christos (perhaps more than once) later.
431 1.1 christos
432 1.1 christos check for new machine-dep cmdline options in
433 1.1 christos md_parse_option definitions in config/tc-*.c. */
434 1.1 christos
435 1.1 christos static void
436 1.1 christos parse_args (int * pargc, char *** pargv)
437 1.1 christos {
438 1.1 christos int old_argc;
439 1.1 christos int new_argc;
440 1.1 christos char ** old_argv;
441 1.1 christos char ** new_argv;
442 1.1 christos /* Starting the short option string with '-' is for programs that
443 1.1 christos expect options and other ARGV-elements in any order and that care about
444 1.1 christos the ordering of the two. We describe each non-option ARGV-element
445 1.1 christos as if it were the argument of an option with character code 1. */
446 1.1 christos char *shortopts;
447 1.1 christos static const char std_shortopts[] =
448 1.1 christos {
449 1.1 christos '-', 'J',
450 1.1 christos #ifndef WORKING_DOT_WORD
451 1.1 christos /* -K is not meaningful if .word is not being hacked. */
452 1.1 christos 'K',
453 1.10 christos #endif
454 1.10 christos 'L', 'M', 'R', 'W', 'Z', 'a', ':', ':', 'D', 'f', 'g', ':',':', 'I', ':',
455 1.1 christos 'o', ':', 'v', 'w', 'X',
456 1.1 christos #ifdef HAVE_ITBL_CPU
457 1.1 christos /* New option for extending instruction set (see also --itbl below). */
458 1.1 christos 't', ':',
459 1.1 christos #endif
460 1.1 christos '\0'
461 1.1 christos };
462 1.1 christos struct option *longopts;
463 1.1 christos /* Codes used for the long options with no short synonyms. */
464 1.1 christos enum option_values
465 1.1 christos {
466 1.1 christos OPTION_HELP = OPTION_STD_BASE,
467 1.1 christos OPTION_NOCPP,
468 1.1 christos OPTION_STATISTICS,
469 1.1 christos OPTION_VERSION,
470 1.1 christos OPTION_DUMPCONFIG,
471 1.1 christos OPTION_EMULATION,
472 1.1 christos OPTION_DEBUG_PREFIX_MAP,
473 1.10 christos OPTION_DEFSYM,
474 1.1 christos #ifndef NO_LISTING
475 1.8 christos OPTION_LISTING_LHS_WIDTH,
476 1.1 christos OPTION_LISTING_LHS_WIDTH2, /* = STD_BASE + 10 */
477 1.1 christos OPTION_LISTING_RHS_WIDTH,
478 1.10 christos OPTION_LISTING_CONT_LINES,
479 1.1 christos #endif
480 1.1 christos OPTION_DEPFILE,
481 1.1 christos OPTION_GSTABS,
482 1.8 christos OPTION_GSTABS_PLUS,
483 1.8 christos OPTION_GDWARF_2,
484 1.8 christos OPTION_GDWARF_3,
485 1.8 christos OPTION_GDWARF_4,
486 1.8 christos OPTION_GDWARF_5,
487 1.7 christos OPTION_GDWARF_SECTIONS, /* = STD_BASE + 20 */
488 1.9 christos OPTION_GDWARF_CIE_VERSION,
489 1.1 christos OPTION_GCODEVIEW,
490 1.10 christos OPTION_STRIP_LOCAL_ABSOLUTE,
491 1.1 christos OPTION_EMIT_LOCAL_ABSOLUTE,
492 1.1 christos OPTION_TRADITIONAL_FORMAT,
493 1.1 christos OPTION_WARN,
494 1.1 christos OPTION_TARGET_HELP,
495 1.1 christos OPTION_EXECSTACK,
496 1.1 christos OPTION_NOEXECSTACK,
497 1.5 christos OPTION_SIZE_CHECK,
498 1.8 christos OPTION_ELF_STT_COMMON,
499 1.3 christos OPTION_ELF_BUILD_NOTES, /* = STD_BASE + 30 */
500 1.1 christos OPTION_SECTNAME_SUBST,
501 1.1 christos OPTION_ALTERNATE,
502 1.1 christos OPTION_AL,
503 1.1 christos OPTION_HASH_TABLE_SIZE,
504 1.1 christos OPTION_REDUCE_MEMORY_OVERHEADS,
505 1.1 christos OPTION_WARN_FATAL,
506 1.5 christos OPTION_COMPRESS_DEBUG,
507 1.8 christos OPTION_NOCOMPRESS_DEBUG,
508 1.9 christos OPTION_NO_PAD_SECTIONS,
509 1.9 christos OPTION_MULTIBYTE_HANDLING, /* = STD_BASE + 40 */
510 1.10 christos OPTION_SFRAME,
511 1.10 christos OPTION_SCFI,
512 1.10 christos OPTION_INFO,
513 1.1 christos OPTION_NOINFO
514 1.1 christos /* When you add options here, check that they do
515 1.1 christos not collide with OPTION_MD_BASE. See as.h. */
516 1.3 christos };
517 1.1 christos
518 1.1 christos static const struct option std_longopts[] =
519 1.1 christos {
520 1.1 christos /* Note: commas are placed at the start of the line rather than
521 1.1 christos the end of the preceding line so that it is simpler to
522 1.1 christos selectively add and remove lines from this list. */
523 1.1 christos {"alternate", no_argument, NULL, OPTION_ALTERNATE}
524 1.1 christos /* The entry for "a" is here to prevent getopt_long_only() from
525 1.1 christos considering that -a is an abbreviation for --alternate. This is
526 1.1 christos necessary because -a=<FILE> is a valid switch but getopt would
527 1.1 christos normally reject it since --alternate does not take an argument. */
528 1.1 christos ,{"a", optional_argument, NULL, 'a'}
529 1.1 christos /* Handle -al=<FILE>. */
530 1.3 christos ,{"al", optional_argument, NULL, OPTION_AL}
531 1.1 christos ,{"compress-debug-sections", optional_argument, NULL, OPTION_COMPRESS_DEBUG}
532 1.1 christos ,{"nocompress-debug-sections", no_argument, NULL, OPTION_NOCOMPRESS_DEBUG}
533 1.1 christos ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP}
534 1.1 christos ,{"defsym", required_argument, NULL, OPTION_DEFSYM}
535 1.1 christos ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}
536 1.1 christos ,{"emulation", required_argument, NULL, OPTION_EMULATION}
537 1.1 christos #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
538 1.1 christos ,{"execstack", no_argument, NULL, OPTION_EXECSTACK}
539 1.1 christos ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK}
540 1.5 christos ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK}
541 1.3 christos ,{"elf-stt-common", required_argument, NULL, OPTION_ELF_STT_COMMON}
542 1.6 christos ,{"sectname-subst", no_argument, NULL, OPTION_SECTNAME_SUBST}
543 1.10 christos ,{"generate-missing-build-notes", required_argument, NULL, OPTION_ELF_BUILD_NOTES}
544 1.9 christos ,{"gsframe", optional_argument, NULL, OPTION_SFRAME}
545 1.9 christos # if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN)
546 1.9 christos ,{"scfi", required_argument, NULL, OPTION_SCFI}
547 1.9 christos # endif
548 1.1 christos #endif /* OBJ_ELF || OBJ_MAYBE_ELF. */
549 1.8 christos ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
550 1.8 christos ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF_2}
551 1.8 christos ,{"gdwarf-3", no_argument, NULL, OPTION_GDWARF_3}
552 1.8 christos ,{"gdwarf-4", no_argument, NULL, OPTION_GDWARF_4}
553 1.8 christos ,{"gdwarf-5", no_argument, NULL, OPTION_GDWARF_5}
554 1.1 christos /* GCC uses --gdwarf-2 but GAS used to to use --gdwarf2,
555 1.8 christos so we keep it here for backwards compatibility. */
556 1.3 christos ,{"gdwarf2", no_argument, NULL, OPTION_GDWARF_2}
557 1.7 christos ,{"gdwarf-sections", no_argument, NULL, OPTION_GDWARF_SECTIONS}
558 1.9 christos ,{"gdwarf-cie-version", required_argument, NULL, OPTION_GDWARF_CIE_VERSION}
559 1.9 christos #if defined (TE_PE) && defined (O_secrel)
560 1.9 christos ,{"gcodeview", no_argument, NULL, OPTION_GCODEVIEW}
561 1.1 christos #endif
562 1.1 christos ,{"gen-debug", no_argument, NULL, 'g'}
563 1.1 christos ,{"gstabs", no_argument, NULL, OPTION_GSTABS}
564 1.1 christos ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS}
565 1.1 christos ,{"hash-size", required_argument, NULL, OPTION_HASH_TABLE_SIZE}
566 1.1 christos ,{"help", no_argument, NULL, OPTION_HELP}
567 1.1 christos #ifdef HAVE_ITBL_CPU
568 1.1 christos /* New option for extending instruction set (see also -t above).
569 1.1 christos The "-t file" or "--itbl file" option extends the basic set of
570 1.1 christos valid instructions by reading "file", a text file containing a
571 1.1 christos list of instruction formats. The additional opcodes and their
572 1.1 christos formats are added to the built-in set of instructions, and
573 1.1 christos mnemonics for new registers may also be defined. */
574 1.1 christos ,{"itbl", required_argument, NULL, 't'}
575 1.1 christos #endif
576 1.1 christos /* getopt allows abbreviations, so we do this to stop it from
577 1.1 christos treating -k as an abbreviation for --keep-locals. Some
578 1.1 christos ports use -k to enable PIC assembly. */
579 1.1 christos ,{"keep-locals", no_argument, NULL, 'L'}
580 1.10 christos ,{"keep-locals", no_argument, NULL, 'L'}
581 1.1 christos #ifndef NO_LISTING
582 1.1 christos ,{"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH}
583 1.1 christos ,{"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2}
584 1.1 christos ,{"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH}
585 1.10 christos ,{"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES}
586 1.1 christos #endif
587 1.1 christos ,{"MD", required_argument, NULL, OPTION_DEPFILE}
588 1.1 christos ,{"mri", no_argument, NULL, 'M'}
589 1.5 christos ,{"nocpp", no_argument, NULL, OPTION_NOCPP}
590 1.10 christos ,{"no-pad-sections", no_argument, NULL, OPTION_NO_PAD_SECTIONS}
591 1.1 christos ,{"no-info", no_argument, NULL, OPTION_NOINFO}
592 1.1 christos ,{"no-warn", no_argument, NULL, 'W'}
593 1.1 christos ,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS}
594 1.1 christos ,{"statistics", no_argument, NULL, OPTION_STATISTICS}
595 1.10 christos ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE}
596 1.1 christos ,{"emit-local-absolute", no_argument, NULL, OPTION_EMIT_LOCAL_ABSOLUTE}
597 1.10 christos ,{"version", no_argument, NULL, OPTION_VERSION}
598 1.1 christos ,{"verbose", no_argument, NULL, 'v'}
599 1.1 christos ,{"target-help", no_argument, NULL, OPTION_TARGET_HELP}
600 1.10 christos ,{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}
601 1.1 christos ,{"info", no_argument, NULL, OPTION_INFO}
602 1.8 christos ,{"warn", no_argument, NULL, OPTION_WARN}
603 1.1 christos ,{"multibyte-handling", required_argument, NULL, OPTION_MULTIBYTE_HANDLING}
604 1.1 christos };
605 1.1 christos
606 1.1 christos /* Construct the option lists from the standard list and the target
607 1.1 christos dependent list. Include space for an extra NULL option and
608 1.1 christos always NULL terminate. */
609 1.1 christos shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
610 1.1 christos longopts = (struct option *) xmalloc (sizeof (std_longopts)
611 1.1 christos + md_longopts_size + sizeof (struct option));
612 1.1 christos memcpy (longopts, std_longopts, sizeof (std_longopts));
613 1.1 christos memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size);
614 1.1 christos memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size,
615 1.1 christos 0, sizeof (struct option));
616 1.1 christos
617 1.1 christos /* Make a local copy of the old argv. */
618 1.1 christos old_argc = *pargc;
619 1.1 christos old_argv = *pargv;
620 1.1 christos
621 1.9 christos /* Initialize a new argv that contains no options. */
622 1.1 christos new_argv = notes_alloc (sizeof (char *) * (old_argc + 1));
623 1.1 christos new_argv[0] = old_argv[0];
624 1.1 christos new_argc = 1;
625 1.1 christos new_argv[new_argc] = NULL;
626 1.1 christos
627 1.1 christos while (1)
628 1.1 christos {
629 1.1 christos /* getopt_long_only is like getopt_long, but '-' as well as '--' can
630 1.1 christos indicate a long option. */
631 1.1 christos int longind;
632 1.1 christos int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts,
633 1.1 christos &longind);
634 1.1 christos
635 1.1 christos if (optc == -1)
636 1.1 christos break;
637 1.1 christos
638 1.1 christos switch (optc)
639 1.1 christos {
640 1.1 christos default:
641 1.1 christos /* md_parse_option should return 1 if it recognizes optc,
642 1.1 christos 0 if not. */
643 1.1 christos if (md_parse_option (optc, optarg) != 0)
644 1.1 christos break;
645 1.1 christos /* `-v' isn't included in the general short_opts list, so check for
646 1.1 christos it explicitly here before deciding we've gotten a bad argument. */
647 1.1 christos if (optc == 'v')
648 1.10 christos {
649 1.10 christos case 'v':
650 1.10 christos print_version_id ();
651 1.1 christos verbose = 1;
652 1.1 christos break;
653 1.10 christos }
654 1.10 christos else if (is_a_char (optc))
655 1.10 christos as_bad (_("unrecognized option `-%c%s'"), optc, optarg ? optarg : "");
656 1.10 christos else if (optarg)
657 1.1 christos as_bad (_("unrecognized option `--%s=%s'"), longopts[longind].name, optarg);
658 1.10 christos else
659 1.1 christos as_bad (_("unrecognized option `--%s'"), longopts[longind].name);
660 1.1 christos /* Fall through. */
661 1.1 christos
662 1.1 christos case '?':
663 1.1 christos exit (EXIT_FAILURE);
664 1.1 christos
665 1.1 christos case 1: /* File name. */
666 1.5 christos if (!strcmp (optarg, "-"))
667 1.1 christos optarg = (char *) "";
668 1.1 christos new_argv[new_argc++] = optarg;
669 1.1 christos new_argv[new_argc] = NULL;
670 1.1 christos break;
671 1.1 christos
672 1.1 christos case OPTION_TARGET_HELP:
673 1.1 christos md_show_usage (stdout);
674 1.1 christos exit (EXIT_SUCCESS);
675 1.1 christos
676 1.1 christos case OPTION_HELP:
677 1.1 christos show_usage (stdout);
678 1.1 christos exit (EXIT_SUCCESS);
679 1.1 christos
680 1.1 christos case OPTION_NOCPP:
681 1.1 christos break;
682 1.5 christos
683 1.5 christos case OPTION_NO_PAD_SECTIONS:
684 1.5 christos do_not_pad_sections_to_alignment = 1;
685 1.5 christos break;
686 1.1 christos
687 1.1 christos case OPTION_STATISTICS:
688 1.1 christos flag_print_statistics = 1;
689 1.1 christos break;
690 1.1 christos
691 1.1 christos case OPTION_STRIP_LOCAL_ABSOLUTE:
692 1.1 christos flag_strip_local_absolute = 1;
693 1.1 christos break;
694 1.10 christos
695 1.10 christos case OPTION_EMIT_LOCAL_ABSOLUTE:
696 1.10 christos flag_strip_local_absolute = -1;
697 1.10 christos break;
698 1.1 christos
699 1.1 christos case OPTION_TRADITIONAL_FORMAT:
700 1.1 christos flag_traditional_format = 1;
701 1.1 christos break;
702 1.8 christos
703 1.8 christos case OPTION_MULTIBYTE_HANDLING:
704 1.8 christos if (strcmp (optarg, "allow") == 0)
705 1.8 christos multibyte_handling = multibyte_allow;
706 1.8 christos else if (strcmp (optarg, "warn") == 0)
707 1.8 christos multibyte_handling = multibyte_warn;
708 1.8 christos else if (strcmp (optarg, "warn-sym-only") == 0)
709 1.8 christos multibyte_handling = multibyte_warn_syms;
710 1.8 christos else if (strcmp (optarg, "warn_sym_only") == 0)
711 1.8 christos multibyte_handling = multibyte_warn_syms;
712 1.8 christos else
713 1.8 christos as_fatal (_("unexpected argument to --multibyte-input-option: '%s'"), optarg);
714 1.8 christos break;
715 1.1 christos
716 1.1 christos case OPTION_VERSION:
717 1.1 christos /* This output is intended to follow the GNU standards document. */
718 1.10 christos printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
719 1.1 christos printf (_("Copyright (C) 2025 Free Software Foundation, Inc.\n"));
720 1.1 christos printf (_("\
721 1.1 christos This program is free software; you may redistribute it under the terms of\n\
722 1.1 christos the GNU General Public License version 3 or later.\n\
723 1.5 christos This program has absolutely no warranty.\n"));
724 1.5 christos #ifdef TARGET_WITH_CPU
725 1.5 christos printf (_("This assembler was configured for a target of `%s' "
726 1.5 christos "and default,\ncpu type `%s'.\n"),
727 1.5 christos TARGET_ALIAS, TARGET_WITH_CPU);
728 1.1 christos #else
729 1.1 christos printf (_("This assembler was configured for a target of `%s'.\n"),
730 1.5 christos TARGET_ALIAS);
731 1.1 christos #endif
732 1.1 christos exit (EXIT_SUCCESS);
733 1.1 christos
734 1.1 christos case OPTION_EMULATION:
735 1.1 christos #ifdef USE_EMULATIONS
736 1.1 christos if (strcmp (optarg, this_emulation->name))
737 1.1 christos as_fatal (_("multiple emulation names specified"));
738 1.1 christos #else
739 1.1 christos as_fatal (_("emulations not handled in this configuration"));
740 1.1 christos #endif
741 1.1 christos break;
742 1.1 christos
743 1.1 christos case OPTION_DUMPCONFIG:
744 1.1 christos fprintf (stderr, _("alias = %s\n"), TARGET_ALIAS);
745 1.1 christos fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL);
746 1.1 christos fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU);
747 1.1 christos #ifdef TARGET_OBJ_FORMAT
748 1.1 christos fprintf (stderr, _("format = %s\n"), TARGET_OBJ_FORMAT);
749 1.1 christos #endif
750 1.1 christos #ifdef TARGET_FORMAT
751 1.1 christos fprintf (stderr, _("bfd-target = %s\n"), TARGET_FORMAT);
752 1.1 christos #endif
753 1.1 christos exit (EXIT_SUCCESS);
754 1.1 christos
755 1.3 christos case OPTION_COMPRESS_DEBUG:
756 1.3 christos if (optarg)
757 1.3 christos {
758 1.9 christos #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
759 1.9 christos flag_compress_debug = bfd_get_compression_algorithm (optarg);
760 1.9 christos #ifndef HAVE_ZSTD
761 1.9 christos if (flag_compress_debug == COMPRESS_DEBUG_ZSTD)
762 1.9 christos as_fatal (_ ("--compress-debug-sections=zstd: gas is not "
763 1.9 christos "built with zstd support"));
764 1.9 christos #endif
765 1.3 christos if (flag_compress_debug == COMPRESS_UNKNOWN)
766 1.3 christos as_fatal (_("Invalid --compress-debug-sections option: `%s'"),
767 1.1 christos optarg);
768 1.3 christos #else
769 1.3 christos as_fatal (_("--compress-debug-sections=%s is unsupported"),
770 1.3 christos optarg);
771 1.3 christos #endif
772 1.3 christos }
773 1.9 christos else
774 1.1 christos flag_compress_debug = DEFAULT_COMPRESSED_DEBUG_ALGORITHM;
775 1.1 christos break;
776 1.1 christos
777 1.3 christos case OPTION_NOCOMPRESS_DEBUG:
778 1.1 christos flag_compress_debug = COMPRESS_DEBUG_NONE;
779 1.1 christos break;
780 1.1 christos
781 1.1 christos case OPTION_DEBUG_PREFIX_MAP:
782 1.1 christos add_debug_prefix_map (optarg);
783 1.1 christos break;
784 1.1 christos
785 1.1 christos case OPTION_DEFSYM:
786 1.1 christos {
787 1.1 christos char *s;
788 1.1 christos valueT i;
789 1.1 christos struct defsym_list *n;
790 1.1 christos
791 1.1 christos for (s = optarg; *s != '\0' && *s != '='; s++)
792 1.1 christos ;
793 1.1 christos if (*s == '\0')
794 1.1 christos as_fatal (_("bad defsym; format is --defsym name=value"));
795 1.10 christos *s++ = '\0';
796 1.5 christos i = bfd_scan_vma (s, NULL, 0);
797 1.1 christos n = XNEW (struct defsym_list);
798 1.1 christos n->next = defsyms;
799 1.1 christos n->name = optarg;
800 1.1 christos n->value = i;
801 1.1 christos defsyms = n;
802 1.1 christos }
803 1.1 christos break;
804 1.1 christos
805 1.1 christos #ifdef HAVE_ITBL_CPU
806 1.1 christos case 't':
807 1.1 christos {
808 1.1 christos /* optarg is the name of the file containing the instruction
809 1.1 christos formats, opcodes, register names, etc. */
810 1.1 christos if (optarg == NULL)
811 1.1 christos {
812 1.1 christos as_warn (_("no file name following -t option"));
813 1.1 christos break;
814 1.1 christos }
815 1.1 christos
816 1.1 christos /* Parse the file and add the new instructions to our internal
817 1.1 christos table. If multiple instruction tables are specified, the
818 1.1 christos information from this table gets appended onto the existing
819 1.9 christos internal table. */
820 1.1 christos if (itbl_parse (optarg) != 0)
821 1.9 christos as_fatal (_("failed to read instruction table %s\n"),
822 1.1 christos optarg);
823 1.1 christos }
824 1.1 christos break;
825 1.1 christos #endif
826 1.1 christos
827 1.1 christos case OPTION_DEPFILE:
828 1.1 christos start_dependencies (optarg);
829 1.1 christos break;
830 1.1 christos
831 1.1 christos case 'g':
832 1.1 christos /* Some backends, eg Alpha and Mips, use the -g switch for their
833 1.1 christos own purposes. So we check here for an explicit -g and allow
834 1.1 christos the backend to decide if it wants to process it. */
835 1.1 christos if ( old_argv[optind - 1][1] == 'g'
836 1.1 christos && md_parse_option (optc, optarg))
837 1.1 christos continue;
838 1.8 christos
839 1.8 christos /* We end up here for any -gsomething-not-already-a-long-option.
840 1.8 christos give some useful feedback on not (yet) supported -gdwarfxxx
841 1.8 christos versions/sections/options. */
842 1.8 christos if (startswith (old_argv[optind - 1], "-gdwarf"))
843 1.8 christos as_fatal (_("unknown DWARF option %s\n"), old_argv[optind - 1]);
844 1.8 christos else if (old_argv[optind - 1][1] == 'g' && optarg != NULL)
845 1.8 christos as_fatal (_("unknown option `%s'"), old_argv[optind - 1]);
846 1.1 christos
847 1.1 christos if (md_debug_format_selector)
848 1.1 christos debug_type = md_debug_format_selector (& use_gnu_debug_info_extensions);
849 1.8 christos else if (IS_ELF)
850 1.8 christos {
851 1.8 christos debug_type = DEBUG_DWARF2;
852 1.8 christos dwarf_level = 2;
853 1.1 christos }
854 1.1 christos else
855 1.1 christos debug_type = DEBUG_STABS;
856 1.1 christos break;
857 1.1 christos
858 1.1 christos case OPTION_GSTABS_PLUS:
859 1.1 christos use_gnu_debug_info_extensions = 1;
860 1.1 christos /* Fall through. */
861 1.1 christos case OPTION_GSTABS:
862 1.1 christos debug_type = DEBUG_STABS;
863 1.1 christos break;
864 1.8 christos
865 1.8 christos case OPTION_GDWARF_2:
866 1.8 christos debug_type = DEBUG_DWARF2;
867 1.8 christos dwarf_level = 2;
868 1.8 christos break;
869 1.8 christos
870 1.8 christos case OPTION_GDWARF_3:
871 1.8 christos debug_type = DEBUG_DWARF2;
872 1.8 christos dwarf_level = 3;
873 1.8 christos break;
874 1.8 christos
875 1.8 christos case OPTION_GDWARF_4:
876 1.8 christos debug_type = DEBUG_DWARF2;
877 1.8 christos dwarf_level = 4;
878 1.8 christos break;
879 1.8 christos
880 1.1 christos case OPTION_GDWARF_5:
881 1.8 christos debug_type = DEBUG_DWARF2;
882 1.1 christos dwarf_level = 5;
883 1.1 christos break;
884 1.3 christos
885 1.8 christos case OPTION_GDWARF_SECTIONS:
886 1.3 christos flag_dwarf_sections = true;
887 1.3 christos break;
888 1.9 christos
889 1.9 christos #if defined (TE_PE) && defined (O_secrel)
890 1.9 christos case OPTION_GCODEVIEW:
891 1.9 christos debug_type = DEBUG_CODEVIEW;
892 1.9 christos break;
893 1.9 christos #endif
894 1.7 christos
895 1.7 christos case OPTION_GDWARF_CIE_VERSION:
896 1.7 christos flag_dwarf_cie_version = atoi (optarg);
897 1.7 christos /* The available CIE versions are 1 (DWARF 2), 3 (DWARF 3), and 4
898 1.7 christos (DWARF 4 and 5). */
899 1.7 christos if (flag_dwarf_cie_version < 1
900 1.7 christos || flag_dwarf_cie_version == 2
901 1.7 christos || flag_dwarf_cie_version > 4)
902 1.8 christos as_fatal (_("Invalid --gdwarf-cie-version `%s'"), optarg);
903 1.8 christos switch (flag_dwarf_cie_version)
904 1.8 christos {
905 1.8 christos case 1:
906 1.8 christos if (dwarf_level < 2)
907 1.8 christos dwarf_level = 2;
908 1.8 christos break;
909 1.8 christos case 3:
910 1.8 christos if (dwarf_level < 3)
911 1.8 christos dwarf_level = 3;
912 1.8 christos break;
913 1.8 christos default:
914 1.8 christos if (dwarf_level < 4)
915 1.8 christos dwarf_level = 4;
916 1.8 christos break;
917 1.7 christos }
918 1.7 christos break;
919 1.1 christos
920 1.1 christos case 'J':
921 1.1 christos flag_signed_overflow_ok = 1;
922 1.1 christos break;
923 1.1 christos
924 1.1 christos #ifndef WORKING_DOT_WORD
925 1.1 christos case 'K':
926 1.1 christos flag_warn_displacement = 1;
927 1.1 christos break;
928 1.1 christos #endif
929 1.1 christos case 'L':
930 1.1 christos flag_keep_locals = 1;
931 1.1 christos break;
932 1.10 christos
933 1.1 christos #ifndef NO_LISTING
934 1.1 christos case OPTION_LISTING_LHS_WIDTH:
935 1.1 christos listing_lhs_width = atoi (optarg);
936 1.1 christos if (listing_lhs_width_second < listing_lhs_width)
937 1.1 christos listing_lhs_width_second = listing_lhs_width;
938 1.1 christos break;
939 1.1 christos case OPTION_LISTING_LHS_WIDTH2:
940 1.10 christos {
941 1.1 christos unsigned int tmp = atoi (optarg);
942 1.1 christos
943 1.1 christos if (tmp > listing_lhs_width)
944 1.1 christos listing_lhs_width_second = tmp;
945 1.1 christos }
946 1.1 christos break;
947 1.1 christos case OPTION_LISTING_RHS_WIDTH:
948 1.1 christos listing_rhs_width = atoi (optarg);
949 1.1 christos break;
950 1.1 christos case OPTION_LISTING_CONT_LINES:
951 1.1 christos listing_lhs_cont_lines = atoi (optarg);
952 1.10 christos break;
953 1.1 christos #endif /* NO_LISTING */
954 1.1 christos
955 1.1 christos case 'M':
956 1.1 christos flag_mri = 1;
957 1.1 christos #ifdef TC_M68K
958 1.1 christos flag_m68k_mri = 1;
959 1.1 christos #endif
960 1.1 christos break;
961 1.1 christos
962 1.1 christos case 'R':
963 1.1 christos flag_readonly_data_in_text = 1;
964 1.1 christos break;
965 1.1 christos
966 1.1 christos case 'W':
967 1.1 christos flag_no_warnings = 1;
968 1.1 christos break;
969 1.1 christos
970 1.1 christos case OPTION_WARN:
971 1.1 christos flag_no_warnings = 0;
972 1.1 christos flag_fatal_warnings = 0;
973 1.1 christos break;
974 1.1 christos
975 1.1 christos case OPTION_WARN_FATAL:
976 1.1 christos flag_no_warnings = 0;
977 1.1 christos flag_fatal_warnings = 1;
978 1.1 christos break;
979 1.10 christos
980 1.10 christos case OPTION_NOINFO:
981 1.10 christos flag_no_information = true;
982 1.10 christos break;
983 1.10 christos
984 1.10 christos case OPTION_INFO:
985 1.10 christos flag_no_information = false;
986 1.10 christos break;
987 1.1 christos
988 1.1 christos #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
989 1.1 christos case OPTION_EXECSTACK:
990 1.1 christos flag_execstack = 1;
991 1.1 christos flag_noexecstack = 0;
992 1.1 christos break;
993 1.1 christos
994 1.1 christos case OPTION_NOEXECSTACK:
995 1.1 christos flag_noexecstack = 1;
996 1.1 christos flag_execstack = 0;
997 1.1 christos break;
998 1.9 christos
999 1.9 christos # if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN)
1000 1.9 christos case OPTION_SCFI:
1001 1.9 christos if (optarg && strcasecmp (optarg, "experimental") == 0)
1002 1.9 christos flag_synth_cfi = SYNTH_CFI_EXPERIMENTAL;
1003 1.9 christos else
1004 1.9 christos as_fatal (_("Invalid --scfi= option: `%s'; suggested option: experimental"),
1005 1.9 christos optarg);
1006 1.9 christos break;
1007 1.9 christos # endif
1008 1.1 christos
1009 1.1 christos case OPTION_SIZE_CHECK:
1010 1.8 christos if (strcasecmp (optarg, "error") == 0)
1011 1.1 christos flag_allow_nonconst_size = false;
1012 1.8 christos else if (strcasecmp (optarg, "warning") == 0)
1013 1.1 christos flag_allow_nonconst_size = true;
1014 1.1 christos else
1015 1.1 christos as_fatal (_("Invalid --size-check= option: `%s'"), optarg);
1016 1.3 christos break;
1017 1.5 christos
1018 1.5 christos case OPTION_ELF_STT_COMMON:
1019 1.5 christos if (strcasecmp (optarg, "no") == 0)
1020 1.5 christos flag_use_elf_stt_common = 0;
1021 1.5 christos else if (strcasecmp (optarg, "yes") == 0)
1022 1.5 christos flag_use_elf_stt_common = 1;
1023 1.5 christos else
1024 1.5 christos as_fatal (_("Invalid --elf-stt-common= option: `%s'"),
1025 1.5 christos optarg);
1026 1.5 christos break;
1027 1.3 christos
1028 1.3 christos case OPTION_SECTNAME_SUBST:
1029 1.3 christos flag_sectname_subst = 1;
1030 1.6 christos break;
1031 1.6 christos
1032 1.6 christos case OPTION_ELF_BUILD_NOTES:
1033 1.8 christos if (strcasecmp (optarg, "no") == 0)
1034 1.6 christos flag_generate_build_notes = false;
1035 1.8 christos else if (strcasecmp (optarg, "yes") == 0)
1036 1.6 christos flag_generate_build_notes = true;
1037 1.6 christos else
1038 1.6 christos as_fatal (_("Invalid --generate-missing-build-notes option: `%s'"),
1039 1.6 christos optarg);
1040 1.6 christos break;
1041 1.9 christos
1042 1.10 christos case OPTION_SFRAME:
1043 1.10 christos if (optarg)
1044 1.10 christos {
1045 1.10 christos if (strcasecmp (optarg, "no") == 0)
1046 1.10 christos flag_gen_sframe = GEN_SFRAME_DISABLED;
1047 1.10 christos else if (strcasecmp (optarg, "yes") == 0)
1048 1.10 christos flag_gen_sframe = GEN_SFRAME_ENABLED;
1049 1.10 christos else
1050 1.10 christos as_fatal (_("Invalid --gsframe option: `%s'"), optarg);
1051 1.10 christos }
1052 1.10 christos else
1053 1.9 christos flag_gen_sframe = GEN_SFRAME_ENABLED;
1054 1.9 christos break;
1055 1.6 christos
1056 1.6 christos #endif /* OBJ_ELF */
1057 1.1 christos
1058 1.1 christos case 'Z':
1059 1.1 christos flag_always_generate_output = 1;
1060 1.1 christos break;
1061 1.1 christos
1062 1.1 christos case OPTION_AL:
1063 1.1 christos listing |= LISTING_LISTING;
1064 1.9 christos if (optarg)
1065 1.1 christos listing_filename = notes_strdup (optarg);
1066 1.1 christos break;
1067 1.1 christos
1068 1.1 christos case OPTION_ALTERNATE:
1069 1.1 christos optarg = old_argv [optind - 1];
1070 1.1 christos while (* optarg == '-')
1071 1.1 christos optarg ++;
1072 1.1 christos
1073 1.1 christos if (strcmp (optarg, "alternate") == 0)
1074 1.1 christos {
1075 1.1 christos flag_macro_alternate = 1;
1076 1.1 christos break;
1077 1.1 christos }
1078 1.1 christos optarg ++;
1079 1.1 christos /* Fall through. */
1080 1.1 christos
1081 1.1 christos case 'a':
1082 1.1 christos if (optarg)
1083 1.1 christos {
1084 1.1 christos if (optarg != old_argv[optind] && optarg[-1] == '=')
1085 1.1 christos --optarg;
1086 1.1 christos
1087 1.1 christos if (md_parse_option (optc, optarg) != 0)
1088 1.1 christos break;
1089 1.1 christos
1090 1.1 christos while (*optarg)
1091 1.1 christos {
1092 1.1 christos switch (*optarg)
1093 1.1 christos {
1094 1.1 christos case 'c':
1095 1.1 christos listing |= LISTING_NOCOND;
1096 1.1 christos break;
1097 1.1 christos case 'd':
1098 1.1 christos listing |= LISTING_NODEBUG;
1099 1.1 christos break;
1100 1.1 christos case 'g':
1101 1.1 christos listing |= LISTING_GENERAL;
1102 1.1 christos break;
1103 1.1 christos case 'h':
1104 1.1 christos listing |= LISTING_HLL;
1105 1.9 christos break;
1106 1.9 christos case 'i':
1107 1.9 christos listing |= LISTING_GINSN_SCFI;
1108 1.1 christos break;
1109 1.1 christos case 'l':
1110 1.1 christos listing |= LISTING_LISTING;
1111 1.1 christos break;
1112 1.1 christos case 'm':
1113 1.1 christos listing |= LISTING_MACEXP;
1114 1.1 christos break;
1115 1.1 christos case 'n':
1116 1.1 christos listing |= LISTING_NOFORM;
1117 1.1 christos break;
1118 1.1 christos case 's':
1119 1.1 christos listing |= LISTING_SYMBOLS;
1120 1.1 christos break;
1121 1.9 christos case '=':
1122 1.1 christos listing_filename = notes_strdup (optarg + 1);
1123 1.1 christos optarg += strlen (listing_filename);
1124 1.1 christos break;
1125 1.1 christos default:
1126 1.1 christos as_fatal (_("invalid listing option `%c'"), *optarg);
1127 1.1 christos break;
1128 1.1 christos }
1129 1.1 christos optarg++;
1130 1.1 christos }
1131 1.1 christos }
1132 1.1 christos if (!listing)
1133 1.1 christos listing = LISTING_DEFAULT;
1134 1.1 christos break;
1135 1.1 christos
1136 1.1 christos case 'D':
1137 1.1 christos /* DEBUG is implemented: it debugs different
1138 1.1 christos things from other people's assemblers. */
1139 1.1 christos flag_debug = 1;
1140 1.1 christos break;
1141 1.1 christos
1142 1.1 christos case 'f':
1143 1.1 christos flag_no_comments = 1;
1144 1.1 christos break;
1145 1.1 christos
1146 1.1 christos case 'I':
1147 1.9 christos { /* Include file directory. */
1148 1.1 christos char *temp = notes_strdup (optarg);
1149 1.1 christos
1150 1.1 christos add_include_dir (temp);
1151 1.1 christos break;
1152 1.1 christos }
1153 1.1 christos
1154 1.9 christos case 'o':
1155 1.1 christos out_file_name = notes_strdup (optarg);
1156 1.1 christos break;
1157 1.1 christos
1158 1.1 christos case 'w':
1159 1.1 christos break;
1160 1.1 christos
1161 1.1 christos case 'X':
1162 1.1 christos /* -X means treat warnings as errors. */
1163 1.1 christos break;
1164 1.1 christos
1165 1.1 christos case OPTION_REDUCE_MEMORY_OVERHEADS:
1166 1.1 christos break;
1167 1.1 christos
1168 1.8 christos case OPTION_HASH_TABLE_SIZE:
1169 1.1 christos break;
1170 1.1 christos }
1171 1.1 christos }
1172 1.1 christos
1173 1.1 christos free (shortopts);
1174 1.1 christos free (longopts);
1175 1.1 christos
1176 1.1 christos *pargc = new_argc;
1177 1.1 christos *pargv = new_argv;
1178 1.1 christos
1179 1.1 christos #ifdef md_after_parse_args
1180 1.1 christos md_after_parse_args ();
1181 1.1 christos #endif
1182 1.1 christos }
1183 1.10 christos
1184 1.10 christos /* Pre-define a symbol with its name derived from TMPL (wrapping in
1185 1.10 christos GAS(...)), to value VAL. */
1186 1.10 christos
1187 1.10 christos void
1188 1.10 christos predefine_symbol (const char *tmpl, valueT val)
1189 1.10 christos {
1190 1.10 christos char *name = xasprintf ("GAS(%s)", tmpl);
1191 1.10 christos symbolS *s;
1192 1.10 christos
1193 1.10 christos /* Also put the symbol in the symbol table, if requested. */
1194 1.10 christos if (flag_strip_local_absolute < 0)
1195 1.10 christos s = symbol_new (name, absolute_section, &zero_address_frag, val);
1196 1.10 christos else
1197 1.10 christos s = symbol_create (name, absolute_section, &zero_address_frag, val);
1198 1.10 christos S_CLEAR_EXTERNAL (s);
1199 1.10 christos symbol_table_insert (s);
1200 1.10 christos
1201 1.10 christos xfree (name);
1202 1.10 christos }
1203 1.1 christos
1204 1.1 christos static void
1205 1.1 christos dump_statistics (void)
1206 1.1 christos {
1207 1.1 christos long run_time = get_run_time () - start_time;
1208 1.1 christos
1209 1.1 christos fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
1210 1.1 christos myname, run_time / 1000000, run_time % 1000000);
1211 1.1 christos
1212 1.1 christos subsegs_print_statistics (stderr);
1213 1.1 christos write_print_statistics (stderr);
1214 1.1 christos symbol_print_statistics (stderr);
1215 1.1 christos read_print_statistics (stderr);
1216 1.1 christos
1217 1.1 christos #ifdef tc_print_statistics
1218 1.1 christos tc_print_statistics (stderr);
1219 1.1 christos #endif
1220 1.1 christos
1221 1.1 christos #ifdef obj_print_statistics
1222 1.1 christos obj_print_statistics (stderr);
1223 1.1 christos #endif
1224 1.1 christos }
1225 1.1 christos
1226 1.1 christos /* Here to attempt 1 pass over each input file.
1228 1.1 christos We scan argv[*] looking for filenames or exactly "" which is
1229 1.1 christos shorthand for stdin. Any argv that is NULL is not a file-name.
1230 1.1 christos We set need_pass_2 TRUE if, after this, we still have unresolved
1231 1.1 christos expressions of the form (unknown value)+-(unknown value).
1232 1.1 christos
1233 1.1 christos Note the un*x semantics: there is only 1 logical input file, but it
1234 1.1 christos may be a catenation of many 'physical' input files. */
1235 1.1 christos
1236 1.1 christos static void
1237 1.1 christos perform_an_assembly_pass (int argc, char ** argv)
1238 1.1 christos {
1239 1.1 christos int saw_a_file = 0;
1240 1.1 christos
1241 1.1 christos need_pass_2 = 0;
1242 1.10 christos
1243 1.1 christos #ifndef OBJ_MACH_O
1244 1.1 christos subseg_set (text_section, 0);
1245 1.10 christos #endif
1246 1.10 christos
1247 1.10 christos predefine_symbol ("version", BFD_VERSION);
1248 1.1 christos if (strstr (BFD_VERSION_STRING, "." XSTRING (BFD_VERSION_DATE)) != NULL)
1249 1.1 christos predefine_symbol ("date", BFD_VERSION_DATE);
1250 1.1 christos
1251 1.1 christos /* This may add symbol table entries, which requires having an open BFD,
1252 1.1 christos and sections already created. */
1253 1.1 christos md_begin ();
1254 1.1 christos
1255 1.1 christos #ifdef USING_CGEN
1256 1.1 christos gas_cgen_begin ();
1257 1.1 christos #endif
1258 1.1 christos #ifdef obj_begin
1259 1.1 christos obj_begin ();
1260 1.1 christos #endif
1261 1.1 christos
1262 1.1 christos /* Skip argv[0]. */
1263 1.1 christos argv++;
1264 1.1 christos argc--;
1265 1.1 christos
1266 1.1 christos while (argc--)
1267 1.1 christos {
1268 1.1 christos if (*argv)
1269 1.1 christos { /* Is it a file-name argument? */
1270 1.1 christos saw_a_file++;
1271 1.1 christos /* argv->"" if stdin desired, else->filename. */
1272 1.1 christos read_a_source_file (*argv);
1273 1.1 christos }
1274 1.1 christos argv++; /* Completed that argv. */
1275 1.1 christos }
1276 1.1 christos if (!saw_a_file)
1277 1.1 christos read_a_source_file ("");
1278 1.9 christos }
1279 1.9 christos
1280 1.1 christos static void
1281 1.9 christos free_notes (void)
1282 1.9 christos {
1283 1.1 christos _obstack_free (¬es, NULL);
1284 1.9 christos }
1285 1.1 christos
1286 1.9 christos /* Early initialisation, before gas prints messages. */
1287 1.9 christos
1288 1.9 christos static void
1289 1.1 christos gas_early_init (int *argcp, char ***argvp)
1290 1.6 christos {
1291 1.1 christos start_time = get_run_time ();
1292 1.8 christos signal_init ();
1293 1.1 christos
1294 1.1 christos #ifdef HAVE_LC_MESSAGES
1295 1.1 christos setlocale (LC_MESSAGES, "");
1296 1.1 christos #endif
1297 1.1 christos setlocale (LC_CTYPE, "");
1298 1.1 christos bindtextdomain (PACKAGE, LOCALEDIR);
1299 1.1 christos textdomain (PACKAGE);
1300 1.1 christos
1301 1.1 christos if (debug_memory)
1302 1.1 christos chunksize = 64;
1303 1.1 christos
1304 1.1 christos #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
1305 1.1 christos #define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
1306 1.1 christos #endif
1307 1.1 christos
1308 1.1 christos out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
1309 1.7 christos
1310 1.7 christos hex_init ();
1311 1.9 christos if (bfd_init () != BFD_INIT_MAGIC)
1312 1.9 christos as_fatal (_("libbfd ABI mismatch"));
1313 1.9 christos
1314 1.9 christos obstack_begin (¬es, chunksize);
1315 1.9 christos xatexit (free_notes);
1316 1.9 christos
1317 1.1 christos myname = **argvp;
1318 1.1 christos xmalloc_set_program_name (myname);
1319 1.9 christos bfd_set_error_program_name (myname);
1320 1.1 christos
1321 1.9 christos expandargv (argcp, argvp);
1322 1.6 christos
1323 1.9 christos init_include_dir ();
1324 1.9 christos
1325 1.9 christos #ifdef HOST_SPECIAL_INIT
1326 1.6 christos HOST_SPECIAL_INIT (*argcp, *argvp);
1327 1.9 christos #endif
1328 1.9 christos
1329 1.9 christos #ifdef USE_EMULATIONS
1330 1.9 christos select_emulation_mode (*argcp, *argvp);
1331 1.7 christos #endif
1332 1.10 christos }
1333 1.10 christos
1334 1.10 christos /* Tack on format specific section data and create a proper section
1335 1.10 christos symbol for one of the standard bfd sections. */
1336 1.10 christos
1337 1.10 christos static void
1338 1.10 christos bfd_std_section_init (const char *name)
1339 1.10 christos {
1340 1.10 christos asection *sec = bfd_make_section_old_way (stdoutput, name);
1341 1.10 christos gas_assert (BFD_SEND (stdoutput, _new_section_hook, (stdoutput, sec)));
1342 1.10 christos subseg_new (name, 0);
1343 1.9 christos }
1344 1.6 christos
1345 1.9 christos /* The bulk of gas initialisation. This is after args are parsed. */
1346 1.9 christos
1347 1.9 christos static void
1348 1.1 christos gas_init (void)
1349 1.1 christos {
1350 1.1 christos symbol_begin ();
1351 1.1 christos frag_init ();
1352 1.1 christos subsegs_begin ();
1353 1.1 christos read_begin ();
1354 1.9 christos input_scrub_begin ();
1355 1.1 christos expr_begin ();
1356 1.9 christos eh_begin ();
1357 1.1 christos
1358 1.9 christos macro_init ();
1359 1.1 christos
1360 1.9 christos dwarf2_init ();
1361 1.9 christos
1362 1.1 christos local_symbol_make (".gasversion.", absolute_section,
1363 1.9 christos &predefined_address_frag, BFD_VERSION / 10000UL);
1364 1.9 christos
1365 1.9 christos /* Note: Put new initialisation calls that don't depend on stdoutput
1366 1.9 christos being open above this point. stdoutput must be open for anything
1367 1.9 christos that might use stdoutput objalloc memory, eg. calling bfd_alloc
1368 1.1 christos or creating global symbols (via bfd_make_empty_symbol). */
1369 1.1 christos xatexit (output_file_close);
1370 1.1 christos output_file_create (out_file_name);
1371 1.9 christos gas_assert (stdoutput != 0);
1372 1.9 christos
1373 1.9 christos /* Must be called before output_file_close. xexit calls the xatexit
1374 1.9 christos list in reverse order. */
1375 1.9 christos if (flag_print_statistics)
1376 1.1 christos xatexit (dump_statistics);
1377 1.1 christos
1378 1.1 christos dot_symbol_init ();
1379 1.1 christos
1380 1.1 christos #ifdef tc_init_after_args
1381 1.1 christos tc_init_after_args ();
1382 1.1 christos #endif
1383 1.1 christos
1384 1.1 christos itbl_init ();
1385 1.1 christos
1386 1.1 christos /* Now that we have fully initialized, and have created the output
1387 1.1 christos file, define any symbols requested by --defsym command line
1388 1.1 christos arguments. */
1389 1.1 christos while (defsyms != NULL)
1390 1.1 christos {
1391 1.1 christos symbolS *sym;
1392 1.8 christos struct defsym_list *next;
1393 1.8 christos
1394 1.1 christos sym = symbol_new (defsyms->name, absolute_section,
1395 1.1 christos &zero_address_frag, defsyms->value);
1396 1.1 christos /* Make symbols defined on the command line volatile, so that they
1397 1.1 christos can be redefined inside a source file. This makes this assembler's
1398 1.1 christos behaviour compatible with earlier versions, but it may not be
1399 1.1 christos completely intuitive. */
1400 1.1 christos S_SET_VOLATILE (sym);
1401 1.1 christos symbol_table_insert (sym);
1402 1.1 christos next = defsyms->next;
1403 1.1 christos free (defsyms);
1404 1.10 christos defsyms = next;
1405 1.10 christos }
1406 1.10 christos
1407 1.10 christos #ifndef OBJ_MACH_O
1408 1.10 christos /* Create the standard sections, and those the assembler uses
1409 1.10 christos internally. */
1410 1.10 christos text_section = subseg_new (TEXT_SECTION_NAME, 0);
1411 1.10 christos data_section = subseg_new (DATA_SECTION_NAME, 0);
1412 1.10 christos bss_section = subseg_new (BSS_SECTION_NAME, 0);
1413 1.10 christos /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
1414 1.10 christos to have relocs, otherwise we don't find out in time. */
1415 1.10 christos flagword applicable = bfd_applicable_section_flags (stdoutput);
1416 1.10 christos bfd_set_section_flags (text_section,
1417 1.10 christos applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1418 1.10 christos | SEC_CODE | SEC_READONLY));
1419 1.10 christos bfd_set_section_flags (data_section,
1420 1.10 christos applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1421 1.10 christos | SEC_DATA));
1422 1.10 christos bfd_set_section_flags (bss_section, applicable & SEC_ALLOC);
1423 1.10 christos seg_info (bss_section)->bss = 1;
1424 1.10 christos #endif
1425 1.10 christos bfd_std_section_init (BFD_ABS_SECTION_NAME);
1426 1.10 christos bfd_std_section_init (BFD_UND_SECTION_NAME);
1427 1.9 christos reg_section = subseg_new ("*GAS `reg' section*", 0);
1428 1.1 christos expr_section = subseg_new ("*GAS `expr' section*", 0);
1429 1.9 christos }
1430 1.9 christos
1431 1.9 christos int
1432 1.10 christos main (int argc, char ** argv)
1433 1.9 christos {
1434 1.10 christos #ifndef NO_LISTING
1435 1.9 christos char ** argv_orig = argv;
1436 1.9 christos #endif
1437 1.9 christos struct stat sob;
1438 1.9 christos
1439 1.9 christos gas_early_init (&argc, &argv);
1440 1.9 christos
1441 1.9 christos /* Call parse_args before gas_init so that switches like
1442 1.9 christos --hash-size can be honored. */
1443 1.9 christos parse_args (&argc, &argv);
1444 1.9 christos
1445 1.9 christos if (argc > 1 && stat (out_file_name, &sob) == 0)
1446 1.9 christos {
1447 1.9 christos int i;
1448 1.9 christos
1449 1.9 christos for (i = 1; i < argc; ++i)
1450 1.9 christos {
1451 1.9 christos struct stat sib;
1452 1.9 christos
1453 1.9 christos /* Check that the input file and output file are different. */
1454 1.9 christos if (stat (argv[i], &sib) == 0
1455 1.9 christos && sib.st_ino == sob.st_ino
1456 1.9 christos /* POSIX emulating systems may support stat() but if the
1457 1.9 christos underlying file system does not support a file serial number
1458 1.9 christos of some kind then they will return 0 for the inode. So
1459 1.9 christos two files with an inode of 0 may not actually be the same.
1460 1.9 christos On real POSIX systems no ordinary file will ever have an
1461 1.9 christos inode of 0. */
1462 1.9 christos && sib.st_ino != 0
1463 1.9 christos /* Different files may have the same inode number if they
1464 1.9 christos reside on different devices, so check the st_dev field as
1465 1.9 christos well. */
1466 1.9 christos && sib.st_dev == sob.st_dev
1467 1.9 christos /* PR 25572: Only check regular files. Devices, sockets and so
1468 1.9 christos on might actually work as both input and output. Plus there
1469 1.9 christos is a use case for using /dev/null as both input and output
1470 1.9 christos when checking for command line option support in a script:
1471 1.9 christos as --foo /dev/null -o /dev/null; if $? then ... */
1472 1.9 christos && S_ISREG (sib.st_mode))
1473 1.9 christos {
1474 1.9 christos const char *saved_out_file_name = out_file_name;
1475 1.9 christos
1476 1.9 christos /* Don't let as_fatal remove the output file! */
1477 1.9 christos out_file_name = NULL;
1478 1.9 christos as_fatal (_("The input '%s' and output '%s' files are the same"),
1479 1.9 christos argv[i], saved_out_file_name);
1480 1.9 christos }
1481 1.9 christos }
1482 1.9 christos }
1483 1.1 christos
1484 1.1 christos gas_init ();
1485 1.1 christos
1486 1.1 christos /* Assemble it. */
1487 1.1 christos perform_an_assembly_pass (argc, argv);
1488 1.1 christos
1489 1.9 christos cond_finish_check (-1);
1490 1.9 christos
1491 1.1 christos #ifdef md_finish
1492 1.1 christos md_finish ();
1493 1.1 christos #endif
1494 1.1 christos
1495 1.1 christos #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
1496 1.1 christos if ((flag_execstack || flag_noexecstack)
1497 1.1 christos && OUTPUT_FLAVOR == bfd_target_elf_flavour)
1498 1.1 christos {
1499 1.1 christos segT gnustack;
1500 1.7 christos
1501 1.1 christos gnustack = subseg_new (".note.GNU-stack", 0);
1502 1.3 christos bfd_set_section_flags (gnustack,
1503 1.1 christos SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
1504 1.1 christos
1505 1.1 christos }
1506 1.9 christos #endif
1507 1.9 christos
1508 1.1 christos codeview_finish ();
1509 1.1 christos
1510 1.1 christos /* If we've been collecting dwarf2 .debug_line info, either for
1511 1.1 christos assembly debugging or on behalf of the compiler, emit it now. */
1512 1.3 christos dwarf2_finish ();
1513 1.1 christos
1514 1.1 christos /* If we constructed dwarf2 .eh_frame info, either via .cfi
1515 1.1 christos directives from the user or by the backend, emit it now. */
1516 1.3 christos cfi_finish ();
1517 1.3 christos
1518 1.3 christos keep_it = 0;
1519 1.3 christos if (seen_at_least_1_file ())
1520 1.3 christos {
1521 1.3 christos int n_warns, n_errs;
1522 1.3 christos char warn_msg[50];
1523 1.3 christos char err_msg[50];
1524 1.1 christos
1525 1.3 christos write_object_file ();
1526 1.3 christos
1527 1.1 christos n_warns = had_warnings ();
1528 1.6 christos n_errs = had_errors ();
1529 1.6 christos
1530 1.6 christos sprintf (warn_msg,
1531 1.6 christos ngettext ("%d warning", "%d warnings", n_warns), n_warns);
1532 1.3 christos sprintf (err_msg,
1533 1.3 christos ngettext ("%d error", "%d errors", n_errs), n_errs);
1534 1.3 christos if (flag_fatal_warnings && n_warns != 0)
1535 1.3 christos {
1536 1.3 christos if (n_errs == 0)
1537 1.3 christos as_bad (_("%s, treating warnings as errors"), warn_msg);
1538 1.3 christos n_errs += n_warns;
1539 1.3 christos }
1540 1.3 christos
1541 1.3 christos if (n_errs == 0)
1542 1.3 christos keep_it = 1;
1543 1.3 christos else if (flag_always_generate_output)
1544 1.3 christos {
1545 1.3 christos /* The -Z flag indicates that an object file should be generated,
1546 1.3 christos regardless of warnings and errors. */
1547 1.3 christos keep_it = 1;
1548 1.3 christos fprintf (stderr, _("%s, %s, generating bad object file\n"),
1549 1.3 christos err_msg, warn_msg);
1550 1.1 christos }
1551 1.1 christos }
1552 1.1 christos
1553 1.1 christos fflush (stderr);
1554 1.1 christos
1555 1.1 christos #ifndef NO_LISTING
1556 1.1 christos listing_print (listing_filename, argv_orig);
1557 1.1 christos #endif
1558 1.1 christos
1559 1.1 christos input_scrub_end ();
1560 1.1 christos
1561 1.3 christos /* Use xexit instead of return, because under VMS environments they
1562 1.1 christos may not place the same interpretation on the value given. */
1563 1.1 christos if (had_errors () != 0)
1564 1.1 christos xexit (EXIT_FAILURE);
1565 1.1 christos
1566 1.1 christos /* Only generate dependency file if assembler was successful. */
1567 1.1 christos print_dependencies ();
1568 1.1 christos
1569 xexit (EXIT_SUCCESS);
1570 }
1571