199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest the solution to issue 11581. 399451b44SJordan Rupprechtvalobj.AddressOf() returns None when an address is 499451b44SJordan Rupprechtexpected in a SyntheticChildrenProvider 599451b44SJordan Rupprecht""" 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport lldb 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass Issue11581TestCase(TestBase): 158bd1988eSStella Stamenova @skipIfWindows # This test is now flaky on windows, see llvm.org/pr24778 1699451b44SJordan Rupprecht def test_11581_commands(self): 1799451b44SJordan Rupprecht # This is the function to remove the custom commands in order to have a 1899451b44SJordan Rupprecht # clean slate for the next test case. 1999451b44SJordan Rupprecht def cleanup(): 20*2238dcc3SJonas Devlieghere self.runCmd("type synthetic clear", check=False) 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 2399451b44SJordan Rupprecht self.addTearDownHook(cleanup) 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht """valobj.AddressOf() should return correct values.""" 2699451b44SJordan Rupprecht self.build() 2799451b44SJordan Rupprecht 28*2238dcc3SJonas Devlieghere (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 29*2238dcc3SJonas Devlieghere self, "Set breakpoint here.", lldb.SBFileSpec("main.cpp", False) 30*2238dcc3SJonas Devlieghere ) 3199451b44SJordan Rupprecht self.runCmd("command script import --allow-reload s11588.py") 3299451b44SJordan Rupprecht self.runCmd( 33*2238dcc3SJonas Devlieghere "type synthetic add --python-class s11588.Issue11581SyntheticProvider StgClosure" 34*2238dcc3SJonas Devlieghere ) 3599451b44SJordan Rupprecht 36*2238dcc3SJonas Devlieghere self.expect( 37*2238dcc3SJonas Devlieghere "expr --show-types -- *((StgClosure*)(r14-1))", 38*2238dcc3SJonas Devlieghere substrs=[ 39*2238dcc3SJonas Devlieghere "(StgClosure) $", 40*2238dcc3SJonas Devlieghere "(StgClosure *) &$", 41*2238dcc3SJonas Devlieghere "0x", 4299451b44SJordan Rupprecht "addr = ", 43*2238dcc3SJonas Devlieghere "load_address = ", 44*2238dcc3SJonas Devlieghere ], 45*2238dcc3SJonas Devlieghere ) 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht # register r14 is an x86_64 extension let's skip this part of the test 4899451b44SJordan Rupprecht # if we are on a different architecture 49*2238dcc3SJonas Devlieghere if self.getArchitecture() == "x86_64": 5099451b44SJordan Rupprecht target = self.dbg.GetSelectedTarget() 5199451b44SJordan Rupprecht process = target.GetProcess() 5299451b44SJordan Rupprecht frame = process.GetSelectedThread().GetSelectedFrame() 5399451b44SJordan Rupprecht pointer = frame.FindVariable("r14") 5499451b44SJordan Rupprecht addr = pointer.GetValueAsUnsigned(0) 55b3a0c4d7SRaphael Isemann self.assertNotEqual(addr, 0, "could not read pointer to StgClosure") 5699451b44SJordan Rupprecht addr = addr - 1 5799451b44SJordan Rupprecht self.runCmd("register write r14 %d" % addr) 5899451b44SJordan Rupprecht self.expect( 59*2238dcc3SJonas Devlieghere "register read r14", substrs=["0x", hex(addr)[2:].rstrip("L")] 60*2238dcc3SJonas Devlieghere ) # Remove trailing 'L' if it exists 61*2238dcc3SJonas Devlieghere self.expect( 62*2238dcc3SJonas Devlieghere "expr --show-types -- *(StgClosure*)$r14", 63*2238dcc3SJonas Devlieghere substrs=[ 64*2238dcc3SJonas Devlieghere "(StgClosure) $", 65*2238dcc3SJonas Devlieghere "(StgClosure *) &$", 66*2238dcc3SJonas Devlieghere "0x", 6799451b44SJordan Rupprecht hex(addr)[2:].rstrip("L"), 6899451b44SJordan Rupprecht "addr = ", 6999451b44SJordan Rupprecht str(addr), 7099451b44SJordan Rupprecht "load_address = ", 71*2238dcc3SJonas Devlieghere str(addr), 72*2238dcc3SJonas Devlieghere ], 73*2238dcc3SJonas Devlieghere ) 74