forked from OSchip/llvm-project
Fix left shifts of negative integers in AArch64 InstPrinter/Disassembler
Summary: Left shift of negative integer is an undefined behavior, and is reported by UBSan. It's ok for imm values to be negative, so we can just replace left shifts with multiplications. Test Plan: check-llvm test suite Reviewers: t.p.northover Reviewed By: t.p.northover Subscribers: aemerson, mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D5132 llvm-svn: 216910
This commit is contained in:
parent
bbb3a7f51c
commit
729b12ede3
|
@ -610,7 +610,7 @@ static DecodeStatus DecodePCRelLabel19(llvm::MCInst &Inst, unsigned Imm,
|
|||
if (ImmVal & (1 << (19 - 1)))
|
||||
ImmVal |= ~((1LL << 19) - 1);
|
||||
|
||||
if (!Dis->tryAddingSymbolicOperand(Inst, ImmVal << 2, Addr,
|
||||
if (!Dis->tryAddingSymbolicOperand(Inst, ImmVal * 4, Addr,
|
||||
Inst.getOpcode() != AArch64::LDRXl, 0, 4))
|
||||
Inst.addOperand(MCOperand::CreateImm(ImmVal));
|
||||
return Success;
|
||||
|
@ -1506,7 +1506,7 @@ static DecodeStatus DecodeUnconditionalBranch(llvm::MCInst &Inst, uint32_t insn,
|
|||
if (imm & (1 << (26 - 1)))
|
||||
imm |= ~((1LL << 26) - 1);
|
||||
|
||||
if (!Dis->tryAddingSymbolicOperand(Inst, imm << 2, Addr, true, 0, 4))
|
||||
if (!Dis->tryAddingSymbolicOperand(Inst, imm * 4, Addr, true, 0, 4))
|
||||
Inst.addOperand(MCOperand::CreateImm(imm));
|
||||
|
||||
return Success;
|
||||
|
@ -1548,7 +1548,7 @@ static DecodeStatus DecodeTestAndBranch(llvm::MCInst &Inst, uint32_t insn,
|
|||
else
|
||||
DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
|
||||
Inst.addOperand(MCOperand::CreateImm(bit));
|
||||
if (!Dis->tryAddingSymbolicOperand(Inst, dst << 2, Addr, true, 0, 4))
|
||||
if (!Dis->tryAddingSymbolicOperand(Inst, dst * 4, Addr, true, 0, 4))
|
||||
Inst.addOperand(MCOperand::CreateImm(dst));
|
||||
|
||||
return Success;
|
||||
|
|
|
@ -1223,7 +1223,7 @@ void AArch64InstPrinter::printAlignedLabel(const MCInst *MI, unsigned OpNum,
|
|||
// If the label has already been resolved to an immediate offset (say, when
|
||||
// we're running the disassembler), just print the immediate.
|
||||
if (Op.isImm()) {
|
||||
O << "#" << (Op.getImm() << 2);
|
||||
O << "#" << (Op.getImm() * 4);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1247,7 +1247,7 @@ void AArch64InstPrinter::printAdrpLabel(const MCInst *MI, unsigned OpNum,
|
|||
// If the label has already been resolved to an immediate offset (say, when
|
||||
// we're running the disassembler), just print the immediate.
|
||||
if (Op.isImm()) {
|
||||
O << "#" << (Op.getImm() << 12);
|
||||
O << "#" << (Op.getImm() * (1 << 12));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue