From 29ff1b4f4653f2c77501ca4e1014c710e602aa08 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 28 Jun 2019 09:28:39 +0000 Subject: [PATCH] [ARM] Fix integer UB in MVE load/store immediate handling. llvm-svn: 364635 --- llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp | 4 ++-- llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp index 9fb2fa6..673691e 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -4182,7 +4182,7 @@ static DecodeStatus DecodeT2Imm7(MCInst &Inst, unsigned Val, else if (!(Val & 0x80)) imm *= -1; if (imm != INT32_MIN) - imm <<= shift; + imm *= (1U << shift); Inst.addOperand(MCOperand::createImm(imm)); return MCDisassembler::Success; @@ -4448,7 +4448,7 @@ static DecodeStatus DecodeMveAddrModeQ(MCInst &Inst, unsigned Insn, imm *= -1; } if (imm != INT32_MIN) - imm <<= shift; + imm *= (1U << shift); Inst.addOperand(MCOperand::createImm(imm)); return S; diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp index c506f26..dca6fe3 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp @@ -1621,12 +1621,15 @@ getT2AddrModeImmOpValue(const MCInst &MI, unsigned OpNum, // If the immediate is B bits long, we need B+1 bits in order // to represent the (inverse of the) sign bit. Value <<= (Bits + 1); - int32_t tmp = (int32_t)MO2.getImm() >> Shift; - if (tmp < 0) + int32_t tmp = (int32_t)MO2.getImm(); + if (tmp == INT32_MIN) { // represents subtracting zero rather than adding it + tmp = 0; + } else if (tmp < 0) { tmp = abs(tmp); - else + } else { Value |= (1U << Bits); // Set the ADD bit - Value |= tmp & ((1U << Bits) - 1); + } + Value |= (tmp >> Shift) & ((1U << Bits) - 1); return Value; } -- 2.7.4