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