<div dir="ltr">This seems very likely to be causing ASan and other failures:<div><br><div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/16291/steps/annotate/logs/stdio">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/16291/steps/annotate/logs/stdio</a><br></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Sep 12, 2016 at 1:11 PM Nirav Dave via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: niravd<br class="gmail_msg">
Date: Mon Sep 12 15:03:02 2016<br class="gmail_msg">
New Revision: 281249<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=281249&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=281249&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[MC] Defer asm errors to post-statement failure<br class="gmail_msg">
<br class="gmail_msg">
Allow errors to be deferred and emitted as part of clean up to simplify<br class="gmail_msg">
and shorten Assembly parser code. This will allow error messages to be<br class="gmail_msg">
emitted in helper functions and be modified by the caller which has<br class="gmail_msg">
better context.<br class="gmail_msg">
<br class="gmail_msg">
As part of this many minor cleanups to the Parser:<br class="gmail_msg">
<br class="gmail_msg">
* Unify parser cleanup on error<br class="gmail_msg">
* Add Workaround for incorrect return values in ParseDirective instances<br class="gmail_msg">
* Tighten checks on error-signifying return values for parser functions<br class="gmail_msg">
and fix in-tree TargetParsers to be more consistent with the changes.<br class="gmail_msg">
* Fix AArch64 test cases checking for spurious error messages that are<br class="gmail_msg">
now fixed.<br class="gmail_msg">
<br class="gmail_msg">
These changes should be backwards compatible with current Target Parsers<br class="gmail_msg">
so long as the error status are correctly returned in appropriate<br class="gmail_msg">
functions.<br class="gmail_msg">
<br class="gmail_msg">
Reviewers: rnk, majnemer<br class="gmail_msg">
<br class="gmail_msg">
Subscribers: aemerson, jyknight, llvm-commits<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D24047" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24047</a><br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h<br class="gmail_msg">
llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h<br class="gmail_msg">
llvm/trunk/include/llvm/Support/SMLoc.h<br class="gmail_msg">
llvm/trunk/lib/MC/MCParser/AsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp<br class="gmail_msg">
llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp<br class="gmail_msg">
llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp<br class="gmail_msg">
llvm/trunk/test/MC/AArch64/armv8.1a-rdma.s<br class="gmail_msg">
llvm/trunk/test/MC/AArch64/inst-directive-diagnostic.s<br class="gmail_msg">
llvm/trunk/test/MC/AArch64/neon-diagnostics.s<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmLexer.h Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -144,6 +144,7 @@ protected: // Can only create subclasses<br class="gmail_msg">
const char *TokStart;<br class="gmail_msg">
bool SkipSpace;<br class="gmail_msg">
bool AllowAtInIdentifier;<br class="gmail_msg">
+ bool IsAtStartOfStatement;<br class="gmail_msg">
<br class="gmail_msg">
MCAsmLexer();<br class="gmail_msg">
<br class="gmail_msg">
@@ -163,6 +164,8 @@ public:<br class="gmail_msg">
/// the main input file has been reached.<br class="gmail_msg">
const AsmToken &Lex() {<br class="gmail_msg">
assert(!CurTok.empty());<br class="gmail_msg">
+ // Mark if we parsing out a EndOfStatement.<br class="gmail_msg">
+ IsAtStartOfStatement = CurTok.front().getKind() == AsmToken::EndOfStatement;<br class="gmail_msg">
CurTok.erase(CurTok.begin());<br class="gmail_msg">
// LexToken may generate multiple tokens via UnLex but will always return<br class="gmail_msg">
// the first one. Place returned value at head of CurTok vector.<br class="gmail_msg">
@@ -174,9 +177,12 @@ public:<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
void UnLex(AsmToken const &Token) {<br class="gmail_msg">
+ IsAtStartOfStatement = false;<br class="gmail_msg">
CurTok.insert(CurTok.begin(), Token);<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
+ bool isAtStartOfStatement() { return IsAtStartOfStatement; }<br class="gmail_msg">
+<br class="gmail_msg">
virtual StringRef LexUntilEndOfStatement() = 0;<br class="gmail_msg">
<br class="gmail_msg">
/// Get the current source location.<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -11,7 +11,9 @@<br class="gmail_msg">
#define LLVM_MC_MCPARSER_MCASMPARSER_H<br class="gmail_msg">
<br class="gmail_msg">
#include "llvm/ADT/ArrayRef.h"<br class="gmail_msg">
+#include "llvm/ADT/SmallString.h"<br class="gmail_msg">
#include "llvm/ADT/StringRef.h"<br class="gmail_msg">
+#include "llvm/ADT/Twine.h"<br class="gmail_msg">
#include "llvm/MC/MCParser/AsmLexer.h"<br class="gmail_msg">
#include "llvm/Support/DataTypes.h"<br class="gmail_msg">
<br class="gmail_msg">
@@ -67,6 +69,12 @@ public:<br class="gmail_msg">
typedef std::pair<MCAsmParserExtension*, DirectiveHandler><br class="gmail_msg">
ExtensionDirectiveHandler;<br class="gmail_msg">
<br class="gmail_msg">
+ struct MCPendingError {<br class="gmail_msg">
+ SMLoc Loc;<br class="gmail_msg">
+ SmallString<64> Msg;<br class="gmail_msg">
+ SMRange Range;<br class="gmail_msg">
+ };<br class="gmail_msg">
+<br class="gmail_msg">
private:<br class="gmail_msg">
MCAsmParser(const MCAsmParser &) = delete;<br class="gmail_msg">
void operator=(const MCAsmParser &) = delete;<br class="gmail_msg">
@@ -78,6 +86,11 @@ private:<br class="gmail_msg">
protected: // Can only create subclasses.<br class="gmail_msg">
MCAsmParser();<br class="gmail_msg">
<br class="gmail_msg">
+ bool HadError;<br class="gmail_msg">
+<br class="gmail_msg">
+ SmallVector<MCPendingError, 1> PendingErrors;<br class="gmail_msg">
+ /// Flag tracking whether any errors have been encountered.<br class="gmail_msg">
+<br class="gmail_msg">
public:<br class="gmail_msg">
virtual ~MCAsmParser();<br class="gmail_msg">
<br class="gmail_msg">
@@ -122,21 +135,36 @@ public:<br class="gmail_msg">
const MCInstPrinter *IP, MCAsmParserSemaCallback &SI) = 0;<br class="gmail_msg">
<br class="gmail_msg">
/// \brief Emit a note at the location \p L, with the message \p Msg.<br class="gmail_msg">
- virtual void Note(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) = 0;<br class="gmail_msg">
+ virtual void Note(SMLoc L, const Twine &Msg, SMRange Range = None) = 0;<br class="gmail_msg">
<br class="gmail_msg">
/// \brief Emit a warning at the location \p L, with the message \p Msg.<br class="gmail_msg">
///<br class="gmail_msg">
/// \return The return value is true, if warnings are fatal.<br class="gmail_msg">
- virtual bool Warning(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) = 0;<br class="gmail_msg">
+ virtual bool Warning(SMLoc L, const Twine &Msg, SMRange Range = None) = 0;<br class="gmail_msg">
+<br class="gmail_msg">
+ /// \brief Return an error at the location \p L, with the message \p Msg. This<br class="gmail_msg">
+ /// may be modified before being emitted.<br class="gmail_msg">
+ ///<br class="gmail_msg">
+ /// \return The return value is always true, as an idiomatic convenience to<br class="gmail_msg">
+ /// clients.<br class="gmail_msg">
+ bool Error(SMLoc L, const Twine &Msg, SMRange Range = None);<br class="gmail_msg">
<br class="gmail_msg">
/// \brief Emit an error at the location \p L, with the message \p Msg.<br class="gmail_msg">
///<br class="gmail_msg">
/// \return The return value is always true, as an idiomatic convenience to<br class="gmail_msg">
/// clients.<br class="gmail_msg">
- virtual bool Error(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) = 0;<br class="gmail_msg">
+ virtual bool printError(SMLoc L, const Twine &Msg, SMRange Range = None) = 0;<br class="gmail_msg">
+<br class="gmail_msg">
+ bool hasPendingError() { return !PendingErrors.empty(); }<br class="gmail_msg">
+<br class="gmail_msg">
+ bool printPendingErrors() {<br class="gmail_msg">
+ bool rv = !PendingErrors.empty();<br class="gmail_msg">
+ for (auto Err : PendingErrors) {<br class="gmail_msg">
+ printError(Err.Loc, Twine(Err.Msg), Err.Range);<br class="gmail_msg">
+ }<br class="gmail_msg">
+ PendingErrors.clear();<br class="gmail_msg">
+ return rv;<br class="gmail_msg">
+ }<br class="gmail_msg">
<br class="gmail_msg">
/// \brief Get the next AsmToken in the stream, possibly handling file<br class="gmail_msg">
/// inclusion first.<br class="gmail_msg">
@@ -146,7 +174,7 @@ public:<br class="gmail_msg">
const AsmToken &getTok() const;<br class="gmail_msg">
<br class="gmail_msg">
/// \brief Report an error at the current lexer location.<br class="gmail_msg">
- bool TokError(const Twine &Msg, ArrayRef<SMRange> Ranges = None);<br class="gmail_msg">
+ bool TokError(const Twine &Msg, SMRange Range = None);<br class="gmail_msg">
<br class="gmail_msg">
bool parseTokenLoc(SMLoc &Loc);<br class="gmail_msg">
bool parseToken(AsmToken::TokenKind T, const Twine &Msg);<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/include/llvm/Support/SMLoc.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/SMLoc.h?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/SMLoc.h?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/include/llvm/Support/SMLoc.h (original)<br class="gmail_msg">
+++ llvm/trunk/include/llvm/Support/SMLoc.h Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -15,6 +15,7 @@<br class="gmail_msg">
#ifndef LLVM_SUPPORT_SMLOC_H<br class="gmail_msg">
#define LLVM_SUPPORT_SMLOC_H<br class="gmail_msg">
<br class="gmail_msg">
+#include "llvm/ADT/None.h"<br class="gmail_msg">
#include <cassert><br class="gmail_msg">
<br class="gmail_msg">
namespace llvm {<br class="gmail_msg">
@@ -50,6 +51,7 @@ public:<br class="gmail_msg">
SMLoc Start, End;<br class="gmail_msg">
<br class="gmail_msg">
SMRange() {}<br class="gmail_msg">
+ SMRange(NoneType) : Start(), End() {}<br class="gmail_msg">
SMRange(SMLoc St, SMLoc En) : Start(St), End(En) {<br class="gmail_msg">
assert(Start.isValid() == End.isValid() &&<br class="gmail_msg">
"Start and end should either both be valid or both be invalid!");<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -178,9 +178,6 @@ private:<br class="gmail_msg">
/// \brief Keeps track of how many .macro's have been instantiated.<br class="gmail_msg">
unsigned NumOfMacroInstantiations;<br class="gmail_msg">
<br class="gmail_msg">
- /// Flag tracking whether any errors have been encountered.<br class="gmail_msg">
- unsigned HadError : 1;<br class="gmail_msg">
-<br class="gmail_msg">
/// The values from the last parsed cpp hash file line comment if any.<br class="gmail_msg">
struct CppHashInfoTy {<br class="gmail_msg">
StringRef Filename;<br class="gmail_msg">
@@ -247,12 +244,9 @@ public:<br class="gmail_msg">
AssemblerDialect = i;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- void Note(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) override;<br class="gmail_msg">
- bool Warning(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) override;<br class="gmail_msg">
- bool Error(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) override;<br class="gmail_msg">
+ void Note(SMLoc L, const Twine &Msg, SMRange Range = None) override;<br class="gmail_msg">
+ bool Warning(SMLoc L, const Twine &Msg, SMRange Range = None) override;<br class="gmail_msg">
+ bool printError(SMLoc L, const Twine &Msg, SMRange Range = None) override;<br class="gmail_msg">
<br class="gmail_msg">
const AsmToken &Lex() override;<br class="gmail_msg">
<br class="gmail_msg">
@@ -337,7 +331,8 @@ private:<br class="gmail_msg">
<br class="gmail_msg">
void printMacroInstantiations();<br class="gmail_msg">
void printMessage(SMLoc Loc, SourceMgr::DiagKind Kind, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) const {<br class="gmail_msg">
+ SMRange Range = None) const {<br class="gmail_msg">
+ ArrayRef<SMRange> Ranges(Range);<br class="gmail_msg">
SrcMgr.PrintMessage(Loc, Kind, Msg, Ranges);<br class="gmail_msg">
}<br class="gmail_msg">
static void DiagHandler(const SMDiagnostic &Diag, void *Context);<br class="gmail_msg">
@@ -565,8 +560,8 @@ AsmParser::AsmParser(SourceMgr &SM, MCCo<br class="gmail_msg">
const MCAsmInfo &MAI)<br class="gmail_msg">
: Lexer(MAI), Ctx(Ctx), Out(Out), MAI(MAI), SrcMgr(SM),<br class="gmail_msg">
PlatformParser(nullptr), CurBuffer(SM.getMainFileID()),<br class="gmail_msg">
- MacrosEnabledFlag(true), HadError(false), CppHashInfo(),<br class="gmail_msg">
- AssemblerDialect(~0U), IsDarwin(false), ParsingInlineAsm(false) {<br class="gmail_msg">
+ MacrosEnabledFlag(true), CppHashInfo(), AssemblerDialect(~0U),<br class="gmail_msg">
+ IsDarwin(false), ParsingInlineAsm(false) {<br class="gmail_msg">
// Save the old handler.<br class="gmail_msg">
SavedDiagHandler = SrcMgr.getDiagHandler();<br class="gmail_msg">
SavedDiagContext = SrcMgr.getDiagContext();<br class="gmail_msg">
@@ -609,24 +604,25 @@ void AsmParser::printMacroInstantiations<br class="gmail_msg">
"while in macro instantiation");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
-void AsmParser::Note(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges) {<br class="gmail_msg">
- printMessage(L, SourceMgr::DK_Note, Msg, Ranges);<br class="gmail_msg">
+void AsmParser::Note(SMLoc L, const Twine &Msg, SMRange Range) {<br class="gmail_msg">
+ printPendingErrors();<br class="gmail_msg">
+ printMessage(L, SourceMgr::DK_Note, Msg, Range);<br class="gmail_msg">
printMacroInstantiations();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
-bool AsmParser::Warning(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges) {<br class="gmail_msg">
+bool AsmParser::Warning(SMLoc L, const Twine &Msg, SMRange Range) {<br class="gmail_msg">
if(getTargetParser().getTargetOptions().MCNoWarn)<br class="gmail_msg">
return false;<br class="gmail_msg">
if (getTargetParser().getTargetOptions().MCFatalWarnings)<br class="gmail_msg">
- return Error(L, Msg, Ranges);<br class="gmail_msg">
- printMessage(L, SourceMgr::DK_Warning, Msg, Ranges);<br class="gmail_msg">
+ return Error(L, Msg, Range);<br class="gmail_msg">
+ printMessage(L, SourceMgr::DK_Warning, Msg, Range);<br class="gmail_msg">
printMacroInstantiations();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
-bool AsmParser::Error(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges) {<br class="gmail_msg">
+bool AsmParser::printError(SMLoc L, const Twine &Msg, SMRange Range) {<br class="gmail_msg">
HadError = true;<br class="gmail_msg">
- printMessage(L, SourceMgr::DK_Error, Msg, Ranges);<br class="gmail_msg">
+ printMessage(L, SourceMgr::DK_Error, Msg, Range);<br class="gmail_msg">
printMacroInstantiations();<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -731,32 +727,38 @@ bool AsmParser::Run(bool NoInitialTextSe<br class="gmail_msg">
if (!parseStatement(Info, nullptr))<br class="gmail_msg">
continue;<br class="gmail_msg">
<br class="gmail_msg">
- // If we've failed, but on a Error Token, but did not consume it in<br class="gmail_msg">
- // favor of a better message, emit it now.<br class="gmail_msg">
- if (Lexer.getTok().is(AsmToken::Error)) {<br class="gmail_msg">
+ // If we have a Lexer Error we are on an Error Token. Load in Lexer Error<br class="gmail_msg">
+ // for printing ErrMsg via Lex() only if no (presumably better) parser error<br class="gmail_msg">
+ // exists.<br class="gmail_msg">
+ if (!hasPendingError() && Lexer.getTok().is(AsmToken::Error)) {<br class="gmail_msg">
Lex();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- // We had an error, validate that one was emitted and recover by skipping to<br class="gmail_msg">
- // the next line.<br class="gmail_msg">
- assert(HadError && "Parse statement returned an error, but none emitted!");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
+ // parseStatement returned true so may need to emit an error.<br class="gmail_msg">
+ printPendingErrors();<br class="gmail_msg">
+<br class="gmail_msg">
+ // Skipping to the next line if needed.<br class="gmail_msg">
+ if (!getLexer().isAtStartOfStatement())<br class="gmail_msg">
+ eatToEndOfStatement();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
+ // All errors should have been emitted.<br class="gmail_msg">
+ assert(!hasPendingError() && "unexpected error from parseStatement");<br class="gmail_msg">
+<br class="gmail_msg">
getTargetParser().flushPendingInstructions(getStreamer());<br class="gmail_msg">
<br class="gmail_msg">
if (TheCondState.TheCond != StartingCondState.TheCond ||<br class="gmail_msg">
TheCondState.Ignore != StartingCondState.Ignore)<br class="gmail_msg">
- return TokError("unmatched .ifs or .elses");<br class="gmail_msg">
-<br class="gmail_msg">
+ printError(getTok().getLoc(), "unmatched .ifs or .elses");<br class="gmail_msg">
// Check to see there are no empty DwarfFile slots.<br class="gmail_msg">
const auto &LineTables = getContext().getMCDwarfLineTables();<br class="gmail_msg">
if (!LineTables.empty()) {<br class="gmail_msg">
unsigned Index = 0;<br class="gmail_msg">
for (const auto &File : LineTables.begin()->second.getMCDwarfFiles()) {<br class="gmail_msg">
if (File.Name.empty() && Index != 0)<br class="gmail_msg">
- TokError("unassigned file number: " + Twine(Index) +<br class="gmail_msg">
- " for .file directives");<br class="gmail_msg">
+ printError(getTok().getLoc(), "unassigned file number: " +<br class="gmail_msg">
+ Twine(Index) +<br class="gmail_msg">
+ " for .file directives");<br class="gmail_msg">
++Index;<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
@@ -776,9 +778,8 @@ bool AsmParser::Run(bool NoInitialTextSe<br class="gmail_msg">
// FIXME: We would really like to refer back to where the symbol was<br class="gmail_msg">
// first referenced for a source location. We need to add something<br class="gmail_msg">
// to track that. Currently, we just point to the end of the file.<br class="gmail_msg">
- HadError |=<br class="gmail_msg">
- Error(getTok().getLoc(), "assembler local symbol '" +<br class="gmail_msg">
- Sym->getName() + "' not defined");<br class="gmail_msg">
+ printError(getTok().getLoc(), "assembler local symbol '" +<br class="gmail_msg">
+ Sym->getName() + "' not defined");<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -789,7 +790,7 @@ bool AsmParser::Run(bool NoInitialTextSe<br class="gmail_msg">
// Reset the state of any "# line file" directives we've seen to the<br class="gmail_msg">
// context as it was at the diagnostic site.<br class="gmail_msg">
CppHashInfo = std::get<1>(LocSym);<br class="gmail_msg">
- HadError |= Error(std::get<0>(LocSym), "directional label undefined");<br class="gmail_msg">
+ printError(std::get<0>(LocSym), "directional label undefined");<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
@@ -804,7 +805,8 @@ bool AsmParser::Run(bool NoInitialTextSe<br class="gmail_msg">
<br class="gmail_msg">
void AsmParser::checkForValidSection() {<br class="gmail_msg">
if (!ParsingInlineAsm && !getStreamer().getCurrentSection().first) {<br class="gmail_msg">
- TokError("expected section directive before assembly directive");<br class="gmail_msg">
+ printError(getTok().getLoc(),<br class="gmail_msg">
+ "expected section directive before assembly directive");<br class="gmail_msg">
Out.InitSections(false);<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
@@ -1435,6 +1437,7 @@ bool AsmParser::parseBinOpRHS(unsigned P<br class="gmail_msg">
/// ::= Label* Identifier OperandList* EndOfStatement<br class="gmail_msg">
bool AsmParser::parseStatement(ParseStatementInfo &Info,<br class="gmail_msg">
MCAsmParserSemaCallback *SI) {<br class="gmail_msg">
+ assert(!hasPendingError() && "parseStatement started with pending error");<br class="gmail_msg">
// Eat initial spaces and comments<br class="gmail_msg">
while (Lexer.is(AsmToken::Space))<br class="gmail_msg">
Lex();<br class="gmail_msg">
@@ -1467,15 +1470,19 @@ bool AsmParser::parseStatement(ParseStat<br class="gmail_msg">
if (Lexer.is(AsmToken::Integer)) {<br class="gmail_msg">
LocalLabelVal = getTok().getIntVal();<br class="gmail_msg">
if (LocalLabelVal < 0) {<br class="gmail_msg">
- if (!TheCondState.Ignore)<br class="gmail_msg">
- return TokError("unexpected token at start of statement");<br class="gmail_msg">
+ if (!TheCondState.Ignore) {<br class="gmail_msg">
+ Lex(); // always eat a token<br class="gmail_msg">
+ return Error(IDLoc, "unexpected token at start of statement");<br class="gmail_msg">
+ }<br class="gmail_msg">
IDVal = "";<br class="gmail_msg">
} else {<br class="gmail_msg">
IDVal = getTok().getString();<br class="gmail_msg">
Lex(); // Consume the integer token to be used as an identifier token.<br class="gmail_msg">
if (Lexer.getKind() != AsmToken::Colon) {<br class="gmail_msg">
- if (!TheCondState.Ignore)<br class="gmail_msg">
- return TokError("unexpected token at start of statement");<br class="gmail_msg">
+ if (!TheCondState.Ignore) {<br class="gmail_msg">
+ Lex(); // always eat a token<br class="gmail_msg">
+ return Error(IDLoc, "unexpected token at start of statement");<br class="gmail_msg">
+ }<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
} else if (Lexer.is(AsmToken::Dot)) {<br class="gmail_msg">
@@ -1492,8 +1499,10 @@ bool AsmParser::parseStatement(ParseStat<br class="gmail_msg">
Lex();<br class="gmail_msg">
IDVal = "}";<br class="gmail_msg">
} else if (parseIdentifier(IDVal)) {<br class="gmail_msg">
- if (!TheCondState.Ignore)<br class="gmail_msg">
- return TokError("unexpected token at start of statement");<br class="gmail_msg">
+ if (!TheCondState.Ignore) {<br class="gmail_msg">
+ Lex(); // always eat a token<br class="gmail_msg">
+ return Error(IDLoc, "unexpected token at start of statement");<br class="gmail_msg">
+ }<br class="gmail_msg">
IDVal = "";<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -1655,9 +1664,20 @@ bool AsmParser::parseStatement(ParseStat<br class="gmail_msg">
<br class="gmail_msg">
getTargetParser().flushPendingInstructions(getStreamer());<br class="gmail_msg">
<br class="gmail_msg">
- // First query the target-specific parser. It will return 'true' if it<br class="gmail_msg">
- // isn't interested in this directive.<br class="gmail_msg">
- if (!getTargetParser().ParseDirective(ID))<br class="gmail_msg">
+ SMLoc StartTokLoc = getTok().getLoc();<br class="gmail_msg">
+ bool TPDirectiveReturn = getTargetParser().ParseDirective(ID);<br class="gmail_msg">
+<br class="gmail_msg">
+ if (hasPendingError())<br class="gmail_msg">
+ return true;<br class="gmail_msg">
+ // Currently the return value should be true if we are<br class="gmail_msg">
+ // uninterested but as this is at odds with the standard parsing<br class="gmail_msg">
+ // convention (return true = error) we have instances of a parsed<br class="gmail_msg">
+ // directive that fails returning true as an error. Catch these<br class="gmail_msg">
+ // cases as best as possible errors here.<br class="gmail_msg">
+ if (TPDirectiveReturn && StartTokLoc != getTok().getLoc())<br class="gmail_msg">
+ return true;<br class="gmail_msg">
+ // Return if we did some parsing or believe we succeeded.<br class="gmail_msg">
+ if (!TPDirectiveReturn || StartTokLoc != getTok().getLoc())<br class="gmail_msg">
return false;<br class="gmail_msg">
<br class="gmail_msg">
// Next, check the extension directive map to see if any extension has<br class="gmail_msg">
@@ -1912,9 +1932,9 @@ bool AsmParser::parseStatement(ParseStat<br class="gmail_msg">
// Canonicalize the opcode to lower case.<br class="gmail_msg">
std::string OpcodeStr = IDVal.lower();<br class="gmail_msg">
ParseInstructionInfo IInfo(Info.AsmRewrites);<br class="gmail_msg">
- bool HadError = getTargetParser().ParseInstruction(IInfo, OpcodeStr, ID,<br class="gmail_msg">
- Info.ParsedOperands);<br class="gmail_msg">
- Info.ParseError = HadError;<br class="gmail_msg">
+ bool ParseHadError = getTargetParser().ParseInstruction(IInfo, OpcodeStr, ID,<br class="gmail_msg">
+ Info.ParsedOperands);<br class="gmail_msg">
+ Info.ParseError = ParseHadError;<br class="gmail_msg">
<br class="gmail_msg">
// Dump the parsed representation, if requested.<br class="gmail_msg">
if (getShowParsedOperands()) {<br class="gmail_msg">
@@ -1931,9 +1951,13 @@ bool AsmParser::parseStatement(ParseStat<br class="gmail_msg">
printMessage(IDLoc, SourceMgr::DK_Note, OS.str());<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
+ // Fail even if ParseInstruction erroneously returns false.<br class="gmail_msg">
+ if (hasPendingError() || ParseHadError)<br class="gmail_msg">
+ return true;<br class="gmail_msg">
+<br class="gmail_msg">
// If we are generating dwarf for the current section then generate a .loc<br class="gmail_msg">
// directive for the instruction.<br class="gmail_msg">
- if (!HadError && getContext().getGenDwarfForAssembly() &&<br class="gmail_msg">
+ if (!ParseHadError && getContext().getGenDwarfForAssembly() &&<br class="gmail_msg">
getContext().getGenDwarfSectionSyms().count(<br class="gmail_msg">
getStreamer().getCurrentSection().first)) {<br class="gmail_msg">
unsigned Line;<br class="gmail_msg">
@@ -1975,15 +1999,13 @@ bool AsmParser::parseStatement(ParseStat<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
// If parsing succeeded, match the instruction.<br class="gmail_msg">
- if (!HadError) {<br class="gmail_msg">
+ if (!ParseHadError) {<br class="gmail_msg">
uint64_t ErrorInfo;<br class="gmail_msg">
- getTargetParser().MatchAndEmitInstruction(IDLoc, Info.Opcode,<br class="gmail_msg">
- Info.ParsedOperands, Out,<br class="gmail_msg">
- ErrorInfo, ParsingInlineAsm);<br class="gmail_msg">
+ if (getTargetParser().MatchAndEmitInstruction(IDLoc, Info.Opcode,<br class="gmail_msg">
+ Info.ParsedOperands, Out,<br class="gmail_msg">
+ ErrorInfo, ParsingInlineAsm))<br class="gmail_msg">
+ return true;<br class="gmail_msg">
}<br class="gmail_msg">
-<br class="gmail_msg">
- // Don't skip the rest of the line, the instruction parser is responsible for<br class="gmail_msg">
- // that.<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -2019,6 +2041,7 @@ bool AsmParser::parseCppHashLineFilename<br class="gmail_msg">
"Lexing Cpp line comment: Expected String");<br class="gmail_msg">
StringRef Filename = getTok().getString();<br class="gmail_msg">
Lex();<br class="gmail_msg">
+<br class="gmail_msg">
// Get rid of the enclosing quotes.<br class="gmail_msg">
Filename = Filename.substr(1, Filename.size() - 2);<br class="gmail_msg">
<br class="gmail_msg">
@@ -2353,27 +2376,19 @@ bool AsmParser::parseMacroArguments(cons<br class="gmail_msg">
MCAsmMacroParameter FA;<br class="gmail_msg">
<br class="gmail_msg">
if (Lexer.is(AsmToken::Identifier) && Lexer.peekTok().is(AsmToken::Equal)) {<br class="gmail_msg">
- if (parseIdentifier(FA.Name)) {<br class="gmail_msg">
- Error(IDLoc, "invalid argument identifier for formal argument");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (parseIdentifier(FA.Name))<br class="gmail_msg">
+ return Error(IDLoc, "invalid argument identifier for formal argument");<br class="gmail_msg">
+<br class="gmail_msg">
+ if (Lexer.isNot(AsmToken::Equal))<br class="gmail_msg">
+ return TokError("expected '=' after formal parameter identifier");<br class="gmail_msg">
<br class="gmail_msg">
- if (Lexer.isNot(AsmToken::Equal)) {<br class="gmail_msg">
- TokError("expected '=' after formal parameter identifier");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
- }<br class="gmail_msg">
Lex();<br class="gmail_msg">
<br class="gmail_msg">
NamedParametersFound = true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- if (NamedParametersFound && FA.Name.empty()) {<br class="gmail_msg">
- Error(IDLoc, "cannot mix positional and keyword arguments");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (NamedParametersFound && FA.Name.empty())<br class="gmail_msg">
+ return Error(IDLoc, "cannot mix positional and keyword arguments");<br class="gmail_msg">
<br class="gmail_msg">
bool Vararg = HasVararg && Parameter == (NParameters - 1);<br class="gmail_msg">
if (parseMacroArgument(FA.Value, Vararg))<br class="gmail_msg">
@@ -2388,10 +2403,8 @@ bool AsmParser::parseMacroArguments(cons<br class="gmail_msg">
<br class="gmail_msg">
if (FAI >= NParameters) {<br class="gmail_msg">
assert(M && "expected macro to be defined");<br class="gmail_msg">
- Error(IDLoc,<br class="gmail_msg">
- "parameter named '" + FA.Name + "' does not exist for macro '" +<br class="gmail_msg">
- M->Name + "'");<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ return Error(IDLoc, "parameter named '" + FA.Name +<br class="gmail_msg">
+ "' does not exist for macro '" + M->Name + "'");<br class="gmail_msg">
}<br class="gmail_msg">
PI = FAI;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -2992,11 +3005,14 @@ bool AsmParser::parseDirectiveAlign(bool<br class="gmail_msg">
if (!HasFillExpr)<br class="gmail_msg">
FillExpr = 0;<br class="gmail_msg">
<br class="gmail_msg">
+ // Always emit an alignment here even if we thrown an error.<br class="gmail_msg">
+ bool ReturnVal = false;<br class="gmail_msg">
+<br class="gmail_msg">
// Compute alignment in bytes.<br class="gmail_msg">
if (IsPow2) {<br class="gmail_msg">
// FIXME: Diagnose overflow.<br class="gmail_msg">
if (Alignment >= 32) {<br class="gmail_msg">
- Error(AlignmentLoc, "invalid alignment value");<br class="gmail_msg">
+ ReturnVal |= Error(AlignmentLoc, "invalid alignment value");<br class="gmail_msg">
Alignment = 31;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -3008,13 +3024,14 @@ bool AsmParser::parseDirectiveAlign(bool<br class="gmail_msg">
if (Alignment == 0)<br class="gmail_msg">
Alignment = 1;<br class="gmail_msg">
if (!isPowerOf2_64(Alignment))<br class="gmail_msg">
- Error(AlignmentLoc, "alignment must be a power of 2");<br class="gmail_msg">
+ ReturnVal |= Error(AlignmentLoc, "alignment must be a power of 2");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
// Diagnose non-sensical max bytes to align.<br class="gmail_msg">
if (MaxBytesLoc.isValid()) {<br class="gmail_msg">
if (MaxBytesToFill < 1) {<br class="gmail_msg">
- Error(MaxBytesLoc, "alignment directive can never be satisfied in this "<br class="gmail_msg">
+ ReturnVal |= Error(MaxBytesLoc,<br class="gmail_msg">
+ "alignment directive can never be satisfied in this "<br class="gmail_msg">
"many bytes, ignoring maximum bytes expression");<br class="gmail_msg">
MaxBytesToFill = 0;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -3040,7 +3057,7 @@ bool AsmParser::parseDirectiveAlign(bool<br class="gmail_msg">
MaxBytesToFill);<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- return false;<br class="gmail_msg">
+ return ReturnVal;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
/// parseDirectiveFile<br class="gmail_msg">
@@ -3094,7 +3111,7 @@ bool AsmParser::parseDirectiveFile(SMLoc<br class="gmail_msg">
getContext().setGenDwarfForAssembly(false);<br class="gmail_msg">
else if (getStreamer().EmitDwarfFileDirective(FileNumber, Directory, Filename) ==<br class="gmail_msg">
0)<br class="gmail_msg">
- Error(FileNumberLoc, "file number already allocated");<br class="gmail_msg">
+ return Error(FileNumberLoc, "file number already allocated");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
return false;<br class="gmail_msg">
@@ -3346,7 +3363,7 @@ bool AsmParser::parseDirectiveCVInlineSi<br class="gmail_msg">
<br class="gmail_msg">
if (!getStreamer().EmitCVInlineSiteIdDirective(FunctionId, IAFunc, IAFile,<br class="gmail_msg">
IALine, IACol, FunctionIdLoc))<br class="gmail_msg">
- Error(FunctionIdLoc, "function id already allocated");<br class="gmail_msg">
+ return Error(FunctionIdLoc, "function id already allocated");<br class="gmail_msg">
<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -4340,9 +4357,9 @@ bool AsmParser::parseDirectiveAbort() {<br class="gmail_msg">
return true;<br class="gmail_msg">
<br class="gmail_msg">
if (Str.empty())<br class="gmail_msg">
- Error(Loc, ".abort detected. Assembly stopping.");<br class="gmail_msg">
+ return Error(Loc, ".abort detected. Assembly stopping.");<br class="gmail_msg">
else<br class="gmail_msg">
- Error(Loc, ".abort '" + Str + "' detected. Assembly stopping.");<br class="gmail_msg">
+ return Error(Loc, ".abort '" + Str + "' detected. Assembly stopping.");<br class="gmail_msg">
// FIXME: Actually abort assembly here.<br class="gmail_msg">
<br class="gmail_msg">
return false;<br class="gmail_msg">
@@ -4487,11 +4504,8 @@ bool AsmParser::parseDirectiveIfc(SMLoc<br class="gmail_msg">
bool AsmParser::parseDirectiveIfeqs(SMLoc DirectiveLoc, bool ExpectEqual) {<br class="gmail_msg">
if (Lexer.isNot(AsmToken::String)) {<br class="gmail_msg">
if (ExpectEqual)<br class="gmail_msg">
- TokError("expected string parameter for '.ifeqs' directive");<br class="gmail_msg">
- else<br class="gmail_msg">
- TokError("expected string parameter for '.ifnes' directive");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ return TokError("expected string parameter for '.ifeqs' directive");<br class="gmail_msg">
+ return TokError("expected string parameter for '.ifnes' directive");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
StringRef String1 = getTok().getStringContents();<br class="gmail_msg">
@@ -4499,22 +4513,17 @@ bool AsmParser::parseDirectiveIfeqs(SMLo<br class="gmail_msg">
<br class="gmail_msg">
if (Lexer.isNot(AsmToken::Comma)) {<br class="gmail_msg">
if (ExpectEqual)<br class="gmail_msg">
- TokError("expected comma after first string for '.ifeqs' directive");<br class="gmail_msg">
- else<br class="gmail_msg">
- TokError("expected comma after first string for '.ifnes' directive");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ return TokError(<br class="gmail_msg">
+ "expected comma after first string for '.ifeqs' directive");<br class="gmail_msg">
+ return TokError("expected comma after first string for '.ifnes' directive");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
Lex();<br class="gmail_msg">
<br class="gmail_msg">
if (Lexer.isNot(AsmToken::String)) {<br class="gmail_msg">
if (ExpectEqual)<br class="gmail_msg">
- TokError("expected string parameter for '.ifeqs' directive");<br class="gmail_msg">
- else<br class="gmail_msg">
- TokError("expected string parameter for '.ifnes' directive");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ return TokError("expected string parameter for '.ifeqs' directive");<br class="gmail_msg">
+ return TokError("expected string parameter for '.ifnes' directive");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
StringRef String2 = getTok().getStringContents();<br class="gmail_msg">
@@ -4559,8 +4568,8 @@ bool AsmParser::parseDirectiveIfdef(SMLo<br class="gmail_msg">
bool AsmParser::parseDirectiveElseIf(SMLoc DirectiveLoc) {<br class="gmail_msg">
if (TheCondState.TheCond != AsmCond::IfCond &&<br class="gmail_msg">
TheCondState.TheCond != AsmCond::ElseIfCond)<br class="gmail_msg">
- Error(DirectiveLoc, "Encountered a .elseif that doesn't follow a .if or "<br class="gmail_msg">
- " an .elseif");<br class="gmail_msg">
+ return Error(DirectiveLoc, "Encountered a .elseif that doesn't follow an"<br class="gmail_msg">
+ " .if or an .elseif");<br class="gmail_msg">
TheCondState.TheCond = AsmCond::ElseIfCond;<br class="gmail_msg">
<br class="gmail_msg">
bool LastIgnoreState = false;<br class="gmail_msg">
@@ -4594,8 +4603,8 @@ bool AsmParser::parseDirectiveElse(SMLoc<br class="gmail_msg">
<br class="gmail_msg">
if (TheCondState.TheCond != AsmCond::IfCond &&<br class="gmail_msg">
TheCondState.TheCond != AsmCond::ElseIfCond)<br class="gmail_msg">
- Error(DirectiveLoc, "Encountered a .else that doesn't follow a .if or an "<br class="gmail_msg">
- ".elseif");<br class="gmail_msg">
+ return Error(DirectiveLoc, "Encountered a .else that doesn't follow "<br class="gmail_msg">
+ " an .if or an .elseif");<br class="gmail_msg">
TheCondState.TheCond = AsmCond::ElseCond;<br class="gmail_msg">
bool LastIgnoreState = false;<br class="gmail_msg">
if (!TheCondStack.empty())<br class="gmail_msg">
@@ -4637,18 +4646,14 @@ bool AsmParser::parseDirectiveError(SMLo<br class="gmail_msg">
<br class="gmail_msg">
StringRef Message = ".error directive invoked in source file";<br class="gmail_msg">
if (Lexer.isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- if (Lexer.isNot(AsmToken::String)) {<br class="gmail_msg">
- TokError(".error argument must be a string");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (Lexer.isNot(AsmToken::String))<br class="gmail_msg">
+ return TokError(".error argument must be a string");<br class="gmail_msg">
<br class="gmail_msg">
Message = getTok().getStringContents();<br class="gmail_msg">
Lex();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- Error(L, Message);<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ return Error(L, Message);<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
/// parseDirectiveWarning<br class="gmail_msg">
@@ -4663,18 +4668,14 @@ bool AsmParser::parseDirectiveWarning(SM<br class="gmail_msg">
<br class="gmail_msg">
StringRef Message = ".warning directive invoked in source file";<br class="gmail_msg">
if (Lexer.isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- if (Lexer.isNot(AsmToken::String)) {<br class="gmail_msg">
- TokError(".warning argument must be a string");<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
- return true;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (Lexer.isNot(AsmToken::String))<br class="gmail_msg">
+ return TokError(".warning argument must be a string");<br class="gmail_msg">
<br class="gmail_msg">
Message = getTok().getStringContents();<br class="gmail_msg">
Lex();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- Warning(L, Message);<br class="gmail_msg">
- return false;<br class="gmail_msg">
+ return Warning(L, Message);<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
/// parseDirectiveEndIf<br class="gmail_msg">
@@ -4685,8 +4686,8 @@ bool AsmParser::parseDirectiveEndIf(SMLo<br class="gmail_msg">
return true;<br class="gmail_msg">
<br class="gmail_msg">
if ((TheCondState.TheCond == AsmCond::NoCond) || TheCondStack.empty())<br class="gmail_msg">
- Error(DirectiveLoc, "Encountered a .endif that doesn't follow a .if or "<br class="gmail_msg">
- ".else");<br class="gmail_msg">
+ return Error(DirectiveLoc, "Encountered a .endif that doesn't follow "<br class="gmail_msg">
+ "an .if or .else");<br class="gmail_msg">
if (!TheCondStack.empty()) {<br class="gmail_msg">
TheCondState = TheCondStack.back();<br class="gmail_msg">
TheCondStack.pop_back();<br class="gmail_msg">
@@ -4838,7 +4839,7 @@ MCAsmMacro *AsmParser::parseMacroLikeBod<br class="gmail_msg">
while (true) {<br class="gmail_msg">
// Check whether we have reached the end of the file.<br class="gmail_msg">
if (getLexer().is(AsmToken::Eof)) {<br class="gmail_msg">
- Error(DirectiveLoc, "no matching '.endr' in definition");<br class="gmail_msg">
+ printError(DirectiveLoc, "no matching '.endr' in definition");<br class="gmail_msg">
return nullptr;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -4855,7 +4856,8 @@ MCAsmMacro *AsmParser::parseMacroLikeBod<br class="gmail_msg">
EndToken = getTok();<br class="gmail_msg">
Lex();<br class="gmail_msg">
if (Lexer.isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- TokError("unexpected token in '.endr' directive");<br class="gmail_msg">
+ printError(getTok().getLoc(),<br class="gmail_msg">
+ "unexpected token in '.endr' directive");<br class="gmail_msg">
return nullptr;<br class="gmail_msg">
}<br class="gmail_msg">
break;<br class="gmail_msg">
@@ -4905,7 +4907,6 @@ bool AsmParser::parseDirectiveRept(SMLoc<br class="gmail_msg">
<br class="gmail_msg">
int64_t Count;<br class="gmail_msg">
if (!CountExpr->evaluateAsAbsolute(Count)) {<br class="gmail_msg">
- eatToEndOfStatement();<br class="gmail_msg">
return Error(CountLoc, "unexpected token in '" + Dir + "' directive");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -5108,11 +5109,16 @@ bool AsmParser::parseMSInlineAsm(<br class="gmail_msg">
continue;<br class="gmail_msg">
<br class="gmail_msg">
ParseStatementInfo Info(&AsmStrRewrites);<br class="gmail_msg">
- if (parseStatement(Info, &SI))<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ bool StatementErr = parseStatement(Info, &SI);<br class="gmail_msg">
<br class="gmail_msg">
- if (Info.ParseError)<br class="gmail_msg">
+ if (StatementErr || Info.ParseError) {<br class="gmail_msg">
+ // Emit pending errors if any exist.<br class="gmail_msg">
+ printPendingErrors();<br class="gmail_msg">
return true;<br class="gmail_msg">
+ }<br class="gmail_msg">
+<br class="gmail_msg">
+ // No pending error should exist here.<br class="gmail_msg">
+ assert(!hasPendingError() && "unexpected error from parseStatement");<br class="gmail_msg">
<br class="gmail_msg">
if (Info.Opcode == ~0U)<br class="gmail_msg">
continue;<br class="gmail_msg">
@@ -5339,7 +5345,6 @@ bool parseAssignmentExpression(StringRef<br class="gmail_msg">
<br class="gmail_msg">
if (Parser.parseExpression(Value)) {<br class="gmail_msg">
Parser.TokError("missing expression");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/MC/MCParser/MCAsmLexer.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -12,7 +12,8 @@<br class="gmail_msg">
<br class="gmail_msg">
using namespace llvm;<br class="gmail_msg">
<br class="gmail_msg">
-MCAsmLexer::MCAsmLexer() : TokStart(nullptr), SkipSpace(true) {<br class="gmail_msg">
+MCAsmLexer::MCAsmLexer()<br class="gmail_msg">
+ : TokStart(nullptr), SkipSpace(true), IsAtStartOfStatement(true) {<br class="gmail_msg">
CurTok.emplace_back(AsmToken::Space, StringRef());<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/MC/MCParser/MCAsmParser.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -17,8 +17,8 @@<br class="gmail_msg">
#include "llvm/Support/raw_ostream.h"<br class="gmail_msg">
using namespace llvm;<br class="gmail_msg">
<br class="gmail_msg">
-MCAsmParser::MCAsmParser() : TargetParser(nullptr), ShowParsedOperands(0) {<br class="gmail_msg">
-}<br class="gmail_msg">
+MCAsmParser::MCAsmParser()<br class="gmail_msg">
+ : TargetParser(nullptr), ShowParsedOperands(0), PendingErrors() {}<br class="gmail_msg">
<br class="gmail_msg">
MCAsmParser::~MCAsmParser() {<br class="gmail_msg">
}<br class="gmail_msg">
@@ -84,8 +84,18 @@ bool MCAsmParser::check(bool P, SMLoc Lo<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
-bool MCAsmParser::TokError(const Twine &Msg, ArrayRef<SMRange> Ranges) {<br class="gmail_msg">
- Error(getLexer().getLoc(), Msg, Ranges);<br class="gmail_msg">
+bool MCAsmParser::TokError(const Twine &Msg, SMRange Range) {<br class="gmail_msg">
+ return Error(getLexer().getLoc(), Msg, Range);<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+bool MCAsmParser::Error(SMLoc L, const Twine &Msg, SMRange Range) {<br class="gmail_msg">
+ HadError = true;<br class="gmail_msg">
+<br class="gmail_msg">
+ MCPendingError PErr;<br class="gmail_msg">
+ PErr.Loc = L;<br class="gmail_msg">
+ Msg.toVector(PErr.Msg);<br class="gmail_msg">
+ PErr.Range = Range;<br class="gmail_msg">
+ PendingErrors.push_back(PErr);<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -2702,7 +2702,6 @@ bool AArch64AsmParser::parseSysAlias(Str<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return TokError("unexpected token in argument list");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -3322,8 +3321,6 @@ bool AArch64AsmParser::ParseInstruction(<br class="gmail_msg">
// IC, DC, AT, and TLBI instructions are aliases for the SYS instruction.<br class="gmail_msg">
if (Head == "ic" || Head == "dc" || Head == "at" || Head == "tlbi") {<br class="gmail_msg">
bool IsError = parseSysAlias(Head, NameLoc, Operands);<br class="gmail_msg">
- if (IsError && getLexer().isNot(AsmToken::EndOfStatement))<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return IsError;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -3380,7 +3377,6 @@ bool AArch64AsmParser::ParseInstruction(<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
// Read the first operand.<br class="gmail_msg">
if (parseOperand(Operands, false, false)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -3393,7 +3389,6 @@ bool AArch64AsmParser::ParseInstruction(<br class="gmail_msg">
(N == 3 && condCodeThirdOperand) ||<br class="gmail_msg">
(N == 2 && condCodeSecondOperand),<br class="gmail_msg">
condCodeSecondOperand || condCodeThirdOperand)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -3425,7 +3420,6 @@ bool AArch64AsmParser::ParseInstruction(<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
SMLoc Loc = Parser.getTok().getLoc();<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(Loc, "unexpected token in argument list");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -4183,8 +4177,10 @@ bool AArch64AsmParser::ParseDirective(As<br class="gmail_msg">
if (IDVal == ".inst")<br class="gmail_msg">
return parseDirectiveInst(Loc);<br class="gmail_msg">
}<br class="gmail_msg">
+ if (IDVal == MCLOHDirectiveName())<br class="gmail_msg">
+ return parseDirectiveLOH(IDVal, Loc);<br class="gmail_msg">
<br class="gmail_msg">
- return parseDirectiveLOH(IDVal, Loc);<br class="gmail_msg">
+ return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
static const struct {<br class="gmail_msg">
@@ -4345,7 +4341,6 @@ bool AArch64AsmParser::parseDirectiveWor<br class="gmail_msg">
bool AArch64AsmParser::parseDirectiveInst(SMLoc Loc) {<br class="gmail_msg">
MCAsmParser &Parser = getParser();<br class="gmail_msg">
if (getLexer().is(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(Loc, "expected expression following directive");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -4403,8 +4398,6 @@ bool AArch64AsmParser::parseDirectiveTLS<br class="gmail_msg">
/// ::= .loh <lohName | lohId> label1, ..., labelN<br class="gmail_msg">
/// The number of arguments depends on the loh identifier.<br class="gmail_msg">
bool AArch64AsmParser::parseDirectiveLOH(StringRef IDVal, SMLoc Loc) {<br class="gmail_msg">
- if (IDVal != MCLOHDirectiveName())<br class="gmail_msg">
- return true;<br class="gmail_msg">
MCLOHType Kind;<br class="gmail_msg">
if (getParser().getTok().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
if (getParser().getTok().isNot(AsmToken::Integer))<br class="gmail_msg">
@@ -4412,8 +4405,10 @@ bool AArch64AsmParser::parseDirectiveLOH<br class="gmail_msg">
// We successfully get a numeric value for the identifier.<br class="gmail_msg">
// Check if it is valid.<br class="gmail_msg">
int64_t Id = getParser().getTok().getIntVal();<br class="gmail_msg">
- if (Id <= -1U && !isValidMCLOHType(Id))<br class="gmail_msg">
- return TokError("invalid numeric identifier in directive");<br class="gmail_msg">
+ if (Id <= -1U && !isValidMCLOHType(Id)) {<br class="gmail_msg">
+ TokError("invalid numeric identifier in directive");<br class="gmail_msg">
+ return false;<br class="gmail_msg">
+ }<br class="gmail_msg">
Kind = (MCLOHType)Id;<br class="gmail_msg">
} else {<br class="gmail_msg">
StringRef Name = getTok().getIdentifier();<br class="gmail_msg">
@@ -4471,25 +4466,18 @@ bool AArch64AsmParser::parseDirectiveReq<br class="gmail_msg">
if (RegNum == static_cast<unsigned>(-1)) {<br class="gmail_msg">
StringRef Kind;<br class="gmail_msg">
RegNum = tryMatchVectorRegister(Kind, false);<br class="gmail_msg">
- if (!Kind.empty()) {<br class="gmail_msg">
- Error(SRegLoc, "vector register without type specifier expected");<br class="gmail_msg">
- return false;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (!Kind.empty())<br class="gmail_msg">
+ return Error(SRegLoc, "vector register without type specifier expected");<br class="gmail_msg">
IsVector = true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- if (RegNum == static_cast<unsigned>(-1)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
- Error(SRegLoc, "register name or alias expected");<br class="gmail_msg">
- return false;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (RegNum == static_cast<unsigned>(-1))<br class="gmail_msg">
+ return Error(SRegLoc, "register name or alias expected");<br class="gmail_msg">
<br class="gmail_msg">
// Shouldn't be anything else.<br class="gmail_msg">
- if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- Error(Parser.getTok().getLoc(), "unexpected input in .req directive");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
- return false;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (Parser.getTok().isNot(AsmToken::EndOfStatement))<br class="gmail_msg">
+ return Error(Parser.getTok().getLoc(),<br class="gmail_msg">
+ "unexpected input in .req directive");<br class="gmail_msg">
<br class="gmail_msg">
Parser.Lex(); // Consume the EndOfStatement<br class="gmail_msg">
<br class="gmail_msg">
@@ -4497,7 +4485,7 @@ bool AArch64AsmParser::parseDirectiveReq<br class="gmail_msg">
if (RegisterReqs.insert(std::make_pair(Name, pair)).first->second != pair)<br class="gmail_msg">
Warning(L, "ignoring redefinition of register alias '" + Name + "'");<br class="gmail_msg">
<br class="gmail_msg">
- return true;<br class="gmail_msg">
+ return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
/// parseDirectiveUneq<br class="gmail_msg">
@@ -4506,7 +4494,6 @@ bool AArch64AsmParser::parseDirectiveUnr<br class="gmail_msg">
MCAsmParser &Parser = getParser();<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "unexpected input in .unreq directive.");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
RegisterReqs.erase(Parser.getTok().getIdentifier().lower());<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -339,16 +339,14 @@ class ARMAsmParser : public MCTargetAsmP<br class="gmail_msg">
return;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
- void Note(SMLoc L, const Twine &Msg, ArrayRef<SMRange> Ranges = None) {<br class="gmail_msg">
- return getParser().Note(L, Msg, Ranges);<br class="gmail_msg">
+ void Note(SMLoc L, const Twine &Msg, SMRange Range = None) {<br class="gmail_msg">
+ return getParser().Note(L, Msg, Range);<br class="gmail_msg">
}<br class="gmail_msg">
- bool Warning(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) {<br class="gmail_msg">
- return getParser().Warning(L, Msg, Ranges);<br class="gmail_msg">
- }<br class="gmail_msg">
- bool Error(SMLoc L, const Twine &Msg,<br class="gmail_msg">
- ArrayRef<SMRange> Ranges = None) {<br class="gmail_msg">
- return getParser().Error(L, Msg, Ranges);<br class="gmail_msg">
+ bool Warning(SMLoc L, const Twine &Msg, SMRange Range = None) {<br class="gmail_msg">
+ return getParser().Warning(L, Msg, Range);<br class="gmail_msg">
+ }<br class="gmail_msg">
+ bool Error(SMLoc L, const Twine &Msg, SMRange Range = None) {<br class="gmail_msg">
+ return getParser().Error(L, Msg, Range);<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
bool validatetLDMRegList(const MCInst &Inst, const OperandVector &Operands,<br class="gmail_msg">
@@ -6008,7 +6006,6 @@ bool ARMAsmParser::ParseInstruction(Pars<br class="gmail_msg">
<br class="gmail_msg">
// In Thumb1, only the branch (B) instruction can be predicated.<br class="gmail_msg">
if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(NameLoc, "conditional execution not supported in Thumb1");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -6022,14 +6019,12 @@ bool ARMAsmParser::ParseInstruction(Pars<br class="gmail_msg">
if (Mnemonic == "it") {<br class="gmail_msg">
SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + 2);<br class="gmail_msg">
if (ITMask.size() > 3) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(Loc, "too many conditions on IT instruction");<br class="gmail_msg">
}<br class="gmail_msg">
unsigned Mask = 8;<br class="gmail_msg">
for (unsigned i = ITMask.size(); i != 0; --i) {<br class="gmail_msg">
char pos = ITMask[i - 1];<br class="gmail_msg">
if (pos != 't' && pos != 'e') {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(Loc, "illegal IT block condition mask '" + ITMask + "'");<br class="gmail_msg">
}<br class="gmail_msg">
Mask >>= 1;<br class="gmail_msg">
@@ -6055,14 +6050,12 @@ bool ARMAsmParser::ParseInstruction(Pars<br class="gmail_msg">
// If we had a carry-set on an instruction that can't do that, issue an<br class="gmail_msg">
// error.<br class="gmail_msg">
if (!CanAcceptCarrySet && CarrySetting) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(NameLoc, "instruction '" + Mnemonic +<br class="gmail_msg">
"' can not set flags, but 's' suffix specified");<br class="gmail_msg">
}<br class="gmail_msg">
// If we had a predication code on an instruction that can't do that, issue an<br class="gmail_msg">
// error.<br class="gmail_msg">
if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(NameLoc, "instruction '" + Mnemonic +<br class="gmail_msg">
"' is not predicable, but condition code specified");<br class="gmail_msg">
}<br class="gmail_msg">
@@ -6106,7 +6099,6 @@ bool ARMAsmParser::ParseInstruction(Pars<br class="gmail_msg">
// For for ARM mode generate an error if the .n qualifier is used.<br class="gmail_msg">
if (ExtraToken == ".n" && !isThumb()) {<br class="gmail_msg">
SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start);<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(Loc, "instruction with .n (narrow) qualifier not allowed in "<br class="gmail_msg">
"arm mode");<br class="gmail_msg">
}<br class="gmail_msg">
@@ -6124,7 +6116,6 @@ bool ARMAsmParser::ParseInstruction(Pars<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
// Read the first operand.<br class="gmail_msg">
if (parseOperand(Operands, Mnemonic)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -6133,16 +6124,13 @@ bool ARMAsmParser::ParseInstruction(Pars<br class="gmail_msg">
<br class="gmail_msg">
// Parse and remember the operand.<br class="gmail_msg">
if (parseOperand(Operands, Mnemonic)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return true;<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- SMLoc Loc = getLexer().getLoc();<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
- return Error(Loc, "unexpected token in argument list");<br class="gmail_msg">
+ return TokError("unexpected token in argument list");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
Parser.Lex(); // Consume the EndOfStatement<br class="gmail_msg">
@@ -9331,7 +9319,6 @@ bool ARMAsmParser::parseLiteralValues(un<br class="gmail_msg">
for (;;) {<br class="gmail_msg">
const MCExpr *Value;<br class="gmail_msg">
if (getParser().parseExpression(Value)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -9434,7 +9421,6 @@ bool ARMAsmParser::parseDirectiveThumbFu<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "unexpected token in directive");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -9527,14 +9513,12 @@ bool ARMAsmParser::parseDirectiveReq(Str<br class="gmail_msg">
unsigned Reg;<br class="gmail_msg">
SMLoc SRegLoc, ERegLoc;<br class="gmail_msg">
if (ParseRegister(Reg, SRegLoc, ERegLoc)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(SRegLoc, "register name expected");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
// Shouldn't be anything else.<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "unexpected input in .req directive.");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -9554,7 +9538,6 @@ bool ARMAsmParser::parseDirectiveReq(Str<br class="gmail_msg">
bool ARMAsmParser::parseDirectiveUnreq(SMLoc L) {<br class="gmail_msg">
MCAsmParser &Parser = getParser();<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, "unexpected input in .unreq directive.");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -9624,7 +9607,6 @@ bool ARMAsmParser::parseDirectiveEabiAtt<br class="gmail_msg">
Tag = ARMBuildAttrs::AttrTypeFromString(Name);<br class="gmail_msg">
if (Tag == -1) {<br class="gmail_msg">
Error(TagLoc, "attribute name not recognised: " + Name);<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
Parser.Lex();<br class="gmail_msg">
@@ -9633,14 +9615,12 @@ bool ARMAsmParser::parseDirectiveEabiAtt<br class="gmail_msg">
<br class="gmail_msg">
TagLoc = Parser.getTok().getLoc();<br class="gmail_msg">
if (Parser.parseExpression(AttrExpr)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(AttrExpr);<br class="gmail_msg">
if (!CE) {<br class="gmail_msg">
Error(TagLoc, "expected numeric constant");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -9649,7 +9629,6 @@ bool ARMAsmParser::parseDirectiveEabiAtt<br class="gmail_msg">
<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::Comma)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "comma expected");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
Parser.Lex(); // skip comma<br class="gmail_msg">
@@ -9676,14 +9655,12 @@ bool ARMAsmParser::parseDirectiveEabiAtt<br class="gmail_msg">
const MCExpr *ValueExpr;<br class="gmail_msg">
SMLoc ValueExprLoc = Parser.getTok().getLoc();<br class="gmail_msg">
if (Parser.parseExpression(ValueExpr)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ValueExpr);<br class="gmail_msg">
if (!CE) {<br class="gmail_msg">
Error(ValueExprLoc, "expected numeric constant");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -9695,7 +9672,6 @@ bool ARMAsmParser::parseDirectiveEabiAtt<br class="gmail_msg">
IsStringValue = false;<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::Comma)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "comma expected");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
} else {<br class="gmail_msg">
Parser.Lex();<br class="gmail_msg">
@@ -9705,7 +9681,6 @@ bool ARMAsmParser::parseDirectiveEabiAtt<br class="gmail_msg">
if (IsStringValue) {<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::String)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "bad string constant");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -9849,7 +9824,6 @@ bool ARMAsmParser::parseDirectivePersona<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
if (HasExistingPersonality) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, "multiple personality directives");<br class="gmail_msg">
UC.emitPersonalityLocNotes();<br class="gmail_msg">
return false;<br class="gmail_msg">
@@ -9857,7 +9831,6 @@ bool ARMAsmParser::parseDirectivePersona<br class="gmail_msg">
<br class="gmail_msg">
// Parse the name of the personality routine<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, "unexpected input in .personality directive.");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10057,14 +10030,12 @@ bool ARMAsmParser::parseDirectiveInst(SM<br class="gmail_msg">
Width = 4;<br class="gmail_msg">
break;<br class="gmail_msg">
default:<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(Loc, "cannot determine Thumb instruction size, "<br class="gmail_msg">
"use inst.n/inst.w instead");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
} else {<br class="gmail_msg">
if (Suffix) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(Loc, "width suffixes are invalid in ARM mode");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10072,7 +10043,6 @@ bool ARMAsmParser::parseDirectiveInst(SM<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().is(AsmToken::EndOfStatement)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(Loc, "expected expression following directive");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10164,24 +10134,20 @@ bool ARMAsmParser::parseDirectivePersona<br class="gmail_msg">
UC.recordPersonalityIndex(L);<br class="gmail_msg">
<br class="gmail_msg">
if (!UC.hasFnStart()) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, ".fnstart must precede .personalityindex directive");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
if (UC.cantUnwind()) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, ".personalityindex cannot be used with .cantunwind");<br class="gmail_msg">
UC.emitCantUnwindLocNotes();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
if (UC.hasHandlerData()) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, ".personalityindex must precede .handlerdata directive");<br class="gmail_msg">
UC.emitHandlerDataLocNotes();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
if (HasExistingPersonality) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, "multiple personality directives");<br class="gmail_msg">
UC.emitPersonalityLocNotes();<br class="gmail_msg">
return false;<br class="gmail_msg">
@@ -10190,19 +10156,16 @@ bool ARMAsmParser::parseDirectivePersona<br class="gmail_msg">
const MCExpr *IndexExpression;<br class="gmail_msg">
SMLoc IndexLoc = Parser.getTok().getLoc();<br class="gmail_msg">
if (Parser.parseExpression(IndexExpression)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(IndexExpression);<br class="gmail_msg">
if (!CE) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(IndexLoc, "index must be a constant number");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
if (CE->getValue() < 0 ||<br class="gmail_msg">
CE->getValue() >= ARM::EHABI::NUM_PERSONALITY_INDEX) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(IndexLoc, "personality routine index should be in range [0-3]");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10216,7 +10179,6 @@ bool ARMAsmParser::parseDirectivePersona<br class="gmail_msg">
bool ARMAsmParser::parseDirectiveUnwindRaw(SMLoc L) {<br class="gmail_msg">
MCAsmParser &Parser = getParser();<br class="gmail_msg">
if (!UC.hasFnStart()) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, ".fnstart must precede .unwind_raw directives");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10228,14 +10190,12 @@ bool ARMAsmParser::parseDirectiveUnwindR<br class="gmail_msg">
if (getLexer().is(AsmToken::EndOfStatement) ||<br class="gmail_msg">
getParser().parseExpression(OffsetExpr)) {<br class="gmail_msg">
Error(OffsetLoc, "expected expression");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(OffsetExpr);<br class="gmail_msg">
if (!CE) {<br class="gmail_msg">
Error(OffsetLoc, "offset must be a constant");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10243,7 +10203,6 @@ bool ARMAsmParser::parseDirectiveUnwindR<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::Comma)) {<br class="gmail_msg">
Error(getLexer().getLoc(), "expected comma");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
Parser.Lex();<br class="gmail_msg">
@@ -10255,21 +10214,18 @@ bool ARMAsmParser::parseDirectiveUnwindR<br class="gmail_msg">
SMLoc OpcodeLoc = getLexer().getLoc();<br class="gmail_msg">
if (getLexer().is(AsmToken::EndOfStatement) || Parser.parseExpression(OE)) {<br class="gmail_msg">
Error(OpcodeLoc, "expected opcode expression");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const MCConstantExpr *OC = dyn_cast<MCConstantExpr>(OE);<br class="gmail_msg">
if (!OC) {<br class="gmail_msg">
Error(OpcodeLoc, "opcode value must be a constant");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const int64_t Opcode = OC->getValue();<br class="gmail_msg">
if (Opcode & ~0xff) {<br class="gmail_msg">
Error(OpcodeLoc, "invalid opcode");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10280,7 +10236,6 @@ bool ARMAsmParser::parseDirectiveUnwindR<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::Comma)) {<br class="gmail_msg">
Error(getLexer().getLoc(), "unexpected token in directive");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10300,7 +10255,6 @@ bool ARMAsmParser::parseDirectiveTLSDesc<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
TokError("expected variable after '.tlsdescseq' directive");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10311,7 +10265,6 @@ bool ARMAsmParser::parseDirectiveTLSDesc<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "unexpected token");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10324,12 +10277,10 @@ bool ARMAsmParser::parseDirectiveTLSDesc<br class="gmail_msg">
bool ARMAsmParser::parseDirectiveMovSP(SMLoc L) {<br class="gmail_msg">
MCAsmParser &Parser = getParser();<br class="gmail_msg">
if (!UC.hasFnStart()) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, ".fnstart must precede .movsp directives");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
if (UC.getFPReg() != ARM::SP) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(L, "unexpected .movsp directive");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10337,13 +10288,11 @@ bool ARMAsmParser::parseDirectiveMovSP(S<br class="gmail_msg">
SMLoc SPRegLoc = Parser.getTok().getLoc();<br class="gmail_msg">
int SPReg = tryParseRegister();<br class="gmail_msg">
if (SPReg == -1) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(SPRegLoc, "register expected");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
if (SPReg == ARM::SP || SPReg == ARM::PC) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(SPRegLoc, "sp and pc are not permitted in .movsp directive");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10354,7 +10303,6 @@ bool ARMAsmParser::parseDirectiveMovSP(S<br class="gmail_msg">
<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::Hash)) {<br class="gmail_msg">
Error(Parser.getTok().getLoc(), "expected #constant");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
Parser.Lex();<br class="gmail_msg">
@@ -10362,14 +10310,12 @@ bool ARMAsmParser::parseDirectiveMovSP(S<br class="gmail_msg">
const MCExpr *OffsetExpr;<br class="gmail_msg">
SMLoc OffsetLoc = Parser.getTok().getLoc();<br class="gmail_msg">
if (Parser.parseExpression(OffsetExpr)) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(OffsetLoc, "malformed offset expression");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(OffsetExpr);<br class="gmail_msg">
if (!CE) {<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
Error(OffsetLoc, "offset must be an immediate constant");<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
@@ -10389,7 +10335,6 @@ bool ARMAsmParser::parseDirectiveObjectA<br class="gmail_msg">
MCAsmParser &Parser = getParser();<br class="gmail_msg">
if (getLexer().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
Error(getLexer().getLoc(), "unexpected token");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10401,7 +10346,6 @@ bool ARMAsmParser::parseDirectiveObjectA<br class="gmail_msg">
<br class="gmail_msg">
if (ID == ARM::AK_INVALID) {<br class="gmail_msg">
Error(ArchLoc, "unknown architecture '" + Arch + "'");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10409,7 +10353,6 @@ bool ARMAsmParser::parseDirectiveObjectA<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::EndOfStatement)) {<br class="gmail_msg">
Error(getLexer().getLoc(), "unexpected token");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
return false;<br class="gmail_msg">
@@ -10442,13 +10385,11 @@ bool ARMAsmParser::parseDirectiveThumbSe<br class="gmail_msg">
StringRef Name;<br class="gmail_msg">
if (Parser.parseIdentifier(Name)) {<br class="gmail_msg">
TokError("expected identifier after '.thumb_set'");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::Comma)) {<br class="gmail_msg">
TokError("expected comma after name '" + Name + "'");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
Lex();<br class="gmail_msg">
@@ -10512,7 +10453,6 @@ bool ARMAsmParser::parseDirectiveArchExt<br class="gmail_msg">
<br class="gmail_msg">
if (getLexer().isNot(AsmToken::Identifier)) {<br class="gmail_msg">
Error(getLexer().getLoc(), "expected architecture extension name");<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -10558,7 +10498,6 @@ bool ARMAsmParser::parseDirectiveArchExt<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
Error(ExtLoc, "unknown architectural extension: " + Name);<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return false;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -114,7 +114,7 @@ class HexagonAsmParser : public MCTarget<br class="gmail_msg">
uint64_t &ErrorInfo, bool MatchingInlineAsm) override;<br class="gmail_msg">
<br class="gmail_msg">
unsigned validateTargetOperandClass(MCParsedAsmOperand &Op, unsigned Kind) override;<br class="gmail_msg">
- void OutOfRange(SMLoc IDLoc, long long Val, long long Max);<br class="gmail_msg">
+ bool OutOfRange(SMLoc IDLoc, long long Val, long long Max);<br class="gmail_msg">
int processInstruction(MCInst &Inst, OperandVector const &Operands,<br class="gmail_msg">
SMLoc IDLoc);<br class="gmail_msg">
<br class="gmail_msg">
@@ -637,60 +637,63 @@ bool HexagonAsmParser::finishBundle(SMLo<br class="gmail_msg">
uint64_t Err = Check.getError();<br class="gmail_msg">
if (Err != HexagonMCErrInfo::CHECK_SUCCESS) {<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_BRANCHES & Err)<br class="gmail_msg">
- Error(IDLoc,<br class="gmail_msg">
- "unconditional branch cannot precede another branch in packet");<br class="gmail_msg">
+ return Error(<br class="gmail_msg">
+ IDLoc,<br class="gmail_msg">
+ "unconditional branch cannot precede another branch in packet");<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_NEWP & Err ||<br class="gmail_msg">
HexagonMCErrInfo::CHECK_ERROR_NEWV & Err)<br class="gmail_msg">
- Error(IDLoc, "register `" + R +<br class="gmail_msg">
- "' used with `.new' "<br class="gmail_msg">
- "but not validly modified in the same packet");<br class="gmail_msg">
+ return Error(IDLoc, "register `" + R +<br class="gmail_msg">
+ "' used with `.new' "<br class="gmail_msg">
+ "but not validly modified in the same packet");<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_REGISTERS & Err)<br class="gmail_msg">
- Error(IDLoc, "register `" + R + "' modified more than once");<br class="gmail_msg">
+ return Error(IDLoc, "register `" + R + "' modified more than once");<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_READONLY & Err)<br class="gmail_msg">
- Error(IDLoc, "cannot write to read-only register `" + R + "'");<br class="gmail_msg">
+ return Error(IDLoc, "cannot write to read-only register `" + R + "'");<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_LOOP & Err)<br class="gmail_msg">
- Error(IDLoc, "loop-setup and some branch instructions "<br class="gmail_msg">
- "cannot be in the same packet");<br class="gmail_msg">
+ return Error(IDLoc, "loop-setup and some branch instructions "<br class="gmail_msg">
+ "cannot be in the same packet");<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_ENDLOOP & Err) {<br class="gmail_msg">
Twine N(HexagonMCInstrInfo::isInnerLoop(MCB) ? '0' : '1');<br class="gmail_msg">
- Error(IDLoc, "packet marked with `:endloop" + N + "' " +<br class="gmail_msg">
+ return Error(IDLoc,<br class="gmail_msg">
+ "packet marked with `:endloop" + N + "' " +<br class="gmail_msg">
"cannot contain instructions that modify register " +<br class="gmail_msg">
"`" + R + "'");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_SOLO & Err)<br class="gmail_msg">
- Error(IDLoc,<br class="gmail_msg">
- "instruction cannot appear in packet with other instructions");<br class="gmail_msg">
+ return Error(<br class="gmail_msg">
+ IDLoc,<br class="gmail_msg">
+ "instruction cannot appear in packet with other instructions");<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonMCErrInfo::CHECK_ERROR_NOSLOTS & Err)<br class="gmail_msg">
- Error(IDLoc, "too many slots used in packet");<br class="gmail_msg">
+ return Error(IDLoc, "too many slots used in packet");<br class="gmail_msg">
<br class="gmail_msg">
if (Err & HexagonMCErrInfo::CHECK_ERROR_SHUFFLE) {<br class="gmail_msg">
uint64_t Erm = Check.getShuffleError();<br class="gmail_msg">
<br class="gmail_msg">
if (HexagonShuffler::SHUFFLE_ERROR_INVALID == Erm)<br class="gmail_msg">
- Error(IDLoc, "invalid instruction packet");<br class="gmail_msg">
+ return Error(IDLoc, "invalid instruction packet");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_STORES == Erm)<br class="gmail_msg">
- Error(IDLoc, "invalid instruction packet: too many stores");<br class="gmail_msg">
+ return Error(IDLoc, "invalid instruction packet: too many stores");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_LOADS == Erm)<br class="gmail_msg">
- Error(IDLoc, "invalid instruction packet: too many loads");<br class="gmail_msg">
+ return Error(IDLoc, "invalid instruction packet: too many loads");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_BRANCHES == Erm)<br class="gmail_msg">
- Error(IDLoc, "too many branches in packet");<br class="gmail_msg">
+ return Error(IDLoc, "too many branches in packet");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_NOSLOTS == Erm)<br class="gmail_msg">
- Error(IDLoc, "invalid instruction packet: out of slots");<br class="gmail_msg">
+ return Error(IDLoc, "invalid instruction packet: out of slots");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_SLOTS == Erm)<br class="gmail_msg">
- Error(IDLoc, "invalid instruction packet: slot error");<br class="gmail_msg">
+ return Error(IDLoc, "invalid instruction packet: slot error");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_ERRATA2 == Erm)<br class="gmail_msg">
- Error(IDLoc, "v60 packet violation");<br class="gmail_msg">
+ return Error(IDLoc, "v60 packet violation");<br class="gmail_msg">
else if (HexagonShuffler::SHUFFLE_ERROR_STORE_LOAD_CONFLICT == Erm)<br class="gmail_msg">
- Error(IDLoc, "slot 0 instruction does not allow slot 1 store");<br class="gmail_msg">
+ return Error(IDLoc, "slot 0 instruction does not allow slot 1 store");<br class="gmail_msg">
else<br class="gmail_msg">
- Error(IDLoc, "unknown error in instruction packet");<br class="gmail_msg">
+ return Error(IDLoc, "unknown error in instruction packet");<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
@@ -1508,7 +1511,8 @@ unsigned HexagonAsmParser::validateTarge<br class="gmail_msg">
return Match_InvalidOperand;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
-void HexagonAsmParser::OutOfRange(SMLoc IDLoc, long long Val, long long Max) {<br class="gmail_msg">
+// FIXME: Calls to OutOfRange shoudl propagate failure up to parseStatement.<br class="gmail_msg">
+bool HexagonAsmParser::OutOfRange(SMLoc IDLoc, long long Val, long long Max) {<br class="gmail_msg">
std::string errStr;<br class="gmail_msg">
raw_string_ostream ES(errStr);<br class="gmail_msg">
ES << "value " << Val << "(" << format_hex(Val, 0) << ") out of range: ";<br class="gmail_msg">
@@ -1516,7 +1520,7 @@ void HexagonAsmParser::OutOfRange(SMLoc<br class="gmail_msg">
ES << "0-" << Max;<br class="gmail_msg">
else<br class="gmail_msg">
ES << Max << "-" << (-Max - 1);<br class="gmail_msg">
- Error(IDLoc, ES.str().c_str());<br class="gmail_msg">
+ return Parser.printError(IDLoc, ES.str().c_str());<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
int HexagonAsmParser::processInstruction(MCInst &Inst,<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=281249&r1=281248&r2=281249&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Mon Sep 12 15:03:02 2016<br class="gmail_msg">
@@ -924,9 +924,11 @@ public:<br class="gmail_msg">
assert(N == 1 && "Invalid number of operands!");<br class="gmail_msg">
Inst.addOperand(MCOperand::createReg(getFGR32Reg()));<br class="gmail_msg">
// FIXME: We ought to do this for -integrated-as without -via-file-asm too.<br class="gmail_msg">
+ // FIXME: This should propagate failure up to parseStatement.<br class="gmail_msg">
if (!AsmParser.useOddSPReg() && RegIdx.Index & 1)<br class="gmail_msg">
- AsmParser.Error(StartLoc, "-mno-odd-spreg prohibits the use of odd FPU "<br class="gmail_msg">
- "registers");<br class="gmail_msg">
+ AsmParser.getParser().printError(<br class="gmail_msg">
+ StartLoc, "-mno-odd-spreg prohibits the use of odd FPU "<br class="gmail_msg">
+ "registers");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
void addFGRH32AsmRegOperands(MCInst &Inst, unsigned N) const {<br class="gmail_msg">
@@ -1860,7 +1862,7 @@ bool MipsAsmParser::processInstruction(M<br class="gmail_msg">
if (MemOffset < -32768 || MemOffset > 32767) {<br class="gmail_msg">
// Offset can't exceed 16bit value.<br class="gmail_msg">
expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad(), true);<br class="gmail_msg">
- return false;<br class="gmail_msg">
+ return getParser().hasPendingError();<br class="gmail_msg">
}<br class="gmail_msg">
} else if (Op.isExpr()) {<br class="gmail_msg">
const MCExpr *Expr = Op.getExpr();<br class="gmail_msg">
@@ -1870,11 +1872,11 @@ bool MipsAsmParser::processInstruction(M<br class="gmail_msg">
if (SR->getKind() == MCSymbolRefExpr::VK_None) {<br class="gmail_msg">
// Expand symbol.<br class="gmail_msg">
expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad(), false);<br class="gmail_msg">
- return false;<br class="gmail_msg">
+ return getParser().hasPendingError();<br class="gmail_msg">
}<br class="gmail_msg">
} else if (!isEvaluated(Expr)) {<br class="gmail_msg">
expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad(), false);<br class="gmail_msg">
- return false;<br class="gmail_msg">
+ return getParser().hasPendingError();<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
}<br class="gmail_msg">
@@ -2466,6 +2468,7 @@ bool MipsAsmParser::expandLoadAddress(un<br class="gmail_msg">
Error(IDLoc, "la used to load 64-bit address");<br class="gmail_msg">
// Continue as if we had 'dla' instead.<br class="gmail_msg">
Is32BitAddress = false;<br class="gmail_msg">
+ return true;<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
// dla requires 64-bit addresses.<br class="gmail_msg">
@@ -2692,9 +2695,9 @@ bool MipsAsmParser::expandUncondBranchMM<br class="gmail_msg">
Inst.setOpcode(hasMips32r6() ? Mips::BC16_MMR6 : Mips::B16_MM);<br class="gmail_msg">
} else {<br class="gmail_msg">
if (!isInt<17>(Offset.getImm()))<br class="gmail_msg">
- Error(IDLoc, "branch target out of range");<br class="gmail_msg">
+ return Error(IDLoc, "branch target out of range");<br class="gmail_msg">
if (OffsetToAlignment(Offset.getImm(), 1LL << 1))<br class="gmail_msg">
- Error(IDLoc, "branch to misaligned address");<br class="gmail_msg">
+ return Error(IDLoc, "branch to misaligned address");<br class="gmail_msg">
Inst.clear();<br class="gmail_msg">
Inst.setOpcode(Mips::BEQ_MM);<br class="gmail_msg">
Inst.addOperand(MCOperand::createReg(Mips::ZERO));<br class="gmail_msg">
@@ -3302,8 +3305,7 @@ bool MipsAsmParser::expandUlh(MCInst &In<br class="gmail_msg">
MipsTargetStreamer &TOut = getTargetStreamer();<br class="gmail_msg">
<br class="gmail_msg">
if (hasMips32r6() || hasMips64r6()) {<br class="gmail_msg">
- Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");<br class="gmail_msg">
- return false;<br class="gmail_msg">
+ return Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
warnIfNoMacro(IDLoc);<br class="gmail_msg">
@@ -3380,10 +3382,8 @@ bool MipsAsmParser::expandUlw(MCInst &In<br class="gmail_msg">
const MCSubtargetInfo *STI) {<br class="gmail_msg">
MipsTargetStreamer &TOut = getTargetStreamer();<br class="gmail_msg">
<br class="gmail_msg">
- if (hasMips32r6() || hasMips64r6()) {<br class="gmail_msg">
- Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");<br class="gmail_msg">
- return false;<br class="gmail_msg">
- }<br class="gmail_msg">
+ if (hasMips32r6() || hasMips64r6())<br class="gmail_msg">
+ return Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");<br class="gmail_msg">
<br class="gmail_msg">
const MCOperand &DstRegOp = Inst.getOperand(0);<br class="gmail_msg">
assert(DstRegOp.isReg() && "expected register operand kind");<br class="gmail_msg">
@@ -4817,12 +4817,10 @@ bool MipsAsmParser::parseParenSuffix(Str<br class="gmail_msg">
Parser.Lex();<br class="gmail_msg">
if (parseOperand(Operands, Name)) {<br class="gmail_msg">
SMLoc Loc = getLexer().getLoc();<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(Loc, "unexpected token in argument list");<br class="gmail_msg">
}<br class="gmail_msg">
if (Parser.getTok().isNot(AsmToken::RParen)) {<br class="gmail_msg">
SMLoc Loc = getLexer().getLoc();<br class="gmail_msg">
- Parser.eatToEndOfStatement();<br class="gmail_msg">
return Error(Loc, "unexpected token, expected ')'");<br class="gmail_msg">
}<br class="gmail_msg">
Operands.push_back(<br class="gmail_msg">
@@ -4847,12 +4845,10 @@ bool MipsAsmParser::parseBracketSuffix(S<br class="gmail_msg">
Parser.Lex();<br class="gmail_msg">
</blockquote></div></div></div>