xref: /netbsd/external/gpl3/gdb.old/dist/gas/as.c (revision 56bb7041)
1 /* as.c - GAS main program.
2    Copyright (C) 1987-2020 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 bfd_boolean 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 (!strncmp ("--em", argv[i], 4))
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,
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,
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,
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 /* = STD_BASE + 40 */
507     /* When you add options here, check that they do
508        not collide with OPTION_MD_BASE.  See as.h.  */
509     };
510 
511   static const struct option std_longopts[] =
512   {
513     /* Note: commas are placed at the start of the line rather than
514        the end of the preceding line so that it is simpler to
515        selectively add and remove lines from this list.  */
516     {"alternate", no_argument, NULL, OPTION_ALTERNATE}
517     /* The entry for "a" is here to prevent getopt_long_only() from
518        considering that -a is an abbreviation for --alternate.  This is
519        necessary because -a=<FILE> is a valid switch but getopt would
520        normally reject it since --alternate does not take an argument.  */
521     ,{"a", optional_argument, NULL, 'a'}
522     /* Handle -al=<FILE>.  */
523     ,{"al", optional_argument, NULL, OPTION_AL}
524     ,{"compress-debug-sections", optional_argument, NULL, OPTION_COMPRESS_DEBUG}
525     ,{"nocompress-debug-sections", no_argument, NULL, OPTION_NOCOMPRESS_DEBUG}
526     ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP}
527     ,{"defsym", required_argument, NULL, OPTION_DEFSYM}
528     ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}
529     ,{"emulation", required_argument, NULL, OPTION_EMULATION}
530 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
531     ,{"execstack", no_argument, NULL, OPTION_EXECSTACK}
532     ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK}
533     ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK}
534     ,{"elf-stt-common", required_argument, NULL, OPTION_ELF_STT_COMMON}
535     ,{"sectname-subst", no_argument, NULL, OPTION_SECTNAME_SUBST}
536     ,{"generate-missing-build-notes", required_argument, NULL, OPTION_ELF_BUILD_NOTES}
537 #endif
538     ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
539     ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF_2}
540     ,{"gdwarf-3", no_argument, NULL, OPTION_GDWARF_3}
541     ,{"gdwarf-4", no_argument, NULL, OPTION_GDWARF_4}
542     ,{"gdwarf-5", no_argument, NULL, OPTION_GDWARF_5}
543     /* GCC uses --gdwarf-2 but GAS used to to use --gdwarf2,
544        so we keep it here for backwards compatibility.  */
545     ,{"gdwarf2", no_argument, NULL, OPTION_GDWARF_2}
546     ,{"gdwarf-sections", no_argument, NULL, OPTION_GDWARF_SECTIONS}
547     ,{"gdwarf-cie-version", required_argument, NULL, OPTION_GDWARF_CIE_VERSION}
548     ,{"gen-debug", no_argument, NULL, 'g'}
549     ,{"gstabs", no_argument, NULL, OPTION_GSTABS}
550     ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS}
551     ,{"hash-size", required_argument, NULL, OPTION_HASH_TABLE_SIZE}
552     ,{"help", no_argument, NULL, OPTION_HELP}
553 #ifdef HAVE_ITBL_CPU
554     /* New option for extending instruction set (see also -t above).
555        The "-t file" or "--itbl file" option extends the basic set of
556        valid instructions by reading "file", a text file containing a
557        list of instruction formats.  The additional opcodes and their
558        formats are added to the built-in set of instructions, and
559        mnemonics for new registers may also be defined.  */
560     ,{"itbl", required_argument, NULL, 't'}
561 #endif
562     /* getopt allows abbreviations, so we do this to stop it from
563        treating -k as an abbreviation for --keep-locals.  Some
564        ports use -k to enable PIC assembly.  */
565     ,{"keep-locals", no_argument, NULL, 'L'}
566     ,{"keep-locals", no_argument, NULL, 'L'}
567     ,{"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH}
568     ,{"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2}
569     ,{"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH}
570     ,{"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES}
571     ,{"MD", required_argument, NULL, OPTION_DEPFILE}
572     ,{"mri", no_argument, NULL, 'M'}
573     ,{"nocpp", no_argument, NULL, OPTION_NOCPP}
574     ,{"no-pad-sections", no_argument, NULL, OPTION_NO_PAD_SECTIONS}
575     ,{"no-warn", no_argument, NULL, 'W'}
576     ,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS}
577     ,{"statistics", no_argument, NULL, OPTION_STATISTICS}
578     ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE}
579     ,{"version", no_argument, NULL, OPTION_VERSION}
580     ,{"verbose", no_argument, NULL, OPTION_VERBOSE}
581     ,{"target-help", no_argument, NULL, OPTION_TARGET_HELP}
582     ,{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}
583     ,{"warn", no_argument, NULL, OPTION_WARN}
584   };
585 
586   /* Construct the option lists from the standard list and the target
587      dependent list.  Include space for an extra NULL option and
588      always NULL terminate.  */
589   shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
590   longopts = (struct option *) xmalloc (sizeof (std_longopts)
591                                         + md_longopts_size + sizeof (struct option));
592   memcpy (longopts, std_longopts, sizeof (std_longopts));
593   memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size);
594   memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size,
595 	  0, sizeof (struct option));
596 
597   /* Make a local copy of the old argv.  */
598   old_argc = *pargc;
599   old_argv = *pargv;
600 
601   /* Initialize a new argv that contains no options.  */
602   new_argv = XNEWVEC (char *, old_argc + 1);
603   new_argv[0] = old_argv[0];
604   new_argc = 1;
605   new_argv[new_argc] = NULL;
606 
607   while (1)
608     {
609       /* getopt_long_only is like getopt_long, but '-' as well as '--' can
610 	 indicate a long option.  */
611       int longind;
612       int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts,
613 				   &longind);
614 
615       if (optc == -1)
616 	break;
617 
618       switch (optc)
619 	{
620 	default:
621 	  /* md_parse_option should return 1 if it recognizes optc,
622 	     0 if not.  */
623 	  if (md_parse_option (optc, optarg) != 0)
624 	    break;
625 	  /* `-v' isn't included in the general short_opts list, so check for
626 	     it explicitly here before deciding we've gotten a bad argument.  */
627 	  if (optc == 'v')
628 	    {
629 #ifdef VMS
630 	      /* Telling getopt to treat -v's value as optional can result
631 		 in it picking up a following filename argument here.  The
632 		 VMS code in md_parse_option can return 0 in that case,
633 		 but it has no way of pushing the filename argument back.  */
634 	      if (optarg && *optarg)
635 		new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL;
636 	      else
637 #else
638 	      case 'v':
639 #endif
640 	      case OPTION_VERBOSE:
641 		print_version_id ();
642 		verbose = 1;
643 	      break;
644 	    }
645 	  else
646 	    as_bad (_("unrecognized option -%c%s"), optc, optarg ? optarg : "");
647 	  /* Fall through.  */
648 
649 	case '?':
650 	  exit (EXIT_FAILURE);
651 
652 	case 1:			/* File name.  */
653 	  if (!strcmp (optarg, "-"))
654 	    optarg = (char *) "";
655 	  new_argv[new_argc++] = optarg;
656 	  new_argv[new_argc] = NULL;
657 	  break;
658 
659 	case OPTION_TARGET_HELP:
660 	  md_show_usage (stdout);
661 	  exit (EXIT_SUCCESS);
662 
663 	case OPTION_HELP:
664 	  show_usage (stdout);
665 	  exit (EXIT_SUCCESS);
666 
667 	case OPTION_NOCPP:
668 	  break;
669 
670 	case OPTION_NO_PAD_SECTIONS:
671 	  do_not_pad_sections_to_alignment = 1;
672 	  break;
673 
674 	case OPTION_STATISTICS:
675 	  flag_print_statistics = 1;
676 	  break;
677 
678 	case OPTION_STRIP_LOCAL_ABSOLUTE:
679 	  flag_strip_local_absolute = 1;
680 	  break;
681 
682 	case OPTION_TRADITIONAL_FORMAT:
683 	  flag_traditional_format = 1;
684 	  break;
685 
686 	case OPTION_VERSION:
687 	  /* This output is intended to follow the GNU standards document.  */
688 	  printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
689 	  printf (_("Copyright (C) 2020 Free Software Foundation, Inc.\n"));
690 	  printf (_("\
691 This program is free software; you may redistribute it under the terms of\n\
692 the GNU General Public License version 3 or later.\n\
693 This program has absolutely no warranty.\n"));
694 #ifdef TARGET_WITH_CPU
695 	  printf (_("This assembler was configured for a target of `%s' "
696 		    "and default,\ncpu type `%s'.\n"),
697 		  TARGET_ALIAS, TARGET_WITH_CPU);
698 #else
699 	  printf (_("This assembler was configured for a target of `%s'.\n"),
700 		  TARGET_ALIAS);
701 #endif
702 	  exit (EXIT_SUCCESS);
703 
704 	case OPTION_EMULATION:
705 #ifdef USE_EMULATIONS
706 	  if (strcmp (optarg, this_emulation->name))
707 	    as_fatal (_("multiple emulation names specified"));
708 #else
709 	  as_fatal (_("emulations not handled in this configuration"));
710 #endif
711 	  break;
712 
713 	case OPTION_DUMPCONFIG:
714 	  fprintf (stderr, _("alias = %s\n"), TARGET_ALIAS);
715 	  fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL);
716 	  fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU);
717 #ifdef TARGET_OBJ_FORMAT
718 	  fprintf (stderr, _("format = %s\n"), TARGET_OBJ_FORMAT);
719 #endif
720 #ifdef TARGET_FORMAT
721 	  fprintf (stderr, _("bfd-target = %s\n"), TARGET_FORMAT);
722 #endif
723 	  exit (EXIT_SUCCESS);
724 
725 	case OPTION_COMPRESS_DEBUG:
726 	  if (optarg)
727 	    {
728 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
729 	      if (strcasecmp (optarg, "none") == 0)
730 		flag_compress_debug = COMPRESS_DEBUG_NONE;
731 	      else if (strcasecmp (optarg, "zlib") == 0)
732 		flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
733 	      else if (strcasecmp (optarg, "zlib-gnu") == 0)
734 		flag_compress_debug = COMPRESS_DEBUG_GNU_ZLIB;
735 	      else if (strcasecmp (optarg, "zlib-gabi") == 0)
736 		flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
737 	      else
738 		as_fatal (_("Invalid --compress-debug-sections option: `%s'"),
739 			  optarg);
740 #else
741 	      as_fatal (_("--compress-debug-sections=%s is unsupported"),
742 			optarg);
743 #endif
744 	    }
745 	  else
746 	    flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB;
747 	  break;
748 
749 	case OPTION_NOCOMPRESS_DEBUG:
750 	  flag_compress_debug = COMPRESS_DEBUG_NONE;
751 	  break;
752 
753 	case OPTION_DEBUG_PREFIX_MAP:
754 	  add_debug_prefix_map (optarg);
755 	  break;
756 
757 	case OPTION_DEFSYM:
758 	  {
759 	    char *s;
760 	    valueT i;
761 	    struct defsym_list *n;
762 
763 	    for (s = optarg; *s != '\0' && *s != '='; s++)
764 	      ;
765 	    if (*s == '\0')
766 	      as_fatal (_("bad defsym; format is --defsym name=value"));
767 	    *s++ = '\0';
768 	    i = bfd_scan_vma (s, (const char **) NULL, 0);
769 	    n = XNEW (struct defsym_list);
770 	    n->next = defsyms;
771 	    n->name = optarg;
772 	    n->value = i;
773 	    defsyms = n;
774 	  }
775 	  break;
776 
777 #ifdef HAVE_ITBL_CPU
778 	case 't':
779 	  {
780 	    /* optarg is the name of the file containing the instruction
781 	       formats, opcodes, register names, etc.  */
782 	    struct itbl_file_list *n;
783 
784 	    if (optarg == NULL)
785 	      {
786 		as_warn (_("no file name following -t option"));
787 		break;
788 	      }
789 
790 	    n = XNEW (struct itbl_file_list);
791 	    n->next = itbl_files;
792 	    n->name = optarg;
793 	    itbl_files = n;
794 
795 	    /* Parse the file and add the new instructions to our internal
796 	       table.  If multiple instruction tables are specified, the
797 	       information from this table gets appended onto the existing
798 	       internal table.  */
799 	    itbl_files->name = xstrdup (optarg);
800 	    if (itbl_parse (itbl_files->name) != 0)
801 	      as_fatal (_("failed to read instruction table %s\n"),
802 			itbl_files->name);
803 	  }
804 	  break;
805 #endif
806 
807 	case OPTION_DEPFILE:
808 	  start_dependencies (optarg);
809 	  break;
810 
811 	case 'g':
812 	  /* Some backends, eg Alpha and Mips, use the -g switch for their
813 	     own purposes.  So we check here for an explicit -g and allow
814 	     the backend to decide if it wants to process it.  */
815 	  if (   old_argv[optind - 1][1] == 'g'
816 	      && md_parse_option (optc, optarg))
817 	    continue;
818 
819 	  /* We end up here for any -gsomething-not-already-a-long-option.
820 	     give some useful feedback on not (yet) supported -gdwarfxxx
821 	     versions/sections/options.  */
822 	  if (strncmp (old_argv[optind - 1], "-gdwarf",
823 		       strlen ("-gdwarf")) == 0)
824 	    as_fatal (_("unknown DWARF option %s\n"), old_argv[optind - 1]);
825 
826 	  if (md_debug_format_selector)
827 	    debug_type = md_debug_format_selector (& use_gnu_debug_info_extensions);
828 	  else if (IS_ELF)
829 	    {
830 	      debug_type = DEBUG_DWARF2;
831 	      dwarf_level = 2;
832 	    }
833 	  else
834 	    debug_type = DEBUG_STABS;
835 	  break;
836 
837 	case OPTION_GSTABS_PLUS:
838 	  use_gnu_debug_info_extensions = 1;
839 	  /* Fall through.  */
840 	case OPTION_GSTABS:
841 	  debug_type = DEBUG_STABS;
842 	  break;
843 
844 	case OPTION_GDWARF_2:
845 	  debug_type = DEBUG_DWARF2;
846 	  dwarf_level = 2;
847 	  break;
848 
849 	case OPTION_GDWARF_3:
850 	  debug_type = DEBUG_DWARF2;
851 	  dwarf_level = 3;
852 	  break;
853 
854 	case OPTION_GDWARF_4:
855 	  debug_type = DEBUG_DWARF2;
856 	  dwarf_level = 4;
857 	  break;
858 
859 	case OPTION_GDWARF_5:
860 	  debug_type = DEBUG_DWARF2;
861 	  dwarf_level = 5;
862 	  break;
863 
864 	case OPTION_GDWARF_SECTIONS:
865 	  flag_dwarf_sections = TRUE;
866 	  break;
867 
868         case OPTION_GDWARF_CIE_VERSION:
869 	  flag_dwarf_cie_version = atoi (optarg);
870           /* The available CIE versions are 1 (DWARF 2), 3 (DWARF 3), and 4
871              (DWARF 4 and 5).  */
872 	  if (flag_dwarf_cie_version < 1
873               || flag_dwarf_cie_version == 2
874               || flag_dwarf_cie_version > 4)
875             as_fatal (_("Invalid --gdwarf-cie-version `%s'"), optarg);
876 	  switch (flag_dwarf_cie_version)
877 	    {
878 	    case 1:
879 	      if (dwarf_level < 2)
880 		dwarf_level = 2;
881 	      break;
882 	    case 3:
883 	      if (dwarf_level < 3)
884 		dwarf_level = 3;
885 	      break;
886 	    default:
887 	      if (dwarf_level < 4)
888 		dwarf_level = 4;
889 	      break;
890 	    }
891 	  break;
892 
893 	case 'J':
894 	  flag_signed_overflow_ok = 1;
895 	  break;
896 
897 #ifndef WORKING_DOT_WORD
898 	case 'K':
899 	  flag_warn_displacement = 1;
900 	  break;
901 #endif
902 	case 'L':
903 	  flag_keep_locals = 1;
904 	  break;
905 
906 	case OPTION_LISTING_LHS_WIDTH:
907 	  listing_lhs_width = atoi (optarg);
908 	  if (listing_lhs_width_second < listing_lhs_width)
909 	    listing_lhs_width_second = listing_lhs_width;
910 	  break;
911 	case OPTION_LISTING_LHS_WIDTH2:
912 	  {
913 	    int tmp = atoi (optarg);
914 
915 	    if (tmp > listing_lhs_width)
916 	      listing_lhs_width_second = tmp;
917 	  }
918 	  break;
919 	case OPTION_LISTING_RHS_WIDTH:
920 	  listing_rhs_width = atoi (optarg);
921 	  break;
922 	case OPTION_LISTING_CONT_LINES:
923 	  listing_lhs_cont_lines = atoi (optarg);
924 	  break;
925 
926 	case 'M':
927 	  flag_mri = 1;
928 #ifdef TC_M68K
929 	  flag_m68k_mri = 1;
930 #endif
931 	  break;
932 
933 	case 'R':
934 	  flag_readonly_data_in_text = 1;
935 	  break;
936 
937 	case 'W':
938 	  flag_no_warnings = 1;
939 	  break;
940 
941 	case OPTION_WARN:
942 	  flag_no_warnings = 0;
943 	  flag_fatal_warnings = 0;
944 	  break;
945 
946 	case OPTION_WARN_FATAL:
947 	  flag_no_warnings = 0;
948 	  flag_fatal_warnings = 1;
949 	  break;
950 
951 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
952 	case OPTION_EXECSTACK:
953 	  flag_execstack = 1;
954 	  flag_noexecstack = 0;
955 	  break;
956 
957 	case OPTION_NOEXECSTACK:
958 	  flag_noexecstack = 1;
959 	  flag_execstack = 0;
960 	  break;
961 
962 	case OPTION_SIZE_CHECK:
963 	  if (strcasecmp (optarg, "error") == 0)
964 	    flag_allow_nonconst_size = FALSE;
965 	  else if (strcasecmp (optarg, "warning") == 0)
966 	    flag_allow_nonconst_size = TRUE;
967 	  else
968 	    as_fatal (_("Invalid --size-check= option: `%s'"), optarg);
969 	  break;
970 
971 	case OPTION_ELF_STT_COMMON:
972 	  if (strcasecmp (optarg, "no") == 0)
973 	    flag_use_elf_stt_common = 0;
974 	  else if (strcasecmp (optarg, "yes") == 0)
975 	    flag_use_elf_stt_common = 1;
976 	  else
977 	    as_fatal (_("Invalid --elf-stt-common= option: `%s'"),
978 		      optarg);
979 	  break;
980 
981 	case OPTION_SECTNAME_SUBST:
982 	  flag_sectname_subst = 1;
983 	  break;
984 
985 	case OPTION_ELF_BUILD_NOTES:
986 	  if (strcasecmp (optarg, "no") == 0)
987 	    flag_generate_build_notes = FALSE;
988 	  else if (strcasecmp (optarg, "yes") == 0)
989 	    flag_generate_build_notes = TRUE;
990 	  else
991 	    as_fatal (_("Invalid --generate-missing-build-notes option: `%s'"),
992 		      optarg);
993 	  break;
994 
995 #endif /* OBJ_ELF */
996 
997 	case 'Z':
998 	  flag_always_generate_output = 1;
999 	  break;
1000 
1001  	case OPTION_AL:
1002 	  listing |= LISTING_LISTING;
1003 	  if (optarg)
1004 	    listing_filename = xstrdup (optarg);
1005 	  break;
1006 
1007  	case OPTION_ALTERNATE:
1008  	  optarg = old_argv [optind - 1];
1009  	  while (* optarg == '-')
1010  	    optarg ++;
1011 
1012  	  if (strcmp (optarg, "alternate") == 0)
1013  	    {
1014  	      flag_macro_alternate = 1;
1015  	      break;
1016  	    }
1017  	  optarg ++;
1018  	  /* Fall through.  */
1019 
1020 	case 'a':
1021 	  if (optarg)
1022 	    {
1023 	      if (optarg != old_argv[optind] && optarg[-1] == '=')
1024 		--optarg;
1025 
1026 	      if (md_parse_option (optc, optarg) != 0)
1027 		break;
1028 
1029 	      while (*optarg)
1030 		{
1031 		  switch (*optarg)
1032 		    {
1033 		    case 'c':
1034 		      listing |= LISTING_NOCOND;
1035 		      break;
1036 		    case 'd':
1037 		      listing |= LISTING_NODEBUG;
1038 		      break;
1039 		    case 'g':
1040 		      listing |= LISTING_GENERAL;
1041 		      break;
1042 		    case 'h':
1043 		      listing |= LISTING_HLL;
1044 		      break;
1045 		    case 'l':
1046 		      listing |= LISTING_LISTING;
1047 		      break;
1048 		    case 'm':
1049 		      listing |= LISTING_MACEXP;
1050 		      break;
1051 		    case 'n':
1052 		      listing |= LISTING_NOFORM;
1053 		      break;
1054 		    case 's':
1055 		      listing |= LISTING_SYMBOLS;
1056 		      break;
1057 		    case '=':
1058 		      listing_filename = xstrdup (optarg + 1);
1059 		      optarg += strlen (listing_filename);
1060 		      break;
1061 		    default:
1062 		      as_fatal (_("invalid listing option `%c'"), *optarg);
1063 		      break;
1064 		    }
1065 		  optarg++;
1066 		}
1067 	    }
1068 	  if (!listing)
1069 	    listing = LISTING_DEFAULT;
1070 	  break;
1071 
1072 	case 'D':
1073 	  /* DEBUG is implemented: it debugs different
1074 	     things from other people's assemblers.  */
1075 	  flag_debug = 1;
1076 	  break;
1077 
1078 	case 'f':
1079 	  flag_no_comments = 1;
1080 	  break;
1081 
1082 	case 'I':
1083 	  {			/* Include file directory.  */
1084 	    char *temp = xstrdup (optarg);
1085 
1086 	    add_include_dir (temp);
1087 	    break;
1088 	  }
1089 
1090 	case 'o':
1091 	  out_file_name = xstrdup (optarg);
1092 	  break;
1093 
1094 	case 'w':
1095 	  break;
1096 
1097 	case 'X':
1098 	  /* -X means treat warnings as errors.  */
1099 	  break;
1100 
1101 	case OPTION_REDUCE_MEMORY_OVERHEADS:
1102 	  break;
1103 
1104 	case OPTION_HASH_TABLE_SIZE:
1105 	  break;
1106 	}
1107     }
1108 
1109   free (shortopts);
1110   free (longopts);
1111 
1112   *pargc = new_argc;
1113   *pargv = new_argv;
1114 
1115 #ifdef md_after_parse_args
1116   md_after_parse_args ();
1117 #endif
1118 }
1119 
1120 static void
dump_statistics(void)1121 dump_statistics (void)
1122 {
1123   long run_time = get_run_time () - start_time;
1124 
1125   fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
1126 	   myname, run_time / 1000000, run_time % 1000000);
1127 
1128   subsegs_print_statistics (stderr);
1129   write_print_statistics (stderr);
1130   symbol_print_statistics (stderr);
1131   read_print_statistics (stderr);
1132 
1133 #ifdef tc_print_statistics
1134   tc_print_statistics (stderr);
1135 #endif
1136 
1137 #ifdef obj_print_statistics
1138   obj_print_statistics (stderr);
1139 #endif
1140 }
1141 
1142 static void
close_output_file(void)1143 close_output_file (void)
1144 {
1145   output_file_close (out_file_name);
1146   if (!keep_it)
1147     unlink_if_ordinary (out_file_name);
1148 }
1149 
1150 /* The interface between the macro code and gas expression handling.  */
1151 
1152 static size_t
macro_expr(const char * emsg,size_t idx,sb * in,offsetT * val)1153 macro_expr (const char *emsg, size_t idx, sb *in, offsetT *val)
1154 {
1155   expressionS ex;
1156 
1157   sb_terminate (in);
1158 
1159   temp_ilp (in->ptr + idx);
1160   expression_and_evaluate (&ex);
1161   idx = input_line_pointer - in->ptr;
1162   restore_ilp ();
1163 
1164   if (ex.X_op != O_constant)
1165     as_bad ("%s", emsg);
1166 
1167   *val = ex.X_add_number;
1168 
1169   return idx;
1170 }
1171 
1172 /* Here to attempt 1 pass over each input file.
1173    We scan argv[*] looking for filenames or exactly "" which is
1174    shorthand for stdin. Any argv that is NULL is not a file-name.
1175    We set need_pass_2 TRUE if, after this, we still have unresolved
1176    expressions of the form (unknown value)+-(unknown value).
1177 
1178    Note the un*x semantics: there is only 1 logical input file, but it
1179    may be a catenation of many 'physical' input files.  */
1180 
1181 static void
perform_an_assembly_pass(int argc,char ** argv)1182 perform_an_assembly_pass (int argc, char ** argv)
1183 {
1184   int saw_a_file = 0;
1185 #ifndef OBJ_MACH_O
1186   flagword applicable;
1187 #endif
1188 
1189   need_pass_2 = 0;
1190 
1191 #ifndef OBJ_MACH_O
1192   /* Create the standard sections, and those the assembler uses
1193      internally.  */
1194   text_section = subseg_new (TEXT_SECTION_NAME, 0);
1195   data_section = subseg_new (DATA_SECTION_NAME, 0);
1196   bss_section = subseg_new (BSS_SECTION_NAME, 0);
1197   /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
1198      to have relocs, otherwise we don't find out in time.  */
1199   applicable = bfd_applicable_section_flags (stdoutput);
1200   bfd_set_section_flags (text_section,
1201 			 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1202 				       | SEC_CODE | SEC_READONLY));
1203   bfd_set_section_flags (data_section,
1204 			 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1205 				       | SEC_DATA));
1206   bfd_set_section_flags (bss_section, applicable & SEC_ALLOC);
1207   seg_info (bss_section)->bss = 1;
1208 #endif
1209   subseg_new (BFD_ABS_SECTION_NAME, 0);
1210   subseg_new (BFD_UND_SECTION_NAME, 0);
1211   reg_section = subseg_new ("*GAS `reg' section*", 0);
1212   expr_section = subseg_new ("*GAS `expr' section*", 0);
1213 
1214 #ifndef OBJ_MACH_O
1215   subseg_set (text_section, 0);
1216 #endif
1217 
1218   /* This may add symbol table entries, which requires having an open BFD,
1219      and sections already created.  */
1220   md_begin ();
1221 
1222 #ifdef USING_CGEN
1223   gas_cgen_begin ();
1224 #endif
1225 #ifdef obj_begin
1226   obj_begin ();
1227 #endif
1228 
1229   /* Skip argv[0].  */
1230   argv++;
1231   argc--;
1232 
1233   while (argc--)
1234     {
1235       if (*argv)
1236 	{			/* Is it a file-name argument?  */
1237 	  PROGRESS (1);
1238 	  saw_a_file++;
1239 	  /* argv->"" if stdin desired, else->filename.  */
1240 	  read_a_source_file (*argv);
1241 	}
1242       argv++;			/* Completed that argv.  */
1243     }
1244   if (!saw_a_file)
1245     read_a_source_file ("");
1246 }
1247 
1248 
1249 int
main(int argc,char ** argv)1250 main (int argc, char ** argv)
1251 {
1252   char ** argv_orig = argv;
1253   struct stat sob;
1254 
1255   int macro_strip_at;
1256 
1257   start_time = get_run_time ();
1258   signal_init ();
1259 
1260 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1261   setlocale (LC_MESSAGES, "");
1262 #endif
1263 #if defined (HAVE_SETLOCALE)
1264   setlocale (LC_CTYPE, "");
1265 #endif
1266   bindtextdomain (PACKAGE, LOCALEDIR);
1267   textdomain (PACKAGE);
1268 
1269   if (debug_memory)
1270     chunksize = 64;
1271 
1272 #ifdef HOST_SPECIAL_INIT
1273   HOST_SPECIAL_INIT (argc, argv);
1274 #endif
1275 
1276   myname = argv[0];
1277   xmalloc_set_program_name (myname);
1278 
1279   expandargv (&argc, &argv);
1280 
1281   START_PROGRESS (myname, 0);
1282 
1283 #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
1284 #define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
1285 #endif
1286 
1287   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
1288 
1289   hex_init ();
1290   if (bfd_init () != BFD_INIT_MAGIC)
1291     as_fatal (_("libbfd ABI mismatch"));
1292   bfd_set_error_program_name (myname);
1293 
1294 #ifdef USE_EMULATIONS
1295   select_emulation_mode (argc, argv);
1296 #endif
1297 
1298   PROGRESS (1);
1299   /* Call parse_args before any of the init/begin functions
1300      so that switches like --hash-size can be honored.  */
1301   parse_args (&argc, &argv);
1302 
1303   if (argc > 1 && stat (out_file_name, &sob) == 0)
1304     {
1305       int i;
1306 
1307       for (i = 1; i < argc; ++i)
1308 	{
1309 	  struct stat sib;
1310 
1311 	  /* Check that the input file and output file are different.  */
1312 	  if (stat (argv[i], &sib) == 0
1313 	      && sib.st_ino == sob.st_ino
1314 	      /* POSIX emulating systems may support stat() but if the
1315 		 underlying file system does not support a file serial number
1316 		 of some kind then they will return 0 for the inode.  So
1317 		 two files with an inode of 0 may not actually be the same.
1318 		 On real POSIX systems no ordinary file will ever have an
1319 		 inode of 0.  */
1320 	      && sib.st_ino != 0
1321 	      /* Different files may have the same inode number if they
1322 		 reside on different devices, so check the st_dev field as
1323 		 well.  */
1324 	      && sib.st_dev == sob.st_dev
1325 	      /* PR 25572: Only check regular files.  Devices, sockets and so
1326 		 on might actually work as both input and output.  Plus there
1327 		 is a use case for using /dev/null as both input and output
1328 		 when checking for command line option support in a script:
1329 		   as --foo /dev/null -o /dev/null; if $? then ...  */
1330 	      && S_ISREG (sib.st_mode))
1331 	    {
1332 	      const char *saved_out_file_name = out_file_name;
1333 
1334 	      /* Don't let as_fatal remove the output file!  */
1335 	      out_file_name = NULL;
1336 	      as_fatal (_("The input '%s' and output '%s' files are the same"),
1337 			argv[i], saved_out_file_name);
1338 	    }
1339 	}
1340     }
1341 
1342   symbol_begin ();
1343   frag_init ();
1344   subsegs_begin ();
1345   read_begin ();
1346   input_scrub_begin ();
1347   expr_begin ();
1348 
1349   /* It has to be called after dump_statistics ().  */
1350   xatexit (close_output_file);
1351 
1352   if (flag_print_statistics)
1353     xatexit (dump_statistics);
1354 
1355   macro_strip_at = 0;
1356 #ifdef TC_I960
1357   macro_strip_at = flag_mri;
1358 #endif
1359 
1360   macro_init (flag_macro_alternate, flag_mri, macro_strip_at, macro_expr);
1361 
1362   PROGRESS (1);
1363 
1364   output_file_create (out_file_name);
1365   gas_assert (stdoutput != 0);
1366 
1367   dot_symbol_init ();
1368 
1369 #ifdef tc_init_after_args
1370   tc_init_after_args ();
1371 #endif
1372 
1373   itbl_init ();
1374 
1375   dwarf2_init ();
1376 
1377   local_symbol_make (".gasversion.", absolute_section,
1378 		     &predefined_address_frag, BFD_VERSION / 10000UL);
1379 
1380   /* Now that we have fully initialized, and have created the output
1381      file, define any symbols requested by --defsym command line
1382      arguments.  */
1383   while (defsyms != NULL)
1384     {
1385       symbolS *sym;
1386       struct defsym_list *next;
1387 
1388       sym = symbol_new (defsyms->name, absolute_section,
1389 			&zero_address_frag, defsyms->value);
1390       /* Make symbols defined on the command line volatile, so that they
1391 	 can be redefined inside a source file.  This makes this assembler's
1392 	 behaviour compatible with earlier versions, but it may not be
1393 	 completely intuitive.  */
1394       S_SET_VOLATILE (sym);
1395       symbol_table_insert (sym);
1396       next = defsyms->next;
1397       free (defsyms);
1398       defsyms = next;
1399     }
1400 
1401   PROGRESS (1);
1402 
1403   /* Assemble it.  */
1404   perform_an_assembly_pass (argc, argv);
1405 
1406   cond_finish_check (-1);
1407 
1408 #ifdef md_end
1409   md_end ();
1410 #endif
1411 
1412 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
1413   if ((flag_execstack || flag_noexecstack)
1414       && OUTPUT_FLAVOR == bfd_target_elf_flavour)
1415     {
1416       segT gnustack;
1417 
1418       gnustack = subseg_new (".note.GNU-stack", 0);
1419       bfd_set_section_flags (gnustack,
1420 			     SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
1421 
1422     }
1423 #endif
1424 
1425   /* If we've been collecting dwarf2 .debug_line info, either for
1426      assembly debugging or on behalf of the compiler, emit it now.  */
1427   dwarf2_finish ();
1428 
1429   /* If we constructed dwarf2 .eh_frame info, either via .cfi
1430      directives from the user or by the backend, emit it now.  */
1431   cfi_finish ();
1432 
1433   keep_it = 0;
1434   if (seen_at_least_1_file ())
1435     {
1436       int n_warns, n_errs;
1437       char warn_msg[50];
1438       char err_msg[50];
1439 
1440       write_object_file ();
1441 
1442       n_warns = had_warnings ();
1443       n_errs = had_errors ();
1444 
1445       sprintf (warn_msg,
1446 	       ngettext ("%d warning", "%d warnings", n_warns), n_warns);
1447       sprintf (err_msg,
1448 	       ngettext ("%d error", "%d errors", n_errs), n_errs);
1449       if (flag_fatal_warnings && n_warns != 0)
1450 	{
1451 	  if (n_errs == 0)
1452 	    as_bad (_("%s, treating warnings as errors"), warn_msg);
1453 	  n_errs += n_warns;
1454 	}
1455 
1456       if (n_errs == 0)
1457 	keep_it = 1;
1458       else if (flag_always_generate_output)
1459 	{
1460 	  /* The -Z flag indicates that an object file should be generated,
1461 	     regardless of warnings and errors.  */
1462 	  keep_it = 1;
1463 	  fprintf (stderr, _("%s, %s, generating bad object file\n"),
1464 		   err_msg, warn_msg);
1465 	}
1466     }
1467 
1468   fflush (stderr);
1469 
1470 #ifndef NO_LISTING
1471   listing_print (listing_filename, argv_orig);
1472 #endif
1473 
1474   input_scrub_end ();
1475 
1476   END_PROGRESS (myname);
1477 
1478   /* Use xexit instead of return, because under VMS environments they
1479      may not place the same interpretation on the value given.  */
1480   if (had_errors () != 0)
1481     xexit (EXIT_FAILURE);
1482 
1483   /* Only generate dependency file if assembler was successful.  */
1484   print_dependencies ();
1485 
1486   xexit (EXIT_SUCCESS);
1487 }
1488