diff options
author | Johnny Chen <johnny.chen@apple.com> | 2010-04-19 23:02:58 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2010-04-19 23:02:58 +0000 |
commit | e62b68096592ce2acdb48a915c1c437566cc401b (patch) | |
tree | 013e781479b87d5d23e8b4b7cf6201df35559cc9 /llvm/lib/Target/ARM/Disassembler | |
parent | c4df407604b8798dfc56b2692d25b13a11fda0db (diff) | |
download | bcm5719-llvm-e62b68096592ce2acdb48a915c1c437566cc401b.tar.gz bcm5719-llvm-e62b68096592ce2acdb48a915c1c437566cc401b.zip |
Better error handling of invalid IT mask '0000', instead of just asserting.
llvm-svn: 101827
Diffstat (limited to 'llvm/lib/Target/ARM/Disassembler')
-rw-r--r-- | llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/Disassembler/ARMDisassembler.h | 2 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp | 2 |
3 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp index 0e27e16f941..1c9d95fb08a 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -508,17 +508,23 @@ bool ThumbDisassembler::getInstruction(MCInst &MI, } // A8.6.50 +// Valid return values are {1, 2, 3, 4}, with 0 signifying an error condition. static unsigned short CountITSize(unsigned ITMask) { // First count the trailing zeros of the IT mask. unsigned TZ = CountTrailingZeros_32(ITMask); - assert(TZ <= 3 && "Encoding error"); + if (TZ > 3) { + DEBUG(errs() << "Encoding error of IT mask"); + return 0; + } return (4 - TZ); } -/// Init ITState. -void Session::InitIT(unsigned short bits7_0) { +/// Init ITState. Note that at least one bit is always 1 in mask. +bool Session::InitIT(unsigned short bits7_0) { ITCounter = CountITSize(slice(bits7_0, 3, 0)); ITState = bits7_0; + // Only need to check for > 0. + return ITCounter > 0; } /// Update ITState if necessary. diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.h b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.h index e418b2ba51e..0a74a3866ee 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.h +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassembler.h @@ -60,7 +60,7 @@ public: Session() : ITCounter(0), ITState(0) {} ~Session() {} /// InitIT - Initializes ITCounter/ITState. - void InitIT(unsigned short bits7_0); + bool InitIT(unsigned short bits7_0); /// UpdateIT - Updates ITCounter/ITState as IT Block progresses. void UpdateIT(); diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp index c261948d909..6e76200b35e 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp @@ -3282,7 +3282,7 @@ bool ARMBasicMCBuilder::RunBuildAfterHook(bool Status, MCInst &MI, if (!SP) return Status; if (Opcode == ARM::t2IT) - SP->InitIT(slice(insn, 7, 0)); + Status = SP->InitIT(slice(insn, 7, 0)) ? Status : false; else if (InITBlock()) SP->UpdateIT(); |