Change ARMInstPrinter::printPredicateOperand() so it will not abort if it
authorKevin Enderby <enderby@apple.com>
Thu, 1 Mar 2012 22:13:02 +0000 (22:13 +0000)
committerKevin Enderby <enderby@apple.com>
Thu, 1 Mar 2012 22:13:02 +0000 (22:13 +0000)
runs into the undefined 15 condition code value.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151844 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
test/MC/Disassembler/ARM/invalid-IT-CC15.txt [new file with mode: 0644]

index a821192607af0814a0b8b60d918197566f85d7f0..b0b1dbbefa90df02f8a17ea5e98f149fc5987a4e 100644 (file)
@@ -692,7 +692,10 @@ void ARMInstPrinter::printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
 void ARMInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNum,
                                            raw_ostream &O) {
   ARMCC::CondCodes CC = (ARMCC::CondCodes)MI->getOperand(OpNum).getImm();
-  if (CC != ARMCC::AL)
+  // Handle the undefined 15 CC value here for printing so we don't abort().
+  if ((unsigned)CC == 15)
+    O << "<und>";
+  else if (CC != ARMCC::AL)
     O << ARMCondCodeToString(CC);
 }
 
diff --git a/test/MC/Disassembler/ARM/invalid-IT-CC15.txt b/test/MC/Disassembler/ARM/invalid-IT-CC15.txt
new file mode 100644 (file)
index 0000000..17e25ea
--- /dev/null
@@ -0,0 +1,18 @@
+# RUN: llvm-mc --disassemble %s -triple=thumbv7-unknown-unknown |& grep und
+# rdar://10841671
+
+0xe3 0xbf
+0xdf 0xed 0x61 0x3b
+0x71 0xee 0xe0 0x1b
+0x72 0xee 0xa3 0x2b
+0xdf 0xed 0x60 0x0b
+
+# This is test is dealing with a undefined condition code value of 15 in the
+# above sequence of junk bytes and not allowing the disassembler to abort on
+# printing the final instruction in this list.
+# 
+#      ittte   al
+#      vldr    d19, [pc, #388]
+#      vsub.f64        d17, d17, d16
+#      vadd.f64        d18, d18, d19
+#      vldr<und>       d16, [pc, #384]