Add and handle new --alternate command line option.
This commit is contained in:
parent
a21de0dadf
commit
caa32fe507
11 changed files with 164 additions and 12 deletions
|
@ -1,3 +1,15 @@
|
||||||
|
2004-08-13 Jan Beulich <jbeulich@novell.com>
|
||||||
|
Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* as.c: Add and handle new --alternate command line option.
|
||||||
|
* macro.c (macro_set_alternate): New.
|
||||||
|
* macro.h (macro_set_alternate): Declare.
|
||||||
|
* read.c: Add and handle new .altmacro and .noaltmacro directives.
|
||||||
|
* doc/as.texinfo: Document new command line option and pseudo-ops
|
||||||
|
as well as insert documentation originating from gasp about
|
||||||
|
alternate macro syntax.
|
||||||
|
* NEWS: Mention new command line option and pseudo-ops.
|
||||||
|
|
||||||
2004-08-10 Mark Mitchell <mark@codesourcery.com>
|
2004-08-10 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* expr.c (operand): Handle the "~", "-", and "!" operators applied
|
* expr.c (operand): Handle the "~", "-", and "!" operators applied
|
||||||
|
|
3
gas/NEWS
3
gas/NEWS
|
@ -12,6 +12,9 @@
|
||||||
* Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC
|
* Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC
|
||||||
instrucitons.
|
instrucitons.
|
||||||
|
|
||||||
|
* New command line option --alternate and pseudo-ops .altmacro and .noaltmacro
|
||||||
|
added to enter (and leave) alternate macro syntax mode.
|
||||||
|
|
||||||
Changes in 2.15:
|
Changes in 2.15:
|
||||||
|
|
||||||
* The MIPS -membedded-pic option (Embedded-PIC code generation) is
|
* The MIPS -membedded-pic option (Embedded-PIC code generation) is
|
||||||
|
|
25
gas/as.c
25
gas/as.c
|
@ -123,6 +123,8 @@ static struct itbl_file_list *itbl_files;
|
||||||
|
|
||||||
static long start_time;
|
static long start_time;
|
||||||
|
|
||||||
|
static int flag_macro_alternate;
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_EMULATIONS
|
#ifdef USE_EMULATIONS
|
||||||
#define EMULATION_ENVIRON "AS_EMULATION"
|
#define EMULATION_ENVIRON "AS_EMULATION"
|
||||||
|
@ -244,6 +246,8 @@ Options:\n\
|
||||||
s include symbols\n\
|
s include symbols\n\
|
||||||
=FILE list to FILE (must be last sub-option)\n"));
|
=FILE list to FILE (must be last sub-option)\n"));
|
||||||
|
|
||||||
|
fprintf (stream, _("\
|
||||||
|
--alternate initially turn on alternate macro syntax\n"));
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
-D produce assembler debugging messages\n"));
|
-D produce assembler debugging messages\n"));
|
||||||
fprintf (stream, _("\
|
fprintf (stream, _("\
|
||||||
|
@ -414,6 +418,7 @@ parse_args (int * pargc, char *** pargv)
|
||||||
OPTION_TARGET_HELP,
|
OPTION_TARGET_HELP,
|
||||||
OPTION_EXECSTACK,
|
OPTION_EXECSTACK,
|
||||||
OPTION_NOEXECSTACK,
|
OPTION_NOEXECSTACK,
|
||||||
|
OPTION_ALTERNATE,
|
||||||
OPTION_WARN_FATAL
|
OPTION_WARN_FATAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -457,6 +462,7 @@ parse_args (int * pargc, char *** pargv)
|
||||||
{"execstack", no_argument, NULL, OPTION_EXECSTACK},
|
{"execstack", no_argument, NULL, OPTION_EXECSTACK},
|
||||||
{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
|
{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK},
|
||||||
#endif
|
#endif
|
||||||
|
{"alternate", no_argument, NULL, OPTION_ALTERNATE},
|
||||||
{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
|
{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
|
||||||
/* When you add options here, check that they do not collide with
|
/* When you add options here, check that they do not collide with
|
||||||
OPTION_MD_BASE. See as.h. */
|
OPTION_MD_BASE. See as.h. */
|
||||||
|
@ -731,6 +737,19 @@ the GNU General Public License. This program has absolutely no warranty.\n"));
|
||||||
flag_always_generate_output = 1;
|
flag_always_generate_output = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OPTION_ALTERNATE:
|
||||||
|
optarg = old_argv [optind - 1];
|
||||||
|
while (* optarg == '-')
|
||||||
|
optarg ++;
|
||||||
|
|
||||||
|
if (strcmp (optarg, "alternate") == 0)
|
||||||
|
{
|
||||||
|
flag_macro_alternate = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
optarg ++;
|
||||||
|
/* Fall through. */
|
||||||
|
|
||||||
case 'a':
|
case 'a':
|
||||||
if (optarg)
|
if (optarg)
|
||||||
{
|
{
|
||||||
|
@ -981,7 +1000,6 @@ perform_an_assembly_pass (int argc, char ** argv)
|
||||||
int
|
int
|
||||||
main (int argc, char ** argv)
|
main (int argc, char ** argv)
|
||||||
{
|
{
|
||||||
int macro_alternate;
|
|
||||||
int macro_strip_at;
|
int macro_strip_at;
|
||||||
int keep_it;
|
int keep_it;
|
||||||
|
|
||||||
|
@ -1036,7 +1054,6 @@ main (int argc, char ** argv)
|
||||||
if (flag_print_statistics)
|
if (flag_print_statistics)
|
||||||
xatexit (dump_statistics);
|
xatexit (dump_statistics);
|
||||||
|
|
||||||
macro_alternate = 0;
|
|
||||||
macro_strip_at = 0;
|
macro_strip_at = 0;
|
||||||
#ifdef TC_I960
|
#ifdef TC_I960
|
||||||
macro_strip_at = flag_mri;
|
macro_strip_at = flag_mri;
|
||||||
|
@ -1044,11 +1061,11 @@ main (int argc, char ** argv)
|
||||||
#ifdef TC_A29K
|
#ifdef TC_A29K
|
||||||
/* For compatibility with the AMD 29K family macro assembler
|
/* For compatibility with the AMD 29K family macro assembler
|
||||||
specification. */
|
specification. */
|
||||||
macro_alternate = 1;
|
flag_macro_alternate = 1;
|
||||||
macro_strip_at = 1;
|
macro_strip_at = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
macro_init (macro_alternate, flag_mri, macro_strip_at, macro_expr);
|
macro_init (flag_macro_alternate, flag_mri, macro_strip_at, macro_expr);
|
||||||
|
|
||||||
PROGRESS (1);
|
PROGRESS (1);
|
||||||
|
|
||||||
|
|
|
@ -226,9 +226,9 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
|
||||||
@c to be limited to one line for the header.
|
@c to be limited to one line for the header.
|
||||||
@smallexample
|
@smallexample
|
||||||
@c man begin SYNOPSIS
|
@c man begin SYNOPSIS
|
||||||
@value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{-D}] [@b{--defsym} @var{sym}=@var{val}]
|
@value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{--alternate}] [@b{-D}]
|
||||||
[@b{-f}] [@b{--gstabs}] [@b{--gstabs+}] [@b{--gdwarf2}] [@b{--help}]
|
[@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{--gstabs}] [@b{--gstabs+}]
|
||||||
[@b{-I} @var{dir}] [@b{-J}] [@b{-K}] [@b{-L}]
|
[@b{--gdwarf2}] [@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-lhs-width}=@var{NUM}] [@b{--listing-lhs-width2}=@var{NUM}]
|
||||||
[@b{--listing-rhs-width}=@var{NUM}] [@b{--listing-cont-lines}=@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}]
|
[@b{--keep-locals}] [@b{-o} @var{objfile}] [@b{-R}] [@b{--statistics}] [@b{-v}]
|
||||||
|
@ -463,6 +463,9 @@ You may combine these options; for example, use @samp{-aln} for assembly
|
||||||
listing without forms processing. The @samp{=file} option, if used, must be
|
listing without forms processing. The @samp{=file} option, if used, must be
|
||||||
the last one. By itself, @samp{-a} defaults to @samp{-ahls}.
|
the last one. By itself, @samp{-a} defaults to @samp{-ahls}.
|
||||||
|
|
||||||
|
@item --alternate
|
||||||
|
Begin in alternate macro mode, see @ref{Altmacro,,@code{.altmacro}}.
|
||||||
|
|
||||||
@item -D
|
@item -D
|
||||||
Ignored. This option is accepted for script compatibility with calls to
|
Ignored. This option is accepted for script compatibility with calls to
|
||||||
other assemblers.
|
other assemblers.
|
||||||
|
@ -1457,6 +1460,7 @@ assembler.)
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* a:: -a[cdhlns] enable listings
|
* a:: -a[cdhlns] enable listings
|
||||||
|
* alternate:: --alternate enable alternate macro syntax
|
||||||
* D:: -D for compatibility
|
* D:: -D for compatibility
|
||||||
* f:: -f to work faster
|
* f:: -f to work faster
|
||||||
* I:: -I for .include search path
|
* I:: -I for .include search path
|
||||||
|
@ -1529,6 +1533,12 @@ directives. This is because the listing code buffers input source lines from
|
||||||
stdin only after they have been preprocessed by the assembler. This reduces
|
stdin only after they have been preprocessed by the assembler. This reduces
|
||||||
memory usage and makes the code more efficient.
|
memory usage and makes the code more efficient.
|
||||||
|
|
||||||
|
@node alternate
|
||||||
|
@section @option{--alternate}
|
||||||
|
|
||||||
|
@kindex --alternate
|
||||||
|
Begin in alternate macro mode, see @ref{Altmacro,,@code{.altmacro}}.
|
||||||
|
|
||||||
@node D
|
@node D
|
||||||
@section @option{-D}
|
@section @option{-D}
|
||||||
|
|
||||||
|
@ -3677,6 +3687,7 @@ Some machine configurations provide additional directives.
|
||||||
@end ifset
|
@end ifset
|
||||||
|
|
||||||
* Align:: @code{.align @var{abs-expr} , @var{abs-expr}}
|
* Align:: @code{.align @var{abs-expr} , @var{abs-expr}}
|
||||||
|
* Altmacro:: @code{.altmacro}
|
||||||
* Ascii:: @code{.ascii "@var{string}"}@dots{}
|
* Ascii:: @code{.ascii "@var{string}"}@dots{}
|
||||||
* Asciz:: @code{.asciz "@var{string}"}@dots{}
|
* Asciz:: @code{.asciz "@var{string}"}@dots{}
|
||||||
* Balign:: @code{.balign @var{abs-expr} , @var{abs-expr}}
|
* Balign:: @code{.balign @var{abs-expr} , @var{abs-expr}}
|
||||||
|
@ -3753,6 +3764,7 @@ Some machine configurations provide additional directives.
|
||||||
|
|
||||||
* Macro:: @code{.macro @var{name} @var{args}}@dots{}
|
* Macro:: @code{.macro @var{name} @var{args}}@dots{}
|
||||||
* MRI:: @code{.mri @var{val}}
|
* MRI:: @code{.mri @var{val}}
|
||||||
|
* Noaltmacro:: @code{.noaltmacro}
|
||||||
* Nolist:: @code{.nolist}
|
* Nolist:: @code{.nolist}
|
||||||
* Octa:: @code{.octa @var{bignums}}
|
* Octa:: @code{.octa @var{bignums}}
|
||||||
* Org:: @code{.org @var{new-lc} , @var{fill}}
|
* Org:: @code{.org @var{new-lc} , @var{fill}}
|
||||||
|
@ -4847,20 +4859,52 @@ Exit early from the current macro definition.
|
||||||
executed in this pseudo-variable; you can copy that number to your
|
executed in this pseudo-variable; you can copy that number to your
|
||||||
output with @samp{\@@}, but @emph{only within a macro definition}.
|
output with @samp{\@@}, but @emph{only within a macro definition}.
|
||||||
|
|
||||||
@ignore
|
|
||||||
@item LOCAL @var{name} [ , @dots{} ]
|
@item LOCAL @var{name} [ , @dots{} ]
|
||||||
@emph{Warning: @code{LOCAL} is only available if you select ``alternate
|
@emph{Warning: @code{LOCAL} is only available if you select ``alternate
|
||||||
macro syntax'' with @samp{-a} or @samp{--alternate}.} @xref{Alternate,,
|
macro syntax'' with @samp{--alternate} or @code{.altmacro}.}
|
||||||
Alternate macro syntax}.
|
@xref{Altmacro,,@code{.altmacro}}.
|
||||||
|
@end ftable
|
||||||
|
|
||||||
Generate a string replacement for each of the @var{name} arguments, and
|
@node Altmacro
|
||||||
|
@section @code{.altmacro}
|
||||||
|
Enable alternate macro mode, enabling:
|
||||||
|
|
||||||
|
@ftable @code
|
||||||
|
@item LOCAL @var{name} [ , @dots{} ]
|
||||||
|
One additional directive, @code{LOCAL}, is available. It is used to
|
||||||
|
generate a string replacement for each of the @var{name} arguments, and
|
||||||
replace any instances of @var{name} in each macro expansion. The
|
replace any instances of @var{name} in each macro expansion. The
|
||||||
replacement string is unique in the assembly, and different for each
|
replacement string is unique in the assembly, and different for each
|
||||||
separate macro expansion. @code{LOCAL} allows you to write macros that
|
separate macro expansion. @code{LOCAL} allows you to write macros that
|
||||||
define symbols, without fear of conflict between separate macro expansions.
|
define symbols, without fear of conflict between separate macro expansions.
|
||||||
@end ignore
|
|
||||||
|
@item String delimiters
|
||||||
|
You can write strings delimited in these other ways besides
|
||||||
|
@code{"@var{string}"}:
|
||||||
|
|
||||||
|
@table @code
|
||||||
|
@item '@var{string}'
|
||||||
|
You can delimit strings with single-quote charaters.
|
||||||
|
|
||||||
|
@item <@var{string}>
|
||||||
|
You can delimit strings with matching angle brackets.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item single-character string escape
|
||||||
|
To include any single character literally in a string (even if the
|
||||||
|
character would otherwise have some special meaning), you can prefix the
|
||||||
|
character with @samp{!} (an exclamation mark). For example, you can
|
||||||
|
write @samp{<4.3 !> 5.4!!>} to get the literal text @samp{4.3 > 5.4!}.
|
||||||
|
|
||||||
|
@item Expression results as strings
|
||||||
|
You can write @samp{%@var{expr}} to evaluate the expression @var{expr}
|
||||||
|
and use the result as a string.
|
||||||
@end ftable
|
@end ftable
|
||||||
|
|
||||||
|
@node Noaltmacro
|
||||||
|
@section @code{.noaltmacro}
|
||||||
|
Disable alternate macro mode. @ref{Altmacro}
|
||||||
|
|
||||||
@node Nolist
|
@node Nolist
|
||||||
@section @code{.nolist}
|
@section @code{.nolist}
|
||||||
|
|
||||||
|
|
|
@ -132,6 +132,15 @@ macro_init (int alternate, int mri, int strip_at,
|
||||||
macro_expr = expr;
|
macro_expr = expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Switch in and out of alternate mode on the fly. */
|
||||||
|
|
||||||
|
void
|
||||||
|
macro_set_alternate(alternate)
|
||||||
|
int alternate;
|
||||||
|
{
|
||||||
|
macro_alternate = alternate;
|
||||||
|
}
|
||||||
|
|
||||||
/* Switch in and out of MRI mode on the fly. */
|
/* Switch in and out of MRI mode on the fly. */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -73,6 +73,7 @@ extern int macro_nest;
|
||||||
extern int buffer_and_nest (const char *, const char *, sb *, int (*) (sb *));
|
extern int buffer_and_nest (const char *, const char *, sb *, int (*) (sb *));
|
||||||
extern void macro_init
|
extern void macro_init
|
||||||
(int, int, int, int (*) (const char *, int, sb *, int *));
|
(int, int, int, int (*) (const char *, int, sb *, int *));
|
||||||
|
extern void macro_set_alternate (int);
|
||||||
extern void macro_mri_mode (int);
|
extern void macro_mri_mode (int);
|
||||||
extern const char *define_macro
|
extern const char *define_macro
|
||||||
(int, sb *, sb *, int (*) (sb *), const char **);
|
(int, sb *, sb *, int (*) (sb *), const char **);
|
||||||
|
|
12
gas/read.c
12
gas/read.c
|
@ -216,6 +216,7 @@ static int dwarf_file_string;
|
||||||
|
|
||||||
static void do_align (int, char *, int, int);
|
static void do_align (int, char *, int, int);
|
||||||
static void s_align (int, int);
|
static void s_align (int, int);
|
||||||
|
static void s_altmacro (int);
|
||||||
static int hex_float (int, char *);
|
static int hex_float (int, char *);
|
||||||
static segT get_known_segmented_expression (expressionS * expP);
|
static segT get_known_segmented_expression (expressionS * expP);
|
||||||
static void pobegin (void);
|
static void pobegin (void);
|
||||||
|
@ -251,6 +252,7 @@ static struct hash_control *po_hash;
|
||||||
static const pseudo_typeS potable[] = {
|
static const pseudo_typeS potable[] = {
|
||||||
{"abort", s_abort, 0},
|
{"abort", s_abort, 0},
|
||||||
{"align", s_align_ptwo, 0},
|
{"align", s_align_ptwo, 0},
|
||||||
|
{"altmacro", s_altmacro, 1},
|
||||||
{"ascii", stringer, 0},
|
{"ascii", stringer, 0},
|
||||||
{"asciz", stringer, 1},
|
{"asciz", stringer, 1},
|
||||||
{"balign", s_align_bytes, 0},
|
{"balign", s_align_bytes, 0},
|
||||||
|
@ -351,6 +353,7 @@ static const pseudo_typeS potable[] = {
|
||||||
{"mri", s_mri, 0},
|
{"mri", s_mri, 0},
|
||||||
{".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
|
{".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
|
||||||
{"name", s_ignore, 0},
|
{"name", s_ignore, 0},
|
||||||
|
{"noaltmacro", s_altmacro, 0},
|
||||||
{"noformat", s_ignore, 0},
|
{"noformat", s_ignore, 0},
|
||||||
{"nolist", listing_list, 0}, /* Turn listing off. */
|
{"nolist", listing_list, 0}, /* Turn listing off. */
|
||||||
{"nopage", listing_nopage, 0},
|
{"nopage", listing_nopage, 0},
|
||||||
|
@ -1320,6 +1323,15 @@ s_align_ptwo (int arg)
|
||||||
s_align (arg, 0);
|
s_align (arg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Switch in and out of alternate macro mode. */
|
||||||
|
|
||||||
|
void
|
||||||
|
s_altmacro (int on)
|
||||||
|
{
|
||||||
|
demand_empty_rest_of_line ();
|
||||||
|
macro_set_alternate (on);
|
||||||
|
}
|
||||||
|
|
||||||
symbolS *
|
symbolS *
|
||||||
s_comm_internal (int param,
|
s_comm_internal (int param,
|
||||||
symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
|
symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2004-08-13 Jan Beulich <jbeulich@novell.com>
|
||||||
|
|
||||||
|
* gas/all/altmacro.[sd]: New test.
|
||||||
|
* gas/all/gas.exp: Run the new test.
|
||||||
|
|
||||||
2004-08-10 Mark Mitchell <mark@codesourcery.com>
|
2004-08-10 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* gas/arm/bignum1.s: New test.
|
* gas/arm/bignum1.s: New test.
|
||||||
|
|
11
gas/testsuite/gas/all/altmacro.d
Normal file
11
gas/testsuite/gas/all/altmacro.d
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#as: --alternate
|
||||||
|
#objdump: -s -j .data
|
||||||
|
#name: alternate macro syntax
|
||||||
|
|
||||||
|
# Test the alternate macro syntax.
|
||||||
|
|
||||||
|
.*: .*
|
||||||
|
|
||||||
|
Contents of section .data:
|
||||||
|
0000 01020912 61626331 32332121 3c3e2721 .*
|
||||||
|
0010 3c3e273e 3c21 .*
|
36
gas/testsuite/gas/all/altmacro.s
Normal file
36
gas/testsuite/gas/all/altmacro.s
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
.macro m1 v1, v2
|
||||||
|
LOCAL l1, l2
|
||||||
|
label&v1:
|
||||||
|
l1: .byte v1
|
||||||
|
label&v2:
|
||||||
|
l2: .byte v2
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m2 v1, v2
|
||||||
|
m1 %v1, %(v2-v1)
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro m3 str
|
||||||
|
.ascii &str
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
m2 1, 3
|
||||||
|
m2 9, 27
|
||||||
|
|
||||||
|
m3 "abc"
|
||||||
|
m3 <123>
|
||||||
|
|
||||||
|
.noaltmacro
|
||||||
|
|
||||||
|
.macro m4 str
|
||||||
|
.ascii "&str"
|
||||||
|
.endm
|
||||||
|
|
||||||
|
m4 "!!<>'"
|
||||||
|
|
||||||
|
.altmacro
|
||||||
|
|
||||||
|
m3 "!!<>'"
|
||||||
|
m3 <!>!<!!>
|
|
@ -114,6 +114,8 @@ case $target_triplet in {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
run_dump_test altmacro
|
||||||
|
|
||||||
# This test is for any COFF target.
|
# This test is for any COFF target.
|
||||||
# We omit m88k COFF because it uses weird pseudo-op names.
|
# We omit m88k COFF because it uses weird pseudo-op names.
|
||||||
# We omit the ARM toolchains because they define locals to
|
# We omit the ARM toolchains because they define locals to
|
||||||
|
|
Loading…
Reference in a new issue