aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/python_api
diff options
context:
space:
mode:
authorMiro Bucko <mbucko@meta.com>2024-05-28 23:29:10 +0700
committerGitHub <noreply@github.com>2024-05-28 09:29:10 -0700
commit42944e4600827738fae868f0df831fb2678be8b4 (patch)
tree49d4085e53e62895f8404181aa65bd32bedc4fa7 /lldb/test/API/python_api
parentd582958618cc5aeff58c512399bef7b263fedd59 (diff)
downloadllvm-42944e4600827738fae868f0df831fb2678be8b4.zip
llvm-42944e4600827738fae868f0df831fb2678be8b4.tar.gz
llvm-42944e4600827738fae868f0df831fb2678be8b4.tar.bz2
Add SBAddressRange and SBAddressRangeList to SB API (#92014)
This adds new SB API calls and classes to allow a user of the SB API to obtain an address ranges from SBFunction and SBBlock.
Diffstat (limited to 'lldb/test/API/python_api')
-rw-r--r--lldb/test/API/python_api/address_range/Makefile3
-rw-r--r--lldb/test/API/python_api/address_range/TestAddressRange.py256
-rw-r--r--lldb/test/API/python_api/address_range/main.cpp8
3 files changed, 267 insertions, 0 deletions
diff --git a/lldb/test/API/python_api/address_range/Makefile b/lldb/test/API/python_api/address_range/Makefile
new file mode 100644
index 0000000..99998b2
--- /dev/null
+++ b/lldb/test/API/python_api/address_range/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/python_api/address_range/TestAddressRange.py b/lldb/test/API/python_api/address_range/TestAddressRange.py
new file mode 100644
index 0000000..8c27558
--- /dev/null
+++ b/lldb/test/API/python_api/address_range/TestAddressRange.py
@@ -0,0 +1,256 @@
+"""
+Test SBAddressRange APIs.
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+
+
+class AddressRangeTestCase(TestBase):
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def setUp(self):
+ TestBase.setUp(self)
+
+ self.build()
+ exe = self.getBuildArtifact("a.out")
+
+ self.dbg.SetAsync(True)
+
+ self.target = self.dbg.CreateTarget(exe)
+ self.assertTrue(self.target, VALID_TARGET)
+ self.launch_info = self.target.GetLaunchInfo()
+ self.launch_info.SetWorkingDirectory(self.get_process_working_directory())
+
+ self.bp1 = self.target.BreakpointCreateByName("main", "a.out")
+ self.bp2 = self.target.BreakpointCreateByName("foo", "a.out")
+ self.bp3 = self.target.BreakpointCreateByName("bar", "a.out")
+
+ self.assertTrue(self.bp1.IsValid())
+ self.assertTrue(self.bp2.IsValid())
+ self.assertTrue(self.bp3.IsValid())
+
+ self.addr1 = self.bp1.GetLocationAtIndex(0).GetAddress()
+ self.addr2 = self.bp2.GetLocationAtIndex(0).GetAddress()
+ self.addr3 = self.bp3.GetLocationAtIndex(0).GetAddress()
+
+ self.assertTrue(self.addr1.IsValid())
+ self.assertTrue(self.addr2.IsValid())
+ self.assertTrue(self.addr3.IsValid())
+
+ def test_address_range_default(self):
+ """Testing default constructor."""
+ empty_range = lldb.SBAddressRange()
+ self.assertEqual(empty_range.IsValid(), False)
+
+ def test_address_range_construction(self):
+ """Make sure the construction and getters work."""
+ range = lldb.SBAddressRange(self.addr1, 8)
+ self.assertEqual(range.IsValid(), True)
+ self.assertEqual(range.GetBaseAddress(), self.addr1)
+ self.assertEqual(range.GetByteSize(), 8)
+
+ def test_address_range_clear(self):
+ """Make sure the clear method works."""
+ range = lldb.SBAddressRange(self.addr1, 8)
+ self.assertEqual(range.IsValid(), True)
+ self.assertEqual(range.GetBaseAddress(), self.addr1)
+ self.assertEqual(range.GetByteSize(), 8)
+
+ range.Clear()
+ self.assertEqual(range.IsValid(), False)
+
+ def test_function(self):
+ """Make sure the range works in SBFunction APIs."""
+
+ # Setup breakpoints in main
+ loc = self.bp1.GetLocationAtIndex(0)
+ loc_addr = loc.GetAddress()
+ func = loc_addr.GetFunction()
+ ranges = func.GetRanges()
+ self.assertEqual(ranges.GetSize(), 1)
+
+ range = ranges.GetAddressRangeAtIndex(0)
+ self.assertEqual(
+ range.GetByteSize(),
+ func.GetEndAddress().GetOffset() - func.GetStartAddress().GetOffset(),
+ )
+ self.assertEqual(
+ range.GetBaseAddress().GetOffset(),
+ func.GetStartAddress().GetOffset(),
+ )
+
+ def test_block(self):
+ """Make sure the range works in SBBlock APIs."""
+ loc = self.bp1.GetLocationAtIndex(0)
+ loc_addr = loc.GetAddress()
+ block = loc_addr.GetBlock()
+
+ ranges = block.GetRanges()
+ self.assertEqual(ranges.GetSize(), 1)
+
+ range = ranges.GetAddressRangeAtIndex(0)
+ self.assertEqual(
+ range.GetByteSize(),
+ block.GetRangeEndAddress(0).GetOffset()
+ - block.GetRangeStartAddress(0).GetOffset(),
+ )
+ self.assertEqual(
+ range.GetBaseAddress().GetOffset(),
+ block.GetRangeStartAddress(0).GetOffset(),
+ )
+
+ def test_address_range_list(self):
+ """Make sure the SBAddressRangeList works by adding and getting ranges."""
+ range1 = lldb.SBAddressRange(self.addr1, 8)
+ range2 = lldb.SBAddressRange(self.addr2, 16)
+ range3 = lldb.SBAddressRange(self.addr3, 32)
+
+ range_list = lldb.SBAddressRangeList()
+ self.assertEqual(range_list.GetSize(), 0)
+
+ range_list.Append(range1)
+ range_list.Append(range2)
+ range_list.Append(range3)
+ self.assertEqual(range_list.GetSize(), 3)
+ self.assertRaises(IndexError, lambda: range_list[3])
+
+ range1_copy = range_list.GetAddressRangeAtIndex(0)
+ self.assertEqual(range1.GetByteSize(), range1_copy.GetByteSize())
+ self.assertEqual(
+ range1.GetBaseAddress().GetOffset(),
+ range1_copy.GetBaseAddress().GetOffset(),
+ )
+
+ range2_copy = range_list.GetAddressRangeAtIndex(1)
+ self.assertEqual(range2.GetByteSize(), range2_copy.GetByteSize())
+ self.assertEqual(
+ range2.GetBaseAddress().GetOffset(),
+ range2_copy.GetBaseAddress().GetOffset(),
+ )
+
+ range3_copy = range_list.GetAddressRangeAtIndex(2)
+ self.assertEqual(range3.GetByteSize(), range3_copy.GetByteSize())
+ self.assertEqual(
+ range3.GetBaseAddress().GetOffset(),
+ range3_copy.GetBaseAddress().GetOffset(),
+ )
+
+ range_list.Clear()
+ self.assertEqual(range_list.GetSize(), 0)
+
+ def test_address_range_list_len(self):
+ """Make sure the len() operator works."""
+ range = lldb.SBAddressRange(self.addr1, 8)
+
+ range_list = lldb.SBAddressRangeList()
+ self.assertEqual(len(range_list), 0)
+
+ range_list.Append(range)
+ self.assertEqual(len(range_list), 1)
+
+ def test_address_range_list_iterator(self):
+ """Make sure the SBAddressRangeList iterator works."""
+ range1 = lldb.SBAddressRange(self.addr1, 8)
+ range2 = lldb.SBAddressRange(self.addr2, 16)
+ range3 = lldb.SBAddressRange(self.addr3, 32)
+
+ range_list = lldb.SBAddressRangeList()
+ range_list.Append(range1)
+ range_list.Append(range2)
+ range_list.Append(range3)
+ self.assertEqual(range_list.GetSize(), 3)
+
+ # Test the iterator
+ for range in range_list:
+ self.assertTrue(range.IsValid())
+
+ def test_address_range_print_invalid(self):
+ """Make sure the SBAddressRange can be printed when invalid."""
+ range = lldb.SBAddressRange()
+ self.assertEqual(str(range), "<invalid>")
+
+ def test_address_range_print_resolved(self):
+ """Make sure the SBAddressRange can be printed when resolved."""
+ lldb.target = self.target
+ error = lldb.SBError()
+ process = self.target.Launch(self.launch_info, error)
+ self.assertTrue(error.Success(), "Make sure process launched successfully")
+ self.assertTrue(process, PROCESS_IS_VALID)
+ self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
+
+ loc = self.bp1.GetLocationAtIndex(0)
+ loc_addr = loc.GetAddress()
+ func = loc_addr.GetFunction()
+ range = func.GetRanges().GetAddressRangeAtIndex(0)
+ range_str = str(range)
+ # [0x1000-0x2000] // Resolved with target or addresses without sections
+ self.assertRegex(range_str, "^\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")
+ process.Kill()
+
+ def test_address_range_print_no_section_resolved(self):
+ """Make sure the SBAddressRange can be printed with no secion."""
+ lldb.target = self.target
+ error = lldb.SBError()
+ process = self.target.Launch(self.launch_info, error)
+ self.assertTrue(error.Success(), "Make sure process launched successfully")
+ self.assertTrue(process, PROCESS_IS_VALID)
+ self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
+
+ loc = self.bp1.GetLocationAtIndex(0)
+ loc_addr = loc.GetAddress()
+ func = loc_addr.GetFunction()
+ range = func.GetRanges().GetAddressRangeAtIndex(0)
+
+ addr = lldb.SBAddress()
+ addr.SetAddress(lldb.SBSection(), range.GetBaseAddress().GetOffset())
+ self.assertFalse(addr.GetSection().IsValid())
+ range = lldb.SBAddressRange(addr, range.GetByteSize())
+
+ range_str = str(range)
+ # [0x1000-0x2000] // Resolved with target or addresses without sections
+ self.assertRegex(range_str, "^\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")
+ process.Kill()
+
+ def test_address_range_print_not_resolved(self):
+ """Make sure the SBAddressRange can be printed when not resolved."""
+ range = lldb.SBAddressRange(self.addr1, 8)
+ range_str = str(range)
+ # a.out[0x1000-0x2000] // Without target
+ self.assertRegex(range_str, "^a.out\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")
+
+ def test_address_range_list_print(self):
+ """Make sure the SBAddressRangeList can be printed."""
+ range1 = lldb.SBAddressRange(self.addr1, 8)
+ range2 = lldb.SBAddressRange(self.addr2, 16)
+ range3 = lldb.SBAddressRange(self.addr3, 32)
+ self.dbg.SetAsync(True)
+
+ range_list = lldb.SBAddressRangeList()
+ self.assertEqual(range_list.GetSize(), 0)
+
+ range_list.Append(range1)
+ range_list.Append(range2)
+ range_list.Append(range3)
+ self.assertEqual(range_list.GetSize(), 3)
+
+ range_list_str = str(range_list)
+ self.assertTrue(range_list_str.startswith("["))
+ self.assertGreater(range_list_str.count(","), 1)
+ self.assertTrue(range_list_str.endswith("]"))
+
+ def test_address_range_list_indexing(self):
+ """Make sure the SBAddressRangeList can be printed."""
+ range1 = lldb.SBAddressRange(self.addr1, 8)
+ range2 = lldb.SBAddressRange(self.addr2, 16)
+ range_list = lldb.SBAddressRangeList()
+ range_list.Append(range1)
+ range_list.Append(range2)
+
+ self.assertEqual(range_list.GetSize(), 2)
+ self.assertRaises(IndexError, lambda: range_list[2])
+ self.assertRaises(TypeError, lambda: range_list["0"])
+ self.assertEqual(range_list[0], range1)
+ self.assertEqual(range_list[1], range2)
+ self.assertEqual(range_list[-1], range2)
+ self.assertEqual(range_list[-2], range1)
diff --git a/lldb/test/API/python_api/address_range/main.cpp b/lldb/test/API/python_api/address_range/main.cpp
new file mode 100644
index 0000000..b6eaec4
--- /dev/null
+++ b/lldb/test/API/python_api/address_range/main.cpp
@@ -0,0 +1,8 @@
+void foo() {}
+void bar() {}
+
+int main() {
+ foo();
+ bar();
+ return 0;
+}