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