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