Convert to ISO C90

This commit is contained in:
Nick Clifton 2003-10-04 12:40:12 +00:00
parent d3fb7ca214
commit 3394863543
2 changed files with 255 additions and 262 deletions

View file

@ -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
View file

@ -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;
}