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