+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.
-*- 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.
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;
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, _("\
- --gdwarf2 generate DWARF2 debugging information\n"));
+ --gdwarf-2 generate DWARF2 debugging information\n"));
fprintf (stream, _("\
--help show this message and exit\n"));
fprintf (stream, _("\
/* -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. */
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
verbose = 1;
break;
}
+ else
+ as_bad (_("unrecognized option -%c%s"), optc, optarg ? optarg : "");
/* Fall through. */
case '?':
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. */
case OPTION_LISTING_LHS_WIDTH2:
{
int tmp = atoi (optarg);
+
if (tmp > listing_lhs_width)
listing_lhs_width_second = tmp;
}
case 'I':
{ /* Include file directory. */
char *temp = xstrdup (optarg);
+
add_include_dir (temp);
break;
}
xexit (EXIT_SUCCESS);
}
-
#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"
#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
#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 */
#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. */
#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. */
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
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 */
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,
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 */
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;
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
#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
}
}
- as_bad (_("unrecognized option `-%c%s'"), c, arg ? arg : "");
return 0;
}
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
{
if (!strcmp (arg, archs[i].name))
{
unsigned long arch = archs[i].arch;
+
if (cpu_of_arch (arch))
/* It's a cpu spec. */
{
break;
}
- as_bad ("unrecognized option `-%c%s'", c, arg ? arg : "");
-
return 0;
}
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;
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;
}
@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}]
``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.
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.
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
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
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 */