* sky-vu.c: new file to read/write VU registers
[deliverable/binutils-gdb.git] / gas / as.c
index e5ca102cfde2d5ad98907a715f51e649a5400593..3bbf2d52fa6e94a4185c08d44e3cac36b0b27f23 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -1,5 +1,5 @@
 /* as.c - GAS main program.
 /* as.c - GAS main program.
-   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 1997
+   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 1998
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 #include "output-file.h"
 #include "sb.h"
 #include "macro.h"
 #include "output-file.h"
 #include "sb.h"
 #include "macro.h"
+#ifndef HAVE_ITBL_CPU
+#define itbl_parse(itbl_file) 1
+#define itbl_init()
+#endif
 
 #ifdef HAVE_SBRK
 #ifdef NEED_DECLARATION_SBRK
 
 #ifdef HAVE_SBRK
 #ifdef NEED_DECLARATION_SBRK
@@ -50,6 +54,9 @@ 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 *));
 
 static void perform_an_assembly_pass PARAMS ((int argc, char **argv));
 static int macro_expr PARAMS ((const char *, int, sb *, int *));
 
@@ -57,6 +64,10 @@ int listing;                 /* true if a listing is wanted */
 
 static char *listing_filename = NULL;  /* Name of listing file.  */
 
 
 static char *listing_filename = NULL;  /* Name of listing file.  */
 
+/* Type of debugging to generate.  */
+
+enum debug_info_type debug_type = DEBUG_NONE;
+
 /* Maximum level of macro nesting.  */
 
 int max_macro_nest = 100;
 /* Maximum level of macro nesting.  */
 
 int max_macro_nest = 100;
@@ -67,7 +78,9 @@ segT reg_section, expr_section;
 segT text_section, data_section, bss_section;
 #endif
 
 segT text_section, data_section, bss_section;
 #endif
 
-int chunksize = 5000;
+/* The default obstack chunk size.  If we set this to zero, the
+   obstack code will use whatever will fit in a 4096 byte block.  */
+int chunksize = 0;
 
 /* To monitor memory allocation more effectively, make this non-zero.
    Then the chunk sizes for gas and bfd will be reduced.  */
 
 /* To monitor memory allocation more effectively, make this non-zero.
    Then the chunk sizes for gas and bfd will be reduced.  */
@@ -103,14 +116,14 @@ print_version_id ()
     return;
   printed = 1;
 
     return;
   printed = 1;
 
-  fprintf (stderr, "GNU assembler version %s (%s)", GAS_VERSION, TARGET_ALIAS);
+  fprintf (stderr, "GNU assembler version %s (%s)", VERSION, TARGET_ALIAS);
 #ifdef BFD_ASSEMBLER
   fprintf (stderr, ", using BFD version %s", BFD_VERSION);
 #endif
   fprintf (stderr, "\n");
 }
 
 #ifdef BFD_ASSEMBLER
   fprintf (stderr, ", using BFD version %s", BFD_VERSION);
 #endif
   fprintf (stderr, "\n");
 }
 
-void
+static void
 show_usage (stream)
      FILE *stream;
 {
 show_usage (stream)
      FILE *stream;
 {
@@ -120,9 +133,11 @@ show_usage (stream)
 Options:\n\
 -a[sub-option...]      turn on listings\n\
   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\
   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 set listing file name (must be last sub-option)\n");
   n    omit forms processing\n\
   s    include symbols\n\
   =file set listing file name (must be last sub-option)\n");
@@ -130,24 +145,38 @@ Options:\n\
 -D                     produce assembler debugging messages\n\
 --defsym SYM=VAL       define symbol SYM to given value\n\
 -f                     skip whitespace and comment preprocessing\n\
 -D                     produce assembler debugging messages\n\
 --defsym SYM=VAL       define symbol SYM to given value\n\
 -f                     skip whitespace and comment preprocessing\n\
+--gstabs               generate stabs debugging information\n\
 --help                 show this message and exit\n\
 -I DIR                 add DIR to search list for .include directives\n\
 -J                     don't warn about signed overflow\n\
 -K                     warn when differences altered for long displacements\n\
 --help                 show this message and exit\n\
 -I DIR                 add DIR to search list for .include directives\n\
 -J                     don't warn about signed overflow\n\
 -K                     warn when differences altered for long displacements\n\
--L                     keep local symbols (starting with `L')\n");
+-L,--keep-locals       keep local symbols (e.g. starting with `L')\n");
   fprintf (stream, "\
 -M,--mri               assemble in MRI compatibility mode\n\
   fprintf (stream, "\
 -M,--mri               assemble in MRI compatibility mode\n\
+--MD FILE              write dependency information in FILE (default none)\n\
 -nocpp                 ignored\n\
 -o OBJFILE             name the object-file output OBJFILE (default a.out)\n\
 -R                     fold data section into text section\n\
 --statistics           print various measured statistics from execution\n\
 -nocpp                 ignored\n\
 -o OBJFILE             name the object-file output OBJFILE (default a.out)\n\
 -R                     fold data section into text section\n\
 --statistics           print various measured statistics from execution\n\
+--strip-local-absolute strip local absolute symbols\n\
+--traditional-format   Use same format as native assembler when possible\n\
 --version              print assembler version number and exit\n\
 -W                     suppress warnings\n\
 --version              print assembler version number and exit\n\
 -W                     suppress warnings\n\
--t,--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\
 -w                     ignored\n\
 -X                     ignored\n\
 -Z                     generate object file even after errors\n");
                        matching the specifications defined in file INSTTBL\n\
 -w                     ignored\n\
 -X                     ignored\n\
 -Z                     generate object file even after errors\n");
+  fprintf (stream, "\
+--listing-lhs-width    set the width in words of the output data column of\n\
+                       the listing\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\
+--listing-rhs-width    set the max width in characters of the lines from\n\
+                       the source file\n\
+--listing-cont-lines   set the maximum number of continuation lines used\n\
+                       for the output data column of the listing\n");
 
   md_show_usage (stream);
 
 
   md_show_usage (stream);
 
@@ -159,10 +188,13 @@ Options:\n\
 
 extern struct emulation mipsbelf, mipslelf, mipself;
 extern struct emulation mipsbecoff, mipslecoff, mipsecoff;
 
 extern struct emulation mipsbelf, mipslelf, mipself;
 extern struct emulation mipsbecoff, mipslecoff, mipsecoff;
+extern struct emulation i386coff, i386elf;
 
 static struct emulation *const emulations[] = { EMULATIONS };
 static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
 
 
 static struct emulation *const emulations[] = { EMULATIONS };
 static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
 
+static void select_emulation_mode PARAMS ((int, char **));
+
 static void
 select_emulation_mode (argc, argv)
      int argc;
 static void
 select_emulation_mode (argc, argv)
      int argc;
@@ -249,7 +281,7 @@ common_emul_init ()
  * md_parse_option definitions in config/tc-*.c
  */
 
  * md_parse_option definitions in config/tc-*.c
  */
 
-void
+static void
 parse_args (pargc, pargv)
      int *pargc;
      char ***pargv;
 parse_args (pargc, pargv)
      int *pargc;
      char ***pargv;
@@ -279,7 +311,7 @@ parse_args (pargc, pargv)
 #endif
       'w', 'X',
       /* New option for extending instruction set (see also --itbl below) */
 #endif
       'w', 'X',
       /* New option for extending instruction set (see also --itbl below) */
-      't',
+      't', ':',
       '\0'
     };
   struct option *longopts;
       '\0'
     };
   struct option *longopts;
@@ -288,6 +320,7 @@ parse_args (pargc, pargv)
   static const struct option std_longopts[] = {
 #define OPTION_HELP (OPTION_STD_BASE)
     {"help", no_argument, NULL, OPTION_HELP},
   static const struct option std_longopts[] = {
 #define OPTION_HELP (OPTION_STD_BASE)
     {"help", no_argument, NULL, OPTION_HELP},
+    {"keep-locals", no_argument, NULL, 'L'},
     {"mri", no_argument, NULL, 'M'},
 #define OPTION_NOCPP (OPTION_STD_BASE + 1)
     {"nocpp", no_argument, NULL, OPTION_NOCPP},
     {"mri", no_argument, NULL, 'M'},
 #define OPTION_NOCPP (OPTION_STD_BASE + 1)
     {"nocpp", no_argument, NULL, OPTION_NOCPP},
@@ -310,7 +343,23 @@ parse_args (pargc, pargv)
        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.  */
        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, OPTION_INSTTBL},
+#define OPTION_LISTING_LHS_WIDTH (OPTION_STD_BASE + 9)
+    {"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH},
+#define OPTION_LISTING_LHS_WIDTH2 (OPTION_STD_BASE + 10)
+    {"listing-lhs-width", 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},
+#define OPTION_LISTING_CONT_LINES (OPTION_STD_BASE + 12)
+    {"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES},
+#define OPTION_DEPFILE (OPTION_STD_BASE + 13)
+    {"MD", required_argument, NULL, OPTION_DEPFILE},
+#define OPTION_GSTABS (OPTION_STD_BASE + 14)
+    {"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},
+#define OPTION_TRADITIONAL_FORMAT (OPTION_STD_BASE + 16)
+    {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}
   };
 
   /* Construct the option lists from the standard list and the
   };
 
   /* Construct the option lists from the standard list and the
@@ -391,10 +440,18 @@ parse_args (pargc, pargv)
          flag_print_statistics = 1;
          break;
 
          flag_print_statistics = 1;
          break;
 
+       case OPTION_STRIP_LOCAL_ABSOLUTE:
+         flag_strip_local_absolute = 1;
+         break;
+
+       case OPTION_TRADITIONAL_FORMAT:
+         flag_traditional_format = 1;
+         break;
+
        case OPTION_VERSION:
          /* This output is intended to follow the GNU standards document.  */
        case OPTION_VERSION:
          /* This output is intended to follow the GNU standards document.  */
-         printf ("GNU assembler %s\n", GAS_VERSION);
-         printf ("Copyright 1996 Free Software Foundation, Inc.\n");
+         printf ("GNU assembler %s\n", VERSION);
+         printf ("Copyright 1997 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");
          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");
@@ -450,6 +507,12 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
               formats, opcodes, register names, etc. */
            struct itbl_file_list *n;
 
               formats, opcodes, register names, etc. */
            struct itbl_file_list *n;
 
+           if (optarg == NULL)
+             {
+               as_warn ( "No file name following -t option\n" );
+               break;
+             }
+           
            n = (struct itbl_file_list *) xmalloc (sizeof *n);
            n->next = itbl_files;
            n->name = optarg;
            n = (struct itbl_file_list *) xmalloc (sizeof *n);
            n->next = itbl_files;
            n->name = optarg;
@@ -469,6 +532,14 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
          }
          break;
 
          }
          break;
 
+       case OPTION_DEPFILE:
+         start_dependencies (optarg);
+         break;
+
+       case OPTION_GSTABS:
+         debug_type = DEBUG_STABS;
+         break;
        case 'J':
          flag_signed_overflow_ok = 1;
          break;
        case 'J':
          flag_signed_overflow_ok = 1;
          break;
@@ -483,6 +554,25 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
          flag_keep_locals = 1;
          break;
 
          flag_keep_locals = 1;
          break;
 
+       case OPTION_LISTING_LHS_WIDTH:
+         listing_lhs_width = atoi(optarg);
+         if (listing_lhs_width_second < listing_lhs_width)
+           listing_lhs_width_second = listing_lhs_width;
+         break;
+       case OPTION_LISTING_LHS_WIDTH2:
+         {
+           int tmp = atoi(optarg);
+           if (tmp > listing_lhs_width)
+             listing_lhs_width_second = tmp;
+         }
+         break;
+       case OPTION_LISTING_RHS_WIDTH:
+         listing_rhs_width = atoi(optarg);
+         break;
+       case OPTION_LISTING_CONT_LINES:
+         listing_lhs_cont_lines = atoi(optarg);
+         break;
+
        case 'M':
          flag_mri = 1;
 #ifdef TC_M68K
        case 'M':
          flag_mri = 1;
 #ifdef TC_M68K
@@ -509,6 +599,9 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
                {
                  switch (*optarg)
                    {
                {
                  switch (*optarg)
                    {
+                   case 'c':
+                     listing |= LISTING_NOCOND;
+                     break;
                    case 'd':
                      listing |= LISTING_NODEBUG;
                      break;
                    case 'd':
                      listing |= LISTING_NODEBUG;
                      break;
@@ -518,6 +611,9 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
                    case 'l':
                      listing |= LISTING_LISTING;
                      break;
                    case 'l':
                      listing |= LISTING_LISTING;
                      break;
+                   case 'm':
+                     listing |= LISTING_MACEXP;
+                     break;
                    case 'n':
                      listing |= LISTING_NOFORM;
                      break;
                    case 'n':
                      listing |= LISTING_NOFORM;
                      break;
@@ -576,7 +672,6 @@ the GNU General Public License.  This program has absolutely no warranty.\n");
   *pargv = new_argv;
 }
 
   *pargv = new_argv;
 }
 
-static void dump_statistics ();
 static long start_time;
 
 int 
 static long start_time;
 
 int 
@@ -684,6 +779,8 @@ main (argc, argv)
 
   perform_an_assembly_pass (argc, argv);       /* Assemble it. */
 
 
   perform_an_assembly_pass (argc, argv);       /* Assemble it. */
 
+  cond_finish_check (-1);
+
 #ifdef md_end
   md_end ();
 #endif
 #ifdef md_end
   md_end ();
 #endif
@@ -694,6 +791,14 @@ main (argc, argv)
   else
     keep_it = 0;
 
   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 ();
 
   if (keep_it)
     write_object_file ();
 
@@ -722,6 +827,10 @@ main (argc, argv)
      may not place the same interpretation on the value given.  */
   if (had_errors () > 0)
     xexit (EXIT_FAILURE);
      may not place the same interpretation on the value given.  */
   if (had_errors () > 0)
     xexit (EXIT_FAILURE);
+
+  /* Only generate dependency file if assembler was successful.  */
+  print_dependencies ();
+
   xexit (EXIT_SUCCESS);
 }
 
   xexit (EXIT_SUCCESS);
 }
 
This page took 0.027027 seconds and 4 git commands to generate.