This is the mail archive of the
binutils@sourceware.cygnus.com
mailing list for the binutils project.
Re: gas .macro quirks, and an ARM bug
- To: Nick Clifton <nickc at cygnus dot com>
- Subject: Re: gas .macro quirks, and an ARM bug
- From: Ulf Carlsson <ulfc at calypso dot engr dot sgi dot com>
- Date: Thu, 8 Jun 2000 13:13:20 -0700 (PDT)
- Cc: andrewm at netwinder dot org, binutils at sourceware dot cygnus dot com
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)