PR gas/3129

* doc/as.texinfo (Macro): Improve documentation about separating macro arguments from following text.
This commit is contained in:
Nick Clifton
2006-09-08 16:25:46 +00:00
parent f91e006cf5
commit 6258339fa4
2 changed files with 70 additions and 12 deletions

View File

@ -1,3 +1,9 @@
2006-09-08 Nick Clifton <nickc@redhat.com>
PR gas/3129
* doc/as.texinfo (Macro): Improve documentation about separating
macro arguments from following text.
2006-09-08 Paul Brook <paul@codesourcery.com> 2006-09-08 Paul Brook <paul@codesourcery.com>
* config/tc-arm.c (insns): Allow ARM IT pseudo-insn on all cores. * config/tc-arm.c (insns): Allow ARM IT pseudo-insn on all cores.

View File

@ -4987,7 +4987,7 @@ definitions. For example, these are all valid @code{.macro} statements:
Begin the definition of a macro called @code{comm}, which takes no Begin the definition of a macro called @code{comm}, which takes no
arguments. arguments.
@item .macro plus1 p, p1 @item .macro plus1 p, p1
@itemx .macro plus1 p p1 @itemx .macro plus1 p p1
Either statement begins the definition of a macro called @code{plus1}, Either statement begins the definition of a macro called @code{plus1},
which takes two arguments; within the macro definition, write which takes two arguments; within the macro definition, write
@ -5001,7 +5001,6 @@ After the definition is complete, you can call the macro either as
@var{a} and @samp{\p2} evaluating to @var{b}), or as @samp{reserve_str @var{a} and @samp{\p2} evaluating to @var{b}), or as @samp{reserve_str
,@var{b}} (with @samp{\p1} evaluating as the default, in this case ,@var{b}} (with @samp{\p1} evaluating as the default, in this case
@samp{0}, and @samp{\p2} evaluating to @var{b}). @samp{0}, and @samp{\p2} evaluating to @var{b}).
@end table
@item .macro m p1:req, p2=0, p3:vararg @item .macro m p1:req, p2=0, p3:vararg
Begin the definition of a macro called @code{m}, with at least three Begin the definition of a macro called @code{m}, with at least three
@ -5013,21 +5012,72 @@ When you call a macro, you can specify the argument values either by
position, or by keyword. For example, @samp{sum 9,17} is equivalent to position, or by keyword. For example, @samp{sum 9,17} is equivalent to
@samp{sum to=17, from=9}. @samp{sum to=17, from=9}.
@end table
Note that since each of the @var{macargs} can be an identifier exactly Note that since each of the @var{macargs} can be an identifier exactly
as any other one permitted by the target architecture, there may be as any other one permitted by the target architecture, there may be
occasional problems if the target hand-crafts special meanings to certain occasional problems if the target hand-crafts special meanings to certain
characters when they occur in a special position. For example, if colon characters when they occur in a special position. For example, if the colon
(@code{:}) is generally permitted to be part of a symbol name, but the (@code{:}) is generally permitted to be part of a symbol name, but the
architecture specific code special-cases it when occuring as the final architecture specific code special-cases it when occurring as the final
character of a symbol (to denote a label), then the macro parameter character of a symbol (to denote a label), then the macro parameter
replacement code will have no way of knowing that and consider the whole replacement code will have no way of knowing that and consider the whole
construct (including the colon) an identifier, and check only this construct (including the colon) an identifier, and check only this
identifier for being the subject to parameter substitution. In this identifier for being the subject to parameter substitution. So for example
example, besides the potential of just separating identifier and colon this macro definition:
by white space, using alternate macro syntax (@xref{Altmacro}.) and
ampersand (@code{&}) as the character to separate literal text from macro @example
parameters (or macro parameters from one another) would provide a way to .macro label l
achieve the same effect: \l:
.endm
@end example
might not work as expected. Invoking @samp{label foo} might not create a label
called @samp{foo} but instead just insert the text @samp{\l:} into the
assembler source, probably generating an error about an unrecognised
identifier.
Similarly problems might occur with the period character (@samp{.})
which is often allowed inside opcode names (and hence identifier names). So
for example constructing a macro to build an opcode from a base name and a
length specifier like this:
@example
.macro opcode base length
\base.\length
.endm
@end example
and invoking it as @samp{opcode store l} will not create a @samp{store.l}
instruction but instead generate some kind of error as the assembler tries to
interpret the text @samp{\base.\length}.
There are several possible ways around this problem:
@table @code
@item Insert white space
If it is possible to use white space characters then this is the simplest
solution. eg:
@example
.macro label l
\l :
.endm
@end example
@item Use @samp{\()}
The string @samp{\()} can be used to separate the end of a macro argument from
the following text. eg:
@example
.macro opcode base length
\base\().\length
.endm
@end example
@item Use the alternate macro syntax mode
In the alternative macro syntax mode the ampersand character (@samp{&}) can be
used as a separator. eg:
@example @example
.altmacro .altmacro
@ -5035,9 +5085,11 @@ achieve the same effect:
l&: l&:
.endm .endm
@end example @end example
@end table
This applies identically to the identifiers used in @code{.irp} (@xref{Irp}.) Note - this problem of correctly identifying string parameters to pseudo ops
and @code{.irpc} (@xref{Irpc}.). also applies to the identifiers used in @code{.irp} (@xref{Irp}.)
and @code{.irpc} (@xref{Irpc}.) as well.
@item .endm @item .endm
@cindex @code{endm} directive @cindex @code{endm} directive