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
41*ce825e46SJonas Devlieghere        self.assertState(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()))
560ed758b2SDave Lee        self.assertEqual(
570ed758b2SDave 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()))
650ed758b2SDave Lee        self.assertEqual(
660ed758b2SDave 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()))
780ed758b2SDave Lee        self.assertEqual(
790ed758b2SDave 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()))
870ed758b2SDave Lee        self.assertEqual(
880ed758b2SDave 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