mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-26 05:56:51 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216910 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2633f795c6
commit
4648487925
@ -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