xref: /llvm-project/lldb/test/API/python_api/address_range/TestAddressRange.py (revision a083e50f53f0f9eb9ad0c5b65f3c627cf97043e6)
148175a5dSMiro Bucko"""
248175a5dSMiro BuckoTest SBAddressRange APIs.
348175a5dSMiro Bucko"""
448175a5dSMiro Bucko
548175a5dSMiro Buckoimport lldb
648175a5dSMiro Buckofrom lldbsuite.test.lldbtest import *
748175a5dSMiro Bucko
848175a5dSMiro Bucko
948175a5dSMiro Buckoclass AddressRangeTestCase(TestBase):
1048175a5dSMiro Bucko    NO_DEBUG_INFO_TESTCASE = True
1148175a5dSMiro Bucko
1248175a5dSMiro Bucko    def setUp(self):
1348175a5dSMiro Bucko        TestBase.setUp(self)
1448175a5dSMiro Bucko
1548175a5dSMiro Bucko        self.build()
1648175a5dSMiro Bucko        exe = self.getBuildArtifact("a.out")
1748175a5dSMiro Bucko
1848175a5dSMiro Bucko        self.target = self.dbg.CreateTarget(exe)
1948175a5dSMiro Bucko        self.assertTrue(self.target, VALID_TARGET)
2048175a5dSMiro Bucko        self.launch_info = self.target.GetLaunchInfo()
2148175a5dSMiro Bucko        self.launch_info.SetWorkingDirectory(self.get_process_working_directory())
2248175a5dSMiro Bucko
2348175a5dSMiro Bucko        self.bp1 = self.target.BreakpointCreateByName("main", "a.out")
2448175a5dSMiro Bucko        self.bp2 = self.target.BreakpointCreateByName("foo", "a.out")
2548175a5dSMiro Bucko        self.bp3 = self.target.BreakpointCreateByName("bar", "a.out")
2648175a5dSMiro Bucko
2748175a5dSMiro Bucko        self.assertTrue(self.bp1.IsValid())
2848175a5dSMiro Bucko        self.assertTrue(self.bp2.IsValid())
2948175a5dSMiro Bucko        self.assertTrue(self.bp3.IsValid())
3048175a5dSMiro Bucko
3148175a5dSMiro Bucko        self.addr1 = self.bp1.GetLocationAtIndex(0).GetAddress()
3248175a5dSMiro Bucko        self.addr2 = self.bp2.GetLocationAtIndex(0).GetAddress()
3348175a5dSMiro Bucko        self.addr3 = self.bp3.GetLocationAtIndex(0).GetAddress()
3448175a5dSMiro Bucko
3548175a5dSMiro Bucko        self.assertTrue(self.addr1.IsValid())
3648175a5dSMiro Bucko        self.assertTrue(self.addr2.IsValid())
3748175a5dSMiro Bucko        self.assertTrue(self.addr3.IsValid())
3848175a5dSMiro Bucko
3948175a5dSMiro Bucko    def test_address_range_default(self):
4048175a5dSMiro Bucko        """Testing default constructor."""
4148175a5dSMiro Bucko        empty_range = lldb.SBAddressRange()
4248175a5dSMiro Bucko        self.assertEqual(empty_range.IsValid(), False)
4348175a5dSMiro Bucko
4448175a5dSMiro Bucko    def test_address_range_construction(self):
4548175a5dSMiro Bucko        """Make sure the construction and getters work."""
4648175a5dSMiro Bucko        range = lldb.SBAddressRange(self.addr1, 8)
4748175a5dSMiro Bucko        self.assertEqual(range.IsValid(), True)
4848175a5dSMiro Bucko        self.assertEqual(range.GetBaseAddress(), self.addr1)
4948175a5dSMiro Bucko        self.assertEqual(range.GetByteSize(), 8)
5048175a5dSMiro Bucko
5148175a5dSMiro Bucko    def test_address_range_clear(self):
5248175a5dSMiro Bucko        """Make sure the clear method works."""
5348175a5dSMiro Bucko        range = lldb.SBAddressRange(self.addr1, 8)
5448175a5dSMiro Bucko        self.assertEqual(range.IsValid(), True)
5548175a5dSMiro Bucko        self.assertEqual(range.GetBaseAddress(), self.addr1)
5648175a5dSMiro Bucko        self.assertEqual(range.GetByteSize(), 8)
5748175a5dSMiro Bucko
5848175a5dSMiro Bucko        range.Clear()
5948175a5dSMiro Bucko        self.assertEqual(range.IsValid(), False)
6048175a5dSMiro Bucko
6148175a5dSMiro Bucko    def test_function(self):
6248175a5dSMiro Bucko        """Make sure the range works in SBFunction APIs."""
6348175a5dSMiro Bucko
6448175a5dSMiro Bucko        # Setup breakpoints in main
6548175a5dSMiro Bucko        loc = self.bp1.GetLocationAtIndex(0)
6648175a5dSMiro Bucko        loc_addr = loc.GetAddress()
6748175a5dSMiro Bucko        func = loc_addr.GetFunction()
6848175a5dSMiro Bucko        ranges = func.GetRanges()
6948175a5dSMiro Bucko        self.assertEqual(ranges.GetSize(), 1)
7048175a5dSMiro Bucko
7148175a5dSMiro Bucko        range = ranges.GetAddressRangeAtIndex(0)
7248175a5dSMiro Bucko        self.assertEqual(
7348175a5dSMiro Bucko            range.GetByteSize(),
7448175a5dSMiro Bucko            func.GetEndAddress().GetOffset() - func.GetStartAddress().GetOffset(),
7548175a5dSMiro Bucko        )
7648175a5dSMiro Bucko        self.assertEqual(
7748175a5dSMiro Bucko            range.GetBaseAddress().GetOffset(),
7848175a5dSMiro Bucko            func.GetStartAddress().GetOffset(),
7948175a5dSMiro Bucko        )
8048175a5dSMiro Bucko
8148175a5dSMiro Bucko    def test_block(self):
8248175a5dSMiro Bucko        """Make sure the range works in SBBlock APIs."""
8348175a5dSMiro Bucko        loc = self.bp1.GetLocationAtIndex(0)
8448175a5dSMiro Bucko        loc_addr = loc.GetAddress()
8548175a5dSMiro Bucko        block = loc_addr.GetBlock()
8648175a5dSMiro Bucko
8748175a5dSMiro Bucko        ranges = block.GetRanges()
8848175a5dSMiro Bucko        self.assertEqual(ranges.GetSize(), 1)
8948175a5dSMiro Bucko
9048175a5dSMiro Bucko        range = ranges.GetAddressRangeAtIndex(0)
9148175a5dSMiro Bucko        self.assertEqual(
9248175a5dSMiro Bucko            range.GetByteSize(),
9348175a5dSMiro Bucko            block.GetRangeEndAddress(0).GetOffset()
9448175a5dSMiro Bucko            - block.GetRangeStartAddress(0).GetOffset(),
9548175a5dSMiro Bucko        )
9648175a5dSMiro Bucko        self.assertEqual(
9748175a5dSMiro Bucko            range.GetBaseAddress().GetOffset(),
9848175a5dSMiro Bucko            block.GetRangeStartAddress(0).GetOffset(),
9948175a5dSMiro Bucko        )
10048175a5dSMiro Bucko
10148175a5dSMiro Bucko    def test_address_range_list(self):
10248175a5dSMiro Bucko        """Make sure the SBAddressRangeList works by adding and getting ranges."""
10348175a5dSMiro Bucko        range1 = lldb.SBAddressRange(self.addr1, 8)
10448175a5dSMiro Bucko        range2 = lldb.SBAddressRange(self.addr2, 16)
10548175a5dSMiro Bucko        range3 = lldb.SBAddressRange(self.addr3, 32)
10648175a5dSMiro Bucko
10748175a5dSMiro Bucko        range_list = lldb.SBAddressRangeList()
10848175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 0)
10948175a5dSMiro Bucko
11048175a5dSMiro Bucko        range_list.Append(range1)
11148175a5dSMiro Bucko        range_list.Append(range2)
11248175a5dSMiro Bucko        range_list.Append(range3)
11348175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 3)
11448175a5dSMiro Bucko        self.assertRaises(IndexError, lambda: range_list[3])
11548175a5dSMiro Bucko
11648175a5dSMiro Bucko        range1_copy = range_list.GetAddressRangeAtIndex(0)
11748175a5dSMiro Bucko        self.assertEqual(range1.GetByteSize(), range1_copy.GetByteSize())
11848175a5dSMiro Bucko        self.assertEqual(
11948175a5dSMiro Bucko            range1.GetBaseAddress().GetOffset(),
12048175a5dSMiro Bucko            range1_copy.GetBaseAddress().GetOffset(),
12148175a5dSMiro Bucko        )
12248175a5dSMiro Bucko
12348175a5dSMiro Bucko        range2_copy = range_list.GetAddressRangeAtIndex(1)
12448175a5dSMiro Bucko        self.assertEqual(range2.GetByteSize(), range2_copy.GetByteSize())
12548175a5dSMiro Bucko        self.assertEqual(
12648175a5dSMiro Bucko            range2.GetBaseAddress().GetOffset(),
12748175a5dSMiro Bucko            range2_copy.GetBaseAddress().GetOffset(),
12848175a5dSMiro Bucko        )
12948175a5dSMiro Bucko
13048175a5dSMiro Bucko        range3_copy = range_list.GetAddressRangeAtIndex(2)
13148175a5dSMiro Bucko        self.assertEqual(range3.GetByteSize(), range3_copy.GetByteSize())
13248175a5dSMiro Bucko        self.assertEqual(
13348175a5dSMiro Bucko            range3.GetBaseAddress().GetOffset(),
13448175a5dSMiro Bucko            range3_copy.GetBaseAddress().GetOffset(),
13548175a5dSMiro Bucko        )
13648175a5dSMiro Bucko
13748175a5dSMiro Bucko        range_list.Clear()
13848175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 0)
13948175a5dSMiro Bucko
14048175a5dSMiro Bucko    def test_address_range_list_len(self):
14148175a5dSMiro Bucko        """Make sure the len() operator works."""
14248175a5dSMiro Bucko        range = lldb.SBAddressRange(self.addr1, 8)
14348175a5dSMiro Bucko
14448175a5dSMiro Bucko        range_list = lldb.SBAddressRangeList()
14548175a5dSMiro Bucko        self.assertEqual(len(range_list), 0)
14648175a5dSMiro Bucko
14748175a5dSMiro Bucko        range_list.Append(range)
14848175a5dSMiro Bucko        self.assertEqual(len(range_list), 1)
14948175a5dSMiro Bucko
15048175a5dSMiro Bucko    def test_address_range_list_iterator(self):
15148175a5dSMiro Bucko        """Make sure the SBAddressRangeList iterator works."""
15248175a5dSMiro Bucko        range1 = lldb.SBAddressRange(self.addr1, 8)
15348175a5dSMiro Bucko        range2 = lldb.SBAddressRange(self.addr2, 16)
15448175a5dSMiro Bucko        range3 = lldb.SBAddressRange(self.addr3, 32)
15548175a5dSMiro Bucko
15648175a5dSMiro Bucko        range_list = lldb.SBAddressRangeList()
15748175a5dSMiro Bucko        range_list.Append(range1)
15848175a5dSMiro Bucko        range_list.Append(range2)
15948175a5dSMiro Bucko        range_list.Append(range3)
16048175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 3)
16148175a5dSMiro Bucko
16248175a5dSMiro Bucko        # Test the iterator
16348175a5dSMiro Bucko        for range in range_list:
16448175a5dSMiro Bucko            self.assertTrue(range.IsValid())
16548175a5dSMiro Bucko
16648175a5dSMiro Bucko    def test_address_range_print_invalid(self):
16748175a5dSMiro Bucko        """Make sure the SBAddressRange can be printed when invalid."""
16848175a5dSMiro Bucko        range = lldb.SBAddressRange()
169*a083e50fSMiro Bucko        self.assertEqual(str(range), "[0xffffffffffffffff-0xffffffffffffffff)")
17048175a5dSMiro Bucko
17148175a5dSMiro Bucko    def test_address_range_print_resolved(self):
17248175a5dSMiro Bucko        """Make sure the SBAddressRange can be printed when resolved."""
17348175a5dSMiro Bucko        lldb.target = self.target
17448175a5dSMiro Bucko        error = lldb.SBError()
17548175a5dSMiro Bucko        process = self.target.Launch(self.launch_info, error)
17648175a5dSMiro Bucko        self.assertTrue(error.Success(), "Make sure process launched successfully")
17748175a5dSMiro Bucko        self.assertTrue(process, PROCESS_IS_VALID)
17848175a5dSMiro Bucko        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
17948175a5dSMiro Bucko        script = (
18048175a5dSMiro Bucko            "script "
18148175a5dSMiro Bucko            + "bp = lldb.target.GetBreakpointAtIndex(0);"
18248175a5dSMiro Bucko            + "loc = bp.GetLocationAtIndex(0);"
18348175a5dSMiro Bucko            + "loc_addr = loc.GetAddress();"
18448175a5dSMiro Bucko            + "func = loc_addr.GetFunction();"
18548175a5dSMiro Bucko            + "range = func.GetRanges().GetAddressRangeAtIndex(0);"
18648175a5dSMiro Bucko            + "print(range)"
18748175a5dSMiro Bucko        )
18848175a5dSMiro Bucko
18948175a5dSMiro Bucko        interp = self.dbg.GetCommandInterpreter()
19048175a5dSMiro Bucko        result = lldb.SBCommandReturnObject()
19148175a5dSMiro Bucko        interp.HandleCommand(script, result, False)
19248175a5dSMiro Bucko        self.assertTrue(result.Succeeded(), "script command succeeded")
19348175a5dSMiro Bucko        # [0x1000-0x2000] // Resolved with target or addresses without sections
194493eefc9SMiro Bucko        self.assertRegex(result.GetOutput(), "^\[0x[0-9a-f]+\-0x[0-9a-f]+\)")
19548175a5dSMiro Bucko        process.Kill()
19648175a5dSMiro Bucko
19748175a5dSMiro Bucko    def test_address_range_print_no_section_resolved(self):
19848175a5dSMiro Bucko        """Make sure the SBAddressRange can be printed with no secion."""
19948175a5dSMiro Bucko        lldb.target = self.target
20048175a5dSMiro Bucko        error = lldb.SBError()
20148175a5dSMiro Bucko        process = self.target.Launch(self.launch_info, error)
20248175a5dSMiro Bucko        self.assertTrue(error.Success(), "Make sure process launched successfully")
20348175a5dSMiro Bucko        self.assertTrue(process, PROCESS_IS_VALID)
20448175a5dSMiro Bucko        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
20548175a5dSMiro Bucko
20648175a5dSMiro Bucko        loc = self.bp1.GetLocationAtIndex(0)
20748175a5dSMiro Bucko        loc_addr = loc.GetAddress()
20848175a5dSMiro Bucko        func = loc_addr.GetFunction()
20948175a5dSMiro Bucko        range = func.GetRanges().GetAddressRangeAtIndex(0)
21048175a5dSMiro Bucko
21148175a5dSMiro Bucko        addr = lldb.SBAddress()
21248175a5dSMiro Bucko        addr.SetAddress(lldb.SBSection(), range.GetBaseAddress().GetOffset())
21348175a5dSMiro Bucko        self.assertFalse(addr.GetSection().IsValid())
21448175a5dSMiro Bucko        range = lldb.SBAddressRange(addr, range.GetByteSize())
21548175a5dSMiro Bucko
21648175a5dSMiro Bucko        range_str = str(range)
21748175a5dSMiro Bucko        # [0x1000-0x2000] // Resolved with target or addresses without sections
21848175a5dSMiro Bucko        self.assertRegex(range_str, "^\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")
21948175a5dSMiro Bucko        process.Kill()
22048175a5dSMiro Bucko
22148175a5dSMiro Bucko    def test_address_range_print_not_resolved(self):
22248175a5dSMiro Bucko        """Make sure the SBAddressRange can be printed when not resolved."""
22348175a5dSMiro Bucko        range = lldb.SBAddressRange(self.addr1, 8)
22448175a5dSMiro Bucko        range_str = str(range)
22548175a5dSMiro Bucko        # a.out[0x1000-0x2000] // Without target
22648175a5dSMiro Bucko        self.assertRegex(range_str, "^a.out\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")
22748175a5dSMiro Bucko
22848175a5dSMiro Bucko    def test_address_range_list_print(self):
22948175a5dSMiro Bucko        """Make sure the SBAddressRangeList can be printed."""
23048175a5dSMiro Bucko        range1 = lldb.SBAddressRange(self.addr1, 8)
23148175a5dSMiro Bucko        range2 = lldb.SBAddressRange(self.addr2, 16)
23248175a5dSMiro Bucko        range3 = lldb.SBAddressRange(self.addr3, 32)
23348175a5dSMiro Bucko        self.dbg.SetAsync(True)
23448175a5dSMiro Bucko
23548175a5dSMiro Bucko        range_list = lldb.SBAddressRangeList()
23648175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 0)
23748175a5dSMiro Bucko
23848175a5dSMiro Bucko        range_list.Append(range1)
23948175a5dSMiro Bucko        range_list.Append(range2)
24048175a5dSMiro Bucko        range_list.Append(range3)
24148175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 3)
24248175a5dSMiro Bucko
24348175a5dSMiro Bucko        range_list_str = str(range_list)
24448175a5dSMiro Bucko        self.assertTrue(range_list_str.startswith("["))
24548175a5dSMiro Bucko        self.assertGreater(range_list_str.count(","), 1)
24648175a5dSMiro Bucko        self.assertTrue(range_list_str.endswith("]"))
24748175a5dSMiro Bucko
24848175a5dSMiro Bucko    def test_address_range_list_indexing(self):
24948175a5dSMiro Bucko        """Make sure the SBAddressRangeList can be printed."""
25048175a5dSMiro Bucko        range1 = lldb.SBAddressRange(self.addr1, 8)
25148175a5dSMiro Bucko        range2 = lldb.SBAddressRange(self.addr2, 16)
25248175a5dSMiro Bucko        range_list = lldb.SBAddressRangeList()
25348175a5dSMiro Bucko        range_list.Append(range1)
25448175a5dSMiro Bucko        range_list.Append(range2)
25548175a5dSMiro Bucko
25648175a5dSMiro Bucko        self.assertEqual(range_list.GetSize(), 2)
25748175a5dSMiro Bucko        self.assertRaises(IndexError, lambda: range_list[2])
25848175a5dSMiro Bucko        self.assertRaises(TypeError, lambda: range_list["0"])
25948175a5dSMiro Bucko        self.assertEqual(range_list[0], range1)
26048175a5dSMiro Bucko        self.assertEqual(range_list[1], range2)
26148175a5dSMiro Bucko        self.assertEqual(range_list[-1], range2)
26248175a5dSMiro Bucko        self.assertEqual(range_list[-2], range1)
263