X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fas.c;h=200a4d10e375ee71623f86eb9db6a8c5feb48711;hb=b1b17bc508cd93e4ed8b6318bdaf9e48d89e4811;hp=6b76c2f9699a2b8e03aa4b06bb1dcf4850a8a1d3;hpb=87c245cccce4a84d53381ea7a8247330608eba7f;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/as.c b/gas/as.c index 6b76c2f969..200a4d10e3 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1,24 +1,24 @@ /* as.c - GAS main program. Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. - GAS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + GAS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* Main program for AS; a 32-bit assembler of GNU. Understands command arguments. @@ -31,8 +31,6 @@ Since no-one else says they will support them in future: I don't support them now. */ -#include "ansidecl.h" - #define COMMON #include "as.h" @@ -42,16 +40,11 @@ #include "macro.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" -#include "hash.h" - -#ifdef BFD_ASSEMBLER #include "bfdver.h" -#endif #ifdef HAVE_ITBL_CPU #include "itbl-ops.h" #else -#define itbl_parse(itbl_file) 1 #define itbl_init() #endif @@ -66,13 +59,6 @@ extern PTR sbrk (); extern void gas_cgen_begin (void); #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 @@ -112,20 +98,26 @@ int debug_memory = 0; /* Enable verbose mode. */ int verbose = 0; -#ifdef BFD_ASSEMBLER segT reg_section; segT expr_section; segT text_section; segT data_section; segT bss_section; -#endif /* Name of listing file. */ static char *listing_filename = NULL; static struct defsym_list *defsyms; +#ifdef HAVE_ITBL_CPU +/* 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; +#endif static long start_time; @@ -225,13 +217,8 @@ print_version_id (void) return; printed = 1; -#ifdef BFD_ASSEMBLER - fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s"), + fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s\n"), VERSION, TARGET_ALIAS, BFD_VERSION_STRING); -#else - fprintf (stderr, _("GNU assembler version %s (%s)"), VERSION, TARGET_ALIAS); -#endif - fprintf (stderr, "\n"); } static void @@ -257,6 +244,8 @@ Options:\n\ fprintf (stream, _("\ -D produce assembler debugging messages\n")); fprintf (stream, _("\ + --debug-prefix-map OLD=NEW Map OLD to NEW in debug information\n")); + fprintf (stream, _("\ --defsym SYM=VAL define symbol SYM to given value\n")); #ifdef USE_EMULATIONS { @@ -276,7 +265,7 @@ Options:\n\ emulate output (default %s)\n"), def_em); } #endif -#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF fprintf (stream, _("\ --execstack require executable stack for this object\n")); fprintf (stream, _("\ @@ -334,9 +323,11 @@ Options:\n\ --warn don't suppress warnings\n")); fprintf (stream, _("\ --fatal-warnings treat warnings as errors\n")); +#ifdef HAVE_ITBL_CPU fprintf (stream, _("\ --itbl INSTTBL extend instruction set to include instructions\n\ matching the specifications defined in file INSTTBL\n")); +#endif fprintf (stream, _("\ -w ignored\n")); fprintf (stream, _("\ @@ -356,11 +347,15 @@ Options:\n\ fprintf (stream, _("\ --listing-cont-lines set the maximum number of continuation lines used\n\ for the output data column of the listing\n")); + fprintf (stream, _("\ + @FILE read options from FILE\n")); md_show_usage (stream); fputc ('\n', stream); - fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); + + if (REPORT_BUGS_TO[0] && stream == stdout) + fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO); } /* Since it is easy to do here we interpret the special arg "-" @@ -399,8 +394,10 @@ parse_args (int * pargc, char *** pargv) 'v', #endif 'w', 'X', +#ifdef HAVE_ITBL_CPU /* New option for extending instruction set (see also --itbl below). */ 't', ':', +#endif '\0' }; struct option *longopts; @@ -416,8 +413,8 @@ parse_args (int * pargc, char *** pargv) OPTION_DUMPCONFIG, OPTION_VERBOSE, OPTION_EMULATION, + OPTION_DEBUG_PREFIX_MAP, OPTION_DEFSYM, - OPTION_INSTTBL, OPTION_LISTING_LHS_WIDTH, OPTION_LISTING_LHS_WIDTH2, OPTION_LISTING_RHS_WIDTH, @@ -433,6 +430,7 @@ parse_args (int * pargc, char *** pargv) OPTION_EXECSTACK, OPTION_NOEXECSTACK, OPTION_ALTERNATE, + OPTION_AL, OPTION_HASH_TABLE_SIZE, OPTION_REDUCE_MEMORY_OVERHEADS, OPTION_WARN_FATAL @@ -451,10 +449,13 @@ parse_args (int * pargc, char *** pargv) necessary because -a= is a valid switch but getopt would normally reject it since --alternate does not take an argument. */ ,{"a", optional_argument, NULL, 'a'} + /* Handle -al=. */ + ,{"al", optional_argument, NULL, OPTION_AL} + ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP} ,{"defsym", required_argument, NULL, OPTION_DEFSYM} ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG} ,{"emulation", required_argument, NULL, OPTION_EMULATION} -#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF ,{"execstack", no_argument, NULL, OPTION_EXECSTACK} ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK} #endif @@ -468,13 +469,15 @@ parse_args (int * pargc, char *** pargv) ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS} ,{"hash-size", required_argument, NULL, OPTION_HASH_TABLE_SIZE} ,{"help", no_argument, NULL, OPTION_HELP} +#ifdef HAVE_ITBL_CPU /* New option for extending instruction set (see also -t above). The "-t file" or "--itbl file" option extends the basic set of valid instructions by reading "file", a text file containing a list of instruction formats. The additional opcodes and their formats are added to the built-in set of instructions, and mnemonics for new registers may also be defined. */ - ,{"itbl", required_argument, NULL, OPTION_INSTTBL} + ,{"itbl", required_argument, NULL, 't'} +#endif /* getopt allows abbreviations, so we do this to stop it from treating -k as an abbreviation for --keep-locals. Some ports use -k to enable PIC assembly. */ @@ -595,15 +598,12 @@ parse_args (int * pargc, char *** pargv) case OPTION_VERSION: /* This output is intended to follow the GNU standards document. */ -#ifdef BFD_ASSEMBLER printf (_("GNU assembler %s\n"), BFD_VERSION_STRING); -#else - printf (_("GNU assembler %s\n"), VERSION); -#endif - printf (_("Copyright 2005 Free Software Foundation, Inc.\n")); + printf (_("Copyright 2007 Free Software Foundation, Inc.\n")); printf (_("\ This program is free software; you may redistribute it under the terms of\n\ -the GNU General Public License. This program has absolutely no warranty.\n")); +the GNU General Public License version 3 or later.\n\ +This program has absolutely no warranty.\n")); printf (_("This assembler was configured for a target of `%s'.\n"), TARGET_ALIAS); exit (EXIT_SUCCESS); @@ -629,6 +629,10 @@ the GNU General Public License. This program has absolutely no warranty.\n")); #endif exit (EXIT_SUCCESS); + case OPTION_DEBUG_PREFIX_MAP: + add_debug_prefix_map (optarg); + break; + case OPTION_DEFSYM: { char *s; @@ -640,11 +644,7 @@ the GNU General Public License. This program has absolutely no warranty.\n")); if (*s == '\0') as_fatal (_("bad defsym; format is --defsym name=value")); *s++ = '\0'; -#ifdef BFD_ASSEMBLER i = bfd_scan_vma (s, (const char **) NULL, 0); -#else - i = strtol (s, (char **) NULL, 0); -#endif n = xmalloc (sizeof *n); n->next = defsyms; n->name = optarg; @@ -653,7 +653,7 @@ the GNU General Public License. This program has absolutely no warranty.\n")); } break; - case OPTION_INSTTBL: +#ifdef HAVE_ITBL_CPU case 't': { /* optarg is the name of the file containing the instruction @@ -681,6 +681,7 @@ the GNU General Public License. This program has absolutely no warranty.\n")); itbl_files->name); } break; +#endif case OPTION_DEPFILE: start_dependencies (optarg); @@ -771,7 +772,7 @@ the GNU General Public License. This program has absolutely no warranty.\n")); flag_fatal_warnings = 1; break; -#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF case OPTION_EXECSTACK: flag_execstack = 1; flag_noexecstack = 0; @@ -786,6 +787,12 @@ the GNU General Public License. This program has absolutely no warranty.\n")); flag_always_generate_output = 1; break; + case OPTION_AL: + listing |= LISTING_LISTING; + if (optarg) + listing_filename = xstrdup (optarg); + break; + case OPTION_ALTERNATE: optarg = old_argv [optind - 1]; while (* optarg == '-') @@ -937,6 +944,14 @@ dump_statistics (void) #endif } +#ifndef OBJ_VMS +static void +close_output_file (void) +{ + output_file_close (out_file_name); +} +#endif + /* The interface between the macro code and gas expression handling. */ static int @@ -949,7 +964,7 @@ macro_expr (const char *emsg, int idx, sb *in, int *val) hold = input_line_pointer; input_line_pointer = in->ptr + idx; - expression (&ex); + expression_and_evaluate (&ex); idx = input_line_pointer - in->ptr; input_line_pointer = hold; @@ -974,44 +989,10 @@ 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); @@ -1033,12 +1014,10 @@ perform_an_assembly_pass (int argc, char ** argv) 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. */ + and sections already created. */ md_begin (); #ifdef USING_CGEN @@ -1067,6 +1046,33 @@ perform_an_assembly_pass (int argc, char ** argv) read_a_source_file (""); } +#ifdef OBJ_ELF +static void +create_obj_attrs_section (void) +{ + segT s; + char *p; + addressT addr; + offsetT size; + const char *name; + + size = bfd_elf_obj_attr_size (stdoutput); + if (size) + { + name = get_elf_backend_data (stdoutput)->obj_attrs_section; + if (!name) + name = ".gnu.attributes"; + s = subseg_new (name, 0); + elf_section_type (s) + = get_elf_backend_data (stdoutput)->obj_attrs_section_type; + bfd_set_section_flags (stdoutput, s, SEC_READONLY | SEC_DATA); + addr = frag_now_fix (); + p = frag_more (size); + bfd_elf_set_obj_attr_contents (stdoutput, (bfd_byte *)p, size); + } +} +#endif + int main (int argc, char ** argv) @@ -1095,6 +1101,8 @@ main (int argc, char ** argv) myname = argv[0]; xmalloc_set_program_name (myname); + expandargv (&argc, &argv); + START_PROGRESS (myname, 0); #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME @@ -1104,10 +1112,8 @@ main (int argc, char ** argv) out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME; hex_init (); -#ifdef BFD_ASSEMBLER bfd_init (); bfd_set_error_program_name (myname); -#endif #ifdef USE_EMULATIONS select_emulation_mode (argc, argv); @@ -1124,6 +1130,11 @@ main (int argc, char ** argv) input_scrub_begin (); expr_begin (); +#ifndef OBJ_VMS /* Does its own file handling. */ + /* It has to be called after dump_statistics (). */ + xatexit (close_output_file); +#endif + if (flag_print_statistics) xatexit (dump_statistics); @@ -1131,21 +1142,13 @@ main (int argc, char ** argv) #ifdef TC_I960 macro_strip_at = flag_mri; #endif -#ifdef TC_A29K - /* For compatibility with the AMD 29K family macro assembler - specification. */ - flag_macro_alternate = 1; - macro_strip_at = 1; -#endif macro_init (flag_macro_alternate, flag_mri, macro_strip_at, macro_expr); PROGRESS (1); -#ifdef BFD_ASSEMBLER output_file_create (out_file_name); assert (stdoutput != 0); -#endif #ifdef tc_init_after_args tc_init_after_args (); @@ -1163,6 +1166,11 @@ main (int argc, char ** argv) sym = symbol_new (defsyms->name, absolute_section, defsyms->value, &zero_address_frag); + /* Make symbols defined on the command line volatile, so that they + can be redefined inside a source file. This makes this assembler's + behaviour compatible with earlier versions, but it may not be + completely intuitive. */ + S_SET_VOLATILE (sym); symbol_table_insert (sym); next = defsyms->next; free (defsyms); @@ -1180,7 +1188,12 @@ main (int argc, char ** argv) md_end (); #endif -#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF) +#ifdef OBJ_ELF + if (IS_ELF) + create_obj_attrs_section (); +#endif + +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF if ((flag_execstack || flag_noexecstack) && OUTPUT_FLAVOR == bfd_target_elf_flavour) { @@ -1207,28 +1220,21 @@ main (int argc, char ** argv) else keep_it = 0; -#if defined (BFD_ASSEMBLER) || !defined (BFD) /* This used to be done at the start of write_object_file in write.c, but that caused problems when doing listings when keep_it was zero. This could probably be moved above md_end, but I didn't want to risk the change. */ subsegs_finish (); -#endif if (keep_it) write_object_file (); + fflush (stderr); + #ifndef NO_LISTING listing_print (listing_filename); #endif -#ifndef OBJ_VMS /* Does its own file handling. */ -#ifndef BFD_ASSEMBLER - if (keep_it) -#endif - output_file_close (out_file_name); -#endif - if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0) as_bad (_("%d warnings, treating warnings as errors"), had_warnings ());