brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 03e1cc7 Raw
94 lines · python
1"""2Test lldb's ability to read and write the LoongArch SIMD registers.3"""4 5from enum import Enum6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11 12class Mode(Enum):13    LSX = 014    LASX = 115 16 17class LoongArch64LinuxRegisters(TestBase):18    NO_DEBUG_INFO_TESTCASE = True19 20    def get_build_flags(self, mode):21        cflags = "-march=la464"22        if mode == Mode.LASX:23            cflags += " -DLASX"24 25        return {"CFLAGS_EXTRAS": cflags}26 27    def make_simd_value(self, n, mode):28        count = 32 if mode == Mode.LASX else 1629        return "{" + " ".join(["0x{:02x}".format(n)] * count) + "}"30 31    def check_simd_values(self, value_offset, mode):32        reg_prefix = "xr" if mode == Mode.LASX else "vr"33        for i in range(32):34            self.expect(35                "register read {}{}".format(reg_prefix, i),36                substrs=[self.make_simd_value(i + value_offset, mode)],37            )38 39    def simd_registers_impl(self, mode):40        self.build(dictionary=self.get_build_flags(mode))41        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)42 43        lldbutil.run_break_set_by_file_and_line(44            self,45            "main.c",46            line_number("main.c", "// Set break point at this line."),47            num_expected_locations=1,48        )49 50        self.runCmd("run", RUN_SUCCEEDED)51 52        if self.process().GetState() == lldb.eStateExited:53            self.fail("Test program failed to run.")54 55        self.expect(56            "thread list",57            STOPPED_DUE_TO_BREAKPOINT,58            substrs=["stopped", "stop reason = breakpoint"],59        )60 61        self.check_simd_values(0, mode)62        self.runCmd("expression write_simd_regs(1)")63        self.check_simd_values(0, mode)64 65        reg_prefix = "xr" if mode == Mode.LASX else "vr"66        for i in range(32):67            self.runCmd(68                'register write {}{} "{}"'.format(69                    reg_prefix, i, self.make_simd_value(i + 1, mode)70                )71            )72 73        # Should be visible within lldb.74        self.check_simd_values(1, mode)75 76        # The program should agree with lldb.77        self.expect("continue", substrs=["exited with status = 0"])78 79    @skipUnlessArch("loongarch64")80    @skipUnlessPlatform(["linux"])81    def test_lsx(self):82        """Test read/write of LSX registers."""83        if not self.isLoongArchLSX():84            self.skipTest("LSX must be present.")85        self.simd_registers_impl(Mode.LSX)86 87    @skipUnlessArch("loongarch64")88    @skipUnlessPlatform(["linux"])89    def test_lasx(self):90        """Test read/write of LASX registers."""91        if not self.isLoongArchLASX():92            self.skipTest("LASX must be present.")93        self.simd_registers_impl(Mode.LASX)94