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