[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