bfd/
[external/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 #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 \f
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 /* The interface between the macro code and gas expression handling.  */
851
852 static int
853 macro_expr (const char *emsg, int idx, sb *in, int *val)
854 {
855   char *hold;
856   expressionS ex;
857
858   sb_terminate (in);
859
860   hold = input_line_pointer;
861   input_line_pointer = in->ptr + idx;
862   expression (&ex);
863   idx = input_line_pointer - in->ptr;
864   input_line_pointer = hold;
865
866   if (ex.X_op != O_constant)
867     as_bad ("%s", emsg);
868
869   *val = (int) ex.X_add_number;
870
871   return idx;
872 }
873 \f
874 /* Here to attempt 1 pass over each input file.
875    We scan argv[*] looking for filenames or exactly "" which is
876    shorthand for stdin. Any argv that is NULL is not a file-name.
877    We set need_pass_2 TRUE if, after this, we still have unresolved
878    expressions of the form (unknown value)+-(unknown value).
879
880    Note the un*x semantics: there is only 1 logical input file, but it
881    may be a catenation of many 'physical' input files.  */
882
883 static void
884 perform_an_assembly_pass (int argc, char ** argv)
885 {
886   int saw_a_file = 0;
887 #ifdef BFD_ASSEMBLER
888   flagword applicable;
889 #endif
890
891   need_pass_2 = 0;
892
893 #ifndef BFD_ASSEMBLER
894 #ifdef MANY_SEGMENTS
895   {
896     unsigned int i;
897     for (i = SEG_E0; i < SEG_UNKNOWN; i++)
898       segment_info[i].fix_root = 0;
899   }
900   /* Create the three fixed ones.  */
901   {
902     segT seg;
903
904 #ifdef TE_APOLLO
905     seg = subseg_new (".wtext", 0);
906 #else
907     seg = subseg_new (".text", 0);
908 #endif
909     assert (seg == SEG_E0);
910     seg = subseg_new (".data", 0);
911     assert (seg == SEG_E1);
912     seg = subseg_new (".bss", 0);
913     assert (seg == SEG_E2);
914 #ifdef TE_APOLLO
915     create_target_segments ();
916 #endif
917   }
918
919 #else /* not MANY_SEGMENTS.  */
920   text_fix_root = NULL;
921   data_fix_root = NULL;
922   bss_fix_root = NULL;
923 #endif /* not MANY_SEGMENTS.  */
924 #else /* BFD_ASSEMBLER.  */
925   /* Create the standard sections, and those the assembler uses
926      internally.  */
927   text_section = subseg_new (TEXT_SECTION_NAME, 0);
928   data_section = subseg_new (DATA_SECTION_NAME, 0);
929   bss_section = subseg_new (BSS_SECTION_NAME, 0);
930   /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
931      to have relocs, otherwise we don't find out in time.  */
932   applicable = bfd_applicable_section_flags (stdoutput);
933   bfd_set_section_flags (stdoutput, text_section,
934                          applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
935                                        | SEC_CODE | SEC_READONLY));
936   bfd_set_section_flags (stdoutput, data_section,
937                          applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
938                                        | SEC_DATA));
939   bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
940   seg_info (bss_section)->bss = 1;
941   subseg_new (BFD_ABS_SECTION_NAME, 0);
942   subseg_new (BFD_UND_SECTION_NAME, 0);
943   reg_section = subseg_new ("*GAS `reg' section*", 0);
944   expr_section = subseg_new ("*GAS `expr' section*", 0);
945
946 #endif /* BFD_ASSEMBLER.  */
947
948   subseg_set (text_section, 0);
949
950   /* This may add symbol table entries, which requires having an open BFD,
951      and sections already created, in BFD_ASSEMBLER mode.  */
952   md_begin ();
953
954 #ifdef USING_CGEN
955   gas_cgen_begin ();
956 #endif
957 #ifdef obj_begin
958   obj_begin ();
959 #endif
960
961   /* Skip argv[0].  */
962   argv++;
963   argc--;
964
965   while (argc--)
966     {
967       if (*argv)
968         {                       /* Is it a file-name argument?  */
969           PROGRESS (1);
970           saw_a_file++;
971           /* argv->"" if stdin desired, else->filename.  */
972           read_a_source_file (*argv);
973         }
974       argv++;                   /* Completed that argv.  */
975     }
976   if (!saw_a_file)
977     read_a_source_file ("");
978 }
979 \f
980
981 int
982 main (int argc, char ** argv)
983 {
984   int macro_alternate;
985   int macro_strip_at;
986   int keep_it;
987
988   start_time = get_run_time ();
989
990 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
991   setlocale (LC_MESSAGES, "");
992 #endif
993 #if defined (HAVE_SETLOCALE)
994   setlocale (LC_CTYPE, "");
995 #endif
996   bindtextdomain (PACKAGE, LOCALEDIR);
997   textdomain (PACKAGE);
998
999   if (debug_memory)
1000     chunksize = 64;
1001
1002 #ifdef HOST_SPECIAL_INIT
1003   HOST_SPECIAL_INIT (argc, argv);
1004 #endif
1005
1006   myname = argv[0];
1007   xmalloc_set_program_name (myname);
1008
1009   START_PROGRESS (myname, 0);
1010
1011 #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
1012 #define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
1013 #endif
1014
1015   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
1016
1017   hex_init ();
1018 #ifdef BFD_ASSEMBLER
1019   bfd_init ();
1020   bfd_set_error_program_name (myname);
1021 #endif
1022
1023 #ifdef USE_EMULATIONS
1024   select_emulation_mode (argc, argv);
1025 #endif
1026
1027   PROGRESS (1);
1028   symbol_begin ();
1029   frag_init ();
1030   subsegs_begin ();
1031   parse_args (&argc, &argv);
1032   read_begin ();
1033   input_scrub_begin ();
1034   expr_begin ();
1035
1036   if (flag_print_statistics)
1037     xatexit (dump_statistics);
1038
1039   macro_alternate = 0;
1040   macro_strip_at = 0;
1041 #ifdef TC_I960
1042   macro_strip_at = flag_mri;
1043 #endif
1044 #ifdef TC_A29K
1045   /* For compatibility with the AMD 29K family macro assembler
1046      specification.  */
1047   macro_alternate = 1;
1048   macro_strip_at = 1;
1049 #endif
1050
1051   macro_init (macro_alternate, flag_mri, macro_strip_at, macro_expr);
1052
1053   PROGRESS (1);
1054
1055 #ifdef BFD_ASSEMBLER
1056   output_file_create (out_file_name);
1057   assert (stdoutput != 0);
1058 #endif
1059
1060 #ifdef tc_init_after_args
1061   tc_init_after_args ();
1062 #endif
1063
1064   itbl_init ();
1065
1066   /* Now that we have fully initialized, and have created the output
1067      file, define any symbols requested by --defsym command line
1068      arguments.  */
1069   while (defsyms != NULL)
1070     {
1071       symbolS *sym;
1072       struct defsym_list *next;
1073
1074       sym = symbol_new (defsyms->name, absolute_section, defsyms->value,
1075                         &zero_address_frag);
1076       symbol_table_insert (sym);
1077       next = defsyms->next;
1078       free (defsyms);
1079       defsyms = next;
1080     }
1081
1082   PROGRESS (1);
1083
1084   /* Assemble it.  */
1085   perform_an_assembly_pass (argc, argv);
1086
1087   cond_finish_check (-1);
1088
1089 #ifdef md_end
1090   md_end ();
1091 #endif
1092
1093 #if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
1094   if ((flag_execstack || flag_noexecstack)
1095       && OUTPUT_FLAVOR == bfd_target_elf_flavour)
1096     {
1097       segT gnustack;
1098
1099       gnustack = subseg_new (".note.GNU-stack", 0);
1100       bfd_set_section_flags (stdoutput, gnustack,
1101                              SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
1102                                                                              
1103     }
1104 #endif
1105
1106   /* If we've been collecting dwarf2 .debug_line info, either for
1107      assembly debugging or on behalf of the compiler, emit it now.  */
1108   dwarf2_finish ();
1109
1110   /* If we constructed dwarf2 .eh_frame info, either via .cfi 
1111      directives from the user or by the backend, emit it now.  */
1112   cfi_finish ();
1113
1114   if (seen_at_least_1_file ()
1115       && (flag_always_generate_output || had_errors () == 0))
1116     keep_it = 1;
1117   else
1118     keep_it = 0;
1119
1120 #if defined (BFD_ASSEMBLER) || !defined (BFD)
1121   /* This used to be done at the start of write_object_file in
1122      write.c, but that caused problems when doing listings when
1123      keep_it was zero.  This could probably be moved above md_end, but
1124      I didn't want to risk the change.  */
1125   subsegs_finish ();
1126 #endif
1127
1128   if (keep_it)
1129     write_object_file ();
1130
1131 #ifndef NO_LISTING
1132   listing_print (listing_filename);
1133 #endif
1134
1135 #ifndef OBJ_VMS /* Does its own file handling.  */
1136 #ifndef BFD_ASSEMBLER
1137   if (keep_it)
1138 #endif
1139     output_file_close (out_file_name);
1140 #endif
1141
1142   if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0)
1143     as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());
1144
1145   if (had_errors () > 0 && ! flag_always_generate_output)
1146     keep_it = 0;
1147
1148   if (!keep_it)
1149     unlink (out_file_name);
1150
1151   input_scrub_end ();
1152
1153   END_PROGRESS (myname);
1154
1155   /* Use xexit instead of return, because under VMS environments they
1156      may not place the same interpretation on the value given.  */
1157   if (had_errors () > 0)
1158     xexit (EXIT_FAILURE);
1159
1160   /* Only generate dependency file if assembler was successful.  */
1161   print_dependencies ();
1162
1163   xexit (EXIT_SUCCESS);
1164 }
1165