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