| """ | |
| 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 | |
| @expectedFailureAll(debug_info=["pdb"], bugnumber="llvm.org/pr149498") | |
| 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") |