* as.c (show_usage): New function.
(parse_args): Code moved from main. Recognize --help and --version. * config/tc-ns32k.h: Define TC_NS32K. * doc/as.texinfo: Document all of the target-independent command line options.
This commit is contained in:
parent
b166d61474
commit
ebd6f11797
|
@ -1,3 +1,12 @@
|
|||
Thu Jun 2 13:54:46 1994 David J. Mackenzie (djm@rtl.cygnus.com)
|
||||
|
||||
* as.c (show_usage): New function.
|
||||
(parse_args): Code moved from main.
|
||||
Recognize --help and --version.
|
||||
* config/tc-ns32k.h: Define TC_NS32K.
|
||||
* doc/as.texinfo: Document all of the target-independent command
|
||||
line options.
|
||||
|
||||
Thu Jun 2 12:07:25 1994 Ken Raeburn (raeburn@cujo.cygnus.com)
|
||||
|
||||
* gasp.c (hash_new_table): Clear newly allocated table.
|
||||
|
|
364
gas/as.c
364
gas/as.c
|
@ -32,6 +32,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "ansidecl.h"
|
||||
#include "libiberty.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -73,9 +76,9 @@ segT reg_section, expr_section;
|
|||
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;
|
||||
|
||||
|
||||
void
|
||||
|
@ -93,70 +96,248 @@ print_version_id ()
|
|||
fprintf (stderr, "\n");
|
||||
}
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
void
|
||||
show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
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
|
||||
|
||||
#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
|
||||
|
||||
#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
|
||||
|
||||
#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
|
||||
|
||||
#ifdef TC_NS32K
|
||||
fprintf(stream, "\
|
||||
NS32K options:\n\
|
||||
-m32032 | -m32532 select variant of NS32K architecture\n");
|
||||
#endif
|
||||
|
||||
#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;
|
||||
{
|
||||
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 ();
|
||||
|
||||
#if 0 /* do we need any of this?? */
|
||||
{
|
||||
static const int sig[] = {SIGHUP, SIGINT, SIGPIPE, SIGTERM, 0};
|
||||
argc--; /* don't count argv[0] */
|
||||
argv++; /* skip argv[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 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++)
|
||||
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. */
|
||||
|
||||
|
@ -226,11 +407,11 @@ main (argc, argv)
|
|||
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);
|
||||
|
@ -260,11 +441,11 @@ main (argc, argv)
|
|||
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.",
|
||||
|
@ -273,9 +454,7 @@ main (argc, argv)
|
|||
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
|
||||
{
|
||||
|
@ -325,7 +504,7 @@ main (argc, argv)
|
|||
|
||||
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++;
|
||||
|
@ -337,17 +516,59 @@ main (argc, argv)
|
|||
* 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
|
||||
|
@ -368,10 +589,12 @@ main (argc, argv)
|
|||
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);
|
||||
|
@ -381,7 +604,7 @@ main (argc, argv)
|
|||
md_end ();
|
||||
#endif
|
||||
|
||||
if (!quiet_flag)
|
||||
if (statistics_flag)
|
||||
{
|
||||
extern char **environ;
|
||||
char *lim = (char *) sbrk (0);
|
||||
|
@ -434,12 +657,19 @@ perform_an_assembly_pass (argc, argv)
|
|||
{
|
||||
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 */
|
||||
|
|
Loading…
Reference in New Issue