mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
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
9b47ecfb28
commit
4c992226cd
@ -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
Block a user