summaryrefslogtreecommitdiffstats
path: root/contrib/binutils/gas/as.c
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2001-05-28 05:21:37 +0000
committerobrien <obrien@FreeBSD.org>2001-05-28 05:21:37 +0000
commit328e45595b12375b6d16a846069507d25086abdb (patch)
treeae2a6f4f4987889b7bd2af7bdf0b86fa580df011 /contrib/binutils/gas/as.c
parent7fbb72605a1c3bcb81f8b6bb6297ffef30f84335 (diff)
downloadFreeBSD-src-328e45595b12375b6d16a846069507d25086abdb.zip
FreeBSD-src-328e45595b12375b6d16a846069507d25086abdb.tar.gz
Import of GNU Binutils version 2.11.0.
Believe it or not, this is heavily stripped down.
Diffstat (limited to 'contrib/binutils/gas/as.c')
-rw-r--r--contrib/binutils/gas/as.c210
1 files changed, 115 insertions, 95 deletions
diff --git a/contrib/binutils/gas/as.c b/contrib/binutils/gas/as.c
index f02c42a..8c7493d 100644
--- a/contrib/binutils/gas/as.c
+++ b/contrib/binutils/gas/as.c
@@ -1,5 +1,5 @@
/* as.c - GAS main program.
- Copyright (C) 1987, 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
+ Copyright (C) 1987, 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@@ -17,21 +17,18 @@
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ 02111-1307, USA. */
-/*
- * Main program for AS; a 32-bit assembler of GNU.
+/* Main program for AS; a 32-bit assembler of GNU.
* Understands command arguments.
* Has a few routines that don't fit in other modules because they
* are shared.
*
- *
* bugs
*
* : initialisers
* Since no-one else says they will support them in future: I
* don't support them now.
- *
*/
#include "ansidecl.h"
@@ -43,6 +40,7 @@
#include "output-file.h"
#include "sb.h"
#include "macro.h"
+#include "dwarf2dbg.h"
#ifdef HAVE_ITBL_CPU
#include "itbl-ops.h"
@@ -63,19 +61,21 @@ static void dump_statistics PARAMS ((void));
static void perform_an_assembly_pass PARAMS ((int argc, char **argv));
static int macro_expr PARAMS ((const char *, int, sb *, int *));
-int listing; /* true if a listing is wanted */
+/* True if a listing is wanted. */
+int listing;
-static char *listing_filename = NULL; /* Name of listing file. */
+/* Name of listing file. */
+static char *listing_filename = NULL;
/* Type of debugging to generate. */
-enum debug_info_type debug_type = DEBUG_NONE;
+enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
/* Maximum level of macro nesting. */
-
int max_macro_nest = 100;
-char *myname; /* argv[0] */
+/* argv[0] */
+char *myname;
#ifdef BFD_ASSEMBLER
segT reg_section, expr_section;
segT text_section, data_section, bss_section;
@@ -92,8 +92,7 @@ int debug_memory = 0;
/* We build a list of defsyms as we read the options, and then define
them after we have initialized everything. */
-struct defsym_list
-{
+struct defsym_list {
struct defsym_list *next;
char *name;
valueT value;
@@ -101,10 +100,9 @@ struct defsym_list
static struct defsym_list *defsyms;
-/* Keep a record of the itbl files we read in. */
+/* Keep a record of the itbl files we read in. */
-struct itbl_file_list
-{
+struct itbl_file_list {
struct itbl_file_list *next;
char *name;
};
@@ -117,6 +115,7 @@ static struct itbl_file_list *itbl_files;
extern struct emulation mipsbelf, mipslelf, mipself;
extern struct emulation mipsbecoff, mipslecoff, mipsecoff;
extern struct emulation i386coff, i386elf, i386aout;
+extern struct emulation crisaout, criself;
static struct emulation *const emulations[] = { EMULATIONS };
static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
@@ -142,7 +141,7 @@ select_emulation_mode (argc, argv)
if (p)
p++;
else
- p = argv[i+1];
+ p = argv[i + 1];
if (!p || !*p)
as_fatal (_("missing emulation mode name"));
@@ -246,12 +245,12 @@ Options:\n\
fprintf (stream, "\
--em=[");
- for (i = 0; i < n_emulations-1; i++)
+ for (i = 0; i < n_emulations - 1; i++)
fprintf (stream, "%s | ", emulations[i]->name);
fprintf (stream, "%s]\n", emulations[i]->name);
def_em = getenv (EMULATION_ENVIRON);
- if (!def_em)
+ if (!def_em)
def_em = DEFAULT_EMULATION;
fprintf (stream, _("\
emulate output (default %s)\n"), def_em);
@@ -266,6 +265,8 @@ Options:\n\
fprintf (stream, _("\
--help show this message and exit\n"));
fprintf (stream, _("\
+ --target-help show target specific options\n"));
+ fprintf (stream, _("\
-I DIR add DIR to search list for .include directives\n"));
fprintf (stream, _("\
-J don't warn about signed overflow\n"));
@@ -326,16 +327,14 @@ Options:\n\
fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
}
-/*
- * Since it is easy to do here we interpret the special arg "-"
- * to mean "use stdin" and we set that argv[] pointing to "".
- * After we have munged argv[], the only things left are source file
- * name(s) and ""(s) denoting stdin. These file names are used
- * (perhaps more than once) later.
- *
- * check for new machine-dep cmdline options in
- * md_parse_option definitions in config/tc-*.c
- */
+/* Since it is easy to do here we interpret the special arg "-"
+ to mean "use stdin" and we set that argv[] pointing to "".
+ After we have munged argv[], the only things left are source file
+ name(s) and ""(s) denoting stdin. These file names are used
+ (perhaps more than once) later.
+
+ check for new machine-dep cmdline options in
+ md_parse_option definitions in config/tc-*.c. */
static void
parse_args (pargc, pargv)
@@ -352,24 +351,23 @@ parse_args (pargc, pargv)
char *shortopts;
extern CONST char *md_shortopts;
- static const char std_shortopts[] =
- {
- '-', 'J',
+ static const char std_shortopts[] = {
+ '-', 'J',
#ifndef WORKING_DOT_WORD
- /* -K is not meaningful if .word is not being hacked. */
- 'K',
+ /* -K is not meaningful if .word is not being hacked. */
+ 'K',
#endif
- 'L', 'M', 'R', 'W', 'Z', 'f', 'a', ':', ':', 'D', 'I', ':', 'o', ':',
+ 'L', 'M', 'R', 'W', 'Z', 'f', 'a', ':', ':', 'D', 'I', ':', 'o', ':',
#ifndef VMS
- /* -v takes an argument on VMS, so we don't make it a generic
- option. */
- 'v',
+ /* -v takes an argument on VMS, so we don't make it a generic
+ option. */
+ 'v',
#endif
- 'w', 'X',
- /* New option for extending instruction set (see also --itbl below) */
- 't', ':',
- '\0'
- };
+ 'w', 'X',
+ /* New option for extending instruction set (see also --itbl below) */
+ 't', ':',
+ '\0'
+ };
struct option *longopts;
extern struct option md_longopts[];
extern size_t md_longopts_size;
@@ -421,17 +419,26 @@ parse_args (pargc, pargv)
{"no-warn", no_argument, NULL, 'W'},
#define OPTION_WARN (OPTION_STD_BASE + 18)
{"warn", no_argument, NULL, OPTION_WARN},
-#define OPTION_WARN_FATAL (OPTION_STD_BASE + 19)
+#define OPTION_TARGET_HELP (OPTION_STD_BASE + 19)
+ {"target-help", no_argument, NULL, OPTION_TARGET_HELP},
+#define OPTION_WARN_FATAL (OPTION_STD_BASE + 20)
{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
+ /* When you add options here, check that they do not collide with
+ OPTION_MD_BASE. See as.h. */
};
- /* Construct the option lists from the standard list and the
- target dependent list. */
+ /* Construct the option lists from the standard list and the target
+ dependent list. Include space for an extra NULL option and
+ always NULL terminate. */
shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
- longopts = (struct option *) xmalloc (sizeof (std_longopts) + md_longopts_size);
+ longopts = (struct option *) xmalloc (sizeof (std_longopts)
+ + md_longopts_size
+ + sizeof (struct option));
memcpy (longopts, std_longopts, sizeof (std_longopts));
memcpy ((char *) longopts + sizeof (std_longopts),
md_longopts, md_longopts_size);
+ memset ((char *) longopts + sizeof (std_longopts) + md_longopts_size,
+ 0, sizeof (struct option));
/* Make a local copy of the old argv. */
old_argc = *pargc;
@@ -471,7 +478,7 @@ parse_args (pargc, pargv)
VMS code in md_parse_option can return 0 in that case,
but it has no way of pushing the filename argument back. */
if (optarg && *optarg)
- new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL;
+ new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL;
else
#else
case 'v':
@@ -480,7 +487,7 @@ parse_args (pargc, pargv)
print_version_id ();
break;
}
- /*FALLTHRU*/
+ /* Fall through. */
case '?':
exit (EXIT_FAILURE);
@@ -492,6 +499,10 @@ parse_args (pargc, pargv)
new_argv[new_argc] = NULL;
break;
+ case OPTION_TARGET_HELP:
+ md_show_usage (stdout);
+ exit (EXIT_SUCCESS);
+
case OPTION_HELP:
show_usage (stdout);
exit (EXIT_SUCCESS);
@@ -514,7 +525,7 @@ parse_args (pargc, pargv)
case OPTION_VERSION:
/* This output is intended to follow the GNU standards document. */
printf (_("GNU assembler %s\n"), VERSION);
- printf (_("Copyright 2000 Free Software Foundation, Inc.\n"));
+ printf (_("Copyright 2001 Free Software Foundation, Inc.\n"));
printf (_("\
This program is free software; you may redistribute it under the terms of\n\
the GNU General Public License. This program has absolutely no warranty.\n"));
@@ -546,7 +557,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
case OPTION_DEFSYM:
{
char *s;
- long i;
+ valueT i;
struct defsym_list *n;
for (s = optarg; *s != '\0' && *s != '='; s++)
@@ -554,7 +565,11 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
if (*s == '\0')
as_fatal (_("bad defsym; format is --defsym name=value"));
*s++ = '\0';
+#ifdef BFD_ASSEMBLER
+ i = bfd_scan_vma (s, (const char **) NULL, 0);
+#else
i = strtol (s, (char **) NULL, 0);
+#endif
n = (struct defsym_list *) xmalloc (sizeof *n);
n->next = defsyms;
n->name = optarg;
@@ -566,29 +581,29 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
case OPTION_INSTTBL:
case 't':
{
- /* optarg is the name of the file containing the instruction
- formats, opcodes, register names, etc. */
+ /* optarg is the name of the file containing the instruction
+ formats, opcodes, register names, etc. */
struct itbl_file_list *n;
if (optarg == NULL)
{
- as_warn ( _("No file name following -t option\n") );
+ as_warn (_("No file name following -t option\n"));
break;
}
-
+
n = (struct itbl_file_list *) xmalloc (sizeof *n);
n->next = itbl_files;
n->name = optarg;
itbl_files = n;
/* Parse the file and add the new instructions to our internal
- table. If multiple instruction tables are specified, the
- information from this table gets appended onto the existing
- internal table. */
+ table. If multiple instruction tables are specified, the
+ information from this table gets appended onto the existing
+ internal table. */
itbl_files->name = xstrdup (optarg);
if (itbl_parse (itbl_files->name) != 0)
{
- fprintf (stderr, _("Failed to read instruction table %s\n"),
+ fprintf (stderr, _("Failed to read instruction table %s\n"),
itbl_files->name);
exit (EXIT_SUCCESS);
}
@@ -602,7 +617,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
case OPTION_GSTABS:
debug_type = DEBUG_STABS;
break;
-
+
case OPTION_GDWARF2:
debug_type = DEBUG_DWARF2;
break;
@@ -622,22 +637,22 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
break;
case OPTION_LISTING_LHS_WIDTH:
- listing_lhs_width = atoi(optarg);
+ listing_lhs_width = atoi (optarg);
if (listing_lhs_width_second < listing_lhs_width)
listing_lhs_width_second = listing_lhs_width;
break;
case OPTION_LISTING_LHS_WIDTH2:
{
- int tmp = atoi(optarg);
+ int tmp = atoi (optarg);
if (tmp > listing_lhs_width)
listing_lhs_width_second = tmp;
}
break;
case OPTION_LISTING_RHS_WIDTH:
- listing_rhs_width = atoi(optarg);
+ listing_rhs_width = atoi (optarg);
break;
case OPTION_LISTING_CONT_LINES:
- listing_lhs_cont_lines = atoi(optarg);
+ listing_lhs_cont_lines = atoi (optarg);
break;
case 'M':
@@ -672,6 +687,9 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
case 'a':
if (optarg)
{
+ if (md_parse_option (optc, optarg) != 0)
+ break;
+
while (*optarg)
{
switch (*optarg)
@@ -713,8 +731,8 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
break;
case 'D':
- /* DEBUG is implemented: it debugs different */
- /* things from other people's assemblers. */
+ /* DEBUG is implemented: it debugs different
+ things from other people's assemblers. */
flag_debug = 1;
break;
@@ -723,7 +741,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
break;
case 'I':
- { /* Include file directory */
+ { /* Include file directory. */
char *temp = xstrdup (optarg);
add_include_dir (temp);
break;
@@ -737,7 +755,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
break;
case 'X':
- /* -X means treat warnings as errors */
+ /* -X means treat warnings as errors. */
break;
}
}
@@ -751,7 +769,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
static long start_time;
-int
+int
main (argc, argv)
int argc;
char **argv;
@@ -806,7 +824,7 @@ main (argc, argv)
symbol_begin ();
frag_init ();
subsegs_begin ();
- parse_args (&argc, &argv);
+ parse_args (&argc, &argv);
read_begin ();
input_scrub_begin ();
expr_begin ();
@@ -859,7 +877,8 @@ main (argc, argv)
PROGRESS (1);
- perform_an_assembly_pass (argc, argv); /* Assemble it. */
+ /* Assemble it. */
+ perform_an_assembly_pass (argc, argv);
cond_finish_check (-1);
@@ -867,6 +886,10 @@ main (argc, argv)
md_end ();
#endif
+ /* If we've been collecting dwarf2 .debug_line info, either for
+ assembly debugging or on behalf of the compiler, emit it now. */
+ dwarf2_finish ();
+
if (seen_at_least_1_file ()
&& (flag_always_generate_output || had_errors () == 0))
keep_it = 1;
@@ -895,8 +918,8 @@ main (argc, argv)
output_file_close (out_file_name);
#endif
- if (flag_fatal_warnings && had_warnings() > 0 && had_errors () == 0)
- as_bad (_("%d warnings, treating warnings as errors"), had_warnings());
+ if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0)
+ as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());
if (had_errors () > 0 && ! flag_always_generate_output)
keep_it = 0;
@@ -947,19 +970,16 @@ dump_statistics ()
#endif
}
+/* Here to attempt 1 pass over each input file.
+ We scan argv[*] looking for filenames or exactly "" which is
+ shorthand for stdin. Any argv that is NULL is not a file-name.
+ We set need_pass_2 TRUE if, after this, we still have unresolved
+ expressions of the form (unknown value)+-(unknown value).
-/* perform_an_assembly_pass()
- *
- * Here to attempt 1 pass over each input file.
- * We scan argv[*] looking for filenames or exactly "" which is
- * shorthand for stdin. Any argv that is NULL is not a file-name.
- * We set need_pass_2 TRUE if, after this, we still have unresolved
- * expressions of the form (unknown value)+-(unknown value).
- *
- * Note the un*x semantics: there is only 1 logical input file, but it
- * may be a catenation of many 'physical' input files.
- */
-static void
+ Note the un*x semantics: there is only 1 logical input file, but it
+ may be a catenation of many 'physical' input files. */
+
+static void
perform_an_assembly_pass (argc, argv)
int argc;
char **argv;
@@ -978,7 +998,7 @@ perform_an_assembly_pass (argc, argv)
for (i = SEG_E0; i < SEG_UNKNOWN; i++)
segment_info[i].fix_root = 0;
}
- /* Create the three fixed ones */
+ /* Create the three fixed ones. */
{
segT seg;
@@ -1009,7 +1029,7 @@ perform_an_assembly_pass (argc, argv)
data_section = subseg_new (DATA_SECTION_NAME, 0);
bss_section = subseg_new (BSS_SECTION_NAME, 0);
/* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
- to have relocs, otherwise we don't find out in time. */
+ to have relocs, otherwise we don't find out in time. */
applicable = bfd_applicable_section_flags (stdoutput);
bfd_set_section_flags (stdoutput, text_section,
applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
@@ -1036,22 +1056,24 @@ perform_an_assembly_pass (argc, argv)
obj_begin ();
#endif
- argv++; /* skip argv[0] */
- argc--; /* skip argv[0] */
+ /* Skip argv[0]. */
+ argv++;
+ argc--;
+
while (argc--)
{
if (*argv)
- { /* Is it a file-name argument? */
+ { /* Is it a file-name argument? */
PROGRESS (1);
saw_a_file++;
- /* argv->"" if stdin desired, else->filename */
+ /* argv->"" if stdin desired, else->filename */
read_a_source_file (*argv);
}
- argv++; /* completed that argv */
+ argv++; /* completed that argv */
}
if (!saw_a_file)
read_a_source_file ("");
-} /* perform_an_assembly_pass() */
+}
/* The interface between the macro code and gas expression handling. */
@@ -1080,5 +1102,3 @@ macro_expr (emsg, idx, in, val)
return idx;
}
-
-/* end of as.c */
OpenPOWER on IntegriCloud