xref: /llvm-project/lldb/test/API/functionalities/multiple-slides/TestMultipleSlides.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
11fee2562SJason Molenda"""
21fee2562SJason MolendaTest that a binary can be slid to different load addresses correctly
31fee2562SJason Molenda"""
41fee2562SJason Molenda
51fee2562SJason Molenda
61fee2562SJason Molendaimport lldb
71fee2562SJason Molendafrom lldbsuite.test.decorators import *
81fee2562SJason Molendafrom lldbsuite.test.lldbtest import *
91fee2562SJason Molendafrom lldbsuite.test import lldbutil
101fee2562SJason Molenda
111fee2562SJason Molenda
121fee2562SJason Molendaclass MultipleSlidesTestCase(TestBase):
131fee2562SJason Molenda    NO_DEBUG_INFO_TESTCASE = True
14*2238dcc3SJonas Devlieghere
151fee2562SJason Molenda    def test_mulitple_slides(self):
161fee2562SJason Molenda        """Test that a binary can be slid multiple times correctly."""
171fee2562SJason Molenda        self.build()
181fee2562SJason Molenda        exe = self.getBuildArtifact("a.out")
191fee2562SJason Molenda        err = lldb.SBError()
201fee2562SJason Molenda        load_dependent_modules = False
21*2238dcc3SJonas Devlieghere        target = self.dbg.CreateTarget(exe, "", "", load_dependent_modules, err)
221fee2562SJason Molenda        self.assertTrue(target.IsValid())
231fee2562SJason Molenda        module = target.GetModuleAtIndex(0)
241fee2562SJason Molenda        self.assertTrue(module.IsValid())
251fee2562SJason Molenda
261fee2562SJason Molenda        first_sym = target.FindSymbols("first").GetContextAtIndex(0).GetSymbol()
271fee2562SJason Molenda        second_sym = target.FindSymbols("second").GetContextAtIndex(0).GetSymbol()
28*2238dcc3SJonas Devlieghere        first_size = (
29*2238dcc3SJonas Devlieghere            first_sym.GetEndAddress().GetOffset()
30*2238dcc3SJonas Devlieghere            - first_sym.GetStartAddress().GetOffset()
31*2238dcc3SJonas Devlieghere        )
32*2238dcc3SJonas Devlieghere        second_size = (
33*2238dcc3SJonas Devlieghere            second_sym.GetEndAddress().GetOffset()
34*2238dcc3SJonas Devlieghere            - second_sym.GetStartAddress().GetOffset()
35*2238dcc3SJonas Devlieghere        )
361fee2562SJason Molenda
371fee2562SJason Molenda        # View the first element of `first` and `second` while
381fee2562SJason Molenda        # they have no load address set.
39*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])
40*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])
41*2238dcc3SJonas Devlieghere        self.assertEqual(
42*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetLoadAddress(target),
43*2238dcc3SJonas Devlieghere            lldb.LLDB_INVALID_ADDRESS,
44*2238dcc3SJonas Devlieghere        )
45*2238dcc3SJonas Devlieghere        self.assertEqual(
46*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetLoadAddress(target),
47*2238dcc3SJonas Devlieghere            lldb.LLDB_INVALID_ADDRESS,
48*2238dcc3SJonas Devlieghere        )
491fee2562SJason Molenda
501fee2562SJason Molenda        # View the first element of `first` and `second` with
511fee2562SJason Molenda        # no slide applied, but with load address set.
521fee2562SJason Molenda        #
531fee2562SJason Molenda        # In memory, we have something like
541fee2562SJason Molenda        #    0x1000 - 0x17ff  first[]
551fee2562SJason Molenda        #    0x1800 - 0x1fff  second[]
56ea95da18SJonas Devlieghere        error = target.SetModuleLoadAddress(module, 0)
57ea95da18SJonas Devlieghere        self.assertSuccess(error)
58*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])
59*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])
60*2238dcc3SJonas Devlieghere        self.assertEqual(
61*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetLoadAddress(target),
62*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetFileAddress(),
63*2238dcc3SJonas Devlieghere        )
64*2238dcc3SJonas Devlieghere        self.assertEqual(
65*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetLoadAddress(target),
66*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetFileAddress(),
67*2238dcc3SJonas Devlieghere        )
681fee2562SJason Molenda
691fee2562SJason Molenda        # Slide it a little bit less than the size of the first array.
701fee2562SJason Molenda        #
711fee2562SJason Molenda        # In memory, we have something like
721fee2562SJason Molenda        #    0xfc0 - 0x17bf  first[]
731fee2562SJason Molenda        #    0x17c0 - 0x1fbf second[]
741fee2562SJason Molenda        #
751fee2562SJason Molenda        # but if the original entries are still present in lldb,
761fee2562SJason Molenda        # the beginning address of second[] will get a load address
771fee2562SJason Molenda        # of 0x1800, instead of 0x17c0 (0x1800-64) as we need to get.
78ea95da18SJonas Devlieghere        error = target.SetModuleLoadAddress(module, first_size - 64)
79ea95da18SJonas Devlieghere        self.assertSuccess(error)
80*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])
81*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])
82*2238dcc3SJonas Devlieghere        self.assertNotEqual(
83*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetLoadAddress(target),
84*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetFileAddress(),
85*2238dcc3SJonas Devlieghere        )
86*2238dcc3SJonas Devlieghere        self.assertNotEqual(
87*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetLoadAddress(target),
88*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetFileAddress(),
89*2238dcc3SJonas Devlieghere        )
901fee2562SJason Molenda
911fee2562SJason Molenda        # Slide it back to the original vmaddr.
92ea95da18SJonas Devlieghere        error = target.SetModuleLoadAddress(module, 0)
93ea95da18SJonas Devlieghere        self.assertSuccess(error)
94*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&first)[0]", substrs=["= 5"])
95*2238dcc3SJonas Devlieghere        self.expect("expression/d ((int*)&second)[0]", substrs=["= 6"])
96*2238dcc3SJonas Devlieghere        self.assertEqual(
97*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetLoadAddress(target),
98*2238dcc3SJonas Devlieghere            first_sym.GetStartAddress().GetFileAddress(),
99*2238dcc3SJonas Devlieghere        )
100*2238dcc3SJonas Devlieghere        self.assertEqual(
101*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetLoadAddress(target),
102*2238dcc3SJonas Devlieghere            second_sym.GetStartAddress().GetFileAddress(),
103*2238dcc3SJonas Devlieghere        )
1041fee2562SJason Molenda
105ea95da18SJonas Devlieghere        # Make sure we can use a slide > INT64_MAX.
106*2238dcc3SJonas Devlieghere        error = target.SetModuleLoadAddress(module, 0xFFFFFFFF12345678)
107ea95da18SJonas Devlieghere        self.assertSuccess(error)
108