*
*/
+#include "ansidecl.h"
+#include "libiberty.h"
+
#include <stdio.h>
#include <string.h>
segT text_section, data_section, bss_section;
#endif
-/* This is true if the assembler should not produce any timing info. */
+/* This is true if the assembler should output time and space usage. */
-static int quiet_flag = 1;
+static int statistics_flag = 0;
\f
void
fprintf (stderr, "\n");
}
-int
-main (argc, argv)
- int argc;
- char **argv;
+void
+show_usage (stream)
+ FILE *stream;
{
- int work_argc; /* variable copy of argc */
- char **work_argv; /* variable copy of argv */
- char *arg; /* an arg to program */
- char a; /* an arg flag (after -) */
- int keep_it;
- long start_time = get_run_time ();
+ fprintf (stream, "Usage: %s [option...] [asmfile...]\n", myname);
+
+ fprintf (stream, "\
+Options:\n\
+-a[sub-option...] turn on listings\n\
+ Sub-options [default hls]:\n\
+ d omit debugging directives\n\
+ h include high-level source\n\
+ l include assembly\n\
+ n omit forms processing\n\
+ s include symbols\n\
+-D ignored\n\
+-f skip whitespace and comment preprocessing\n\
+--help show this message and exit\n\
+-I DIR add DIR to search list for .include directives\n\
+-J don't warn about signed overflow\n\
+-K warn when differences altered for long displacements\n\
+-L keep local symbols (starting with `L')\n");
+ fprintf (stream, "\
+-o OBJFILE name the object-file output OBJFILE [default a.out]\n\
+-R fold data section into text section\n\
+--statistics print maximum bytes and total seconds used\n\
+-v, -version print assembler version number\n\
+--version print assembler version number and exit\n\
+-W suppress warnings\n\
+-w ignored\n\
+-x ignored\n\
+-Z generate object file even after errors\n");
+
+#ifdef TC_ALPHA
+ fprintf(stream, "\
+ALPHA options:\n\
+-32addr treat addresses as 32-bit values\n\
+-F lack floating point instructions support\n\
+-nocpp ignored\n");
+#endif
-#if 0 /* do we need any of this?? */
- {
- static const int sig[] = {SIGHUP, SIGINT, SIGPIPE, SIGTERM, 0};
+#ifdef TC_I960
+ fprintf(stream, "\
+I960 options:\n\
+-ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC\n\
+ specify variant of 960 architecture\n\
+-b add code to collect statistics about branches taken\n\
+-linkrelax make relocatable instructions undefined (?)\n\
+-norelax don't alter compare-and-branch instructions for\n\
+ long displacements\n");
+#endif
- for (a = 0; sig[a] != 0; a++)
- if (signal (sig[a], SIG_IGN) != SIG_IGN)
- signal (sig[a], got_sig);
- }
+#ifdef TC_M68K
+ fprintf(stream, "\
+680X0 options:\n\
+-l use 1 word for refs to undefined symbols [default 2]\n\
+-m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040\n\
+ | -m68302 | -m68331 | -m68332 | -m68333 | -m68340 | -mcpu32\n\
+ specify variant of 680X0 architecture [default 68020]\n\
+-m68881 | -m68882 | -mno-68881 | -mno-68882\n\
+ target has/lacks floating-point coprocessor\n\
+ [default yes for 68020, 68030, and cpu32]\n\
+-m68851 | -mno-68851\n\
+ target has/lacks memory-management unit coprocessor\n\
+ [default yes for 68020 and up]\n\
+-pic, -k (sun3) generate position independent code\n\
+-S turn jbsr into jsr\n\
+--register-prefix-optional\n\
+ recognize register names without prefix character\n");
#endif
- myname = argv[0];
- memset (flagseen, '\0', sizeof (flagseen)); /* aint seen nothing yet */
-#ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
-#define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
+#ifdef TC_MIPS
+ fprintf(stream, "\
+MIPS options:\n\
+-membedded-pic generate embedded position independent code\n\
+-nocpp ignored\n\
+-EB generate big endian output\n\
+-EL generate little endian output\n\
+-g, -g2 do not remove uneeded NOPs or swap branches\n\
+-G NUM allow referencing objects up to NUM bytes\n\
+ implicitly with the gp register [default 8]\n\
+-mips1, -mcpu=r{2,3}000 generate code for r2000 and r3000\n\
+-mips2, -mcpu=r6000 generate code for r6000\n\
+-mips3, -mcpu=r4000 generate code for r4000\n\
+-O0 remove unneeded NOPs, do not swap branches\n\
+-O remove unneeded NOPs and swap branches\n\
+--trap, --no-break trap exception on div by 0 and mult overflow\n\
+--break, --no-trap break exception on div by 0 and mult overflow\n");
+#ifdef OBJ_ELF
+ fprintf(stream, "\
+MIPS ELF options:\n\
+-KPIC, -call_shared generate SVR4 position independent code\n\
+-non_shared do not generate position independent code\n");
+#endif
#endif
- out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
-#ifdef BFD_ASSEMBLER
- bfd_init ();
+#ifdef TC_NS32K
+ fprintf(stream, "\
+NS32K options:\n\
+-m32032 | -m32532 select variant of NS32K architecture\n");
#endif
- symbol_begin ();
- subsegs_begin ();
- read_begin ();
- input_scrub_begin ();
- frag_init ();
- /*
- * Parse arguments, but we are only interested in flags.
- * When we find a flag, we process it then make it's argv[] NULL.
- * This helps any future argv[] scanners avoid what we processed.
- * 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.
- */
- /* FIXME-SOMEDAY this should use getopt. */
- work_argc = argc - 1; /* don't count argv[0] */
- work_argv = argv + 1; /* skip argv[0] */
- for (; work_argc--; work_argv++)
+#ifdef TC_PPC
+ fprintf(stream, "\
+PowerPC options:\n\
+-u ignored\n\
+-mpwrx generate code for IBM POWER/2 (RIOS2)\n\
+-mpwr generate code for IBM POWER (RIOS1)\n\
+-m601 generate code for Motorola PowerPC 601\n\
+-mppc generate code for Motorola PowerPC 603/604\n\
+-many generate code for any architecture (PWR/PWRX/PPC)\n");
+#ifdef OBJ_ELF
+ fprintf(stream, "\
+PowerPC ELF options:\n\
+-V print assembler version number\n\
+-Qy, -Qn ignored\n");
+#endif
+#endif
+
+#ifdef TC_SH
+ fprintf(stream, "\
+SH options:\n\
+-relax alter jump instructions for long displacements\n");
+#endif
+
+#ifdef TC_SPARC
+ fprintf(stream, "\
+SPARC options:\n\
+-Av6 | -Av7 | -Av8 | -Asparclite\n\
+ specify variant of SPARC architecture\n\
+-bump warn when assembler switches architectures\n\
+-sparc ignored\n");
+#ifdef OBJ_ELF
+ fprintf(stream, "\
+SPARC ELF options:\n\
+-V print assembler version number\n\
+-q ignored\n\
+-Qy, -Qn ignored\n\
+-s ignored\n");
+#endif
+#endif
+
+#ifdef TC_TAHOE
+ fprintf(stream, "\
+Tahoe options:\n\
+-a ignored\n\
+-d LENGTH ignored\n\
+-J ignored\n\
+-S ignored\n\
+-t FILE ignored\n\
+-T ignored\n\
+-V ignored\n");
+#endif
+
+#ifdef TC_VAX
+ fprintf(stream, "\
+VAX options:\n\
+-d LENGTH ignored\n\
+-J ignored\n\
+-S ignored\n\
+-t FILE ignored\n\
+-T ignored\n\
+-V ignored\n");
+#endif
+
+#ifdef TC_Z8K
+ fprintf(stream, "\
+Z8K options:\n\
+-z8001 generate segmented code\n\
+-z8002 generate unsegmented code\n");
+#endif
+}
+
+/*
+ * Parse arguments, but we are only interested in flags.
+ * When we find a flag, we process it then make it's argv[] NULL.
+ * This helps any future argv[] scanners avoid what we processed.
+ * 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.
+ */
+/* FIXME-SOMEDAY this should use getopt. */
+/*
+ * check for new machine-dep cmdline options in
+ * md_parse_option definitions in config/tc-*.c
+ */
+
+void
+parse_args (argc, argv)
+ int argc;
+ char **argv;
+{
+ char *arg; /* an arg to program */
+ char a; /* an arg flag (after -) */
+
+ argc--; /* don't count argv[0] */
+ argv++; /* skip argv[0] */
+
+ for (; argc--; argv++)
{
- arg = *work_argv; /* work_argv points to this argument */
+ arg = *argv; /* argv points to this argument */
if (*arg != '-') /* Filename. We need it later. */
continue; /* Keep scanning args looking for flags. */
- if (arg[1] == '-' && arg[2] == 0)
+ /* Handle double-dash options. */
+ if (arg[1] == '-')
{
- /* "--" as an argument means read STDIN */
- /* on this scan, we don't want to think about filenames */
- *work_argv = ""; /* Code that means 'use stdin'. */
+ if (arg[2] == 0)
+ {
+ /* "--" as an argument means read stdin. */
+ /* On this scan, we don't want to think about filenames. */
+ *argv = ""; /* A code that means 'use stdin'. */
+ }
+ else if (strcmp (arg, "--statistics") == 0)
+ {
+ statistics_flag = 1;
+ *argv = NULL;
+ }
+ else if (strcmp (arg, "--help") == 0)
+ {
+ show_usage (stdout);
+ exit (0);
+ }
+ else if (strcmp (arg, "--version") == 0)
+ {
+ print_version_id ();
+ exit (0);
+ }
+#ifdef md_parse_long_option
+ else if (md_parse_long_option (arg))
+ *argv = NULL;
+#endif
+ else
+ {
+ as_warn ("Unknown option `%s' ignored", arg);
+ *argv = NULL;
+ }
continue;
}
+
/* This better be a switch. */
arg++; /*->letter. */
if (!temp)
as_fatal ("virtual memory exhausted");
}
- else if (work_argc)
+ else if (argc)
{
- *work_argv = NULL;
- work_argc--;
- temp = *++work_argv;
+ *argv = NULL;
+ argc--;
+ temp = *++argv;
}
else
as_warn ("%s: I expected a filename after -I", myname);
if (!out_file_name)
as_fatal ("virtual memory exhausted");
}
- else if (work_argc)
+ else if (argc)
{ /* Want next arg for a file-name. */
- *work_argv = NULL; /* This is not a file-name. */
- work_argc--;
- out_file_name = *++work_argv;
+ *argv = NULL; /* This is not a file-name. */
+ argc--;
+ out_file_name = *++argv;
}
else
as_warn ("%s: I expected a filename after -o. \"%s\" assumed.",
break;
case 'n':
- if (*arg && strcmp(arg, "oquiet") == 0)
- quiet_flag = 0;
- else if (*arg && strcmp(arg, "ocpp") == 0)
+ if (*arg && strcmp(arg, "ocpp") == 0)
;
else
{
default:
--arg;
- if (md_parse_option (&arg, &work_argc, &work_argv) == 0)
+ if (md_parse_option (&arg, &argc, &argv) == 0)
as_warn ("%s: I don't understand '%c' flag.", myname, a);
if (arg && *arg)
arg++;
* file-name. Smash it so the
* things that look for filenames won't ever see it.
*
- * Whatever work_argv points to, it has already been used
+ * Whatever argv points to, it has already been used
* as part of a flag, so DON'T re-use it as a filename.
*/
- *work_argv = NULL; /* NULL means 'not a file-name' */
+ *argv = NULL; /* NULL means 'not a file-name' */
}
+}
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ char a;
+ int keep_it;
+ long start_time = get_run_time ();
+
+#if 0 /* do we need any of this?? */
+ {
+ static const int sig[] = {SIGHUP, SIGINT, SIGPIPE, SIGTERM, 0};
+
+ for (a = 0; sig[a] != 0; a++)
+ if (signal (sig[a], SIG_IGN) != SIG_IGN)
+ signal (sig[a], got_sig);
+ }
+#endif
+
+ myname = argv[0];
+ memset (flagseen, '\0', sizeof (flagseen)); /* aint seen nothing yet */
+#ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME
+#define OBJ_DEFAULT_OUTPUT_FILE_NAME "a.out"
+#endif
+ out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
+
+#ifdef BFD_ASSEMBLER
+ bfd_init ();
+#endif
+
+ symbol_begin ();
+ subsegs_begin ();
+ read_begin ();
+ input_scrub_begin ();
+ frag_init ();
+ parse_args (argc, argv);
#ifdef BFD_ASSEMBLER
output_file_create (out_file_name);
assert (stdoutput != 0);
#endif
+#ifdef tc_init_after_args
+ tc_init_after_args ();
+#endif
+
/* Here with flags set up in flagseen[]. */
perform_an_assembly_pass (argc, argv); /* Assemble it. */
#ifdef TC_I960
listing_print ("");
#endif
+#ifndef OBJ_VMS /* does its own file handling */
#ifndef BFD_ASSEMBLER
if (keep_it)
#endif
output_file_close (out_file_name);
+#endif
if (!keep_it)
unlink (out_file_name);
md_end ();
#endif
- if (!quiet_flag)
+ if (statistics_flag)
{
extern char **environ;
char *lim = (char *) sbrk (0);
{
segT seg;
+#ifdef TE_APOLLO
+ seg = subseg_new (".wtext", 0);
+#else
seg = subseg_new (".text", 0);
+#endif
assert (seg == SEG_E0);
seg = subseg_new (".data", 0);
assert (seg == SEG_E1);
seg = subseg_new (".bss", 0);
assert (seg == SEG_E2);
+#ifdef TE_APOLLO
+ create_target_segments ();
+#endif
}
#else /* not MANY_SEGMENTS */