1""" 2Test that we can backtrace correctly when AArch64 PAC is enabled 3""" 4 5import lldb 6from lldbsuite.test.decorators import * 7from lldbsuite.test.lldbtest import * 8from lldbsuite.test import lldbutil 9 10 11class AArch64UnwindPAC(TestBase): 12 mydir = TestBase.compute_mydir(__file__) 13 14 @skipIf(archs=no_match(["aarch64"])) 15 @skipIf(oslist=no_match(['linux'])) 16 def test(self): 17 """Test that we can backtrace correctly when AArch64 PAC is enabled""" 18 self.build() 19 20 self.line = line_number('main.c', '// Frame func_c') 21 22 exe = self.getBuildArtifact("a.out") 23 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 24 25 lldbutil.run_break_set_by_file_and_line( 26 self, "main.c", self.line, num_expected_locations=1) 27 self.runCmd("run", RUN_SUCCEEDED) 28 self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT, 29 substrs=["stop reason = breakpoint 1."]) 30 31 target = self.dbg.GetSelectedTarget() 32 process = target.GetProcess() 33 thread = process.GetThreadAtIndex(0) 34 35 backtrace = ["func_c", "func_b", "func_a", "main", "__libc_start_main", "_start"] 36 self.assertEqual(thread.GetNumFrames(), len(backtrace)) 37 for frame_idx, frame in enumerate(thread.frames): 38 frame = thread.GetFrameAtIndex(frame_idx) 39 self.assertTrue(frame) 40 self.assertEqual(frame.GetFunctionName(), backtrace[frame_idx]) 41 # Check line number for functions in main.c 42 if (frame_idx < 4): 43 self.assertEqual(frame.GetLineEntry().GetLine(), 44 line_number("main.c", "Frame " + backtrace[frame_idx])) 45