blob: fe474ef5a8fd79ece6274d4066825d799d7ebdef [file]
"""
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")