brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 17e120d Raw
75 lines · python
1"""2Test that we can backtrace correctly when AArch64 PAC is enabled3"""4 5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import lldbutil9 10 11class AArch64UnwindPAC(TestBase):12    @skipIf(archs=no_match(["aarch64"]))13    @skipIf(oslist=no_match(["linux"]))14    def test(self):15        """Test that we can backtrace correctly when AArch64 PAC is enabled"""16        if not self.isAArch64PAuth():17            self.skipTest("Target must support Pointer Authentication.")18 19        self.build()20 21        self.line = line_number("main.c", "// Frame func_c")22 23        exe = self.getBuildArtifact("a.out")24        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)25 26        lldbutil.run_break_set_by_file_and_line(27            self, "main.c", self.line, num_expected_locations=128        )29        self.runCmd("run", RUN_SUCCEEDED)30        self.expect(31            "thread backtrace",32            STOPPED_DUE_TO_BREAKPOINT,33            substrs=["stop reason = breakpoint 1."],34        )35 36        target = self.dbg.GetSelectedTarget()37        process = target.GetProcess()38        thread = process.GetThreadAtIndex(0)39 40        backtrace = [41            "func_c",42            "func_b",43            "func_a",44            "main",45        ]46 47        libc_backtrace = [48            "__libc_start_main",49            "_start",50        ]51 52        self.assertGreaterEqual(53            thread.GetNumFrames(), len(backtrace) + len(libc_backtrace)54        )55 56        # Strictly check frames that are in the test program's source.57        for frame_idx, frame in enumerate(thread.frames[: len(backtrace)]):58            self.assertTrue(frame)59            self.assertEqual(frame.GetFunctionName(), backtrace[frame_idx])60            self.assertEqual(61                frame.GetLineEntry().GetLine(),62                line_number("main.c", "Frame " + backtrace[frame_idx]),63            )64 65        # After the program comes some libc frames. The number varies by66        # system, so ensure we have at least these two in this order,67        # skipping frames in between.68        start_idx = frame_idx + 169        for frame_idx, frame in enumerate(thread.frames[start_idx:], start=start_idx):70            self.assertTrue(frame)71            if libc_backtrace[0] == frame.GetFunctionName():72                libc_backtrace.pop(0)73 74        self.assertFalse(libc_backtrace, "Did not find expected libc frames.")75