X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fas.c;h=1325038f532191f47a312bbb71679b5b37f5cd1f;hb=b486de60627b63bbb87af1187b01669b2b6dbc39;hp=727a1dd40ee58e5ac1c11a4e24185bfa324a286f;hpb=01f0fe5e0450edf168c1f612feb93cf588e4e7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/as.c b/gas/as.c index 727a1dd40e..1325038f53 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1,19 +1,20 @@ /* 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, 2008, 2009, + 2010, 2011 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 @@ -31,8 +32,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,19 +41,17 @@ #include "macro.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" -#include "hash.h" #include "bfdver.h" #ifdef HAVE_ITBL_CPU #include "itbl-ops.h" #else -#define itbl_parse(itbl_file) 1 #define itbl_init() #endif #ifdef HAVE_SBRK #ifdef NEED_DECLARATION_SBRK -extern PTR sbrk (); +extern void *sbrk (); #endif #endif @@ -63,13 +60,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 @@ -109,6 +99,9 @@ int debug_memory = 0; /* Enable verbose mode. */ int verbose = 0; +/* Keep the output file. */ +int keep_it = 0; + segT reg_section; segT expr_section; segT text_section; @@ -120,7 +113,15 @@ 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; @@ -235,6 +236,7 @@ Options:\n\ Sub-options [default hls]:\n\ c omit false conditionals\n\ d omit debugging directives\n\ + g include general info\n\ h include high-level source\n\ l include assembly\n\ m include macro expansions\n\ @@ -244,9 +246,20 @@ Options:\n\ fprintf (stream, _("\ --alternate initially turn on alternate macro syntax\n")); +#ifdef HAVE_ZLIB_H + fprintf (stream, _("\ + --compress-debug-sections\n\ + compress DWARF debug sections using zlib\n")); + fprintf (stream, _("\ + --nocompress-debug-sections\n\ + don't compress DWARF debug sections\n")); +#endif /* HAVE_ZLIB_H */ fprintf (stream, _("\ -D produce assembler debugging messages\n")); fprintf (stream, _("\ + --debug-prefix-map OLD=NEW\n\ + map OLD to NEW in debug information\n")); + fprintf (stream, _("\ --defsym SYM=VAL define symbol SYM to given value\n")); #ifdef USE_EMULATIONS { @@ -271,6 +284,9 @@ Options:\n\ --execstack require executable stack for this object\n")); fprintf (stream, _("\ --noexecstack don't require executable stack for this object\n")); + fprintf (stream, _("\ + --size-check=[error|warning]\n\ + ELF .size directive check (default --size-check=error)\n")); #endif fprintf (stream, _("\ -f skip whitespace and comment preprocessing\n")); @@ -324,9 +340,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, _("\ @@ -352,7 +370,9 @@ Options:\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 "-" @@ -391,8 +411,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; @@ -408,8 +430,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, @@ -424,11 +446,14 @@ parse_args (int * pargc, char *** pargv) OPTION_TARGET_HELP, OPTION_EXECSTACK, OPTION_NOEXECSTACK, + OPTION_SIZE_CHECK, OPTION_ALTERNATE, OPTION_AL, OPTION_HASH_TABLE_SIZE, OPTION_REDUCE_MEMORY_OVERHEADS, - OPTION_WARN_FATAL + OPTION_WARN_FATAL, + OPTION_COMPRESS_DEBUG, + OPTION_NOCOMPRESS_DEBUG /* When you add options here, check that they do not collide with OPTION_MD_BASE. See as.h. */ }; @@ -436,7 +461,7 @@ parse_args (int * pargc, char *** pargv) static const struct option std_longopts[] = { /* Note: commas are placed at the start of the line rather than - the end of the preceeding line so that it is simpler to + the end of the preceding line so that it is simpler to selectively add and remove lines from this list. */ {"alternate", no_argument, NULL, OPTION_ALTERNATE} /* The entry for "a" is here to prevent getopt_long_only() from @@ -446,12 +471,16 @@ parse_args (int * pargc, char *** pargv) ,{"a", optional_argument, NULL, 'a'} /* Handle -al=. */ ,{"al", optional_argument, NULL, OPTION_AL} + ,{"compress-debug-sections", no_argument, NULL, OPTION_COMPRESS_DEBUG} + ,{"nocompress-debug-sections", no_argument, NULL, OPTION_NOCOMPRESS_DEBUG} + ,{"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 OBJ_ELF || defined OBJ_MAYBE_ELF ,{"execstack", no_argument, NULL, OPTION_EXECSTACK} ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK} + ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK} #endif ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL} ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF2} @@ -463,13 +492,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. */ @@ -497,7 +528,8 @@ parse_args (int * pargc, char *** pargv) dependent list. Include space for an extra NULL option and always NULL terminate. */ shortopts = concat (std_shortopts, md_shortopts, (char *) NULL); - longopts = xmalloc (sizeof (std_longopts) + md_longopts_size + sizeof (struct option)); + longopts = (struct option *) xmalloc (sizeof (std_longopts) + + md_longopts_size + sizeof (struct option)); memcpy (longopts, std_longopts, sizeof (std_longopts)); memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size); memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size, @@ -508,7 +540,7 @@ parse_args (int * pargc, char *** pargv) old_argv = *pargv; /* Initialize a new argv that contains no options. */ - new_argv = xmalloc (sizeof (char *) * (old_argc + 1)); + new_argv = (char **) xmalloc (sizeof (char *) * (old_argc + 1)); new_argv[0] = old_argv[0]; new_argc = 1; new_argv[new_argc] = NULL; @@ -591,10 +623,11 @@ parse_args (int * pargc, char *** pargv) case OPTION_VERSION: /* This output is intended to follow the GNU standards document. */ printf (_("GNU assembler %s\n"), BFD_VERSION_STRING); - printf (_("Copyright 2005 Free Software Foundation, Inc.\n")); + printf (_("Copyright 2011 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); @@ -620,6 +653,22 @@ the GNU General Public License. This program has absolutely no warranty.\n")); #endif exit (EXIT_SUCCESS); + case OPTION_COMPRESS_DEBUG: +#ifdef HAVE_ZLIB_H + flag_compress_debug = 1; +#else + as_warn (_("cannot compress debug sections (zlib not installed)")); +#endif /* HAVE_ZLIB_H */ + break; + + case OPTION_NOCOMPRESS_DEBUG: + flag_compress_debug = 0; + break; + + case OPTION_DEBUG_PREFIX_MAP: + add_debug_prefix_map (optarg); + break; + case OPTION_DEFSYM: { char *s; @@ -632,7 +681,7 @@ the GNU General Public License. This program has absolutely no warranty.\n")); as_fatal (_("bad defsym; format is --defsym name=value")); *s++ = '\0'; i = bfd_scan_vma (s, (const char **) NULL, 0); - n = xmalloc (sizeof *n); + n = (struct defsym_list *) xmalloc (sizeof *n); n->next = defsyms; n->name = optarg; n->value = i; @@ -640,7 +689,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 @@ -668,6 +717,7 @@ the GNU General Public License. This program has absolutely no warranty.\n")); itbl_files->name); } break; +#endif case OPTION_DEPFILE: start_dependencies (optarg); @@ -768,6 +818,15 @@ the GNU General Public License. This program has absolutely no warranty.\n")); flag_noexecstack = 1; flag_execstack = 0; break; + + case OPTION_SIZE_CHECK: + if (strcasecmp (optarg, "error") == 0) + flag_size_check = size_check_error; + else if (strcasecmp (optarg, "warning") == 0) + flag_size_check = size_check_warning; + else + as_fatal (_("Invalid --size-check= option: `%s'"), optarg); + break; #endif case 'Z': flag_always_generate_output = 1; @@ -811,6 +870,9 @@ the GNU General Public License. This program has absolutely no warranty.\n")); case 'd': listing |= LISTING_NODEBUG; break; + case 'g': + listing |= LISTING_GENERAL; + break; case 'h': listing |= LISTING_HLL; break; @@ -930,13 +992,13 @@ dump_statistics (void) #endif } -#ifndef OBJ_VMS static void close_output_file (void) { output_file_close (out_file_name); + if (!keep_it) + unlink_if_ordinary (out_file_name); } -#endif /* The interface between the macro code and gas expression handling. */ @@ -975,10 +1037,13 @@ static void perform_an_assembly_pass (int argc, char ** argv) { int saw_a_file = 0; +#ifndef OBJ_MACH_O flagword applicable; +#endif need_pass_2 = 0; +#ifndef OBJ_MACH_O /* Create the standard sections, and those the assembler uses internally. */ text_section = subseg_new (TEXT_SECTION_NAME, 0); @@ -995,12 +1060,15 @@ perform_an_assembly_pass (int argc, char ** argv) | SEC_DATA)); bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC); seg_info (bss_section)->bss = 1; +#endif 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); +#ifndef OBJ_MACH_O subseg_set (text_section, 0); +#endif /* This may add symbol table entries, which requires having an open BFD, and sections already created. */ @@ -1032,12 +1100,39 @@ 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; + 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); + 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) { + char ** argv_orig = argv; + int macro_strip_at; - int keep_it; start_time = get_run_time (); @@ -1089,10 +1184,8 @@ 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); @@ -1107,7 +1200,9 @@ main (int argc, char ** argv) PROGRESS (1); output_file_create (out_file_name); - assert (stdoutput != 0); + gas_assert (stdoutput != 0); + + dot_symbol_init (); #ifdef tc_init_after_args tc_init_after_args (); @@ -1115,6 +1210,11 @@ main (int argc, char ** argv) itbl_init (); + dwarf2_init (); + + local_symbol_make (".gasversion.", absolute_section, + BFD_VERSION / 10000UL, &predefined_address_frag); + /* Now that we have fully initialized, and have created the output file, define any symbols requested by --defsym command line arguments. */ @@ -1125,6 +1225,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); @@ -1142,6 +1247,11 @@ main (int argc, char ** argv) md_end (); #endif +#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) @@ -1178,8 +1288,10 @@ main (int argc, char ** argv) if (keep_it) write_object_file (); + fflush (stderr); + #ifndef NO_LISTING - listing_print (listing_filename); + listing_print (listing_filename, argv_orig); #endif if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0) @@ -1188,9 +1300,6 @@ main (int argc, char ** argv) if (had_errors () > 0 && ! flag_always_generate_output) keep_it = 0; - if (!keep_it) - unlink_if_ordinary (out_file_name); - input_scrub_end (); END_PROGRESS (myname);