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