From: Nico Weber Date: Thu, 24 Jul 2014 16:26:06 +0000 (+0000) Subject: Let the integrated assembler understand .warning, PR20428. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2604a975bacde861c1097c2d3b11cb8e4e606158;p=llvm Let the integrated assembler understand .warning, PR20428. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index ed1d704c1d6..f1ec64c8a79 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -357,7 +357,7 @@ private: DK_CFI_REGISTER, DK_CFI_WINDOW_SAVE, DK_MACROS_ON, DK_MACROS_OFF, DK_MACRO, DK_ENDM, DK_ENDMACRO, DK_PURGEM, DK_SLEB128, DK_ULEB128, - DK_ERR, DK_ERROR, + DK_ERR, DK_ERROR, DK_WARNING, DK_END }; @@ -474,6 +474,9 @@ private: // ".err" or ".error" bool parseDirectiveError(SMLoc DirectiveLoc, bool WithMessage); + // ".warning" + bool parseDirectiveWarning(SMLoc DirectiveLoc); + void initializeDirectiveKindMap(); }; } @@ -1553,6 +1556,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info) { return parseDirectiveError(IDLoc, false); case DK_ERROR: return parseDirectiveError(IDLoc, true); + case DK_WARNING: + return parseDirectiveWarning(IDLoc); } return Error(IDLoc, "unknown directive"); @@ -4073,6 +4078,32 @@ bool AsmParser::parseDirectiveError(SMLoc L, bool WithMessage) { return true; } +/// parseDirectiveWarning +/// ::= .warning [string] +bool AsmParser::parseDirectiveWarning(SMLoc L) { + if (!TheCondStack.empty()) { + if (TheCondStack.back().Ignore) { + eatToEndOfStatement(); + return false; + } + } + + StringRef Message = ".warning directive invoked in source file"; + if (Lexer.isNot(AsmToken::EndOfStatement)) { + if (Lexer.isNot(AsmToken::String)) { + TokError(".warning argument must be a string"); + eatToEndOfStatement(); + return true; + } + + Message = getTok().getStringContents(); + Lex(); + } + + Warning(L, Message); + return false; +} + /// parseDirectiveEndIf /// ::= .endif bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) { @@ -4205,6 +4236,7 @@ void AsmParser::initializeDirectiveKindMap() { DirectiveKindMap[".purgem"] = DK_PURGEM; DirectiveKindMap[".err"] = DK_ERR; DirectiveKindMap[".error"] = DK_ERROR; + DirectiveKindMap[".warning"] = DK_WARNING; } MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) { diff --git a/test/MC/AsmParser/directive-warning.s b/test/MC/AsmParser/directive-warning.s new file mode 100644 index 00000000000..311989ee3fa --- /dev/null +++ b/test/MC/AsmParser/directive-warning.s @@ -0,0 +1,26 @@ +// RUN: llvm-mc -triple i386 %s 2>&1 | FileCheck %s + + .warning +// CHECK: warning: .warning directive invoked in source file +// CHECK-NEXT: .warning +// CHECK-NEXT: ^ + + .ifc a,a + .warning + .endif +// CHECK: warning: .warning directive invoked in source file +// CHECK-NEXT: .warning +// CHECK-NEXT: ^ + + .ifnc a,a + .warning + .endif +// CHECK-NOT: warning: .warning directive invoked in source file + + .warning "here be dragons" +// CHECK: warning: here be dragons + + .ifc one, two + .warning "dragons, i say" + .endif +// CHECK-NOT: warning: dragons, i say