Clean up whitespace
[pyelftools.git] / test / test_ehabi_decoder.py
1 # -------------------------------------------------------------------------------
2 # elftools: tests
3 #
4 # LeadroyaL (leadroyal@qq.com)
5 # This code is in the public domain
6 # -------------------------------------------------------------------------------
7
8 import unittest
9
10 from elftools.ehabi.decoder import EHABIBytecodeDecoder
11
12
13 class TestEHABIDecoder(unittest.TestCase):
14 """ Tests for the EHABI decoder.
15 """
16
17 def testLLVM(self):
18 # Reference: https://github.com/llvm/llvm-project/blob/master/llvm/test/tools/llvm-readobj/ELF/ARM/unwind.s
19 mnemonic_array = EHABIBytecodeDecoder([0xb1, 0x0f, 0xa7, 0x3f, 0xb0, 0xb0]).mnemonic_array
20 self.assertEqual(mnemonic_array[0].mnemonic, "pop {r0, r1, r2, r3}")
21 self.assertEqual(mnemonic_array[1].mnemonic, "pop {r4, r5, r6, r7, r8, r9, r10, fp}")
22 self.assertEqual(mnemonic_array[2].mnemonic, "vsp = vsp + 256")
23 self.assertEqual(mnemonic_array[3].mnemonic, "finish")
24 self.assertEqual(mnemonic_array[4].mnemonic, "finish")
25
26 mnemonic_array = EHABIBytecodeDecoder([0xc9, 0x84, 0xb0]).mnemonic_array
27 self.assertEqual(mnemonic_array[0].mnemonic, "pop {d8, d9, d10, d11, d12}")
28 self.assertEqual(mnemonic_array[1].mnemonic, "finish")
29
30 mnemonic_array = EHABIBytecodeDecoder(
31 [0xD7, 0xC9, 0x02, 0xC8, 0x02, 0xC7, 0x03, 0xC6,
32 0x02, 0xC2, 0xBA, 0xB3, 0x12, 0xB2, 0x80, 0x04,
33 0xB1, 0x01, 0xB0, 0xA9, 0xA1, 0x91, 0x84, 0xC0,
34 0x80, 0xC0, 0x80, 0x01, 0x81, 0x00, 0x80, 0x00,
35 0x42, 0x02, ]).mnemonic_array
36 self.assertEqual(mnemonic_array[0].mnemonic, "pop {d8, d9, d10, d11, d12, d13, d14, d15}")
37 self.assertEqual(mnemonic_array[1].mnemonic, "pop {d0, d1, d2}")
38 self.assertEqual(mnemonic_array[2].mnemonic, "pop {d16, d17, d18}")
39 self.assertEqual(mnemonic_array[3].mnemonic, "pop {wCGR0, wCGR1}")
40 self.assertEqual(mnemonic_array[4].mnemonic, "pop {wR0, wR1, wR2}")
41 self.assertEqual(mnemonic_array[5].mnemonic, "pop {wR10, wR11, wR12}")
42 self.assertEqual(mnemonic_array[6].mnemonic, "pop {d8, d9, d10}")
43 self.assertEqual(mnemonic_array[7].mnemonic, "pop {d1, d2, d3}")
44 self.assertEqual(mnemonic_array[8].mnemonic, "vsp = vsp + 2564")
45 self.assertEqual(mnemonic_array[9].mnemonic, "pop {r0}")
46 self.assertEqual(mnemonic_array[10].mnemonic, "finish")
47 self.assertEqual(mnemonic_array[11].mnemonic, "pop {r4, r5, lr}")
48 self.assertEqual(mnemonic_array[12].mnemonic, "pop {r4, r5}")
49 self.assertEqual(mnemonic_array[13].mnemonic, "vsp = r1")
50 self.assertEqual(mnemonic_array[14].mnemonic, "pop {r10, fp, lr}")
51 self.assertEqual(mnemonic_array[15].mnemonic, "pop {r10, fp}")
52 self.assertEqual(mnemonic_array[16].mnemonic, "pop {r4}")
53 self.assertEqual(mnemonic_array[17].mnemonic, "pop {ip}")
54 self.assertEqual(mnemonic_array[18].mnemonic, "refuse to unwind")
55 self.assertEqual(mnemonic_array[19].mnemonic, "vsp = vsp - 12")
56 self.assertEqual(mnemonic_array[20].mnemonic, "vsp = vsp + 12")
57
58 mnemonic_array = EHABIBytecodeDecoder(
59 [0xD8, 0xD0, 0xCA, 0xC9, 0x00, 0xC8, 0x00, 0xC7,
60 0x10, 0xC7, 0x01, 0xC7, 0x00, 0xC6, 0x00, 0xC0,
61 0xB8, 0xB4, 0xB3, 0x00, 0xB2, 0x00, 0xB1, 0x10,
62 0xB1, 0x01, 0xB1, 0x00, 0xB0, 0xA8, 0xA0, 0x9F,
63 0x9D, 0x91, 0x88, 0x00, 0x80, 0x00, 0x40, 0x00,
64 ]).mnemonic_array
65 self.assertEqual(mnemonic_array[0].mnemonic, "spare")
66 self.assertEqual(mnemonic_array[1].mnemonic, "pop {d8}")
67 self.assertEqual(mnemonic_array[2].mnemonic, "spare")
68 self.assertEqual(mnemonic_array[3].mnemonic, "pop {d0}")
69 self.assertEqual(mnemonic_array[4].mnemonic, "pop {d16}")
70 self.assertEqual(mnemonic_array[5].mnemonic, "spare")
71 self.assertEqual(mnemonic_array[6].mnemonic, "pop {wCGR0}")
72 self.assertEqual(mnemonic_array[7].mnemonic, "spare")
73 self.assertEqual(mnemonic_array[8].mnemonic, "pop {wR0}")
74 self.assertEqual(mnemonic_array[9].mnemonic, "pop {wR10}")
75 self.assertEqual(mnemonic_array[10].mnemonic, "pop {d8}")
76 self.assertEqual(mnemonic_array[11].mnemonic, "spare")
77 self.assertEqual(mnemonic_array[12].mnemonic, "pop {d0}")
78 self.assertEqual(mnemonic_array[13].mnemonic, "vsp = vsp + 516")
79 self.assertEqual(mnemonic_array[14].mnemonic, "spare")
80 self.assertEqual(mnemonic_array[15].mnemonic, "pop {r0}")
81 self.assertEqual(mnemonic_array[16].mnemonic, "spare")
82 self.assertEqual(mnemonic_array[17].mnemonic, "finish")
83 self.assertEqual(mnemonic_array[18].mnemonic, "pop {r4, lr}")
84 self.assertEqual(mnemonic_array[19].mnemonic, "pop {r4}")
85 self.assertEqual(mnemonic_array[20].mnemonic, "reserved (WiMMX MOVrr)")
86 self.assertEqual(mnemonic_array[21].mnemonic, "reserved (ARM MOVrr)")
87 self.assertEqual(mnemonic_array[22].mnemonic, "vsp = r1")
88 self.assertEqual(mnemonic_array[23].mnemonic, "pop {pc}")
89 self.assertEqual(mnemonic_array[24].mnemonic, "refuse to unwind")
90 self.assertEqual(mnemonic_array[25].mnemonic, "vsp = vsp - 4")
91 self.assertEqual(mnemonic_array[26].mnemonic, "vsp = vsp + 4")
92
93
94 if __name__ == '__main__':
95 unittest.main()