Add and handle new --alternate command line option.
authorNick Clifton <nickc@redhat.com>
Fri, 13 Aug 2004 19:53:52 +0000 (19:53 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 13 Aug 2004 19:53:52 +0000 (19:53 +0000)
gas/ChangeLog
gas/NEWS
gas/as.c
gas/doc/as.texinfo
gas/macro.c
gas/macro.h
gas/read.c
gas/testsuite/ChangeLog
gas/testsuite/gas/all/altmacro.d [new file with mode: 0644]
gas/testsuite/gas/all/altmacro.s [new file with mode: 0644]
gas/testsuite/gas/all/gas.exp

index bbd1ec2..f7df548 100644 (file)
@@ -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>
 
        * expr.c (operand): Handle the "~", "-", and "!" operators applied
index 87ed8c0..d4a6d65 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -12,6 +12,9 @@
 * Support for ColdFire EMAC instructions added and Motorola syntax for MAC/EMAC
   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:
 
 * The MIPS -membedded-pic option (Embedded-PIC code generation) is
index 0911aa1..b328762 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -123,6 +123,8 @@ static struct itbl_file_list *itbl_files;
 
 static long start_time;
 
+static int flag_macro_alternate;
+
 \f
 #ifdef USE_EMULATIONS
 #define EMULATION_ENVIRON "AS_EMULATION"
@@ -245,6 +247,8 @@ Options:\n\
                          =FILE  list to FILE (must be last sub-option)\n"));
 
   fprintf (stream, _("\
+  --alternate             initially turn on alternate macro syntax\n"));
+  fprintf (stream, _("\
   -D                      produce assembler debugging messages\n"));
   fprintf (stream, _("\
   --defsym SYM=VAL        define symbol SYM to given value\n"));
@@ -414,6 +418,7 @@ parse_args (int * pargc, char *** pargv)
       OPTION_TARGET_HELP,
       OPTION_EXECSTACK,
       OPTION_NOEXECSTACK,
+      OPTION_ALTERNATE,
       OPTION_WARN_FATAL
     };
   
@@ -457,6 +462,7 @@ parse_args (int * pargc, char *** pargv)
     {"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.  */
@@ -731,6 +737,19 @@ the GNU General Public License.  This program has absolutely no warranty.\n"));
          flag_always_generate_output = 1;
          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':
          if (optarg)
            {
@@ -981,7 +1000,6 @@ perform_an_assembly_pass (int argc, char ** argv)
 int
 main (int argc, char ** argv)
 {
-  int macro_alternate;
   int macro_strip_at;
   int keep_it;
 
@@ -1036,7 +1054,6 @@ main (int argc, char ** argv)
   if (flag_print_statistics)
     xatexit (dump_statistics);
 
-  macro_alternate = 0;
   macro_strip_at = 0;
 #ifdef TC_I960
   macro_strip_at = flag_mri;
@@ -1044,11 +1061,11 @@ main (int argc, char ** argv)
 #ifdef TC_A29K
   /* For compatibility with the AMD 29K family macro assembler
      specification.  */
-  macro_alternate = 1;
+  flag_macro_alternate = 1;
   macro_strip_at = 1;
 #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);
 
index c81b484..800d447 100644 (file)
@@ -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.
 @smallexample
 @c man begin SYNOPSIS
-@value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@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}]
+@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{--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}]
@@ -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
 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
 Ignored.  This option is accepted for script compatibility with calls to
 other assemblers.
@@ -1457,6 +1460,7 @@ assembler.)
 
 @menu
 * a::             -a[cdhlns] enable listings
+* alternate::     --alternate enable alternate macro syntax
 * D::             -D for compatibility
 * f::             -f to work faster
 * 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
 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
 @section @option{-D}
 
@@ -3677,6 +3687,7 @@ Some machine configurations provide additional directives.
 @end ifset
 
 * Align::                       @code{.align @var{abs-expr} , @var{abs-expr}}
+* Altmacro::                    @code{.altmacro}
 * Ascii::                       @code{.ascii "@var{string}"}@dots{}
 * Asciz::                       @code{.asciz "@var{string}"}@dots{}
 * 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{}
 * MRI::                                @code{.mri @var{val}}
+* Noaltmacro::                  @code{.noaltmacro}
 * Nolist::                      @code{.nolist}
 * Octa::                        @code{.octa @var{bignums}}
 * 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
 output with @samp{\@@}, but @emph{only within a macro definition}.
 
-@ignore
 @item LOCAL @var{name} [ , @dots{} ]
 @emph{Warning: @code{LOCAL} is only available if you select ``alternate
-macro syntax'' with @samp{-a} or @samp{--alternate}.}  @xref{Alternate,,
-Alternate macro syntax}.
+macro syntax'' with @samp{--alternate} or @code{.altmacro}.}
+@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
 replacement string is unique in the assembly, and different for each
 separate macro expansion.  @code{LOCAL} allows you to write macros that
 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
 
+@node Noaltmacro
+@section @code{.noaltmacro}
+Disable alternate macro mode.  @ref{Altmacro}
+
 @node Nolist
 @section @code{.nolist}
 
index 0991744..1a89cc8 100644 (file)
@@ -132,6 +132,15 @@ macro_init (int alternate, int mri, int strip_at,
   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.  */
 
 void
index a8bffaa..7e66578 100644 (file)
@@ -73,6 +73,7 @@ extern int macro_nest;
 extern int buffer_and_nest (const char *, const char *, sb *, int (*) (sb *));
 extern void macro_init
   (int, int, int, int (*) (const char *, int, sb *, int *));
+extern void macro_set_alternate (int);
 extern void macro_mri_mode (int);
 extern const char *define_macro
   (int, sb *, sb *, int (*) (sb *), const char **);
index 93e3ec4..e1f7a2f 100644 (file)
@@ -216,6 +216,7 @@ static int dwarf_file_string;
 
 static void do_align (int, char *, int, int);
 static void s_align (int, int);
+static void s_altmacro (int);
 static int hex_float (int, char *);
 static segT get_known_segmented_expression (expressionS * expP);
 static void pobegin (void);
@@ -251,6 +252,7 @@ static struct hash_control *po_hash;
 static const pseudo_typeS potable[] = {
   {"abort", s_abort, 0},
   {"align", s_align_ptwo, 0},
+  {"altmacro", s_altmacro, 1},
   {"ascii", stringer, 0},
   {"asciz", stringer, 1},
   {"balign", s_align_bytes, 0},
@@ -351,6 +353,7 @@ static const pseudo_typeS potable[] = {
   {"mri", s_mri, 0},
   {".mri", s_mri, 0},  /* Special case so .mri works in MRI mode.  */
   {"name", s_ignore, 0},
+  {"noaltmacro", s_altmacro, 0},
   {"noformat", s_ignore, 0},
   {"nolist", listing_list, 0}, /* Turn listing off.  */
   {"nopage", listing_nopage, 0},
@@ -1320,6 +1323,15 @@ s_align_ptwo (int arg)
   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 *
 s_comm_internal (int param,
                 symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
index e61fd49..a5c3ddb 100644 (file)
@@ -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>
 
        * gas/arm/bignum1.s: New test.
diff --git a/gas/testsuite/gas/all/altmacro.d b/gas/testsuite/gas/all/altmacro.d
new file mode 100644 (file)
index 0000000..12f3abb
--- /dev/null
@@ -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                       .*
diff --git a/gas/testsuite/gas/all/altmacro.s b/gas/testsuite/gas/all/altmacro.s
new file mode 100644 (file)
index 0000000..c7dbea1
--- /dev/null
@@ -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     <!>!<!!>
index df8d71d..3fb713c 100644 (file)
@@ -114,6 +114,8 @@ case $target_triplet in {
     }
 }
 
+run_dump_test altmacro
+
 # This test is for any COFF target.
 # We omit m88k COFF because it uses weird pseudo-op names.
 # We omit the ARM toolchains because they define locals to