diff options
author | Tim Northover <tnorthover@apple.com> | 2018-06-26 11:38:41 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2018-06-26 11:38:41 +0000 |
commit | bf5485811500e2534b17925aed80265d1b1c5af2 (patch) | |
tree | 80ff6f41c3cb81ae3400d88bfdc212a3258f2230 /llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp | |
parent | 580f3eb2266336b59ad0d0cd1c1112b29165648b (diff) | |
download | bcm5719-llvm-bf5485811500e2534b17925aed80265d1b1c5af2.tar.gz bcm5719-llvm-bf5485811500e2534b17925aed80265d1b1c5af2.zip |
ARM: diagnose unpredictable IT instructions
IT instructions are allowed to have the 'AL' predicate, but it must never
result in an 'NV' predicated instruction. Essentially this means that all
branches must be 't' rather than 'e' if the predicate is 'AL'.
This patch adds a diagnostic for this during assembly (error because parsing
hits an assertion if allowed to continue) and an annotation during disassembly.
llvm-svn: 335593
Diffstat (limited to 'llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp index 3ffa702462c..f21dce3f3ad 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -729,10 +729,13 @@ DecodeStatus ThumbDisassembler::getInstruction(MCInst &MI, uint64_t &Size, // code and mask operands so that we can apply them correctly // to the subsequent instructions. if (MI.getOpcode() == ARM::t2IT) { - unsigned Firstcond = MI.getOperand(0).getImm(); unsigned Mask = MI.getOperand(1).getImm(); ITBlock.setITState(Firstcond, Mask); + + // An IT instruction that would give a 'NV' predicate is unpredictable. + if (Firstcond == ARMCC::AL && !isPowerOf2_32(Mask)) + CS << "unpredictable IT predicate sequence"; } return Result; |