* listing.c: Add -ag listing flag to show general information in
[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, 2003, 2004, 2005, 2006, 2007, 2008
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 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful, but WITHOUT
14    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16    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, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, 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 #define COMMON
35
36 #include "as.h"
37 #include "subsegs.h"
38 #include "output-file.h"
39 #include "sb.h"
40 #include "macro.h"
41 #include "dwarf2dbg.h"
42 #include "dw2gencfi.h"
43 #include "bfdver.h"
44
45 #ifdef HAVE_ITBL_CPU
46 #include "itbl-ops.h"
47 #else
48 #define itbl_init()
49 #endif
50
51 #ifdef HAVE_SBRK
52 #ifdef NEED_DECLARATION_SBRK
53 extern PTR sbrk ();
54 #endif
55 #endif
56
57 #ifdef USING_CGEN
58 /* Perform any cgen specific initialisation for gas.  */
59 extern void gas_cgen_begin (void);
60 #endif
61
62 /* We build a list of defsyms as we read the options, and then define
63    them after we have initialized everything.  */
64 struct defsym_list
65 {
66   struct defsym_list *next;
67   char *name;
68   valueT value;
69 };
70
71
72 /* True if a listing is wanted.  */
73 int listing;
74
75 /* Type of debugging to generate.  */
76 enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
77 int use_gnu_debug_info_extensions = 0;
78
79 #ifndef MD_DEBUG_FORMAT_SELECTOR
80 #define MD_DEBUG_FORMAT_SELECTOR NULL
81 #endif
82 static enum debug_info_type (*md_debug_format_selector) (int *) = MD_DEBUG_FORMAT_SELECTOR;
83
84 /* Maximum level of macro nesting.  */
85 int max_macro_nest = 100;
86
87 /* argv[0]  */
88 static char * myname;
89
90 /* The default obstack chunk size.  If we set this to zero, the
91    obstack code will use whatever will fit in a 4096 byte block.  */
92 int chunksize = 0;
93
94 /* To monitor memory allocation more effectively, make this non-zero.
95    Then the chunk sizes for gas and bfd will be reduced.  */
96 int debug_memory = 0;
97
98 /* Enable verbose mode.  */
99 int verbose = 0;
100
101 segT reg_section;
102 segT expr_section;
103 segT text_section;
104 segT data_section;
105 segT bss_section;
106
107 /* Name of listing file.  */
108 static char *listing_filename = NULL;
109
110 static struct defsym_list *defsyms;
111
112 #ifdef HAVE_ITBL_CPU
113 /* Keep a record of the itbl files we read in.  */
114 struct itbl_file_list
115 {
116   struct itbl_file_list *next;
117   char *name;
118 };
119 static struct itbl_file_list *itbl_files;
120 #endif
121
122 static long start_time;
123
124 static int flag_macro_alternate;
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   fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s\n"),
221            VERSION, TARGET_ALIAS, BFD_VERSION_STRING);
222 }
223
224 static void
225 show_usage (FILE * stream)
226 {
227   fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
228
229   fprintf (stream, _("\
230 Options:\n\
231   -a[sub-option...]       turn on listings\n\
232                           Sub-options [default hls]:\n\
233                           c      omit false conditionals\n\
234                           d      omit debugging directives\n\
235                           g      include general info\n\
236                           h      include high-level source\n\
237                           l      include assembly\n\
238                           m      include macro expansions\n\
239                           n      omit forms processing\n\
240                           s      include symbols\n\
241                           =FILE  list to FILE (must be last sub-option)\n"));
242
243   fprintf (stream, _("\
244   --alternate             initially turn on alternate macro syntax\n"));
245   fprintf (stream, _("\
246   -D                      produce assembler debugging messages\n"));
247   fprintf (stream, _("\
248   --debug-prefix-map OLD=NEW  Map OLD to NEW in debug information\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 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   -g --gen-debug          generate debugging information\n"));
279   fprintf (stream, _("\
280   --gstabs                generate STABS debugging information\n"));
281   fprintf (stream, _("\
282   --gstabs+               generate STABS debug info with GNU extensions\n"));
283   fprintf (stream, _("\
284   --gdwarf-2              generate DWARF2 debugging information\n"));
285   fprintf (stream, _("\
286   --hash-size=<value>     set the hash table size close to <value>\n"));
287   fprintf (stream, _("\
288   --help                  show this message and exit\n"));
289   fprintf (stream, _("\
290   --target-help           show target specific options\n"));
291   fprintf (stream, _("\
292   -I DIR                  add DIR to search list for .include directives\n"));
293   fprintf (stream, _("\
294   -J                      don't warn about signed overflow\n"));
295   fprintf (stream, _("\
296   -K                      warn when differences altered for long displacements\n"));
297   fprintf (stream, _("\
298   -L,--keep-locals        keep local symbols (e.g. starting with `L')\n"));
299   fprintf (stream, _("\
300   -M,--mri                assemble in MRI compatibility mode\n"));
301   fprintf (stream, _("\
302   --MD FILE               write dependency information in FILE (default none)\n"));
303   fprintf (stream, _("\
304   -nocpp                  ignored\n"));
305   fprintf (stream, _("\
306   -o OBJFILE              name the object-file output OBJFILE (default a.out)\n"));
307   fprintf (stream, _("\
308   -R                      fold data section into text section\n"));
309   fprintf (stream, _("\
310   --reduce-memory-overheads \n\
311                           prefer smaller memory use at the cost of longer\n\
312                           assembly times\n"));
313   fprintf (stream, _("\
314   --statistics            print various measured statistics from execution\n"));
315   fprintf (stream, _("\
316   --strip-local-absolute  strip local absolute symbols\n"));
317   fprintf (stream, _("\
318   --traditional-format    Use same format as native assembler when possible\n"));
319   fprintf (stream, _("\
320   --version               print assembler version number and exit\n"));
321   fprintf (stream, _("\
322   -W  --no-warn           suppress warnings\n"));
323   fprintf (stream, _("\
324   --warn                  don't suppress warnings\n"));
325   fprintf (stream, _("\
326   --fatal-warnings        treat warnings as errors\n"));
327 #ifdef HAVE_ITBL_CPU
328   fprintf (stream, _("\
329   --itbl INSTTBL          extend instruction set to include instructions\n\
330                           matching the specifications defined in file INSTTBL\n"));
331 #endif
332   fprintf (stream, _("\
333   -w                      ignored\n"));
334   fprintf (stream, _("\
335   -X                      ignored\n"));
336   fprintf (stream, _("\
337   -Z                      generate object file even after errors\n"));
338   fprintf (stream, _("\
339   --listing-lhs-width     set the width in words of the output data column of\n\
340                           the listing\n"));
341   fprintf (stream, _("\
342   --listing-lhs-width2    set the width in words of the continuation lines\n\
343                           of the output data column; ignored if smaller than\n\
344                           the width of the first line\n"));
345   fprintf (stream, _("\
346   --listing-rhs-width     set the max width in characters of the lines from\n\
347                           the source file\n"));
348   fprintf (stream, _("\
349   --listing-cont-lines    set the maximum number of continuation lines used\n\
350                           for the output data column of the listing\n"));
351   fprintf (stream, _("\
352   @FILE                   read options from FILE\n")); 
353
354   md_show_usage (stream);
355
356   fputc ('\n', stream);
357
358   if (REPORT_BUGS_TO[0] && stream == stdout)
359     fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
360 }
361
362 /* Since it is easy to do here we interpret the special arg "-"
363    to mean "use stdin" and we set that argv[] pointing to "".
364    After we have munged argv[], the only things left are source file
365    name(s) and ""(s) denoting stdin. These file names are used
366    (perhaps more than once) later.
367
368    check for new machine-dep cmdline options in
369    md_parse_option definitions in config/tc-*.c.  */
370
371 static void
372 parse_args (int * pargc, char *** pargv)
373 {
374   int old_argc;
375   int new_argc;
376   char ** old_argv;
377   char ** new_argv;
378   /* Starting the short option string with '-' is for programs that
379      expect options and other ARGV-elements in any order and that care about
380      the ordering of the two.  We describe each non-option ARGV-element
381      as if it were the argument of an option with character code 1.  */
382   char *shortopts;
383   extern const char *md_shortopts;
384   static const char std_shortopts[] =
385   {
386     '-', 'J',
387 #ifndef WORKING_DOT_WORD
388     /* -K is not meaningful if .word is not being hacked.  */
389     'K',
390 #endif
391     'L', 'M', 'R', 'W', 'Z', 'a', ':', ':', 'D', 'f', 'g', ':',':', 'I', ':', 'o', ':',
392 #ifndef VMS
393     /* -v takes an argument on VMS, so we don't make it a generic
394        option.  */
395     'v',
396 #endif
397     'w', 'X',
398 #ifdef HAVE_ITBL_CPU
399     /* New option for extending instruction set (see also --itbl below).  */
400     't', ':',
401 #endif
402     '\0'
403   };
404   struct option *longopts;
405   extern struct option md_longopts[];
406   extern size_t md_longopts_size;
407   /* Codes used for the long options with no short synonyms.  */
408   enum option_values
409     {
410       OPTION_HELP = OPTION_STD_BASE,
411       OPTION_NOCPP,
412       OPTION_STATISTICS,
413       OPTION_VERSION,
414       OPTION_DUMPCONFIG,
415       OPTION_VERBOSE,
416       OPTION_EMULATION,
417       OPTION_DEBUG_PREFIX_MAP,
418       OPTION_DEFSYM,
419       OPTION_LISTING_LHS_WIDTH,
420       OPTION_LISTING_LHS_WIDTH2,
421       OPTION_LISTING_RHS_WIDTH,
422       OPTION_LISTING_CONT_LINES,
423       OPTION_DEPFILE,
424       OPTION_GSTABS,
425       OPTION_GSTABS_PLUS,
426       OPTION_GDWARF2,
427       OPTION_STRIP_LOCAL_ABSOLUTE,
428       OPTION_TRADITIONAL_FORMAT,
429       OPTION_WARN,
430       OPTION_TARGET_HELP,
431       OPTION_EXECSTACK,
432       OPTION_NOEXECSTACK,
433       OPTION_ALTERNATE,
434       OPTION_AL,
435       OPTION_HASH_TABLE_SIZE,
436       OPTION_REDUCE_MEMORY_OVERHEADS,
437       OPTION_WARN_FATAL
438     /* When you add options here, check that they do
439        not collide with OPTION_MD_BASE.  See as.h.  */
440     };
441   
442   static const struct option std_longopts[] =
443   {
444     /* Note: commas are placed at the start of the line rather than
445        the end of the preceeding line so that it is simpler to
446        selectively add and remove lines from this list.  */
447     {"alternate", no_argument, NULL, OPTION_ALTERNATE}
448     /* The entry for "a" is here to prevent getopt_long_only() from
449        considering that -a is an abbreviation for --alternate.  This is
450        necessary because -a=<FILE> is a valid switch but getopt would
451        normally reject it since --alternate does not take an argument.  */
452     ,{"a", optional_argument, NULL, 'a'}
453     /* Handle -al=<FILE>.  */
454     ,{"al", optional_argument, NULL, OPTION_AL}
455     ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP}
456     ,{"defsym", required_argument, NULL, OPTION_DEFSYM}
457     ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}
458     ,{"emulation", required_argument, NULL, OPTION_EMULATION}
459 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
460     ,{"execstack", no_argument, NULL, OPTION_EXECSTACK}
461     ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK}
462 #endif
463     ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
464     ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF2}
465     /* GCC uses --gdwarf-2 but GAS uses to use --gdwarf2,
466        so we keep it here for backwards compatibility.  */
467     ,{"gdwarf2", no_argument, NULL, OPTION_GDWARF2}
468     ,{"gen-debug", no_argument, NULL, 'g'}
469     ,{"gstabs", no_argument, NULL, OPTION_GSTABS}
470     ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS}
471     ,{"hash-size", required_argument, NULL, OPTION_HASH_TABLE_SIZE}
472     ,{"help", no_argument, NULL, OPTION_HELP}
473 #ifdef HAVE_ITBL_CPU
474     /* New option for extending instruction set (see also -t above).
475        The "-t file" or "--itbl file" option extends the basic set of
476        valid instructions by reading "file", a text file containing a
477        list of instruction formats.  The additional opcodes and their
478        formats are added to the built-in set of instructions, and
479        mnemonics for new registers may also be defined.  */
480     ,{"itbl", required_argument, NULL, 't'}
481 #endif
482     /* getopt allows abbreviations, so we do this to stop it from
483        treating -k as an abbreviation for --keep-locals.  Some
484        ports use -k to enable PIC assembly.  */
485     ,{"keep-locals", no_argument, NULL, 'L'}
486     ,{"keep-locals", no_argument, NULL, 'L'}
487     ,{"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH}
488     ,{"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2}
489     ,{"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH}
490     ,{"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES}
491     ,{"MD", required_argument, NULL, OPTION_DEPFILE}
492     ,{"mri", no_argument, NULL, 'M'}
493     ,{"nocpp", no_argument, NULL, OPTION_NOCPP}
494     ,{"no-warn", no_argument, NULL, 'W'}
495     ,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS}
496     ,{"statistics", no_argument, NULL, OPTION_STATISTICS}
497     ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE}
498     ,{"version", no_argument, NULL, OPTION_VERSION}
499     ,{"verbose", no_argument, NULL, OPTION_VERBOSE}
500     ,{"target-help", no_argument, NULL, OPTION_TARGET_HELP}
501     ,{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}
502     ,{"warn", no_argument, NULL, OPTION_WARN}
503   };
504
505   /* Construct the option lists from the standard list and the target
506      dependent list.  Include space for an extra NULL option and
507      always NULL terminate.  */
508   shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
509   longopts = xmalloc (sizeof (std_longopts) + md_longopts_size + sizeof (struct option));
510   memcpy (longopts, std_longopts, sizeof (std_longopts));
511   memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size);
512   memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size,
513           0, sizeof (struct option));
514
515   /* Make a local copy of the old argv.  */
516   old_argc = *pargc;
517   old_argv = *pargv;
518
519   /* Initialize a new argv that contains no options.  */
520   new_argv = xmalloc (sizeof (char *) * (old_argc + 1));
521   new_argv[0] = old_argv[0];
522   new_argc = 1;
523   new_argv[new_argc] = NULL;
524
525   while (1)
526     {
527       /* getopt_long_only is like getopt_long, but '-' as well as '--' can
528          indicate a long option.  */
529       int longind;
530       int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts,
531                                    &longind);
532
533       if (optc == -1)
534         break;
535
536       switch (optc)
537         {
538         default:
539           /* md_parse_option should return 1 if it recognizes optc,
540              0 if not.  */
541           if (md_parse_option (optc, optarg) != 0)
542             break;
543           /* `-v' isn't included in the general short_opts list, so check for
544              it explicitly here before deciding we've gotten a bad argument.  */
545           if (optc == 'v')
546             {
547 #ifdef VMS
548               /* Telling getopt to treat -v's value as optional can result
549                  in it picking up a following filename argument here.  The
550                  VMS code in md_parse_option can return 0 in that case,
551                  but it has no way of pushing the filename argument back.  */
552               if (optarg && *optarg)
553                 new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL;
554               else
555 #else
556               case 'v':
557 #endif
558               case OPTION_VERBOSE:
559                 print_version_id ();
560                 verbose = 1;
561               break;
562             }
563           else
564             as_bad (_("unrecognized option -%c%s"), optc, optarg ? optarg : "");
565           /* Fall through.  */
566
567         case '?':
568           exit (EXIT_FAILURE);
569
570         case 1:                 /* File name.  */
571           if (!strcmp (optarg, "-"))
572             optarg = "";
573           new_argv[new_argc++] = optarg;
574           new_argv[new_argc] = NULL;
575           break;
576
577         case OPTION_TARGET_HELP:
578           md_show_usage (stdout);
579           exit (EXIT_SUCCESS);
580
581         case OPTION_HELP:
582           show_usage (stdout);
583           exit (EXIT_SUCCESS);
584
585         case OPTION_NOCPP:
586           break;
587
588         case OPTION_STATISTICS:
589           flag_print_statistics = 1;
590           break;
591
592         case OPTION_STRIP_LOCAL_ABSOLUTE:
593           flag_strip_local_absolute = 1;
594           break;
595
596         case OPTION_TRADITIONAL_FORMAT:
597           flag_traditional_format = 1;
598           break;
599
600         case OPTION_VERSION:
601           /* This output is intended to follow the GNU standards document.  */
602           printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
603           printf (_("Copyright 2007 Free Software Foundation, Inc.\n"));
604           printf (_("\
605 This program is free software; you may redistribute it under the terms of\n\
606 the GNU General Public License version 3 or later.\n\
607 This program has absolutely no warranty.\n"));
608           printf (_("This assembler was configured for a target of `%s'.\n"),
609                   TARGET_ALIAS);
610           exit (EXIT_SUCCESS);
611
612         case OPTION_EMULATION:
613 #ifdef USE_EMULATIONS
614           if (strcmp (optarg, this_emulation->name))
615             as_fatal (_("multiple emulation names specified"));
616 #else
617           as_fatal (_("emulations not handled in this configuration"));
618 #endif
619           break;
620
621         case OPTION_DUMPCONFIG:
622           fprintf (stderr, _("alias = %s\n"), TARGET_ALIAS);
623           fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL);
624           fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU);
625 #ifdef TARGET_OBJ_FORMAT
626           fprintf (stderr, _("format = %s\n"), TARGET_OBJ_FORMAT);
627 #endif
628 #ifdef TARGET_FORMAT
629           fprintf (stderr, _("bfd-target = %s\n"), TARGET_FORMAT);
630 #endif
631           exit (EXIT_SUCCESS);
632
633         case OPTION_DEBUG_PREFIX_MAP:
634           add_debug_prefix_map (optarg);
635           break;
636
637         case OPTION_DEFSYM:
638           {
639             char *s;
640             valueT i;
641             struct defsym_list *n;
642
643             for (s = optarg; *s != '\0' && *s != '='; s++)
644               ;
645             if (*s == '\0')
646               as_fatal (_("bad defsym; format is --defsym name=value"));
647             *s++ = '\0';
648             i = bfd_scan_vma (s, (const char **) NULL, 0);
649             n = xmalloc (sizeof *n);
650             n->next = defsyms;
651             n->name = optarg;
652             n->value = i;
653             defsyms = n;
654           }
655           break;
656
657 #ifdef HAVE_ITBL_CPU
658         case 't':
659           {
660             /* optarg is the name of the file containing the instruction
661                formats, opcodes, register names, etc.  */
662             struct itbl_file_list *n;
663
664             if (optarg == NULL)
665               {
666                 as_warn (_("no file name following -t option"));
667                 break;
668               }
669
670             n = xmalloc (sizeof * n);
671             n->next = itbl_files;
672             n->name = optarg;
673             itbl_files = n;
674
675             /* Parse the file and add the new instructions to our internal
676                table.  If multiple instruction tables are specified, the
677                information from this table gets appended onto the existing
678                internal table.  */
679             itbl_files->name = xstrdup (optarg);
680             if (itbl_parse (itbl_files->name) != 0)
681               as_fatal (_("failed to read instruction table %s\n"),
682                         itbl_files->name);
683           }
684           break;
685 #endif
686
687         case OPTION_DEPFILE:
688           start_dependencies (optarg);
689           break;
690
691         case 'g':
692           /* Some backends, eg Alpha and Mips, use the -g switch for their
693              own purposes.  So we check here for an explicit -g and allow
694              the backend to decide if it wants to process it.  */
695           if (   old_argv[optind - 1][1] == 'g'
696               && md_parse_option (optc, optarg))
697             continue;
698
699           if (md_debug_format_selector)
700             debug_type = md_debug_format_selector (& use_gnu_debug_info_extensions);
701           else if (IS_ELF)
702             debug_type = DEBUG_DWARF2;
703           else
704             debug_type = DEBUG_STABS;
705           break;
706
707         case OPTION_GSTABS_PLUS:
708           use_gnu_debug_info_extensions = 1;
709           /* Fall through.  */
710         case OPTION_GSTABS:
711           debug_type = DEBUG_STABS;
712           break;
713
714         case OPTION_GDWARF2:
715           debug_type = DEBUG_DWARF2;
716           break;
717
718         case 'J':
719           flag_signed_overflow_ok = 1;
720           break;
721
722 #ifndef WORKING_DOT_WORD
723         case 'K':
724           flag_warn_displacement = 1;
725           break;
726 #endif
727         case 'L':
728           flag_keep_locals = 1;
729           break;
730
731         case OPTION_LISTING_LHS_WIDTH:
732           listing_lhs_width = atoi (optarg);
733           if (listing_lhs_width_second < listing_lhs_width)
734             listing_lhs_width_second = listing_lhs_width;
735           break;
736         case OPTION_LISTING_LHS_WIDTH2:
737           {
738             int tmp = atoi (optarg);
739
740             if (tmp > listing_lhs_width)
741               listing_lhs_width_second = tmp;
742           }
743           break;
744         case OPTION_LISTING_RHS_WIDTH:
745           listing_rhs_width = atoi (optarg);
746           break;
747         case OPTION_LISTING_CONT_LINES:
748           listing_lhs_cont_lines = atoi (optarg);
749           break;
750
751         case 'M':
752           flag_mri = 1;
753 #ifdef TC_M68K
754           flag_m68k_mri = 1;
755 #endif
756           break;
757
758         case 'R':
759           flag_readonly_data_in_text = 1;
760           break;
761
762         case 'W':
763           flag_no_warnings = 1;
764           break;
765
766         case OPTION_WARN:
767           flag_no_warnings = 0;
768           flag_fatal_warnings = 0;
769           break;
770
771         case OPTION_WARN_FATAL:
772           flag_no_warnings = 0;
773           flag_fatal_warnings = 1;
774           break;
775
776 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
777         case OPTION_EXECSTACK:
778           flag_execstack = 1;
779           flag_noexecstack = 0;
780           break;
781
782         case OPTION_NOEXECSTACK:
783           flag_noexecstack = 1;
784           flag_execstack = 0;
785           break;
786 #endif
787         case 'Z':
788           flag_always_generate_output = 1;
789           break;
790
791         case OPTION_AL:
792           listing |= LISTING_LISTING;
793           if (optarg)
794             listing_filename = xstrdup (optarg);
795           break;
796
797         case OPTION_ALTERNATE:
798           optarg = old_argv [optind - 1];
799           while (* optarg == '-')
800             optarg ++;
801
802           if (strcmp (optarg, "alternate") == 0)
803             {
804               flag_macro_alternate = 1;
805               break;
806             }
807           optarg ++;
808           /* Fall through.  */
809
810         case 'a':
811           if (optarg)
812             {
813               if (optarg != old_argv[optind] && optarg[-1] == '=')
814                 --optarg;
815
816               if (md_parse_option (optc, optarg) != 0)
817                 break;
818
819               while (*optarg)
820                 {
821                   switch (*optarg)
822                     {
823                     case 'c':
824                       listing |= LISTING_NOCOND;
825                       break;
826                     case 'd':
827                       listing |= LISTING_NODEBUG;
828                       break;
829                     case 'g':
830                       listing |= LISTING_GENERAL;
831                       break;
832                     case 'h':
833                       listing |= LISTING_HLL;
834                       break;
835                     case 'l':
836                       listing |= LISTING_LISTING;
837                       break;
838                     case 'm':
839                       listing |= LISTING_MACEXP;
840                       break;
841                     case 'n':
842                       listing |= LISTING_NOFORM;
843                       break;
844                     case 's':
845                       listing |= LISTING_SYMBOLS;
846                       break;
847                     case '=':
848                       listing_filename = xstrdup (optarg + 1);
849                       optarg += strlen (listing_filename);
850                       break;
851                     default:
852                       as_fatal (_("invalid listing option `%c'"), *optarg);
853                       break;
854                     }
855                   optarg++;
856                 }
857             }
858           if (!listing)
859             listing = LISTING_DEFAULT;
860           break;
861
862         case 'D':
863           /* DEBUG is implemented: it debugs different
864              things from other people's assemblers.  */
865           flag_debug = 1;
866           break;
867
868         case 'f':
869           flag_no_comments = 1;
870           break;
871
872         case 'I':
873           {                     /* Include file directory.  */
874             char *temp = xstrdup (optarg);
875
876             add_include_dir (temp);
877             break;
878           }
879
880         case 'o':
881           out_file_name = xstrdup (optarg);
882           break;
883
884         case 'w':
885           break;
886
887         case 'X':
888           /* -X means treat warnings as errors.  */
889           break;
890
891         case OPTION_REDUCE_MEMORY_OVERHEADS:
892           /* The only change we make at the moment is to reduce
893              the size of the hash tables that we use.  */
894           set_gas_hash_table_size (4051);
895           break;
896
897         case OPTION_HASH_TABLE_SIZE:
898           {
899             unsigned long new_size;
900
901             new_size = strtoul (optarg, NULL, 0);
902             if (new_size)
903               set_gas_hash_table_size (new_size);
904             else
905               as_fatal (_("--hash-size needs a numeric argument"));
906             break;
907           }
908         }
909     }
910
911   free (shortopts);
912   free (longopts);
913
914   *pargc = new_argc;
915   *pargv = new_argv;
916
917 #ifdef md_after_parse_args
918   md_after_parse_args ();
919 #endif
920 }
921
922 static void
923 dump_statistics (void)
924 {
925 #ifdef HAVE_SBRK
926   char *lim = (char *) sbrk (0);
927 #endif
928   long run_time = get_run_time () - start_time;
929
930   fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
931            myname, run_time / 1000000, run_time % 1000000);
932 #ifdef HAVE_SBRK
933   fprintf (stderr, _("%s: data size %ld\n"),
934            myname, (long) (lim - (char *) &environ));
935 #endif
936
937   subsegs_print_statistics (stderr);
938   write_print_statistics (stderr);
939   symbol_print_statistics (stderr);
940   read_print_statistics (stderr);
941
942 #ifdef tc_print_statistics
943   tc_print_statistics (stderr);
944 #endif
945
946 #ifdef obj_print_statistics
947   obj_print_statistics (stderr);
948 #endif
949 }
950
951 #ifndef OBJ_VMS
952 static void
953 close_output_file (void)
954 {
955   output_file_close (out_file_name);
956 }
957 #endif
958
959 /* The interface between the macro code and gas expression handling.  */
960
961 static int
962 macro_expr (const char *emsg, int idx, sb *in, int *val)
963 {
964   char *hold;
965   expressionS ex;
966
967   sb_terminate (in);
968
969   hold = input_line_pointer;
970   input_line_pointer = in->ptr + idx;
971   expression_and_evaluate (&ex);
972   idx = input_line_pointer - in->ptr;
973   input_line_pointer = hold;
974
975   if (ex.X_op != O_constant)
976     as_bad ("%s", emsg);
977
978   *val = (int) ex.X_add_number;
979
980   return idx;
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 (int argc, char ** argv)
994 {
995   int saw_a_file = 0;
996   flagword applicable;
997
998   need_pass_2 = 0;
999
1000   /* Create the standard sections, and those the assembler uses
1001      internally.  */
1002   text_section = subseg_new (TEXT_SECTION_NAME, 0);
1003   data_section = subseg_new (DATA_SECTION_NAME, 0);
1004   bss_section = subseg_new (BSS_SECTION_NAME, 0);
1005   /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
1006      to have relocs, otherwise we don't find out in time.  */
1007   applicable = bfd_applicable_section_flags (stdoutput);
1008   bfd_set_section_flags (stdoutput, text_section,
1009                          applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1010                                        | SEC_CODE | SEC_READONLY));
1011   bfd_set_section_flags (stdoutput, data_section,
1012                          applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1013                                        | SEC_DATA));
1014   bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
1015   seg_info (bss_section)->bss = 1;
1016   subseg_new (BFD_ABS_SECTION_NAME, 0);
1017   subseg_new (BFD_UND_SECTION_NAME, 0);
1018   reg_section = subseg_new ("*GAS `reg' section*", 0);
1019   expr_section = subseg_new ("*GAS `expr' section*", 0);
1020
1021   subseg_set (text_section, 0);
1022
1023   /* This may add symbol table entries, which requires having an open BFD,
1024      and sections already created.  */
1025   md_begin ();
1026
1027 #ifdef USING_CGEN
1028   gas_cgen_begin ();
1029 #endif
1030 #ifdef obj_begin
1031   obj_begin ();
1032 #endif
1033
1034   /* Skip argv[0].  */
1035   argv++;
1036   argc--;
1037
1038   while (argc--)
1039     {
1040       if (*argv)
1041         {                       /* Is it a file-name argument?  */
1042           PROGRESS (1);
1043           saw_a_file++;
1044           /* argv->"" if stdin desired, else->filename.  */
1045           read_a_source_file (*argv);
1046         }
1047       argv++;                   /* Completed that argv.  */
1048     }
1049   if (!saw_a_file)
1050     read_a_source_file ("");
1051 }
1052 \f
1053 #ifdef OBJ_ELF
1054 static void
1055 create_obj_attrs_section (void)
1056 {
1057   segT s;
1058   char *p;
1059   addressT addr;
1060   offsetT size;
1061   const char *name;
1062
1063   size = bfd_elf_obj_attr_size (stdoutput);
1064   if (size)
1065     {
1066       name = get_elf_backend_data (stdoutput)->obj_attrs_section;
1067       if (!name)
1068         name = ".gnu.attributes";
1069       s = subseg_new (name, 0);
1070       elf_section_type (s)
1071         = get_elf_backend_data (stdoutput)->obj_attrs_section_type;
1072       bfd_set_section_flags (stdoutput, s, SEC_READONLY | SEC_DATA);
1073       addr = frag_now_fix ();
1074       p = frag_more (size);
1075       bfd_elf_set_obj_attr_contents (stdoutput, (bfd_byte *)p, size);
1076     }
1077 }
1078 #endif
1079 \f
1080
1081 int
1082 main (int argc, char ** argv)
1083 {
1084   char ** argv_orig = argv;
1085
1086   int macro_strip_at;
1087   int keep_it;
1088
1089   start_time = get_run_time ();
1090
1091 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
1092   setlocale (LC_MESSAGES, "");
1093 #endif
1094 #if defined (HAVE_SETLOCALE)
1095   setlocale (LC_CTYPE, "");
1096 #endif
1097   bindtextdomain (PACKAGE, LOCALEDIR);
1098   textdomain (PACKAGE);
1099
1100   if (debug_memory)
1101     chunksize = 64;
1102
1103 #ifdef HOST_SPECIAL_INIT
1104   HOST_SPECIAL_INIT (argc, argv);
1105 #endif
1106
1107   myname = argv[0];
1108   xmalloc_set_program_name (myname);
1109
1110   expandargv (&argc, &argv);
1111
1112   START_PROGRESS (myname, 0);
1113
1114 #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
1115 #define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
1116 #endif
1117
1118   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
1119
1120   hex_init ();
1121   bfd_init ();
1122   bfd_set_error_program_name (myname);
1123
1124 #ifdef USE_EMULATIONS
1125   select_emulation_mode (argc, argv);
1126 #endif
1127
1128   PROGRESS (1);
1129   /* Call parse_args before any of the init/begin functions
1130      so that switches like --hash-size can be honored.  */
1131   parse_args (&argc, &argv);
1132   symbol_begin ();
1133   frag_init ();
1134   subsegs_begin ();
1135   read_begin ();
1136   input_scrub_begin ();
1137   expr_begin ();
1138
1139 #ifndef OBJ_VMS /* Does its own file handling.  */
1140   /* It has to be called after dump_statistics ().  */
1141   xatexit (close_output_file);
1142 #endif
1143
1144   if (flag_print_statistics)
1145     xatexit (dump_statistics);
1146
1147   macro_strip_at = 0;
1148 #ifdef TC_I960
1149   macro_strip_at = flag_mri;
1150 #endif
1151
1152   macro_init (flag_macro_alternate, flag_mri, macro_strip_at, macro_expr);
1153
1154   PROGRESS (1);
1155
1156   output_file_create (out_file_name);
1157   assert (stdoutput != 0);
1158
1159 #ifdef tc_init_after_args
1160   tc_init_after_args ();
1161 #endif
1162
1163   itbl_init ();
1164
1165   /* Now that we have fully initialized, and have created the output
1166      file, define any symbols requested by --defsym command line
1167      arguments.  */
1168   while (defsyms != NULL)
1169     {
1170       symbolS *sym;
1171       struct defsym_list *next;
1172
1173       sym = symbol_new (defsyms->name, absolute_section, defsyms->value,
1174                         &zero_address_frag);
1175       /* Make symbols defined on the command line volatile, so that they
1176          can be redefined inside a source file.  This makes this assembler's
1177          behaviour compatible with earlier versions, but it may not be
1178          completely intuitive.  */
1179       S_SET_VOLATILE (sym);
1180       symbol_table_insert (sym);
1181       next = defsyms->next;
1182       free (defsyms);
1183       defsyms = next;
1184     }
1185
1186   PROGRESS (1);
1187
1188   /* Assemble it.  */
1189   perform_an_assembly_pass (argc, argv);
1190
1191   cond_finish_check (-1);
1192
1193 #ifdef md_end
1194   md_end ();
1195 #endif
1196
1197 #ifdef OBJ_ELF
1198   if (IS_ELF)
1199     create_obj_attrs_section ();
1200 #endif
1201
1202 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
1203   if ((flag_execstack || flag_noexecstack)
1204       && OUTPUT_FLAVOR == bfd_target_elf_flavour)
1205     {
1206       segT gnustack;
1207
1208       gnustack = subseg_new (".note.GNU-stack", 0);
1209       bfd_set_section_flags (stdoutput, gnustack,
1210                              SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
1211                                                                              
1212     }
1213 #endif
1214
1215   /* If we've been collecting dwarf2 .debug_line info, either for
1216      assembly debugging or on behalf of the compiler, emit it now.  */
1217   dwarf2_finish ();
1218
1219   /* If we constructed dwarf2 .eh_frame info, either via .cfi 
1220      directives from the user or by the backend, emit it now.  */
1221   cfi_finish ();
1222
1223   if (seen_at_least_1_file ()
1224       && (flag_always_generate_output || had_errors () == 0))
1225     keep_it = 1;
1226   else
1227     keep_it = 0;
1228
1229   /* This used to be done at the start of write_object_file in
1230      write.c, but that caused problems when doing listings when
1231      keep_it was zero.  This could probably be moved above md_end, but
1232      I didn't want to risk the change.  */
1233   subsegs_finish ();
1234
1235   if (keep_it)
1236     write_object_file ();
1237
1238   fflush (stderr);
1239
1240 #ifndef NO_LISTING
1241   listing_print (listing_filename, argv_orig);
1242 #endif
1243
1244   if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0)
1245     as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());
1246
1247   if (had_errors () > 0 && ! flag_always_generate_output)
1248     keep_it = 0;
1249
1250   if (!keep_it)
1251     unlink_if_ordinary (out_file_name);
1252
1253   input_scrub_end ();
1254
1255   END_PROGRESS (myname);
1256
1257   /* Use xexit instead of return, because under VMS environments they
1258      may not place the same interpretation on the value given.  */
1259   if (had_errors () > 0)
1260     xexit (EXIT_FAILURE);
1261
1262   /* Only generate dependency file if assembler was successful.  */
1263   print_dependencies ();
1264
1265   xexit (EXIT_SUCCESS);
1266 }