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;