gas .macro quirks, and an ARM bug

Ulf Carlsson ulfc@calypso.engr.sgi.com
Thu Jun 8 13:15:00 GMT 2000


Hi Nick,

> : No, this was intentional.  The only problem I see with the current
> : implementation is that you actually can't pass a `\"' through it if
> : you really want a quote character in your string.
> : 
> :         .macro  hello   narg1
> :                 .asciiz  "\narg1"
> :         .endm
> :         hello   "a quote char: \""
> : 
> : This assembles into
> : 
> : 	Contents of section .text:
> : 	 0000 61207175 6f746520 63686172 3a202200  a quote char: ".
> : 	Contents of section .data:
> : 
> : You can probably get the same effect by passing `\\"' with your patch, but I
> : think that's even more obscure since expansion of escape sequences usually
> : isn't done in arguments to macros.  The logical syntax would have
> : been `\\\"'. 
> 
> Good point.  OK I agree that your patch is the correct solution,
> although we still need to add one small extra test, to make sure that
> the character following the backslash is actually present:

Hm.. what if you want a backslash as the last character in your string?  My
original patch didn't deal with that either of course, but it's a funny
thought anyway.  To get a backslash as the last character in your string, you
would have to escape it so it would look like `\\"'.  With your this patch
however we would try to pass on that sequence and we would never find the
ending `"'.  I added a test that verifies that the backslash isn't escaped.

Ulf

Index: macro.c
===================================================================
RCS file: /cvs/src/src/gas/macro.c,v
retrieving revision 1.7
diff -u -p -r1.7 macro.c
--- macro.c	2000/05/01 14:01:06	1.7
+++ macro.c	2000/06/08 20:10:45
@@ -312,6 +312,15 @@ getstring (idx, in, acc)
 		  idx++  ;
 		  sb_add_char (acc, in->ptr[idx++]);
 		}
+	      else if (in->ptr[idx] == '\\'
+		       && in->ptr[idx-1] != '\\'
+		       && idx + 1 < in->len
+		       && in->ptr[idx+1] == tchar)
+		{
+		  sb_add_char (acc, '\\');
+		  sb_add_char (acc, tchar);
+		  idx += 2;
+		}
 	      else
 		{
 		  if (in->ptr[idx] == tchar)



More information about the Binutils mailing list