[LLVMdev] Assembly macros instantiation problem

Nikita Shulga nikita at openhuawei.org
Wed May 23 11:36:45 PDT 2012


Hello,

I've noticed a following strange behavior:
clang-3.2 fails to compile/parse any assembly code that invokes macros which named arguments contains non alphanumeric characters.
For example, compilation of the following code snippet would fail with "Parameter not found" error:
.macro mov_macro reg_1,    reg_2
movl %\reg_1, %\reg_2
.endm
mov_macro eax, ebx

Although, if one removes underscores from mov_macro argument names, compilation would succeed.
Such behavior is due to the glitch in AsmParser::expandMacro() logic: it treats first non-alphanumeric character as the end of argument instantiation token.

Following patch fixes the issue (IsIdentifierChar routine implementation was borrowed from lib/MC/MCParser/AsmLexer.cpp):
===================================================================
--- lib/MC/MCParser/AsmParser.cpp	(revision 157279)
+++ lib/MC/MCParser/AsmParser.cpp	(working copy)
@@ -1436,6 +1436,11 @@
     NewDiag.print(0, OS);
 }
 
+/// LexIdentifier: [a-zA-Z_.][a-zA-Z0-9_$.@]*
+static bool IsIdentifierChar(char c) {
+  return isalnum(c) || c == '_' || c == '$' || c == '.' || c == '@';
+}
+
 bool AsmParser::expandMacro(SmallString<256> &Buf, StringRef Body,
                             const std::vector<StringRef> &Parameters,
                             const std::vector<std::vector<AsmToken> > &A,
@@ -1501,7 +1506,7 @@
       Pos += 2;
     } else {
       unsigned I = Pos + 1;
-      while (isalnum(Body[I]) && I + 1 != End)
+      while (IsIdentifierChar(Body[I]) && I + 1 != End)
         ++I;
 
       const char *Begin = Body.data() + Pos +1;
===================================================================


Regards,
Nikita



More information about the llvm-dev mailing list