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