diff --git a/bindings/nodejs/consts/keystone.js b/bindings/nodejs/consts/keystone.js index 77b740e7a14917f39fad8a89463f23ca0f7b0b3f..3bd3f554a98479d559cde2f5b5f2a90d6b858a8f 100644 --- a/bindings/nodejs/consts/keystone.js +++ b/bindings/nodejs/consts/keystone.js @@ -69,6 +69,7 @@ module.exports.ERR_ASM_ESC_BACKSLASH = 152 module.exports.ERR_ASM_ESC_OCTAL = 153 module.exports.ERR_ASM_ESC_SEQUENCE = 154 module.exports.ERR_ASM_ESC_STR = 155 +module.exports.ERR_ASM_TOKEN_INVALID = 156 module.exports.ERR_ASM_INVALIDOPERAND = 512 module.exports.ERR_ASM_MISSINGFEATURE = 513 module.exports.ERR_ASM_MNEMONICFAIL = 514 diff --git a/bindings/python/keystone/keystone_const.py b/bindings/python/keystone/keystone_const.py index 886d0f9e8431e92948b9b3b92e85f89fd0b662e8..a737859ed6428c7b8b422bb98510177470ec012d 100644 --- a/bindings/python/keystone/keystone_const.py +++ b/bindings/python/keystone/keystone_const.py @@ -69,6 +69,7 @@ KS_ERR_ASM_ESC_BACKSLASH = 152 KS_ERR_ASM_ESC_OCTAL = 153 KS_ERR_ASM_ESC_SEQUENCE = 154 KS_ERR_ASM_ESC_STR = 155 +KS_ERR_ASM_TOKEN_INVALID = 156 KS_ERR_ASM_INVALIDOPERAND = 512 KS_ERR_ASM_MISSINGFEATURE = 513 KS_ERR_ASM_MNEMONICFAIL = 514 diff --git a/bindings/ruby/keystone_gem/lib/keystone/keystone_const.rb b/bindings/ruby/keystone_gem/lib/keystone/keystone_const.rb index ba356bb0b83bbe63ffe25e17bd87eb998626c48a..1d45192c213012a558813d966ca7be8eb8af024b 100644 --- a/bindings/ruby/keystone_gem/lib/keystone/keystone_const.rb +++ b/bindings/ruby/keystone_gem/lib/keystone/keystone_const.rb @@ -71,6 +71,7 @@ module Keystone KS_ERR_ASM_ESC_OCTAL = 153 KS_ERR_ASM_ESC_SEQUENCE = 154 KS_ERR_ASM_ESC_STR = 155 + KS_ERR_ASM_TOKEN_INVALID = 156 KS_ERR_ASM_INVALIDOPERAND = 512 KS_ERR_ASM_MISSINGFEATURE = 513 KS_ERR_ASM_MNEMONICFAIL = 514 diff --git a/include/keystone/keystone.h b/include/keystone/keystone.h index 82ce36a00402e186cbd42114803a43ee23dd2777..f9e5aff4bba8fc0079e015170cecd09c2af2e313 100644 --- a/include/keystone/keystone.h +++ b/include/keystone/keystone.h @@ -125,6 +125,7 @@ typedef enum ks_err { KS_ERR_ASM_ESC_OCTAL, // invalid octal escape sequence (out of range) KS_ERR_ASM_ESC_SEQUENCE, // invalid escape sequence (unrecognized character) KS_ERR_ASM_ESC_STR, // broken escape string + KS_ERR_ASM_TOKEN_INVALID, // invalid token // generic input assembly errors - architecture specific KS_ERR_ASM_INVALIDOPERAND = KS_ERR_ASM_ARCH, diff --git a/llvm/include/llvm/MC/MCParser/MCAsmLexer.h b/llvm/include/llvm/MC/MCParser/MCAsmLexer.h index ca2a88e20a767f683bf28292c15decdfa6154adf..96e2a53a1ff6ff11591eb2a21318b820583cef89 100644 --- a/llvm/include/llvm/MC/MCParser/MCAsmLexer.h +++ b/llvm/include/llvm/MC/MCParser/MCAsmLexer.h @@ -108,14 +108,24 @@ public: // FIXME: Don't compute this in advance, it makes every token larger, and is // also not generally what we want (it is nicer for recovery etc. to lex 123br // as a single token, then diagnose as an invalid number). - int64_t getIntVal() const { - assert(Kind == Integer && "This token isn't an integer!"); + int64_t getIntVal(bool &valid) const { + //assert(Kind == Integer && "This token isn't an integer!"); + if (Kind != Integer) { + valid = false; + return -1; + } + valid = true; return IntVal.getZExtValue(); } - APInt getAPIntVal() const { - assert((Kind == Integer || Kind == BigNum) && - "This token isn't an integer!"); + APInt getAPIntVal(bool &valid) const { + //assert((Kind == Integer || Kind == BigNum) && + // "This token isn't an integer!"); + if (Kind != Integer && Kind != BigNum) { + valid = false; + //return APInt(-1); + } + valid = true; return IntVal; } }; diff --git a/llvm/keystone/ks.cpp b/llvm/keystone/ks.cpp index 95d768e11efeacdd70bc95cc0210e8b87314a0a6..35c7527f2b33ab6dedaec00a39e75820b7eeb4bc 100644 --- a/llvm/keystone/ks.cpp +++ b/llvm/keystone/ks.cpp @@ -122,6 +122,8 @@ const char *ks_strerror(ks_err code) return "Invalid escape sequence (KS_ERR_ASM_ESC_SEQUENCE)"; case KS_ERR_ASM_ESC_STR: // broken escape string return "Invalid escape string (KS_ERR_ASM_ESC_STR)"; + case KS_ERR_ASM_TOKEN_INVALID: // invalid token from input assembly + return "Invalid input token (KS_ERR_ASM_TOKEN_INVALID)"; } } diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp index 36c192026856a6dadf685cdcea336c8fd9ef2f5a..bb29d52b0c816593c4aebf1822b55f1383a49288 100644 --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -10,7 +10,7 @@ // This class implements the lexer for assembly files. // //===----------------------------------------------------------------------===// - +// #include "llvm/MC/MCParser/AsmLexer.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/Support/MemoryBuffer.h" @@ -43,8 +43,9 @@ void AsmLexer::setBuffer(StringRef Buf, const char *ptr) { /// ReturnError - Set the error to the specified string at the specified /// location. This is defined to always return AsmToken::Error. -AsmToken AsmLexer::ReturnError(const char *Loc, const std::string &Msg) { - SetError(SMLoc::getFromPointer(Loc), Msg); +AsmToken AsmLexer::ReturnError(const char *Loc, const std::string &Msg) +{ + //SetError(SMLoc::getFromPointer(Loc), Msg); return AsmToken(AsmToken::Error, StringRef(Loc, 0)); } @@ -97,7 +98,8 @@ AsmToken AsmLexer::LexFloatLiteral() { /// /// The leading "0x[0-9a-fA-F]*" (i.e. integer part) has already been consumed /// before we get here. -AsmToken AsmLexer::LexHexFloatLiteral(bool NoIntDigits) { +AsmToken AsmLexer::LexHexFloatLiteral(bool NoIntDigits) +{ assert((*CurPtr == 'p' || *CurPtr == 'P' || *CurPtr == '.') && "unexpected parse state in floating hex"); bool NoFracDigits = true; @@ -166,7 +168,8 @@ AsmToken AsmLexer::LexIdentifier() { /// LexSlash: Slash: / /// C-Style Comment: /* ... */ -AsmToken AsmLexer::LexSlash() { +AsmToken AsmLexer::LexSlash() +{ switch (*CurPtr) { case '*': break; // C style comment. case '/': return ++CurPtr, LexLineComment(); @@ -251,7 +254,8 @@ static AsmToken intToken(StringRef Ref, APInt &Value) /// Octal integer: 0[0-7]+ /// Hex integer: 0x[0-9a-fA-F]+ or [0x]?[0-9][0-9a-fA-F]*[hH] /// Decimal integer: [1-9][0-9]* -AsmToken AsmLexer::LexDigit() { +AsmToken AsmLexer::LexDigit() +{ // Decimal integer: [1-9][0-9]* if (CurPtr[-1] != '0' || CurPtr[0] == '.') { unsigned Radix = doLookAhead(CurPtr, 10); @@ -360,7 +364,8 @@ AsmToken AsmLexer::LexDigit() { } /// LexSingleQuote: Integer: 'b' -AsmToken AsmLexer::LexSingleQuote() { +AsmToken AsmLexer::LexSingleQuote() +{ int CurChar = getNextChar(); if (CurChar == '\\') @@ -396,7 +401,8 @@ AsmToken AsmLexer::LexSingleQuote() { /// LexQuote: String: "..." -AsmToken AsmLexer::LexQuote() { +AsmToken AsmLexer::LexQuote() +{ int CurChar = getNextChar(); // TODO: does gas allow multiline string constants? while (CurChar != '"') { @@ -437,7 +443,8 @@ StringRef AsmLexer::LexUntilEndOfLine() { } size_t AsmLexer::peekTokens(MutableArrayRef<AsmToken> Buf, - bool ShouldSkipSpace) { + bool ShouldSkipSpace) +{ const char *SavedTokStart = TokStart; const char *SavedCurPtr = CurPtr; bool SavedAtStartOfLine = isAtStartOfLine; @@ -486,7 +493,8 @@ bool AsmLexer::isAtStatementSeparator(const char *Ptr) { strlen(MAI.getSeparatorString())) == 0; } -AsmToken AsmLexer::LexToken() { +AsmToken AsmLexer::LexToken() +{ TokStart = CurPtr; // This always consumes at least one character. int CurChar = getNextChar(); diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 0bb61ec860bce2ab061ce9d01c48f1df2c2f8820..c08153420bc39ed022754e1b6bcc60eee8bce83f 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -658,12 +658,12 @@ const AsmToken &AsmParser::Lex() { SMLoc ParentIncludeLoc = SrcMgr.getParentIncludeLoc(CurBuffer); if (ParentIncludeLoc != SMLoc()) { jumpToLoc(ParentIncludeLoc); - tok = &Lexer.Lex(); + tok = &Lexer.Lex(); // qq } } - if (tok->is(AsmToken::Error)) - Error(Lexer.getErrLoc(), Lexer.getErr()); + //if (tok->is(AsmToken::Error)) + // Error(Lexer.getErrLoc(), Lexer.getErr()); return *tok; } @@ -679,6 +679,10 @@ size_t AsmParser::Run(bool NoInitialTextSection, uint64_t Address, bool NoFinali // Prime the lexer. Lex(); + if (!Lexer.isNot(AsmToken::Error)) { + KsError = KS_ERR_ASM_TOKEN_INVALID; + return 0; + } HadError = false; AsmCond StartingCondState = TheCondState; @@ -955,7 +959,11 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) return true; case AsmToken::Integer: { //SMLoc Loc = getTok().getLoc(); - int64_t IntVal = getTok().getIntVal(); + bool valid; + int64_t IntVal = getTok().getIntVal(valid); + if (!valid) { + return true; + } Res = MCConstantExpr::create(IntVal, getContext()); EndLoc = Lexer.getTok().getEndLoc(); Lex(); // Eat token. @@ -1431,7 +1439,11 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // Allow an integer followed by a ':' as a directional local label. if (Lexer.is(AsmToken::Integer)) { - LocalLabelVal = getTok().getIntVal(); + bool valid; + LocalLabelVal = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (LocalLabelVal < 0) { if (!TheCondState.Ignore) { // return TokError("unexpected token at start of statement"); @@ -1986,7 +1998,11 @@ bool AsmParser::parseCppHashLineFilenameComment(SMLoc L) { return false; } - int64_t LineNumber = getTok().getIntVal(); + bool valid; + int64_t LineNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } Lex(); if (getLexer().isNot(AsmToken::String)) { @@ -2179,7 +2195,6 @@ bool AsmParser::expandMacro(raw_svector_ostream &OS, StringRef Body, bool valid; OS << Token.getStringContents(valid); if (!valid) { - KsError = KS_ERR_ASM_MACRO_STR; return true; } } @@ -2586,7 +2601,6 @@ bool AsmParser::parseEscapedString(std::string &Data) bool valid; StringRef Str = getTok().getStringContents(valid); if (!valid) { - KsError = KS_ERR_ASM_ESC_STR; return true; } @@ -2817,7 +2831,10 @@ bool AsmParser::parseDirectiveOctaValue(unsigned int &KsError) } // SMLoc ExprLoc = getLexer().getLoc(); - APInt IntValue = getTok().getAPIntVal(); + bool valid; + APInt IntValue = getTok().getAPIntVal(valid); + if (!valid) + return true; Lex(); uint64_t hi, lo; @@ -3201,7 +3218,11 @@ bool AsmParser::parseDirectiveFile(SMLoc DirectiveLoc) int64_t FileNumber = -1; //SMLoc FileNumberLoc = getLexer().getLoc(); if (getLexer().is(AsmToken::Integer)) { - FileNumber = getTok().getIntVal(); + bool valid; + FileNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } Lex(); if (FileNumber < 1) @@ -3267,7 +3288,11 @@ bool AsmParser::parseDirectiveLine() //return TokError("unexpected token in '.line' directive"); return true; - int64_t LineNumber = getTok().getIntVal(); + bool valid; + int64_t LineNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } (void)LineNumber; Lex(); @@ -3293,7 +3318,11 @@ bool AsmParser::parseDirectiveLoc() if (getLexer().isNot(AsmToken::Integer)) //return TokError("unexpected token in '.loc' directive"); return true; - int64_t FileNumber = getTok().getIntVal(); + bool valid; + int64_t FileNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (FileNumber < 1) //return TokError("file number less than one in '.loc' directive"); return true; @@ -3304,7 +3333,11 @@ bool AsmParser::parseDirectiveLoc() int64_t LineNumber = 0; if (getLexer().is(AsmToken::Integer)) { - LineNumber = getTok().getIntVal(); + bool valid; + LineNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (LineNumber < 0) //return TokError("line number less than zero in '.loc' directive"); return true; @@ -3313,7 +3346,11 @@ bool AsmParser::parseDirectiveLoc() int64_t ColumnPos = 0; if (getLexer().is(AsmToken::Integer)) { - ColumnPos = getTok().getIntVal(); + bool valid; + ColumnPos = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (ColumnPos < 0) //return TokError("column position less than zero in '.loc' directive"); return true; @@ -3411,7 +3448,11 @@ bool AsmParser::parseDirectiveCVFile() //return TokError("expected file number in '.cv_file' directive"); return true; - int64_t FileNumber = getTok().getIntVal(); + bool valid; + int64_t FileNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } Lex(); if (FileNumber < 1) @@ -3453,13 +3494,20 @@ bool AsmParser::parseDirectiveCVLoc() //return TokError("unexpected token in '.cv_loc' directive"); return true; - int64_t FunctionId = getTok().getIntVal(); + bool valid; + int64_t FunctionId = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (FunctionId < 0) //return TokError("function id less than zero in '.cv_loc' directive"); return true; Lex(); - int64_t FileNumber = getTok().getIntVal(); + int64_t FileNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (FileNumber < 1) //return TokError("file number less than one in '.cv_loc' directive"); return true; @@ -3470,7 +3518,10 @@ bool AsmParser::parseDirectiveCVLoc() int64_t LineNumber = 0; if (getLexer().is(AsmToken::Integer)) { - LineNumber = getTok().getIntVal(); + LineNumber = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (LineNumber < 0) //return TokError("line number less than zero in '.cv_loc' directive"); return true; @@ -3479,7 +3530,10 @@ bool AsmParser::parseDirectiveCVLoc() int64_t ColumnPos = 0; if (getLexer().is(AsmToken::Integer)) { - ColumnPos = getTok().getIntVal(); + ColumnPos = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (ColumnPos < 0) //return TokError("column position less than zero in '.cv_loc' directive"); return true; @@ -3523,8 +3577,13 @@ bool AsmParser::parseDirectiveCVLoc() /// parseDirectiveCVLinetable /// ::= .cv_linetable FunctionId, FnStart, FnEnd -bool AsmParser::parseDirectiveCVLinetable() { - int64_t FunctionId = getTok().getIntVal(); +bool AsmParser::parseDirectiveCVLinetable() +{ + bool valid; + int64_t FunctionId = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (FunctionId < 0) //return TokError("function id less than zero in '.cv_linetable' directive"); return true; @@ -3564,21 +3623,31 @@ bool AsmParser::parseDirectiveCVLinetable() { /// ("contains" SecondaryFunctionId+)? bool AsmParser::parseDirectiveCVInlineLinetable() { - int64_t PrimaryFunctionId = getTok().getIntVal(); + bool valid; + int64_t PrimaryFunctionId = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (PrimaryFunctionId < 0) //return TokError( // "function id less than zero in '.cv_inline_linetable' directive"); return true; Lex(); - int64_t SourceFileId = getTok().getIntVal(); + int64_t SourceFileId = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (SourceFileId <= 0) //return TokError( // "File id less than zero in '.cv_inline_linetable' directive"); return true; Lex(); - int64_t SourceLineNum = getTok().getIntVal(); + int64_t SourceLineNum = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (SourceLineNum < 0) //return TokError( // "Line number less than zero in '.cv_inline_linetable' directive"); @@ -3594,7 +3663,10 @@ bool AsmParser::parseDirectiveCVInlineLinetable() Lex(); while (getLexer().isNot(AsmToken::EndOfStatement)) { - int64_t SecondaryFunctionId = getTok().getIntVal(); + int64_t SecondaryFunctionId = getTok().getIntVal(valid); + if (!valid) { + return true; + } if (SecondaryFunctionId < 0) //return TokError( // "function id less than zero in '.cv_inline_linetable' directive"); @@ -4727,7 +4799,6 @@ bool AsmParser::parseDirectiveIfeqs(SMLoc DirectiveLoc, bool ExpectEqual) bool valid; StringRef String1 = getTok().getStringContents(valid); if (!valid) { - KsError = KS_ERR_ASM_DIRECTIVE_STR; return true; } @@ -4755,7 +4826,6 @@ bool AsmParser::parseDirectiveIfeqs(SMLoc DirectiveLoc, bool ExpectEqual) StringRef String2 = getTok().getStringContents(valid); if (!valid) { - KsError = KS_ERR_ASM_ESC_BACKSLASH; return true; } @@ -4901,7 +4971,6 @@ bool AsmParser::parseDirectiveError(SMLoc L, bool WithMessage) bool valid; Message = getTok().getStringContents(valid); if (!valid) { - KsError = KS_ERR_ASM_DIRECTIVE_STR; return true; } Lex(); @@ -4933,7 +5002,6 @@ bool AsmParser::parseDirectiveWarning(SMLoc L) bool valid; Message = getTok().getStringContents(valid); if (!valid) { - KsError = KS_ERR_ASM_DIRECTIVE_STR; return true; } Lex(); diff --git a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp index 73e068a34391107b44f0625a24d635683ad66145..76e1b7d4bbbe8332eefebf936b32eced7667b54d 100644 --- a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp +++ b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp @@ -907,7 +907,8 @@ bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc) { // Get the major version number. if (getLexer().isNot(AsmToken::Integer)) return TokError("invalid OS major version number"); - Major = getLexer().getTok().getIntVal(); + bool valid; + Major = getLexer().getTok().getIntVal(valid); if (Major > 65535 || Major <= 0) return TokError("invalid OS major version number"); Lex(); @@ -917,7 +918,7 @@ bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc) { // Get the minor version number. if (getLexer().isNot(AsmToken::Integer)) return TokError("invalid OS minor version number"); - Minor = getLexer().getTok().getIntVal(); + Minor = getLexer().getTok().getIntVal(valid); if (Minor > 255 || Minor < 0) return TokError("invalid OS minor version number"); Lex(); @@ -928,7 +929,7 @@ bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc) { Lex(); if (getLexer().isNot(AsmToken::Integer)) return TokError("invalid OS update number"); - Update = getLexer().getTok().getIntVal(); + Update = getLexer().getTok().getIntVal(valid); if (Update > 255 || Update < 0) return TokError("invalid OS update number"); Lex(); diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index 6a6edf66eecca357246107ff51871584092784c4..93ddcc9c7bf080caccfe8db4a2c65c31f7991e12 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -2260,7 +2260,10 @@ AArch64AsmParser::tryParseFPImm(OperandVector &Operands) { if (Tok.is(AsmToken::Integer)) { int64_t Val; if (!isNegative && Tok.getString().startswith("0x")) { - Val = Tok.getIntVal(); + bool valid; + Val = Tok.getIntVal(valid); + if (!valid) + return MatchOperand_ParseFail; if (Val > 255 || Val < 0) { //TokError("encoded floating point value out of range"); return MatchOperand_ParseFail; @@ -2337,7 +2340,10 @@ AArch64AsmParser::tryParseAddSubImm(OperandVector &Operands) { return MatchOperand_ParseFail; } - int64_t ShiftAmount = Parser.getTok().getIntVal(); + bool valid; + int64_t ShiftAmount = Parser.getTok().getIntVal(valid); + if (!valid) + return MatchOperand_ParseFail; if (ShiftAmount < 0) { //Error(Parser.getTok().getLoc(), "positive shift amount required"); @@ -2932,7 +2938,10 @@ bool AArch64AsmParser::parseRegister(OperandVector &Operands) const AsmToken &Tok = Parser.getTok(); if (Tok.is(AsmToken::Integer)) { SMLoc IntS = getLoc(); - int64_t Val = Tok.getIntVal(); + bool valid; + int64_t Val = Tok.getIntVal(valid); + if (!valid) + return MatchOperand_ParseFail; if (Val == 1) { Parser.Lex(); if (getLexer().getKind() == AsmToken::RBrac) { @@ -4481,7 +4490,10 @@ bool AArch64AsmParser::parseDirectiveLOH(StringRef IDVal, SMLoc Loc) return true; // We successfully get a numeric value for the identifier. // Check if it is valid. - int64_t Id = getParser().getTok().getIntVal(); + bool valid; + int64_t Id = getParser().getTok().getIntVal(valid); + if (!valid) + return MatchOperand_ParseFail; if (Id <= -1U && !isValidMCLOHType(Id)) //return TokError("invalid numeric identifier in directive"); return true; diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 750ccc71e446036ff9aea2c55b9a5caa890b581e..f7e4931d5653c07061f63bcdd19888862e61cc53 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -5191,7 +5191,10 @@ ARMAsmParser::parseFPImm(OperandVector &Operands, unsigned int &ErrorCode) { // Also handle plain integers. Instructions which allow floating point // immediates also allow a raw encoded 8-bit value. if (Tok.is(AsmToken::Integer) && isFconst) { - int64_t Val = Tok.getIntVal(); + bool valid; + int64_t Val = Tok.getIntVal(valid); + if (!valid) + return MatchOperand_ParseFail; Parser.Lex(); // Eat the token. if (Val > 255 || Val < 0) { //Error(Loc, "encoded floating point value out of range"); @@ -9213,7 +9216,10 @@ bool ARMAsmParser::parseDirectiveCode(SMLoc L) { //Error(L, "unexpected token in .code directive"); return false; } - int64_t Val = Parser.getTok().getIntVal(); + bool valid; + int64_t Val = Parser.getTok().getIntVal(valid); + if (!valid) + return false; if (Val != 16 && Val != 32) { //Error(L, "invalid operand to .code directive"); return false; diff --git a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp index eeb9ff191fe18f35a8b0751266130763ad930181..5a5cb7318bdc7b45acf1dd6b239287392d4abdbc 100644 --- a/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ b/llvm/lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -4489,7 +4489,8 @@ MipsAsmParser::matchAnyRegisterNameWithoutDollar(OperandVector &Operands, } MipsAsmParser::OperandMatchResultTy -MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) { +MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) +{ MCAsmParser &Parser = getParser(); auto Token = Parser.getLexer().peekTok(false); @@ -4501,8 +4502,12 @@ MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) { return ResTy; } else if (Token.is(AsmToken::Integer)) { DEBUG(dbgs() << ".. integer\n"); + bool valid; + unsigned Value = Token.getIntVal(valid); + if (!valid) + return MatchOperand_NoMatch; Operands.push_back(MipsOperand::createNumericReg( - Token.getIntVal(), getContext().getRegisterInfo(), S, Token.getLoc(), + Value, getContext().getRegisterInfo(), S, Token.getLoc(), *this)); return MatchOperand_Success; } @@ -4985,7 +4990,8 @@ bool MipsAsmParser::parseSetNoAtDirective() { return false; } -bool MipsAsmParser::parseSetAtDirective() { +bool MipsAsmParser::parseSetAtDirective() +{ // Line can be: ".set at", which sets $at to $1 // or ".set at=$reg", which sets $at to $reg. MCAsmParser &Parser = getParser(); @@ -5023,7 +5029,10 @@ bool MipsAsmParser::parseSetAtDirective() { if (Reg.is(AsmToken::Identifier)) { AtRegNo = matchCPURegisterName(Reg.getIdentifier()); } else if (Reg.is(AsmToken::Integer)) { - AtRegNo = Reg.getIntVal(); + bool valid; + AtRegNo = Reg.getIntVal(valid); + if (!valid) + return true; } else { reportParseError("unexpected token, expected identifier or integer"); return false; @@ -6024,7 +6033,8 @@ bool MipsAsmParser::parseDirectiveModuleFP() { } bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, - StringRef Directive) { + StringRef Directive) +{ MCAsmParser &Parser = getParser(); MCAsmLexer &Lexer = getLexer(); bool ModuleLevelOptions = Directive == ".module"; @@ -6055,7 +6065,10 @@ bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, } if (Lexer.is(AsmToken::Integer)) { - unsigned Value = Parser.getTok().getIntVal(); + bool valid; + unsigned Value = Parser.getTok().getIntVal(valid); + if (!valid) + return true; Parser.Lex(); if (Value != 32 && Value != 64) { diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index 243f9e1de81ac00a0c08ae32bfe122e60e21699e..d38a1d7e8eda74ed035ed5b4d5ffbd35d0b5433d 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -995,7 +995,11 @@ bool X86AsmParser::ParseRegister(unsigned &RegNo, if (IntTok.isNot(AsmToken::Integer)) //return Error(IntTok.getLoc(), "expected stack index"); return true; - switch (IntTok.getIntVal()) { + bool valid; + unsigned r = IntTok.getIntVal(valid); + if (!valid) + return true; + switch (r) { case 0: RegNo = X86::ST0; break; case 1: RegNo = X86::ST1; break; case 2: RegNo = X86::ST2; break; @@ -1422,7 +1426,10 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) InstInfo->AsmRewrites->emplace_back(AOK_ImmPrefix, Tok.getLoc()); // Look for 'b' or 'f' following an Integer as a directional label //SMLoc Loc = getTok().getLoc(); - int64_t IntVal = getTok().getIntVal(); + bool valid; + int64_t IntVal = getTok().getIntVal(valid); + if (!valid) + return true; End = consumeToken(); UpdateLocLex = false; if (getLexer().getKind() == AsmToken::Identifier) { @@ -1630,7 +1637,10 @@ X86AsmParser::ParseIntelSegmentOverride(unsigned SegReg, SMLoc Start, int64_t ImmDisp = 0; if (getLexer().is(AsmToken::Integer)) { - ImmDisp = Tok.getIntVal(); + bool valid; + ImmDisp = Tok.getIntVal(valid); + if (!valid) + return nullptr; AsmToken ImmDispToken = Parser.Lex(); // Eat the integer. if (isParsingInlineAsm()) @@ -2044,7 +2054,8 @@ bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands, // Distinguish {1to<NUM>} from {%k<NUM>}. if(getLexer().is(AsmToken::Integer)) { // Parse memory broadcasting ({1to<NUM>}). - if (getLexer().getTok().getIntVal() != 1) + bool valid; + if (getLexer().getTok().getIntVal(valid) != 1) //return !ErrorAndEatStatement(getLexer().getLoc(), // "Expected 1to<NUM> at this point"); return false;