[llvm] r316168 - [RISCV] RISCVAsmParser: early exit if RISCVOperand isn't immediate as expected

Alex Bradbury via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 19 09:22:51 PDT 2017


Author: asb
Date: Thu Oct 19 09:22:51 2017
New Revision: 316168

URL: http://llvm.org/viewvc/llvm-project?rev=316168&view=rev
Log:
[RISCV] RISCVAsmParser: early exit if RISCVOperand isn't immediate as expected

This is necessary to avoid an assertion in the included test case and similar 
assembler inputs.

Modified:
    llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
    llvm/trunk/test/MC/RISCV/rv32i-invalid.s

Modified: llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp?rev=316168&r1=316167&r2=316168&view=diff
==============================================================================
--- llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp Thu Oct 19 09:22:51 2017
@@ -146,6 +146,8 @@ public:
   template <int N> bool isBareSimmNLsb0() const {
     int64_t Imm;
     RISCVMCExpr::VariantKind VK;
+    if (!isImm())
+      return false;
     bool IsConstantImm = evaluateConstantImm(Imm, VK);
     bool IsValid;
     if (!IsConstantImm)
@@ -185,6 +187,8 @@ public:
   bool isUImm5() const {
     int64_t Imm;
     RISCVMCExpr::VariantKind VK;
+    if (!isImm())
+      return false;
     bool IsConstantImm = evaluateConstantImm(Imm, VK);
     return IsConstantImm && isUInt<5>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
   }
@@ -193,6 +197,8 @@ public:
     RISCVMCExpr::VariantKind VK;
     int64_t Imm;
     bool IsValid;
+    if (!isImm())
+      return false;
     bool IsConstantImm = evaluateConstantImm(Imm, VK);
     if (!IsConstantImm)
       IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm);
@@ -205,6 +211,8 @@ public:
   bool isUImm12() const {
     int64_t Imm;
     RISCVMCExpr::VariantKind VK;
+    if (!isImm())
+      return false;
     bool IsConstantImm = evaluateConstantImm(Imm, VK);
     return IsConstantImm && isUInt<12>(Imm) && VK == RISCVMCExpr::VK_RISCV_None;
   }
@@ -215,6 +223,8 @@ public:
     RISCVMCExpr::VariantKind VK;
     int64_t Imm;
     bool IsValid;
+    if (!isImm())
+      return false;
     bool IsConstantImm = evaluateConstantImm(Imm, VK);
     if (!IsConstantImm)
       IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK, Imm);

Modified: llvm/trunk/test/MC/RISCV/rv32i-invalid.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/RISCV/rv32i-invalid.s?rev=316168&r1=316167&r2=316168&view=diff
==============================================================================
--- llvm/trunk/test/MC/RISCV/rv32i-invalid.s (original)
+++ llvm/trunk/test/MC/RISCV/rv32i-invalid.s Thu Oct 19 09:22:51 2017
@@ -122,6 +122,9 @@ sub t0, t2, 1 # CHECK: :[[@LINE]]:13: er
 add ra, zero, zero, zero # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
 sltiu s2, s3, 0x50, 0x60 # CHECK: :[[@LINE]]:21: error: invalid operand for instruction
 
+# Memory operand not formatted correctly
+lw a4, a5, 111 # CHECK: :[[@LINE]]:8: error: immediate must be an integer in the range [-2048, 2047]
+
 # Too few operands
 ori a0, a1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction
 xor s2, s2 # CHECK: :[[@LINE]]:1: error: too few operands for instruction




More information about the llvm-commits mailing list