PR gas/3129
authorNick Clifton <nickc@redhat.com>
Fri, 8 Sep 2006 16:25:46 +0000 (16:25 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 8 Sep 2006 16:25:46 +0000 (16:25 +0000)
* doc/as.texinfo (Macro): Improve documentation about separating macro arguments from following text.

gas/ChangeLog
gas/doc/as.texinfo

index b5dd1723aa63bd960df0edf6a94472d9d1503b7c..2062dd8ca5c92b09441c6b88c7b9375d9df36dd8 100644 (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>
 
        * config/tc-arm.c (insns): Allow ARM IT pseudo-insn on all cores.
index 494381fdfc504b99b2c5136108daa89a37a2b0ec..150ef30ac8fc59eb8820e72883e245ecbe67ed33 100644 (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
 arguments.
 
-@item .macro plus1 p, p1
+@item  .macro plus1 p, p1
 @itemx .macro plus1 p p1
 Either statement begins the definition of a macro called @code{plus1},
 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{b}} (with @samp{\p1} evaluating as the default, in this case
 @samp{0}, and @samp{\p2} evaluating to @var{b}).
-@end table
 
 @item .macro m p1:req, p2=0, p3:vararg
 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
 @samp{sum to=17, from=9}.
 
+@end table
+
 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
 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
-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
 replacement code will have no way of knowing that and consider the whole
 construct (including the colon) an identifier, and check only this
-identifier for being the subject to parameter substitution.  In this
-example, besides the potential of just separating identifier and colon
-by white space, using alternate macro syntax (@xref{Altmacro}.) and
-ampersand (@code{&}) as the character to separate literal text from macro
-parameters (or macro parameters from one another) would provide a way to
-achieve the same effect:
+identifier for being the subject to parameter substitution.  So for example
+this macro definition:
+
+@example
+       .macro label l
+\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
        .altmacro
@@ -5035,9 +5085,11 @@ achieve the same effect:
 l&:
        .endm
 @end example
+@end table
 
-This applies identically to the identifiers used in @code{.irp} (@xref{Irp}.)
-and @code{.irpc} (@xref{Irpc}.).
+Note - this problem of correctly identifying string parameters to pseudo ops
+also applies to the identifiers used in @code{.irp} (@xref{Irp}.) 
+and @code{.irpc} (@xref{Irpc}.) as well.
 
 @item .endm
 @cindex @code{endm} directive