| File: | src/gnu/usr.bin/binutils-2.17/gas/as.c |
| Warning: | line 804, column 15 Dereference of null pointer (loaded from variable 'optarg') |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* as.c - GAS main program. | |||
| 2 | Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | |||
| 3 | 1999, 2000, 2001, 2002, 2003, 2004, 2005 | |||
| 4 | Free Software Foundation, Inc. | |||
| 5 | ||||
| 6 | This file is part of GAS, the GNU Assembler. | |||
| 7 | ||||
| 8 | GAS is free software; you can redistribute it and/or modify | |||
| 9 | it under the terms of the GNU General Public License as published by | |||
| 10 | the Free Software Foundation; either version 2, or (at your option) | |||
| 11 | any later version. | |||
| 12 | ||||
| 13 | GAS is distributed in the hope that it will be useful, | |||
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| 16 | GNU General Public License for more details. | |||
| 17 | ||||
| 18 | You should have received a copy of the GNU General Public License | |||
| 19 | along with GAS; see the file COPYING. If not, write to the Free | |||
| 20 | Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA | |||
| 21 | 02110-1301, USA. */ | |||
| 22 | ||||
| 23 | /* Main program for AS; a 32-bit assembler of GNU. | |||
| 24 | Understands command arguments. | |||
| 25 | Has a few routines that don't fit in other modules because they | |||
| 26 | are shared. | |||
| 27 | ||||
| 28 | bugs | |||
| 29 | ||||
| 30 | : initialisers | |||
| 31 | Since no-one else says they will support them in future: I | |||
| 32 | don't support them now. */ | |||
| 33 | ||||
| 34 | #include "ansidecl.h" | |||
| 35 | ||||
| 36 | #define COMMON | |||
| 37 | ||||
| 38 | #include "as.h" | |||
| 39 | #include "subsegs.h" | |||
| 40 | #include "output-file.h" | |||
| 41 | #include "sb.h" | |||
| 42 | #include "macro.h" | |||
| 43 | #include "dwarf2dbg.h" | |||
| 44 | #include "dw2gencfi.h" | |||
| 45 | #include "hash.h" | |||
| 46 | #include "bfdver.h" | |||
| 47 | ||||
| 48 | #ifdef HAVE_ITBL_CPU | |||
| 49 | #include "itbl-ops.h" | |||
| 50 | #else | |||
| 51 | #define itbl_parse(itbl_file)1 1 | |||
| 52 | #define itbl_init() | |||
| 53 | #endif | |||
| 54 | ||||
| 55 | #ifdef HAVE_SBRK1 | |||
| 56 | #ifdef NEED_DECLARATION_SBRK | |||
| 57 | extern PTRvoid * sbrk (); | |||
| 58 | #endif | |||
| 59 | #endif | |||
| 60 | ||||
| 61 | #ifdef USING_CGEN | |||
| 62 | /* Perform any cgen specific initialisation for gas. */ | |||
| 63 | extern void gas_cgen_begin (void); | |||
| 64 | #endif | |||
| 65 | ||||
| 66 | /* Keep a record of the itbl files we read in. */ | |||
| 67 | struct itbl_file_list | |||
| 68 | { | |||
| 69 | struct itbl_file_list *next; | |||
| 70 | char *name; | |||
| 71 | }; | |||
| 72 | ||||
| 73 | /* We build a list of defsyms as we read the options, and then define | |||
| 74 | them after we have initialized everything. */ | |||
| 75 | struct defsym_list | |||
| 76 | { | |||
| 77 | struct defsym_list *next; | |||
| 78 | char *name; | |||
| 79 | valueT value; | |||
| 80 | }; | |||
| 81 | ||||
| 82 | ||||
| 83 | /* True if a listing is wanted. */ | |||
| 84 | int listing; | |||
| 85 | ||||
| 86 | /* Type of debugging to generate. */ | |||
| 87 | enum debug_info_type debug_type = DEBUG_UNSPECIFIED; | |||
| 88 | int use_gnu_debug_info_extensions = 0; | |||
| 89 | ||||
| 90 | #ifndef MD_DEBUG_FORMAT_SELECTOR((void*)0) | |||
| 91 | #define MD_DEBUG_FORMAT_SELECTOR((void*)0) NULL((void*)0) | |||
| 92 | #endif | |||
| 93 | static enum debug_info_type (*md_debug_format_selector) (int *) = MD_DEBUG_FORMAT_SELECTOR((void*)0); | |||
| 94 | ||||
| 95 | /* Maximum level of macro nesting. */ | |||
| 96 | int max_macro_nest = 100; | |||
| 97 | ||||
| 98 | /* argv[0] */ | |||
| 99 | static char * myname; | |||
| 100 | ||||
| 101 | /* The default obstack chunk size. If we set this to zero, the | |||
| 102 | obstack code will use whatever will fit in a 4096 byte block. */ | |||
| 103 | int chunksize = 0; | |||
| 104 | ||||
| 105 | /* To monitor memory allocation more effectively, make this non-zero. | |||
| 106 | Then the chunk sizes for gas and bfd will be reduced. */ | |||
| 107 | int debug_memory = 0; | |||
| 108 | ||||
| 109 | /* Enable verbose mode. */ | |||
| 110 | int verbose = 0; | |||
| 111 | ||||
| 112 | segT reg_section; | |||
| 113 | segT expr_section; | |||
| 114 | segT text_section; | |||
| 115 | segT data_section; | |||
| 116 | segT bss_section; | |||
| 117 | ||||
| 118 | /* Name of listing file. */ | |||
| 119 | static char *listing_filename = NULL((void*)0); | |||
| 120 | ||||
| 121 | static struct defsym_list *defsyms; | |||
| 122 | ||||
| 123 | static struct itbl_file_list *itbl_files; | |||
| 124 | ||||
| 125 | static long start_time; | |||
| 126 | ||||
| 127 | static int flag_macro_alternate; | |||
| 128 | ||||
| 129 | ||||
| 130 | #ifdef USE_EMULATIONS | |||
| 131 | #define EMULATION_ENVIRON "AS_EMULATION" | |||
| 132 | ||||
| 133 | extern struct emulation mipsbelf, mipslelf, mipself; | |||
| 134 | extern struct emulation mipsbecoff, mipslecoff, mipsecoff; | |||
| 135 | extern struct emulation i386coff, i386elf, i386aout; | |||
| 136 | extern struct emulation crisaout, criself; | |||
| 137 | ||||
| 138 | static struct emulation *const emulations[] = { EMULATIONS&i386elf, }; | |||
| 139 | static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]); | |||
| 140 | ||||
| 141 | static void | |||
| 142 | select_emulation_mode (int argc, char **argv) | |||
| 143 | { | |||
| 144 | int i; | |||
| 145 | char *p, *em = 0; | |||
| 146 | ||||
| 147 | for (i = 1; i < argc; i++) | |||
| 148 | if (!strncmp ("--em", argv[i], 4)) | |||
| 149 | break; | |||
| 150 | ||||
| 151 | if (i == argc) | |||
| 152 | goto do_default; | |||
| 153 | ||||
| 154 | p = strchr (argv[i], '='); | |||
| 155 | if (p) | |||
| 156 | p++; | |||
| 157 | else | |||
| 158 | p = argv[i + 1]; | |||
| 159 | ||||
| 160 | if (!p || !*p) | |||
| 161 | as_fatal (_("missing emulation mode name")("missing emulation mode name")); | |||
| 162 | em = p; | |||
| 163 | ||||
| 164 | do_default: | |||
| 165 | if (em == 0) | |||
| 166 | em = getenv (EMULATION_ENVIRON); | |||
| 167 | if (em == 0) | |||
| 168 | em = DEFAULT_EMULATION"i386elf"; | |||
| 169 | ||||
| 170 | if (em) | |||
| 171 | { | |||
| 172 | for (i = 0; i < n_emulations; i++) | |||
| 173 | if (!strcmp (emulations[i]->name, em)) | |||
| 174 | break; | |||
| 175 | if (i == n_emulations) | |||
| 176 | as_fatal (_("unrecognized emulation name `%s'")("unrecognized emulation name `%s'"), em); | |||
| 177 | this_emulation = emulations[i]; | |||
| 178 | } | |||
| 179 | else | |||
| 180 | this_emulation = emulations[0]; | |||
| 181 | ||||
| 182 | this_emulation->init (); | |||
| 183 | } | |||
| 184 | ||||
| 185 | const char * | |||
| 186 | default_emul_bfd_name (void) | |||
| 187 | { | |||
| 188 | abort ()as_abort ("/usr/src/gnu/usr.bin/binutils-2.17/gas/as.c", 188, __PRETTY_FUNCTION__); | |||
| 189 | return NULL((void*)0); | |||
| 190 | } | |||
| 191 | ||||
| 192 | void | |||
| 193 | common_emul_init (void) | |||
| 194 | { | |||
| 195 | this_format = this_emulation->format; | |||
| 196 | ||||
| 197 | if (this_emulation->leading_underscore == 2) | |||
| 198 | this_emulation->leading_underscore = this_format->dfl_leading_underscore; | |||
| 199 | ||||
| 200 | if (this_emulation->default_endian != 2) | |||
| 201 | target_big_endian = this_emulation->default_endian; | |||
| 202 | ||||
| 203 | if (this_emulation->fake_label_name == 0) | |||
| 204 | { | |||
| 205 | if (this_emulation->leading_underscore) | |||
| 206 | this_emulation->fake_label_name = "L0\001"; | |||
| 207 | else | |||
| 208 | /* What other parameters should we test? */ | |||
| 209 | this_emulation->fake_label_name = ".L0\001"; | |||
| 210 | } | |||
| 211 | } | |||
| 212 | #endif | |||
| 213 | ||||
| 214 | void | |||
| 215 | print_version_id (void) | |||
| 216 | { | |||
| 217 | static int printed; | |||
| 218 | ||||
| 219 | if (printed) | |||
| 220 | return; | |||
| 221 | printed = 1; | |||
| 222 | ||||
| 223 | fprintf (stderr(&__sF[2]), _("GNU assembler version %s (%s) using BFD version %s\n")("GNU assembler version %s (%s) using BFD version %s\n"), | |||
| 224 | VERSION"2.17", TARGET_ALIAS"amd64-unknown-openbsd7.0", BFD_VERSION_STRING"2.17"); | |||
| 225 | } | |||
| 226 | ||||
| 227 | static void | |||
| 228 | show_usage (FILE * stream) | |||
| 229 | { | |||
| 230 | fprintf (stream, _("Usage: %s [option...] [asmfile...]\n")("Usage: %s [option...] [asmfile...]\n"), myname); | |||
| 231 | ||||
| 232 | fprintf (stream, _("\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 233 | Options:\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 234 | -a[sub-option...] turn on listings\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 235 | Sub-options [default hls]:\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 236 | c omit false conditionals\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 237 | d omit debugging directives\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 238 | h include high-level source\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 239 | l include assembly\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 240 | m include macro expansions\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 241 | n omit forms processing\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 242 | s include symbols\n\("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" ) | |||
| 243 | =FILE list to FILE (must be last sub-option)\n")("Options:\n -a[sub-option...] turn on listings\n Sub-options [default hls]:\n c omit false conditionals\n d omit debugging directives\n h include high-level source\n l include assembly\n m include macro expansions\n n omit forms processing\n s include symbols\n =FILE list to FILE (must be last sub-option)\n" )); | |||
| 244 | ||||
| 245 | fprintf (stream, _("\(" --alternate initially turn on alternate macro syntax\n" ) | |||
| 246 | --alternate initially turn on alternate macro syntax\n")(" --alternate initially turn on alternate macro syntax\n" )); | |||
| 247 | fprintf (stream, _("\(" -D produce assembler debugging messages\n" ) | |||
| 248 | -D produce assembler debugging messages\n")(" -D produce assembler debugging messages\n" )); | |||
| 249 | fprintf (stream, _("\(" --defsym SYM=VAL define symbol SYM to given value\n" ) | |||
| 250 | --defsym SYM=VAL define symbol SYM to given value\n")(" --defsym SYM=VAL define symbol SYM to given value\n" )); | |||
| 251 | #ifdef USE_EMULATIONS | |||
| 252 | { | |||
| 253 | int i; | |||
| 254 | char *def_em; | |||
| 255 | ||||
| 256 | fprintf (stream, "\ | |||
| 257 | --em=["); | |||
| 258 | for (i = 0; i < n_emulations - 1; i++) | |||
| 259 | fprintf (stream, "%s | ", emulations[i]->name); | |||
| 260 | fprintf (stream, "%s]\n", emulations[i]->name); | |||
| 261 | ||||
| 262 | def_em = getenv (EMULATION_ENVIRON); | |||
| 263 | if (!def_em) | |||
| 264 | def_em = DEFAULT_EMULATION"i386elf"; | |||
| 265 | fprintf (stream, _("\(" emulate output (default %s)\n") | |||
| 266 | emulate output (default %s)\n")(" emulate output (default %s)\n"), def_em); | |||
| 267 | } | |||
| 268 | #endif | |||
| 269 | #if defined OBJ_ELF1 || defined OBJ_MAYBE_ELF | |||
| 270 | fprintf (stream, _("\(" --execstack require executable stack for this object\n" ) | |||
| 271 | --execstack require executable stack for this object\n")(" --execstack require executable stack for this object\n" )); | |||
| 272 | fprintf (stream, _("\(" --noexecstack don't require executable stack for this object\n" ) | |||
| 273 | --noexecstack don't require executable stack for this object\n")(" --noexecstack don't require executable stack for this object\n" )); | |||
| 274 | #endif | |||
| 275 | fprintf (stream, _("\(" -f skip whitespace and comment preprocessing\n" ) | |||
| 276 | -f skip whitespace and comment preprocessing\n")(" -f skip whitespace and comment preprocessing\n" )); | |||
| 277 | fprintf (stream, _("\(" -g --gen-debug generate debugging information\n" ) | |||
| 278 | -g --gen-debug generate debugging information\n")(" -g --gen-debug generate debugging information\n" )); | |||
| 279 | fprintf (stream, _("\(" --gstabs generate STABS debugging information\n" ) | |||
| 280 | --gstabs generate STABS debugging information\n")(" --gstabs generate STABS debugging information\n" )); | |||
| 281 | fprintf (stream, _("\(" --gstabs+ generate STABS debug info with GNU extensions\n" ) | |||
| 282 | --gstabs+ generate STABS debug info with GNU extensions\n")(" --gstabs+ generate STABS debug info with GNU extensions\n" )); | |||
| 283 | fprintf (stream, _("\(" --gdwarf-2 generate DWARF2 debugging information\n" ) | |||
| 284 | --gdwarf-2 generate DWARF2 debugging information\n")(" --gdwarf-2 generate DWARF2 debugging information\n" )); | |||
| 285 | fprintf (stream, _("\(" --hash-size=<value> set the hash table size close to <value>\n" ) | |||
| 286 | --hash-size=<value> set the hash table size close to <value>\n")(" --hash-size=<value> set the hash table size close to <value>\n" )); | |||
| 287 | fprintf (stream, _("\(" --help show this message and exit\n") | |||
| 288 | --help show this message and exit\n")(" --help show this message and exit\n")); | |||
| 289 | fprintf (stream, _("\(" --target-help show target specific options\n") | |||
| 290 | --target-help show target specific options\n")(" --target-help show target specific options\n")); | |||
| 291 | fprintf (stream, _("\(" -I DIR add DIR to search list for .include directives\n" ) | |||
| 292 | -I DIR add DIR to search list for .include directives\n")(" -I DIR add DIR to search list for .include directives\n" )); | |||
| 293 | fprintf (stream, _("\(" -J don't warn about signed overflow\n" ) | |||
| 294 | -J don't warn about signed overflow\n")(" -J don't warn about signed overflow\n" )); | |||
| 295 | fprintf (stream, _("\(" -K warn when differences altered for long displacements\n" ) | |||
| 296 | -K warn when differences altered for long displacements\n")(" -K warn when differences altered for long displacements\n" )); | |||
| 297 | fprintf (stream, _("\(" -L,--keep-locals keep local symbols (e.g. starting with `L')\n" ) | |||
| 298 | -L,--keep-locals keep local symbols (e.g. starting with `L')\n")(" -L,--keep-locals keep local symbols (e.g. starting with `L')\n" )); | |||
| 299 | fprintf (stream, _("\(" -M,--mri assemble in MRI compatibility mode\n" ) | |||
| 300 | -M,--mri assemble in MRI compatibility mode\n")(" -M,--mri assemble in MRI compatibility mode\n" )); | |||
| 301 | fprintf (stream, _("\(" --MD FILE write dependency information in FILE (default none)\n" ) | |||
| 302 | --MD FILE write dependency information in FILE (default none)\n")(" --MD FILE write dependency information in FILE (default none)\n" )); | |||
| 303 | fprintf (stream, _("\(" -nocpp ignored\n") | |||
| 304 | -nocpp ignored\n")(" -nocpp ignored\n")); | |||
| 305 | fprintf (stream, _("\(" -o OBJFILE name the object-file output OBJFILE (default a.out)\n" ) | |||
| 306 | -o OBJFILE name the object-file output OBJFILE (default a.out)\n")(" -o OBJFILE name the object-file output OBJFILE (default a.out)\n" )); | |||
| 307 | fprintf (stream, _("\(" -R fold data section into text section\n" ) | |||
| 308 | -R fold data section into text section\n")(" -R fold data section into text section\n" )); | |||
| 309 | fprintf (stream, _("\(" --reduce-memory-overheads \n prefer smaller memory use at the cost of longer\n assembly times\n" ) | |||
| 310 | --reduce-memory-overheads \n\(" --reduce-memory-overheads \n prefer smaller memory use at the cost of longer\n assembly times\n" ) | |||
| 311 | prefer smaller memory use at the cost of longer\n\(" --reduce-memory-overheads \n prefer smaller memory use at the cost of longer\n assembly times\n" ) | |||
| 312 | assembly times\n")(" --reduce-memory-overheads \n prefer smaller memory use at the cost of longer\n assembly times\n" )); | |||
| 313 | fprintf (stream, _("\(" --statistics print various measured statistics from execution\n" ) | |||
| 314 | --statistics print various measured statistics from execution\n")(" --statistics print various measured statistics from execution\n" )); | |||
| 315 | fprintf (stream, _("\(" --strip-local-absolute strip local absolute symbols\n") | |||
| 316 | --strip-local-absolute strip local absolute symbols\n")(" --strip-local-absolute strip local absolute symbols\n")); | |||
| 317 | fprintf (stream, _("\(" --traditional-format Use same format as native assembler when possible\n" ) | |||
| 318 | --traditional-format Use same format as native assembler when possible\n")(" --traditional-format Use same format as native assembler when possible\n" )); | |||
| 319 | fprintf (stream, _("\(" --version print assembler version number and exit\n" ) | |||
| 320 | --version print assembler version number and exit\n")(" --version print assembler version number and exit\n" )); | |||
| 321 | fprintf (stream, _("\(" -W --no-warn suppress warnings\n") | |||
| 322 | -W --no-warn suppress warnings\n")(" -W --no-warn suppress warnings\n")); | |||
| 323 | fprintf (stream, _("\(" --warn don't suppress warnings\n") | |||
| 324 | --warn don't suppress warnings\n")(" --warn don't suppress warnings\n")); | |||
| 325 | fprintf (stream, _("\(" --fatal-warnings treat warnings as errors\n") | |||
| 326 | --fatal-warnings treat warnings as errors\n")(" --fatal-warnings treat warnings as errors\n")); | |||
| 327 | fprintf (stream, _("\(" --itbl INSTTBL extend instruction set to include instructions\n matching the specifications defined in file INSTTBL\n" ) | |||
| 328 | --itbl INSTTBL extend instruction set to include instructions\n\(" --itbl INSTTBL extend instruction set to include instructions\n matching the specifications defined in file INSTTBL\n" ) | |||
| 329 | matching the specifications defined in file INSTTBL\n")(" --itbl INSTTBL extend instruction set to include instructions\n matching the specifications defined in file INSTTBL\n" )); | |||
| 330 | fprintf (stream, _("\(" -w ignored\n") | |||
| 331 | -w ignored\n")(" -w ignored\n")); | |||
| 332 | fprintf (stream, _("\(" -X ignored\n") | |||
| 333 | -X ignored\n")(" -X ignored\n")); | |||
| 334 | fprintf (stream, _("\(" -Z generate object file even after errors\n" ) | |||
| 335 | -Z generate object file even after errors\n")(" -Z generate object file even after errors\n" )); | |||
| 336 | fprintf (stream, _("\(" --listing-lhs-width set the width in words of the output data column of\n the listing\n" ) | |||
| 337 | --listing-lhs-width set the width in words of the output data column of\n\(" --listing-lhs-width set the width in words of the output data column of\n the listing\n" ) | |||
| 338 | the listing\n")(" --listing-lhs-width set the width in words of the output data column of\n the listing\n" )); | |||
| 339 | fprintf (stream, _("\(" --listing-lhs-width2 set the width in words of the continuation lines\n of the output data column; ignored if smaller than\n the width of the first line\n" ) | |||
| 340 | --listing-lhs-width2 set the width in words of the continuation lines\n\(" --listing-lhs-width2 set the width in words of the continuation lines\n of the output data column; ignored if smaller than\n the width of the first line\n" ) | |||
| 341 | of the output data column; ignored if smaller than\n\(" --listing-lhs-width2 set the width in words of the continuation lines\n of the output data column; ignored if smaller than\n the width of the first line\n" ) | |||
| 342 | the width of the first line\n")(" --listing-lhs-width2 set the width in words of the continuation lines\n of the output data column; ignored if smaller than\n the width of the first line\n" )); | |||
| 343 | fprintf (stream, _("\(" --listing-rhs-width set the max width in characters of the lines from\n the source file\n" ) | |||
| 344 | --listing-rhs-width set the max width in characters of the lines from\n\(" --listing-rhs-width set the max width in characters of the lines from\n the source file\n" ) | |||
| 345 | the source file\n")(" --listing-rhs-width set the max width in characters of the lines from\n the source file\n" )); | |||
| 346 | fprintf (stream, _("\(" --listing-cont-lines set the maximum number of continuation lines used\n for the output data column of the listing\n" ) | |||
| 347 | --listing-cont-lines set the maximum number of continuation lines used\n\(" --listing-cont-lines set the maximum number of continuation lines used\n for the output data column of the listing\n" ) | |||
| 348 | for the output data column of the listing\n")(" --listing-cont-lines set the maximum number of continuation lines used\n for the output data column of the listing\n" )); | |||
| 349 | fprintf (stream, _("\(" @FILE read options from FILE\n") | |||
| 350 | @FILE read options from FILE\n")(" @FILE read options from FILE\n")); | |||
| 351 | ||||
| 352 | md_show_usage (stream); | |||
| 353 | ||||
| 354 | fputc ('\n', stream); | |||
| 355 | fprintf (stream, _("Report bugs to %s\n")("Report bugs to %s\n"), REPORT_BUGS_TO"<URL:http://www.sourceware.org/bugzilla/>"); | |||
| 356 | } | |||
| 357 | ||||
| 358 | /* Since it is easy to do here we interpret the special arg "-" | |||
| 359 | to mean "use stdin" and we set that argv[] pointing to "". | |||
| 360 | After we have munged argv[], the only things left are source file | |||
| 361 | name(s) and ""(s) denoting stdin. These file names are used | |||
| 362 | (perhaps more than once) later. | |||
| 363 | ||||
| 364 | check for new machine-dep cmdline options in | |||
| 365 | md_parse_option definitions in config/tc-*.c. */ | |||
| 366 | ||||
| 367 | static void | |||
| 368 | parse_args (int * pargc, char *** pargv) | |||
| 369 | { | |||
| 370 | int old_argc; | |||
| 371 | int new_argc; | |||
| 372 | char ** old_argv; | |||
| 373 | char ** new_argv; | |||
| 374 | /* Starting the short option string with '-' is for programs that | |||
| 375 | expect options and other ARGV-elements in any order and that care about | |||
| 376 | the ordering of the two. We describe each non-option ARGV-element | |||
| 377 | as if it were the argument of an option with character code 1. */ | |||
| 378 | char *shortopts; | |||
| 379 | extern const char *md_shortopts; | |||
| 380 | static const char std_shortopts[] = | |||
| 381 | { | |||
| 382 | '-', 'J', | |||
| 383 | #ifndef WORKING_DOT_WORD | |||
| 384 | /* -K is not meaningful if .word is not being hacked. */ | |||
| 385 | 'K', | |||
| 386 | #endif | |||
| 387 | 'L', 'M', 'R', 'W', 'Z', 'a', ':', ':', 'D', 'f', 'g', ':',':', 'I', ':', 'o', ':', | |||
| 388 | #ifndef VMS | |||
| 389 | /* -v takes an argument on VMS, so we don't make it a generic | |||
| 390 | option. */ | |||
| 391 | 'v', | |||
| 392 | #endif | |||
| 393 | 'w', 'X', | |||
| 394 | /* New option for extending instruction set (see also --itbl below). */ | |||
| 395 | 't', ':', | |||
| 396 | '\0' | |||
| 397 | }; | |||
| 398 | struct option *longopts; | |||
| 399 | extern struct option md_longopts[]; | |||
| 400 | extern size_t md_longopts_size; | |||
| 401 | /* Codes used for the long options with no short synonyms. */ | |||
| 402 | enum option_values | |||
| 403 | { | |||
| 404 | OPTION_HELP = OPTION_STD_BASE150, | |||
| 405 | OPTION_NOCPP, | |||
| 406 | OPTION_STATISTICS, | |||
| 407 | OPTION_VERSION, | |||
| 408 | OPTION_DUMPCONFIG, | |||
| 409 | OPTION_VERBOSE, | |||
| 410 | OPTION_EMULATION, | |||
| 411 | OPTION_DEFSYM, | |||
| 412 | OPTION_INSTTBL, | |||
| 413 | OPTION_LISTING_LHS_WIDTH, | |||
| 414 | OPTION_LISTING_LHS_WIDTH2, | |||
| 415 | OPTION_LISTING_RHS_WIDTH, | |||
| 416 | OPTION_LISTING_CONT_LINES, | |||
| 417 | OPTION_DEPFILE, | |||
| 418 | OPTION_GSTABS, | |||
| 419 | OPTION_GSTABS_PLUS, | |||
| 420 | OPTION_GDWARF2, | |||
| 421 | OPTION_STRIP_LOCAL_ABSOLUTE, | |||
| 422 | OPTION_TRADITIONAL_FORMAT, | |||
| 423 | OPTION_WARN, | |||
| 424 | OPTION_TARGET_HELP, | |||
| 425 | OPTION_EXECSTACK, | |||
| 426 | OPTION_NOEXECSTACK, | |||
| 427 | OPTION_ALTERNATE, | |||
| 428 | OPTION_AL, | |||
| 429 | OPTION_HASH_TABLE_SIZE, | |||
| 430 | OPTION_REDUCE_MEMORY_OVERHEADS, | |||
| 431 | OPTION_WARN_FATAL | |||
| 432 | /* When you add options here, check that they do | |||
| 433 | not collide with OPTION_MD_BASE. See as.h. */ | |||
| 434 | }; | |||
| 435 | ||||
| 436 | static const struct option std_longopts[] = | |||
| 437 | { | |||
| 438 | /* Note: commas are placed at the start of the line rather than | |||
| 439 | the end of the preceeding line so that it is simpler to | |||
| 440 | selectively add and remove lines from this list. */ | |||
| 441 | {"alternate", no_argument0, NULL((void*)0), OPTION_ALTERNATE} | |||
| 442 | /* The entry for "a" is here to prevent getopt_long_only() from | |||
| 443 | considering that -a is an abbreviation for --alternate. This is | |||
| 444 | necessary because -a=<FILE> is a valid switch but getopt would | |||
| 445 | normally reject it since --alternate does not take an argument. */ | |||
| 446 | ,{"a", optional_argument2, NULL((void*)0), 'a'} | |||
| 447 | /* Handle -al=<FILE>. */ | |||
| 448 | ,{"al", optional_argument2, NULL((void*)0), OPTION_AL} | |||
| 449 | ,{"defsym", required_argument1, NULL((void*)0), OPTION_DEFSYM} | |||
| 450 | ,{"dump-config", no_argument0, NULL((void*)0), OPTION_DUMPCONFIG} | |||
| 451 | ,{"emulation", required_argument1, NULL((void*)0), OPTION_EMULATION} | |||
| 452 | #if defined OBJ_ELF1 || defined OBJ_MAYBE_ELF | |||
| 453 | ,{"execstack", no_argument0, NULL((void*)0), OPTION_EXECSTACK} | |||
| 454 | ,{"noexecstack", no_argument0, NULL((void*)0), OPTION_NOEXECSTACK} | |||
| 455 | #endif | |||
| 456 | ,{"fatal-warnings", no_argument0, NULL((void*)0), OPTION_WARN_FATAL} | |||
| 457 | ,{"gdwarf-2", no_argument0, NULL((void*)0), OPTION_GDWARF2} | |||
| 458 | /* GCC uses --gdwarf-2 but GAS uses to use --gdwarf2, | |||
| 459 | so we keep it here for backwards compatibility. */ | |||
| 460 | ,{"gdwarf2", no_argument0, NULL((void*)0), OPTION_GDWARF2} | |||
| 461 | ,{"gen-debug", no_argument0, NULL((void*)0), 'g'} | |||
| 462 | ,{"gstabs", no_argument0, NULL((void*)0), OPTION_GSTABS} | |||
| 463 | ,{"gstabs+", no_argument0, NULL((void*)0), OPTION_GSTABS_PLUS} | |||
| 464 | ,{"hash-size", required_argument1, NULL((void*)0), OPTION_HASH_TABLE_SIZE} | |||
| 465 | ,{"help", no_argument0, NULL((void*)0), OPTION_HELP} | |||
| 466 | /* New option for extending instruction set (see also -t above). | |||
| 467 | The "-t file" or "--itbl file" option extends the basic set of | |||
| 468 | valid instructions by reading "file", a text file containing a | |||
| 469 | list of instruction formats. The additional opcodes and their | |||
| 470 | formats are added to the built-in set of instructions, and | |||
| 471 | mnemonics for new registers may also be defined. */ | |||
| 472 | ,{"itbl", required_argument1, NULL((void*)0), OPTION_INSTTBL} | |||
| 473 | /* getopt allows abbreviations, so we do this to stop it from | |||
| 474 | treating -k as an abbreviation for --keep-locals. Some | |||
| 475 | ports use -k to enable PIC assembly. */ | |||
| 476 | ,{"keep-locals", no_argument0, NULL((void*)0), 'L'} | |||
| 477 | ,{"keep-locals", no_argument0, NULL((void*)0), 'L'} | |||
| 478 | ,{"listing-lhs-width", required_argument1, NULL((void*)0), OPTION_LISTING_LHS_WIDTH} | |||
| 479 | ,{"listing-lhs-width2", required_argument1, NULL((void*)0), OPTION_LISTING_LHS_WIDTH2} | |||
| 480 | ,{"listing-rhs-width", required_argument1, NULL((void*)0), OPTION_LISTING_RHS_WIDTH} | |||
| 481 | ,{"listing-cont-lines", required_argument1, NULL((void*)0), OPTION_LISTING_CONT_LINES} | |||
| 482 | ,{"MD", required_argument1, NULL((void*)0), OPTION_DEPFILE} | |||
| 483 | ,{"mri", no_argument0, NULL((void*)0), 'M'} | |||
| 484 | ,{"nocpp", no_argument0, NULL((void*)0), OPTION_NOCPP} | |||
| 485 | ,{"no-warn", no_argument0, NULL((void*)0), 'W'} | |||
| 486 | ,{"reduce-memory-overheads", no_argument0, NULL((void*)0), OPTION_REDUCE_MEMORY_OVERHEADS} | |||
| 487 | ,{"statistics", no_argument0, NULL((void*)0), OPTION_STATISTICS} | |||
| 488 | ,{"strip-local-absolute", no_argument0, NULL((void*)0), OPTION_STRIP_LOCAL_ABSOLUTE} | |||
| 489 | ,{"version", no_argument0, NULL((void*)0), OPTION_VERSION} | |||
| 490 | ,{"verbose", no_argument0, NULL((void*)0), OPTION_VERBOSE} | |||
| 491 | ,{"target-help", no_argument0, NULL((void*)0), OPTION_TARGET_HELP} | |||
| 492 | ,{"traditional-format", no_argument0, NULL((void*)0), OPTION_TRADITIONAL_FORMAT} | |||
| 493 | ,{"warn", no_argument0, NULL((void*)0), OPTION_WARN} | |||
| 494 | }; | |||
| 495 | ||||
| 496 | /* Construct the option lists from the standard list and the target | |||
| 497 | dependent list. Include space for an extra NULL option and | |||
| 498 | always NULL terminate. */ | |||
| 499 | shortopts = concat (std_shortopts, md_shortopts, (char *) NULL((void*)0)); | |||
| 500 | longopts = xmalloc (sizeof (std_longopts) + md_longopts_size + sizeof (struct option)); | |||
| 501 | memcpy (longopts, std_longopts, sizeof (std_longopts)); | |||
| 502 | memcpy (((char *) longopts) + sizeof (std_longopts), md_longopts, md_longopts_size); | |||
| 503 | memset (((char *) longopts) + sizeof (std_longopts) + md_longopts_size, | |||
| 504 | 0, sizeof (struct option)); | |||
| 505 | ||||
| 506 | /* Make a local copy of the old argv. */ | |||
| 507 | old_argc = *pargc; | |||
| 508 | old_argv = *pargv; | |||
| 509 | ||||
| 510 | /* Initialize a new argv that contains no options. */ | |||
| 511 | new_argv = xmalloc (sizeof (char *) * (old_argc + 1)); | |||
| 512 | new_argv[0] = old_argv[0]; | |||
| 513 | new_argc = 1; | |||
| 514 | new_argv[new_argc] = NULL((void*)0); | |||
| 515 | ||||
| 516 | while (1) | |||
| ||||
| 517 | { | |||
| 518 | /* getopt_long_only is like getopt_long, but '-' as well as '--' can | |||
| 519 | indicate a long option. */ | |||
| 520 | int longind; | |||
| 521 | int optc = getopt_long_only (old_argc, old_argv, shortopts, longopts, | |||
| 522 | &longind); | |||
| 523 | ||||
| 524 | if (optc == -1) | |||
| 525 | break; | |||
| 526 | ||||
| 527 | switch (optc) | |||
| 528 | { | |||
| 529 | default: | |||
| 530 | /* md_parse_option should return 1 if it recognizes optc, | |||
| 531 | 0 if not. */ | |||
| 532 | if (md_parse_option (optc, optarg) != 0) | |||
| 533 | break; | |||
| 534 | /* `-v' isn't included in the general short_opts list, so check for | |||
| 535 | it explicitly here before deciding we've gotten a bad argument. */ | |||
| 536 | if (optc == 'v') | |||
| 537 | { | |||
| 538 | #ifdef VMS | |||
| 539 | /* Telling getopt to treat -v's value as optional can result | |||
| 540 | in it picking up a following filename argument here. The | |||
| 541 | VMS code in md_parse_option can return 0 in that case, | |||
| 542 | but it has no way of pushing the filename argument back. */ | |||
| 543 | if (optarg && *optarg) | |||
| 544 | new_argv[new_argc++] = optarg, new_argv[new_argc] = NULL((void*)0); | |||
| 545 | else | |||
| 546 | #else | |||
| 547 | case 'v': | |||
| 548 | #endif | |||
| 549 | case OPTION_VERBOSE: | |||
| 550 | print_version_id (); | |||
| 551 | verbose = 1; | |||
| 552 | break; | |||
| 553 | } | |||
| 554 | else | |||
| 555 | as_bad (_("unrecognized option -%c%s")("unrecognized option -%c%s"), optc, optarg ? optarg : ""); | |||
| 556 | /* Fall through. */ | |||
| 557 | ||||
| 558 | case '?': | |||
| 559 | exit (EXIT_FAILURE1); | |||
| 560 | ||||
| 561 | case 1: /* File name. */ | |||
| 562 | if (!strcmp (optarg, "-")) | |||
| 563 | optarg = ""; | |||
| 564 | new_argv[new_argc++] = optarg; | |||
| 565 | new_argv[new_argc] = NULL((void*)0); | |||
| 566 | break; | |||
| 567 | ||||
| 568 | case OPTION_TARGET_HELP: | |||
| 569 | md_show_usage (stdout(&__sF[1])); | |||
| 570 | exit (EXIT_SUCCESS0); | |||
| 571 | ||||
| 572 | case OPTION_HELP: | |||
| 573 | show_usage (stdout(&__sF[1])); | |||
| 574 | exit (EXIT_SUCCESS0); | |||
| 575 | ||||
| 576 | case OPTION_NOCPP: | |||
| 577 | break; | |||
| 578 | ||||
| 579 | case OPTION_STATISTICS: | |||
| 580 | flag_print_statistics = 1; | |||
| 581 | break; | |||
| 582 | ||||
| 583 | case OPTION_STRIP_LOCAL_ABSOLUTE: | |||
| 584 | flag_strip_local_absolute = 1; | |||
| 585 | break; | |||
| 586 | ||||
| 587 | case OPTION_TRADITIONAL_FORMAT: | |||
| 588 | flag_traditional_format = 1; | |||
| 589 | break; | |||
| 590 | ||||
| 591 | case OPTION_VERSION: | |||
| 592 | /* This output is intended to follow the GNU standards document. */ | |||
| 593 | printf (_("GNU assembler %s\n")("GNU assembler %s\n"), BFD_VERSION_STRING"2.17"); | |||
| 594 | printf (_("Copyright 2005 Free Software Foundation, Inc.\n")("Copyright 2005 Free Software Foundation, Inc.\n")); | |||
| 595 | printf (_("\("This program is free software; you may redistribute it under the terms of\nthe GNU General Public License. This program has absolutely no warranty.\n" ) | |||
| 596 | This program is free software; you may redistribute it under the terms of\n\("This program is free software; you may redistribute it under the terms of\nthe GNU General Public License. This program has absolutely no warranty.\n" ) | |||
| 597 | the GNU General Public License. This program has absolutely no warranty.\n")("This program is free software; you may redistribute it under the terms of\nthe GNU General Public License. This program has absolutely no warranty.\n" )); | |||
| 598 | printf (_("This assembler was configured for a target of `%s'.\n")("This assembler was configured for a target of `%s'.\n"), | |||
| 599 | TARGET_ALIAS"amd64-unknown-openbsd7.0"); | |||
| 600 | exit (EXIT_SUCCESS0); | |||
| 601 | ||||
| 602 | case OPTION_EMULATION: | |||
| 603 | #ifdef USE_EMULATIONS | |||
| 604 | if (strcmp (optarg, this_emulation->name)) | |||
| 605 | as_fatal (_("multiple emulation names specified")("multiple emulation names specified")); | |||
| 606 | #else | |||
| 607 | as_fatal (_("emulations not handled in this configuration")("emulations not handled in this configuration")); | |||
| 608 | #endif | |||
| 609 | break; | |||
| 610 | ||||
| 611 | case OPTION_DUMPCONFIG: | |||
| 612 | fprintf (stderr(&__sF[2]), _("alias = %s\n")("alias = %s\n"), TARGET_ALIAS"amd64-unknown-openbsd7.0"); | |||
| 613 | fprintf (stderr(&__sF[2]), _("canonical = %s\n")("canonical = %s\n"), TARGET_CANONICAL"x86_64-unknown-openbsd7.0"); | |||
| 614 | fprintf (stderr(&__sF[2]), _("cpu-type = %s\n")("cpu-type = %s\n"), TARGET_CPU"x86_64"); | |||
| 615 | #ifdef TARGET_OBJ_FORMAT | |||
| 616 | fprintf (stderr(&__sF[2]), _("format = %s\n")("format = %s\n"), TARGET_OBJ_FORMAT); | |||
| 617 | #endif | |||
| 618 | #ifdef TARGET_FORMATi386_target_format () | |||
| 619 | fprintf (stderr(&__sF[2]), _("bfd-target = %s\n")("bfd-target = %s\n"), TARGET_FORMATi386_target_format ()); | |||
| 620 | #endif | |||
| 621 | exit (EXIT_SUCCESS0); | |||
| 622 | ||||
| 623 | case OPTION_DEFSYM: | |||
| 624 | { | |||
| 625 | char *s; | |||
| 626 | valueT i; | |||
| 627 | struct defsym_list *n; | |||
| 628 | ||||
| 629 | for (s = optarg; *s != '\0' && *s != '='; s++) | |||
| 630 | ; | |||
| 631 | if (*s == '\0') | |||
| 632 | as_fatal (_("bad defsym; format is --defsym name=value")("bad defsym; format is --defsym name=value")); | |||
| 633 | *s++ = '\0'; | |||
| 634 | i = bfd_scan_vma (s, (const char **) NULL((void*)0), 0); | |||
| 635 | n = xmalloc (sizeof *n); | |||
| 636 | n->next = defsyms; | |||
| 637 | n->name = optarg; | |||
| 638 | n->value = i; | |||
| 639 | defsyms = n; | |||
| 640 | } | |||
| 641 | break; | |||
| 642 | ||||
| 643 | case OPTION_INSTTBL: | |||
| 644 | case 't': | |||
| 645 | { | |||
| 646 | /* optarg is the name of the file containing the instruction | |||
| 647 | formats, opcodes, register names, etc. */ | |||
| 648 | struct itbl_file_list *n; | |||
| 649 | ||||
| 650 | if (optarg == NULL((void*)0)) | |||
| 651 | { | |||
| 652 | as_warn (_("no file name following -t option")("no file name following -t option")); | |||
| 653 | break; | |||
| 654 | } | |||
| 655 | ||||
| 656 | n = xmalloc (sizeof * n); | |||
| 657 | n->next = itbl_files; | |||
| 658 | n->name = optarg; | |||
| 659 | itbl_files = n; | |||
| 660 | ||||
| 661 | /* Parse the file and add the new instructions to our internal | |||
| 662 | table. If multiple instruction tables are specified, the | |||
| 663 | information from this table gets appended onto the existing | |||
| 664 | internal table. */ | |||
| 665 | itbl_files->name = xstrdup (optarg); | |||
| 666 | if (itbl_parse (itbl_files->name)1 != 0) | |||
| 667 | as_fatal (_("failed to read instruction table %s\n")("failed to read instruction table %s\n"), | |||
| 668 | itbl_files->name); | |||
| 669 | } | |||
| 670 | break; | |||
| 671 | ||||
| 672 | case OPTION_DEPFILE: | |||
| 673 | start_dependencies (optarg); | |||
| 674 | break; | |||
| 675 | ||||
| 676 | case 'g': | |||
| 677 | /* Some backends, eg Alpha and Mips, use the -g switch for their | |||
| 678 | own purposes. So we check here for an explicit -g and allow | |||
| 679 | the backend to decide if it wants to process it. */ | |||
| 680 | if ( old_argv[optind - 1][1] == 'g' | |||
| 681 | && md_parse_option (optc, optarg)) | |||
| 682 | continue; | |||
| 683 | ||||
| 684 | if (md_debug_format_selector) | |||
| 685 | debug_type = md_debug_format_selector (& use_gnu_debug_info_extensions); | |||
| 686 | else if (IS_ELF1) | |||
| 687 | debug_type = DEBUG_DWARF2; | |||
| 688 | else | |||
| 689 | debug_type = DEBUG_STABS; | |||
| 690 | break; | |||
| 691 | ||||
| 692 | case OPTION_GSTABS_PLUS: | |||
| 693 | use_gnu_debug_info_extensions = 1; | |||
| 694 | /* Fall through. */ | |||
| 695 | case OPTION_GSTABS: | |||
| 696 | debug_type = DEBUG_STABS; | |||
| 697 | break; | |||
| 698 | ||||
| 699 | case OPTION_GDWARF2: | |||
| 700 | debug_type = DEBUG_DWARF2; | |||
| 701 | break; | |||
| 702 | ||||
| 703 | case 'J': | |||
| 704 | flag_signed_overflow_ok = 1; | |||
| 705 | break; | |||
| 706 | ||||
| 707 | #ifndef WORKING_DOT_WORD | |||
| 708 | case 'K': | |||
| 709 | flag_warn_displacement = 1; | |||
| 710 | break; | |||
| 711 | #endif | |||
| 712 | case 'L': | |||
| 713 | flag_keep_locals = 1; | |||
| 714 | break; | |||
| 715 | ||||
| 716 | case OPTION_LISTING_LHS_WIDTH: | |||
| 717 | listing_lhs_width = atoi (optarg); | |||
| 718 | if (listing_lhs_width_second < listing_lhs_width) | |||
| 719 | listing_lhs_width_second = listing_lhs_width; | |||
| 720 | break; | |||
| 721 | case OPTION_LISTING_LHS_WIDTH2: | |||
| 722 | { | |||
| 723 | int tmp = atoi (optarg); | |||
| 724 | ||||
| 725 | if (tmp > listing_lhs_width) | |||
| 726 | listing_lhs_width_second = tmp; | |||
| 727 | } | |||
| 728 | break; | |||
| 729 | case OPTION_LISTING_RHS_WIDTH: | |||
| 730 | listing_rhs_width = atoi (optarg); | |||
| 731 | break; | |||
| 732 | case OPTION_LISTING_CONT_LINES: | |||
| 733 | listing_lhs_cont_lines = atoi (optarg); | |||
| 734 | break; | |||
| 735 | ||||
| 736 | case 'M': | |||
| 737 | flag_mri = 1; | |||
| 738 | #ifdef TC_M68K | |||
| 739 | flag_m68k_mri0 = 1; | |||
| 740 | #endif | |||
| 741 | break; | |||
| 742 | ||||
| 743 | case 'R': | |||
| 744 | flag_readonly_data_in_text = 1; | |||
| 745 | break; | |||
| 746 | ||||
| 747 | case 'W': | |||
| 748 | flag_no_warnings = 1; | |||
| 749 | break; | |||
| 750 | ||||
| 751 | case OPTION_WARN: | |||
| 752 | flag_no_warnings = 0; | |||
| 753 | flag_fatal_warnings = 0; | |||
| 754 | break; | |||
| 755 | ||||
| 756 | case OPTION_WARN_FATAL: | |||
| 757 | flag_no_warnings = 0; | |||
| 758 | flag_fatal_warnings = 1; | |||
| 759 | break; | |||
| 760 | ||||
| 761 | #if defined OBJ_ELF1 || defined OBJ_MAYBE_ELF | |||
| 762 | case OPTION_EXECSTACK: | |||
| 763 | flag_execstack = 1; | |||
| 764 | flag_noexecstack = 0; | |||
| 765 | break; | |||
| 766 | ||||
| 767 | case OPTION_NOEXECSTACK: | |||
| 768 | flag_noexecstack = 1; | |||
| 769 | flag_execstack = 0; | |||
| 770 | break; | |||
| 771 | #endif | |||
| 772 | case 'Z': | |||
| 773 | flag_always_generate_output = 1; | |||
| 774 | break; | |||
| 775 | ||||
| 776 | case OPTION_AL: | |||
| 777 | listing |= LISTING_LISTING1; | |||
| 778 | if (optarg) | |||
| 779 | listing_filename = xstrdup (optarg); | |||
| 780 | break; | |||
| 781 | ||||
| 782 | case OPTION_ALTERNATE: | |||
| 783 | optarg = old_argv [optind - 1]; | |||
| 784 | while (* optarg == '-') | |||
| 785 | optarg ++; | |||
| 786 | ||||
| 787 | if (strcmp (optarg, "alternate") == 0) | |||
| 788 | { | |||
| 789 | flag_macro_alternate = 1; | |||
| 790 | break; | |||
| 791 | } | |||
| 792 | optarg ++; | |||
| 793 | /* Fall through. */ | |||
| 794 | ||||
| 795 | case 'a': | |||
| 796 | if (optarg
| |||
| 797 | { | |||
| 798 | if (optarg != old_argv[optind] && optarg[-1] == '=') | |||
| 799 | --optarg; | |||
| 800 | ||||
| 801 | if (md_parse_option (optc, optarg) != 0) | |||
| 802 | break; | |||
| 803 | ||||
| 804 | while (*optarg) | |||
| ||||
| 805 | { | |||
| 806 | switch (*optarg) | |||
| 807 | { | |||
| 808 | case 'c': | |||
| 809 | listing |= LISTING_NOCOND32; | |||
| 810 | break; | |||
| 811 | case 'd': | |||
| 812 | listing |= LISTING_NODEBUG16; | |||
| 813 | break; | |||
| 814 | case 'h': | |||
| 815 | listing |= LISTING_HLL8; | |||
| 816 | break; | |||
| 817 | case 'l': | |||
| 818 | listing |= LISTING_LISTING1; | |||
| 819 | break; | |||
| 820 | case 'm': | |||
| 821 | listing |= LISTING_MACEXP64; | |||
| 822 | break; | |||
| 823 | case 'n': | |||
| 824 | listing |= LISTING_NOFORM4; | |||
| 825 | break; | |||
| 826 | case 's': | |||
| 827 | listing |= LISTING_SYMBOLS2; | |||
| 828 | break; | |||
| 829 | case '=': | |||
| 830 | listing_filename = xstrdup (optarg + 1); | |||
| 831 | optarg += strlen (listing_filename); | |||
| 832 | break; | |||
| 833 | default: | |||
| 834 | as_fatal (_("invalid listing option `%c'")("invalid listing option `%c'"), *optarg); | |||
| 835 | break; | |||
| 836 | } | |||
| 837 | optarg++; | |||
| 838 | } | |||
| 839 | } | |||
| 840 | if (!listing) | |||
| 841 | listing = LISTING_DEFAULT(1 | 8 | 2); | |||
| 842 | break; | |||
| 843 | ||||
| 844 | case 'D': | |||
| 845 | /* DEBUG is implemented: it debugs different | |||
| 846 | things from other people's assemblers. */ | |||
| 847 | flag_debug = 1; | |||
| 848 | break; | |||
| 849 | ||||
| 850 | case 'f': | |||
| 851 | flag_no_comments = 1; | |||
| 852 | break; | |||
| 853 | ||||
| 854 | case 'I': | |||
| 855 | { /* Include file directory. */ | |||
| 856 | char *temp = xstrdup (optarg); | |||
| 857 | ||||
| 858 | add_include_dir (temp); | |||
| 859 | break; | |||
| 860 | } | |||
| 861 | ||||
| 862 | case 'o': | |||
| 863 | out_file_name = xstrdup (optarg); | |||
| 864 | break; | |||
| 865 | ||||
| 866 | case 'w': | |||
| 867 | break; | |||
| 868 | ||||
| 869 | case 'X': | |||
| 870 | /* -X means treat warnings as errors. */ | |||
| 871 | break; | |||
| 872 | ||||
| 873 | case OPTION_REDUCE_MEMORY_OVERHEADS: | |||
| 874 | /* The only change we make at the moment is to reduce | |||
| 875 | the size of the hash tables that we use. */ | |||
| 876 | set_gas_hash_table_size (4051); | |||
| 877 | break; | |||
| 878 | ||||
| 879 | case OPTION_HASH_TABLE_SIZE: | |||
| 880 | { | |||
| 881 | unsigned long new_size; | |||
| 882 | ||||
| 883 | new_size = strtoul (optarg, NULL((void*)0), 0); | |||
| 884 | if (new_size) | |||
| 885 | set_gas_hash_table_size (new_size); | |||
| 886 | else | |||
| 887 | as_fatal (_("--hash-size needs a numeric argument")("--hash-size needs a numeric argument")); | |||
| 888 | break; | |||
| 889 | } | |||
| 890 | } | |||
| 891 | } | |||
| 892 | ||||
| 893 | free (shortopts); | |||
| 894 | free (longopts); | |||
| 895 | ||||
| 896 | *pargc = new_argc; | |||
| 897 | *pargv = new_argv; | |||
| 898 | ||||
| 899 | #ifdef md_after_parse_args | |||
| 900 | md_after_parse_args (); | |||
| 901 | #endif | |||
| 902 | } | |||
| 903 | ||||
| 904 | static void | |||
| 905 | dump_statistics (void) | |||
| 906 | { | |||
| 907 | #ifdef HAVE_SBRK1 | |||
| 908 | char *lim = (char *) sbrk (0); | |||
| 909 | #endif | |||
| 910 | long run_time = get_run_time () - start_time; | |||
| 911 | ||||
| 912 | fprintf (stderr(&__sF[2]), _("%s: total time in assembly: %ld.%06ld\n")("%s: total time in assembly: %ld.%06ld\n"), | |||
| 913 | myname, run_time / 1000000, run_time % 1000000); | |||
| 914 | #ifdef HAVE_SBRK1 | |||
| 915 | fprintf (stderr(&__sF[2]), _("%s: data size %ld\n")("%s: data size %ld\n"), | |||
| 916 | myname, (long) (lim - (char *) &environ)); | |||
| 917 | #endif | |||
| 918 | ||||
| 919 | subsegs_print_statistics (stderr(&__sF[2])); | |||
| 920 | write_print_statistics (stderr(&__sF[2])); | |||
| 921 | symbol_print_statistics (stderr(&__sF[2])); | |||
| 922 | read_print_statistics (stderr(&__sF[2])); | |||
| 923 | ||||
| 924 | #ifdef tc_print_statisticsi386_print_statistics | |||
| 925 | tc_print_statisticsi386_print_statistics (stderr(&__sF[2])); | |||
| 926 | #endif | |||
| 927 | ||||
| 928 | #ifdef obj_print_statistics | |||
| 929 | obj_print_statistics (stderr(&__sF[2])); | |||
| 930 | #endif | |||
| 931 | } | |||
| 932 | ||||
| 933 | #ifndef OBJ_VMS | |||
| 934 | static void | |||
| 935 | close_output_file (void) | |||
| 936 | { | |||
| 937 | output_file_close (out_file_name); | |||
| 938 | } | |||
| 939 | #endif | |||
| 940 | ||||
| 941 | /* The interface between the macro code and gas expression handling. */ | |||
| 942 | ||||
| 943 | static int | |||
| 944 | macro_expr (const char *emsg, int idx, sb *in, int *val) | |||
| 945 | { | |||
| 946 | char *hold; | |||
| 947 | expressionS ex; | |||
| 948 | ||||
| 949 | sb_terminate (in); | |||
| 950 | ||||
| 951 | hold = input_line_pointer; | |||
| 952 | input_line_pointer = in->ptr + idx; | |||
| 953 | expression_and_evaluate (&ex)expr (0, &ex, expr_evaluate); | |||
| 954 | idx = input_line_pointer - in->ptr; | |||
| 955 | input_line_pointer = hold; | |||
| 956 | ||||
| 957 | if (ex.X_op != O_constant) | |||
| 958 | as_bad ("%s", emsg); | |||
| 959 | ||||
| 960 | *val = (int) ex.X_add_number; | |||
| 961 | ||||
| 962 | return idx; | |||
| 963 | } | |||
| 964 | ||||
| 965 | /* Here to attempt 1 pass over each input file. | |||
| 966 | We scan argv[*] looking for filenames or exactly "" which is | |||
| 967 | shorthand for stdin. Any argv that is NULL is not a file-name. | |||
| 968 | We set need_pass_2 TRUE if, after this, we still have unresolved | |||
| 969 | expressions of the form (unknown value)+-(unknown value). | |||
| 970 | ||||
| 971 | Note the un*x semantics: there is only 1 logical input file, but it | |||
| 972 | may be a catenation of many 'physical' input files. */ | |||
| 973 | ||||
| 974 | static void | |||
| 975 | perform_an_assembly_pass (int argc, char ** argv) | |||
| 976 | { | |||
| 977 | int saw_a_file = 0; | |||
| 978 | flagword applicable; | |||
| 979 | ||||
| 980 | need_pass_2 = 0; | |||
| 981 | ||||
| 982 | /* Create the standard sections, and those the assembler uses | |||
| 983 | internally. */ | |||
| 984 | text_section = subseg_new (TEXT_SECTION_NAME".text", 0); | |||
| 985 | data_section = subseg_new (DATA_SECTION_NAME".data", 0); | |||
| 986 | bss_section = subseg_new (BSS_SECTION_NAME".bss", 0); | |||
| 987 | /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed | |||
| 988 | to have relocs, otherwise we don't find out in time. */ | |||
| 989 | applicable = bfd_applicable_section_flags (stdoutput)((stdoutput)->xvec->section_flags); | |||
| 990 | bfd_set_section_flags (stdoutput, text_section, | |||
| 991 | applicable & (SEC_ALLOC0x001 | SEC_LOAD0x002 | SEC_RELOC0x004 | |||
| 992 | | SEC_CODE0x010 | SEC_READONLY0x008)); | |||
| 993 | bfd_set_section_flags (stdoutput, data_section, | |||
| 994 | applicable & (SEC_ALLOC0x001 | SEC_LOAD0x002 | SEC_RELOC0x004 | |||
| 995 | | SEC_DATA0x020)); | |||
| 996 | bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC0x001); | |||
| 997 | seg_info (bss_section)->bss = 1; | |||
| 998 | subseg_new (BFD_ABS_SECTION_NAME"*ABS*", 0); | |||
| 999 | subseg_new (BFD_UND_SECTION_NAME"*UND*", 0); | |||
| 1000 | reg_section = subseg_new ("*GAS `reg' section*", 0); | |||
| 1001 | expr_section = subseg_new ("*GAS `expr' section*", 0); | |||
| 1002 | ||||
| 1003 | subseg_set (text_section, 0); | |||
| 1004 | ||||
| 1005 | /* This may add symbol table entries, which requires having an open BFD, | |||
| 1006 | and sections already created. */ | |||
| 1007 | md_begin (); | |||
| 1008 | ||||
| 1009 | #ifdef USING_CGEN | |||
| 1010 | gas_cgen_begin (); | |||
| 1011 | #endif | |||
| 1012 | #ifdef obj_begin | |||
| 1013 | obj_begin ()elf_begin (); | |||
| 1014 | #endif | |||
| 1015 | ||||
| 1016 | /* Skip argv[0]. */ | |||
| 1017 | argv++; | |||
| 1018 | argc--; | |||
| 1019 | ||||
| 1020 | while (argc--) | |||
| 1021 | { | |||
| 1022 | if (*argv) | |||
| 1023 | { /* Is it a file-name argument? */ | |||
| 1024 | PROGRESS (1); | |||
| 1025 | saw_a_file++; | |||
| 1026 | /* argv->"" if stdin desired, else->filename. */ | |||
| 1027 | read_a_source_file (*argv); | |||
| 1028 | } | |||
| 1029 | argv++; /* Completed that argv. */ | |||
| 1030 | } | |||
| 1031 | if (!saw_a_file) | |||
| 1032 | read_a_source_file (""); | |||
| 1033 | } | |||
| 1034 | ||||
| 1035 | ||||
| 1036 | int | |||
| 1037 | main (int argc, char ** argv) | |||
| 1038 | { | |||
| 1039 | int macro_strip_at; | |||
| 1040 | int keep_it; | |||
| 1041 | ||||
| 1042 | start_time = get_run_time (); | |||
| 1043 | ||||
| 1044 | #if defined (HAVE_SETLOCALE1) && defined (HAVE_LC_MESSAGES1) | |||
| 1045 | setlocale (LC_MESSAGES6, ""); | |||
| 1046 | #endif | |||
| 1047 | #if defined (HAVE_SETLOCALE1) | |||
| 1048 | setlocale (LC_CTYPE2, ""); | |||
| 1049 | #endif | |||
| 1050 | bindtextdomain (PACKAGE, LOCALEDIR)while (0); | |||
| 1051 | textdomain (PACKAGE)while (0); | |||
| 1052 | ||||
| 1053 | if (pledge ("stdio rpath wpath cpath fattr", NULL((void*)0)) == -1) | |||
| 1054 | as_bad (_("Failed to pledge")("Failed to pledge")); | |||
| 1055 | ||||
| 1056 | if (debug_memory) | |||
| 1057 | chunksize = 64; | |||
| 1058 | ||||
| 1059 | #ifdef HOST_SPECIAL_INIT | |||
| 1060 | HOST_SPECIAL_INIT (argc, argv); | |||
| 1061 | #endif | |||
| 1062 | ||||
| 1063 | myname = argv[0]; | |||
| 1064 | xmalloc_set_program_name (myname); | |||
| 1065 | ||||
| 1066 | expandargv (&argc, &argv); | |||
| 1067 | ||||
| 1068 | START_PROGRESS (myname, 0); | |||
| 1069 | ||||
| 1070 | #ifndef OBJ_DEFAULT_OUTPUT_FILE_NAME"a.out" | |||
| 1071 | #define OBJ_DEFAULT_OUTPUT_FILE_NAME"a.out" "a.out" | |||
| 1072 | #endif | |||
| 1073 | ||||
| 1074 | out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME"a.out"; | |||
| 1075 | ||||
| 1076 | hex_init (); | |||
| 1077 | bfd_init (); | |||
| 1078 | bfd_set_error_program_name (myname); | |||
| 1079 | ||||
| 1080 | #ifdef USE_EMULATIONS | |||
| 1081 | select_emulation_mode (argc, argv); | |||
| 1082 | #endif | |||
| 1083 | ||||
| 1084 | PROGRESS (1); | |||
| 1085 | /* Call parse_args before any of the init/begin functions | |||
| 1086 | so that switches like --hash-size can be honored. */ | |||
| 1087 | parse_args (&argc, &argv); | |||
| 1088 | symbol_begin (); | |||
| 1089 | frag_init (); | |||
| 1090 | subsegs_begin (); | |||
| 1091 | read_begin (); | |||
| 1092 | input_scrub_begin (); | |||
| 1093 | expr_begin (); | |||
| 1094 | ||||
| 1095 | #ifndef OBJ_VMS /* Does its own file handling. */ | |||
| 1096 | /* It has to be called after dump_statistics (). */ | |||
| 1097 | xatexit (close_output_file); | |||
| 1098 | #endif | |||
| 1099 | ||||
| 1100 | if (flag_print_statistics) | |||
| 1101 | xatexit (dump_statistics); | |||
| 1102 | ||||
| 1103 | macro_strip_at = 0; | |||
| 1104 | #ifdef TC_I960 | |||
| 1105 | macro_strip_at = flag_mri; | |||
| 1106 | #endif | |||
| 1107 | ||||
| 1108 | macro_init (flag_macro_alternate, flag_mri, macro_strip_at, macro_expr); | |||
| 1109 | ||||
| 1110 | PROGRESS (1); | |||
| 1111 | ||||
| 1112 | output_file_create (out_file_name); | |||
| 1113 | assert (stdoutput != 0)((void) ((stdoutput != 0) ? 0 : (as_assert ("/usr/src/gnu/usr.bin/binutils-2.17/gas/as.c" , 1113, __PRETTY_FUNCTION__), 0))); | |||
| 1114 | ||||
| 1115 | #ifdef tc_init_after_args | |||
| 1116 | tc_init_after_args (); | |||
| 1117 | #endif | |||
| 1118 | ||||
| 1119 | itbl_init (); | |||
| 1120 | ||||
| 1121 | /* Now that we have fully initialized, and have created the output | |||
| 1122 | file, define any symbols requested by --defsym command line | |||
| 1123 | arguments. */ | |||
| 1124 | while (defsyms != NULL((void*)0)) | |||
| 1125 | { | |||
| 1126 | symbolS *sym; | |||
| 1127 | struct defsym_list *next; | |||
| 1128 | ||||
| 1129 | sym = symbol_new (defsyms->name, absolute_section((asection *) &bfd_abs_section), defsyms->value, | |||
| 1130 | &zero_address_frag); | |||
| 1131 | symbol_table_insert (sym); | |||
| 1132 | next = defsyms->next; | |||
| 1133 | free (defsyms); | |||
| 1134 | defsyms = next; | |||
| 1135 | } | |||
| 1136 | ||||
| 1137 | PROGRESS (1); | |||
| 1138 | ||||
| 1139 | /* Assemble it. */ | |||
| 1140 | perform_an_assembly_pass (argc, argv); | |||
| 1141 | ||||
| 1142 | cond_finish_check (-1); | |||
| 1143 | ||||
| 1144 | #ifdef md_endi386_elf_emit_arch_note | |||
| 1145 | md_endi386_elf_emit_arch_note (); | |||
| 1146 | #endif | |||
| 1147 | ||||
| 1148 | #if defined OBJ_ELF1 || defined OBJ_MAYBE_ELF | |||
| 1149 | if ((flag_execstack || flag_noexecstack) | |||
| 1150 | && OUTPUT_FLAVORbfd_target_elf_flavour == bfd_target_elf_flavour) | |||
| 1151 | { | |||
| 1152 | segT gnustack; | |||
| 1153 | ||||
| 1154 | gnustack = subseg_new (".note.GNU-stack", 0); | |||
| 1155 | bfd_set_section_flags (stdoutput, gnustack, | |||
| 1156 | SEC_READONLY0x008 | (flag_execstack ? SEC_CODE0x010 : 0)); | |||
| 1157 | ||||
| 1158 | } | |||
| 1159 | #endif | |||
| 1160 | ||||
| 1161 | /* If we've been collecting dwarf2 .debug_line info, either for | |||
| 1162 | assembly debugging or on behalf of the compiler, emit it now. */ | |||
| 1163 | dwarf2_finish (); | |||
| 1164 | ||||
| 1165 | /* If we constructed dwarf2 .eh_frame info, either via .cfi | |||
| 1166 | directives from the user or by the backend, emit it now. */ | |||
| 1167 | cfi_finish (); | |||
| 1168 | ||||
| 1169 | if (seen_at_least_1_file () | |||
| 1170 | && (flag_always_generate_output || had_errors () == 0)) | |||
| 1171 | keep_it = 1; | |||
| 1172 | else | |||
| 1173 | keep_it = 0; | |||
| 1174 | ||||
| 1175 | /* This used to be done at the start of write_object_file in | |||
| 1176 | write.c, but that caused problems when doing listings when | |||
| 1177 | keep_it was zero. This could probably be moved above md_end, but | |||
| 1178 | I didn't want to risk the change. */ | |||
| 1179 | subsegs_finish (); | |||
| 1180 | ||||
| 1181 | if (keep_it) | |||
| 1182 | write_object_file (); | |||
| 1183 | ||||
| 1184 | #ifndef NO_LISTING | |||
| 1185 | listing_print (listing_filename); | |||
| 1186 | #endif | |||
| 1187 | ||||
| 1188 | if (flag_fatal_warnings && had_warnings () > 0 && had_errors () == 0) | |||
| 1189 | as_bad (_("%d warnings, treating warnings as errors")("%d warnings, treating warnings as errors"), had_warnings ()); | |||
| 1190 | ||||
| 1191 | if (had_errors () > 0 && ! flag_always_generate_output) | |||
| 1192 | keep_it = 0; | |||
| 1193 | ||||
| 1194 | if (!keep_it) | |||
| 1195 | unlink_if_ordinary (out_file_name); | |||
| 1196 | ||||
| 1197 | input_scrub_end (); | |||
| 1198 | ||||
| 1199 | END_PROGRESS (myname); | |||
| 1200 | ||||
| 1201 | /* Use xexit instead of return, because under VMS environments they | |||
| 1202 | may not place the same interpretation on the value given. */ | |||
| 1203 | if (had_errors () > 0) | |||
| 1204 | xexit (EXIT_FAILURE1); | |||
| 1205 | ||||
| 1206 | /* Only generate dependency file if assembler was successful. */ | |||
| 1207 | print_dependencies (); | |||
| 1208 | ||||
| 1209 | xexit (EXIT_SUCCESS0); | |||
| 1210 | } |