[PATCH] D32792: [LLVM][inline-asm] Altmacro string escape character '!'
Phabricator via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed May 10 06:21:27 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL302652: [LLVM][inline-asm] Altmacro string escape character '!' (authored by mzuckerm).
Changed prior to commit:
https://reviews.llvm.org/D32792?vs=98091&id=98439#toc
Repository:
rL LLVM
https://reviews.llvm.org/D32792
Files:
llvm/trunk/lib/MC/MCParser/AsmParser.cpp
llvm/trunk/test/MC/AsmParser/altmacro_string_escape.s
Index: llvm/trunk/test/MC/AsmParser/altmacro_string_escape.s
===================================================================
--- llvm/trunk/test/MC/AsmParser/altmacro_string_escape.s
+++ llvm/trunk/test/MC/AsmParser/altmacro_string_escape.s
@@ -0,0 +1,29 @@
+# RUN: llvm-mc -triple i386-linux-gnu %s| FileCheck %s
+
+.altmacro
+# 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 `!'.
+# For example, you can write `<4.3 !> 5.4!!>' to get the literal text `4.3 > 5.4!'.
+
+# CHECK: workForFun:
+.macro fun1 number
+ .if \number=5
+ lableNotWork:
+ .else
+ workForFun:
+ .endif
+.endm
+
+# CHECK: workForFun2:
+.macro fun2 string
+ .if \string
+ workForFun2:
+ .else
+ notworkForFun2:
+ .endif
+.endm
+
+fun1 <5!!>
+fun2 <5!>4>
Index: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
===================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp
@@ -288,6 +288,7 @@
private:
bool isAltmacroString(SMLoc &StrLoc, SMLoc &EndLoc);
+ void altMacroString(StringRef AltMacroStr, std::string &Res);
bool parseStatement(ParseStatementInfo &Info,
MCAsmParserSemaCallback *SI);
bool parseCurlyBlockScope(SmallVectorImpl<AsmRewrite>& AsmStrRewrites);
@@ -1209,6 +1210,8 @@
const char *CharPtr = StrLoc.getPointer();
while ((*CharPtr != '>') && (*CharPtr != '\n') &&
(*CharPtr != '\r') && (*CharPtr != '\0')){
+ if(*CharPtr == '!')
+ CharPtr++;
CharPtr++;
}
if (*CharPtr == '>') {
@@ -1218,6 +1221,15 @@
return false;
}
+/// \brief creating a string without the escape characters '!'.
+void AsmParser::altMacroString(StringRef AltMacroStr,std::string &Res) {
+ for (int Pos = 0; Pos < AltMacroStr.size(); Pos++) {
+ if (AltMacroStr[Pos] == '!')
+ Pos++;
+ Res += AltMacroStr[Pos];
+ }
+}
+
/// \brief Parse an expression and return it.
///
/// expr ::= expr &&,|| expr -> lowest.
@@ -2309,6 +2321,15 @@
(*(Token.getString().begin()) == '%') && Token.is(AsmToken::Integer))
// Emit an integer value to the buffer.
OS << Token.getIntVal();
+ // Only Token that was validated as a string and begins with '<'
+ // is considered altMacroString!!!
+ else if ((Lexer.IsaAltMacroMode()) &&
+ (*(Token.getString().begin()) == '<') &&
+ Token.is(AsmToken::String)) {
+ std::string Res;
+ altMacroString(Token.getStringContents(), Res);
+ OS << Res;
+ }
// We expect no quotes around the string's contents when
// parsing for varargs.
else if (Token.isNot(AsmToken::String) || VarargParameter)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D32792.98439.patch
Type: text/x-patch
Size: 2940 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170510/eae7e46d/attachment.bin>
More information about the llvm-commits
mailing list