[llvm] r341691 - [RISCV] Fix crash in decoding instruction with unknown floating point rounding mode

Ana Pazos via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 7 11:43:43 PDT 2018


Author: apazos
Date: Fri Sep  7 11:43:43 2018
New Revision: 341691

URL: http://llvm.org/viewvc/llvm-project?rev=341691&view=rev
Log:
[RISCV] Fix crash in decoding instruction with unknown floating point rounding mode

Summary:
Instead of crashing in printFRMArg, decode and warn about invalid instruction.

This bug was uncovered by a LLVM MC Disassembler Protocol Buffer Fuzzer
for the RISC-V assembly language.

Reviewers: asb

Reviewed By: asb

Subscribers: rbar, johnrusso, simoncook, sabuasal, niosHD, kito-cheng, shiva0217, zzheng, edward-jones, mgrang, rogfer01, MartinMosbeck, brucehoult, the_o, rkruppe, PkmX, jocewei, asb

Differential Revision: https://reviews.llvm.org/D51705

Added:
    llvm/trunk/test/MC/Disassembler/RISCV/invalid-fp-rounding-mode.txt
Modified:
    llvm/trunk/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
    llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
    llvm/trunk/lib/Target/RISCV/RISCVInstrInfoF.td

Modified: llvm/trunk/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp?rev=341691&r1=341690&r2=341691&view=diff
==============================================================================
--- llvm/trunk/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp (original)
+++ llvm/trunk/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp Fri Sep  7 11:43:43 2018
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "MCTargetDesc/RISCVBaseInfo.h"
 #include "MCTargetDesc/RISCVMCTargetDesc.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
@@ -242,6 +243,17 @@ static DecodeStatus decodeCLUIImmOperand
   Inst.addOperand(MCOperand::createImm(Imm));
   return MCDisassembler::Success;
 }
+
+static DecodeStatus decodeFRMArg(MCInst &Inst, uint64_t Imm,
+                                 int64_t Address,
+                                 const void *Decoder) {
+  assert(isUInt<3>(Imm) && "Invalid immediate");
+  if (!llvm::RISCVFPRndMode::isValidRoundingMode(Imm))
+    return MCDisassembler::Fail;
+
+  Inst.addOperand(MCOperand::createImm(Imm));
+  return MCDisassembler::Success;
+}
 
 #include "RISCVGenDisassemblerTables.inc"
 

Modified: llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h?rev=341691&r1=341690&r2=341691&view=diff
==============================================================================
--- llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h (original)
+++ llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVBaseInfo.h Fri Sep  7 11:43:43 2018
@@ -104,6 +104,21 @@ inline static RoundingMode stringToRound
       .Case("dyn", RISCVFPRndMode::DYN)
       .Default(RISCVFPRndMode::Invalid);
 }
+
+inline static bool isValidRoundingMode(unsigned Mode) {
+  switch (Mode) {
+  default:
+    return false;
+  case RISCVFPRndMode::RNE:
+  case RISCVFPRndMode::RTZ:
+  case RISCVFPRndMode::RDN:
+  case RISCVFPRndMode::RUP:
+  case RISCVFPRndMode::RMM:
+  case RISCVFPRndMode::DYN:
+    return true;
+  }
+}
+
 } // namespace RISCVFPRndMode
 } // namespace llvm
 

Modified: llvm/trunk/lib/Target/RISCV/RISCVInstrInfoF.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/RISCV/RISCVInstrInfoF.td?rev=341691&r1=341690&r2=341691&view=diff
==============================================================================
--- llvm/trunk/lib/Target/RISCV/RISCVInstrInfoF.td (original)
+++ llvm/trunk/lib/Target/RISCV/RISCVInstrInfoF.td Fri Sep  7 11:43:43 2018
@@ -27,7 +27,7 @@ def FRMArg : AsmOperandClass {
 def frmarg : Operand<XLenVT> {
   let ParserMatchClass = FRMArg;
   let PrintMethod = "printFRMArg";
-  let DecoderMethod = "decodeUImmOperand<3>";
+  let DecoderMethod = "decodeFRMArg";
 }
 
 //===----------------------------------------------------------------------===//

Added: llvm/trunk/test/MC/Disassembler/RISCV/invalid-fp-rounding-mode.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/RISCV/invalid-fp-rounding-mode.txt?rev=341691&view=auto
==============================================================================
--- llvm/trunk/test/MC/Disassembler/RISCV/invalid-fp-rounding-mode.txt (added)
+++ llvm/trunk/test/MC/Disassembler/RISCV/invalid-fp-rounding-mode.txt Fri Sep  7 11:43:43 2018
@@ -0,0 +1,9 @@
+# RUN: not llvm-mc -disassemble -triple=riscv32 -mattr=+f,+d < %s 2>&1 | FileCheck %s
+# RUN: not llvm-mc -disassemble -triple=riscv64 -mattr=+f,+d < %s 2>&1 | FileCheck %s
+#
+# Test generated by a LLVM MC Disassembler Protocol Buffer Fuzzer
+# for the RISC-V assembly language.
+
+# This decodes as fadd.s  ft0, ft0, ft0 with unknown floating point rounding mode
+[0x53 0x50 0x00 0x00]
+# CHECK: warning: invalid instruction encoding




More information about the llvm-commits mailing list