[llvm] r201999 - Asm Parser: support .error directive
Saleem Abdulrasool
compnerd at compnerd.org
Sun Feb 23 15:02:23 PST 2014
Author: compnerd
Date: Sun Feb 23 17:02:23 2014
New Revision: 201999
URL: http://llvm.org/viewvc/llvm-project?rev=201999&view=rev
Log:
Asm Parser: support .error directive
The .error directive is similar to .err in that it will halt assembly if it is
evaluated for assembly. However, it permits a user supplied message to be
rendered.
Added:
llvm/trunk/test/MC/AsmParser/directive-err-diagnostics.s
Modified:
llvm/trunk/lib/MC/MCParser/AsmParser.cpp
llvm/trunk/test/MC/AsmParser/directive-err.s
Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=201999&r1=201998&r2=201999&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Sun Feb 23 17:02:23 2014
@@ -361,7 +361,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_ERR, DK_ERROR,
DK_END
};
@@ -475,8 +475,8 @@ private:
// "end"
bool parseDirectiveEnd(SMLoc DirectiveLoc);
- // "err"
- bool parseDirectiveErr(SMLoc DirectiveLoc);
+ // ".err" or ".error"
+ bool parseDirectiveError(SMLoc DirectiveLoc, bool WithMessage);
void initializeDirectiveKindMap();
};
@@ -1537,7 +1537,9 @@ bool AsmParser::parseStatement(ParseStat
case DK_END:
return parseDirectiveEnd(IDLoc);
case DK_ERR:
- return parseDirectiveErr(IDLoc);
+ return parseDirectiveError(IDLoc, false);
+ case DK_ERROR:
+ return parseDirectiveError(IDLoc, true);
}
return Error(IDLoc, "unknown directive");
@@ -3982,13 +3984,34 @@ bool AsmParser::parseDirectiveEnd(SMLoc
return false;
}
-/// parseDirectiveErr
-/// ::= .err
-bool AsmParser::parseDirectiveErr(SMLoc Loc) {
- if (!TheCondStack.empty())
- if (TheCondStack.back().Ignore)
+/// parseDirectiveError
+/// ::= .err
+/// ::= .error [string]
+bool AsmParser::parseDirectiveError(SMLoc L, bool WithMessage) {
+ if (!TheCondStack.empty()) {
+ if (TheCondStack.back().Ignore) {
+ eatToEndOfStatement();
return false;
- return Error(Loc, ".err encountered");
+ }
+ }
+
+ if (!WithMessage)
+ return Error(L, ".err encountered");
+
+ StringRef Message = ".error directive invoked in source file";
+ if (Lexer.isNot(AsmToken::EndOfStatement)) {
+ if (Lexer.isNot(AsmToken::String)) {
+ TokError(".error argument must be a string");
+ eatToEndOfStatement();
+ return true;
+ }
+
+ Message = getTok().getStringContents();
+ Lex();
+ }
+
+ Error(L, Message);
+ return true;
}
/// parseDirectiveEndIf
@@ -4117,6 +4140,7 @@ void AsmParser::initializeDirectiveKindM
DirectiveKindMap[".endmacro"] = DK_ENDMACRO;
DirectiveKindMap[".purgem"] = DK_PURGEM;
DirectiveKindMap[".err"] = DK_ERR;
+ DirectiveKindMap[".error"] = DK_ERROR;
}
MCAsmMacro *AsmParser::parseMacroLikeBody(SMLoc DirectiveLoc) {
Added: llvm/trunk/test/MC/AsmParser/directive-err-diagnostics.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive-err-diagnostics.s?rev=201999&view=auto
==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive-err-diagnostics.s (added)
+++ llvm/trunk/test/MC/AsmParser/directive-err-diagnostics.s Sun Feb 23 17:02:23 2014
@@ -0,0 +1,17 @@
+// RUN: not llvm-mc -triple i386 %s 2>&1 | FileCheck %s
+
+ .error 0
+// CHECK: error: .error argument must be a string
+// CHECK: .error 0
+// CHECK: ^
+
+ .ifeqs "0", "1"
+ .ifeqs "", ""
+ .error "message"
+ .endif
+ .endif
+// CHECK-NOT: error: message
+// CHECK-NOT: error: invalid instruction mnemonic 'message'
+// CHECK-NOT: .error "message"
+// CHECK-NOT: ^
+
Modified: llvm/trunk/test/MC/AsmParser/directive-err.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive-err.s?rev=201999&r1=201998&r2=201999&view=diff
==============================================================================
--- llvm/trunk/test/MC/AsmParser/directive-err.s (original)
+++ llvm/trunk/test/MC/AsmParser/directive-err.s Sun Feb 23 17:02:23 2014
@@ -17,3 +17,14 @@
.endif
// CHECK-NOT: error: .err encountered
+ .error "This is my error. There are many like it, but this one is mine."
+// CHECK: error: This is my error. There are many like it, but this one is mine.
+
+ .ifc one, two
+ .error "My error is my best friend."
+ .endif
+// CHECK-NOT: error: My error is my best friend.
+
+ .error
+// CHECK: error: .error directive invoked in source file
+
More information about the llvm-commits
mailing list