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