Index: lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp =================================================================== --- lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -322,6 +322,8 @@ } bool isSImm6() const { + if (!isImm()) + return false; RISCVMCExpr::VariantKind VK; int64_t Imm; bool IsValid; @@ -335,6 +337,8 @@ } bool isSImm6NonZero() const { + if (!isImm()) + return false; RISCVMCExpr::VariantKind VK; int64_t Imm; bool IsValid; @@ -348,6 +352,8 @@ } bool isCLUIImm() const { + if (!isImm()) + return false; int64_t Imm; RISCVMCExpr::VariantKind VK; bool IsConstantImm = evaluateConstantImm(Imm, VK); @@ -357,6 +363,8 @@ } bool isUImm7Lsb00() const { + if (!isImm()) + return false; int64_t Imm; RISCVMCExpr::VariantKind VK; bool IsConstantImm = evaluateConstantImm(Imm, VK); @@ -365,6 +373,8 @@ } bool isUImm8Lsb00() const { + if (!isImm()) + return false; int64_t Imm; RISCVMCExpr::VariantKind VK; bool IsConstantImm = evaluateConstantImm(Imm, VK); @@ -373,6 +383,8 @@ } bool isUImm8Lsb000() const { + if (!isImm()) + return false; int64_t Imm; RISCVMCExpr::VariantKind VK; bool IsConstantImm = evaluateConstantImm(Imm, VK); @@ -383,6 +395,8 @@ bool isSImm9Lsb0() const { return isBareSimmNLsb0<9>(); } bool isUImm9Lsb000() const { + if (!isImm()) + return false; int64_t Imm; RISCVMCExpr::VariantKind VK; bool IsConstantImm = evaluateConstantImm(Imm, VK); Index: test/MC/RISCV/rv32c-fuzzed-invalid.s =================================================================== --- /dev/null +++ test/MC/RISCV/rv32c-fuzzed-invalid.s @@ -0,0 +1,14 @@ +# REQUIRES: asserts +# RUN: not llvm-mc -triple riscv32 -mattr=+c,+f,+d < %s 2>&1 | FileCheck %s +# +# Fuzzed test cases produced by a LLVM MC Assembler +# Protocol Buffer Fuzzer for the RISC-V assembly language. +# +c.addi x13,f30,0 # CHECK: error: immediate must be non-zero in the range [-32, 31] +c.swsp x0,(f14) # CHECK: error: immediate must be a multiple of 4 bytes in the range [0, 252] +c.lui x4,x0 # CHECK: error: immediate must be in [0xfffe0, 0xfffff] or [1, 31] + +c.fsdsp f9,x0,0 # CHECK: error: immediate must be a multiple of 8 bytes in the range [0, 504] +c.flw f15,x14,x0 # CHECK: error: immediate must be a multiple of 4 bytes in the range [0, 124] +c.fld f8,f30,x17 # CHECK: error: immediate must be a multiple of 8 bytes in the range [0, 248] +c.li x6,x6,x0,x0 # CHECK: error: immediate must be an integer in the range [-32, 31]