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