Add support for a -g switch to GAS
authorNick Clifton <nickc@redhat.com>
Tue, 17 Aug 2004 12:19:58 +0000 (12:19 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 17 Aug 2004 12:19:58 +0000 (12:19 +0000)
gas/ChangeLog
gas/NEWS
gas/as.c
gas/as.h
gas/config/tc-arm.c
gas/config/tc-m68k.c
gas/config/tc-pdp11.c
gas/config/tc-v850.c
gas/doc/as.texinfo
gas/doc/internals.texi
gas/tc.h

index 08fc72ab6ff5905c415fb58a49dc0c9285546824..16f46c8ff8374e15b412103522f7b97ebba4b4c5 100644 (file)
@@ -1,3 +1,24 @@
+2004-08-17  Nick Clifton  <nickc@redhat.com>
+
+       * as.c (MD_DEBUG_FORMAT_SELECTOR): Provide default definition.
+       (show_usage): Add -g.
+       (std_longopts): Add --gen-debug.  Alpha sort the table.
+       (parse_args): Print an error message if a switch is not handled.
+       Handle the -g switch, calling md_debug_format_selector() if
+       necessary.
+       * NEWS: Mention new feature.
+       * doc/as.texinfo: Document new switch.
+       * doc/internals.texi: Document behaviour of md_parse_option.
+       
+       * config/tc-arm.c (md_parse_option): Do not issue an error message
+       if the switch is not recognised.
+       * config/tc-m68k.c (md_parse_option): Likewise.
+       * config/tc-pdp11.c (md_parse_option): Likewise.
+       * config/tc-v850.c (md_parse_option): Likewise.
+
+       * as.h: Fix up formatting.
+       * tc.h: Likewise.
+
 2004-08-16  Nick Clifton  <nickc@redhat.com>
 
        * macro.c (macro_set_alternate): Use ISO C90 formatting.
index d4a6d658871f06c65242d8be13987d448381bc6d..5a6b42b3ef44c725d75bbe961f06180da6871eef 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,5 +1,8 @@
 -*- text -*-
 
+* Add a -g command line option to generate debug information in the target's
+  preferred debug format.
+
 * Support for the crx-elf target added.
 
 * Support for the sh-symbianelf target added.
index b3287627ce87863956283dbbc51cb4f0c7937a31..7b95369eb4e00119d760b9b4aaddec20223b28c7 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -89,6 +89,11 @@ int listing;
 enum debug_info_type debug_type = DEBUG_UNSPECIFIED;
 int use_gnu_debug_info_extensions = 0;
 
+#ifndef MD_DEBUG_FORMAT_SELECTOR
+#define MD_DEBUG_FORMAT_SELECTOR NULL
+#endif
+static enum debug_info_type (*md_debug_format_selector) (int *) = MD_DEBUG_FORMAT_SELECTOR;
+
 /* Maximum level of macro nesting.  */
 int max_macro_nest = 100;
 
@@ -279,11 +284,13 @@ Options:\n\
   fprintf (stream, _("\
   -f                      skip whitespace and comment preprocessing\n"));
   fprintf (stream, _("\
-  --gstabs                generate stabs debugging information\n"));
+  -g --gen-debug          generate debugging information\n"));
+  fprintf (stream, _("\
+  --gstabs                generate STABS debugging information\n"));
   fprintf (stream, _("\
-  --gstabs+               generate stabs debug info with GNU extensions\n"));
+  --gstabs+               generate STABS debug info with GNU extensions\n"));
   fprintf (stream, _("\
-  --gdwarf              generate DWARF2 debugging information\n"));
+  --gdwarf-2              generate DWARF2 debugging information\n"));
   fprintf (stream, _("\
   --help                  show this message and exit\n"));
   fprintf (stream, _("\
@@ -378,7 +385,7 @@ parse_args (int * pargc, char *** pargv)
     /* -K is not meaningful if .word is not being hacked.  */
     'K',
 #endif
-    'L', 'M', 'R', 'W', 'Z', 'a', ':', ':', 'D', 'f', 'I', ':', 'o', ':',
+    'L', 'M', 'R', 'W', 'Z', 'a', ':', ':', 'D', 'f', 'g', 'I', ':', 'o', ':',
 #ifndef VMS
     /* -v takes an argument on VMS, so we don't make it a generic
        option.  */
@@ -411,61 +418,68 @@ parse_args (int * pargc, char *** pargv)
       OPTION_DEPFILE,
       OPTION_GSTABS,
       OPTION_GSTABS_PLUS,
+      OPTION_GDWARF2,
       OPTION_STRIP_LOCAL_ABSOLUTE,
       OPTION_TRADITIONAL_FORMAT,
-      OPTION_GDWARF2,
       OPTION_WARN,
       OPTION_TARGET_HELP,
       OPTION_EXECSTACK,
       OPTION_NOEXECSTACK,
       OPTION_ALTERNATE,
       OPTION_WARN_FATAL
+    /* When you add options here, check that they do
+       not collide with OPTION_MD_BASE.  See as.h.  */
     };
   
   static const struct option std_longopts[] =
   {
-    {"help", no_argument, NULL, OPTION_HELP},
-    /* 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.  */
-    {"keep-locals", no_argument, NULL, 'L'},
-    {"keep-locals", no_argument, NULL, 'L'},
-    {"mri", no_argument, NULL, 'M'},
-    {"nocpp", no_argument, NULL, OPTION_NOCPP},
-    {"statistics", no_argument, NULL, OPTION_STATISTICS},
-    {"version", no_argument, NULL, OPTION_VERSION},
-    {"dump-config", no_argument, NULL, OPTION_DUMPCONFIG},
-    {"verbose", no_argument, NULL, OPTION_VERBOSE},
-    {"emulation", required_argument, NULL, OPTION_EMULATION},
-    {"defsym", required_argument, NULL, OPTION_DEFSYM},
+    /* Note: commas are placed at the start of the line rather than
+       the end of the preceeding line so that it is simpler to
+       selectively add and remove lines from this list.  */
+    {"alternate", no_argument, NULL, OPTION_ALTERNATE}
+    ,{"defsym", required_argument, NULL, OPTION_DEFSYM}
+    ,{"dump-config", no_argument, NULL, OPTION_DUMPCONFIG}
+    ,{"emulation", required_argument, NULL, OPTION_EMULATION}
+#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
+    ,{"execstack", no_argument, NULL, OPTION_EXECSTACK}
+    ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK}
+#endif
+    ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
+    ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF2}
+    /* GCC uses --gdwarf-2 but GAS uses to use --gdwarf2,
+       so we keep it here for backwards compatibility.  */
+    ,{"gdwarf2", no_argument, NULL, OPTION_GDWARF2}
+    ,{"gen-debug", no_argument, NULL, 'g'}
+    ,{"gstabs", no_argument, NULL, OPTION_GSTABS}
+    ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS}
+    ,{"help", no_argument, NULL, OPTION_HELP}
     /* 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},
-    {"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH},
-    {"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2},
-    {"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH},
-    {"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES},
-    {"MD", required_argument, NULL, OPTION_DEPFILE},
-    {"gstabs", no_argument, NULL, OPTION_GSTABS},
-    {"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS},
-    {"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE},
-    {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
-    {"gdwarf2", no_argument, NULL, OPTION_GDWARF2},
-    {"no-warn", no_argument, NULL, 'W'},
-    {"warn", no_argument, NULL, OPTION_WARN},
-    {"target-help", no_argument, NULL, OPTION_TARGET_HELP},
-#if defined BFD_ASSEMBLER && (defined OBJ_ELF || defined OBJ_MAYBE_ELF)
-    {"execstack", no_argument, NULL, OPTION_EXECSTACK},
-    {"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
-#endif
-    {"alternate", no_argument, NULL, OPTION_ALTERNATE},
-    {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
-    /* When you add options here, check that they do not collide with
-       OPTION_MD_BASE.  See as.h.  */
+    ,{"itbl", required_argument, NULL, OPTION_INSTTBL}
+    /* 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.  */
+    ,{"keep-locals", no_argument, NULL, 'L'}
+    ,{"keep-locals", no_argument, NULL, 'L'}
+    ,{"listing-lhs-width", required_argument, NULL, OPTION_LISTING_LHS_WIDTH}
+    ,{"listing-lhs-width2", required_argument, NULL, OPTION_LISTING_LHS_WIDTH2}
+    ,{"listing-rhs-width", required_argument, NULL, OPTION_LISTING_RHS_WIDTH}
+    ,{"listing-cont-lines", required_argument, NULL, OPTION_LISTING_CONT_LINES}
+    ,{"MD", required_argument, NULL, OPTION_DEPFILE}
+    ,{"mri", no_argument, NULL, 'M'}
+    ,{"nocpp", no_argument, NULL, OPTION_NOCPP}
+    ,{"no-warn", no_argument, NULL, 'W'}
+    ,{"statistics", no_argument, NULL, OPTION_STATISTICS}
+    ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE}
+    ,{"version", no_argument, NULL, OPTION_VERSION}
+    ,{"verbose", no_argument, NULL, OPTION_VERBOSE}
+    ,{"target-help", no_argument, NULL, OPTION_TARGET_HELP}
+    ,{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}
+    ,{"warn", no_argument, NULL, OPTION_WARN}
   };
 
   /* Construct the option lists from the standard list and the target
@@ -526,6 +540,8 @@ parse_args (int * pargc, char *** pargv)
                verbose = 1;
              break;
            }
+         else
+           as_bad (_("unrecognized option -%c%s"), optc, optarg ? optarg : "");
          /* Fall through.  */
 
        case '?':
@@ -654,6 +670,23 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
          start_dependencies (optarg);
          break;
 
+       case 'g':
+         /* Some backends, eg Alpha, use the -g switch for their own
+            purposes.  So we check here for an explicit -g and allow
+            the backend to decide if it wants to process it.  */
+         if (   old_argv[optind - 1][1] == 'g'
+             && old_argv[optind - 1][2] == 0
+             && md_parse_option (optc, optarg))
+           continue;
+
+         if (md_debug_format_selector)
+           debug_type = md_debug_format_selector (& use_gnu_debug_info_extensions);
+         else if (IS_ELF)
+           debug_type = DEBUG_DWARF2;
+         else
+           debug_type = DEBUG_STABS;
+         break;
+
        case OPTION_GSTABS_PLUS:
          use_gnu_debug_info_extensions = 1;
          /* Fall through.  */
@@ -686,6 +719,7 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
        case OPTION_LISTING_LHS_WIDTH2:
          {
            int tmp = atoi (optarg);
+
            if (tmp > listing_lhs_width)
              listing_lhs_width_second = tmp;
          }
@@ -809,6 +843,7 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
        case 'I':
          {                     /* Include file directory.  */
            char *temp = xstrdup (optarg);
+
            add_include_dir (temp);
            break;
          }
@@ -1179,4 +1214,3 @@ main (int argc, char ** argv)
 
   xexit (EXIT_SUCCESS);
 }
-
index 1f9fd60a3933973f9e11f1c619ac5b1a636cbfc7..3bff25d86db6d169d72182ef0ef035185c3bfa27 100644 (file)
--- a/gas/as.h
+++ b/gas/as.h
 #ifndef GAS
 #define GAS 1
 /* I think this stuff is largely out of date.  xoxorich.
- *
- * CAPITALISED names are #defined.
- * "lowercaseH" is #defined if "lowercase.h" has been #include-d.
- * "lowercaseT" is a typedef of "lowercase" objects.
- * "lowercaseP" is type "pointer to object of type 'lowercase'".
- * "lowercaseS" is typedef struct ... lowercaseS.
- *
- * #define DEBUG to enable all the "know" assertion tests.
- * #define SUSPECT when debugging hash code.
- * #define COMMON as "extern" for all modules except one, where you #define
- *     COMMON as "".
- * If TEST is #defined, then we are testing a module: #define COMMON as "".
- */
+   CAPITALISED names are #defined.
+   "lowercaseH" is #defined if "lowercase.h" has been #include-d.
+   "lowercaseT" is a typedef of "lowercase" objects.
+   "lowercaseP" is type "pointer to object of type 'lowercase'".
+   "lowercaseS" is typedef struct ... lowercaseS.
+  
+   #define DEBUG to enable all the "know" assertion tests.
+   #define SUSPECT when debugging hash code.
+   #define COMMON as "extern" for all modules except one, where you #define
+       COMMON as "".
+   If TEST is #defined, then we are testing a module: #define COMMON as "".  */
 
 #include "config.h"
 #include "bin-bugs.h"
@@ -137,7 +136,7 @@ extern void *alloca ();
 #include "progress.h"
 
 /* This doesn't get taken care of anywhere.  */
-#ifndef __MWERKS__  /* Metrowerks C chokes on the "defined (inline)" */
+#ifndef __MWERKS__  /* Metrowerks C chokes on the "defined (inline)"  */
 #if !defined (__GNUC__) && !defined (inline)
 #define inline
 #endif
@@ -235,19 +234,19 @@ typedef addressT valueT;
 
 #ifndef COMMON
 #ifdef TEST
-#define COMMON                 /* declare our COMMONs storage here.  */
+#define COMMON                 /* Declare our COMMONs storage here.  */
 #else
-#define COMMON extern          /* our commons live elsewhere */
+#define COMMON extern          /* Our commons live elsewhere.  */
 #endif
 #endif
 /* COMMON now defined */
 
 #ifdef DEBUG
 #ifndef know
-#define know(p) assert(p)      /* Verify our assumptions! */
+#define know(p) assert(p)      /* Verify our assumptions!  */
 #endif /* not yet defined */
 #else
-#define know(p)                        /* know() checks are no-op.ed */
+#define know(p)                        /* know() checks are no-op.ed  */
 #endif
 \f
 /* input_scrub.c */
@@ -277,31 +276,32 @@ typedef addressT valueT;
 #define SEG_LIST SEG_TEXT,SEG_DATA,SEG_BSS
 #endif
 
-typedef enum _segT {
+typedef enum _segT
+{
   SEG_ABSOLUTE = 0,
   SEG_LIST,
   SEG_UNKNOWN,
   SEG_GOOF,                    /* Only happens if AS has a logic error.  */
-  /* Invented so we don't crash printing */
-  /* error message involving weird segment.  */
+  /* Invented so we don't crash printing
+     error message involving weird segment.  */
   SEG_EXPR,                    /* Intermediate expression values.  */
   SEG_DEBUG,                   /* Debug segment */
-  SEG_NTV,                     /* Transfert vector preload segment */
-  SEG_PTV,                     /* Transfert vector postload segment */
-  SEG_REGISTER                 /* Mythical: a register-valued expression */
+  SEG_NTV,                     /* Transfert vector preload segment */
+  SEG_PTV,                     /* Transfert vector postload segment */
+  SEG_REGISTER                 /* Mythical: a register-valued expression */
 } segT;
 
 #define SEG_MAXIMUM_ORDINAL (SEG_REGISTER)
 #else
 typedef asection *segT;
-#define SEG_NORMAL(SEG)                ((SEG) != absolute_section      \
+#define SEG_NORMAL(SEG)                (   (SEG) != absolute_section   \
                                 && (SEG) != undefined_section  \
                                 && (SEG) != reg_section        \
                                 && (SEG) != expr_section)
 #endif
 typedef int subsegT;
 
-/* What subseg we are accessing now? */
+/* What subseg we are accessing now?  */
 COMMON subsegT now_subseg;
 
 /* Segment our instructions emit to.  */
@@ -334,9 +334,9 @@ extern segT text_section, data_section, bss_section;
 #define undefined_section      SEG_UNKNOWN
 #endif
 
-/* relax() */
 
-enum _relax_state {
+enum _relax_state
+{
   /* Variable chars to be repeated fr_offset times.
      Fr_symbol unused. Used with fr_offset == 0 for a
      constant length frag.  */
@@ -368,7 +368,7 @@ enum _relax_state {
   rs_broken_word,
 #endif
 
-  /* machine-specific relaxable (or similarly alterable) instruction */
+  /* Machine specific relaxable (or similarly alterable) instruction.  */
   rs_machine_dependent,
 
   /* .space directive with expression operand that needs to be computed
@@ -398,7 +398,7 @@ typedef unsigned int relax_substateT;
    Could be a problem, cross-assembling for 64-bit machines.  */
 typedef addressT relax_addressT;
 \f
-/* main program "as.c" (command arguments etc) */
+/* main program "as.c" (command arguments etc) */
 
 COMMON unsigned char flag_no_comments; /* -f */
 COMMON unsigned char flag_debug; /* -D */
@@ -466,7 +466,8 @@ extern int listing;
    This is especially relevant to DWARF2, since the compiler may emit line
    number directives that the assembler resolves.  */
 
-enum debug_info_type {
+enum debug_info_type
+{
   DEBUG_UNSPECIFIED,
   DEBUG_NONE,
   DEBUG_STABS,
@@ -488,7 +489,8 @@ extern int verbose;
    increase malloc calls for monitoring memory allocation.  */
 extern int chunksize;
 
-struct _pseudo_type {
+struct _pseudo_type
+{
   /* assembler mnemonic, lower case, no '.' */
   const char *poc_name;
   /* Do the work */
@@ -553,57 +555,52 @@ PRINTF_LIKE (as_warn);
 PRINTF_WHERE_LIKE (as_bad_where);
 PRINTF_WHERE_LIKE (as_warn_where);
 
-void as_assert (const char *, int, const char *);
-void as_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
-
-void fprint_value (FILE *file, addressT value);
-void sprint_value (char *buf, addressT value);
-
-int had_errors (void);
-int had_warnings (void);
-
-void as_warn_value_out_of_range (char *, offsetT, offsetT, offsetT, char *, unsigned);
-void as_bad_value_out_of_range (char *, offsetT, offsetT, offsetT, char *, unsigned);
-
-void print_version_id (void);
-char *app_push (void);
-char *atof_ieee (char *str, int what_kind, LITTLENUM_TYPE * words);
-char *input_scrub_include_file (char *filename, char *position);
-extern void input_scrub_insert_line (const char *line);
-extern void input_scrub_insert_file (char *path);
-char *input_scrub_new_file (char *filename);
-char *input_scrub_next_buffer (char **bufp);
-int do_scrub_chars (int (*get) (char *, int), char *to, int tolen);
-int gen_to_words (LITTLENUM_TYPE * words, int precision,
-                         long exponent_bits);
-int had_err (void);
-int ignore_input (void);
-void cond_finish_check (int);
-void cond_exit_macro (int);
-int seen_at_least_1_file (void);
-void app_pop (char *arg);
-void as_howmuch (FILE * stream);
-void as_perror (const char *gripe, const char *filename);
-void as_where (char **namep, unsigned int *linep);
-void bump_line_counters (void);
-void do_scrub_begin (int);
-void input_scrub_begin (void);
-void input_scrub_close (void);
-void input_scrub_end (void);
-int new_logical_line (char *fname, int line_number);
-void subsegs_begin (void);
-void subseg_change (segT seg, int subseg);
-segT subseg_new (const char *name, subsegT subseg);
-segT subseg_force_new (const char *name, subsegT subseg);
-void subseg_set (segT seg, subsegT subseg);
+void   as_assert (const char *, int, const char *);
+void   as_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
+void   fprint_value (FILE *, addressT);
+void   sprint_value (char *, addressT);
+int    had_errors (void);
+int    had_warnings (void);
+void   as_warn_value_out_of_range (char *, offsetT, offsetT, offsetT, char *, unsigned);
+void   as_bad_value_out_of_range (char *, offsetT, offsetT, offsetT, char *, unsigned);
+void   print_version_id (void);
+char * app_push (void);
+char * atof_ieee (char *, int, LITTLENUM_TYPE *);
+char * input_scrub_include_file (char *, char *);
+void   input_scrub_insert_line (const char *);
+void   input_scrub_insert_file (char *);
+char * input_scrub_new_file (char *);
+char * input_scrub_next_buffer (char **bufp);
+int    do_scrub_chars (int (*get) (char *, int), char *, int);
+int    gen_to_words (LITTLENUM_TYPE *, int, long);
+int    had_err (void);
+int    ignore_input (void);
+void   cond_finish_check (int);
+void   cond_exit_macro (int);
+int    seen_at_least_1_file (void);
+void   app_pop (char *);
+void   as_howmuch (FILE *);
+void   as_perror (const char *, const char *);
+void   as_where (char **, unsigned int *);
+void   bump_line_counters (void);
+void   do_scrub_begin (int);
+void   input_scrub_begin (void);
+void   input_scrub_close (void);
+void   input_scrub_end (void);
+int    new_logical_line (char *, int);
+void   subsegs_begin (void);
+void   subseg_change (segT, int);
+segT   subseg_new (const char *, subsegT);
+segT   subseg_force_new (const char *, subsegT);
+void   subseg_set (segT, subsegT);
+int    subseg_text_p (segT);
+void   start_dependencies (char *);
+void   register_dependency (char *);
+void   print_dependencies (void);
 #ifdef BFD_ASSEMBLER
-segT subseg_get (const char *, int);
+segT   subseg_get (const char *, int);
 #endif
-int subseg_text_p (segT);
 
-void start_dependencies (char *);
-void register_dependency (char *);
-void print_dependencies (void);
 
 struct expressionS;
 struct fix;
@@ -620,12 +617,11 @@ int check_eh_frame (struct expressionS *, unsigned int *);
 int eh_frame_estimate_size_before_relax (fragS *);
 int eh_frame_relax_frag (fragS *);
 void eh_frame_convert_frag (fragS *);
-
 int generic_force_reloc (struct fix *);
 
 #include "expr.h"              /* Before targ-*.h */
 
-/* this one starts the chain of target dependant headers */
+/* This one starts the chain of target dependant headers.  */
 #include "targ-env.h"
 
 #ifdef OBJ_MAYBE_ELF
@@ -660,9 +656,9 @@ COMMON int flag_m68k_mri;
 #endif
 
 #ifdef WARN_COMMENTS
-COMMON int warn_comment;
-COMMON unsigned int found_comment;
-COMMON char *found_comment_file;
+COMMON int           warn_comment;
+COMMON unsigned int  found_comment;
+COMMON char *        found_comment_file;
 #endif
 
 #ifndef NUMBERS_WITH_SUFFIX
index f7eeca7d7327c1397e5a0486b59192ea4cda400c..68faf1389d201504a23b563949ebbbe07329c2ac 100644 (file)
@@ -13699,7 +13699,6 @@ md_parse_option (c, arg)
            }
        }
 
-      as_bad (_("unrecognized option `-%c%s'"), c, arg ? arg : "");
       return 0;
     }
 
index 65987d039e3217c7f90761c9b8fa9abebacee9bd..d9a59ca2ecb335982e5a88de8d0cac4c76a20904 100644 (file)
@@ -7095,18 +7095,15 @@ md_parse_option (int c, char *arg)
            if (!strcmp (arg, archs[i].name))
              break;
          if (i == n_archs)
-           {
-           unknown:
-             as_bad (_("unrecognized option `%s'"), oarg);
-             return 0;
-           }
+           return 0;
+
          arch = archs[i].arch;
          if (arch == m68881)
            no_68881 = 1;
          else if (arch == m68851)
            no_68851 = 1;
          else
-           goto unknown;
+           return 0;
        }
       else
        {
@@ -7119,6 +7116,7 @@ md_parse_option (int c, char *arg)
            if (!strcmp (arg, archs[i].name))
              {
                unsigned long arch = archs[i].arch;
+
                if (cpu_of_arch (arch))
                  /* It's a cpu spec.  */
                  {
index 92023d130a8005a89bbd5d0476eb669bd9a20a2b..f34adf69d670f18438b974b55edbafcfc592f6c6 100644 (file)
@@ -1347,8 +1347,6 @@ md_parse_option (c, arg)
       break;
     }
 
-  as_bad ("unrecognized option `-%c%s'", c, arg ? arg : "");
-
   return 0;
 }
 
index b1085acae5f2ac892f96dc60255991b22f376212..ed208ee2d2bd98c41262f612ee39bc4f420f9ef4 100644 (file)
@@ -1169,21 +1169,14 @@ md_parse_option (c, arg)
      char *arg;
 {
   if (c != 'm')
-    {
-      if (c != 'a')
-       /* xgettext:c-format  */
-       fprintf (stderr, _("unknown command line option: -%c%s\n"), c, arg);
-      return 0;
-    }
+    return 0;
 
   if (strcmp (arg, "warn-signed-overflow") == 0)
-    {
-      warn_signed_overflows = TRUE;
-    }
+    warn_signed_overflows = TRUE;
+
   else if (strcmp (arg, "warn-unsigned-overflow") == 0)
-    {
-      warn_unsigned_overflows = TRUE;
-    }
+    warn_unsigned_overflows = TRUE;
+
   else if (strcmp (arg, "v850") == 0)
     {
       machine = 0;
@@ -1211,11 +1204,7 @@ md_parse_option (c, arg)
   else if (strcmp (arg, "relax") == 0)
     v850_relax = 1;
   else
-    {
-      /* xgettext:c-format  */
-      fprintf (stderr, _("unknown command line option: -%c%s\n"), c, arg);
-      return 0;
-    }
+    return 0;
 
   return 1;
 }
index 800d447cc5211d819ba7436ea17a44e805cd4057..89868c290f16e78673afa405cf68a62d557d9471 100644 (file)
@@ -227,8 +227,8 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
 @smallexample
 @c man begin SYNOPSIS
 @value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{--alternate}] [@b{-D}]
- [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{--gstabs}] [@b{--gstabs+}]
- [@b{--gdwarf2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}] [@b{-K}] [@b{-L}]
+ [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}] [@b{--gstabs+}]
+ [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}] [@b{-K}] [@b{-L}]
  [@b{--listing-lhs-width}=@var{NUM}] [@b{--listing-lhs-width2}=@var{NUM}]
  [@b{--listing-rhs-width}=@var{NUM}] [@b{--listing-cont-lines}=@var{NUM}]
  [@b{--keep-locals}] [@b{-o} @var{objfile}] [@b{-R}] [@b{--statistics}] [@b{-v}]
@@ -479,6 +479,12 @@ indicates a hexadecimal value, and a leading @samp{0} indicates an octal value.
 ``fast''---skip whitespace and comment preprocessing (assume source is
 compiler output).
 
+@item -g
+@itemx --gen-debug
+Generate debugging information for each assembler source line using whichever
+debug format is preferred by the target.  This currently means either STABS,
+ECOFF or DWARF2.
+
 @item --gstabs
 Generate stabs debugging information for each assembler line.  This
 may help debugging assembler code, if the debugger can handle it.
@@ -490,7 +496,7 @@ debuggers crash or refuse to read your program.  This
 may help debugging assembler code.  Currently the only GNU extension is
 the location of the current working directory at assembling time.
 
-@item --gdwarf2
+@item --gdwarf-2
 Generate DWARF2 debugging information for each assembler line.  This
 may help debugging assembler code, if the debugger can handle it.  Note---this
 option is only supported by some targets, not all of them.
index 6719bbf945d35cca5dbc240c292852871d754886..1c3ad973e5df881b7fb7aed8c1a84a968c99bde2 100644 (file)
@@ -858,13 +858,17 @@ independent string passed to @code{getopt}.  @code{md_longopts} is a
 passed to @code{getopt}; you may use @code{OPTION_MD_BASE}, defined in
 @file{as.h}, as the start of a set of long option indices, if necessary.
 @code{md_longopts_size} is a @code{size_t} holding the size @code{md_longopts}.
+
 GAS will call @code{md_parse_option} whenever @code{getopt} returns an
 unrecognized code, presumably indicating a special code value which appears in
-@code{md_longopts}.  GAS will call @code{md_show_usage} when a usage message is
-printed; it should print a description of the machine specific options.
-@code{md_after_pase_args}, if defined, is called after all options are
-processed, to let the backend override settings done by the generic option
-parsing.
+@code{md_longopts}.  This function should return non-zero if it handled the
+option and zero otherwise.  There is no need to print a message about an option
+not being recognised.  This will be handled by the generic code.
+
+GAS will call @code{md_show_usage} when a usage message is printed; it should
+print a description of the machine specific options. @code{md_after_pase_args},
+if defined, is called after all options are processed, to let the backend
+override settings done by the generic option parsing.
 
 @item md_begin
 @cindex md_begin
@@ -1520,6 +1524,20 @@ It should return the size of an address, as it should be represented in
 debugging info.  If you don't define this macro, the default definition uses
 the number of bits per address, as defined in @var{bfd}, divided by 8.
 
+@item   MD_DEBUG_FORMAT_SELECTOR
+@cindex MD_DEBUG_FORMAT_SELECTOR
+If defined this macro is the name of a function to be called when the
+@samp{--gen-debug} switch is detected on the assembler's command line.  The
+prototype for the function looks like this:
+
+@smallexample
+   enum debug_info_type MD_DEBUG_FORMAT_SELECTOR (int * use_gnu_extensions)
+@end smallexample
+
+The function should return the debug format that is preferred by the CPU
+backend.  This format will be used when generating assembler specific debug
+information.
+
 @end table
 
 @node Object format backend
index f4a2826ae07f97dbd5f4426ddb743229b538cd5a..ef896ed6c4e6add2a4632b781f46e47506aff422 100644 (file)
--- a/gas/tc.h
+++ b/gas/tc.h
@@ -43,70 +43,64 @@ struct relax_type
 
 typedef struct relax_type relax_typeS;
 
-extern const int md_reloc_size;        /* Size of a relocation record */
+extern const int md_reloc_size;        /* Size of a relocation record.  */
+
+char * md_atof (int, char *, int *);
+int    md_parse_option (int, char *);
+void   md_show_usage (FILE *);
+short  tc_coff_fix2rtype (fixS *);
+void   md_assemble (char *);
+void   md_begin (void);
+void   md_number_to_chars (char *, valueT, int);
+void   md_apply_fix3 (fixS *, valueT *, segT);
+
 
-char *md_atof (int what_statement_type, char *literalP, int *sizeP);
-#ifndef md_estimate_size_before_relax
-int md_estimate_size_before_relax (fragS * fragP, segT segment);
-#endif
-int md_parse_option (int c, char *arg);
-void md_show_usage (FILE *);
-#ifndef md_pcrel_from
-long md_pcrel_from (fixS * fixP);
-#endif
-short tc_coff_fix2rtype (fixS * fixP);
-void md_assemble (char *str);
-void md_begin (void);
 #ifndef md_create_long_jump
-void md_create_long_jump (char *ptr, addressT from_addr,
-                         addressT to_addr, fragS * frag,
-                         symbolS * to_symbol);
+void    md_create_long_jump (char *, addressT, addressT, fragS *, symbolS *);
 #endif
 #ifndef md_create_short_jump
-void md_create_short_jump (char *ptr, addressT from_addr,
-                          addressT to_addr, fragS * frag,
-                          symbolS * to_symbol);
+void    md_create_short_jump (char *, addressT, addressT, fragS *, symbolS *);
+#endif
+#ifndef md_pcrel_from
+long    md_pcrel_from (fixS *);
 #endif
-void md_number_to_chars (char *buf, valueT val, int n);
-
 #ifndef md_operand
-void md_operand (expressionS * expressionP);
+void    md_operand (expressionS *);
+#endif
+#ifndef md_estimate_size_before_relax
+int     md_estimate_size_before_relax (fragS * fragP, segT);
+#endif
+#ifndef md_section_align
+valueT  md_section_align (segT, valueT);
+#endif
+#ifndef  md_undefined_symbol
+symbolS *md_undefined_symbol (char *);
 #endif
-
-void md_apply_fix3 (fixS *, valueT *, segT);
 
 #ifdef BFD_ASSEMBLER
+
 #ifndef md_convert_frag
-void md_convert_frag (bfd * headers, segT sec, fragS * fragP);
+void    md_convert_frag (bfd *, segT, fragS *);
 #endif
 #ifndef tc_headers_hook
-void tc_headers_hook (segT *, fixS *);
+void    tc_headers_hook (segT *, fixS *);
 #endif
 #ifndef RELOC_EXPANSION_POSSIBLE
 extern arelent *tc_gen_reloc (asection *, fixS *);
 #else
 extern arelent **tc_gen_reloc (asection *, fixS *);
 #endif
+
 #else /* not BFD_ASSEMBLER */
+
 #ifndef md_convert_frag
-void md_convert_frag (object_headers * headers, segT, fragS * fragP);
+void    md_convert_frag (object_headers *, segT, fragS *);
 #endif
-
 #ifndef tc_crawl_symbol_chain
-void tc_crawl_symbol_chain (object_headers * headers);
-#endif /* tc_crawl_symbol_chain */
-
-#ifndef tc_headers_hook
-void tc_headers_hook (object_headers * headers);
-#endif /* tc_headers_hook */
-#endif /* BFD_ASSEMBLER */
-
-#ifndef md_section_align
-valueT md_section_align (segT seg, valueT size);
+void    tc_crawl_symbol_chain (object_headers *);
 #endif
-
-#ifndef md_undefined_symbol
-symbolS *md_undefined_symbol (char *name);
+#ifndef tc_headers_hook
+void    tc_headers_hook (object_headers *);
 #endif
 
-/* end of tc.h */
+#endif /* BFD_ASSEMBLER */