Let the integrated assembler understand .warning, PR20428.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213873 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nico Weber
2014-07-24 16:26:06 +00:00
parent 1dd6dee3ac
commit 2604a975ba
2 changed files with 59 additions and 1 deletions

View File

@@ -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) {