| """ |
| Test SBCompileUnit APIs. |
| """ |
| |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class CompileUnitAPITestCase(TestBase): |
| SHARED_BUILD_TESTCASE = False |
| |
| def test(self): |
| """Exercise some SBCompileUnit APIs.""" |
| self.build() |
| |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( |
| self, "break here", lldb.SBFileSpec("main.c") |
| ) |
| self.assertTrue(target, VALID_TARGET) |
| self.assertTrue(process, PROCESS_IS_VALID) |
| self.assertTrue(bkpt and bkpt.GetNumLocations() == 1, VALID_BREAKPOINT) |
| |
| self.assertTrue( |
| thread.IsValid(), |
| "There should be a thread stopped due to breakpoint condition", |
| ) |
| frame0 = thread.GetFrameAtIndex(0) |
| line_entry = frame0.GetLineEntry() |
| |
| sc_list = target.FindCompileUnits(line_entry.GetFileSpec()) |
| self.assertGreater(sc_list.GetSize(), 0) |
| |
| main_cu = sc_list.compile_units[0] |
| self.assertTrue(main_cu.IsValid(), "Main executable CU is not valid") |
| |
| a_mod: lldb.SBModule = target.FindModule(lldb.SBFileSpec("a.out")) |
| main_cu_by_index = a_mod.compile_unit[0] |
| self.assertTrue(main_cu_by_index.IsValid(), "Main executable CU is not valid") |
| |
| main_cu_by_name = a_mod.compile_unit["main.c"] |
| self.assertTrue(main_cu_by_name.IsValid(), "Main executable CU is not valid") |
| |
| main_cu_by_regex_list = a_mod.compile_unit[re.compile(r".*main.*")] |
| self.assertEqual(len(main_cu_by_regex_list), 1) |
| [main_cu_by_regex] = main_cu_by_regex_list |
| self.assertTrue(main_cu_by_regex.IsValid(), "Main executable CU is not valid") |
| |
| self.assertEqual( |
| main_cu.FindLineEntryIndex(line_entry, True), |
| main_cu.FindLineEntryIndex( |
| 0, line_entry.GetLine(), line_entry.GetFileSpec(), True |
| ), |
| ) |
| |
| self.assertNotEqual(main_cu.GetIDInModule(), lldb.LLDB_INVALID_INDEX32) |
| self.assertEqual(main_cu.GetIDInModule(), main_cu_by_name.GetIDInModule()) |
| self.assertEqual( |
| main_cu.GetIDInModule(), frame0.GetCompileUnit().GetIDInModule() |
| ) |
| self.assertEqual( |
| lldb.SBCompileUnit().GetIDInModule(), lldb.LLDB_INVALID_INDEX32 |
| ) |
| |
| self.assertEqual(a_mod.GetCompileUnitAtIndex(main_cu.GetIDInModule()), main_cu) |
| |
| def find_main_compile_unit(self) -> lldb.SBCompileUnit: |
| target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) |
| self.assertTrue(target, VALID_TARGET) |
| main_cu = target.FindModule(lldb.SBFileSpec("a.out")).compile_unit["main.c"] |
| self.assertTrue(main_cu.IsValid(), "Main executable CU is not valid") |
| return main_cu |
| |
| def test_is_optimized(self): |
| """A compile unit built with optimization reports it.""" |
| self.build(dictionary={"CFLAGS_EXTRAS": "-O1"}) |
| self.assertTrue(self.find_main_compile_unit().GetIsOptimized()) |
| |
| def test_is_not_optimized(self): |
| """A compile unit built without optimization reports it.""" |
| self.build() |
| self.assertFalse(self.find_main_compile_unit().GetIsOptimized()) |
| |
| def test_id_is_unique_per_module(self): |
| self.build() |
| target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) |
| self.assertTrue(target, VALID_TARGET) |
| module = target.FindModule(lldb.SBFileSpec("a.out")) |
| |
| num_cus = module.GetNumCompileUnits() |
| self.assertGreater(num_cus, 1, "test needs a module with several CUs") |
| |
| ids = set() |
| for i in range(num_cus): |
| cu = module.GetCompileUnitAtIndex(i) |
| self.assertEqual(cu.GetIDInModule(), i) |
| ids.add(cu.GetIDInModule()) |
| self.assertEqual(len(ids), num_cus, "IDs must be unique") |