brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · f107efb Raw
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