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