Correct spelling of "relocatable".
[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 }
68d55fe3
JJ
270#endif
271#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
272 fprintf (stream, _("\
273 --execstack require executable stack for this object\n"));
274 fprintf (stream, _("\
275 --noexecstack don't require executable stack for this object\n"));
4c63da97
AM
276#endif
277 fprintf (stream, _("\
278 -f skip whitespace and comment preprocessing\n"));
279 fprintf (stream, _("\
280 --gstabs generate stabs debugging information\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, _("\
ea20a7da
CC
286 --target-help show target specific options\n"));
287 fprintf (stream, _("\
4c63da97
AM
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
c20f4f8c 344 fputc ('\n', stream);
8ad3436c 345 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4c63da97
AM
346}
347
76b0a8c0
KH
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. */
252b5132
RH
356
357static void
358parse_args (pargc, pargv)
359 int *pargc;
360 char ***pargv;
361{
362 int old_argc, new_argc;
363 char **old_argv, **new_argv;
364
365 /* Starting the short option string with '-' is for programs that
366 expect options and other ARGV-elements in any order and that care about
367 the ordering of the two. We describe each non-option ARGV-element
368 as if it were the argument of an option with character code 1. */
369
370 char *shortopts;
5a38dc70 371 extern const char *md_shortopts;
30a2b4ef
KH
372 static const char std_shortopts[] = {
373 '-', 'J',
252b5132 374#ifndef WORKING_DOT_WORD
30a2b4ef
KH
375 /* -K is not meaningful if .word is not being hacked. */
376 'K',
252b5132 377#endif
30a2b4ef 378 'L', 'M', 'R', 'W', 'Z', 'f', 'a', ':', ':', 'D', 'I', ':', 'o', ':',
252b5132 379#ifndef VMS
30a2b4ef
KH
380 /* -v takes an argument on VMS, so we don't make it a generic
381 option. */
382 'v',
252b5132 383#endif
30a2b4ef
KH
384 'w', 'X',
385 /* New option for extending instruction set (see also --itbl below) */
386 't', ':',
387 '\0'
388 };
252b5132
RH
389 struct option *longopts;
390 extern struct option md_longopts[];
391 extern size_t md_longopts_size;
392 static const struct option std_longopts[] = {
393#define OPTION_HELP (OPTION_STD_BASE)
394 {"help", no_argument, NULL, OPTION_HELP},
9c3b31c6
NC
395 /* getopt allows abbreviations, so we do this to stop it from
396 treating -k as an abbreviation for --keep-locals. Some
397 ports use -k to enable PIC assembly. */
398 {"keep-locals", no_argument, NULL, 'L'},
252b5132
RH
399 {"keep-locals", no_argument, NULL, 'L'},
400 {"mri", no_argument, NULL, 'M'},
401#define OPTION_NOCPP (OPTION_STD_BASE + 1)
402 {"nocpp", no_argument, NULL, OPTION_NOCPP},
403#define OPTION_STATISTICS (OPTION_STD_BASE + 2)
404 {"statistics", no_argument, NULL, OPTION_STATISTICS},
405#define OPTION_VERSION (OPTION_STD_BASE + 3)
406 {"version", no_argument, NULL, OPTION_VERSION},
407#define OPTION_DUMPCONFIG (OPTION_STD_BASE + 4)
408 {"dump-config", no_argument, NULL, OPTION_DUMPCONFIG},
409#define OPTION_VERBOSE (OPTION_STD_BASE + 5)
410 {"verbose", no_argument, NULL, OPTION_VERBOSE},
411#define OPTION_EMULATION (OPTION_STD_BASE + 6)
412 {"emulation", required_argument, NULL, OPTION_EMULATION},
413#define OPTION_DEFSYM (OPTION_STD_BASE + 7)
414 {"defsym", required_argument, NULL, OPTION_DEFSYM},
415#define OPTION_INSTTBL (OPTION_STD_BASE + 8)
416 /* New option for extending instruction set (see also -t above).
417 The "-t file" or "--itbl file" option extends the basic set of
418 valid instructions by reading "file", a text file containing a
419 list of instruction formats. The additional opcodes and their
420 formats are added to the built-in set of instructions, and
421 mnemonics for new registers may also be defined. */
422 {"itbl", required_argument, NULL, OPTION_INSTTBL},
423#define OPTION_LISTING_LHS_WIDTH (OPTION_STD_BASE + 9)
424 {"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH},
425#define OPTION_LISTING_LHS_WIDTH2 (OPTION_STD_BASE + 10)
3c5cdb54 426 {"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2},
252b5132
RH
427#define OPTION_LISTING_RHS_WIDTH (OPTION_STD_BASE + 11)
428 {"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH},
429#define OPTION_LISTING_CONT_LINES (OPTION_STD_BASE + 12)
430 {"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES},
431#define OPTION_DEPFILE (OPTION_STD_BASE + 13)
432 {"MD", required_argument, NULL, OPTION_DEPFILE},
433#define OPTION_GSTABS (OPTION_STD_BASE + 14)
434 {"gstabs", no_argument, NULL, OPTION_GSTABS},
435#define OPTION_STRIP_LOCAL_ABSOLUTE (OPTION_STD_BASE + 15)
436 {"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE},
437#define OPTION_TRADITIONAL_FORMAT (OPTION_STD_BASE + 16)
fac0d250
RH
438 {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
439#define OPTION_GDWARF2 (OPTION_STD_BASE + 17)
2bdd6cf5
GK
440 {"gdwarf2", no_argument, NULL, OPTION_GDWARF2},
441 {"no-warn", no_argument, NULL, 'W'},
442#define OPTION_WARN (OPTION_STD_BASE + 18)
443 {"warn", no_argument, NULL, OPTION_WARN},
ea20a7da
CC
444#define OPTION_TARGET_HELP (OPTION_STD_BASE + 19)
445 {"target-help", no_argument, NULL, OPTION_TARGET_HELP},
68d55fe3
JJ
446#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
447#define OPTION_EXECSTACK (OPTION_STD_BASE + 20)
448 {"execstack", no_argument, NULL, OPTION_EXECSTACK},
449#define OPTION_NOEXECSTACK (OPTION_STD_BASE + 21)
450 {"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
451#endif
452#define OPTION_WARN_FATAL (OPTION_STD_BASE + 22)
2bdd6cf5 453 {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
d8374dcd
HPN
454 /* When you add options here, check that they do not collide with
455 OPTION_MD_BASE. See as.h. */
252b5132
RH
456 };
457
beb2de9b
AC
458 /* Construct the option lists from the standard list and the target
459 dependent list. Include space for an extra NULL option and
76b0a8c0 460 always NULL terminate. */
252b5132 461 shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
beb2de9b
AC
462 longopts = (struct option *) xmalloc (sizeof (std_longopts)
463 + md_longopts_size
464 + sizeof (struct option));
252b5132
RH
465 memcpy (longopts, std_longopts, sizeof (std_longopts));
466 memcpy ((char *) longopts + sizeof (std_longopts),
467 md_longopts, md_longopts_size);
beb2de9b
AC
468 memset ((char *) longopts + sizeof (std_longopts) + md_longopts_size,
469 0, sizeof (struct option));
252b5132
RH
470
471 /* Make a local copy of the old argv. */
472 old_argc = *pargc;
473 old_argv = *pargv;
474
475 /* Initialize a new argv that contains no options. */
476 new_argv = (char **) xmalloc (sizeof (char *) * (old_argc + 1));
477 new_argv[0] = old_argv[0];
478 new_argc = 1;
479 new_argv[new_argc] = NULL;
480
481 while (1)
482 {
483 /* getopt_long_only is like getopt_long, but '-' as well as '--' can
484 indicate a long option. */
485 int longind;
486 int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts,
487 &longind);
488
489 if (optc == -1)
490 break;
491
492 switch (optc)
493 {
494 default:
495 /* md_parse_option should return 1 if it recognizes optc,
496 0 if not. */
497 if (md_parse_option (optc, optarg) != 0)
498 break;
499 /* `-v' isn't included in the general short_opts list, so check for
500 it explicity here before deciding we've gotten a bad argument. */
501 if (optc == 'v')
502 {
503#ifdef VMS
504 /* Telling getopt to treat -v's value as optional can result
505 in it picking up a following filename argument here. The
506 VMS code in md_parse_option can return 0 in that case,
507 but it has no way of pushing the filename argument back. */
508 if (optarg && *optarg)
30a2b4ef 509 new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL;
252b5132
RH
510 else
511#else
512 case 'v':
513#endif
514 case OPTION_VERBOSE:
515 print_version_id ();
54cfded0 516 verbose = 1;
252b5132
RH
517 break;
518 }
76b0a8c0 519 /* Fall through. */
252b5132
RH
520
521 case '?':
522 exit (EXIT_FAILURE);
523
524 case 1: /* File name. */
525 if (!strcmp (optarg, "-"))
526 optarg = "";
527 new_argv[new_argc++] = optarg;
528 new_argv[new_argc] = NULL;
529 break;
ef99799a 530
ea20a7da 531 case OPTION_TARGET_HELP:
411863a4
KH
532 md_show_usage (stdout);
533 exit (EXIT_SUCCESS);
252b5132
RH
534
535 case OPTION_HELP:
536 show_usage (stdout);
537 exit (EXIT_SUCCESS);
538
539 case OPTION_NOCPP:
540 break;
541
542 case OPTION_STATISTICS:
543 flag_print_statistics = 1;
544 break;
545
546 case OPTION_STRIP_LOCAL_ABSOLUTE:
547 flag_strip_local_absolute = 1;
548 break;
549
550 case OPTION_TRADITIONAL_FORMAT:
551 flag_traditional_format = 1;
552 break;
553
554 case OPTION_VERSION:
555 /* This output is intended to follow the GNU standards document. */
edde18a5 556#ifdef BFD_ASSEMBLER
6c19f338 557 printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
edde18a5
AM
558#else
559 printf (_("GNU assembler %s\n"), VERSION);
560#endif
2a538ba5 561 printf (_("Copyright 2002 Free Software Foundation, Inc.\n"));
252b5132
RH
562 printf (_("\
563This program is free software; you may redistribute it under the terms of\n\
564the GNU General Public License. This program has absolutely no warranty.\n"));
565 printf (_("This assembler was configured for a target of `%s'.\n"),
566 TARGET_ALIAS);
567 exit (EXIT_SUCCESS);
568
569 case OPTION_EMULATION:
570#ifdef USE_EMULATIONS
571 if (strcmp (optarg, this_emulation->name))
572 as_fatal (_("multiple emulation names specified"));
573#else
574 as_fatal (_("emulations not handled in this configuration"));
575#endif
576 break;
577
578 case OPTION_DUMPCONFIG:
579 fprintf (stderr, _("alias = %s\n"), TARGET_ALIAS);
580 fprintf (stderr, _("canonical = %s\n"), TARGET_CANONICAL);
581 fprintf (stderr, _("cpu-type = %s\n"), TARGET_CPU);
582#ifdef TARGET_OBJ_FORMAT
583 fprintf (stderr, _("format = %s\n"), TARGET_OBJ_FORMAT);
584#endif
585#ifdef TARGET_FORMAT
586 fprintf (stderr, _("bfd-target = %s\n"), TARGET_FORMAT);
587#endif
588 exit (EXIT_SUCCESS);
589
590 case OPTION_DEFSYM:
591 {
592 char *s;
a38cf1db 593 valueT i;
252b5132
RH
594 struct defsym_list *n;
595
596 for (s = optarg; *s != '\0' && *s != '='; s++)
597 ;
598 if (*s == '\0')
599 as_fatal (_("bad defsym; format is --defsym name=value"));
600 *s++ = '\0';
a38cf1db
AM
601#ifdef BFD_ASSEMBLER
602 i = bfd_scan_vma (s, (const char **) NULL, 0);
603#else
252b5132 604 i = strtol (s, (char **) NULL, 0);
a38cf1db 605#endif
252b5132
RH
606 n = (struct defsym_list *) xmalloc (sizeof *n);
607 n->next = defsyms;
608 n->name = optarg;
609 n->value = i;
610 defsyms = n;
611 }
612 break;
613
614 case OPTION_INSTTBL:
615 case 't':
616 {
76b0a8c0
KH
617 /* optarg is the name of the file containing the instruction
618 formats, opcodes, register names, etc. */
252b5132
RH
619 struct itbl_file_list *n;
620
621 if (optarg == NULL)
622 {
0e389e77 623 as_warn (_("no file name following -t option"));
252b5132
RH
624 break;
625 }
76b0a8c0 626
252b5132
RH
627 n = (struct itbl_file_list *) xmalloc (sizeof *n);
628 n->next = itbl_files;
629 n->name = optarg;
630 itbl_files = n;
631
632 /* Parse the file and add the new instructions to our internal
76b0a8c0
KH
633 table. If multiple instruction tables are specified, the
634 information from this table gets appended onto the existing
635 internal table. */
252b5132
RH
636 itbl_files->name = xstrdup (optarg);
637 if (itbl_parse (itbl_files->name) != 0)
0e389e77
AM
638 as_fatal (_("failed to read instruction table %s\n"),
639 itbl_files->name);
252b5132
RH
640 }
641 break;
642
643 case OPTION_DEPFILE:
644 start_dependencies (optarg);
645 break;
646
647 case OPTION_GSTABS:
648 debug_type = DEBUG_STABS;
649 break;
76b0a8c0 650
fac0d250
RH
651 case OPTION_GDWARF2:
652 debug_type = DEBUG_DWARF2;
653 break;
654
252b5132
RH
655 case 'J':
656 flag_signed_overflow_ok = 1;
657 break;
658
659#ifndef WORKING_DOT_WORD
660 case 'K':
661 flag_warn_displacement = 1;
662 break;
663#endif
664
665 case 'L':
666 flag_keep_locals = 1;
667 break;
668
669 case OPTION_LISTING_LHS_WIDTH:
76b0a8c0 670 listing_lhs_width = atoi (optarg);
252b5132
RH
671 if (listing_lhs_width_second < listing_lhs_width)
672 listing_lhs_width_second = listing_lhs_width;
673 break;
674 case OPTION_LISTING_LHS_WIDTH2:
675 {
76b0a8c0 676 int tmp = atoi (optarg);
252b5132
RH
677 if (tmp > listing_lhs_width)
678 listing_lhs_width_second = tmp;
679 }
680 break;
681 case OPTION_LISTING_RHS_WIDTH:
76b0a8c0 682 listing_rhs_width = atoi (optarg);
252b5132
RH
683 break;
684 case OPTION_LISTING_CONT_LINES:
76b0a8c0 685 listing_lhs_cont_lines = atoi (optarg);
252b5132
RH
686 break;
687
688 case 'M':
689 flag_mri = 1;
690#ifdef TC_M68K
691 flag_m68k_mri = 1;
692#endif
693 break;
694
695 case 'R':
696 flag_readonly_data_in_text = 1;
697 break;
698
699 case 'W':
700 flag_no_warnings = 1;
701 break;
702
2bdd6cf5
GK
703 case OPTION_WARN:
704 flag_no_warnings = 0;
705 flag_fatal_warnings = 0;
706 break;
707
708 case OPTION_WARN_FATAL:
709 flag_no_warnings = 0;
710 flag_fatal_warnings = 1;
711 break;
712
68d55fe3
JJ
713#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
714 case OPTION_EXECSTACK:
715 flag_execstack = 1;
716 flag_noexecstack = 0;
717 break;
718
719 case OPTION_NOEXECSTACK:
720 flag_noexecstack = 1;
721 flag_execstack = 0;
722 break;
723#endif
724
252b5132
RH
725 case 'Z':
726 flag_always_generate_output = 1;
727 break;
728
729 case 'a':
730 if (optarg)
731 {
7f6d05e8
CP
732 if (md_parse_option (optc, optarg) != 0)
733 break;
734
252b5132
RH
735 while (*optarg)
736 {
737 switch (*optarg)
738 {
739 case 'c':
740 listing |= LISTING_NOCOND;
741 break;
742 case 'd':
743 listing |= LISTING_NODEBUG;
744 break;
745 case 'h':
746 listing |= LISTING_HLL;
747 break;
748 case 'l':
749 listing |= LISTING_LISTING;
750 break;
751 case 'm':
752 listing |= LISTING_MACEXP;
753 break;
754 case 'n':
755 listing |= LISTING_NOFORM;
756 break;
757 case 's':
758 listing |= LISTING_SYMBOLS;
759 break;
760 case '=':
761 listing_filename = xstrdup (optarg + 1);
762 optarg += strlen (listing_filename);
763 break;
764 default:
765 as_fatal (_("invalid listing option `%c'"), *optarg);
766 break;
767 }
768 optarg++;
769 }
770 }
771 if (!listing)
772 listing = LISTING_DEFAULT;
773 break;
774
775 case 'D':
76b0a8c0
KH
776 /* DEBUG is implemented: it debugs different
777 things from other people's assemblers. */
252b5132
RH
778 flag_debug = 1;
779 break;
780
781 case 'f':
782 flag_no_comments = 1;
783 break;
784
785 case 'I':
76b0a8c0 786 { /* Include file directory. */
252b5132
RH
787 char *temp = xstrdup (optarg);
788 add_include_dir (temp);
789 break;
790 }
791
792 case 'o':
793 out_file_name = xstrdup (optarg);
794 break;
795
796 case 'w':
797 break;
798
799 case 'X':
76b0a8c0 800 /* -X means treat warnings as errors. */
252b5132
RH
801 break;
802 }
803 }
804
805 free (shortopts);
806 free (longopts);
807
808 *pargc = new_argc;
809 *pargv = new_argv;
acebd4ce
AS
810
811#ifdef md_after_parse_args
812 md_after_parse_args ();
813#endif
252b5132
RH
814}
815
816static long start_time;
817
a80076a1
NC
818int main PARAMS ((int, char **));
819
76b0a8c0 820int
252b5132
RH
821main (argc, argv)
822 int argc;
823 char **argv;
824{
825 int macro_alternate;
826 int macro_strip_at;
827 int keep_it;
828
829 start_time = get_run_time ();
830
831#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
832 setlocale (LC_MESSAGES, "");
3882b010
L
833#endif
834#if defined (HAVE_SETLOCALE)
835 setlocale (LC_CTYPE, "");
252b5132
RH
836#endif
837 bindtextdomain (PACKAGE, LOCALEDIR);
838 textdomain (PACKAGE);
839
840 if (debug_memory)
091e58c1 841 chunksize = 64;
252b5132
RH
842
843#ifdef HOST_SPECIAL_INIT
844 HOST_SPECIAL_INIT (argc, argv);
845#endif
846
847 myname = argv[0];
848 xmalloc_set_program_name (myname);
849
850 START_PROGRESS (myname, 0);
851
852#ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
853#define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
854#endif
855
856 out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
857
858 hex_init ();
859#ifdef BFD_ASSEMBLER
860 bfd_init ();
861 bfd_set_error_program_name (myname);
862#endif
863
864#ifdef USE_EMULATIONS
865 select_emulation_mode (argc, argv);
866#endif
867
868 PROGRESS (1);
869 symbol_begin ();
870 frag_init ();
871 subsegs_begin ();
76b0a8c0 872 parse_args (&argc, &argv);
252b5132
RH
873 read_begin ();
874 input_scrub_begin ();
875 expr_begin ();
876
877 if (flag_print_statistics)
878 xatexit (dump_statistics);
879
880 macro_alternate = 0;
881 macro_strip_at = 0;
882#ifdef TC_I960
883 macro_strip_at = flag_mri;
884#endif
885#ifdef TC_A29K
886 /* For compatibility with the AMD 29K family macro assembler
887 specification. */
888 macro_alternate = 1;
889 macro_strip_at = 1;
890#endif
891
892 macro_init (macro_alternate, flag_mri, macro_strip_at, macro_expr);
893
894 PROGRESS (1);
895
896#ifdef BFD_ASSEMBLER
897 output_file_create (out_file_name);
898 assert (stdoutput != 0);
899#endif
900
901#ifdef tc_init_after_args
902 tc_init_after_args ();
903#endif
904
905 itbl_init ();
906
907 /* Now that we have fully initialized, and have created the output
908 file, define any symbols requested by --defsym command line
909 arguments. */
910 while (defsyms != NULL)
911 {
912 symbolS *sym;
913 struct defsym_list *next;
914
915 sym = symbol_new (defsyms->name, absolute_section, defsyms->value,
916 &zero_address_frag);
917 symbol_table_insert (sym);
918 next = defsyms->next;
919 free (defsyms);
920 defsyms = next;
921 }
922
923 PROGRESS (1);
924
76b0a8c0
KH
925 /* Assemble it. */
926 perform_an_assembly_pass (argc, argv);
252b5132
RH
927
928 cond_finish_check (-1);
929
930#ifdef md_end
931 md_end ();
932#endif
933
68d55fe3
JJ
934#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
935 if ((flag_execstack || flag_noexecstack)
936 && OUTPUT_FLAVOR == bfd_target_elf_flavour)
937 {
938 segT gnustack;
939
940 gnustack = subseg_new (".note.GNU-stack", 0);
941 bfd_set_section_flags (stdoutput, gnustack,
942 SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
943
944 }
945#endif
946
43ad3147 947 /* If we've been collecting dwarf2 .debug_line info, either for
39bb5fe6
RH
948 assembly debugging or on behalf of the compiler, emit it now. */
949 dwarf2_finish ();
950
a4447b93
RH
951 /* If we constructed dwarf2 .eh_frame info, either via .cfi
952 directives from the user or by the backend, emit it now. */
54cfded0 953 cfi_finish ();
54cfded0 954
252b5132
RH
955 if (seen_at_least_1_file ()
956 && (flag_always_generate_output || had_errors () == 0))
957 keep_it = 1;
958 else
959 keep_it = 0;
960
961#if defined (BFD_ASSEMBLER) || !defined (BFD)
962 /* This used to be done at the start of write_object_file in
963 write.c, but that caused problems when doing listings when
964 keep_it was zero. This could probably be moved above md_end, but
965 I didn't want to risk the change. */
966 subsegs_finish ();
967#endif
968
969 if (keep_it)
970 write_object_file ();
971
972#ifndef NO_LISTING
973 listing_print (listing_filename);
974#endif
975
976#ifndef OBJ_VMS /* does its own file handling */
977#ifndef BFD_ASSEMBLER
978 if (keep_it)
979#endif
980 output_file_close (out_file_name);
981#endif
982
76b0a8c0
KH
983 if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0)
984 as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());
2bdd6cf5 985
252b5132
RH
986 if (had_errors () > 0 && ! flag_always_generate_output)
987 keep_it = 0;
988
989 if (!keep_it)
990 unlink (out_file_name);
991
992 input_scrub_end ();
993
994 END_PROGRESS (myname);
995
996 /* Use xexit instead of return, because under VMS environments they
997 may not place the same interpretation on the value given. */
998 if (had_errors () > 0)
999 xexit (EXIT_FAILURE);
1000
1001 /* Only generate dependency file if assembler was successful. */
1002 print_dependencies ();
1003
1004 xexit (EXIT_SUCCESS);
1005}
1006
1007static void
1008dump_statistics ()
1009{
1010#ifdef HAVE_SBRK
1011 char *lim = (char *) sbrk (0);
1012#endif
1013 long run_time = get_run_time () - start_time;
1014
1015 fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
1016 myname, run_time / 1000000, run_time % 1000000);
1017#ifdef HAVE_SBRK
1018 fprintf (stderr, _("%s: data size %ld\n"),
1019 myname, (long) (lim - (char *) &environ));
1020#endif
1021
1022 subsegs_print_statistics (stderr);
1023 write_print_statistics (stderr);
1024 symbol_print_statistics (stderr);
1025 read_print_statistics (stderr);
1026
1027#ifdef tc_print_statistics
1028 tc_print_statistics (stderr);
1029#endif
1030#ifdef obj_print_statistics
1031 obj_print_statistics (stderr);
1032#endif
1033}
1034\f
76b0a8c0
KH
1035/* Here to attempt 1 pass over each input file.
1036 We scan argv[*] looking for filenames or exactly "" which is
1037 shorthand for stdin. Any argv that is NULL is not a file-name.
1038 We set need_pass_2 TRUE if, after this, we still have unresolved
1039 expressions of the form (unknown value)+-(unknown value).
252b5132 1040
76b0a8c0
KH
1041 Note the un*x semantics: there is only 1 logical input file, but it
1042 may be a catenation of many 'physical' input files. */
1043
1044static void
252b5132
RH
1045perform_an_assembly_pass (argc, argv)
1046 int argc;
1047 char **argv;
1048{
1049 int saw_a_file = 0;
1050#ifdef BFD_ASSEMBLER
1051 flagword applicable;
1052#endif
1053
1054 need_pass_2 = 0;
1055
1056#ifndef BFD_ASSEMBLER
1057#ifdef MANY_SEGMENTS
1058 {
1059 unsigned int i;
1060 for (i = SEG_E0; i < SEG_UNKNOWN; i++)
1061 segment_info[i].fix_root = 0;
1062 }
76b0a8c0 1063 /* Create the three fixed ones. */
252b5132
RH
1064 {
1065 segT seg;
1066
1067#ifdef TE_APOLLO
1068 seg = subseg_new (".wtext", 0);
1069#else
1070 seg = subseg_new (".text", 0);
1071#endif
1072 assert (seg == SEG_E0);
1073 seg = subseg_new (".data", 0);
1074 assert (seg == SEG_E1);
1075 seg = subseg_new (".bss", 0);
1076 assert (seg == SEG_E2);
1077#ifdef TE_APOLLO
1078 create_target_segments ();
1079#endif
1080 }
1081
1082#else /* not MANY_SEGMENTS */
1083 text_fix_root = NULL;
1084 data_fix_root = NULL;
1085 bss_fix_root = NULL;
1086#endif /* not MANY_SEGMENTS */
1087#else /* BFD_ASSEMBLER */
1088 /* Create the standard sections, and those the assembler uses
1089 internally. */
1090 text_section = subseg_new (TEXT_SECTION_NAME, 0);
1091 data_section = subseg_new (DATA_SECTION_NAME, 0);
1092 bss_section = subseg_new (BSS_SECTION_NAME, 0);
1093 /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
76b0a8c0 1094 to have relocs, otherwise we don't find out in time. */
252b5132
RH
1095 applicable = bfd_applicable_section_flags (stdoutput);
1096 bfd_set_section_flags (stdoutput, text_section,
1097 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1098 | SEC_CODE | SEC_READONLY));
252b5132 1099 bfd_set_section_flags (stdoutput, data_section,
a33132fd
ILT
1100 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1101 | SEC_DATA));
252b5132
RH
1102 bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
1103 seg_info (bss_section)->bss = 1;
1104 subseg_new (BFD_ABS_SECTION_NAME, 0);
1105 subseg_new (BFD_UND_SECTION_NAME, 0);
1106 reg_section = subseg_new ("*GAS `reg' section*", 0);
1107 expr_section = subseg_new ("*GAS `expr' section*", 0);
1108
1109#endif /* BFD_ASSEMBLER */
1110
1111 subseg_set (text_section, 0);
1112
1113 /* This may add symbol table entries, which requires having an open BFD,
1114 and sections already created, in BFD_ASSEMBLER mode. */
1115 md_begin ();
1116
9cc92a36
NC
1117#ifdef USING_CGEN
1118 gas_cgen_begin ();
1119#endif
252b5132
RH
1120#ifdef obj_begin
1121 obj_begin ();
1122#endif
1123
76b0a8c0
KH
1124 /* Skip argv[0]. */
1125 argv++;
1126 argc--;
1127
252b5132
RH
1128 while (argc--)
1129 {
1130 if (*argv)
76b0a8c0 1131 { /* Is it a file-name argument? */
252b5132
RH
1132 PROGRESS (1);
1133 saw_a_file++;
76b0a8c0 1134 /* argv->"" if stdin desired, else->filename */
252b5132
RH
1135 read_a_source_file (*argv);
1136 }
76b0a8c0 1137 argv++; /* completed that argv */
252b5132
RH
1138 }
1139 if (!saw_a_file)
1140 read_a_source_file ("");
76b0a8c0 1141}
252b5132
RH
1142
1143/* The interface between the macro code and gas expression handling. */
1144
1145static int
1146macro_expr (emsg, idx, in, val)
1147 const char *emsg;
1148 int idx;
1149 sb *in;
1150 int *val;
1151{
1152 char *hold;
1153 expressionS ex;
1154
1155 sb_terminate (in);
1156
1157 hold = input_line_pointer;
1158 input_line_pointer = in->ptr + idx;
1159 expression (&ex);
1160 idx = input_line_pointer - in->ptr;
1161 input_line_pointer = hold;
1162
1163 if (ex.X_op != O_constant)
1164 as_bad ("%s", emsg);
1165
1166 *val = (int) ex.X_add_number;
1167
1168 return idx;
1169}
This page took 0.20687 seconds and 4 git commands to generate.