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& 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) 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>