[llvm] r275795 - [MC] Cleanup Error Handling in AsmParser

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 18 11:37:01 PDT 2016


On Mon, Jul 18, 2016 at 8:31 AM Nirav Dave via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: niravd
> Date: Mon Jul 18 10:24:03 2016
> New Revision: 275795
>
> URL: http://llvm.org/viewvc/llvm-project?rev=275795&view=rev
> Log:
> [MC] Cleanup Error Handling in AsmParser
>
> Add parseToken and compatriot functions to stitch error checks in
> straight linear code. As part of this fix some erronous handling of
> directives where the EndOfStatement token either was not checked or
> Lexed on termination.
>
> Reviewers: rnk, majnemer
>
> Subscribers: llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D22312
>
> Modified:
>     llvm/trunk/lib/MC/MCAsmStreamer.cpp
>     llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>     llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp
>     llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
>     llvm/trunk/test/MC/AsmParser/preserve-comments.s
>
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=275795&r1=275794&r2=275795&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Mon Jul 18 10:24:03 2016
> @@ -428,7 +428,7 @@ void MCAsmStreamer::EmitLinkerOptions(Ar
>           ie = Options.end(); it != ie; ++it) {
>      OS << ", " << '"' << *it << '"';
>    }
> -  OS << "\n";
> +  EmitEOL();
>  }
>
>  void MCAsmStreamer::EmitDataRegion(MCDataRegionType Kind) {
> @@ -614,7 +614,7 @@ void MCAsmStreamer::emitELFSize(MCSymbol
>    Symbol->print(OS, MAI);
>    OS << ", ";
>    Value->print(OS, MAI);
> -  OS << '\n';
> +  EmitEOL();
>  }
>
>  void MCAsmStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
> @@ -1243,10 +1243,10 @@ void MCAsmStreamer::EmitCFIEscape(String
>
>  void MCAsmStreamer::EmitCFIGnuArgsSize(int64_t Size) {
>    MCStreamer::EmitCFIGnuArgsSize(Size);
> -
> +
>    uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
>    unsigned Len = encodeULEB128(Size, Buffer + 1) + 1;
> -
> +
>    PrintCFIEscape(OS, StringRef((const char *)&Buffer[0], Len));
>    EmitEOL();
>  }
>
> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=275795&r1=275794&r2=275795&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Mon Jul 18 10:24:03 2016
> @@ -250,6 +250,29 @@ public:
>    void eatToEndOfStatement() override;
>
>    void checkForValidSection() override;
> +
> +  bool getTokenLoc(SMLoc &Loc) {
> +    Loc = getTok().getLoc();
> +    return false;
> +  }
> +
> +  /// parseToken - If current token has the specified kind, eat it and
> +  /// return success.  Otherwise, emit the specified error and return
> failure.
> +  bool parseToken(AsmToken::TokenKind T, const Twine &ErrMsg) {
> +    if (getTok().getKind() != T)
> +      return TokError(ErrMsg);
> +    Lex();
> +    return false;
> +  }
> +
> +  bool parseIntToken(int64_t &V, const Twine &ErrMsg) {
> +    if (getTok().getKind() != AsmToken::Integer)
> +      return TokError(ErrMsg);
> +    V = getTok().getIntVal();
> +    Lex();
> +    return false;
> +  }
> +
>    /// }
>
>  private:
> @@ -308,6 +331,18 @@ private:
>    }
>    static void DiagHandler(const SMDiagnostic &Diag, void *Context);
>
> +  bool check(bool P, SMLoc Loc, const Twine &Msg) {
> +    if (P)
> +      return Error(Loc, Msg);
> +    return false;
> +  }
> +
> +  bool check(bool P, const Twine &Msg) {
> +    if (P)
> +      return TokError(Msg);
> +    return false;
> +  }
> +
>    /// \brief Enter the specified file. This returns true on failure.
>    bool enterIncludeFile(const std::string &Filename);
>
> @@ -820,10 +855,9 @@ bool AsmParser::parseParenExpr(const MCE
>  bool AsmParser::parseBracketExpr(const MCExpr *&Res, SMLoc &EndLoc) {
>    if (parseExpression(Res))
>      return true;
> -  if (Lexer.isNot(AsmToken::RBrac))
> -    return TokError("expected ']' in brackets expression");
> -  EndLoc = Lexer.getTok().getEndLoc();
> -  Lex();
> +  EndLoc = getTok().getEndLoc();
> +  if (parseToken(AsmToken::RBrac, "expected ']' in brackets expression"))
> +    return true;
>    return false;
>  }
>
> @@ -888,11 +922,10 @@ bool AsmParser::parsePrimaryExpr(const M
>        Lex(); // eat '('.
>        StringRef VName;
>        parseIdentifier(VName);
> -      if (Lexer.isNot(AsmToken::RParen)) {
> -          return Error(Lexer.getTok().getLoc(),
> -                       "unexpected token in variant, expected ')'");
> -      }
> -      Lex(); // eat ')'.
> +      // eat ')'.
> +      if (parseToken(AsmToken::RParen,
> +                     "unexpected token in variant, expected ')'"))
> +        return true;
>        Split = std::make_pair(Identifier, VName);
>      }
>
> @@ -1136,10 +1169,10 @@ bool AsmParser::parseParenExprOfDepth(un
>      // We don't Lex() the last RParen.
>      // This is the same behavior as parseParenExpression().
>      if (ParenDepth - 1 > 0) {
> -      if (Lexer.isNot(AsmToken::RParen))
> -        return TokError("expected ')' in parentheses expression");
> -      EndLoc = Lexer.getTok().getEndLoc();
> -      Lex();
> +      EndLoc = getTok().getEndLoc();
> +      if (parseToken(AsmToken::RParen,
> +                     "expected ')' in parentheses expression"))
> +        return true;
>      }
>    }
>    return false;
> @@ -2238,7 +2271,7 @@ bool AsmParser::parseMacroArguments(cons
>          return true;
>        }
>
> -      if (!Lexer.is(AsmToken::Equal)) {
> +      if (Lexer.isNot(AsmToken::Equal)) {
>          TokError("expected '=' after formal parameter identifier");
>          eatToEndOfStatement();
>          return true;
> @@ -2445,12 +2478,10 @@ bool AsmParser::parseIdentifier(StringRe
>  bool AsmParser::parseDirectiveSet(StringRef IDVal, bool allow_redef) {
>    StringRef Name;
>
> -  if (parseIdentifier(Name))
> -    return TokError("expected identifier after '" + Twine(IDVal) + "'");
> -
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in '" + Twine(IDVal) + "'");
> -  Lex();
> +  if (check(parseIdentifier(Name),
> +            "expected identifier after '" + Twine(IDVal) + "'") ||
> +      parseToken(AsmToken::Comma, "unexpected token in '" + Twine(IDVal)
> + "'"))
> +    return true;
>
>    return parseAssignment(Name, allow_redef, true);
>  }
> @@ -2510,6 +2541,7 @@ bool AsmParser::parseEscapedString(std::
>      }
>    }
>
> +  Lex();
>    return false;
>  }
>
> @@ -2520,25 +2552,22 @@ bool AsmParser::parseDirectiveAscii(Stri
>      checkForValidSection();
>
>      for (;;) {
> -      if (getLexer().isNot(AsmToken::String))
> -        return TokError("expected string in '" + Twine(IDVal) + "'
> directive");
> -
>        std::string Data;
> -      if (parseEscapedString(Data))
> +      if (check(getTok().isNot(AsmToken::String),
> +                "expected string in '" + Twine(IDVal) + "' directive") ||
> +          parseEscapedString(Data))
>          return true;
>
>        getStreamer().EmitBytes(Data);
>        if (ZeroTerminated)
>          getStreamer().EmitBytes(StringRef("\0", 1));
>
> -      Lex();
> -
>        if (getLexer().is(AsmToken::EndOfStatement))
>          break;
>
> -      if (getLexer().isNot(AsmToken::Comma))
> -        return TokError("unexpected token in '" + Twine(IDVal) + "'
> directive");
> -      Lex();
> +      if (parseToken(AsmToken::Comma,
> +                     "unexpected token in '" + Twine(IDVal) + "'
> directive"))
> +        return true;
>      }
>    }
>
> @@ -2558,18 +2587,13 @@ bool AsmParser::parseDirectiveReloc(SMLo
>
>    // We can only deal with constant expressions at the moment.
>    int64_t OffsetValue;
> -  if (!Offset->evaluateAsAbsolute(OffsetValue))
> -    return Error(OffsetLoc, "expression is not a constant value");
> -
> -  if (OffsetValue < 0)
> -    return Error(OffsetLoc, "expression is negative");
> -
> -  if (Lexer.isNot(AsmToken::Comma))
> -    return TokError("expected comma");
> -  Lex();
> +  if (check(!Offset->evaluateAsAbsolute(OffsetValue), OffsetLoc,
> +            "expression is not a constant value") ||
> +      check(OffsetValue < 0, OffsetLoc, "expression is negative") ||
> +      parseToken(AsmToken::Comma, "expected comma") ||
> +      check(getTok().isNot(AsmToken::Identifier), "expected relocation
> name"))
>

I find these long if chains substantially harder to read.

In some of them you even have to add comments have way through the
condition. Generally, I suspect that if you need a comment, it shouldn't be
in a single condition unless that's a functional necessity. Would you be OK
with me refactoring it in that way?


> +    return true;
>
> -  if (Lexer.isNot(AsmToken::Identifier))
> -    return TokError("expected relocation name");
>    SMLoc NameLoc = Lexer.getTok().getLoc();
>    StringRef Name = Lexer.getTok().getIdentifier();
>    Lex();
> @@ -2585,12 +2609,11 @@ bool AsmParser::parseDirectiveReloc(SMLo
>        return Error(ExprLoc, "expression must be relocatable");
>    }
>
> -  if (Lexer.isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in .reloc directive");
> -
> -  if (getStreamer().EmitRelocDirective(*Offset, Name, Expr, DirectiveLoc))
> -    return Error(NameLoc, "unknown relocation name");
> -
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in .reloc directive") ||
> +      check(getStreamer().EmitRelocDirective(*Offset, Name, Expr,
> DirectiveLoc),
> +            NameLoc, "unknown relocation name"))
> +    return true;
>    return false;
>  }
>
> @@ -2620,9 +2643,8 @@ bool AsmParser::parseDirectiveValue(unsi
>          break;
>
>        // FIXME: Improve diagnostic.
> -      if (getLexer().isNot(AsmToken::Comma))
> -        return TokError("unexpected token in directive");
> -      Lex();
> +      if (parseToken(AsmToken::Comma, "unexpected token in directive"))
> +        return true;
>      }
>    }
>
> @@ -2637,10 +2659,9 @@ bool AsmParser::parseDirectiveOctaValue(
>      checkForValidSection();
>
>      for (;;) {
> -      if (Lexer.getKind() == AsmToken::Error)
> +      if (getTok().is(AsmToken::Error))
>          return true;
> -      if (Lexer.getKind() != AsmToken::Integer &&
> -          Lexer.getKind() != AsmToken::BigNum)
> +      if (getTok().isNot(AsmToken::Integer) &&
> getTok().isNot(AsmToken::BigNum))
>          return TokError("unknown token in expression");
>
>        SMLoc ExprLoc = getLexer().getLoc();
> @@ -2670,9 +2691,8 @@ bool AsmParser::parseDirectiveOctaValue(
>          break;
>
>        // FIXME: Improve diagnostic.
> -      if (getLexer().isNot(AsmToken::Comma))
> -        return TokError("unexpected token in directive");
> -      Lex();
> +      if (parseToken(AsmToken::Comma, "unexpected token in directive"))
> +        return true;
>      }
>    }
>
> @@ -2729,9 +2749,8 @@ bool AsmParser::parseDirectiveRealValue(
>        if (Lexer.is(AsmToken::EndOfStatement))
>          break;
>
> -      if (Lexer.isNot(AsmToken::Comma))
> -        return TokError("unexpected token in directive");
> -      Lex();
> +      if (parseToken(AsmToken::Comma, "unexpected token in directive"))
> +        return true;
>      }
>    }
>
> @@ -2756,11 +2775,9 @@ bool AsmParser::parseDirectiveZero() {
>        return true;
>    }
>
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.zero' directive");
> -
> -  Lex();
> -
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.zero' directive"))
> +    return true;
>    getStreamer().emitFill(*NumBytes, Val, NumBytesLoc);
>
>    return false;
> @@ -2781,27 +2798,18 @@ bool AsmParser::parseDirectiveFill() {
>
>    SMLoc SizeLoc, ExprLoc;
>    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -    if (getLexer().isNot(AsmToken::Comma))
> -      return TokError("unexpected token in '.fill' directive");
> -    Lex();
>
> -    SizeLoc = getLexer().getLoc();
> -    if (parseAbsoluteExpression(FillSize))
> +    if (parseToken(AsmToken::Comma, "unexpected token in '.fill'
> directive") ||
> +        getTokenLoc(SizeLoc) || parseAbsoluteExpression(FillSize))
>        return true;
>
>      if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -      if (getLexer().isNot(AsmToken::Comma))
> -        return TokError("unexpected token in '.fill' directive");
> -      Lex();
> -
> -      ExprLoc = getLexer().getLoc();
> -      if (parseAbsoluteExpression(FillExpr))
> +      if (parseToken(AsmToken::Comma,
> +                     "unexpected token in '.fill' directive") ||
> +          getTokenLoc(ExprLoc) || parseAbsoluteExpression(FillExpr) ||
> +          parseToken(AsmToken::EndOfStatement,
> +                     "unexpected token in '.fill' directive"))
>          return true;
> -
> -      if (getLexer().isNot(AsmToken::EndOfStatement))
> -        return TokError("unexpected token in '.fill' directive");
> -
> -      Lex();
>      }
>    }
>
> @@ -2834,18 +2842,15 @@ bool AsmParser::parseDirectiveOrg() {
>    // Parse optional fill expression.
>    int64_t FillExpr = 0;
>    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -    if (getLexer().isNot(AsmToken::Comma))
> -      return TokError("unexpected token in '.org' directive");
> -    Lex();
> -
> -    if (parseAbsoluteExpression(FillExpr))
> +    if (parseToken(AsmToken::Comma, "unexpected token in '.org'
> directive") ||
> +        parseAbsoluteExpression(FillExpr))
>        return true;
> -
> -    if (getLexer().isNot(AsmToken::EndOfStatement))
> -      return TokError("unexpected token in '.org' directive");
>    }
>
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.org' directive"))
> +    return true;
> +
>    getStreamer().emitValueToOffset(Offset, FillExpr);
>    return false;
>  }
> @@ -2865,34 +2870,27 @@ bool AsmParser::parseDirectiveAlign(bool
>    int64_t FillExpr = 0;
>    int64_t MaxBytesToFill = 0;
>    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -    if (getLexer().isNot(AsmToken::Comma))
> -      return TokError("unexpected token in directive");
> -    Lex();
> +    if (parseToken(AsmToken::Comma, "unexpected token in directive"))
> +      return true;
>
>      // The fill expression can be omitted while specifying a maximum
> number of
>      // alignment bytes, e.g:
>      //  .align 3,,4
> -    if (getLexer().isNot(AsmToken::Comma)) {
> +    if (getTok().isNot(AsmToken::Comma)) {
>        HasFillExpr = true;
>        if (parseAbsoluteExpression(FillExpr))
>          return true;
>      }
>
> -    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -      if (getLexer().isNot(AsmToken::Comma))
> -        return TokError("unexpected token in directive");
> -      Lex();
> -
> -      MaxBytesLoc = getLexer().getLoc();
> -      if (parseAbsoluteExpression(MaxBytesToFill))
> +    if (getTok().isNot(AsmToken::EndOfStatement)) {
> +      if (parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +          getTokenLoc(MaxBytesLoc) ||
> parseAbsoluteExpression(MaxBytesToFill))
>          return true;
> -
> -      if (getLexer().isNot(AsmToken::EndOfStatement))
> -        return TokError("unexpected token in directive");
>      }
>    }
>
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement, "unexpected token in
> directive"))
> +    return true;
>
>    if (!HasFillExpr)
>      FillExpr = 0;
> @@ -2963,33 +2961,32 @@ bool AsmParser::parseDirectiveFile(SMLoc
>        return TokError("file number less than one");
>    }
>
> -  if (getLexer().isNot(AsmToken::String))
> -    return TokError("unexpected token in '.file' directive");
> +  std::string Path = getTok().getString();
>
>    // Usually the directory and filename together, otherwise just the
> directory.
>    // Allow the strings to have escaped octal character sequence.
> -  std::string Path = getTok().getString();
> -  if (parseEscapedString(Path))
> +  if (check(getTok().isNot(AsmToken::String),
> +            "unexpected token in '.file' directive") ||
> +      parseEscapedString(Path))
>      return true;
> -  Lex();
>
>    StringRef Directory;
>    StringRef Filename;
>    std::string FilenameData;
>    if (getLexer().is(AsmToken::String)) {
> -    if (FileNumber == -1)
> -      return TokError("explicit path specified, but no file number");
> -    if (parseEscapedString(FilenameData))
> +    if (check(FileNumber == -1,
> +              "explicit path specified, but no file number") ||
> +        parseEscapedString(FilenameData))
>        return true;
>      Filename = FilenameData;
>      Directory = Path;
> -    Lex();
>    } else {
>      Filename = Path;
>    }
>
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.file' directive");
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.file' directive"))
> +    return true;
>
>    if (FileNumber == -1)
>      getStreamer().EmitFileDirective(Filename);
> @@ -3009,19 +3006,16 @@ bool AsmParser::parseDirectiveFile(SMLoc
>  /// parseDirectiveLine
>  /// ::= .line [number]
>  bool AsmParser::parseDirectiveLine() {
> +  int64_t LineNumber;
>    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -    if (getLexer().isNot(AsmToken::Integer))
> -      return TokError("unexpected token in '.line' directive");
> -
> -    int64_t LineNumber = getTok().getIntVal();
> +    if (parseIntToken(LineNumber, "unexpected token in '.line'
> directive"))
> +      return true;
>      (void)LineNumber;
> -    Lex();
> -
>      // FIXME: Do something with the .line.
>    }
> -
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.line' directive");
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.line' directive"))
> +    return true;
>
>    return false;
>  }
> @@ -3034,16 +3028,16 @@ bool AsmParser::parseDirectiveLine() {
>  /// third number is a column position (zero if not specified).  The
> remaining
>  /// optional items are .loc sub-directives.
>  bool AsmParser::parseDirectiveLoc() {
> -  if (getLexer().isNot(AsmToken::Integer))
> -    return TokError("unexpected token in '.loc' directive");
> -  int64_t FileNumber = getTok().getIntVal();
> -  if (FileNumber < 1)
> -    return TokError("file number less than one in '.loc' directive");
> -  if (!getContext().isValidDwarfFileNumber(FileNumber))
> -    return TokError("unassigned file number in '.loc' directive");
> -  Lex();
> +  int64_t FileNumber = 0, LineNumber = 0;
> +  SMLoc Loc = getTok().getLoc();
> +  if (parseIntToken(FileNumber, "unexpected token in '.loc' directive") ||
> +      check(FileNumber < 1, Loc,
> +            "file number less than one in '.loc' directive") ||
> +      check(!getContext().isValidDwarfFileNumber(FileNumber), Loc,
> +            "unassigned file number in '.loc' directive"))
> +    return true;
>
> -  int64_t LineNumber = 0;
> +  // optional
>    if (getLexer().is(AsmToken::Integer)) {
>      LineNumber = getTok().getIntVal();
>      if (LineNumber < 0)
> @@ -3120,6 +3114,7 @@ bool AsmParser::parseDirectiveLoc() {
>          break;
>      }
>    }
> +  Lex();
>
>    getStreamer().EmitDwarfLocDirective(FileNumber, LineNumber, ColumnPos,
> Flags,
>                                        Isa, Discriminator, StringRef());
> @@ -3136,31 +3131,23 @@ bool AsmParser::parseDirectiveStabs() {
>  /// parseDirectiveCVFile
>  /// ::= .cv_file number filename
>  bool AsmParser::parseDirectiveCVFile() {
> -  SMLoc FileNumberLoc = getLexer().getLoc();
> -  if (getLexer().isNot(AsmToken::Integer))
> -    return TokError("expected file number in '.cv_file' directive");
> -
> -  int64_t FileNumber = getTok().getIntVal();
> -  Lex();
> -
> -  if (FileNumber < 1)
> -    return TokError("file number less than one");
> -
> -  if (getLexer().isNot(AsmToken::String))
> -    return TokError("unexpected token in '.cv_file' directive");
> -
> -  // Usually the directory and filename together, otherwise just the
> directory.
> -  // Allow the strings to have escaped octal character sequence.
> +  SMLoc FileNumberLoc = getTok().getLoc();
> +  int64_t FileNumber;
>    std::string Filename;
> -  if (parseEscapedString(Filename))
> -    return true;
> -  Lex();
> -
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.cv_file' directive");
>
> -  if (getStreamer().EmitCVFileDirective(FileNumber, Filename) == 0)
> -    Error(FileNumberLoc, "file number already allocated");
> +  if (parseIntToken(FileNumber,
> +                    "expected file number in '.cv_file' directive") ||
> +      check(FileNumber < 1, FileNumberLoc, "file number less than one") ||
> +      check(getTok().isNot(AsmToken::String),
> +            "unexpected token in '.cv_file' directive") ||
> +      // Usually directory and filename are together, otherwise just
> +      // directory. Allow the strings to have escaped octal character
> sequence.
> +      parseEscapedString(Filename) ||
> +      parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.cv_file' directive") ||
> +      check(getStreamer().EmitCVFileDirective(FileNumber, Filename) == 0,
> +            FileNumberLoc, "file number already allocated"))
> +    return true;
>
>    return false;
>  }
> @@ -3173,20 +3160,19 @@ bool AsmParser::parseDirectiveCVFile() {
>  /// third number is a column position (zero if not specified).  The
> remaining
>  /// optional items are .loc sub-directives.
>  bool AsmParser::parseDirectiveCVLoc() {
> -  if (getLexer().isNot(AsmToken::Integer))
> -    return TokError("unexpected token in '.cv_loc' directive");
> -
> -  int64_t FunctionId = getTok().getIntVal();
> -  if (FunctionId < 0)
> -    return TokError("function id less than zero in '.cv_loc' directive");
> -  Lex();
> -
> -  int64_t FileNumber = getTok().getIntVal();
> -  if (FileNumber < 1)
> -    return TokError("file number less than one in '.cv_loc' directive");
> -  if (!getContext().isValidCVFileNumber(FileNumber))
> -    return TokError("unassigned file number in '.cv_loc' directive");
> -  Lex();
> +  SMLoc Loc;
> +  int64_t FunctionId, FileNumber;
> +  if (getTokenLoc(Loc) ||
> +      parseIntToken(FunctionId, "unexpected token in '.cv_loc'
> directive") ||
> +      check(FunctionId < 0, Loc,
> +            "function id less than zero in '.cv_loc' directive") ||
> +      getTokenLoc(Loc) ||
> +      parseIntToken(FileNumber, "expected integer in '.cv_loc'
> directive") ||
> +      check(FileNumber < 1, Loc,
> +            "file number less than one in '.cv_loc' directive") ||
> +      check(!getContext().isValidCVFileNumber(FileNumber), Loc,
> +            "unassigned file number in '.cv_loc' directive"))
> +    return true;
>
>    int64_t LineNumber = 0;
>    if (getLexer().is(AsmToken::Integer)) {
> @@ -3230,6 +3216,7 @@ bool AsmParser::parseDirectiveCVLoc() {
>        return Error(Loc, "unknown sub-directive in '.cv_loc' directive");
>      }
>    }
> +  Lex();
>
>    getStreamer().EmitCVLocDirective(FunctionId, FileNumber, LineNumber,
>                                     ColumnPos, PrologueEnd, IsStmt,
> StringRef());
> @@ -3239,28 +3226,22 @@ bool AsmParser::parseDirectiveCVLoc() {
>  /// parseDirectiveCVLinetable
>  /// ::= .cv_linetable FunctionId, FnStart, FnEnd
>  bool AsmParser::parseDirectiveCVLinetable() {
> -  int64_t FunctionId = getTok().getIntVal();
> -  if (FunctionId < 0)
> -    return TokError("function id less than zero in '.cv_linetable'
> directive");
> -  Lex();
> -
> -  if (Lexer.isNot(AsmToken::Comma))
> -    return TokError("unexpected token in '.cv_linetable' directive");
> -  Lex();
> -
> -  SMLoc Loc = getLexer().getLoc();
> -  StringRef FnStartName;
> -  if (parseIdentifier(FnStartName))
> -    return Error(Loc, "expected identifier in directive");
> -
> -  if (Lexer.isNot(AsmToken::Comma))
> -    return TokError("unexpected token in '.cv_linetable' directive");
> -  Lex();
> -
> -  Loc = getLexer().getLoc();
> -  StringRef FnEndName;
> -  if (parseIdentifier(FnEndName))
> -    return Error(Loc, "expected identifier in directive");
> +  int64_t FunctionId;
> +  StringRef FnStartName, FnEndName;
> +  SMLoc Loc = getTok().getLoc();
> +  if (parseIntToken(FunctionId,
> +                    "expected Integer in '.cv_linetable' directive") ||
> +      check(FunctionId < 0, Loc,
> +            "function id less than zero in '.cv_linetable' directive") ||
> +      parseToken(AsmToken::Comma,
> +                 "unexpected token in '.cv_linetable' directive") ||
> +      getTokenLoc(Loc) || check(parseIdentifier(FnStartName), Loc,
> +                                "expected identifier in directive") ||
> +      parseToken(AsmToken::Comma,
> +                 "unexpected token in '.cv_linetable' directive") ||
> +      getTokenLoc(Loc) || check(parseIdentifier(FnEndName), Loc,
> +                                "expected identifier in directive"))
> +    return true;
>
>    MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
>    MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);
> @@ -3273,35 +3254,31 @@ bool AsmParser::parseDirectiveCVLinetabl
>  /// ::= .cv_inline_linetable PrimaryFunctionId FileId LineNum FnStart
> FnEnd
>  ///          ("contains" SecondaryFunctionId+)?
>  bool AsmParser::parseDirectiveCVInlineLinetable() {
> -  int64_t PrimaryFunctionId = getTok().getIntVal();
> -  if (PrimaryFunctionId < 0)
> -    return TokError(
> -        "function id less than zero in '.cv_inline_linetable' directive");
> -  Lex();
> -
> -  int64_t SourceFileId = getTok().getIntVal();
> -  if (SourceFileId <= 0)
> -    return TokError(
> -        "File id less than zero in '.cv_inline_linetable' directive");
> -  Lex();
> -
> -  int64_t SourceLineNum = getTok().getIntVal();
> -  if (SourceLineNum < 0)
> -    return TokError(
> -        "Line number less than zero in '.cv_inline_linetable' directive");
> -  Lex();
> -
> -  SMLoc Loc = getLexer().getLoc();
> -  StringRef FnStartName;
> -  if (parseIdentifier(FnStartName))
> -    return Error(Loc, "expected identifier in directive");
> -  MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
> -
> -  Loc = getLexer().getLoc();
> -  StringRef FnEndName;
> -  if (parseIdentifier(FnEndName))
> -    return Error(Loc, "expected identifier in directive");
> -  MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);
> +  int64_t PrimaryFunctionId, SourceFileId, SourceLineNum;
> +  StringRef FnStartName, FnEndName;
> +  SMLoc Loc = getTok().getLoc();
> +  if (parseIntToken(
> +          PrimaryFunctionId,
> +          "expected PrimaryFunctionId in '.cv_inline_linetable'
> directive") ||
> +      check(PrimaryFunctionId < 0, Loc,
> +            "function id less than zero in '.cv_inline_linetable'
> directive") ||
> +      getTokenLoc(Loc) ||
> +      parseIntToken(
> +          SourceFileId,
> +          "expected SourceField in '.cv_inline_linetable' directive") ||
> +      check(SourceFileId <= 0, Loc,
> +            "File id less than zero in '.cv_inline_linetable' directive")
> ||
> +      getTokenLoc(Loc) ||
> +      parseIntToken(
> +          SourceLineNum,
> +          "expected SourceLineNum in '.cv_inline_linetable' directive") ||
> +      check(SourceLineNum < 0, Loc,
> +            "Line number less than zero in '.cv_inline_linetable'
> directive") ||
> +      getTokenLoc(Loc) || check(parseIdentifier(FnStartName), Loc,
> +                                "expected identifier in directive") ||
> +      getTokenLoc(Loc) || check(parseIdentifier(FnEndName), Loc,
> +                                "expected identifier in directive"))
> +    return true;
>
>    SmallVector<unsigned, 8> SecondaryFunctionIds;
>    if (getLexer().is(AsmToken::Identifier)) {
> @@ -3321,6 +3298,11 @@ bool AsmParser::parseDirectiveCVInlineLi
>      }
>    }
>
> +  if (parseToken(AsmToken::EndOfStatement, "Expected End of Statement"))
> +    return true;
> +
> +  MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
> +  MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);
>    getStreamer().EmitCVInlineLinetableDirective(PrimaryFunctionId,
> SourceFileId,
>                                                 SourceLineNum, FnStartSym,
>                                                 FnEndSym,
> SecondaryFunctionIds);
> @@ -3348,14 +3330,10 @@ bool AsmParser::parseDirectiveCVDefRange
>      Ranges.push_back({GapStartSym, GapEndSym});
>    }
>
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in directive");
> -  Lex();
> -
>    std::string FixedSizePortion;
> -  if (parseEscapedString(FixedSizePortion))
> +  if (parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +      parseEscapedString(FixedSizePortion))
>      return true;
> -  Lex();
>
>    getStreamer().EmitCVDefRangeDirective(Ranges, FixedSizePortion);
>    return false;
> @@ -3414,6 +3392,9 @@ bool AsmParser::parseDirectiveCFIStartPr
>      if (parseIdentifier(Simple) || Simple != "simple")
>        return TokError("unexpected token in .cfi_startproc directive");
>
> +  if (parseToken(AsmToken::EndOfStatement, "Expected end of statement"))
> +    return true;
> +
>    getStreamer().EmitCFIStartProc(!Simple.empty());
>    return false;
>  }
> @@ -3443,16 +3424,10 @@ bool AsmParser::parseRegisterOrRegisterN
>  /// parseDirectiveCFIDefCfa
>  /// ::= .cfi_def_cfa register,  offset
>  bool AsmParser::parseDirectiveCFIDefCfa(SMLoc DirectiveLoc) {
> -  int64_t Register = 0;
> -  if (parseRegisterOrRegisterNumber(Register, DirectiveLoc))
> -    return true;
> -
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in directive");
> -  Lex();
> -
> -  int64_t Offset = 0;
> -  if (parseAbsoluteExpression(Offset))
> +  int64_t Register = 0, Offset = 0;
> +  if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
> +      parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +      parseAbsoluteExpression(Offset))
>      return true;
>
>    getStreamer().EmitCFIDefCfa(Register, Offset);
> @@ -3473,16 +3448,10 @@ bool AsmParser::parseDirectiveCFIDefCfaO
>  /// parseDirectiveCFIRegister
>  /// ::= .cfi_register register, register
>  bool AsmParser::parseDirectiveCFIRegister(SMLoc DirectiveLoc) {
> -  int64_t Register1 = 0;
> -  if (parseRegisterOrRegisterNumber(Register1, DirectiveLoc))
> -    return true;
> -
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in directive");
> -  Lex();
> -
> -  int64_t Register2 = 0;
> -  if (parseRegisterOrRegisterNumber(Register2, DirectiveLoc))
> +  int64_t Register1 = 0, Register2 = 0;
> +  if (parseRegisterOrRegisterNumber(Register1, DirectiveLoc) ||
> +      parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +      parseRegisterOrRegisterNumber(Register2, DirectiveLoc))
>      return true;
>
>    getStreamer().EmitCFIRegister(Register1, Register2);
> @@ -3524,14 +3493,9 @@ bool AsmParser::parseDirectiveCFIOffset(
>    int64_t Register = 0;
>    int64_t Offset = 0;
>
> -  if (parseRegisterOrRegisterNumber(Register, DirectiveLoc))
> -    return true;
> -
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in directive");
> -  Lex();
> -
> -  if (parseAbsoluteExpression(Offset))
> +  if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
> +      parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +      parseAbsoluteExpression(Offset))
>      return true;
>
>    getStreamer().EmitCFIOffset(Register, Offset);
> @@ -3541,17 +3505,11 @@ bool AsmParser::parseDirectiveCFIOffset(
>  /// parseDirectiveCFIRelOffset
>  /// ::= .cfi_rel_offset register, offset
>  bool AsmParser::parseDirectiveCFIRelOffset(SMLoc DirectiveLoc) {
> -  int64_t Register = 0;
> -
> -  if (parseRegisterOrRegisterNumber(Register, DirectiveLoc))
> -    return true;
> +  int64_t Register = 0, Offset = 0;
>
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in directive");
> -  Lex();
> -
> -  int64_t Offset = 0;
> -  if (parseAbsoluteExpression(Offset))
> +  if (parseRegisterOrRegisterNumber(Register, DirectiveLoc) ||
> +      parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +      parseAbsoluteExpression(Offset))
>      return true;
>
>    getStreamer().EmitCFIRelOffset(Register, Offset);
> @@ -3591,16 +3549,11 @@ bool AsmParser::parseDirectiveCFIPersona
>    if (Encoding == dwarf::DW_EH_PE_omit)
>      return false;
>
> -  if (!isValidEncoding(Encoding))
> -    return TokError("unsupported encoding.");
> -
> -  if (getLexer().isNot(AsmToken::Comma))
> -    return TokError("unexpected token in directive");
> -  Lex();
> -
>    StringRef Name;
> -  if (parseIdentifier(Name))
> -    return TokError("expected identifier in directive");
> +  if (check(!isValidEncoding(Encoding), "unsupported encoding.") ||
> +      parseToken(AsmToken::Comma, "unexpected token in directive") ||
> +      check(parseIdentifier(Name), "expected identifier in directive"))
> +    return true;
>
>    MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
>
> @@ -3674,9 +3627,9 @@ bool AsmParser::parseDirectiveCFIEscape(
>  /// parseDirectiveCFISignalFrame
>  /// ::= .cfi_signal_frame
>  bool AsmParser::parseDirectiveCFISignalFrame() {
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return Error(getLexer().getLoc(),
> -                 "unexpected token in '.cfi_signal_frame'");
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.cfi_signal_frame'"))
> +    return true;
>
>    getStreamer().EmitCFISignalFrame();
>    return false;
> @@ -3698,9 +3651,9 @@ bool AsmParser::parseDirectiveCFIUndefin
>  /// ::= .macros_on
>  /// ::= .macros_off
>  bool AsmParser::parseDirectiveMacrosOnOff(StringRef Directive) {
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return Error(getLexer().getLoc(),
> -                 "unexpected token in '" + Directive + "' directive");
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '" + Directive + "' directive"))
> +    return true;
>
>    setMacrosEnabled(Directive == ".macros_on");
>    return false;
> @@ -3928,8 +3881,9 @@ void AsmParser::checkForBadMacro(SMLoc D
>  /// parseDirectiveExitMacro
>  /// ::= .exitm
>  bool AsmParser::parseDirectiveExitMacro(StringRef Directive) {
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '" + Directive + "' directive");
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '" + Directive + "' directive"))
> +    return true;
>
>    if (!isInsideMacroInstantiation())
>      return TokError("unexpected '" + Directive + "' in file, "
> @@ -3969,14 +3923,14 @@ bool AsmParser::parseDirectiveEndMacro(S
>  /// ::= .purgem
>  bool AsmParser::parseDirectivePurgeMacro(SMLoc DirectiveLoc) {
>    StringRef Name;
> -  if (parseIdentifier(Name))
> -    return TokError("expected identifier in '.purgem' directive");
> -
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.purgem' directive");
> -
> -  if (!lookupMacro(Name))
> -    return Error(DirectiveLoc, "macro '" + Name + "' is not defined");
> +  SMLoc Loc;
> +  if (getTokenLoc(Loc) || check(parseIdentifier(Name), Loc,
> +                                "expected identifier in '.purgem'
> directive") ||
> +      parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.purgem' directive") ||
> +      check(!lookupMacro(Name), DirectiveLoc,
> +            "macro '" + Name + "' is not defined"))
> +    return true;
>
>    undefineMacro(Name);
>    return false;
> @@ -3991,16 +3945,13 @@ bool AsmParser::parseDirectiveBundleAlig
>    // in the inclusive range 0-30.
>    SMLoc ExprLoc = getLexer().getLoc();
>    int64_t AlignSizePow2;
> -  if (parseAbsoluteExpression(AlignSizePow2))
> +  if (parseAbsoluteExpression(AlignSizePow2) ||
> +      parseToken(AsmToken::EndOfStatement, "unexpected token after
> expression "
> +                                           "in '.bundle_align_mode' "
> +                                           "directive") ||
> +      check(AlignSizePow2 < 0 || AlignSizePow2 > 30, ExprLoc,
> +            "invalid bundle alignment size (expected between 0 and 30)"))
>      return true;
> -  else if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token after expression in"
> -                    " '.bundle_align_mode' directive");
> -  else if (AlignSizePow2 < 0 || AlignSizePow2 > 30)
> -    return Error(ExprLoc,
> -                 "invalid bundle alignment size (expected between 0 and
> 30)");
> -
> -  Lex();
>
>    // Because of AlignSizePow2's verified range we can safely truncate it
> to
>    // unsigned.
> @@ -4020,14 +3971,11 @@ bool AsmParser::parseDirectiveBundleLock
>      const char *kInvalidOptionError =
>          "invalid option for '.bundle_lock' directive";
>
> -    if (parseIdentifier(Option))
> -      return Error(Loc, kInvalidOptionError);
> -
> -    if (Option != "align_to_end")
> -      return Error(Loc, kInvalidOptionError);
> -    else if (getLexer().isNot(AsmToken::EndOfStatement))
> -      return Error(Loc,
> -                   "unexpected token after '.bundle_lock' directive
> option");
> +    if (check(parseIdentifier(Option), Loc, kInvalidOptionError) ||
> +        check(Option != "align_to_end", Loc, kInvalidOptionError) ||
> +        check(getTok().isNot(AsmToken::EndOfStatement), Loc,
> +              "unexpected token after '.bundle_lock' directive option"))
> +      return true;
>      AlignToEnd = true;
>    }
>
> @@ -4042,9 +3990,9 @@ bool AsmParser::parseDirectiveBundleLock
>  bool AsmParser::parseDirectiveBundleUnlock() {
>    checkForValidSection();
>
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.bundle_unlock' directive");
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.bundle_unlock' directive"))
> +    return true;
>
>    getStreamer().EmitBundleUnlock();
>    return false;
> @@ -4062,18 +4010,16 @@ bool AsmParser::parseDirectiveSpace(Stri
>
>    int64_t FillExpr = 0;
>    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -    if (getLexer().isNot(AsmToken::Comma))
> -      return TokError("unexpected token in '" + Twine(IDVal) + "'
> directive");
> -    Lex();
>
> -    if (parseAbsoluteExpression(FillExpr))
> +    if (parseToken(AsmToken::Comma,
> +                   "unexpected token in '" + Twine(IDVal) + "'
> directive") ||
> +        parseAbsoluteExpression(FillExpr))
>        return true;
> -
> -    if (getLexer().isNot(AsmToken::EndOfStatement))
> -      return TokError("unexpected token in '" + Twine(IDVal) + "'
> directive");
>    }
>
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '" + Twine(IDVal) + "' directive"))
> +    return true;
>
>    // FIXME: Sometimes the fill expr is 'nop' if it isn't supplied,
> instead of 0.
>    getStreamer().emitFill(*NumBytes, FillExpr, NumBytesLoc);
> @@ -4099,10 +4045,10 @@ bool AsmParser::parseDirectiveLEB128(boo
>      if (getLexer().is(AsmToken::EndOfStatement))
>        break;
>
> -    if (getLexer().isNot(AsmToken::Comma))
> -      return TokError("unexpected token in directive");
> -    Lex();
> +    if (parseToken(AsmToken::Comma, "unexpected token in directive"))
> +      return true;
>    }
> +  Lex();
>
>    return false;
>  }
> @@ -4130,9 +4076,8 @@ bool AsmParser::parseDirectiveSymbolAttr
>        if (getLexer().is(AsmToken::EndOfStatement))
>          break;
>
> -      if (getLexer().isNot(AsmToken::Comma))
> -        return TokError("unexpected token in directive");
> -      Lex();
> +      if (parseToken(AsmToken::Comma, "unexpected token in directive"))
> +        return true;
>      }
>    }
>
> @@ -4221,10 +4166,9 @@ bool AsmParser::parseDirectiveAbort() {
>    SMLoc Loc = getLexer().getLoc();
>
>    StringRef Str = parseStringToEndOfStatement();
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.abort' directive");
> -
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.abort' directive"))
> +    return true;
>
>    if (Str.empty())
>      Error(Loc, ".abort detected. Assembly stopping.");
> @@ -4238,25 +4182,20 @@ bool AsmParser::parseDirectiveAbort() {
>  /// parseDirectiveInclude
>  ///  ::= .include "filename"
>  bool AsmParser::parseDirectiveInclude() {
> -  if (getLexer().isNot(AsmToken::String))
> -    return TokError("expected string in '.include' directive");
> -
>    // Allow the strings to have escaped octal character sequence.
>    std::string Filename;
> -  if (parseEscapedString(Filename))
> -    return true;
> -  SMLoc IncludeLoc = getLexer().getLoc();
> -  Lex();
> +  SMLoc IncludeLoc = getTok().getLoc();
>
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.include' directive");
> -
> -  // Attempt to switch the lexer to the included file before consuming
> the end
> -  // of statement to avoid losing it when we switch.
> -  if (enterIncludeFile(Filename)) {
> -    Error(IncludeLoc, "Could not find include file '" + Filename + "'");
> +  if (check(getTok().isNot(AsmToken::String),
> +            "expected string in '.include' directive") ||
> +      parseEscapedString(Filename) ||
> +      check(getTok().isNot(AsmToken::EndOfStatement),
> +            "unexpected token in '.include' directive") ||
> +      // Attempt to switch the lexer to the included file before
> consuming the
> +      // end of statement to avoid losing it when we switch.
> +      check(enterIncludeFile(Filename), IncludeLoc,
> +            "Could not find include file '" + Filename + "'"))
>      return true;
> -  }
>
>    return false;
>  }
> @@ -4264,25 +4203,18 @@ bool AsmParser::parseDirectiveInclude()
>  /// parseDirectiveIncbin
>  ///  ::= .incbin "filename"
>  bool AsmParser::parseDirectiveIncbin() {
> -  if (getLexer().isNot(AsmToken::String))
> -    return TokError("expected string in '.incbin' directive");
> -
>    // Allow the strings to have escaped octal character sequence.
>    std::string Filename;
> -  if (parseEscapedString(Filename))
> +  SMLoc IncbinLoc = getTok().getLoc();
> +  if (check(getTok().isNot(AsmToken::String),
> +            "expected string in '.incbin' directive") ||
> +      parseEscapedString(Filename) ||
> +      parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.incbin' directive") ||
> +      // Attempt to process the included file.
> +      check(processIncbinFile(Filename), IncbinLoc,
> +            "Could not find incbin file '" + Filename + "'"))
>      return true;
> -  SMLoc IncbinLoc = getLexer().getLoc();
> -  Lex();
> -
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.incbin' directive");
> -
> -  // Attempt to process the included file.
> -  if (processIncbinFile(Filename)) {
> -    Error(IncbinLoc, "Could not find incbin file '" + Filename + "'");
> -    return true;
> -  }
> -
>    return false;
>  }
>
> @@ -4295,14 +4227,11 @@ bool AsmParser::parseDirectiveIf(SMLoc D
>      eatToEndOfStatement();
>    } else {
>      int64_t ExprValue;
> -    if (parseAbsoluteExpression(ExprValue))
> +    if (parseAbsoluteExpression(ExprValue) ||
> +        parseToken(AsmToken::EndOfStatement,
> +                   "unexpected token in '.if' directive"))
>        return true;
>
> -    if (getLexer().isNot(AsmToken::EndOfStatement))
> -      return TokError("unexpected token in '.if' directive");
> -
> -    Lex();
> -
>      switch (DirKind) {
>      default:
>        llvm_unreachable("unsupported directive");
> @@ -4344,10 +4273,9 @@ bool AsmParser::parseDirectiveIfb(SMLoc
>    } else {
>      StringRef Str = parseStringToEndOfStatement();
>
> -    if (getLexer().isNot(AsmToken::EndOfStatement))
> -      return TokError("unexpected token in '.ifb' directive");
> -
> -    Lex();
> +    if (parseToken(AsmToken::EndOfStatement,
> +                   "unexpected token in '.ifb' directive"))
> +      return true;
>
>      TheCondState.CondMet = ExpectBlank == Str.empty();
>      TheCondState.Ignore = !TheCondState.CondMet;
> @@ -4368,17 +4296,14 @@ bool AsmParser::parseDirectiveIfc(SMLoc
>    } else {
>      StringRef Str1 = parseStringToComma();
>
> -    if (getLexer().isNot(AsmToken::Comma))
> -      return TokError("unexpected token in '.ifc' directive");
> -
> -    Lex();
> +    if (parseToken(AsmToken::Comma, "unexpected token in '.ifc'
> directive"))
> +      return true;
>
>      StringRef Str2 = parseStringToEndOfStatement();
>
> -    if (getLexer().isNot(AsmToken::EndOfStatement))
> -      return TokError("unexpected token in '.ifc' directive");
> -
> -    Lex();
> +    if (parseToken(AsmToken::EndOfStatement,
> +                   "unexpected token in '.ifc' directive"))
> +      return true;
>
>      TheCondState.CondMet = ExpectEqual == (Str1.trim() == Str2.trim());
>      TheCondState.Ignore = !TheCondState.CondMet;
> @@ -4443,10 +4368,9 @@ bool AsmParser::parseDirectiveIfdef(SMLo
>    if (TheCondState.Ignore) {
>      eatToEndOfStatement();
>    } else {
> -    if (parseIdentifier(Name))
> -      return TokError("expected identifier after '.ifdef'");
> -
> -    Lex();
> +    if (check(parseIdentifier(Name), "expected identifier after
> '.ifdef'") ||
> +        parseToken(AsmToken::EndOfStatement, "unexpected token in
> '.ifdef'"))
> +      return true;
>
>      MCSymbol *Sym = getContext().lookupSymbol(Name);
>
> @@ -4494,10 +4418,9 @@ bool AsmParser::parseDirectiveElseIf(SML
>  /// parseDirectiveElse
>  /// ::= .else
>  bool AsmParser::parseDirectiveElse(SMLoc DirectiveLoc) {
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.else' directive");
> -
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.else' directive"))
> +    return true;
>
>    if (TheCondState.TheCond != AsmCond::IfCond &&
>        TheCondState.TheCond != AsmCond::ElseIfCond)
> @@ -4518,10 +4441,9 @@ bool AsmParser::parseDirectiveElse(SMLoc
>  /// parseDirectiveEnd
>  /// ::= .end
>  bool AsmParser::parseDirectiveEnd(SMLoc DirectiveLoc) {
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.end' directive");
> -
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.end' directive"))
> +    return true;
>
>    while (Lexer.isNot(AsmToken::Eof))
>      Lex();
> @@ -4588,10 +4510,9 @@ bool AsmParser::parseDirectiveWarning(SM
>  /// parseDirectiveEndIf
>  /// ::= .endif
>  bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) {
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.endif' directive");
> -
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '.endif' directive"))
> +    return true;
>
>    if ((TheCondState.TheCond == AsmCond::NoCond) || TheCondStack.empty())
>      Error(DirectiveLoc, "Encountered a .endif that doesn't follow a .if
> or "
> @@ -4808,14 +4729,10 @@ bool AsmParser::parseDirectiveRept(SMLoc
>      return Error(CountLoc, "unexpected token in '" + Dir + "' directive");
>    }
>
> -  if (Count < 0)
> -    return Error(CountLoc, "Count is negative");
> -
> -  if (Lexer.isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '" + Dir + "' directive");
> -
> -  // Eat the end of statement.
> -  Lex();
> +  if (check(Count < 0, CountLoc, "Count is negative") ||
> +      parseToken(AsmToken::EndOfStatement,
> +                 "unexpected token in '" + Dir + "' directive"))
> +    return true;
>
>    // Lex the rept definition.
>    MCAsmMacro *M = parseMacroLikeBody(DirectiveLoc);
> @@ -4840,22 +4757,14 @@ bool AsmParser::parseDirectiveRept(SMLoc
>  /// ::= .irp symbol,values
>  bool AsmParser::parseDirectiveIrp(SMLoc DirectiveLoc) {
>    MCAsmMacroParameter Parameter;
> -
> -  if (parseIdentifier(Parameter.Name))
> -    return TokError("expected identifier in '.irp' directive");
> -
> -  if (Lexer.isNot(AsmToken::Comma))
> -    return TokError("expected comma in '.irp' directive");
> -
> -  Lex();
> -
>    MCAsmMacroArguments A;
> -  if (parseMacroArguments(nullptr, A))
> +  if (check(parseIdentifier(Parameter.Name),
> +            "expected identifier in '.irp' directive") ||
> +      parseToken(AsmToken::Comma, "expected comma in '.irp' directive") ||
> +      parseMacroArguments(nullptr, A) ||
> +      parseToken(AsmToken::EndOfStatement, "expected End of Statement"))
>      return true;
>
> -  // Eat the end of statement.
> -  Lex();
> -
>    // Lex the irp definition.
>    MCAsmMacro *M = parseMacroLikeBody(DirectiveLoc);
>    if (!M)
> @@ -4882,24 +4791,20 @@ bool AsmParser::parseDirectiveIrp(SMLoc
>  /// ::= .irpc symbol,values
>  bool AsmParser::parseDirectiveIrpc(SMLoc DirectiveLoc) {
>    MCAsmMacroParameter Parameter;
> -
> -  if (parseIdentifier(Parameter.Name))
> -    return TokError("expected identifier in '.irpc' directive");
> -
> -  if (Lexer.isNot(AsmToken::Comma))
> -    return TokError("expected comma in '.irpc' directive");
> -
> -  Lex();
> -
>    MCAsmMacroArguments A;
> -  if (parseMacroArguments(nullptr, A))
> +
> +  if (check(parseIdentifier(Parameter.Name),
> +            "expected identifier in '.irpc' directive") ||
> +      parseToken(AsmToken::Comma, "expected comma in '.irpc' directive")
> ||
> +      parseMacroArguments(nullptr, A))
>      return true;
>
>    if (A.size() != 1 || A.front().size() != 1)
>      return TokError("unexpected token in '.irpc' directive");
>
>    // Eat the end of statement.
> -  Lex();
> +  if (parseToken(AsmToken::EndOfStatement, "expected end of statement"))
> +    return true;
>
>    // Lex the irpc definition.
>    MCAsmMacro *M = parseMacroLikeBody(DirectiveLoc);
>
> Modified: llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp?rev=275795&r1=275794&r2=275795&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp Mon Jul 18 10:24:03 2016
> @@ -537,7 +537,6 @@ bool DarwinAsmParser::parseDirectiveLink
>
>      Args.push_back(Data);
>
> -    Lex();
>      if (getLexer().is(AsmToken::EndOfStatement))
>        break;
>
>
> Modified: llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp?rev=275795&r1=275794&r2=275795&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp Mon Jul 18 10:24:03 2016
> @@ -212,6 +212,7 @@ bool ELFAsmParser::ParseDirectiveSize(St
>
>    if (getLexer().isNot(AsmToken::EndOfStatement))
>      return TokError("unexpected token in directive");
> +  Lex();
>
>    getStreamer().emitELFSize(Sym, Expr);
>    return false;
> @@ -478,6 +479,7 @@ bool ELFAsmParser::ParseSectionArguments
>  EndStmt:
>    if (getLexer().isNot(AsmToken::EndOfStatement))
>      return TokError("unexpected token in directive");
> +  Lex();
>
>    unsigned Type = ELF::SHT_PROGBITS;
>
> @@ -629,6 +631,10 @@ bool ELFAsmParser::ParseDirectiveIdent(S
>
>    Lex();
>
> +  if (getLexer().isNot(AsmToken::EndOfStatement))
> +    return TokError("unexpected token in '.ident' directive");
> +  Lex();
> +
>    getStreamer().EmitIdent(Data);
>    return false;
>  }
> @@ -727,6 +733,8 @@ bool ELFAsmParser::ParseDirectiveSubsect
>    if (getLexer().isNot(AsmToken::EndOfStatement))
>      return TokError("unexpected token in directive");
>
> +  Lex();
> +
>    getStreamer().SubSection(Subsection);
>    return false;
>  }
>
> Modified: llvm/trunk/test/MC/AsmParser/preserve-comments.s
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/preserve-comments.s?rev=275795&r1=275794&r2=275795&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/MC/AsmParser/preserve-comments.s (original)
> +++ llvm/trunk/test/MC/AsmParser/preserve-comments.s Mon Jul 18 10:24:03
> 2016
> @@ -9,3 +9,5 @@ foo:    #Comment here
>         ## WHOLE LINE COMMENT
>         cmpl    $196, %eax      ## EOL COMMENT
>         #endif
> +       .ident  "clang version 3.9.0"
> +       .section        ".note.GNU-stack","", at progbits
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160718/98bf1361/attachment-0001.html>


More information about the llvm-commits mailing list