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