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    @skipIf(bugnumber="llvm.org/pr36146", oslist=["linux"], archs=["i386"])
1199451b44SJordan Rupprecht    @add_test_categories(["gmodules"])
1299451b44SJordan Rupprecht    def test_specialized_typedef_from_pch(self):
1399451b44SJordan Rupprecht        self.build()
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht        src_file = os.path.join(self.getSourceDir(), "main.cpp")
1699451b44SJordan Rupprecht        src_file_spec = lldb.SBFileSpec(src_file)
1799451b44SJordan Rupprecht        self.assertTrue(src_file_spec.IsValid(), "breakpoint file")
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht        # Get the path of the executable
2099451b44SJordan Rupprecht        exe_path = self.getBuildArtifact("a.out")
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        # Load the executable
2399451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe_path)
2499451b44SJordan Rupprecht        self.assertTrue(target.IsValid(), VALID_TARGET)
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht        # Break on interesting line
2799451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateBySourceRegex(
2899451b44SJordan Rupprecht            "break here", src_file_spec)
2999451b44SJordan Rupprecht        self.assertTrue(
3099451b44SJordan Rupprecht            breakpoint.IsValid() and breakpoint.GetNumLocations() >= 1,
3199451b44SJordan Rupprecht            VALID_BREAKPOINT)
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        # Launch the process
3499451b44SJordan Rupprecht        process = target.LaunchSimple(
3599451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
3699451b44SJordan Rupprecht        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # Get the thread of the process
39*ce825e46SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateStopped)
4099451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
4199451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
4299451b44SJordan Rupprecht        self.assertTrue(
4399451b44SJordan Rupprecht            thread.IsValid(),
4499451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint condition")
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        # Get frame for current thread
4799451b44SJordan Rupprecht        frame = thread.frames[0]
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        testValue = frame.EvaluateExpression("test")
5099451b44SJordan Rupprecht        self.assertTrue(
5199451b44SJordan Rupprecht            testValue.GetError().Success(),
5299451b44SJordan Rupprecht            "Test expression value invalid: %s" %
5399451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
540ed758b2SDave Lee        self.assertEqual(
550ed758b2SDave Lee            testValue.GetTypeName(), "IntContainer",
5699451b44SJordan Rupprecht            "Test expression type incorrect")
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        memberValue = testValue.GetChildMemberWithName("storage")
5999451b44SJordan Rupprecht        self.assertTrue(
6099451b44SJordan Rupprecht            memberValue.GetError().Success(),
6199451b44SJordan Rupprecht            "Member value missing or invalid: %s" %
6299451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
630ed758b2SDave Lee        self.assertEqual(
640ed758b2SDave Lee            memberValue.GetTypeName(), "int",
6599451b44SJordan Rupprecht            "Member type incorrect")
6699451b44SJordan Rupprecht        self.assertEqual(
6799451b44SJordan Rupprecht            42,
6899451b44SJordan Rupprecht            memberValue.GetValueAsSigned(),
6999451b44SJordan Rupprecht            "Member value incorrect")
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht        testValue = frame.EvaluateExpression("bar")
7299451b44SJordan Rupprecht        self.assertTrue(
7399451b44SJordan Rupprecht            testValue.GetError().Success(),
7499451b44SJordan Rupprecht            "Test expression value invalid: %s" %
7599451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
760ed758b2SDave Lee        self.assertEqual(
770ed758b2SDave Lee            testValue.GetTypeName(), "Foo::Bar",
7899451b44SJordan Rupprecht            "Test expression type incorrect")
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        memberValue = testValue.GetChildMemberWithName("i")
8199451b44SJordan Rupprecht        self.assertTrue(
8299451b44SJordan Rupprecht            memberValue.GetError().Success(),
8399451b44SJordan Rupprecht            "Member value missing or invalid: %s" %
8499451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
850ed758b2SDave Lee        self.assertEqual(
860ed758b2SDave Lee            memberValue.GetTypeName(), "int",
8799451b44SJordan Rupprecht            "Member type incorrect")
8899451b44SJordan Rupprecht        self.assertEqual(
8999451b44SJordan Rupprecht            123,
9099451b44SJordan Rupprecht            memberValue.GetValueAsSigned(),
9199451b44SJordan Rupprecht            "Member value incorrect")
9299451b44SJordan Rupprecht
93