xref: /openbsd/gnu/usr.bin/binutils/gas/as.c (revision 76d0caae)
1 /* as.c - GAS main program.
2    Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002
4    Free Software Foundation, Inc.
5 
6    This file is part of GAS, the GNU Assembler.
7 
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2, or (at your option)
11    any later version.
12 
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21    02111-1307, USA.  */
22 
23 /* Main program for AS; a 32-bit assembler of GNU.
24    Understands command arguments.
25    Has a few routines that don't fit in other modules because they
26    are shared.
27 
28   			bugs
29 
30    : initialisers
31   	Since no-one else says they will support them in future: I
32    don't support them now.  */
33 
34 #include "ansidecl.h"
35 
36 #define COMMON
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 
46 #ifdef BFD_ASSEMBLER
47 #include "bfdver.h"
48 #endif
49 
50 #ifdef HAVE_ITBL_CPU
51 #include "itbl-ops.h"
52 #else
53 #define itbl_parse(itbl_file) 1
54 #define itbl_init()
55 #endif
56 
57 #ifdef HAVE_SBRK
58 #ifdef NEED_DECLARATION_SBRK
59 extern PTR sbrk ();
60 #endif
61 #endif
62 
63 #ifdef USING_CGEN
64 /* Perform any cgen specific initialisation for gas.  */
65 extern void gas_cgen_begin (void);
66 #endif
67 
68 /* Keep a record of the itbl files we read in.  */
69 struct itbl_file_list
70 {
71   struct itbl_file_list *next;
72   char *name;
73 };
74 
75 /* We build a list of defsyms as we read the options, and then define
76    them after we have initialized everything.  */
77 struct defsym_list
78 {
79   struct defsym_list *next;
80   char *name;
81   valueT value;
82 };
83 
84 
85 /* True if a listing is wanted.  */
86 int listing;
87 
88 /* Type of debugging to generate.  */
89 enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
90 int use_gnu_debug_info_extensions = 0;
91 
92 /* Maximum level of macro nesting.  */
93 int max_macro_nest = 100;
94 
95 /* argv[0]  */
96 char * myname;
97 
98 /* The default obstack chunk size.  If we set this to zero, the
99    obstack code will use whatever will fit in a 4096 byte block.  */
100 int chunksize = 0;
101 
102 /* To monitor memory allocation more effectively, make this non-zero.
103    Then the chunk sizes for gas and bfd will be reduced.  */
104 int debug_memory = 0;
105 
106 /* Enable verbose mode.  */
107 int verbose = 0;
108 
109 #ifdef BFD_ASSEMBLER
110 segT reg_section;
111 segT expr_section;
112 segT text_section;
113 segT data_section;
114 segT bss_section;
115 #endif
116 
117 /* Name of listing file.  */
118 static char *listing_filename = NULL;
119 
120 static struct defsym_list *defsyms;
121 
122 static struct itbl_file_list *itbl_files;
123 
124 static long start_time;
125 
126 
127 #ifdef USE_EMULATIONS
128 #define EMULATION_ENVIRON "AS_EMULATION"
129 
130 extern struct emulation mipsbelf, mipslelf, mipself;
131 extern struct emulation mipsbecoff, mipslecoff, mipsecoff;
132 extern struct emulation i386coff, i386elf, i386aout;
133 extern struct emulation crisaout, criself;
134 
135 static struct emulation *const emulations[] = { EMULATIONS };
136 static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
137 
138 static void
139 select_emulation_mode (int argc, char **argv)
140 {
141   int i;
142   char *p, *em = 0;
143 
144   for (i = 1; i < argc; i++)
145     if (!strncmp ("--em", argv[i], 4))
146       break;
147 
148   if (i == argc)
149     goto do_default;
150 
151   p = strchr (argv[i], '=');
152   if (p)
153     p++;
154   else
155     p = argv[i + 1];
156 
157   if (!p || !*p)
158     as_fatal (_("missing emulation mode name"));
159   em = p;
160 
161  do_default:
162   if (em == 0)
163     em = getenv (EMULATION_ENVIRON);
164   if (em == 0)
165     em = DEFAULT_EMULATION;
166 
167   if (em)
168     {
169       for (i = 0; i < n_emulations; i++)
170 	if (!strcmp (emulations[i]->name, em))
171 	  break;
172       if (i == n_emulations)
173 	as_fatal (_("unrecognized emulation name `%s'"), em);
174       this_emulation = emulations[i];
175     }
176   else
177     this_emulation = emulations[0];
178 
179   this_emulation->init ();
180 }
181 
182 const char *
183 default_emul_bfd_name (void)
184 {
185   abort ();
186   return NULL;
187 }
188 
189 void
190 common_emul_init (void)
191 {
192   this_format = this_emulation->format;
193 
194   if (this_emulation->leading_underscore == 2)
195     this_emulation->leading_underscore = this_format->dfl_leading_underscore;
196 
197   if (this_emulation->default_endian != 2)
198     target_big_endian = this_emulation->default_endian;
199 
200   if (this_emulation->fake_label_name == 0)
201     {
202       if (this_emulation->leading_underscore)
203 	this_emulation->fake_label_name = "L0\001";
204       else
205 	/* What other parameters should we test?  */
206 	this_emulation->fake_label_name = ".L0\001";
207     }
208 }
209 #endif
210 
211 void
212 print_version_id (void)
213 {
214   static int printed;
215 
216   if (printed)
217     return;
218   printed = 1;
219 
220 #ifdef BFD_ASSEMBLER
221   fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s"),
222 	   VERSION, TARGET_ALIAS, BFD_VERSION_STRING);
223 #else
224   fprintf (stderr, _("GNU assembler version %s (%s)"), VERSION, TARGET_ALIAS);
225 #endif
226   fprintf (stderr, "\n");
227 }
228 
229 static void
230 show_usage (FILE * stream)
231 {
232   fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
233 
234   fprintf (stream, _("\
235 Options:\n\
236   -a[sub-option...]	  turn on listings\n\
237                       	  Sub-options [default hls]:\n\
238                       	  c      omit false conditionals\n\
239                       	  d      omit debugging directives\n\
240                       	  h      include high-level source\n\
241                       	  l      include assembly\n\
242                       	  m      include macro expansions\n\
243                       	  n      omit forms processing\n\
244                       	  s      include symbols\n\
245                       	  =FILE  list to FILE (must be last sub-option)\n"));
246 
247   fprintf (stream, _("\
248   -D                      produce assembler debugging messages\n"));
249   fprintf (stream, _("\
250   --defsym SYM=VAL        define symbol SYM to given value\n"));
251 #ifdef USE_EMULATIONS
252   {
253     int i;
254     char *def_em;
255 
256     fprintf (stream, "\
257   --em=[");
258     for (i = 0; i < n_emulations - 1; i++)
259       fprintf (stream, "%s | ", emulations[i]->name);
260     fprintf (stream, "%s]\n", emulations[i]->name);
261 
262     def_em = getenv (EMULATION_ENVIRON);
263     if (!def_em)
264       def_em = DEFAULT_EMULATION;
265     fprintf (stream, _("\
266                           emulate output (default %s)\n"), def_em);
267   }
268 #endif
269 #if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
270   fprintf (stream, _("\
271   --execstack             require executable stack for this object\n"));
272   fprintf (stream, _("\
273   --noexecstack           don't require executable stack for this object\n"));
274 #endif
275   fprintf (stream, _("\
276   -f                      skip whitespace and comment preprocessing\n"));
277   fprintf (stream, _("\
278   --gstabs                generate stabs debugging information\n"));
279   fprintf (stream, _("\
280   --gstabs+               generate stabs debug info with GNU extensions\n"));
281   fprintf (stream, _("\
282   --gdwarf2               generate DWARF2 debugging information\n"));
283   fprintf (stream, _("\
284   --help                  show this message and exit\n"));
285   fprintf (stream, _("\
286   --target-help           show target specific options\n"));
287   fprintf (stream, _("\
288   -I DIR                  add DIR to search list for .include directives\n"));
289   fprintf (stream, _("\
290   -J                      don't warn about signed overflow\n"));
291   fprintf (stream, _("\
292   -K                      warn when differences altered for long displacements\n"));
293   fprintf (stream, _("\
294   -L,--keep-locals        keep local symbols (e.g. starting with `L')\n"));
295   fprintf (stream, _("\
296   -M,--mri                assemble in MRI compatibility mode\n"));
297   fprintf (stream, _("\
298   --MD FILE               write dependency information in FILE (default none)\n"));
299   fprintf (stream, _("\
300   -nocpp                  ignored\n"));
301   fprintf (stream, _("\
302   -o OBJFILE              name the object-file output OBJFILE (default a.out)\n"));
303   fprintf (stream, _("\
304   -R                      fold data section into text section\n"));
305   fprintf (stream, _("\
306   --statistics            print various measured statistics from execution\n"));
307   fprintf (stream, _("\
308   --strip-local-absolute  strip local absolute symbols\n"));
309   fprintf (stream, _("\
310   --traditional-format    Use same format as native assembler when possible\n"));
311   fprintf (stream, _("\
312   --version               print assembler version number and exit\n"));
313   fprintf (stream, _("\
314   -W  --no-warn           suppress warnings\n"));
315   fprintf (stream, _("\
316   --warn                  don't suppress warnings\n"));
317   fprintf (stream, _("\
318   --fatal-warnings        treat warnings as errors\n"));
319   fprintf (stream, _("\
320   --itbl INSTTBL          extend instruction set to include instructions\n\
321                           matching the specifications defined in file INSTTBL\n"));
322   fprintf (stream, _("\
323   -w                      ignored\n"));
324   fprintf (stream, _("\
325   -X                      ignored\n"));
326   fprintf (stream, _("\
327   -Z                      generate object file even after errors\n"));
328   fprintf (stream, _("\
329   --listing-lhs-width     set the width in words of the output data column of\n\
330                           the listing\n"));
331   fprintf (stream, _("\
332   --listing-lhs-width2    set the width in words of the continuation lines\n\
333                           of the output data column; ignored if smaller than\n\
334                           the width of the first line\n"));
335   fprintf (stream, _("\
336   --listing-rhs-width     set the max width in characters of the lines from\n\
337                           the source file\n"));
338   fprintf (stream, _("\
339   --listing-cont-lines    set the maximum number of continuation lines used\n\
340                           for the output data column of the listing\n"));
341 
342   md_show_usage (stream);
343 
344   fputc ('\n', stream);
345   fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
346 }
347 
348 /* Since it is easy to do here we interpret the special arg "-"
349    to mean "use stdin" and we set that argv[] pointing to "".
350    After we have munged argv[], the only things left are source file
351    name(s) and ""(s) denoting stdin. These file names are used
352    (perhaps more than once) later.
353 
354    check for new machine-dep cmdline options in
355    md_parse_option definitions in config/tc-*.c.  */
356 
357 static void
358 parse_args (int * pargc, char *** pargv)
359 {
360   int old_argc;
361   int new_argc;
362   char ** old_argv;
363   char ** new_argv;
364   /* Starting the short option string with '-' is for programs that
365      expect options and other ARGV-elements in any order and that care about
366      the ordering of the two.  We describe each non-option ARGV-element
367      as if it were the argument of an option with character code 1.  */
368   char *shortopts;
369   extern const char *md_shortopts;
370   static const char std_shortopts[] =
371   {
372     '-', 'J',
373 #ifndef WORKING_DOT_WORD
374     /* -K is not meaningful if .word is not being hacked.  */
375     'K',
376 #endif
377     'L', 'M', 'R', 'W', 'Z', 'a', ':', ':', 'D', 'f', 'I', ':', 'o', ':',
378 #ifndef VMS
379     /* -v takes an argument on VMS, so we don't make it a generic
380        option.  */
381     'v',
382 #endif
383     'w', 'X',
384     /* New option for extending instruction set (see also --itbl below).  */
385     't', ':',
386     '\0'
387   };
388   struct option *longopts;
389   extern struct option md_longopts[];
390   extern size_t md_longopts_size;
391   /* Codes used for the long options with no short synonyms.  */
392   enum option_values
393     {
394       OPTION_HELP = OPTION_STD_BASE,
395       OPTION_NOCPP,
396       OPTION_STATISTICS,
397       OPTION_VERSION,
398       OPTION_DUMPCONFIG,
399       OPTION_VERBOSE,
400       OPTION_EMULATION,
401       OPTION_DEFSYM,
402       OPTION_INSTTBL,
403       OPTION_LISTING_LHS_WIDTH,
404       OPTION_LISTING_LHS_WIDTH2,
405       OPTION_LISTING_RHS_WIDTH,
406       OPTION_LISTING_CONT_LINES,
407       OPTION_DEPFILE,
408       OPTION_GSTABS,
409       OPTION_GSTABS_PLUS,
410       OPTION_STRIP_LOCAL_ABSOLUTE,
411       OPTION_TRADITIONAL_FORMAT,
412       OPTION_GDWARF2,
413       OPTION_WARN,
414       OPTION_TARGET_HELP,
415       OPTION_EXECSTACK,
416       OPTION_NOEXECSTACK,
417       OPTION_WARN_FATAL
418     };
419 
420   static const struct option std_longopts[] =
421   {
422     {"help", no_argument, NULL, OPTION_HELP},
423     /* getopt allows abbreviations, so we do this to stop it from
424        treating -k as an abbreviation for --keep-locals.  Some
425        ports use -k to enable PIC assembly.  */
426     {"keep-locals", no_argument, NULL, 'L'},
427     {"keep-locals", no_argument, NULL, 'L'},
428     {"mri", no_argument, NULL, 'M'},
429     {"nocpp", no_argument, NULL, OPTION_NOCPP},
430     {"statistics", no_argument, NULL, OPTION_STATISTICS},
431     {"version", no_argument, NULL, OPTION_VERSION},
432     {"dump-config", no_argument, NULL, OPTION_DUMPCONFIG},
433     {"verbose", no_argument, NULL, OPTION_VERBOSE},
434     {"emulation", required_argument, NULL, OPTION_EMULATION},
435     {"defsym", required_argument, NULL, OPTION_DEFSYM},
436     /* New option for extending instruction set (see also -t above).
437        The "-t file" or "--itbl file" option extends the basic set of
438        valid instructions by reading "file", a text file containing a
439        list of instruction formats.  The additional opcodes and their
440        formats are added to the built-in set of instructions, and
441        mnemonics for new registers may also be defined.  */
442     {"itbl", required_argument, NULL, OPTION_INSTTBL},
443     {"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH},
444     {"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2},
445     {"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH},
446     {"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES},
447     {"MD", required_argument, NULL, OPTION_DEPFILE},
448     {"gstabs", no_argument, NULL, OPTION_GSTABS},
449     {"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS},
450     {"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE},
451     {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
452     {"gdwarf2", no_argument, NULL, OPTION_GDWARF2},
453     {"no-warn", no_argument, NULL, 'W'},
454     {"warn", no_argument, NULL, OPTION_WARN},
455     {"target-help", no_argument, NULL, OPTION_TARGET_HELP},
456 #if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
457     {"execstack", no_argument, NULL, OPTION_EXECSTACK},
458     {"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
459 #endif
460     {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
461     /* When you add options here, check that they do not collide with
462        OPTION_MD_BASE.  See as.h.  */
463   };
464 
465   /* Construct the option lists from the standard list and the target
466      dependent list.  Include space for an extra NULL option and
467      always NULL terminate.  */
468   shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
469   longopts = xmalloc (sizeof (std_longopts) + md_longopts_size + sizeof (struct option));
470   memcpy (longopts, std_longopts, sizeof (std_longopts));
471   memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size);
472   memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size,
473 	  0, sizeof (struct option));
474 
475   /* Make a local copy of the old argv.  */
476   old_argc = *pargc;
477   old_argv = *pargv;
478 
479   /* Initialize a new argv that contains no options.  */
480   new_argv = xmalloc (sizeof (char *) * (old_argc + 1));
481   new_argv[0] = old_argv[0];
482   new_argc = 1;
483   new_argv[new_argc] = NULL;
484 
485   while (1)
486     {
487       /* getopt_long_only is like getopt_long, but '-' as well as '--' can
488 	 indicate a long option.  */
489       int longind;
490       int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts,
491 				   &longind);
492 
493       if (optc == -1)
494 	break;
495 
496       switch (optc)
497 	{
498 	default:
499 	  /* md_parse_option should return 1 if it recognizes optc,
500 	     0 if not.  */
501 	  if (md_parse_option (optc, optarg) != 0)
502 	    break;
503 	  /* `-v' isn't included in the general short_opts list, so check for
504 	     it explicitly here before deciding we've gotten a bad argument.  */
505 	  if (optc == 'v')
506 	    {
507 #ifdef VMS
508 	      /* Telling getopt to treat -v's value as optional can result
509 		 in it picking up a following filename argument here.  The
510 		 VMS code in md_parse_option can return 0 in that case,
511 		 but it has no way of pushing the filename argument back.  */
512 	      if (optarg && *optarg)
513 		new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL;
514 	      else
515 #else
516 	      case 'v':
517 #endif
518 	      case OPTION_VERBOSE:
519 		print_version_id ();
520 		verbose = 1;
521 	      break;
522 	    }
523 	  /* Fall through.  */
524 
525 	case '?':
526 	  exit (EXIT_FAILURE);
527 
528 	case 1:			/* File name.  */
529 	  if (!strcmp (optarg, "-"))
530 	    optarg = "";
531 	  new_argv[new_argc++] = optarg;
532 	  new_argv[new_argc] = NULL;
533 	  break;
534 
535 	case OPTION_TARGET_HELP:
536 	  md_show_usage (stdout);
537 	  exit (EXIT_SUCCESS);
538 
539 	case OPTION_HELP:
540 	  show_usage (stdout);
541 	  exit (EXIT_SUCCESS);
542 
543 	case OPTION_NOCPP:
544 	  break;
545 
546 	case OPTION_STATISTICS:
547 	  flag_print_statistics = 1;
548 	  break;
549 
550 	case OPTION_STRIP_LOCAL_ABSOLUTE:
551 	  flag_strip_local_absolute = 1;
552 	  break;
553 
554 	case OPTION_TRADITIONAL_FORMAT:
555 	  flag_traditional_format = 1;
556 	  break;
557 
558 	case OPTION_VERSION:
559 	  /* This output is intended to follow the GNU standards document.  */
560 #ifdef BFD_ASSEMBLER
561 	  printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
562 #else
563 	  printf (_("GNU assembler %s\n"), VERSION);
564 #endif
565 	  printf (_("Copyright 2002 Free Software Foundation, Inc.\n"));
566 	  printf (_("\
567 This program is free software; you may redistribute it under the terms of\n\
568 the GNU General Public License.  This program has absolutely no warranty.\n"));
569 	  printf (_("This assembler was configured for a target of `%s'.\n"),
570 		  TARGET_ALIAS);
571 	  exit (EXIT_SUCCESS);
572 
573 	case OPTION_EMULATION:
574 #ifdef USE_EMULATIONS
575 	  if (strcmp (optarg, this_emulation->name))
576 	    as_fatal (_("multiple emulation names specified"));
577 #else
578 	  as_fatal (_("emulations not handled in this configuration"));
579 #endif
580 	  break;
581 
582 	case OPTION_DUMPCONFIG:
583 	  fprintf (stderr, _("alias = %s\n"), TARGET_ALIAS);
584 	  fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL);
585 	  fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU);
586 #ifdef TARGET_OBJ_FORMAT
587 	  fprintf (stderr, _("format = %s\n"), TARGET_OBJ_FORMAT);
588 #endif
589 #ifdef TARGET_FORMAT
590 	  fprintf (stderr, _("bfd-target = %s\n"), TARGET_FORMAT);
591 #endif
592 	  exit (EXIT_SUCCESS);
593 
594 	case OPTION_DEFSYM:
595 	  {
596 	    char *s;
597 	    valueT i;
598 	    struct defsym_list *n;
599 
600 	    for (s = optarg; *s != '\0' && *s != '='; s++)
601 	      ;
602 	    if (*s == '\0')
603 	      as_fatal (_("bad defsym; format is --defsym name=value"));
604 	    *s++ = '\0';
605 #ifdef BFD_ASSEMBLER
606 	    i = bfd_scan_vma (s, (const char **) NULL, 0);
607 #else
608 	    i = strtol (s, (char **) NULL, 0);
609 #endif
610 	    n = xmalloc (sizeof *n);
611 	    n->next = defsyms;
612 	    n->name = optarg;
613 	    n->value = i;
614 	    defsyms = n;
615 	  }
616 	  break;
617 
618 	case OPTION_INSTTBL:
619 	case 't':
620 	  {
621 	    /* optarg is the name of the file containing the instruction
622 	       formats, opcodes, register names, etc.  */
623 	    struct itbl_file_list *n;
624 
625 	    if (optarg == NULL)
626 	      {
627 		as_warn (_("no file name following -t option"));
628 		break;
629 	      }
630 
631 	    n = xmalloc (sizeof * n);
632 	    n->next = itbl_files;
633 	    n->name = optarg;
634 	    itbl_files = n;
635 
636 	    /* Parse the file and add the new instructions to our internal
637 	       table.  If multiple instruction tables are specified, the
638 	       information from this table gets appended onto the existing
639 	       internal table.  */
640 	    itbl_files->name = xstrdup (optarg);
641 	    if (itbl_parse (itbl_files->name) != 0)
642 	      as_fatal (_("failed to read instruction table %s\n"),
643 			itbl_files->name);
644 	  }
645 	  break;
646 
647 	case OPTION_DEPFILE:
648 	  start_dependencies (optarg);
649 	  break;
650 
651 	case OPTION_GSTABS_PLUS:
652 	  use_gnu_debug_info_extensions = 1;
653 	  /* Fall through.  */
654 	case OPTION_GSTABS:
655 	  debug_type = DEBUG_STABS;
656 	  break;
657 
658 	case OPTION_GDWARF2:
659 	  debug_type = DEBUG_DWARF2;
660 	  break;
661 
662 	case 'J':
663 	  flag_signed_overflow_ok = 1;
664 	  break;
665 
666 #ifndef WORKING_DOT_WORD
667 	case 'K':
668 	  flag_warn_displacement = 1;
669 	  break;
670 #endif
671 	case 'L':
672 	  flag_keep_locals = 1;
673 	  break;
674 
675 	case OPTION_LISTING_LHS_WIDTH:
676 	  listing_lhs_width = atoi (optarg);
677 	  if (listing_lhs_width_second < listing_lhs_width)
678 	    listing_lhs_width_second = listing_lhs_width;
679 	  break;
680 	case OPTION_LISTING_LHS_WIDTH2:
681 	  {
682 	    int tmp = atoi (optarg);
683 	    if (tmp > listing_lhs_width)
684 	      listing_lhs_width_second = tmp;
685 	  }
686 	  break;
687 	case OPTION_LISTING_RHS_WIDTH:
688 	  listing_rhs_width = atoi (optarg);
689 	  break;
690 	case OPTION_LISTING_CONT_LINES:
691 	  listing_lhs_cont_lines = atoi (optarg);
692 	  break;
693 
694 	case 'M':
695 	  flag_mri = 1;
696 #ifdef TC_M68K
697 	  flag_m68k_mri = 1;
698 #endif
699 	  break;
700 
701 	case 'R':
702 	  flag_readonly_data_in_text = 1;
703 	  break;
704 
705 	case 'W':
706 	  flag_no_warnings = 1;
707 	  break;
708 
709 	case OPTION_WARN:
710 	  flag_no_warnings = 0;
711 	  flag_fatal_warnings = 0;
712 	  break;
713 
714 	case OPTION_WARN_FATAL:
715 	  flag_no_warnings = 0;
716 	  flag_fatal_warnings = 1;
717 	  break;
718 
719 #if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
720 	case OPTION_EXECSTACK:
721 	  flag_execstack = 1;
722 	  flag_noexecstack = 0;
723 	  break;
724 
725 	case OPTION_NOEXECSTACK:
726 	  flag_noexecstack = 1;
727 	  flag_execstack = 0;
728 	  break;
729 #endif
730 	case 'Z':
731 	  flag_always_generate_output = 1;
732 	  break;
733 
734 	case 'a':
735 	  if (optarg)
736 	    {
737 	      if (md_parse_option (optc, optarg) != 0)
738 		break;
739 
740 	      while (*optarg)
741 		{
742 		  switch (*optarg)
743 		    {
744 		    case 'c':
745 		      listing |= LISTING_NOCOND;
746 		      break;
747 		    case 'd':
748 		      listing |= LISTING_NODEBUG;
749 		      break;
750 		    case 'h':
751 		      listing |= LISTING_HLL;
752 		      break;
753 		    case 'l':
754 		      listing |= LISTING_LISTING;
755 		      break;
756 		    case 'm':
757 		      listing |= LISTING_MACEXP;
758 		      break;
759 		    case 'n':
760 		      listing |= LISTING_NOFORM;
761 		      break;
762 		    case 's':
763 		      listing |= LISTING_SYMBOLS;
764 		      break;
765 		    case '=':
766 		      listing_filename = xstrdup (optarg + 1);
767 		      optarg += strlen (listing_filename);
768 		      break;
769 		    default:
770 		      as_fatal (_("invalid listing option `%c'"), *optarg);
771 		      break;
772 		    }
773 		  optarg++;
774 		}
775 	    }
776 	  if (!listing)
777 	    listing = LISTING_DEFAULT;
778 	  break;
779 
780 	case 'D':
781 	  /* DEBUG is implemented: it debugs different
782 	     things from other people's assemblers.  */
783 	  flag_debug = 1;
784 	  break;
785 
786 	case 'f':
787 	  flag_no_comments = 1;
788 	  break;
789 
790 	case 'I':
791 	  {			/* Include file directory.  */
792 	    char *temp = xstrdup (optarg);
793 	    add_include_dir (temp);
794 	    break;
795 	  }
796 
797 	case 'o':
798 	  out_file_name = xstrdup (optarg);
799 	  break;
800 
801 	case 'w':
802 	  break;
803 
804 	case 'X':
805 	  /* -X means treat warnings as errors.  */
806 	  break;
807 	}
808     }
809 
810   free (shortopts);
811   free (longopts);
812 
813   *pargc = new_argc;
814   *pargv = new_argv;
815 
816 #ifdef md_after_parse_args
817   md_after_parse_args ();
818 #endif
819 }
820 
821 static void
822 dump_statistics (void)
823 {
824 #ifdef HAVE_SBRK
825   char *lim = (char *) sbrk (0);
826 #endif
827   long run_time = get_run_time () - start_time;
828 
829   fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
830 	   myname, run_time / 1000000, run_time % 1000000);
831 #ifdef HAVE_SBRK
832   fprintf (stderr, _("%s: data size %ld\n"),
833 	   myname, (long) (lim - (char *) &environ));
834 #endif
835 
836   subsegs_print_statistics (stderr);
837   write_print_statistics (stderr);
838   symbol_print_statistics (stderr);
839   read_print_statistics (stderr);
840 
841 #ifdef tc_print_statistics
842   tc_print_statistics (stderr);
843 #endif
844 
845 #ifdef obj_print_statistics
846   obj_print_statistics (stderr);
847 #endif
848 }
849 
850 #ifndef OBJ_VMS
851 static void
852 close_output_file (void)
853 {
854   output_file_close (out_file_name);
855 }
856 #endif
857 
858 /* The interface between the macro code and gas expression handling.  */
859 
860 static int
861 macro_expr (const char *emsg, int idx, sb *in, int *val)
862 {
863   char *hold;
864   expressionS ex;
865 
866   sb_terminate (in);
867 
868   hold = input_line_pointer;
869   input_line_pointer = in->ptr + idx;
870   expression (&ex);
871   idx = input_line_pointer - in->ptr;
872   input_line_pointer = hold;
873 
874   if (ex.X_op != O_constant)
875     as_bad ("%s", emsg);
876 
877   *val = (int) ex.X_add_number;
878 
879   return idx;
880 }
881 
882 /* Here to attempt 1 pass over each input file.
883    We scan argv[*] looking for filenames or exactly "" which is
884    shorthand for stdin. Any argv that is NULL is not a file-name.
885    We set need_pass_2 TRUE if, after this, we still have unresolved
886    expressions of the form (unknown value)+-(unknown value).
887 
888    Note the un*x semantics: there is only 1 logical input file, but it
889    may be a catenation of many 'physical' input files.  */
890 
891 static void
892 perform_an_assembly_pass (int argc, char ** argv)
893 {
894   int saw_a_file = 0;
895 #ifdef BFD_ASSEMBLER
896   flagword applicable;
897 #endif
898 
899   need_pass_2 = 0;
900 
901 #ifndef BFD_ASSEMBLER
902 #ifdef MANY_SEGMENTS
903   {
904     unsigned int i;
905     for (i = SEG_E0; i < SEG_UNKNOWN; i++)
906       segment_info[i].fix_root = 0;
907   }
908   /* Create the three fixed ones.  */
909   {
910     segT seg;
911 
912 #ifdef TE_APOLLO
913     seg = subseg_new (".wtext", 0);
914 #else
915     seg = subseg_new (".text", 0);
916 #endif
917     assert (seg == SEG_E0);
918     seg = subseg_new (".data", 0);
919     assert (seg == SEG_E1);
920     seg = subseg_new (".bss", 0);
921     assert (seg == SEG_E2);
922 #ifdef TE_APOLLO
923     create_target_segments ();
924 #endif
925   }
926 
927 #else /* not MANY_SEGMENTS.  */
928   text_fix_root = NULL;
929   data_fix_root = NULL;
930   bss_fix_root = NULL;
931 #endif /* not MANY_SEGMENTS.  */
932 #else /* BFD_ASSEMBLER.  */
933   /* Create the standard sections, and those the assembler uses
934      internally.  */
935   text_section = subseg_new (TEXT_SECTION_NAME, 0);
936   data_section = subseg_new (DATA_SECTION_NAME, 0);
937   bss_section = subseg_new (BSS_SECTION_NAME, 0);
938   /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
939      to have relocs, otherwise we don't find out in time.  */
940   applicable = bfd_applicable_section_flags (stdoutput);
941   bfd_set_section_flags (stdoutput, text_section,
942 			 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
943 				       | SEC_CODE | SEC_READONLY));
944   bfd_set_section_flags (stdoutput, data_section,
945 			 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
946 				       | SEC_DATA));
947   bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
948   seg_info (bss_section)->bss = 1;
949   subseg_new (BFD_ABS_SECTION_NAME, 0);
950   subseg_new (BFD_UND_SECTION_NAME, 0);
951   reg_section = subseg_new ("*GAS `reg' section*", 0);
952   expr_section = subseg_new ("*GAS `expr' section*", 0);
953 
954 #endif /* BFD_ASSEMBLER.  */
955 
956   subseg_set (text_section, 0);
957 
958   /* This may add symbol table entries, which requires having an open BFD,
959      and sections already created, in BFD_ASSEMBLER mode.  */
960   md_begin ();
961 
962 #ifdef USING_CGEN
963   gas_cgen_begin ();
964 #endif
965 #ifdef obj_begin
966   obj_begin ();
967 #endif
968 
969   /* Skip argv[0].  */
970   argv++;
971   argc--;
972 
973   while (argc--)
974     {
975       if (*argv)
976 	{			/* Is it a file-name argument?  */
977 	  PROGRESS (1);
978 	  saw_a_file++;
979 	  /* argv->"" if stdin desired, else->filename.  */
980 	  read_a_source_file (*argv);
981 	}
982       argv++;			/* Completed that argv.  */
983     }
984   if (!saw_a_file)
985     read_a_source_file ("");
986 }
987 
988 
989 int
990 main (int argc, char ** argv)
991 {
992   int macro_alternate;
993   int macro_strip_at;
994   int keep_it;
995 
996   start_time = get_run_time ();
997 
998 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
999   setlocale (LC_MESSAGES, "");
1000 #endif
1001 #if defined (HAVE_SETLOCALE)
1002   setlocale (LC_CTYPE, "");
1003 #endif
1004   bindtextdomain (PACKAGE, LOCALEDIR);
1005   textdomain (PACKAGE);
1006 
1007   if (debug_memory)
1008     chunksize = 64;
1009 
1010 #ifdef HOST_SPECIAL_INIT
1011   HOST_SPECIAL_INIT (argc, argv);
1012 #endif
1013 
1014   myname = argv[0];
1015   xmalloc_set_program_name (myname);
1016 
1017   expandargv (&argc, &argv);
1018 
1019   START_PROGRESS (myname, 0);
1020 
1021 #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
1022 #define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
1023 #endif
1024 
1025   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
1026 
1027   hex_init ();
1028 #ifdef BFD_ASSEMBLER
1029   bfd_init ();
1030   bfd_set_error_program_name (myname);
1031 #endif
1032 
1033 #ifdef USE_EMULATIONS
1034   select_emulation_mode (argc, argv);
1035 #endif
1036 
1037   PROGRESS (1);
1038   symbol_begin ();
1039   frag_init ();
1040   subsegs_begin ();
1041   parse_args (&argc, &argv);
1042   read_begin ();
1043   input_scrub_begin ();
1044   expr_begin ();
1045 
1046 #ifndef OBJ_VMS /* Does its own file handling. */
1047   /* It has to be called after dump_statistics (). */
1048   xatexit (close_output_file);
1049 #endif
1050 
1051   if (flag_print_statistics)
1052     xatexit (dump_statistics);
1053 
1054   macro_alternate = 0;
1055   macro_strip_at = 0;
1056 #ifdef TC_I960
1057   macro_strip_at = flag_mri;
1058 #endif
1059 #ifdef TC_A29K
1060   /* For compatibility with the AMD 29K family macro assembler
1061      specification.  */
1062   macro_alternate = 1;
1063   macro_strip_at = 1;
1064 #endif
1065 
1066   macro_init (macro_alternate, flag_mri, macro_strip_at, macro_expr);
1067 
1068   PROGRESS (1);
1069 
1070 #ifdef BFD_ASSEMBLER
1071   output_file_create (out_file_name);
1072   assert (stdoutput != 0);
1073 #endif
1074 
1075 #ifdef tc_init_after_args
1076   tc_init_after_args ();
1077 #endif
1078 
1079   itbl_init ();
1080 
1081   /* Now that we have fully initialized, and have created the output
1082      file, define any symbols requested by --defsym command line
1083      arguments.  */
1084   while (defsyms != NULL)
1085     {
1086       symbolS *sym;
1087       struct defsym_list *next;
1088 
1089       sym = symbol_new (defsyms->name, absolute_section, defsyms->value,
1090 			&zero_address_frag);
1091       symbol_table_insert (sym);
1092       next = defsyms->next;
1093       free (defsyms);
1094       defsyms = next;
1095     }
1096 
1097   PROGRESS (1);
1098 
1099   /* Assemble it.  */
1100   perform_an_assembly_pass (argc, argv);
1101 
1102   cond_finish_check (-1);
1103 
1104 #ifdef md_end
1105   md_end ();
1106 #endif
1107 
1108 #if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
1109   if ((flag_execstack || flag_noexecstack)
1110       && OUTPUT_FLAVOR == bfd_target_elf_flavour)
1111     {
1112       segT gnustack;
1113 
1114       gnustack = subseg_new (".note.GNU-stack", 0);
1115       bfd_set_section_flags (stdoutput, gnustack,
1116 			     SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
1117 
1118     }
1119 #endif
1120 
1121   /* If we've been collecting dwarf2 .debug_line info, either for
1122      assembly debugging or on behalf of the compiler, emit it now.  */
1123   dwarf2_finish ();
1124 
1125   /* If we constructed dwarf2 .eh_frame info, either via .cfi
1126      directives from the user or by the backend, emit it now.  */
1127   cfi_finish ();
1128 
1129   if (seen_at_least_1_file ()
1130       && (flag_always_generate_output || had_errors () == 0))
1131     keep_it = 1;
1132   else
1133     keep_it = 0;
1134 
1135 #if defined (BFD_ASSEMBLER) || !defined (BFD)
1136   /* This used to be done at the start of write_object_file in
1137      write.c, but that caused problems when doing listings when
1138      keep_it was zero.  This could probably be moved above md_end, but
1139      I didn't want to risk the change.  */
1140   subsegs_finish ();
1141 #endif
1142 
1143   if (keep_it)
1144     write_object_file ();
1145 
1146 #ifndef NO_LISTING
1147   listing_print (listing_filename);
1148 #endif
1149 
1150   if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0)
1151     as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());
1152 
1153   if (had_errors () > 0 && ! flag_always_generate_output)
1154     keep_it = 0;
1155 
1156   if (!keep_it)
1157     unlink (out_file_name);
1158 
1159   input_scrub_end ();
1160 
1161   END_PROGRESS (myname);
1162 
1163   /* Use xexit instead of return, because under VMS environments they
1164      may not place the same interpretation on the value given.  */
1165   if (had_errors () > 0)
1166     xexit (EXIT_FAILURE);
1167 
1168   /* Only generate dependency file if assembler was successful.  */
1169   print_dependencies ();
1170 
1171   xexit (EXIT_SUCCESS);
1172 }
1173 
1174