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

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 18 11:47:09 PDT 2016


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


Please.

-eric


>
>
>> +    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
>>
> _______________________________________________
> 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/ad3a9260/attachment.html>


More information about the llvm-commits mailing list