brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · 3564022 Raw
263 lines · python
1"""2Test SBAddressRange APIs.3"""4 5import lldb6from lldbsuite.test.lldbtest import *7 8 9class AddressRangeTestCase(TestBase):10    NO_DEBUG_INFO_TESTCASE = True11 12    def setUp(self):13        TestBase.setUp(self)14 15        self.build()16        exe = self.getBuildArtifact("a.out")17 18        self.target = self.dbg.CreateTarget(exe)19        self.assertTrue(self.target, VALID_TARGET)20        self.launch_info = self.target.GetLaunchInfo()21        self.launch_info.SetWorkingDirectory(self.get_process_working_directory())22 23        self.bp1 = self.target.BreakpointCreateByName("main", "a.out")24        self.bp2 = self.target.BreakpointCreateByName("foo", "a.out")25        self.bp3 = self.target.BreakpointCreateByName("bar", "a.out")26 27        self.assertTrue(self.bp1.IsValid())28        self.assertTrue(self.bp2.IsValid())29        self.assertTrue(self.bp3.IsValid())30 31        self.addr1 = self.bp1.GetLocationAtIndex(0).GetAddress()32        self.addr2 = self.bp2.GetLocationAtIndex(0).GetAddress()33        self.addr3 = self.bp3.GetLocationAtIndex(0).GetAddress()34 35        self.assertTrue(self.addr1.IsValid())36        self.assertTrue(self.addr2.IsValid())37        self.assertTrue(self.addr3.IsValid())38 39    def test_address_range_default(self):40        """Testing default constructor."""41        empty_range = lldb.SBAddressRange()42        self.assertEqual(empty_range.IsValid(), False)43 44    def test_address_range_construction(self):45        """Make sure the construction and getters work."""46        range = lldb.SBAddressRange(self.addr1, 8)47        self.assertEqual(range.IsValid(), True)48        self.assertEqual(range.GetBaseAddress(), self.addr1)49        self.assertEqual(range.GetByteSize(), 8)50 51    def test_address_range_clear(self):52        """Make sure the clear method works."""53        range = lldb.SBAddressRange(self.addr1, 8)54        self.assertEqual(range.IsValid(), True)55        self.assertEqual(range.GetBaseAddress(), self.addr1)56        self.assertEqual(range.GetByteSize(), 8)57 58        range.Clear()59        self.assertEqual(range.IsValid(), False)60 61    def test_function(self):62        """Make sure the range works in SBFunction APIs."""63 64        # Setup breakpoints in main65        loc = self.bp1.GetLocationAtIndex(0)66        loc_addr = loc.GetAddress()67        func = loc_addr.GetFunction()68        ranges = func.GetRanges()69        self.assertEqual(ranges.GetSize(), 1)70 71        range = ranges.GetAddressRangeAtIndex(0)72        self.assertEqual(73            range.GetByteSize(),74            func.GetEndAddress().GetOffset() - func.GetStartAddress().GetOffset(),75        )76        self.assertEqual(77            range.GetBaseAddress().GetOffset(),78            func.GetStartAddress().GetOffset(),79        )80 81    def test_block(self):82        """Make sure the range works in SBBlock APIs."""83        loc = self.bp1.GetLocationAtIndex(0)84        loc_addr = loc.GetAddress()85        block = loc_addr.GetBlock()86 87        ranges = block.GetRanges()88        self.assertEqual(ranges.GetSize(), 1)89 90        range = ranges.GetAddressRangeAtIndex(0)91        self.assertEqual(92            range.GetByteSize(),93            block.GetRangeEndAddress(0).GetOffset()94            - block.GetRangeStartAddress(0).GetOffset(),95        )96        self.assertEqual(97            range.GetBaseAddress().GetOffset(),98            block.GetRangeStartAddress(0).GetOffset(),99        )100 101    def test_address_range_list(self):102        """Make sure the SBAddressRangeList works by adding and getting ranges."""103        range1 = lldb.SBAddressRange(self.addr1, 8)104        range2 = lldb.SBAddressRange(self.addr2, 16)105        range3 = lldb.SBAddressRange(self.addr3, 32)106 107        range_list = lldb.SBAddressRangeList()108        self.assertEqual(range_list.GetSize(), 0)109 110        range_list.Append(range1)111        range_list.Append(range2)112        range_list.Append(range3)113        self.assertEqual(range_list.GetSize(), 3)114        self.assertRaises(IndexError, lambda: range_list[3])115 116        range1_copy = range_list.GetAddressRangeAtIndex(0)117        self.assertEqual(range1.GetByteSize(), range1_copy.GetByteSize())118        self.assertEqual(119            range1.GetBaseAddress().GetOffset(),120            range1_copy.GetBaseAddress().GetOffset(),121        )122 123        range2_copy = range_list.GetAddressRangeAtIndex(1)124        self.assertEqual(range2.GetByteSize(), range2_copy.GetByteSize())125        self.assertEqual(126            range2.GetBaseAddress().GetOffset(),127            range2_copy.GetBaseAddress().GetOffset(),128        )129 130        range3_copy = range_list.GetAddressRangeAtIndex(2)131        self.assertEqual(range3.GetByteSize(), range3_copy.GetByteSize())132        self.assertEqual(133            range3.GetBaseAddress().GetOffset(),134            range3_copy.GetBaseAddress().GetOffset(),135        )136 137        range_list.Clear()138        self.assertEqual(range_list.GetSize(), 0)139 140    def test_address_range_list_len(self):141        """Make sure the len() operator works."""142        range = lldb.SBAddressRange(self.addr1, 8)143 144        range_list = lldb.SBAddressRangeList()145        self.assertEqual(len(range_list), 0)146 147        range_list.Append(range)148        self.assertEqual(len(range_list), 1)149 150    def test_address_range_list_iterator(self):151        """Make sure the SBAddressRangeList iterator works."""152        range1 = lldb.SBAddressRange(self.addr1, 8)153        range2 = lldb.SBAddressRange(self.addr2, 16)154        range3 = lldb.SBAddressRange(self.addr3, 32)155 156        range_list = lldb.SBAddressRangeList()157        range_list.Append(range1)158        range_list.Append(range2)159        range_list.Append(range3)160        self.assertEqual(range_list.GetSize(), 3)161 162        # Test the iterator163        for range in range_list:164            self.assertTrue(range.IsValid())165 166    def test_address_range_print_invalid(self):167        """Make sure the SBAddressRange can be printed when invalid."""168        range = lldb.SBAddressRange()169        self.assertEqual(str(range), "[0xffffffffffffffff-0xffffffffffffffff)")170 171    def test_address_range_print_resolved(self):172        """Make sure the SBAddressRange can be printed when resolved."""173        lldb.target = self.target174        error = lldb.SBError()175        process = self.target.Launch(self.launch_info, error)176        self.assertTrue(error.Success(), "Make sure process launched successfully")177        self.assertTrue(process, PROCESS_IS_VALID)178        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)179        script = (180            "script "181            + "bp = lldb.target.GetBreakpointAtIndex(0);"182            + "loc = bp.GetLocationAtIndex(0);"183            + "loc_addr = loc.GetAddress();"184            + "func = loc_addr.GetFunction();"185            + "range = func.GetRanges().GetAddressRangeAtIndex(0);"186            + "print(range)"187        )188 189        interp = self.dbg.GetCommandInterpreter()190        result = lldb.SBCommandReturnObject()191        interp.HandleCommand(script, result, False)192        self.assertTrue(result.Succeeded(), "script command succeeded")193        # [0x1000-0x2000] // Resolved with target or addresses without sections194        self.assertRegex(result.GetOutput(), r"^\[0x[0-9a-f]+\-0x[0-9a-f]+\)")195        process.Kill()196 197    def test_address_range_print_no_section_resolved(self):198        """Make sure the SBAddressRange can be printed with no secion."""199        lldb.target = self.target200        error = lldb.SBError()201        process = self.target.Launch(self.launch_info, error)202        self.assertTrue(error.Success(), "Make sure process launched successfully")203        self.assertTrue(process, PROCESS_IS_VALID)204        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)205 206        loc = self.bp1.GetLocationAtIndex(0)207        loc_addr = loc.GetAddress()208        func = loc_addr.GetFunction()209        range = func.GetRanges().GetAddressRangeAtIndex(0)210 211        addr = lldb.SBAddress()212        addr.SetAddress(lldb.SBSection(), range.GetBaseAddress().GetOffset())213        self.assertFalse(addr.GetSection().IsValid())214        range = lldb.SBAddressRange(addr, range.GetByteSize())215 216        range_str = str(range)217        # [0x1000-0x2000] // Resolved with target or addresses without sections218        self.assertRegex(range_str, r"^\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")219        process.Kill()220 221    def test_address_range_print_not_resolved(self):222        """Make sure the SBAddressRange can be printed when not resolved."""223        range = lldb.SBAddressRange(self.addr1, 8)224        range_str = str(range)225        # a.out[0x1000-0x2000] // Without target226        self.assertRegex(range_str, r"^a.out\[0x[0-9a-f]+\-0x[0-9a-f]+\)$")227 228    def test_address_range_list_print(self):229        """Make sure the SBAddressRangeList can be printed."""230        range1 = lldb.SBAddressRange(self.addr1, 8)231        range2 = lldb.SBAddressRange(self.addr2, 16)232        range3 = lldb.SBAddressRange(self.addr3, 32)233        self.dbg.SetAsync(True)234 235        range_list = lldb.SBAddressRangeList()236        self.assertEqual(range_list.GetSize(), 0)237 238        range_list.Append(range1)239        range_list.Append(range2)240        range_list.Append(range3)241        self.assertEqual(range_list.GetSize(), 3)242 243        range_list_str = str(range_list)244        self.assertTrue(range_list_str.startswith("["))245        self.assertGreater(range_list_str.count(","), 1)246        self.assertTrue(range_list_str.endswith("]"))247 248    def test_address_range_list_indexing(self):249        """Make sure the SBAddressRangeList can be printed."""250        range1 = lldb.SBAddressRange(self.addr1, 8)251        range2 = lldb.SBAddressRange(self.addr2, 16)252        range_list = lldb.SBAddressRangeList()253        range_list.Append(range1)254        range_list.Append(range2)255 256        self.assertEqual(range_list.GetSize(), 2)257        self.assertRaises(IndexError, lambda: range_list[2])258        self.assertRaises(TypeError, lambda: range_list["0"])259        self.assertEqual(range_list[0], range1)260        self.assertEqual(range_list[1], range2)261        self.assertEqual(range_list[-1], range2)262        self.assertEqual(range_list[-2], range1)263