2000-08-11 Kazu Hirata <kazu@hxi.com>
[deliverable/binutils-gdb.git] / gas / as.c
index 0cdd357dc7d2f3e1fede7faf4b7e2e729a855213..644c898d7deae90b32593fc9ccbb919acad56cfc 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -1,5 +1,5 @@
 /* as.c - GAS main program.
-   Copyright (C) 1987, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
+   Copyright (C) 1987, 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -44,7 +44,9 @@
 #include "sb.h"
 #include "macro.h"
 
-#ifndef HAVE_ITBL_CPU
+#ifdef HAVE_ITBL_CPU
+#include "itbl-ops.h"
+#else
 #define itbl_parse(itbl_file) 1
 #define itbl_init()
 #endif
@@ -109,92 +111,13 @@ struct itbl_file_list
 
 static struct itbl_file_list *itbl_files;
 \f
-void
-print_version_id ()
-{
-  static int printed;
-  if (printed)
-    return;
-  printed = 1;
-
-#ifdef BFD_ASSEMBLER
-  fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s"),
-          VERSION, TARGET_ALIAS, BFD_VERSION);
-#else
-  fprintf (stderr, _("GNU assembler version %s (%s)"), VERSION, TARGET_ALIAS);
-#endif
-  fprintf (stderr, "\n");
-}
-
-static void
-show_usage (stream)
-     FILE *stream;
-{
-  fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
-
-  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 set listing file name (must be last sub-option)\n"));
-  
-  fprintf (stream, _("\
-  -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\
-  -L,--keep-locals        keep local symbols (e.g. starting with `L')\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\
-  --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\
-  --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"));
-  
-  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);
-
-  fprintf (stream, _("\nReport bugs to bug-gnu-utils@gnu.org\n"));
-}
-
 #ifdef USE_EMULATIONS
 #define EMULATION_ENVIRON "AS_EMULATION"
 
 extern struct emulation mipsbelf, mipslelf, mipself;
 extern struct emulation mipsbecoff, mipslecoff, mipsecoff;
-extern struct emulation i386coff, i386elf;
+extern struct emulation i386coff, i386elf, i386aout;
+extern struct emulation crisaout, criself;
 
 static struct emulation *const emulations[] = { EMULATIONS };
 static const int n_emulations = sizeof (emulations) / sizeof (emulations[0]);
@@ -276,6 +199,134 @@ common_emul_init ()
 }
 #endif
 
+void
+print_version_id ()
+{
+  static int printed;
+  if (printed)
+    return;
+  printed = 1;
+
+#ifdef BFD_ASSEMBLER
+  fprintf (stderr, _("GNU assembler version %s (%s) using BFD version %s"),
+          VERSION, TARGET_ALIAS, BFD_VERSION);
+#else
+  fprintf (stderr, _("GNU assembler version %s (%s)"), VERSION, TARGET_ALIAS);
+#endif
+  fprintf (stderr, "\n");
+}
+
+static void
+show_usage (stream)
+     FILE *stream;
+{
+  fprintf (stream, _("Usage: %s [option...] [asmfile...]\n"), myname);
+
+  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\
+                         L      include line debug statistics (if applicable)\n\
+                         =FILE  list to FILE (must be last sub-option)\n"));
+
+  fprintf (stream, _("\
+  -D                      produce assembler debugging messages\n"));
+  fprintf (stream, _("\
+  --defsym SYM=VAL        define symbol SYM to given value\n"));
+#ifdef USE_EMULATIONS
+  {
+    int i;
+    char *def_em;
+
+    fprintf (stream, "\
+  --em=[");
+    for (i = 0; i < n_emulations-1; i++)
+      fprintf (stream, "%s | ", emulations[i]->name);
+    fprintf (stream, "%s]\n", emulations[i]->name);
+
+    def_em = getenv (EMULATION_ENVIRON);
+    if (!def_em) 
+      def_em = DEFAULT_EMULATION;
+    fprintf (stream, _("\
+                          emulate output (default %s)\n"), def_em);
+  }
+#endif
+  fprintf (stream, _("\
+  -f                      skip whitespace and comment preprocessing\n"));
+  fprintf (stream, _("\
+  --gstabs                generate stabs debugging information\n"));
+  fprintf (stream, _("\
+  --gdwarf2               generate DWARF2 debugging information\n"));
+  fprintf (stream, _("\
+  --help                  show this message and exit\n"));
+  fprintf (stream, _("\
+  -I DIR                  add DIR to search list for .include directives\n"));
+  fprintf (stream, _("\
+  -J                      don't warn about signed overflow\n"));
+  fprintf (stream, _("\
+  -K                      warn when differences altered for long displacements\n"));
+  fprintf (stream, _("\
+  -L,--keep-locals        keep local symbols (e.g. starting with `L')\n"));
+  fprintf (stream, _("\
+  -M,--mri                assemble in MRI compatibility mode\n"));
+  fprintf (stream, _("\
+  --MD FILE               write dependency information in FILE (default none)\n"));
+  fprintf (stream, _("\
+  -nocpp                  ignored\n"));
+  fprintf (stream, _("\
+  -o OBJFILE              name the object-file output OBJFILE (default a.out)\n"));
+  fprintf (stream, _("\
+  -R                      fold data section into text section\n"));
+  fprintf (stream, _("\
+  --statistics            print various measured statistics from execution\n"));
+  fprintf (stream, _("\
+  --strip-local-absolute  strip local absolute symbols\n"));
+  fprintf (stream, _("\
+  --traditional-format    Use same format as native assembler when possible\n"));
+  fprintf (stream, _("\
+  --version               print assembler version number and exit\n"));
+  fprintf (stream, _("\
+  -W  --no-warn           suppress warnings\n"));
+  fprintf (stream, _("\
+  --warn                  don't suppress warnings\n"));
+  fprintf (stream, _("\
+  --fatal-warnings        treat warnings as errors\n"));
+  fprintf (stream, _("\
+  --itbl INSTTBL          extend instruction set to include instructions\n\
+                          matching the specifications defined in file INSTTBL\n"));
+  fprintf (stream, _("\
+  -w                      ignored\n"));
+  fprintf (stream, _("\
+  -X                      ignored\n"));
+  fprintf (stream, _("\
+  -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"));
+  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"));
+  fprintf (stream, _("\
+  --listing-rhs-width     set the max width in characters of the lines from\n\
+                          the source file\n"));
+  fprintf (stream, _("\
+  --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);
+
+  fputc ('\n', stream);
+  fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
+}
+
 /*
  * Since it is easy to do here we interpret the special arg "-"
  * to mean "use stdin" and we set that argv[] pointing to "".
@@ -365,16 +416,28 @@ parse_args (pargc, pargv)
 #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}
+    {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
+#define OPTION_GDWARF2 (OPTION_STD_BASE + 17)
+    {"gdwarf2", no_argument, NULL, OPTION_GDWARF2},
+    {"no-warn", no_argument, NULL, 'W'},
+#define OPTION_WARN (OPTION_STD_BASE + 18)
+    {"warn", no_argument, NULL, OPTION_WARN},
+#define OPTION_WARN_FATAL (OPTION_STD_BASE + 19)
+    {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
   };
 
-  /* Construct the option lists from the standard list and the
-     target dependent list.  */
+  /* Construct the option lists from the standard list and the target
+     dependent list.  Include space for an extra NULL option and
+     always NULL terminate. */
   shortopts = concat (std_shortopts, md_shortopts, (char *) NULL);
-  longopts = (struct option *) xmalloc (sizeof (std_longopts) + md_longopts_size);
+  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,
+         0, sizeof (struct option));
 
   /* Make a local copy of the old argv.  */
   old_argc = *pargc;
@@ -457,7 +520,7 @@ parse_args (pargc, pargv)
        case OPTION_VERSION:
          /* This output is intended to follow the GNU standards document.  */
          printf (_("GNU assembler %s\n"), VERSION);
-         printf (_("Copyright 1997 Free Software Foundation, Inc.\n"));
+         printf (_("Copyright 2000 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"));
@@ -489,7 +552,7 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
        case OPTION_DEFSYM:
          {
            char *s;
-           long i;
+           valueT i;
            struct defsym_list *n;
 
            for (s = optarg; *s != '\0' && *s != '='; s++)
@@ -497,7 +560,11 @@ 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 = (struct defsym_list *) xmalloc (sizeof *n);
            n->next = defsyms;
            n->name = optarg;
@@ -546,6 +613,10 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
          debug_type = DEBUG_STABS;
          break;
  
+       case OPTION_GDWARF2:
+         debug_type = DEBUG_DWARF2;
+         break;
+
        case 'J':
          flag_signed_overflow_ok = 1;
          break;
@@ -594,6 +665,16 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
          flag_no_warnings = 1;
          break;
 
+       case OPTION_WARN:
+         flag_no_warnings = 0;
+         flag_fatal_warnings = 0;
+         break;
+
+       case OPTION_WARN_FATAL:
+         flag_no_warnings = 0;
+         flag_fatal_warnings = 1;
+         break;
+
        case 'Z':
          flag_always_generate_output = 1;
          break;
@@ -601,6 +682,9 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
        case 'a':
          if (optarg)
            {
+             if (md_parse_option (optc, optarg) != 0)
+               break;
+
              while (*optarg)
                {
                  switch (*optarg)
@@ -824,6 +908,9 @@ main (argc, argv)
     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());
+
   if (had_errors () > 0 && ! flag_always_generate_output)
     keep_it = 0;
 
@@ -940,9 +1027,9 @@ perform_an_assembly_pass (argc, argv)
   bfd_set_section_flags (stdoutput, text_section,
                         applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
                                       | SEC_CODE | SEC_READONLY));
-  /* @@ FIXME -- SEC_CODE seems to mean code only, rather than code possibly.*/
   bfd_set_section_flags (stdoutput, data_section,
-                        applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC));
+                        applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
+                                      | SEC_DATA));
   bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
   seg_info (bss_section)->bss = 1;
   subseg_new (BFD_ABS_SECTION_NAME, 0);
This page took 0.02924 seconds and 4 git commands to generate.