mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-13 00:11:56 +00:00
Fixed another assert exposed by fuzzing. Now, when an encoding error occurs
involing getBFCInvMask() where lsb <= msb does not hold true, the disassembler just returns false, instead of assert, to indicate disassembly error. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101205 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1d526c38e2
commit
6f72ab345d
@ -15,6 +15,7 @@
|
||||
|
||||
#include "ARMDisassemblerCore.h"
|
||||
#include "ARMAddressingModes.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
/// ARMGenInstrInfo.inc - ARMGenInstrInfo.inc contains the static const
|
||||
/// TargetInstrDesc ARMInsts[] definition and the TargetOperandInfo[]'s
|
||||
@ -885,14 +886,19 @@ static bool DisassembleBrMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline uint32_t getBFCInvMask(uint32_t insn) {
|
||||
static inline bool getBFCInvMask(uint32_t insn, uint32_t &mask) {
|
||||
uint32_t lsb = slice(insn, 11, 7);
|
||||
uint32_t msb = slice(insn, 20, 16);
|
||||
uint32_t Val = 0;
|
||||
assert(lsb <= msb && "Encoding error: lsb > msb");
|
||||
if (lsb > msb) {
|
||||
errs() << "Encoding error: lsb > msb\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
for (uint32_t i = lsb; i <= msb; ++i)
|
||||
Val |= (1 << i);
|
||||
return ~Val;
|
||||
mask = ~Val;
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool SaturateOpcode(unsigned Opcode) {
|
||||
@ -982,7 +988,11 @@ static bool DisassembleDPFrm(MCInst &MI, unsigned Opcode, uint32_t insn,
|
||||
MI.addOperand(MCOperand::CreateReg(Opcode == ARM::BFC ? 0
|
||||
: getRegisterEnum(ARM::GPRRegClassID,
|
||||
decodeRm(insn))));
|
||||
MI.addOperand(MCOperand::CreateImm(getBFCInvMask(insn)));
|
||||
uint32_t mask = 0;
|
||||
if (!getBFCInvMask(insn, mask))
|
||||
return false;
|
||||
|
||||
MI.addOperand(MCOperand::CreateImm(mask));
|
||||
OpIdx += 2;
|
||||
return true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user