mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
* as.c (show_usage): Remove target specific messages;
instead, call md_show_usage. (parse_args): Use getopt_long_only. Take pointers to argc and argv. (main): Pass parse_args pointers. * as.h: Remove 3 variables that are redundant with flagseen. * as.c, messages.c: Change their users to use flagseen. Define getopt stuff. * tc.h: Update md_parse_option decl. Add md_show_usage decl. * config/tc-*.c: Add md_shortopts, md_longopts, md_longopts_size, md_show_usage. Change calling convention for md_parse_option. Remove md_parse_long_option. * config/tc-ns32k.c: Rename `struct option' to `struct ns32k_option'. * config/tc-i386.h: Don't define md_parse_option.
This commit is contained in:
parent
172559ec33
commit
f3d817d8b7
@ -1,3 +1,20 @@
|
||||
Fri Jun 3 12:50:13 1994 David J. MacKenzie (djm@rtl.cygnus.com)
|
||||
|
||||
* as.c (show_usage): Remove target specific messages;
|
||||
instead, call md_show_usage.
|
||||
(parse_args): Use getopt_long_only. Take pointers to argc and
|
||||
argv.
|
||||
(main): Pass parse_args pointers.
|
||||
* as.h: Remove 3 variables that are redundant with flagseen.
|
||||
* as.c, messages.c: Change their users to use flagseen.
|
||||
Define getopt stuff.
|
||||
* tc.h: Update md_parse_option decl. Add md_show_usage decl.
|
||||
* config/tc-*.c: Add md_shortopts, md_longopts,
|
||||
md_longopts_size, md_show_usage. Change calling convention for
|
||||
md_parse_option. Remove md_parse_long_option.
|
||||
* config/tc-ns32k.c: Rename `struct option' to `struct ns32k_option'.
|
||||
* config/tc-i386.h: Don't define md_parse_option.
|
||||
|
||||
Thu Jun 2 13:54:46 1994 David J. Mackenzie (djm@rtl.cygnus.com)
|
||||
|
||||
* as.c (show_usage): New function.
|
||||
|
542
gas/as.c
542
gas/as.c
@ -119,154 +119,17 @@ Options:\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\
|
||||
-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\
|
||||
-v 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
|
||||
md_show_usage (stream);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -278,249 +141,188 @@ Z8K options:\n\
|
||||
* 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;
|
||||
parse_args (pargc, pargv)
|
||||
int *pargc;
|
||||
char ***pargv;
|
||||
{
|
||||
char *arg; /* an arg to program */
|
||||
char a; /* an arg flag (after -) */
|
||||
int old_argc, new_argc;
|
||||
char **old_argv, **new_argv;
|
||||
|
||||
argc--; /* don't count argv[0] */
|
||||
argv++; /* skip argv[0] */
|
||||
/* Starting the short option string with '-' is for programs that
|
||||
expect options and other ARGV-elements in any order and that care about
|
||||
the ordering of the two. We describe each non-option ARGV-element
|
||||
as if it were the argument of an option with character code 1. */
|
||||
|
||||
for (; argc--; argv++)
|
||||
char *shortopts;
|
||||
extern CONST char *md_shortopts;
|
||||
CONST char *std_shortopts = "-1JKLRWZfa::DI:o:vwX";
|
||||
|
||||
struct option *longopts;
|
||||
extern struct option md_longopts[];
|
||||
extern size_t md_longopts_size;
|
||||
static struct option std_longopts[] = {
|
||||
#define OPTION_HELP (OPTION_STD_BASE)
|
||||
{"help", no_argument, NULL, OPTION_HELP},
|
||||
#define OPTION_NOCPP (OPTION_STD_BASE + 1)
|
||||
{"nocpp", no_argument, NULL, OPTION_NOCPP},
|
||||
#define OPTION_STATISTICS (OPTION_STD_BASE + 2)
|
||||
{"statistics", no_argument, NULL, OPTION_STATISTICS},
|
||||
#define OPTION_VERSION (OPTION_STD_BASE + 3)
|
||||
{"version", no_argument, NULL, OPTION_VERSION},
|
||||
};
|
||||
|
||||
/* Construct the option lists from the standard list and the
|
||||
target dependent list. */
|
||||
shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
|
||||
longopts = xmalloc (sizeof (std_longopts) + md_longopts_size);
|
||||
memcpy (longopts, std_longopts, sizeof (std_longopts));
|
||||
memcpy ((char *) longopts + sizeof (std_longopts),
|
||||
md_longopts, md_longopts_size);
|
||||
|
||||
/* Make a local copy of the old argv. */
|
||||
old_argc = *pargc;
|
||||
old_argv = *pargv;
|
||||
|
||||
/* Initialize a new argv that contains no options. */
|
||||
new_argv = (char **) xmalloc (sizeof (char *) * (old_argc + 1));
|
||||
new_argv[0] = old_argv[0];
|
||||
new_argc = 1;
|
||||
new_argv[new_argc] = NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
arg = *argv; /* argv points to this argument */
|
||||
/* getopt_long_only is like getopt_long, but '-' as well as '--' can
|
||||
indicate a long option. */
|
||||
int longind;
|
||||
int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts,
|
||||
&longind);
|
||||
|
||||
if (*arg != '-') /* Filename. We need it later. */
|
||||
continue; /* Keep scanning args looking for flags. */
|
||||
/* Handle double-dash options. */
|
||||
if (arg[1] == '-')
|
||||
if (optc == -1)
|
||||
break;
|
||||
|
||||
switch (optc)
|
||||
{
|
||||
if (arg[2] == 0)
|
||||
default:
|
||||
/* md_parse_option should return 1 if it recognizes optc,
|
||||
0 if not. */
|
||||
if (md_parse_option (optc, optarg) == 0)
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
case 1: /* File name. */
|
||||
if (!strcmp (optarg, "-"))
|
||||
optarg = "";
|
||||
new_argv[new_argc++] = optarg;
|
||||
new_argv[new_argc] = NULL;
|
||||
break;
|
||||
|
||||
case OPTION_HELP:
|
||||
show_usage (stdout);
|
||||
exit (0);
|
||||
|
||||
case OPTION_NOCPP:
|
||||
break;
|
||||
|
||||
case OPTION_STATISTICS:
|
||||
statistics_flag = 1;
|
||||
break;
|
||||
|
||||
case OPTION_VERSION:
|
||||
print_version_id ();
|
||||
exit (0);
|
||||
|
||||
case '1':
|
||||
case 'J':
|
||||
case 'K':
|
||||
case 'L':
|
||||
case 'R':
|
||||
case 'W':
|
||||
case 'Z':
|
||||
case 'f':
|
||||
flagseen[(unsigned char) optc] = 1;
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
if (optarg)
|
||||
{
|
||||
/* "--" as an argument means read stdin. */
|
||||
/* On this scan, we don't want to think about filenames. */
|
||||
*argv = ""; /* A code that means 'use stdin'. */
|
||||
while (*optarg)
|
||||
{
|
||||
switch (*optarg)
|
||||
{
|
||||
case 'd':
|
||||
listing |= LISTING_NODEBUG;
|
||||
break;
|
||||
case 'h':
|
||||
listing |= LISTING_HLL;
|
||||
break;
|
||||
case 'l':
|
||||
listing |= LISTING_LISTING;
|
||||
break;
|
||||
case 'n':
|
||||
listing |= LISTING_NOFORM;
|
||||
break;
|
||||
case 's':
|
||||
listing |= LISTING_SYMBOLS;
|
||||
break;
|
||||
default:
|
||||
as_bad ("invalid listing option `%c'", *optarg);
|
||||
exit (EXIT_FAILURE);
|
||||
break;
|
||||
}
|
||||
optarg++;
|
||||
}
|
||||
}
|
||||
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;
|
||||
if (!listing)
|
||||
listing = LISTING_DEFAULT;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
/* DEBUG is implemented: it debugs different */
|
||||
/* things to other people's assemblers. */
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
{ /* Include file directory */
|
||||
char *temp = strdup (optarg);
|
||||
if (!temp)
|
||||
as_fatal ("virtual memory exhausted");
|
||||
add_include_dir (temp);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'o':
|
||||
out_file_name = strdup (optarg);
|
||||
if (!out_file_name)
|
||||
as_fatal ("virtual memory exhausted");
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
print_version_id ();
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
break;
|
||||
|
||||
case 'X':
|
||||
/* -X means treat warnings as errors */
|
||||
break;
|
||||
}
|
||||
|
||||
/* This better be a switch. */
|
||||
arg++; /*->letter. */
|
||||
|
||||
while ((a = *arg) != '\0')
|
||||
{ /* scan all the 1-char flags */
|
||||
arg++; /* arg->after letter. */
|
||||
a &= 0x7F; /* ascii only please */
|
||||
flagseen[(unsigned char) a] = 1;
|
||||
switch (a)
|
||||
{
|
||||
case 'a':
|
||||
{
|
||||
int loop = 1;
|
||||
|
||||
while (loop)
|
||||
{
|
||||
switch (*arg)
|
||||
{
|
||||
case 'l':
|
||||
listing |= LISTING_LISTING;
|
||||
arg++;
|
||||
break;
|
||||
case 's':
|
||||
listing |= LISTING_SYMBOLS;
|
||||
arg++;
|
||||
break;
|
||||
case 'h':
|
||||
listing |= LISTING_HLL;
|
||||
arg++;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
listing |= LISTING_NOFORM;
|
||||
arg++;
|
||||
break;
|
||||
case 'd':
|
||||
listing |= LISTING_NODEBUG;
|
||||
arg++;
|
||||
break;
|
||||
default:
|
||||
if (!listing)
|
||||
listing = LISTING_DEFAULT;
|
||||
loop = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case 'f':
|
||||
break; /* -f means fast - no need for "app" preprocessor. */
|
||||
|
||||
case 'D':
|
||||
/* DEBUG is implemented: it debugs different */
|
||||
/* things to other people's assemblers. */
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
{ /* Include file directory */
|
||||
|
||||
char *temp = NULL;
|
||||
if (*arg)
|
||||
{
|
||||
temp = strdup (arg);
|
||||
if (!temp)
|
||||
as_fatal ("virtual memory exhausted");
|
||||
}
|
||||
else if (argc)
|
||||
{
|
||||
*argv = NULL;
|
||||
argc--;
|
||||
temp = *++argv;
|
||||
}
|
||||
else
|
||||
as_warn ("%s: I expected a filename after -I", myname);
|
||||
add_include_dir (temp);
|
||||
arg = ""; /* Finished with this arg. */
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef WARN_SIGNED_OVERFLOW_WORD
|
||||
/* Don't warn about signed overflow. */
|
||||
case 'J':
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifndef WORKING_DOT_WORD
|
||||
case 'K':
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 'L': /* -L means keep L* symbols */
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
if (*arg) /* Rest of argument is object file-name. */
|
||||
{
|
||||
out_file_name = strdup (arg);
|
||||
if (!out_file_name)
|
||||
as_fatal ("virtual memory exhausted");
|
||||
}
|
||||
else if (argc)
|
||||
{ /* Want next arg for a file-name. */
|
||||
*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.",
|
||||
myname, out_file_name);
|
||||
arg = ""; /* Finished with this arg. */
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
if (*arg && strcmp(arg, "ocpp") == 0)
|
||||
;
|
||||
else
|
||||
{
|
||||
as_warn ("Unknown option `-n%s' ignored", arg);
|
||||
arg += strlen (arg);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'R':
|
||||
/* -R means put data into text segment */
|
||||
flag_readonly_data_in_text = 1;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
#ifdef VMS
|
||||
{
|
||||
extern char *compiler_version_string;
|
||||
compiler_version_string = arg;
|
||||
}
|
||||
#else /* not VMS */
|
||||
if (*arg && strcmp (arg, "ersion"))
|
||||
{
|
||||
as_warn ("Unknown option `-v%s' ignored", arg);
|
||||
arg += strlen (arg);
|
||||
break;
|
||||
}
|
||||
|
||||
print_version_id ();
|
||||
#endif /* not VMS */
|
||||
while (*arg)
|
||||
arg++; /* Skip the rest */
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
/* -W means don't warn about things */
|
||||
flag_suppress_warnings = 1;
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
case 'X':
|
||||
/* -X means treat warnings as errors */
|
||||
break;
|
||||
case 'Z':
|
||||
/* -Z means attempt to generate object file even after errors. */
|
||||
flag_always_generate_output = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
--arg;
|
||||
if (md_parse_option (&arg, &argc, &argv) == 0)
|
||||
as_warn ("%s: I don't understand '%c' flag.", myname, a);
|
||||
if (arg && *arg)
|
||||
arg++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* We have just processed a "-..." arg, which was not a
|
||||
* file-name. Smash it so the
|
||||
* things that look for filenames won't ever see it.
|
||||
*
|
||||
* Whatever argv points to, it has already been used
|
||||
* as part of a flag, so DON'T re-use it as a filename.
|
||||
*/
|
||||
*argv = NULL; /* NULL means 'not a file-name' */
|
||||
}
|
||||
|
||||
free (shortopts);
|
||||
free (longopts);
|
||||
|
||||
*pargc = new_argc;
|
||||
*pargv = new_argv;
|
||||
}
|
||||
|
||||
int
|
||||
@ -558,7 +360,7 @@ main (argc, argv)
|
||||
read_begin ();
|
||||
input_scrub_begin ();
|
||||
frag_init ();
|
||||
parse_args (argc, argv);
|
||||
parse_args (&argc, &argv);
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
output_file_create (out_file_name);
|
||||
@ -576,7 +378,7 @@ main (argc, argv)
|
||||
#endif
|
||||
|
||||
if (seen_at_least_1_file ()
|
||||
&& !((had_warnings () && flag_always_generate_output)
|
||||
&& !((had_warnings () && flagseen['Z'])
|
||||
|| had_errors () > 0))
|
||||
keep_it = 1;
|
||||
else
|
||||
|
11
gas/as.h
11
gas/as.h
@ -42,6 +42,14 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <getopt.h>
|
||||
/* The first getopt value for machine-independent long options.
|
||||
150 isn't special; it's just an arbitrary non-ASCII char value. */
|
||||
#define OPTION_STD_BASE 150
|
||||
/* The first getopt value for machine-dependent long options.
|
||||
170 gives the standard options room to grow. */
|
||||
#define OPTION_MD_BASE 170
|
||||
|
||||
#ifdef DEBUG
|
||||
#undef NDEBUG
|
||||
#endif
|
||||
@ -335,9 +343,6 @@ COMMON fragS bss_address_frag;
|
||||
|
||||
/* ['x'] TRUE if "-x" seen. */
|
||||
COMMON char flagseen[128];
|
||||
COMMON unsigned char flag_readonly_data_in_text;
|
||||
COMMON unsigned char flag_suppress_warnings;
|
||||
COMMON unsigned char flag_always_generate_output;
|
||||
|
||||
/* name of emitted object file */
|
||||
COMMON char *out_file_name;
|
||||
|
@ -1033,17 +1033,27 @@ tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
|
||||
}
|
||||
|
||||
#endif /* OBJ_AOUT */
|
||||
|
||||
CONST char *md_shortopts = "";
|
||||
struct option md_longopts[] = {
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
}
|
||||
|
||||
/* Default the values of symbols known that should be "predefined". We
|
||||
don't bother to predefine them unless you actually use one, since there
|
||||
are a lot of them. */
|
||||
|
@ -2001,81 +2001,75 @@ md_bignum_to_chars (buf, bignum, nchars)
|
||||
while (--nb);
|
||||
}
|
||||
}
|
||||
|
||||
CONST char *md_shortopts = "Fm:";
|
||||
struct option md_longopts[] = {
|
||||
#define OPTION_32ADDR (OPTION_MD_BASE)
|
||||
{"32addr", no_argument, NULL, OPTION_32ADDR},
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
if (**argP == 'F')
|
||||
switch (c)
|
||||
{
|
||||
case 'F':
|
||||
nofloats = 1;
|
||||
return 1;
|
||||
}
|
||||
#if 0 /* I have no idea if this stuff would work any more. And it's
|
||||
probably not right for ECOFF anyways. */
|
||||
/* Use base-register addressing, e.g. PIC code */
|
||||
if (**argP == 'B')
|
||||
{
|
||||
if (first_32bit_quadrant)
|
||||
{
|
||||
first_32bit_quadrant = 0;
|
||||
base_register = GP;
|
||||
}
|
||||
else
|
||||
{
|
||||
first_32bit_quadrant = 1;
|
||||
base_register = ZERO;
|
||||
}
|
||||
if (argP[0][1] == 'k')
|
||||
no_mixed_code = 1;
|
||||
argP[0][1] = 0;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
if (!strcmp (*argP, "32addr"))
|
||||
{
|
||||
break;
|
||||
|
||||
case OPTION_32ADDR:
|
||||
addr32 = 1;
|
||||
*argP += 6;
|
||||
return 1;
|
||||
}
|
||||
if (!strcmp (*argP, "nocpp"))
|
||||
{
|
||||
*argP += 5;
|
||||
return 1;
|
||||
}
|
||||
if (**argP == 'm')
|
||||
{
|
||||
unsigned long mach;
|
||||
break;
|
||||
|
||||
(*argP)++;
|
||||
if (!strcmp (*argP, "21064"))
|
||||
mach = 21064;
|
||||
else if (!strcmp (*argP, "21066"))
|
||||
mach = 21066;
|
||||
else if (!strcmp (*argP, "21164"))
|
||||
mach = 21164;
|
||||
else
|
||||
{
|
||||
mach = 0;
|
||||
(*argP)--;
|
||||
return 0;
|
||||
}
|
||||
(*argP) += 5;
|
||||
case 'm':
|
||||
{
|
||||
unsigned long mach;
|
||||
|
||||
if (machine != 0 && machine != mach)
|
||||
{
|
||||
as_warn ("machine type %lu already chosen, overriding with %lu",
|
||||
machine, mach);
|
||||
}
|
||||
machine = mach;
|
||||
if (!strcmp (arg, "21064"))
|
||||
mach = 21064;
|
||||
else if (!strcmp (arg, "21066"))
|
||||
mach = 21066;
|
||||
else if (!strcmp (arg, "21164"))
|
||||
mach = 21164;
|
||||
else
|
||||
{
|
||||
as_bad ("invalid architecture %s", arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
if (machine != 0 && machine != mach)
|
||||
{
|
||||
as_warn ("machine type %lu already chosen, overriding with %lu",
|
||||
machine, mach);
|
||||
}
|
||||
machine = mach;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
fprintf(stream, "\
|
||||
Alpha options:\n\
|
||||
-32addr treat addresses as 32-bit values\n\
|
||||
-F lack floating point instructions support\n\
|
||||
-m21064 | -m21066 | -m21164\n\
|
||||
specify variant of Alpha architecture\n\
|
||||
-nocpp ignored\n");
|
||||
}
|
||||
|
||||
static void
|
||||
s_proc (is_static)
|
||||
{
|
||||
|
@ -1227,17 +1227,27 @@ md_atof (type, litP, sizeP)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
CONST char *md_shortopts = "";
|
||||
struct option md_longopts[] = {
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
}
|
||||
|
||||
int md_short_jump_size;
|
||||
|
||||
void
|
||||
|
@ -1285,7 +1285,6 @@ md_begin ()
|
||||
if (flagseen['R'])
|
||||
{
|
||||
as_warn ("-R option not supported on this target.");
|
||||
flag_readonly_data_in_text = 0;
|
||||
flagseen['R'] = 0;
|
||||
}
|
||||
|
||||
@ -2788,17 +2787,27 @@ md_estimate_size_before_relax (fragP, segment)
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
CONST char *md_shortopts = "";
|
||||
struct option md_longopts[] = {
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
/* Parse machine dependent options. There are none on the PA. */
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
}
|
||||
|
||||
/* We have no need to default values of symbols. */
|
||||
|
||||
symbolS *
|
||||
|
@ -104,7 +104,7 @@ const char comment_chars[] = "#";
|
||||
first line of the input file. This is because the compiler outputs
|
||||
#NO_APP at the beginning of its output. */
|
||||
/* Also note that comments started like this one will always work if
|
||||
'/' isn't otherwise defined. */
|
||||
'/' isn't otherwise defined. */
|
||||
#if defined (TE_I386AIX) || defined (OBJ_ELF)
|
||||
const char line_comment_chars[] = "";
|
||||
#else
|
||||
@ -284,9 +284,17 @@ static int
|
||||
smallest_imm_type (num)
|
||||
long num;
|
||||
{
|
||||
return ((num == 1)
|
||||
? (Imm1 | Imm8 | Imm8S | Imm16 | Imm32)
|
||||
: fits_in_signed_byte (num)
|
||||
#if 0
|
||||
/* This code is disabled because all the Imm1 forms in the opcode table
|
||||
are slower on the i486, and they're the versions with the implicitly
|
||||
specified single-position displacement, which has another syntax if
|
||||
you really want to use that form. If you really prefer to have the
|
||||
one-byte-shorter Imm1 form despite these problems, re-enable this
|
||||
code. */
|
||||
if (num == 1)
|
||||
return Imm1 | Imm8 | Imm8S | Imm16 | Imm32;
|
||||
#endif
|
||||
return (fits_in_signed_byte (num)
|
||||
? (Imm8S | Imm8 | Imm16 | Imm32)
|
||||
: fits_in_unsigned_byte (num)
|
||||
? (Imm8 | Imm16 | Imm32)
|
||||
@ -311,9 +319,6 @@ const pseudo_typeS md_pseudo_table[] =
|
||||
{"value", cons, 2},
|
||||
{"noopt", s_ignore, 0},
|
||||
{"optim", s_ignore, 0},
|
||||
#ifdef OBJ_ELF
|
||||
{"zero", s_space, 0},
|
||||
#endif
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
@ -324,11 +329,11 @@ extern char *input_line_pointer;
|
||||
struct obstack o;
|
||||
|
||||
/* hash table for opcode lookup */
|
||||
static struct hash_control *op_hash = (struct hash_control *) 0;
|
||||
static struct hash_control *op_hash;
|
||||
/* hash table for register lookup */
|
||||
static struct hash_control *reg_hash = (struct hash_control *) 0;
|
||||
static struct hash_control *reg_hash;
|
||||
/* hash table for prefix lookup */
|
||||
static struct hash_control *prefix_hash = (struct hash_control *) 0;
|
||||
static struct hash_control *prefix_hash;
|
||||
|
||||
|
||||
void
|
||||
@ -339,7 +344,7 @@ md_begin ()
|
||||
obstack_begin (&o, 4096);
|
||||
|
||||
/* initialize op_hash hash table */
|
||||
op_hash = hash_new (); /* xmalloc handles error */
|
||||
op_hash = hash_new ();
|
||||
|
||||
{
|
||||
register const template *optab;
|
||||
@ -460,11 +465,6 @@ md_begin ()
|
||||
record_alignment (bss_section, 2);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
md_end ()
|
||||
{
|
||||
} /* not much to do here. */
|
||||
|
||||
|
||||
#ifdef DEBUG386
|
||||
@ -679,7 +679,7 @@ md_assemble (line)
|
||||
We assume that the scrubber has arranged it so that line[0] is the valid
|
||||
start of a (possibly prefixed) opcode. */
|
||||
{
|
||||
register char *l = line; /* Fast place to put LINE. */
|
||||
char *l = line;
|
||||
|
||||
/* 1 if operand is pending after ','. */
|
||||
unsigned int expecting_operand = 0;
|
||||
@ -702,9 +702,10 @@ md_assemble (line)
|
||||
l++;
|
||||
}
|
||||
else
|
||||
{ /* this opcode's got a prefix */
|
||||
register unsigned int q;
|
||||
register prefix_entry *prefix;
|
||||
{
|
||||
/* This opcode's got a prefix. */
|
||||
unsigned int q;
|
||||
prefix_entry *prefix;
|
||||
|
||||
if (l == token_start)
|
||||
{
|
||||
@ -920,7 +921,6 @@ md_assemble (line)
|
||||
t < current_templates->end;
|
||||
t++)
|
||||
{
|
||||
|
||||
/* must have right number of operands */
|
||||
if (i.operands != t->operands)
|
||||
continue;
|
||||
@ -989,7 +989,7 @@ md_assemble (line)
|
||||
}
|
||||
|
||||
/* Copy the template we found (we may change it!). */
|
||||
memcpy (&i.tm, t, sizeof (template));
|
||||
i.tm = *t;
|
||||
t = &i.tm; /* alter new copy of template */
|
||||
|
||||
/* If there's no opcode suffix we try to invent one based on register
|
||||
@ -1654,9 +1654,7 @@ md_assemble (line)
|
||||
pi (line, &i);
|
||||
}
|
||||
#endif /* DEBUG386 */
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero
|
||||
@ -2266,26 +2264,7 @@ md_number_to_chars (con, value, nbytes)
|
||||
valueT value; /* The value of the bits. */
|
||||
int nbytes; /* Number of bytes in the output. */
|
||||
{
|
||||
register char *p = con;
|
||||
|
||||
switch (nbytes)
|
||||
{
|
||||
case 1:
|
||||
p[0] = value & 0xff;
|
||||
break;
|
||||
case 2:
|
||||
p[0] = value & 0xff;
|
||||
p[1] = (value >> 8) & 0xff;
|
||||
break;
|
||||
case 4:
|
||||
p[0] = value & 0xff;
|
||||
p[1] = (value >> 8) & 0xff;
|
||||
p[2] = (value >> 16) & 0xff;
|
||||
p[3] = (value >> 24) & 0xff;
|
||||
break;
|
||||
default:
|
||||
BAD_CASE (nbytes);
|
||||
}
|
||||
number_to_chars_littleendian (con, value, nbytes);
|
||||
}
|
||||
|
||||
|
||||
@ -2303,7 +2282,7 @@ md_apply_fix_1 (fixP, value)
|
||||
{
|
||||
register char *p = fixP->fx_where + fixP->fx_frag->fr_literal;
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
#if defined (BFD_ASSEMBLER) && !defined (TE_Mach)
|
||||
/*
|
||||
* This is a hack. There should be a better way to
|
||||
* handle this.
|
||||
@ -2311,27 +2290,19 @@ md_apply_fix_1 (fixP, value)
|
||||
if (fixP->fx_r_type == BFD_RELOC_32_PCREL && fixP->fx_addsy)
|
||||
{
|
||||
value += fixP->fx_where + fixP->fx_frag->fr_address;
|
||||
#ifdef OBJ_ELF
|
||||
if (S_GET_SEGMENT (fixP->fx_addsy) != undefined_section)
|
||||
{
|
||||
/* Yes, we add the values in twice. This is because
|
||||
bfd_perform_relocation subtracts them out again. I think
|
||||
bfd_perform_relocation is broken, but I don't dare change
|
||||
it. FIXME. */
|
||||
value += fixP->fx_where + fixP->fx_frag->fr_address;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
switch (fixP->fx_size)
|
||||
{
|
||||
case 1:
|
||||
*p = value;
|
||||
break;
|
||||
case 2:
|
||||
*p++ = value;
|
||||
*p = (value >> 8);
|
||||
break;
|
||||
case 4:
|
||||
*p++ = value;
|
||||
*p++ = (value >> 8);
|
||||
*p++ = (value >> 16);
|
||||
*p = (value >> 24);
|
||||
break;
|
||||
default:
|
||||
BAD_CASE (fixP->fx_size);
|
||||
}
|
||||
md_number_to_chars (p, value, fixP->fx_size);
|
||||
}
|
||||
|
||||
#ifdef BFD_ASSEMBLER
|
||||
@ -2455,8 +2426,27 @@ parse_register (reg_string)
|
||||
*p = '\0';
|
||||
return (reg_entry *) hash_find (reg_hash, reg_name_given);
|
||||
}
|
||||
|
||||
CONST char *md_shortopts = "";
|
||||
struct option md_longopts[] = {
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
}
|
||||
|
||||
/* We have no need to default values of symbols. */
|
||||
|
||||
/* ARGSUSED */
|
||||
|
@ -86,15 +86,19 @@
|
||||
|
||||
#include "opcode/i960.h"
|
||||
|
||||
extern char *strchr ();
|
||||
|
||||
extern char *input_line_pointer;
|
||||
extern struct hash_control *po_hash;
|
||||
extern char *next_object_file_charP;
|
||||
|
||||
#if !defined (BFD_ASSEMBLER) && !defined (BFD)
|
||||
#ifdef OBJ_COFF
|
||||
const int md_reloc_size = sizeof (struct reloc);
|
||||
#else /* OBJ_COFF */
|
||||
const int md_reloc_size = sizeof (struct relocation_info);
|
||||
#endif /* OBJ_COFF */
|
||||
#endif
|
||||
|
||||
/***************************
|
||||
* Local i80960 routines *
|
||||
@ -510,14 +514,13 @@ md_begin ()
|
||||
const struct i960_opcode *oP; /* Pointer into opcode table */
|
||||
const char *retval; /* Value returned by hash functions */
|
||||
|
||||
if (((op_hash = hash_new ()) == 0)
|
||||
|| ((reg_hash = hash_new ()) == 0)
|
||||
|| ((areg_hash = hash_new ()) == 0))
|
||||
as_fatal ("virtual memory exceeded");
|
||||
op_hash = hash_new ();
|
||||
reg_hash = hash_new ();
|
||||
areg_hash = hash_new ();
|
||||
|
||||
/* For some reason, the base assembler uses an empty string for "no
|
||||
error message", instead of a NULL pointer. */
|
||||
retval = "";
|
||||
retval = 0;
|
||||
|
||||
for (oP = i960_opcodes; oP->name && !retval; oP++)
|
||||
retval = hash_insert (op_hash, oP->name, (PTR) oP);
|
||||
@ -534,17 +537,6 @@ md_begin ()
|
||||
as_fatal ("Hashing returned \"%s\".", retval);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* md_end: One-time final cleanup
|
||||
*
|
||||
* None necessary
|
||||
*
|
||||
**************************************************************************** */
|
||||
void
|
||||
md_end ()
|
||||
{
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* md_assemble: Assemble an instruction
|
||||
*
|
||||
@ -684,9 +676,8 @@ md_assemble (textP)
|
||||
{
|
||||
as_warn (bp_error_msg);
|
||||
}
|
||||
/* Output opcode & set up "fixup" (relocation);
|
||||
* flag relocation as 'callj' type.
|
||||
*/
|
||||
/* Output opcode & set up "fixup" (relocation); flag
|
||||
relocation as 'callj' type. */
|
||||
know (oP->num_ops == 1);
|
||||
get_cdisp (args[1], "CTRL", oP->opcode, 24, 0, 1);
|
||||
break;
|
||||
@ -703,26 +694,12 @@ md_assemble (textP)
|
||||
**************************************************************************** */
|
||||
void
|
||||
md_number_to_chars (buf, value, n)
|
||||
char *buf; /* Put output here */
|
||||
valueT value; /* The integer to be converted */
|
||||
int n; /* Number of bytes to output (significant bytes
|
||||
* in 'value')
|
||||
*/
|
||||
char *buf;
|
||||
valueT value;
|
||||
int n;
|
||||
{
|
||||
while (n--)
|
||||
{
|
||||
*buf++ = value;
|
||||
value >>= 8;
|
||||
}
|
||||
|
||||
/* XXX line number probably botched for this warning message. */
|
||||
if (value != 0 && value != -1)
|
||||
{
|
||||
as_bad ("Displacement too long for instruction field length.");
|
||||
}
|
||||
|
||||
return;
|
||||
} /* md_number_to_chars() */
|
||||
number_to_chars_littleendian (buf, value, n);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* md_chars_to_number: convert from target byte order to host byte order.
|
||||
@ -803,10 +780,9 @@ md_atof (type, litP, sizeP)
|
||||
*sizeP = prec * LNUM_SIZE;
|
||||
|
||||
/* Output the LITTLENUMs in REVERSE order in accord with i80960
|
||||
* word-order. (Dunno why atof_ieee doesn't do it in the right
|
||||
* order in the first place -- probably because it's a hack of
|
||||
* atof_m68k.)
|
||||
*/
|
||||
word-order. (Dunno why atof_ieee doesn't do it in the right
|
||||
order in the first place -- probably because it's a hack of
|
||||
atof_m68k.) */
|
||||
|
||||
for (wordP = words + prec - 1; prec--;)
|
||||
{
|
||||
@ -814,7 +790,7 @@ md_atof (type, litP, sizeP)
|
||||
litP += sizeof (LITTLENUM_TYPE);
|
||||
}
|
||||
|
||||
return ""; /* Someone should teach Dean about null pointers */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -899,7 +875,7 @@ md_number_to_field (instrP, val, bfixP)
|
||||
}
|
||||
} /* md_number_to_field() */
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* md_parse_option
|
||||
* Invocation line includes a switch not recognized by the base assembler.
|
||||
@ -938,14 +914,23 @@ md_number_to_field (instrP, val, bfixP)
|
||||
* that is supported by SOME version of the 960 (even if this
|
||||
* means mixing architectures!).
|
||||
*
|
||||
**************************************************************************** */
|
||||
*****************************************************************************/
|
||||
|
||||
CONST char *md_shortopts = "A:b";
|
||||
struct option md_longopts[] = {
|
||||
#define OPTION_LINKRELAX (OPTION_MD_BASE)
|
||||
{"linkrelax", no_argument, NULL, OPTION_LINKRELAX},
|
||||
#define OPTION_NORELAX (OPTION_MD_BASE + 1)
|
||||
{"norelax", no_argument, NULL, OPTION_NORELAX},
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
char *p;
|
||||
struct tabentry
|
||||
{
|
||||
char *flag;
|
||||
@ -962,53 +947,69 @@ md_parse_option (argP, cntP, vecP)
|
||||
{ "CA", ARCH_CA },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
struct tabentry *tp;
|
||||
if (!strcmp (*argP, "linkrelax"))
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case OPTION_LINKRELAX:
|
||||
linkrelax = 1;
|
||||
flagseen['L'] = 1;
|
||||
}
|
||||
else if (!strcmp (*argP, "norelax"))
|
||||
{
|
||||
break;
|
||||
|
||||
case OPTION_NORELAX:
|
||||
norelax = 1;
|
||||
break;
|
||||
|
||||
}
|
||||
else if (**argP == 'b')
|
||||
{
|
||||
case 'b':
|
||||
instrument_branches = 1;
|
||||
break;
|
||||
|
||||
}
|
||||
else if (**argP == 'A')
|
||||
{
|
||||
p = (*argP) + 1;
|
||||
case 'A':
|
||||
{
|
||||
struct tabentry *tp;
|
||||
char *p = arg;
|
||||
|
||||
for (tp = arch_tab; tp->flag != NULL; tp++)
|
||||
{
|
||||
if (!strcmp (p, tp->flag))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (tp = arch_tab; tp->flag != NULL; tp++)
|
||||
{
|
||||
if (!strcmp (p, tp->flag))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (tp->flag == NULL)
|
||||
{
|
||||
as_bad ("unknown architecture: %s", p);
|
||||
}
|
||||
else
|
||||
{
|
||||
architecture = tp->arch;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Unknown option */
|
||||
(*argP)++;
|
||||
if (tp->flag == NULL)
|
||||
{
|
||||
as_bad ("invalid architecture %s", p);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
architecture = tp->arch;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
**argP = '\0'; /* Done parsing this switch */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* md_convert_frag:
|
||||
* Called by base assembler after address relaxation is finished: modify
|
||||
@ -1111,7 +1112,7 @@ md_ri_to_chars (where, ri)
|
||||
| (ri->r_bsr << 4)
|
||||
| (ri->r_disp << 5)
|
||||
| (ri->r_callj << 6));
|
||||
} /* md_ri_to_chars() */
|
||||
}
|
||||
|
||||
#ifndef WORKING_DOT_WORD
|
||||
|
||||
@ -1518,7 +1519,7 @@ get_cdisp (dispP, ifmtP, instr, numbits, var_frag, callj)
|
||||
1,
|
||||
NO_RELOC);
|
||||
|
||||
fixP->fx_callj = callj;
|
||||
fixP->fx_tcbit = callj;
|
||||
|
||||
/* We want to modify a bit field when the address is
|
||||
* known. But we don't need all the garbage in the
|
||||
@ -1677,6 +1678,11 @@ mem_fmt (args, oP, callx)
|
||||
expressionS expr; /* Parsed expression */
|
||||
fixS *fixP; /*->description of deferred address fixup */
|
||||
|
||||
#ifdef OBJ_COFF
|
||||
/* COFF support isn't in place yet for callx relaxing. */
|
||||
callx = 0;
|
||||
#endif
|
||||
|
||||
memset (&instr, '\0', sizeof (memS));
|
||||
instr.opcode = oP->opcode;
|
||||
|
||||
@ -1761,7 +1767,10 @@ mem_fmt (args, oP, callx)
|
||||
0,
|
||||
NO_RELOC);
|
||||
fixP->fx_im_disp = 2; /* 32-bit displacement fix */
|
||||
fixP->fx_bsr = callx; /*SAC LD RELAX HACK *//* Mark reloc as being in i stream */
|
||||
/* Steve's linker relaxing hack. Mark this 32-bit relocation as
|
||||
being in the instruction stream, specifically as part of a callx
|
||||
instruction. */
|
||||
fixP->fx_bsr = callx;
|
||||
break;
|
||||
}
|
||||
} /* memfmt() */
|
||||
@ -2540,7 +2549,7 @@ reloc_callj (fixP)
|
||||
{
|
||||
char *where; /*->the binary for the instruction being relocated */
|
||||
|
||||
if (!fixP->fx_callj)
|
||||
if (!fixP->fx_tcbit)
|
||||
{
|
||||
return;
|
||||
} /* This wasn't a callj instruction in the first place */
|
||||
@ -2580,9 +2589,7 @@ reloc_callj (fixP)
|
||||
} /* switch on proc type */
|
||||
|
||||
/* else Symbol is neither a sysproc nor a leafproc */
|
||||
|
||||
return;
|
||||
} /* reloc_callj() */
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
@ -2644,9 +2651,7 @@ s_leafproc (n_ops, args)
|
||||
|
||||
tc_set_bal_of_call (callP, balP);
|
||||
} /* if only one arg, or the args are the same */
|
||||
|
||||
return;
|
||||
} /* s_leafproc() */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@ -2695,9 +2700,7 @@ s_sysproc (n_ops, args)
|
||||
|
||||
TC_S_SET_SYSPROC (symP, offs (exp)); /* encode entry number */
|
||||
TC_S_FORCE_TO_SYSPROC (symP);
|
||||
|
||||
return;
|
||||
} /* s_sysproc() */
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
@ -2753,7 +2756,7 @@ syntax ()
|
||||
* Return TRUE iff the target architecture supports the specified
|
||||
* special-function register (sfr).
|
||||
*
|
||||
**************************************************************************** */
|
||||
*****************************************************************************/
|
||||
static
|
||||
int
|
||||
targ_has_sfr (n)
|
||||
@ -2777,7 +2780,7 @@ targ_has_sfr (n)
|
||||
* Return TRUE iff the target architecture supports the indicated
|
||||
* class of instructions.
|
||||
*
|
||||
**************************************************************************** */
|
||||
*****************************************************************************/
|
||||
static
|
||||
int
|
||||
targ_has_iclass (ic)
|
||||
@ -2827,7 +2830,7 @@ md_undefined_symbol (name)
|
||||
char *name;
|
||||
{
|
||||
return 0;
|
||||
} /* md_undefined_symbol() */
|
||||
}
|
||||
|
||||
/* Exactly what point is a PC-relative offset relative TO?
|
||||
On the i960, they're relative to the address of the instruction,
|
||||
@ -2847,36 +2850,34 @@ md_apply_fix (fixP, val)
|
||||
char *place = fixP->fx_where + fixP->fx_frag->fr_literal;
|
||||
|
||||
if (!fixP->fx_bit_fixP)
|
||||
{
|
||||
switch (fixP->fx_im_disp)
|
||||
{
|
||||
case 0:
|
||||
/* For callx, we always want to write out zero, and emit a
|
||||
symbolic relocation. */
|
||||
if (fixP->fx_bsr)
|
||||
val = 0;
|
||||
|
||||
switch (fixP->fx_im_disp)
|
||||
{
|
||||
case 0:
|
||||
fixP->fx_addnumber = val;
|
||||
md_number_to_imm (place, val, fixP->fx_size, fixP);
|
||||
break;
|
||||
case 1:
|
||||
md_number_to_disp (place,
|
||||
(fixP->fx_pcrel
|
||||
? val + fixP->fx_pcrel_adjust
|
||||
: val),
|
||||
fixP->fx_size);
|
||||
break;
|
||||
case 2: /* fix requested for .long .word etc */
|
||||
md_number_to_chars (place, val, fixP->fx_size);
|
||||
break;
|
||||
default:
|
||||
as_fatal ("Internal error in md_apply_fix() in file \"%s\"",
|
||||
__FILE__);
|
||||
}
|
||||
}
|
||||
fixP->fx_addnumber = val;
|
||||
md_number_to_imm (place, val, fixP->fx_size, fixP);
|
||||
break;
|
||||
case 1:
|
||||
md_number_to_disp (place,
|
||||
(fixP->fx_pcrel
|
||||
? val + fixP->fx_pcrel_adjust
|
||||
: val),
|
||||
fixP->fx_size);
|
||||
break;
|
||||
case 2: /* fix requested for .long .word etc */
|
||||
md_number_to_chars (place, val, fixP->fx_size);
|
||||
break;
|
||||
default:
|
||||
as_fatal ("Internal error in md_apply_fix() in file \"%s\"",
|
||||
__FILE__);
|
||||
}
|
||||
else
|
||||
{
|
||||
md_number_to_field (place, val, fixP->fx_bit_fixP);
|
||||
}
|
||||
|
||||
return;
|
||||
} /* md_apply_fix() */
|
||||
md_number_to_field (place, val, fixP->fx_bit_fixP);
|
||||
}
|
||||
|
||||
#if defined(OBJ_AOUT) | defined(OBJ_BOUT)
|
||||
void
|
||||
@ -2885,26 +2886,20 @@ tc_bout_fix_to_chars (where, fixP, segment_address_in_file)
|
||||
fixS *fixP;
|
||||
relax_addressT segment_address_in_file;
|
||||
{
|
||||
static unsigned char nbytes_r_length[] =
|
||||
{42, 0, 1, 42, 2};
|
||||
static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
|
||||
struct relocation_info ri;
|
||||
symbolS *symbolP;
|
||||
|
||||
/* JF this is for paranoia */
|
||||
memset ((char *) &ri, '\0', sizeof (ri));
|
||||
symbolP = fixP->fx_addsy;
|
||||
know (symbolP != 0 || fixP->fx_r_type != NO_RELOC);
|
||||
ri.r_bsr = fixP->fx_bsr; /*SAC LD RELAX HACK */
|
||||
/* These two 'cuz of NS32K */
|
||||
ri.r_callj = fixP->fx_callj;
|
||||
ri.r_callj = fixP->fx_tcbit;
|
||||
if (fixP->fx_bit_fixP)
|
||||
{
|
||||
ri.r_length = 2;
|
||||
}
|
||||
ri.r_length = 2;
|
||||
else
|
||||
{
|
||||
ri.r_length = nbytes_r_length[fixP->fx_size];
|
||||
}
|
||||
ri.r_length = nbytes_r_length[fixP->fx_size];
|
||||
ri.r_pcrel = fixP->fx_pcrel;
|
||||
ri.r_address = fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file;
|
||||
|
||||
@ -2929,7 +2924,7 @@ tc_bout_fix_to_chars (where, fixP, segment_address_in_file)
|
||||
}
|
||||
ri.r_extern = 0;
|
||||
}
|
||||
else if (linkrelax || !S_IS_DEFINED (symbolP))
|
||||
else if (linkrelax || !S_IS_DEFINED (symbolP) || fixP->fx_bsr)
|
||||
{
|
||||
ri.r_extern = 1;
|
||||
ri.r_index = symbolP->sy_number;
|
||||
@ -2942,14 +2937,39 @@ tc_bout_fix_to_chars (where, fixP, segment_address_in_file)
|
||||
|
||||
/* Output the relocation information in machine-dependent form. */
|
||||
md_ri_to_chars (where, &ri);
|
||||
|
||||
return;
|
||||
} /* tc_bout_fix_to_chars() */
|
||||
}
|
||||
|
||||
#endif /* OBJ_AOUT or OBJ_BOUT */
|
||||
|
||||
/* Align an address by rounding it up to the specified boundary.
|
||||
*/
|
||||
#if defined (OBJ_COFF) && defined (BFD)
|
||||
short
|
||||
tc_coff_fix2rtype (fixP)
|
||||
fixS *fixP;
|
||||
{
|
||||
if (fixP->fx_bsr)
|
||||
abort ();
|
||||
|
||||
if (fixP->fx_pcrel == 0 && fixP->fx_size == 4)
|
||||
return R_RELLONG;
|
||||
|
||||
if (fixP->fx_pcrel != 0 && fixP->fx_size == 4)
|
||||
return R_IPRMED;
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
int
|
||||
tc_coff_sizemachdep (frag)
|
||||
fragS *frag;
|
||||
{
|
||||
if (frag->fr_next)
|
||||
return frag->fr_next->fr_address - frag->fr_address;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Align an address by rounding it up to the specified boundary. */
|
||||
valueT
|
||||
md_section_align (seg, addr)
|
||||
segT seg;
|
||||
@ -2963,8 +2983,6 @@ void
|
||||
tc_headers_hook (headers)
|
||||
object_headers *headers;
|
||||
{
|
||||
/* FIXME: remove this line *//* unsigned short arch_flag = 0; */
|
||||
|
||||
if (iclasses_seen == I_BASE)
|
||||
{
|
||||
headers->filehdr.f_flags |= F_I960CORE;
|
||||
@ -2996,9 +3014,7 @@ tc_headers_hook (headers)
|
||||
headers->filehdr.f_magic = I960ROMAGIC;
|
||||
headers->aouthdr.magic = NMAGIC;
|
||||
} /* set magic numbers */
|
||||
|
||||
return;
|
||||
} /* tc_headers_hook() */
|
||||
}
|
||||
|
||||
#endif /* OBJ_COFF */
|
||||
|
||||
@ -3062,9 +3078,7 @@ tc_crawl_symbol_chain (headers)
|
||||
} /* externality mismatch */
|
||||
} /* if callname */
|
||||
} /* walk the symbol chain */
|
||||
|
||||
return;
|
||||
} /* tc_crawl_symbol_chain() */
|
||||
}
|
||||
|
||||
/*
|
||||
* For aout or bout, the bal immediately follows the call.
|
||||
@ -3110,9 +3124,7 @@ tc_set_bal_of_call (callP, balP)
|
||||
(as yet unwritten.);
|
||||
#endif /* ! OBJ_ABOUT */
|
||||
#endif /* ! OBJ_COFF */
|
||||
|
||||
return;
|
||||
} /* tc_set_bal_of_call() */
|
||||
}
|
||||
|
||||
char *
|
||||
_tc_get_bal_of_call (callP)
|
||||
@ -3154,9 +3166,7 @@ tc_coff_symbol_emit_hook (symbolP)
|
||||
S_SET_STORAGE_CLASS (balP, C_LABEL);
|
||||
#endif /* OBJ_COFF */
|
||||
} /* only on calls */
|
||||
|
||||
return;
|
||||
} /* tc_coff_symbol_emit_hook() */
|
||||
}
|
||||
|
||||
void
|
||||
i960_handle_align (fragp)
|
||||
@ -3167,17 +3177,68 @@ i960_handle_align (fragp)
|
||||
if (!linkrelax)
|
||||
return;
|
||||
|
||||
#ifndef OBJ_BOUT
|
||||
|
||||
as_bad ("option --link-relax is only supported in b.out format");
|
||||
linkrelax = 0;
|
||||
return;
|
||||
|
||||
#else
|
||||
|
||||
/* The text section "ends" with another alignment reloc, to which we
|
||||
aren't adding padding. */
|
||||
if (fragp->fr_next == text_last_frag
|
||||
|| fragp->fr_next == data_last_frag)
|
||||
{
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
/* alignment directive */
|
||||
fixp = fix_new (fragp, fragp->fr_fix, fragp->fr_offset, 0, 0, 0,
|
||||
(int) fragp->fr_type);
|
||||
#endif /* OBJ_BOUT */
|
||||
}
|
||||
|
||||
int
|
||||
i960_validate_fix (fixP, this_segment_type, add_symbolPP)
|
||||
fixS *fixP;
|
||||
segT this_segment_type;
|
||||
symbolS **add_symbolPP;
|
||||
{
|
||||
#define add_symbolP (*add_symbolPP)
|
||||
if (fixP->fx_tcbit && TC_S_IS_CALLNAME (add_symbolP))
|
||||
{
|
||||
/* Relocation should be done via the associated 'bal'
|
||||
entry point symbol. */
|
||||
|
||||
if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
|
||||
{
|
||||
as_bad ("No 'bal' entry point for leafproc %s",
|
||||
S_GET_NAME (add_symbolP));
|
||||
return 1;
|
||||
}
|
||||
fixP->fx_addsy = add_symbolP = tc_get_bal_of_call (add_symbolP);
|
||||
}
|
||||
#if 0
|
||||
/* Still have to work out other conditions for these tests. */
|
||||
{
|
||||
if (fixP->fx_tcbit)
|
||||
{
|
||||
as_bad ("callj to difference of two symbols");
|
||||
return 1;
|
||||
}
|
||||
reloc_callj (fixP);
|
||||
if ((int) fixP->fx_bit_fixP == 13)
|
||||
{
|
||||
/* This is a COBR instruction. They have only a 13-bit
|
||||
displacement and are only to be used for local branches:
|
||||
flag as error, don't generate relocation. */
|
||||
as_bad ("can't use COBR format with external label");
|
||||
fixP->fx_addsy = NULL; /* No relocations please. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#undef add_symbolP
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* end of tc-i960.c */
|
||||
|
@ -4925,6 +4925,7 @@ s_proc (ignore)
|
||||
|
||||
/* s_space is defined in read.c .skip is simply an alias to it. */
|
||||
|
||||
|
||||
/*
|
||||
* md_parse_option
|
||||
* Invocation line includes a switch not recognized by the base assembler.
|
||||
@ -4956,27 +4957,23 @@ s_proc (ignore)
|
||||
#define MAYBE_FLOAT_TOO /* m68881 */ 0 /* this is handled later */
|
||||
#endif
|
||||
|
||||
int
|
||||
m68k_parse_long_option (opt)
|
||||
char *opt;
|
||||
{
|
||||
/* Skip over double-dash. */
|
||||
opt += 2;
|
||||
if (!strcmp (opt, "register-prefix-optional"))
|
||||
{
|
||||
flag_reg_prefix_optional = 1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
CONST char *md_shortopts = "lSA:m:k";
|
||||
struct option md_longopts[] = {
|
||||
#define OPTION_PIC (OPTION_MD_BASE)
|
||||
{"pic", no_argument, NULL, OPTION_PIC},
|
||||
#define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
|
||||
{"register-prefix-optional", no_argument, NULL,
|
||||
OPTION_REGISTER_PREFIX_OPTIONAL},
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
switch (**argP)
|
||||
switch (c)
|
||||
{
|
||||
case 'l': /* -l means keep external to 2 bit offset
|
||||
rather than 16 bit one */
|
||||
@ -4987,48 +4984,45 @@ md_parse_option (argP, cntP, vecP)
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
(*argP)++;
|
||||
if (*arg == 'm')
|
||||
arg++;
|
||||
/* intentional fall-through */
|
||||
case 'm':
|
||||
(*argP)++;
|
||||
if (*arg == 'c')
|
||||
arg++;
|
||||
|
||||
if (**argP == 'c')
|
||||
{
|
||||
(*argP)++;
|
||||
} /* allow an optional "c" */
|
||||
|
||||
if (!strcmp (*argP, "68000")
|
||||
|| !strcmp (*argP, "68008")
|
||||
|| !strcmp (*argP, "68302"))
|
||||
if (!strcmp (arg, "68000")
|
||||
|| !strcmp (arg, "68008")
|
||||
|| !strcmp (arg, "68302"))
|
||||
{
|
||||
current_architecture |= m68000;
|
||||
}
|
||||
else if (!strcmp (*argP, "68010"))
|
||||
else if (!strcmp (arg, "68010"))
|
||||
{
|
||||
current_architecture |= m68010;
|
||||
}
|
||||
else if (!strcmp (*argP, "68020"))
|
||||
else if (!strcmp (arg, "68020"))
|
||||
{
|
||||
current_architecture |= m68020 | MAYBE_FLOAT_TOO;
|
||||
}
|
||||
else if (!strcmp (*argP, "68030"))
|
||||
else if (!strcmp (arg, "68030"))
|
||||
{
|
||||
current_architecture |= m68030 | MAYBE_FLOAT_TOO;
|
||||
}
|
||||
else if (!strcmp (*argP, "68040"))
|
||||
else if (!strcmp (arg, "68040"))
|
||||
{
|
||||
current_architecture |= m68040 | MAYBE_FLOAT_TOO;
|
||||
}
|
||||
else if (!strcmp (*argP, "68060"))
|
||||
else if (!strcmp (arg, "68060"))
|
||||
{
|
||||
current_architecture |= m68060 | MAYBE_FLOAT_TOO;
|
||||
}
|
||||
#ifndef NO_68881
|
||||
else if (!strcmp (*argP, "68881"))
|
||||
else if (!strcmp (arg, "68881"))
|
||||
{
|
||||
current_architecture |= m68881;
|
||||
}
|
||||
else if (!strcmp (*argP, "68882"))
|
||||
else if (!strcmp (arg, "68882"))
|
||||
{
|
||||
current_architecture |= m68882;
|
||||
}
|
||||
@ -5036,63 +5030,74 @@ md_parse_option (argP, cntP, vecP)
|
||||
/* Even if we aren't configured to support the processor,
|
||||
it should still be possible to assert that the user
|
||||
doesn't have it... */
|
||||
else if (!strcmp (*argP, "no-68881")
|
||||
|| !strcmp (*argP, "no-68882"))
|
||||
else if (!strcmp (arg, "no-68881")
|
||||
|| !strcmp (arg, "no-68882"))
|
||||
{
|
||||
no_68881 = 1;
|
||||
}
|
||||
#ifndef NO_68851
|
||||
else if (!strcmp (*argP, "68851"))
|
||||
else if (!strcmp (arg, "68851"))
|
||||
{
|
||||
current_architecture |= m68851;
|
||||
}
|
||||
#endif /* NO_68851 */
|
||||
else if (!strcmp (*argP, "no-68851"))
|
||||
else if (!strcmp (arg, "no-68851"))
|
||||
{
|
||||
no_68851 = 1;
|
||||
}
|
||||
else if (!strcmp (*argP, "pu32") /* "cpu32" minus 'c' */
|
||||
|| !strcmp (*argP, "68331")
|
||||
|| !strcmp (*argP, "68332")
|
||||
|| !strcmp (*argP, "68333")
|
||||
|| !strcmp (*argP, "68340"))
|
||||
else if (!strcmp (arg, "pu32") /* "cpu32" minus 'c' */
|
||||
|| !strcmp (arg, "68331")
|
||||
|| !strcmp (arg, "68332")
|
||||
|| !strcmp (arg, "68333")
|
||||
|| !strcmp (arg, "68340"))
|
||||
{
|
||||
current_architecture |= cpu32;
|
||||
}
|
||||
else
|
||||
{
|
||||
as_warn ("Unknown architecture, \"%s\". option ignored", *argP);
|
||||
} /* switch on architecture */
|
||||
|
||||
while (**argP)
|
||||
(*argP)++;
|
||||
|
||||
as_bad ("invalid architecture %s", arg);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
if (!strcmp (*argP, "pic"))
|
||||
{
|
||||
*argP += 3;
|
||||
flag_want_pic = 1;
|
||||
break; /* -pic, Position Independent Code */
|
||||
}
|
||||
else
|
||||
goto bad_arg;
|
||||
|
||||
#ifdef TE_SUN3
|
||||
case OPTION_PIC:
|
||||
case 'k':
|
||||
flag_want_pic = 1;
|
||||
break; /* -pic, Position Independent Code */
|
||||
|
||||
case OPTION_REGISTER_PREFIX_OPTIONAL:
|
||||
flag_reg_prefix_optional = 1;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
bad_arg:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
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 generate position independent code\n\
|
||||
-S turn jbsr into jsr\n\
|
||||
--register-prefix-optional\n\
|
||||
recognize register names without prefix character\n");
|
||||
}
|
||||
|
||||
#ifdef TEST2
|
||||
|
||||
/* TEST2: Test md_assemble() */
|
||||
|
@ -208,16 +208,27 @@ md_begin ()
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
CONST char *md_shortopts = "";
|
||||
struct option md_longopts[] = {
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
md_assemble (op)
|
||||
char *op;
|
||||
|
@ -4845,42 +4845,83 @@ md_number_to_chars (buf, val, n)
|
||||
internalError ();
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef GPOPT
|
||||
CONST char *md_shortopts = "E:O::g::G:";
|
||||
#else
|
||||
CONST char *md_shortopts = "E:O::g::";
|
||||
#endif
|
||||
struct option md_longopts[] = {
|
||||
#define OPTION_MIPS1 (OPTION_MD_BASE + 1)
|
||||
{"mips0", no_argument, NULL, OPTION_MIPS1},
|
||||
{"mips1", no_argument, NULL, OPTION_MIPS1},
|
||||
#define OPTION_MIPS2 (OPTION_MD_BASE + 2)
|
||||
{"mips2", no_argument, NULL, OPTION_MIPS2},
|
||||
#define OPTION_MIPS3 (OPTION_MD_BASE + 3)
|
||||
{"mips3", no_argument, NULL, OPTION_MIPS3},
|
||||
#define OPTION_MCPU (OPTION_MD_BASE + 4)
|
||||
{"mcpu", required_argument, NULL, OPTION_MCPU},
|
||||
#define OPTION_MEMBEDDED_PIC (OPTION_MD_BASE + 5)
|
||||
{"membedded-pic", no_argument, NULL, OPTION_MEMBEDDED_PIC},
|
||||
#define OPTION_TRAP (OPTION_MD_BASE + 8)
|
||||
{"trap", no_argument, NULL, OPTION_TRAP},
|
||||
{"no-break", no_argument, NULL, OPTION_TRAP},
|
||||
#define OPTION_BREAK (OPTION_MD_BASE + 9)
|
||||
{"break", no_argument, NULL, OPTION_BREAK},
|
||||
{"no-trap", no_argument, NULL, OPTION_BREAK},
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
#define OPTION_CALL_SHARED (OPTION_MD_BASE + 6)
|
||||
{"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
|
||||
{"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
|
||||
#define OPTION_NON_SHARED (OPTION_MD_BASE + 7)
|
||||
{"non_shared", no_argument, NULL, OPTION_NON_SHARED},
|
||||
#endif
|
||||
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
/* Accept -nocpp but ignore it. */
|
||||
if (strcmp (*argP, "nocpp") == 0)
|
||||
switch (c)
|
||||
{
|
||||
*argP += 5;
|
||||
return 1;
|
||||
}
|
||||
case OPTION_TRAP:
|
||||
mips_trap = 1;
|
||||
break;
|
||||
|
||||
if (strcmp (*argP, "EL") == 0
|
||||
|| strcmp (*argP, "EB") == 0)
|
||||
{
|
||||
if ((*argP)[1] == 'B')
|
||||
case OPTION_BREAK:
|
||||
mips_trap = 0;
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
if (arg[1] == 'B')
|
||||
byte_order = BIG_ENDIAN;
|
||||
else
|
||||
else if (arg[1] == 'L')
|
||||
byte_order = LITTLE_ENDIAN;
|
||||
else
|
||||
{
|
||||
as_bad("invalid endianness -E%c", arg[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef OBJ_AOUT
|
||||
if ((*argP)[1] == 'B')
|
||||
if (arg[1] == 'B')
|
||||
mips_target_format = "a.out-mips-big";
|
||||
else
|
||||
mips_target_format = "a.out-mips-little";
|
||||
#endif
|
||||
#ifdef OBJ_ECOFF
|
||||
if ((*argP)[1] == 'B')
|
||||
if (arg[1] == 'B')
|
||||
mips_target_format = "ecoff-bigmips";
|
||||
else
|
||||
mips_target_format = "ecoff-littlemips";
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
if ((*argP)[1] == 'B')
|
||||
if (arg[1] == 'B')
|
||||
mips_target_format = "elf32-bigmips";
|
||||
else
|
||||
mips_target_format = "elf32-littlemips";
|
||||
@ -4888,179 +4929,165 @@ md_parse_option (argP, cntP, vecP)
|
||||
|
||||
/* FIXME: This breaks -L -EL. */
|
||||
flagseen['L'] = 0;
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
if (**argP == 'O')
|
||||
{
|
||||
if ((*argP)[1] == '0')
|
||||
case 'O':
|
||||
if (arg && arg[1] == '0')
|
||||
mips_optimize = 1;
|
||||
else
|
||||
mips_optimize = 2;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
if (**argP == 'g')
|
||||
{
|
||||
if ((*argP)[1] == '\0' || (*argP)[1] == '2')
|
||||
case 'g':
|
||||
if (arg == NULL || arg[1] == '2')
|
||||
mips_optimize = 0;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
if (strncmp (*argP, "mips", 4) == 0)
|
||||
{
|
||||
mips_isa = atol (*argP + 4);
|
||||
if (mips_isa == 0)
|
||||
mips_isa = 1;
|
||||
else if (mips_isa < 1 || mips_isa > 3)
|
||||
{
|
||||
as_bad ("-mips%d not supported", mips_isa);
|
||||
mips_isa = 1;
|
||||
}
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
case OPTION_MIPS1:
|
||||
mips_isa = 1;
|
||||
break;
|
||||
|
||||
if (strncmp (*argP, "mcpu=", 5) == 0)
|
||||
{
|
||||
char *p;
|
||||
case OPTION_MIPS2:
|
||||
mips_isa = 2;
|
||||
break;
|
||||
|
||||
/* Identify the processor type */
|
||||
p = *argP + 5;
|
||||
if (strcmp (p, "default") == 0
|
||||
|| strcmp (p, "DEFAULT") == 0)
|
||||
mips_isa = -1;
|
||||
else
|
||||
{
|
||||
if (*p == 'r' || *p == 'R')
|
||||
p++;
|
||||
case OPTION_MIPS3:
|
||||
mips_isa = 3;
|
||||
break;
|
||||
|
||||
case OPTION_MCPU:
|
||||
{
|
||||
char *p;
|
||||
|
||||
/* Identify the processor type */
|
||||
p = arg;
|
||||
if (strcmp (p, "default") == 0
|
||||
|| strcmp (p, "DEFAULT") == 0)
|
||||
mips_isa = -1;
|
||||
switch (*p)
|
||||
{
|
||||
case '2':
|
||||
if (strcmp (p, "2000") == 0
|
||||
|| strcmp (p, "2k") == 0
|
||||
|| strcmp (p, "2K") == 0)
|
||||
mips_isa = 1;
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (*p == 'r' || *p == 'R')
|
||||
p++;
|
||||
|
||||
case '3':
|
||||
if (strcmp (p, "3000") == 0
|
||||
|| strcmp (p, "3k") == 0
|
||||
|| strcmp (p, "3K") == 0)
|
||||
mips_isa = 1;
|
||||
break;
|
||||
mips_isa = -1;
|
||||
switch (*p)
|
||||
{
|
||||
case '2':
|
||||
if (strcmp (p, "2000") == 0
|
||||
|| strcmp (p, "2k") == 0
|
||||
|| strcmp (p, "2K") == 0)
|
||||
mips_isa = 1;
|
||||
break;
|
||||
|
||||
case '4':
|
||||
if (strcmp (p, "4000") == 0
|
||||
|| strcmp (p, "4k") == 0
|
||||
|| strcmp (p, "4K") == 0)
|
||||
mips_isa = 3;
|
||||
break;
|
||||
case '3':
|
||||
if (strcmp (p, "3000") == 0
|
||||
|| strcmp (p, "3k") == 0
|
||||
|| strcmp (p, "3K") == 0)
|
||||
mips_isa = 1;
|
||||
break;
|
||||
|
||||
case '6':
|
||||
if (strcmp (p, "6000") == 0
|
||||
|| strcmp (p, "6k") == 0
|
||||
|| strcmp (p, "6K") == 0)
|
||||
mips_isa = 2;
|
||||
break;
|
||||
}
|
||||
case '4':
|
||||
if (strcmp (p, "4000") == 0
|
||||
|| strcmp (p, "4k") == 0
|
||||
|| strcmp (p, "4K") == 0)
|
||||
mips_isa = 3;
|
||||
break;
|
||||
|
||||
if (mips_isa == -1)
|
||||
{
|
||||
as_bad ("bad value (%s) for -mcpu= switch", *argP + 5);
|
||||
mips_isa = 1;
|
||||
}
|
||||
}
|
||||
case '6':
|
||||
if (strcmp (p, "6000") == 0
|
||||
|| strcmp (p, "6k") == 0
|
||||
|| strcmp (p, "6K") == 0)
|
||||
mips_isa = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
if (mips_isa == -1)
|
||||
{
|
||||
as_bad ("invalid architecture -mcpu=%s", arg);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* Argument -membedded-pic means to use EMBEDDED_PIC. */
|
||||
if (strcmp (*argP, "membedded-pic") == 0)
|
||||
{
|
||||
case OPTION_MEMBEDDED_PIC:
|
||||
mips_pic = EMBEDDED_PIC;
|
||||
#ifdef GPOPT
|
||||
if (g_switch_seen)
|
||||
as_warn ("-G may not be used with embedded PIC code");
|
||||
{
|
||||
as_bad ("-G may not be used with embedded PIC code");
|
||||
return 0;
|
||||
}
|
||||
g_switch_value = 0x7fffffff;
|
||||
#endif
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
/* When generating ELF code, we permit -KPIC and -call_shared to
|
||||
select SVR4_PIC, and -non_shared to select no PIC. This is
|
||||
intended to be compatible with Irix 5. */
|
||||
if (strcmp (*argP, "KPIC") == 0
|
||||
|| strcmp (*argP, "call_shared") == 0)
|
||||
{
|
||||
case OPTION_CALL_SHARED:
|
||||
mips_pic = SVR4_PIC;
|
||||
if (g_switch_seen && g_switch_value != 0)
|
||||
as_warn ("-G may not be used with SVR4 PIC code");
|
||||
{
|
||||
as_bad ("-G may not be used with SVR4 PIC code");
|
||||
return 0;
|
||||
}
|
||||
g_switch_value = 0;
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
else if (strcmp (*argP, "non_shared") == 0)
|
||||
{
|
||||
break;
|
||||
|
||||
case OPTION_NON_SHARED:
|
||||
mips_pic = NO_PIC;
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
#endif /* OBJ_ELF */
|
||||
|
||||
#ifdef GPOPT
|
||||
if (**argP == 'G')
|
||||
{
|
||||
case 'G':
|
||||
if (mips_pic == SVR4_PIC || mips_pic == EMBEDDED_PIC)
|
||||
as_warn ("-G may not be used with SVR4 or embedded PIC code");
|
||||
else if ((*argP)[1] != '\0')
|
||||
g_switch_value = atoi (*argP + 1);
|
||||
else if (*cntP)
|
||||
{
|
||||
**vecP = (char *) NULL;
|
||||
(*cntP)--;
|
||||
(*vecP)++;
|
||||
g_switch_value = atoi (**vecP);
|
||||
as_bad ("-G may not be used with SVR4 or embedded PIC code");
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
as_warn ("Number expected after -G");
|
||||
g_switch_value = atoi (arg);
|
||||
g_switch_seen = 1;
|
||||
*argP = "";
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
return 1; /* pretend you parsed the character */
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Handle a long option name. */
|
||||
|
||||
int
|
||||
mips_parse_long_option (arg)
|
||||
const char *arg;
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
if (strcmp (arg, "--trap") == 0
|
||||
|| strcmp (arg, "--no-break") == 0)
|
||||
{
|
||||
mips_trap = 1;
|
||||
return 1;
|
||||
}
|
||||
else if (strcmp (arg, "--no-trap") == 0
|
||||
|| strcmp (arg, "--break") == 0)
|
||||
{
|
||||
mips_trap = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
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, "\
|
||||
-KPIC, -call_shared generate SVR4 position independent code\n\
|
||||
-non_shared do not generate position independent code\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
long
|
||||
md_pcrel_from (fixP)
|
||||
fixS *fixP;
|
||||
|
@ -2191,7 +2191,7 @@ print_insn (insn)
|
||||
fprintf (stderr, "}\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* md_parse_option
|
||||
* Invocation line includes a switch not recognized by the base assembler.
|
||||
@ -2228,74 +2228,105 @@ print_insn (insn)
|
||||
* end-sanitize-v9
|
||||
*/
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
{
|
||||
char *p;
|
||||
const char **arch;
|
||||
|
||||
if (!strcmp (*argP, "bump"))
|
||||
{
|
||||
warn_on_bump = 1;
|
||||
}
|
||||
else if (**argP == 'A')
|
||||
{
|
||||
p = (*argP) + 1;
|
||||
|
||||
for (arch = architecture_pname; *arch != NULL; ++arch)
|
||||
{
|
||||
if (strcmp (p, *arch) == 0)
|
||||
{
|
||||
break;
|
||||
} /* found a match */
|
||||
} /* walk the pname table */
|
||||
|
||||
if (*arch == NULL)
|
||||
{
|
||||
as_bad ("unknown architecture: %s", p);
|
||||
}
|
||||
else
|
||||
{
|
||||
current_architecture = (enum sparc_architecture) (arch - architecture_pname);
|
||||
architecture_requested = 1;
|
||||
}
|
||||
}
|
||||
#ifdef OBJ_ELF
|
||||
else if (**argP == 'V')
|
||||
CONST char *md_shortopts = "A:VQ:sq";
|
||||
#else
|
||||
CONST char *md_shortopts = "A:";
|
||||
#endif
|
||||
struct option md_longopts[] = {
|
||||
#define OPTION_BUMP (OPTION_MD_BASE)
|
||||
{"bump", no_argument, NULL, OPTION_BUMP},
|
||||
#define OPTION_SPARC (OPTION_MD_BASE + 1)
|
||||
{"sparc", no_argument, NULL, OPTION_SPARC},
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
int
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case OPTION_BUMP:
|
||||
warn_on_bump = 1;
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
{
|
||||
char *p = arg;
|
||||
const char **arch;
|
||||
|
||||
for (arch = architecture_pname; *arch != NULL; ++arch)
|
||||
{
|
||||
if (strcmp (p, *arch) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (*arch == NULL)
|
||||
{
|
||||
as_bad ("invalid architecture -A%s", p);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_architecture = (enum sparc_architecture)
|
||||
(arch - architecture_pname);
|
||||
architecture_requested = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case OPTION_SPARC:
|
||||
/* Ignore -sparc, used by SunOS make default .s.o rule. */
|
||||
break;
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
case 'V':
|
||||
print_version_id ();
|
||||
}
|
||||
else if (**argP == 'Q')
|
||||
{
|
||||
break;
|
||||
|
||||
case 'Q':
|
||||
/* Qy - do emit .comment
|
||||
Qn - do not emit .comment */
|
||||
}
|
||||
else if (**argP == 's')
|
||||
{
|
||||
break;
|
||||
|
||||
case 's':
|
||||
/* use .stab instead of .stab.excl */
|
||||
}
|
||||
else if (**argP == 'q')
|
||||
{
|
||||
break;
|
||||
|
||||
case 'q':
|
||||
/* quick -- native assembler does fewer checks */
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
else if (strcmp (*argP, "sparc") == 0)
|
||||
{
|
||||
/* Ignore -sparc, used by SunOS make default .s.o rule. */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Unknown option */
|
||||
(*argP)++;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
**argP = '\0'; /* Done parsing this switch */
|
||||
return 1;
|
||||
} /* md_parse_option() */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
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, "\
|
||||
-V print assembler version number\n\
|
||||
-q ignored\n\
|
||||
-Qy, -Qn ignored\n\
|
||||
-s ignored\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* We have no need to default values of symbols. */
|
||||
|
||||
/* ARGSUSED */
|
||||
|
@ -371,59 +371,37 @@ md_begin ()
|
||||
as_fatal (errorval);
|
||||
}
|
||||
|
||||
int
|
||||
md_parse_option (argP, cntP, vecP)
|
||||
char **argP;
|
||||
int *cntP;
|
||||
char ***vecP;
|
||||
{
|
||||
char *temp_name; /* name for -t or -d options */
|
||||
char opt;
|
||||
CONST char *md_shortopts = "ad:STt:V";
|
||||
struct option md_longopts[] = {
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
size_t md_longopts_size = sizeof(md_longopts);
|
||||
|
||||
switch (**argP)
|
||||
int
|
||||
md_parse_option (c, arg)
|
||||
int c;
|
||||
char *arg;
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case 'a':
|
||||
as_warn ("The -a option doesn't exits. (Dispite what the man page says!");
|
||||
as_warn ("The -a option doesn't exist. (Despite what the man page says!");
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
as_warn ("JUMPIFY (-J) not implemented, use psuedo ops instead.");
|
||||
case 'd':
|
||||
as_warn ("Displacement length %s ignored!", arg);
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
as_warn ("SYMBOL TABLE not implemented");
|
||||
break; /* SYMBOL TABLE not implemented */
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
as_warn ("TOKEN TRACE not implemented");
|
||||
break; /* TOKEN TRACE not implemented */
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
case 't':
|
||||
opt = **argP;
|
||||
if (**argP)
|
||||
{ /* Rest of argument is filename. */
|
||||
temp_name = *argP;
|
||||
while (**argP)
|
||||
(*argP)++;
|
||||
}
|
||||
else if (*cntP)
|
||||
{
|
||||
while (**argP)
|
||||
(*argP)++;
|
||||
--(*cntP);
|
||||
temp_name = *++(*vecP);
|
||||
**vecP = NULL; /* Remember this is not a file-name. */
|
||||
}
|
||||
else
|
||||
{
|
||||
as_warn ("I expected a filename after -%c.", opt);
|
||||
temp_name = "{absent}";
|
||||
}
|
||||
|
||||
if (opt == 'd')
|
||||
as_warn ("Displacement length %s ignored!", temp_name);
|
||||
else
|
||||
as_warn ("I don't need or use temp. file \"%s\".", temp_name);
|
||||
as_warn ("I don't need or use temp. file \"%s\".", arg);
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
@ -432,10 +410,25 @@ md_parse_option (argP, cntP, vecP)
|
||||
|
||||
default:
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
md_show_usage (stream)
|
||||
FILE *stream;
|
||||
{
|
||||
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");
|
||||
}
|
||||
|
||||
/* The functions in this section take numbers in the machine format, and
|
||||
munges them into Tahoe byte order.
|
||||
|
File diff suppressed because it is too large
Load Diff
386
gas/messages.c
386
gas/messages.c
@ -17,7 +17,7 @@
|
||||
along with GAS; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h> /* define stderr */
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "as.h"
|
||||
@ -38,6 +38,10 @@
|
||||
|
||||
extern char *strerror ();
|
||||
|
||||
static void as_show_where PARAMS ((void));
|
||||
static void as_warn_internal PARAMS ((char *, unsigned int, char *));
|
||||
static void as_bad_internal PARAMS ((char *, unsigned int, char *));
|
||||
|
||||
/*
|
||||
* Despite the rest of the comments in this file, (FIXME-SOON),
|
||||
* here is the current scheme for error messages etc:
|
||||
@ -76,29 +80,23 @@ extern char *strerror ();
|
||||
* continues as though no error occurred.
|
||||
*/
|
||||
|
||||
/*
|
||||
ERRORS
|
||||
static void
|
||||
identify (file)
|
||||
char *file;
|
||||
{
|
||||
static int identified;
|
||||
if (identified)
|
||||
return;
|
||||
identified++;
|
||||
|
||||
JF: this is now bogus. We now print more standard error messages
|
||||
that try to look like everyone else's.
|
||||
if (!file)
|
||||
{
|
||||
unsigned int x;
|
||||
as_where (&file, &x);
|
||||
}
|
||||
|
||||
We print the error message 1st, beginning in column 1.
|
||||
All ancillary info starts in column 2 on lines after the
|
||||
key error text.
|
||||
We try to print a location in logical and physical file
|
||||
just after the main error text.
|
||||
Caller then prints any appendices after that, begining all
|
||||
lines with at least 1 space.
|
||||
|
||||
Optionally, we may die.
|
||||
There is no need for a trailing '\n' in your error text format
|
||||
because we supply one.
|
||||
|
||||
as_warn(fmt,args) Like fprintf(stderr,fmt,args) but also call errwhere().
|
||||
|
||||
as_fatal(fmt,args) Like as_warn() but exit with a fatal status.
|
||||
|
||||
*/
|
||||
fprintf (stderr, "%s: Assembler messages:\n", file);
|
||||
}
|
||||
|
||||
static int warning_count; /* Count of number of warnings issued */
|
||||
|
||||
@ -120,21 +118,45 @@ had_errors ()
|
||||
} /* had_errors() */
|
||||
|
||||
|
||||
/* Print the current location to stderr. */
|
||||
|
||||
static void
|
||||
as_show_where ()
|
||||
{
|
||||
char *file;
|
||||
unsigned int line;
|
||||
|
||||
as_where (&file, &line);
|
||||
identify (file);
|
||||
fprintf (stderr, "%s:%u: ", file, line);
|
||||
}
|
||||
|
||||
/*
|
||||
* a s _ p e r r o r
|
||||
*
|
||||
* Like perror(3), but with more info.
|
||||
*/
|
||||
|
||||
void
|
||||
as_perror (gripe, filename)
|
||||
char *gripe; /* Unpunctuated error theme. */
|
||||
char *filename;
|
||||
const char *gripe; /* Unpunctuated error theme. */
|
||||
const char *filename;
|
||||
{
|
||||
as_where ();
|
||||
const char *errtxt;
|
||||
|
||||
as_show_where ();
|
||||
fprintf (stderr, gripe, filename);
|
||||
fprintf (stderr, ": %s\n", strerror (errno));
|
||||
errno = 0; /* After reporting, clear it. */
|
||||
} /* as_perror() */
|
||||
#ifdef BFD_ASSEMBLER
|
||||
errtxt = bfd_errmsg (bfd_get_error ());
|
||||
#else
|
||||
errtxt = strerror (errno);
|
||||
#endif
|
||||
fprintf (stderr, ": %s\n", errtxt);
|
||||
errno = 0;
|
||||
#ifdef BFD_ASSEMBLER
|
||||
bfd_set_error (bfd_error_no_error);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* a s _ t s k t s k ()
|
||||
@ -147,13 +169,13 @@ as_perror (gripe, filename)
|
||||
|
||||
#ifndef NO_STDARG
|
||||
void
|
||||
as_tsktsk (const char *Format,...)
|
||||
as_tsktsk (const char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
as_where ();
|
||||
va_start (args, Format);
|
||||
vfprintf (stderr, Format, args);
|
||||
as_show_where ();
|
||||
va_start (args, format);
|
||||
vfprintf (stderr, format, args);
|
||||
va_end (args);
|
||||
(void) putc ('\n', stderr);
|
||||
} /* as_tsktsk() */
|
||||
@ -161,33 +183,54 @@ as_tsktsk (const char *Format,...)
|
||||
#else
|
||||
#ifndef NO_VARARGS
|
||||
void
|
||||
as_tsktsk (Format, va_alist)
|
||||
char *Format;
|
||||
as_tsktsk (format, va_alist)
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
va_list args;
|
||||
|
||||
as_where ();
|
||||
as_show_where ();
|
||||
va_start (args);
|
||||
vfprintf (stderr, Format, args);
|
||||
vfprintf (stderr, format, args);
|
||||
va_end (args);
|
||||
(void) putc ('\n', stderr);
|
||||
} /* as_tsktsk() */
|
||||
|
||||
#else
|
||||
/*VARARGS1 */
|
||||
as_tsktsk (Format, args)
|
||||
char *Format;
|
||||
as_tsktsk (format, args)
|
||||
char *format;
|
||||
{
|
||||
as_where ();
|
||||
_doprnt (Format, &args, stderr);
|
||||
as_show_where ();
|
||||
_doprnt (format, &args, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
/* as_where(); */
|
||||
} /* as_tsktsk */
|
||||
|
||||
#endif /* not NO_VARARGS */
|
||||
#endif /* not NO_STDARG */
|
||||
|
||||
/* The common portion of as_warn and as_warn_where. */
|
||||
|
||||
static void
|
||||
as_warn_internal (file, line, buffer)
|
||||
char *file;
|
||||
unsigned int line;
|
||||
char *buffer;
|
||||
{
|
||||
++warning_count;
|
||||
|
||||
if (file == NULL)
|
||||
as_where (&file, &line);
|
||||
|
||||
identify (file);
|
||||
fprintf (stderr, "%s:%u: Warning: ", file, line);
|
||||
fputs (buffer, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
#ifndef NO_LISTING
|
||||
listing_warning (buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* a s _ w a r n ()
|
||||
*
|
||||
@ -199,71 +242,140 @@ as_tsktsk (Format, args)
|
||||
|
||||
#ifndef NO_STDARG
|
||||
void
|
||||
as_warn (const char *Format,...)
|
||||
as_warn (const char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
if (!flag_suppress_warnings)
|
||||
if (!flagseen['W'])
|
||||
{
|
||||
++warning_count;
|
||||
as_where ();
|
||||
va_start (args, Format);
|
||||
fprintf (stderr, "Warning: ");
|
||||
vsprintf (buffer, Format, args);
|
||||
fputs (buffer, stderr);
|
||||
#ifndef NO_LISTING
|
||||
listing_warning (buffer);
|
||||
#endif
|
||||
va_start (args, format);
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
(void) putc ('\n', stderr);
|
||||
as_warn_internal ((char *) NULL, 0, buffer);
|
||||
}
|
||||
} /* as_warn() */
|
||||
|
||||
#else
|
||||
#ifndef NO_VARARGS
|
||||
void
|
||||
as_warn (Format, va_alist)
|
||||
char *Format;
|
||||
as_warn (format, va_alist)
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
if (!flag_suppress_warnings)
|
||||
if (!flagseen['W'])
|
||||
{
|
||||
++warning_count;
|
||||
as_where ();
|
||||
va_start (args);
|
||||
fprintf (stderr, "Warning: ");
|
||||
vsprintf (buffer, Format, args);
|
||||
fputs (buffer, stderr);
|
||||
#ifndef NO_LISTING
|
||||
listing_warning (buffer);
|
||||
#endif
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
(void) putc ('\n', stderr);
|
||||
as_warn_internal ((char *) NULL, 0, buffer);
|
||||
}
|
||||
} /* as_warn() */
|
||||
|
||||
#else
|
||||
/*VARARGS1 */
|
||||
as_warn (Format, args)
|
||||
char *Format;
|
||||
as_warn (format, args)
|
||||
char *format;
|
||||
{
|
||||
if (!flag_suppress_warnings)
|
||||
if (!flagseen['W'])
|
||||
{
|
||||
++warning_count;
|
||||
as_where ();
|
||||
_doprnt (Format, &args, stderr);
|
||||
as_show_where ();
|
||||
fprintf (stderr, "Warning: ");
|
||||
_doprnt (format, &args, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
/* as_where(); */
|
||||
}
|
||||
} /* as_warn() */
|
||||
|
||||
#endif /* not NO_VARARGS */
|
||||
#endif /* not NO_STDARG */
|
||||
|
||||
/* as_warn_where, like as_bad but the file name and line number are
|
||||
passed in. Unfortunately, we have to repeat the function in order
|
||||
to handle the varargs correctly and portably. */
|
||||
|
||||
#ifndef NO_STDARG
|
||||
void
|
||||
as_warn_where (char *file, unsigned int line, const char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
if (!flagseen['W'])
|
||||
{
|
||||
va_start (args, format);
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
as_warn_internal (file, line, buffer);
|
||||
}
|
||||
} /* as_warn() */
|
||||
|
||||
#else
|
||||
#ifndef NO_VARARGS
|
||||
void
|
||||
as_warn_where (file, line, format, va_alist)
|
||||
char *file;
|
||||
unsigned int line;
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
if (!flagseen['W'])
|
||||
{
|
||||
va_start (args);
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
as_warn_internal (file, line, buffer);
|
||||
}
|
||||
} /* as_warn() */
|
||||
|
||||
#else
|
||||
/*VARARGS1 */
|
||||
as_warn_where (file, line, format, args)
|
||||
char *file;
|
||||
unsigned int line;
|
||||
char *format;
|
||||
{
|
||||
if (!flagseen['W'])
|
||||
{
|
||||
++warning_count;
|
||||
identify (file);
|
||||
fprintf (stderr, "%s:%u: Warning: ", file, line);
|
||||
_doprnt (format, &args, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
}
|
||||
} /* as_warn() */
|
||||
|
||||
#endif /* not NO_VARARGS */
|
||||
#endif /* not NO_STDARG */
|
||||
|
||||
/* The common portion of as_bad and as_bad_where. */
|
||||
|
||||
static void
|
||||
as_bad_internal (file, line, buffer)
|
||||
char *file;
|
||||
unsigned int line;
|
||||
char *buffer;
|
||||
{
|
||||
++error_count;
|
||||
|
||||
if (file == NULL)
|
||||
as_where (&file, &line);
|
||||
|
||||
identify (file);
|
||||
fprintf (stderr, "%s:%u: Error: ", file, line);
|
||||
fputs (buffer, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
#ifndef NO_LISTING
|
||||
listing_error (buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* a s _ b a d ()
|
||||
*
|
||||
@ -275,60 +387,101 @@ as_warn (Format, args)
|
||||
|
||||
#ifndef NO_STDARG
|
||||
void
|
||||
as_bad (const char *Format,...)
|
||||
as_bad (const char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
++error_count;
|
||||
as_where ();
|
||||
va_start (args, Format);
|
||||
fprintf (stderr, "Error: ");
|
||||
|
||||
vsprintf (buffer, Format, args);
|
||||
fputs (buffer, stderr);
|
||||
#ifndef NO_LISTING
|
||||
listing_error (buffer);
|
||||
#endif
|
||||
va_start (args, format);
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
(void) putc ('\n', stderr);
|
||||
} /* as_bad() */
|
||||
|
||||
as_bad_internal ((char *) NULL, 0, buffer);
|
||||
}
|
||||
|
||||
#else
|
||||
#ifndef NO_VARARGS
|
||||
void
|
||||
as_bad (Format, va_alist)
|
||||
char *Format;
|
||||
as_bad (format, va_alist)
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
++error_count;
|
||||
as_where ();
|
||||
va_start (args);
|
||||
vsprintf (buffer, Format, args);
|
||||
fputs (buffer, stderr);
|
||||
#ifndef NO_LISTING
|
||||
listing_error (buffer);
|
||||
#endif
|
||||
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
(void) putc ('\n', stderr);
|
||||
} /* as_bad() */
|
||||
|
||||
as_bad_internal ((char *) NULL, 0, buffer);
|
||||
}
|
||||
|
||||
#else
|
||||
/*VARARGS1 */
|
||||
as_bad (Format, args)
|
||||
char *Format;
|
||||
as_bad (format, args)
|
||||
char *format;
|
||||
{
|
||||
++error_count;
|
||||
|
||||
as_where ();
|
||||
as_show_where ();
|
||||
fprintf (stderr, "Error: ");
|
||||
_doprnt (Format, &args, stderr);
|
||||
_doprnt (format, &args, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
} /* as_bad() */
|
||||
|
||||
#endif /* not NO_VARARGS */
|
||||
#endif /* not NO_STDARG */
|
||||
|
||||
/* as_bad_where, like as_bad but the file name and line number are
|
||||
passed in. Unfortunately, we have to repeat the function in order
|
||||
to handle the varargs correctly and portably. */
|
||||
|
||||
#ifndef NO_STDARG
|
||||
void
|
||||
as_bad_where (char *file, unsigned int line, const char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
va_start (args, format);
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
|
||||
as_bad_internal (file, line, buffer);
|
||||
}
|
||||
|
||||
#else
|
||||
#ifndef NO_VARARGS
|
||||
void
|
||||
as_bad_where (file, line, format, va_alist)
|
||||
char *file;
|
||||
unsigned int line;
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
va_list args;
|
||||
char buffer[200];
|
||||
|
||||
va_start (args);
|
||||
vsprintf (buffer, format, args);
|
||||
va_end (args);
|
||||
|
||||
as_bad_internal (file, line, buffer);
|
||||
}
|
||||
|
||||
#else
|
||||
/*VARARGS1 */
|
||||
as_bad_where (file, line, format, args)
|
||||
char *file;
|
||||
unsigned int line;
|
||||
char *format;
|
||||
{
|
||||
++error_count;
|
||||
|
||||
identify (file);
|
||||
fprintf (stderr, "%s:%u: Error: ", file, line);
|
||||
_doprnt (format, &args, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
/* as_where(); */
|
||||
} /* as_bad() */
|
||||
|
||||
#endif /* not NO_VARARGS */
|
||||
@ -345,14 +498,14 @@ as_bad (Format, args)
|
||||
|
||||
#ifndef NO_STDARG
|
||||
void
|
||||
as_fatal (const char *Format,...)
|
||||
as_fatal (const char *format,...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
as_where ();
|
||||
va_start (args, Format);
|
||||
fprintf (stderr, "Assembler fatal error:");
|
||||
vfprintf (stderr, Format, args);
|
||||
as_show_where ();
|
||||
va_start (args, format);
|
||||
fprintf (stderr, "Fatal error:");
|
||||
vfprintf (stderr, format, args);
|
||||
(void) putc ('\n', stderr);
|
||||
va_end (args);
|
||||
exit (33);
|
||||
@ -361,16 +514,16 @@ as_fatal (const char *Format,...)
|
||||
#else
|
||||
#ifndef NO_VARARGS
|
||||
void
|
||||
as_fatal (Format, va_alist)
|
||||
char *Format;
|
||||
as_fatal (format, va_alist)
|
||||
char *format;
|
||||
va_dcl
|
||||
{
|
||||
va_list args;
|
||||
|
||||
as_where ();
|
||||
as_show_where ();
|
||||
va_start (args);
|
||||
fprintf (stderr, "Assembler fatal error:");
|
||||
vfprintf (stderr, Format, args);
|
||||
fprintf (stderr, "Fatal error:");
|
||||
vfprintf (stderr, format, args);
|
||||
(void) putc ('\n', stderr);
|
||||
va_end (args);
|
||||
exit (33);
|
||||
@ -378,14 +531,13 @@ as_fatal (Format, va_alist)
|
||||
|
||||
#else
|
||||
/*VARARGS1 */
|
||||
as_fatal (Format, args)
|
||||
char *Format;
|
||||
as_fatal (format, args)
|
||||
char *format;
|
||||
{
|
||||
as_where ();
|
||||
fprintf (stderr, "Assembler fatal error:");
|
||||
_doprnt (Format, &args, stderr);
|
||||
as_show_where ();
|
||||
fprintf (stderr, "Fatal error:");
|
||||
_doprnt (format, &args, stderr);
|
||||
(void) putc ('\n', stderr);
|
||||
/* as_where(); */
|
||||
exit (33); /* What is a good exit status? */
|
||||
} /* as_fatal() */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user