as.c revision 130561
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
59extern PTR sbrk ();
60#endif
61#endif
62
63#ifdef USING_CGEN
64/* Perform any cgen specific initialisation for gas.  */
65extern void gas_cgen_begin (void);
66#endif
67
68/* Keep a record of the itbl files we read in.  */
69struct 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.  */
77struct defsym_list
78{
79  struct defsym_list *next;
80  char *name;
81  valueT value;
82};
83
84
85/* True if a listing is wanted.  */
86int listing;
87
88/* Type of debugging to generate.  */
89enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
90int use_gnu_debug_info_extensions = 0;
91
92/* Maximum level of macro nesting.  */
93int max_macro_nest = 100;
94
95/* argv[0]  */
96char * 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.  */
100int 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.  */
104int debug_memory = 0;
105
106/* Enable verbose mode.  */
107int verbose = 0;
108
109#ifdef BFD_ASSEMBLER
110segT reg_section;
111segT expr_section;
112segT text_section;
113segT data_section;
114segT bss_section;
115#endif
116
117/* Name of listing file.  */
118static char *listing_filename = NULL;
119
120static struct defsym_list *defsyms;
121
122static struct itbl_file_list *itbl_files;
123
124static long start_time;
125
126
127#ifdef USE_EMULATIONS
128#define EMULATION_ENVIRON "AS_EMULATION"
129
130extern struct emulation mipsbelf, mipslelf, mipself;
131extern struct emulation mipsbecoff, mipslecoff, mipsecoff;
132extern struct emulation i386coff, i386elf, i386aout;
133extern struct emulation crisaout, criself;
134
135static struct emulation *const emulations[] = { EMULATIONS };
136static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
137
138static void
139select_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
182const char *
183default_emul_bfd_name (void)
184{
185  abort ();
186  return NULL;
187}
188
189void
190common_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
211void
212print_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
229static void
230show_usage (FILE * stream)
231{
232  fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
233
234  fprintf (stream, _("\
235Options:\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
357static void
358parse_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 (_("\
567This program is free software; you may redistribute it under the terms of\n\
568the 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
821static void
822dump_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
852static int
853macro_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
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
883static void
884perform_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
980
981int
982main (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
1166