199451b44SJordan Rupprechtimport lldb
299451b44SJordan Rupprechtimport os
399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
499451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
599451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtclass TestWithGmodulesDebugInfo(TestBase):
999451b44SJordan Rupprecht
1099451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht    @skipIf(bugnumber="llvm.org/pr36146", oslist=["linux"], archs=["i386"])
1399451b44SJordan Rupprecht    @add_test_categories(["gmodules"])
1499451b44SJordan Rupprecht    def test_specialized_typedef_from_pch(self):
1599451b44SJordan Rupprecht        self.build()
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht        src_file = os.path.join(self.getSourceDir(), "main.cpp")
1899451b44SJordan Rupprecht        src_file_spec = lldb.SBFileSpec(src_file)
1999451b44SJordan Rupprecht        self.assertTrue(src_file_spec.IsValid(), "breakpoint file")
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht        # Get the path of the executable
2299451b44SJordan Rupprecht        exe_path = self.getBuildArtifact("a.out")
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht        # Load the executable
2599451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe_path)
2699451b44SJordan Rupprecht        self.assertTrue(target.IsValid(), VALID_TARGET)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Break on interesting line
2999451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateBySourceRegex(
3099451b44SJordan Rupprecht            "break here", src_file_spec)
3199451b44SJordan Rupprecht        self.assertTrue(
3299451b44SJordan Rupprecht            breakpoint.IsValid() and breakpoint.GetNumLocations() >= 1,
3399451b44SJordan Rupprecht            VALID_BREAKPOINT)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Launch the process
3699451b44SJordan Rupprecht        process = target.LaunchSimple(
3799451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
3899451b44SJordan Rupprecht        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # Get the thread of the process
41b3a0c4d7SRaphael Isemann        self.assertEquals(process.GetState(), lldb.eStateStopped)
4299451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
4399451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
4499451b44SJordan Rupprecht        self.assertTrue(
4599451b44SJordan Rupprecht            thread.IsValid(),
4699451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint condition")
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht        # Get frame for current thread
4999451b44SJordan Rupprecht        frame = thread.frames[0]
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        testValue = frame.EvaluateExpression("test")
5299451b44SJordan Rupprecht        self.assertTrue(
5399451b44SJordan Rupprecht            testValue.GetError().Success(),
5499451b44SJordan Rupprecht            "Test expression value invalid: %s" %
5599451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
56*0ed758b2SDave Lee        self.assertEqual(
57*0ed758b2SDave Lee            testValue.GetTypeName(), "IntContainer",
5899451b44SJordan Rupprecht            "Test expression type incorrect")
5999451b44SJordan Rupprecht
6099451b44SJordan Rupprecht        memberValue = testValue.GetChildMemberWithName("storage")
6199451b44SJordan Rupprecht        self.assertTrue(
6299451b44SJordan Rupprecht            memberValue.GetError().Success(),
6399451b44SJordan Rupprecht            "Member value missing or invalid: %s" %
6499451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
65*0ed758b2SDave Lee        self.assertEqual(
66*0ed758b2SDave Lee            memberValue.GetTypeName(), "int",
6799451b44SJordan Rupprecht            "Member type incorrect")
6899451b44SJordan Rupprecht        self.assertEqual(
6999451b44SJordan Rupprecht            42,
7099451b44SJordan Rupprecht            memberValue.GetValueAsSigned(),
7199451b44SJordan Rupprecht            "Member value incorrect")
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        testValue = frame.EvaluateExpression("bar")
7499451b44SJordan Rupprecht        self.assertTrue(
7599451b44SJordan Rupprecht            testValue.GetError().Success(),
7699451b44SJordan Rupprecht            "Test expression value invalid: %s" %
7799451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
78*0ed758b2SDave Lee        self.assertEqual(
79*0ed758b2SDave Lee            testValue.GetTypeName(), "Foo::Bar",
8099451b44SJordan Rupprecht            "Test expression type incorrect")
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        memberValue = testValue.GetChildMemberWithName("i")
8399451b44SJordan Rupprecht        self.assertTrue(
8499451b44SJordan Rupprecht            memberValue.GetError().Success(),
8599451b44SJordan Rupprecht            "Member value missing or invalid: %s" %
8699451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
87*0ed758b2SDave Lee        self.assertEqual(
88*0ed758b2SDave Lee            memberValue.GetTypeName(), "int",
8999451b44SJordan Rupprecht            "Member type incorrect")
9099451b44SJordan Rupprecht        self.assertEqual(
9199451b44SJordan Rupprecht            123,
9299451b44SJordan Rupprecht            memberValue.GetValueAsSigned(),
9399451b44SJordan Rupprecht            "Member value incorrect")
9499451b44SJordan Rupprecht
95