Convert to ISO C90
This commit is contained in:
parent
d3fb7ca214
commit
3394863543
2 changed files with 255 additions and 262 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
2003-10-04 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* as.c: Convert to ISO C90.
|
||||||
|
|
||||||
2003-10-04 Nick Clifton <nickc@redhat.com>
|
2003-10-04 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
* as.c (std_shortopts): Remove 'f'.
|
* as.c (std_shortopts): Remove 'f'.
|
||||||
|
|
513
gas/as.c
513
gas/as.c
|
@ -21,16 +21,15 @@
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
/* Main program for AS; a 32-bit assembler of GNU.
|
/* Main program for AS; a 32-bit assembler of GNU.
|
||||||
* Understands command arguments.
|
Understands command arguments.
|
||||||
* Has a few routines that don't fit in other modules because they
|
Has a few routines that don't fit in other modules because they
|
||||||
* are shared.
|
are shared.
|
||||||
*
|
|
||||||
* bugs
|
bugs
|
||||||
*
|
|
||||||
* : initialisers
|
: initialisers
|
||||||
* Since no-one else says they will support them in future: I
|
Since no-one else says they will support them in future: I
|
||||||
* don't support them now.
|
don't support them now. */
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ansidecl.h"
|
#include "ansidecl.h"
|
||||||
|
|
||||||
|
@ -61,35 +60,39 @@ extern PTR sbrk ();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void show_usage PARAMS ((FILE *));
|
|
||||||
static void parse_args PARAMS ((int *, char ***));
|
|
||||||
static void dump_statistics PARAMS ((void));
|
|
||||||
static void perform_an_assembly_pass PARAMS ((int argc, char **argv));
|
|
||||||
static int macro_expr PARAMS ((const char *, int, sb *, int *));
|
|
||||||
#ifdef USING_CGEN
|
#ifdef USING_CGEN
|
||||||
/* Perform any cgen specific initialisation for gas. */
|
/* Perform any cgen specific initialisation for gas. */
|
||||||
extern void gas_cgen_begin PARAMS ((void));
|
extern void gas_cgen_begin (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Keep a record of the itbl files we read in. */
|
||||||
|
struct itbl_file_list
|
||||||
|
{
|
||||||
|
struct itbl_file_list *next;
|
||||||
|
char *name;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* We build a list of defsyms as we read the options, and then define
|
||||||
|
them after we have initialized everything. */
|
||||||
|
struct defsym_list
|
||||||
|
{
|
||||||
|
struct defsym_list *next;
|
||||||
|
char *name;
|
||||||
|
valueT value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* True if a listing is wanted. */
|
/* True if a listing is wanted. */
|
||||||
int listing;
|
int listing;
|
||||||
|
|
||||||
/* Name of listing file. */
|
|
||||||
static char *listing_filename = NULL;
|
|
||||||
|
|
||||||
/* Type of debugging to generate. */
|
/* Type of debugging to generate. */
|
||||||
|
|
||||||
enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
|
enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
|
||||||
|
|
||||||
/* Maximum level of macro nesting. */
|
/* Maximum level of macro nesting. */
|
||||||
int max_macro_nest = 100;
|
int max_macro_nest = 100;
|
||||||
|
|
||||||
/* argv[0] */
|
/* argv[0] */
|
||||||
char *myname;
|
char * myname;
|
||||||
#ifdef BFD_ASSEMBLER
|
|
||||||
segT reg_section, expr_section;
|
|
||||||
segT text_section, data_section, bss_section;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The default obstack chunk size. If we set this to zero, the
|
/* The default obstack chunk size. If we set this to zero, the
|
||||||
obstack code will use whatever will fit in a 4096 byte block. */
|
obstack code will use whatever will fit in a 4096 byte block. */
|
||||||
|
@ -102,25 +105,23 @@ int debug_memory = 0;
|
||||||
/* Enable verbose mode. */
|
/* Enable verbose mode. */
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
|
|
||||||
/* We build a list of defsyms as we read the options, and then define
|
#ifdef BFD_ASSEMBLER
|
||||||
them after we have initialized everything. */
|
segT reg_section;
|
||||||
|
segT expr_section;
|
||||||
|
segT text_section;
|
||||||
|
segT data_section;
|
||||||
|
segT bss_section;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct defsym_list {
|
/* Name of listing file. */
|
||||||
struct defsym_list *next;
|
static char *listing_filename = NULL;
|
||||||
char *name;
|
|
||||||
valueT value;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct defsym_list *defsyms;
|
static struct defsym_list *defsyms;
|
||||||
|
|
||||||
/* Keep a record of the itbl files we read in. */
|
|
||||||
|
|
||||||
struct itbl_file_list {
|
|
||||||
struct itbl_file_list *next;
|
|
||||||
char *name;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct itbl_file_list *itbl_files;
|
static struct itbl_file_list *itbl_files;
|
||||||
|
|
||||||
|
static long start_time;
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_EMULATIONS
|
#ifdef USE_EMULATIONS
|
||||||
#define EMULATION_ENVIRON "AS_EMULATION"
|
#define EMULATION_ENVIRON "AS_EMULATION"
|
||||||
|
@ -133,12 +134,8 @@ extern struct emulation crisaout, criself;
|
||||||
static struct emulation *const emulations[] = { EMULATIONS };
|
static struct emulation *const emulations[] = { EMULATIONS };
|
||||||
static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
|
static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
|
||||||
|
|
||||||
static void select_emulation_mode PARAMS ((int, char **));
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
select_emulation_mode (argc, argv)
|
select_emulation_mode (int argc, char **argv)
|
||||||
int argc;
|
|
||||||
char **argv;
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *p, *em = 0;
|
char *p, *em = 0;
|
||||||
|
@ -182,14 +179,14 @@ select_emulation_mode (argc, argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
default_emul_bfd_name ()
|
default_emul_bfd_name (void)
|
||||||
{
|
{
|
||||||
abort ();
|
abort ();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
common_emul_init ()
|
common_emul_init (void)
|
||||||
{
|
{
|
||||||
this_format = this_emulation->format;
|
this_format = this_emulation->format;
|
||||||
|
|
||||||
|
@ -211,9 +208,10 @@ common_emul_init ()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
print_version_id ()
|
print_version_id (void)
|
||||||
{
|
{
|
||||||
static int printed;
|
static int printed;
|
||||||
|
|
||||||
if (printed)
|
if (printed)
|
||||||
return;
|
return;
|
||||||
printed = 1;
|
printed = 1;
|
||||||
|
@ -228,8 +226,7 @@ print_version_id ()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
show_usage (stream)
|
show_usage (FILE * stream)
|
||||||
FILE *stream;
|
|
||||||
{
|
{
|
||||||
fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
|
fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
|
||||||
|
|
||||||
|
@ -355,21 +352,20 @@ Options:\n\
|
||||||
md_parse_option definitions in config/tc-*.c. */
|
md_parse_option definitions in config/tc-*.c. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parse_args (pargc, pargv)
|
parse_args (int * pargc, char *** pargv)
|
||||||
int *pargc;
|
|
||||||
char ***pargv;
|
|
||||||
{
|
{
|
||||||
int old_argc, new_argc;
|
int old_argc;
|
||||||
char **old_argv, **new_argv;
|
int new_argc;
|
||||||
|
char ** old_argv;
|
||||||
|
char ** new_argv;
|
||||||
/* Starting the short option string with '-' is for programs that
|
/* Starting the short option string with '-' is for programs that
|
||||||
expect options and other ARGV-elements in any order and that care about
|
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
|
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. */
|
as if it were the argument of an option with character code 1. */
|
||||||
|
|
||||||
char *shortopts;
|
char *shortopts;
|
||||||
extern const char *md_shortopts;
|
extern const char *md_shortopts;
|
||||||
static const char std_shortopts[] = {
|
static const char std_shortopts[] =
|
||||||
|
{
|
||||||
'-', 'J',
|
'-', 'J',
|
||||||
#ifndef WORKING_DOT_WORD
|
#ifndef WORKING_DOT_WORD
|
||||||
/* -K is not meaningful if .word is not being hacked. */
|
/* -K is not meaningful if .word is not being hacked. */
|
||||||
|
@ -382,15 +378,43 @@ parse_args (pargc, pargv)
|
||||||
'v',
|
'v',
|
||||||
#endif
|
#endif
|
||||||
'w', 'X',
|
'w', 'X',
|
||||||
/* New option for extending instruction set (see also --itbl below) */
|
/* New option for extending instruction set (see also --itbl below). */
|
||||||
't', ':',
|
't', ':',
|
||||||
'\0'
|
'\0'
|
||||||
};
|
};
|
||||||
struct option *longopts;
|
struct option *longopts;
|
||||||
extern struct option md_longopts[];
|
extern struct option md_longopts[];
|
||||||
extern size_t md_longopts_size;
|
extern size_t md_longopts_size;
|
||||||
static const struct option std_longopts[] = {
|
/* Codes used for the long options with no short synonyms. */
|
||||||
#define OPTION_HELP (OPTION_STD_BASE)
|
enum option_values
|
||||||
|
{
|
||||||
|
OPTION_HELP = OPTION_STD_BASE,
|
||||||
|
OPTION_NOCPP,
|
||||||
|
OPTION_STATISTICS,
|
||||||
|
OPTION_VERSION,
|
||||||
|
OPTION_DUMPCONFIG,
|
||||||
|
OPTION_VERBOSE,
|
||||||
|
OPTION_EMULATION,
|
||||||
|
OPTION_DEFSYM,
|
||||||
|
OPTION_INSTTBL,
|
||||||
|
OPTION_LISTING_LHS_WIDTH,
|
||||||
|
OPTION_LISTING_LHS_WIDTH2,
|
||||||
|
OPTION_LISTING_RHS_WIDTH,
|
||||||
|
OPTION_LISTING_CONT_LINES,
|
||||||
|
OPTION_DEPFILE,
|
||||||
|
OPTION_GSTABS,
|
||||||
|
OPTION_STRIP_LOCAL_ABSOLUTE,
|
||||||
|
OPTION_TRADITIONAL_FORMAT,
|
||||||
|
OPTION_GDWARF2,
|
||||||
|
OPTION_WARN,
|
||||||
|
OPTION_TARGET_HELP,
|
||||||
|
OPTION_EXECSTACK,
|
||||||
|
OPTION_NOEXECSTACK,
|
||||||
|
OPTION_WARN_FATAL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct option std_longopts[] =
|
||||||
|
{
|
||||||
{"help", no_argument, NULL, OPTION_HELP},
|
{"help", no_argument, NULL, OPTION_HELP},
|
||||||
/* getopt allows abbreviations, so we do this to stop it from
|
/* getopt allows abbreviations, so we do this to stop it from
|
||||||
treating -k as an abbreviation for --keep-locals. Some
|
treating -k as an abbreviation for --keep-locals. Some
|
||||||
|
@ -398,21 +422,13 @@ parse_args (pargc, pargv)
|
||||||
{"keep-locals", no_argument, NULL, 'L'},
|
{"keep-locals", no_argument, NULL, 'L'},
|
||||||
{"keep-locals", no_argument, NULL, 'L'},
|
{"keep-locals", no_argument, NULL, 'L'},
|
||||||
{"mri", no_argument, NULL, 'M'},
|
{"mri", no_argument, NULL, 'M'},
|
||||||
#define OPTION_NOCPP (OPTION_STD_BASE + 1)
|
|
||||||
{"nocpp", no_argument, NULL, OPTION_NOCPP},
|
{"nocpp", no_argument, NULL, OPTION_NOCPP},
|
||||||
#define OPTION_STATISTICS (OPTION_STD_BASE + 2)
|
|
||||||
{"statistics", no_argument, NULL, OPTION_STATISTICS},
|
{"statistics", no_argument, NULL, OPTION_STATISTICS},
|
||||||
#define OPTION_VERSION (OPTION_STD_BASE + 3)
|
|
||||||
{"version", no_argument, NULL, OPTION_VERSION},
|
{"version", no_argument, NULL, OPTION_VERSION},
|
||||||
#define OPTION_DUMPCONFIG (OPTION_STD_BASE + 4)
|
|
||||||
{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG},
|
{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG},
|
||||||
#define OPTION_VERBOSE (OPTION_STD_BASE + 5)
|
|
||||||
{"verbose", no_argument, NULL, OPTION_VERBOSE},
|
{"verbose", no_argument, NULL, OPTION_VERBOSE},
|
||||||
#define OPTION_EMULATION (OPTION_STD_BASE + 6)
|
|
||||||
{"emulation", required_argument, NULL, OPTION_EMULATION},
|
{"emulation", required_argument, NULL, OPTION_EMULATION},
|
||||||
#define OPTION_DEFSYM (OPTION_STD_BASE + 7)
|
|
||||||
{"defsym", required_argument, NULL, OPTION_DEFSYM},
|
{"defsym", required_argument, NULL, OPTION_DEFSYM},
|
||||||
#define OPTION_INSTTBL (OPTION_STD_BASE + 8)
|
|
||||||
/* New option for extending instruction set (see also -t above).
|
/* New option for extending instruction set (see also -t above).
|
||||||
The "-t file" or "--itbl file" option extends the basic set of
|
The "-t file" or "--itbl file" option extends the basic set of
|
||||||
valid instructions by reading "file", a text file containing a
|
valid instructions by reading "file", a text file containing a
|
||||||
|
@ -420,33 +436,20 @@ parse_args (pargc, pargv)
|
||||||
formats are added to the built-in set of instructions, and
|
formats are added to the built-in set of instructions, and
|
||||||
mnemonics for new registers may also be defined. */
|
mnemonics for new registers may also be defined. */
|
||||||
{"itbl", required_argument, NULL, OPTION_INSTTBL},
|
{"itbl", required_argument, NULL, OPTION_INSTTBL},
|
||||||
#define OPTION_LISTING_LHS_WIDTH (OPTION_STD_BASE + 9)
|
|
||||||
{"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH},
|
{"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH},
|
||||||
#define OPTION_LISTING_LHS_WIDTH2 (OPTION_STD_BASE + 10)
|
|
||||||
{"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2},
|
{"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2},
|
||||||
#define OPTION_LISTING_RHS_WIDTH (OPTION_STD_BASE + 11)
|
|
||||||
{"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH},
|
{"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH},
|
||||||
#define OPTION_LISTING_CONT_LINES (OPTION_STD_BASE + 12)
|
|
||||||
{"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES},
|
{"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES},
|
||||||
#define OPTION_DEPFILE (OPTION_STD_BASE + 13)
|
|
||||||
{"MD", required_argument, NULL, OPTION_DEPFILE},
|
{"MD", required_argument, NULL, OPTION_DEPFILE},
|
||||||
#define OPTION_GSTABS (OPTION_STD_BASE + 14)
|
|
||||||
{"gstabs", no_argument, NULL, OPTION_GSTABS},
|
{"gstabs", no_argument, NULL, OPTION_GSTABS},
|
||||||
#define OPTION_STRIP_LOCAL_ABSOLUTE (OPTION_STD_BASE + 15)
|
|
||||||
{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE},
|
{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE},
|
||||||
#define OPTION_TRADITIONAL_FORMAT (OPTION_STD_BASE + 16)
|
|
||||||
{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
|
{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
|
||||||
#define OPTION_GDWARF2 (OPTION_STD_BASE + 17)
|
|
||||||
{"gdwarf2", no_argument, NULL, OPTION_GDWARF2},
|
{"gdwarf2", no_argument, NULL, OPTION_GDWARF2},
|
||||||
{"no-warn", no_argument, NULL, 'W'},
|
{"no-warn", no_argument, NULL, 'W'},
|
||||||
#define OPTION_WARN (OPTION_STD_BASE + 18)
|
|
||||||
{"warn", no_argument, NULL, OPTION_WARN},
|
{"warn", no_argument, NULL, OPTION_WARN},
|
||||||
#define OPTION_TARGET_HELP (OPTION_STD_BASE + 19)
|
|
||||||
{"target-help", no_argument, NULL, OPTION_TARGET_HELP},
|
{"target-help", no_argument, NULL, OPTION_TARGET_HELP},
|
||||||
#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
|
#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
|
||||||
#define OPTION_EXECSTACK (OPTION_STD_BASE + 20)
|
|
||||||
{"execstack", no_argument, NULL, OPTION_EXECSTACK},
|
{"execstack", no_argument, NULL, OPTION_EXECSTACK},
|
||||||
#define OPTION_NOEXECSTACK (OPTION_STD_BASE + 21)
|
|
||||||
{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
|
{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
|
||||||
#endif
|
#endif
|
||||||
/* Treat '-f' as a long switch so that getopt will not accept
|
/* Treat '-f' as a long switch so that getopt will not accept
|
||||||
|
@ -455,7 +458,7 @@ parse_args (pargc, pargv)
|
||||||
FIXME - should we handle other single character switches in the
|
FIXME - should we handle other single character switches in the
|
||||||
same way ? */
|
same way ? */
|
||||||
{"f", no_argument, NULL, 'f'},
|
{"f", no_argument, NULL, 'f'},
|
||||||
#define OPTION_WARN_FATAL (OPTION_STD_BASE + 22)
|
{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL},
|
||||||
{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
|
{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
|
||||||
/* When you add options here, check that they do not collide with
|
/* When you add options here, check that they do not collide with
|
||||||
OPTION_MD_BASE. See as.h. */
|
OPTION_MD_BASE. See as.h. */
|
||||||
|
@ -465,13 +468,10 @@ parse_args (pargc, pargv)
|
||||||
dependent list. Include space for an extra NULL option and
|
dependent list. Include space for an extra NULL option and
|
||||||
always NULL terminate. */
|
always NULL terminate. */
|
||||||
shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
|
shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
|
||||||
longopts = (struct option *) xmalloc (sizeof (std_longopts)
|
longopts = xmalloc (sizeof (std_longopts) + md_longopts_size + sizeof (struct option));
|
||||||
+ md_longopts_size
|
|
||||||
+ sizeof (struct option));
|
|
||||||
memcpy (longopts, std_longopts, sizeof (std_longopts));
|
memcpy (longopts, std_longopts, sizeof (std_longopts));
|
||||||
memcpy ((char *) longopts + sizeof (std_longopts),
|
memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size);
|
||||||
md_longopts, md_longopts_size);
|
memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size,
|
||||||
memset ((char *) longopts + sizeof (std_longopts) + md_longopts_size,
|
|
||||||
0, sizeof (struct option));
|
0, sizeof (struct option));
|
||||||
|
|
||||||
/* Make a local copy of the old argv. */
|
/* Make a local copy of the old argv. */
|
||||||
|
@ -479,7 +479,7 @@ parse_args (pargc, pargv)
|
||||||
old_argv = *pargv;
|
old_argv = *pargv;
|
||||||
|
|
||||||
/* Initialize a new argv that contains no options. */
|
/* Initialize a new argv that contains no options. */
|
||||||
new_argv = (char **) xmalloc (sizeof (char *) * (old_argc + 1));
|
new_argv = xmalloc (sizeof (char *) * (old_argc + 1));
|
||||||
new_argv[0] = old_argv[0];
|
new_argv[0] = old_argv[0];
|
||||||
new_argc = 1;
|
new_argc = 1;
|
||||||
new_argv[new_argc] = NULL;
|
new_argv[new_argc] = NULL;
|
||||||
|
@ -609,7 +609,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
|
||||||
#else
|
#else
|
||||||
i = strtol (s, (char **) NULL, 0);
|
i = strtol (s, (char **) NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
n = (struct defsym_list *) xmalloc (sizeof *n);
|
n = xmalloc (sizeof *n);
|
||||||
n->next = defsyms;
|
n->next = defsyms;
|
||||||
n->name = optarg;
|
n->name = optarg;
|
||||||
n->value = i;
|
n->value = i;
|
||||||
|
@ -630,7 +630,7 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = (struct itbl_file_list *) xmalloc (sizeof *n);
|
n = xmalloc (sizeof * n);
|
||||||
n->next = itbl_files;
|
n->next = itbl_files;
|
||||||
n->name = optarg;
|
n->name = optarg;
|
||||||
itbl_files = n;
|
itbl_files = n;
|
||||||
|
@ -667,7 +667,6 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
|
||||||
flag_warn_displacement = 1;
|
flag_warn_displacement = 1;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case 'L':
|
case 'L':
|
||||||
flag_keep_locals = 1;
|
flag_keep_locals = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -727,7 +726,6 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
|
||||||
flag_execstack = 0;
|
flag_execstack = 0;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case 'Z':
|
case 'Z':
|
||||||
flag_always_generate_output = 1;
|
flag_always_generate_output = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -819,14 +817,168 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static long start_time;
|
static void
|
||||||
|
dump_statistics (void)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_SBRK
|
||||||
|
char *lim = (char *) sbrk (0);
|
||||||
|
#endif
|
||||||
|
long run_time = get_run_time () - start_time;
|
||||||
|
|
||||||
int main PARAMS ((int, char **));
|
fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
|
||||||
|
myname, run_time / 1000000, run_time % 1000000);
|
||||||
|
#ifdef HAVE_SBRK
|
||||||
|
fprintf (stderr, _("%s: data size %ld\n"),
|
||||||
|
myname, (long) (lim - (char *) &environ));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
subsegs_print_statistics (stderr);
|
||||||
|
write_print_statistics (stderr);
|
||||||
|
symbol_print_statistics (stderr);
|
||||||
|
read_print_statistics (stderr);
|
||||||
|
|
||||||
|
#ifdef tc_print_statistics
|
||||||
|
tc_print_statistics (stderr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef obj_print_statistics
|
||||||
|
obj_print_statistics (stderr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The interface between the macro code and gas expression handling. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
macro_expr (const char *emsg, int idx, sb *in, int *val)
|
||||||
|
{
|
||||||
|
char *hold;
|
||||||
|
expressionS ex;
|
||||||
|
|
||||||
|
sb_terminate (in);
|
||||||
|
|
||||||
|
hold = input_line_pointer;
|
||||||
|
input_line_pointer = in->ptr + idx;
|
||||||
|
expression (&ex);
|
||||||
|
idx = input_line_pointer - in->ptr;
|
||||||
|
input_line_pointer = hold;
|
||||||
|
|
||||||
|
if (ex.X_op != O_constant)
|
||||||
|
as_bad ("%s", emsg);
|
||||||
|
|
||||||
|
*val = (int) ex.X_add_number;
|
||||||
|
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here to attempt 1 pass over each input file.
|
||||||
|
We scan argv[*] looking for filenames or exactly "" which is
|
||||||
|
shorthand for stdin. Any argv that is NULL is not a file-name.
|
||||||
|
We set need_pass_2 TRUE if, after this, we still have unresolved
|
||||||
|
expressions of the form (unknown value)+-(unknown value).
|
||||||
|
|
||||||
|
Note the un*x semantics: there is only 1 logical input file, but it
|
||||||
|
may be a catenation of many 'physical' input files. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
perform_an_assembly_pass (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
int saw_a_file = 0;
|
||||||
|
#ifdef BFD_ASSEMBLER
|
||||||
|
flagword applicable;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
need_pass_2 = 0;
|
||||||
|
|
||||||
|
#ifndef BFD_ASSEMBLER
|
||||||
|
#ifdef MANY_SEGMENTS
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
for (i = SEG_E0; i < SEG_UNKNOWN; i++)
|
||||||
|
segment_info[i].fix_root = 0;
|
||||||
|
}
|
||||||
|
/* Create the three fixed ones. */
|
||||||
|
{
|
||||||
|
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. */
|
||||||
|
text_fix_root = NULL;
|
||||||
|
data_fix_root = NULL;
|
||||||
|
bss_fix_root = NULL;
|
||||||
|
#endif /* not MANY_SEGMENTS. */
|
||||||
|
#else /* BFD_ASSEMBLER. */
|
||||||
|
/* Create the standard sections, and those the assembler uses
|
||||||
|
internally. */
|
||||||
|
text_section = subseg_new (TEXT_SECTION_NAME, 0);
|
||||||
|
data_section = subseg_new (DATA_SECTION_NAME, 0);
|
||||||
|
bss_section = subseg_new (BSS_SECTION_NAME, 0);
|
||||||
|
/* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
|
||||||
|
to have relocs, otherwise we don't find out in time. */
|
||||||
|
applicable = bfd_applicable_section_flags (stdoutput);
|
||||||
|
bfd_set_section_flags (stdoutput, text_section,
|
||||||
|
applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
||||||
|
| SEC_CODE | SEC_READONLY));
|
||||||
|
bfd_set_section_flags (stdoutput, data_section,
|
||||||
|
applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
||||||
|
| SEC_DATA));
|
||||||
|
bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
|
||||||
|
seg_info (bss_section)->bss = 1;
|
||||||
|
subseg_new (BFD_ABS_SECTION_NAME, 0);
|
||||||
|
subseg_new (BFD_UND_SECTION_NAME, 0);
|
||||||
|
reg_section = subseg_new ("*GAS `reg' section*", 0);
|
||||||
|
expr_section = subseg_new ("*GAS `expr' section*", 0);
|
||||||
|
|
||||||
|
#endif /* BFD_ASSEMBLER. */
|
||||||
|
|
||||||
|
subseg_set (text_section, 0);
|
||||||
|
|
||||||
|
/* This may add symbol table entries, which requires having an open BFD,
|
||||||
|
and sections already created, in BFD_ASSEMBLER mode. */
|
||||||
|
md_begin ();
|
||||||
|
|
||||||
|
#ifdef USING_CGEN
|
||||||
|
gas_cgen_begin ();
|
||||||
|
#endif
|
||||||
|
#ifdef obj_begin
|
||||||
|
obj_begin ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Skip argv[0]. */
|
||||||
|
argv++;
|
||||||
|
argc--;
|
||||||
|
|
||||||
|
while (argc--)
|
||||||
|
{
|
||||||
|
if (*argv)
|
||||||
|
{ /* Is it a file-name argument? */
|
||||||
|
PROGRESS (1);
|
||||||
|
saw_a_file++;
|
||||||
|
/* argv->"" if stdin desired, else->filename. */
|
||||||
|
read_a_source_file (*argv);
|
||||||
|
}
|
||||||
|
argv++; /* Completed that argv. */
|
||||||
|
}
|
||||||
|
if (!saw_a_file)
|
||||||
|
read_a_source_file ("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (argc, argv)
|
main (int argc, char ** argv)
|
||||||
int argc;
|
|
||||||
char **argv;
|
|
||||||
{
|
{
|
||||||
int macro_alternate;
|
int macro_alternate;
|
||||||
int macro_strip_at;
|
int macro_strip_at;
|
||||||
|
@ -979,7 +1131,7 @@ main (argc, argv)
|
||||||
listing_print (listing_filename);
|
listing_print (listing_filename);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef OBJ_VMS /* does its own file handling */
|
#ifndef OBJ_VMS /* Does its own file handling. */
|
||||||
#ifndef BFD_ASSEMBLER
|
#ifndef BFD_ASSEMBLER
|
||||||
if (keep_it)
|
if (keep_it)
|
||||||
#endif
|
#endif
|
||||||
|
@ -1010,166 +1162,3 @@ main (argc, argv)
|
||||||
xexit (EXIT_SUCCESS);
|
xexit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
dump_statistics ()
|
|
||||||
{
|
|
||||||
#ifdef HAVE_SBRK
|
|
||||||
char *lim = (char *) sbrk (0);
|
|
||||||
#endif
|
|
||||||
long run_time = get_run_time () - start_time;
|
|
||||||
|
|
||||||
fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"),
|
|
||||||
myname, run_time / 1000000, run_time % 1000000);
|
|
||||||
#ifdef HAVE_SBRK
|
|
||||||
fprintf (stderr, _("%s: data size %ld\n"),
|
|
||||||
myname, (long) (lim - (char *) &environ));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
subsegs_print_statistics (stderr);
|
|
||||||
write_print_statistics (stderr);
|
|
||||||
symbol_print_statistics (stderr);
|
|
||||||
read_print_statistics (stderr);
|
|
||||||
|
|
||||||
#ifdef tc_print_statistics
|
|
||||||
tc_print_statistics (stderr);
|
|
||||||
#endif
|
|
||||||
#ifdef obj_print_statistics
|
|
||||||
obj_print_statistics (stderr);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here to attempt 1 pass over each input file.
|
|
||||||
We scan argv[*] looking for filenames or exactly "" which is
|
|
||||||
shorthand for stdin. Any argv that is NULL is not a file-name.
|
|
||||||
We set need_pass_2 TRUE if, after this, we still have unresolved
|
|
||||||
expressions of the form (unknown value)+-(unknown value).
|
|
||||||
|
|
||||||
Note the un*x semantics: there is only 1 logical input file, but it
|
|
||||||
may be a catenation of many 'physical' input files. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
perform_an_assembly_pass (argc, argv)
|
|
||||||
int argc;
|
|
||||||
char **argv;
|
|
||||||
{
|
|
||||||
int saw_a_file = 0;
|
|
||||||
#ifdef BFD_ASSEMBLER
|
|
||||||
flagword applicable;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
need_pass_2 = 0;
|
|
||||||
|
|
||||||
#ifndef BFD_ASSEMBLER
|
|
||||||
#ifdef MANY_SEGMENTS
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
for (i = SEG_E0; i < SEG_UNKNOWN; i++)
|
|
||||||
segment_info[i].fix_root = 0;
|
|
||||||
}
|
|
||||||
/* Create the three fixed ones. */
|
|
||||||
{
|
|
||||||
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 */
|
|
||||||
text_fix_root = NULL;
|
|
||||||
data_fix_root = NULL;
|
|
||||||
bss_fix_root = NULL;
|
|
||||||
#endif /* not MANY_SEGMENTS */
|
|
||||||
#else /* BFD_ASSEMBLER */
|
|
||||||
/* Create the standard sections, and those the assembler uses
|
|
||||||
internally. */
|
|
||||||
text_section = subseg_new (TEXT_SECTION_NAME, 0);
|
|
||||||
data_section = subseg_new (DATA_SECTION_NAME, 0);
|
|
||||||
bss_section = subseg_new (BSS_SECTION_NAME, 0);
|
|
||||||
/* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
|
|
||||||
to have relocs, otherwise we don't find out in time. */
|
|
||||||
applicable = bfd_applicable_section_flags (stdoutput);
|
|
||||||
bfd_set_section_flags (stdoutput, text_section,
|
|
||||||
applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
|
||||||
| SEC_CODE | SEC_READONLY));
|
|
||||||
bfd_set_section_flags (stdoutput, data_section,
|
|
||||||
applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
|
||||||
| SEC_DATA));
|
|
||||||
bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
|
|
||||||
seg_info (bss_section)->bss = 1;
|
|
||||||
subseg_new (BFD_ABS_SECTION_NAME, 0);
|
|
||||||
subseg_new (BFD_UND_SECTION_NAME, 0);
|
|
||||||
reg_section = subseg_new ("*GAS `reg' section*", 0);
|
|
||||||
expr_section = subseg_new ("*GAS `expr' section*", 0);
|
|
||||||
|
|
||||||
#endif /* BFD_ASSEMBLER */
|
|
||||||
|
|
||||||
subseg_set (text_section, 0);
|
|
||||||
|
|
||||||
/* This may add symbol table entries, which requires having an open BFD,
|
|
||||||
and sections already created, in BFD_ASSEMBLER mode. */
|
|
||||||
md_begin ();
|
|
||||||
|
|
||||||
#ifdef USING_CGEN
|
|
||||||
gas_cgen_begin ();
|
|
||||||
#endif
|
|
||||||
#ifdef obj_begin
|
|
||||||
obj_begin ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Skip argv[0]. */
|
|
||||||
argv++;
|
|
||||||
argc--;
|
|
||||||
|
|
||||||
while (argc--)
|
|
||||||
{
|
|
||||||
if (*argv)
|
|
||||||
{ /* Is it a file-name argument? */
|
|
||||||
PROGRESS (1);
|
|
||||||
saw_a_file++;
|
|
||||||
/* argv->"" if stdin desired, else->filename */
|
|
||||||
read_a_source_file (*argv);
|
|
||||||
}
|
|
||||||
argv++; /* completed that argv */
|
|
||||||
}
|
|
||||||
if (!saw_a_file)
|
|
||||||
read_a_source_file ("");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The interface between the macro code and gas expression handling. */
|
|
||||||
|
|
||||||
static int
|
|
||||||
macro_expr (emsg, idx, in, val)
|
|
||||||
const char *emsg;
|
|
||||||
int idx;
|
|
||||||
sb *in;
|
|
||||||
int *val;
|
|
||||||
{
|
|
||||||
char *hold;
|
|
||||||
expressionS ex;
|
|
||||||
|
|
||||||
sb_terminate (in);
|
|
||||||
|
|
||||||
hold = input_line_pointer;
|
|
||||||
input_line_pointer = in->ptr + idx;
|
|
||||||
expression (&ex);
|
|
||||||
idx = input_line_pointer - in->ptr;
|
|
||||||
input_line_pointer = hold;
|
|
||||||
|
|
||||||
if (ex.X_op != O_constant)
|
|
||||||
as_bad ("%s", emsg);
|
|
||||||
|
|
||||||
*val = (int) ex.X_add_number;
|
|
||||||
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue