119 lines · python
1from lldbsuite.test.lldbtest import *2from lldbsuite.test.decorators import *3import lldb4import os5import re6 7 8# Requires ELF assembler directives (.section … @progbits, .ident, etc.);9# not compatible with COFF/Mach-O toolchains.10@skipUnlessPlatform(["linux", "android", "freebsd", "netbsd"])11class TestVariableAnnotationsDisassembler(TestBase):12 def _build_obj(self, obj_name: str) -> str:13 # Let the Makefile build all .o’s (pattern rule). Then grab the one we need.14 self.build()15 obj = self.getBuildArtifact(obj_name)16 self.assertTrue(os.path.exists(obj), f"missing object: {obj}")17 return obj18 19 def _create_target(self, path):20 target = self.dbg.CreateTarget(path)21 self.assertTrue(target, f"failed to create target for {path}")22 return target23 24 def _disassemble_verbose_symbol(self, symname):25 self.runCmd(f"disassemble -n {symname} -v", check=True)26 return self.res.GetOutput()27 28 @skipIf(archs=no_match(["x86_64"]))29 def test_d_original_example_O1(self):30 obj = self._build_obj("d_original_example.o")31 target = self._create_target(obj)32 out = self._disassemble_verbose_symbol("main")33 print(out)34 self.assertIn("argc = ", out)35 self.assertIn("argv = ", out)36 self.assertIn("i = ", out)37 self.assertNotIn("<decoding error>", out)38 39 @no_debug_info_test40 @skipIf(archs=no_match(["x86_64"]))41 def test_regs_int_params(self):42 obj = self._build_obj("regs_int_params.o")43 target = self._create_target(obj)44 out = self._disassemble_verbose_symbol("regs_int_params")45 print(out)46 self.assertRegex(out, r"\ba\s*=\s*(DW_OP_reg5\b|RDI\b)")47 self.assertRegex(out, r"\bb\s*=\s*(DW_OP_reg4\b|RSI\b)")48 self.assertRegex(out, r"\bc\s*=\s*(DW_OP_reg1\b|RDX\b)")49 self.assertRegex(out, r"\bd\s*=\s*(DW_OP_reg2\b|RCX\b)")50 self.assertRegex(out, r"\be\s*=\s*(DW_OP_reg8\b|R8\b)")51 self.assertRegex(out, r"\bf\s*=\s*(DW_OP_reg9\b|R9\b)")52 self.assertNotIn("<decoding error>", out)53 54 @no_debug_info_test55 @skipIf(archs=no_match(["x86_64"]))56 def test_regs_fp_params(self):57 obj = self._build_obj("regs_fp_params.o")58 target = self._create_target(obj)59 out = self._disassemble_verbose_symbol("regs_fp_params")60 print(out)61 self.assertRegex(out, r"\ba\s*=\s*(DW_OP_reg17\b|XMM0\b)")62 self.assertRegex(out, r"\bb\s*=\s*(DW_OP_reg18\b|XMM1\b)")63 self.assertRegex(out, r"\bc\s*=\s*(DW_OP_reg19\b|XMM2\b)")64 self.assertRegex(out, r"\bd\s*=\s*(DW_OP_reg20\b|XMM3\b)")65 self.assertRegex(out, r"\be\s*=\s*(DW_OP_reg21\b|XMM4\b)")66 self.assertRegex(out, r"\bf\s*=\s*(DW_OP_reg22\b|XMM5\b)")67 self.assertNotIn("<decoding error>", out)68 69 @no_debug_info_test70 @skipIf(archs=no_match(["x86_64"]))71 def test_regs_mixed_params(self):72 obj = self._build_obj("regs_mixed_params.o")73 target = self._create_target(obj)74 out = self._disassemble_verbose_symbol("regs_mixed_params")75 print(out)76 self.assertRegex(out, r"\ba\s*=\s*(DW_OP_reg5\b|RDI\b)")77 self.assertRegex(out, r"\bb\s*=\s*(DW_OP_reg4\b|RSI\b)")78 self.assertRegex(out, r"\bx\s*=\s*(DW_OP_reg17\b|XMM0\b|DW_OP_reg\d+\b)")79 self.assertRegex(out, r"\by\s*=\s*(DW_OP_reg18\b|XMM1\b|DW_OP_reg\d+\b)")80 self.assertRegex(out, r"\bc\s*=\s*(DW_OP_reg1\b|RDX\b)")81 self.assertRegex(out, r"\bz\s*=\s*(DW_OP_reg19\b|XMM2\b|DW_OP_reg\d+\b)")82 self.assertNotIn("<decoding error>", out)83 84 @no_debug_info_test85 @skipIf(archs=no_match(["x86_64"]))86 def test_live_across_call(self):87 obj = self._build_obj("live_across_call.o")88 target = self._create_target(obj)89 out = self._disassemble_verbose_symbol("live_across_call")90 print(out)91 self.assertRegex(out, r"\bx\s*=\s*(DW_OP_reg5\b|RDI\b)")92 self.assertIn("call", out)93 self.assertRegex(out, r"\br\s*=\s*(DW_OP_reg0\b|RAX\b|DW_OP_reg\d+\b)")94 self.assertNotIn("<decoding error>", out)95 96 @no_debug_info_test97 @skipIf(archs=no_match(["x86_64"]))98 def test_loop_reg_rotate(self):99 obj = self._build_obj("loop_reg_rotate.o")100 target = self._create_target(obj)101 out = self._disassemble_verbose_symbol("loop_reg_rotate")102 print(out)103 self.assertRegex(out, r"\bn\s*=\s*(DW_OP_reg\d+\b|R[A-Z0-9]+)")104 self.assertRegex(out, r"\bseed\s*=\s*(DW_OP_reg\d+\b|R[A-Z0-9]+)")105 self.assertRegex(out, r"\bk\s*=\s*(DW_OP_reg\d+\b|R[A-Z0-9]+)")106 self.assertRegex(out, r"\bj\s*=\s*(DW_OP_reg\d+\b|R[A-Z0-9]+)")107 self.assertRegex(out, r"\bi\s*=\s*(DW_OP_reg\d+\b|R[A-Z0-9]+)")108 self.assertNotIn("<decoding error>", out)109 110 @no_debug_info_test111 @skipIf(archs=no_match(["x86_64"]))112 def test_seed_reg_const_undef(self):113 obj = self._build_obj("seed_reg_const_undef.o")114 target = self._create_target(obj)115 out = self._disassemble_verbose_symbol("main")116 print(out)117 self.assertRegex(out, r"\b(i|argc)\s*=\s*(DW_OP_reg\d+\b|R[A-Z0-9]+)")118 self.assertNotIn("<decoding error>", out)119