1*99451b44SJordan Rupprechtimport lldb
2*99451b44SJordan Rupprechtimport os
3*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
4*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
5*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprechtclass TestWithGmodulesDebugInfo(TestBase):
9*99451b44SJordan Rupprecht
10*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht    @skipIf(bugnumber="llvm.org/pr36146", oslist=["linux"], archs=["i386"])
13*99451b44SJordan Rupprecht    @add_test_categories(["gmodules"])
14*99451b44SJordan Rupprecht    def test_specialized_typedef_from_pch(self):
15*99451b44SJordan Rupprecht        self.build()
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprecht        src_file = os.path.join(self.getSourceDir(), "main.cpp")
18*99451b44SJordan Rupprecht        src_file_spec = lldb.SBFileSpec(src_file)
19*99451b44SJordan Rupprecht        self.assertTrue(src_file_spec.IsValid(), "breakpoint file")
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprecht        # Get the path of the executable
22*99451b44SJordan Rupprecht        exe_path = self.getBuildArtifact("a.out")
23*99451b44SJordan Rupprecht
24*99451b44SJordan Rupprecht        # Load the executable
25*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe_path)
26*99451b44SJordan Rupprecht        self.assertTrue(target.IsValid(), VALID_TARGET)
27*99451b44SJordan Rupprecht
28*99451b44SJordan Rupprecht        # Break on interesting line
29*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateBySourceRegex(
30*99451b44SJordan Rupprecht            "break here", src_file_spec)
31*99451b44SJordan Rupprecht        self.assertTrue(
32*99451b44SJordan Rupprecht            breakpoint.IsValid() and breakpoint.GetNumLocations() >= 1,
33*99451b44SJordan Rupprecht            VALID_BREAKPOINT)
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht        # Launch the process
36*99451b44SJordan Rupprecht        process = target.LaunchSimple(
37*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
38*99451b44SJordan Rupprecht        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
39*99451b44SJordan Rupprecht
40*99451b44SJordan Rupprecht        # Get the thread of the process
41*99451b44SJordan Rupprecht        self.assertTrue(process.GetState() == lldb.eStateStopped)
42*99451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
43*99451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
44*99451b44SJordan Rupprecht        self.assertTrue(
45*99451b44SJordan Rupprecht            thread.IsValid(),
46*99451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint condition")
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        # Get frame for current thread
49*99451b44SJordan Rupprecht        frame = thread.frames[0]
50*99451b44SJordan Rupprecht
51*99451b44SJordan Rupprecht        testValue = frame.EvaluateExpression("test")
52*99451b44SJordan Rupprecht        self.assertTrue(
53*99451b44SJordan Rupprecht            testValue.GetError().Success(),
54*99451b44SJordan Rupprecht            "Test expression value invalid: %s" %
55*99451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
56*99451b44SJordan Rupprecht        self.assertTrue(
57*99451b44SJordan Rupprecht            testValue.GetTypeName() == "IntContainer",
58*99451b44SJordan Rupprecht            "Test expression type incorrect")
59*99451b44SJordan Rupprecht
60*99451b44SJordan Rupprecht        memberValue = testValue.GetChildMemberWithName("storage")
61*99451b44SJordan Rupprecht        self.assertTrue(
62*99451b44SJordan Rupprecht            memberValue.GetError().Success(),
63*99451b44SJordan Rupprecht            "Member value missing or invalid: %s" %
64*99451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
65*99451b44SJordan Rupprecht        self.assertTrue(
66*99451b44SJordan Rupprecht            memberValue.GetTypeName() == "int",
67*99451b44SJordan Rupprecht            "Member type incorrect")
68*99451b44SJordan Rupprecht        self.assertEqual(
69*99451b44SJordan Rupprecht            42,
70*99451b44SJordan Rupprecht            memberValue.GetValueAsSigned(),
71*99451b44SJordan Rupprecht            "Member value incorrect")
72*99451b44SJordan Rupprecht
73*99451b44SJordan Rupprecht        testValue = frame.EvaluateExpression("bar")
74*99451b44SJordan Rupprecht        self.assertTrue(
75*99451b44SJordan Rupprecht            testValue.GetError().Success(),
76*99451b44SJordan Rupprecht            "Test expression value invalid: %s" %
77*99451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
78*99451b44SJordan Rupprecht        self.assertTrue(
79*99451b44SJordan Rupprecht            testValue.GetTypeName() == "Foo::Bar",
80*99451b44SJordan Rupprecht            "Test expression type incorrect")
81*99451b44SJordan Rupprecht
82*99451b44SJordan Rupprecht        memberValue = testValue.GetChildMemberWithName("i")
83*99451b44SJordan Rupprecht        self.assertTrue(
84*99451b44SJordan Rupprecht            memberValue.GetError().Success(),
85*99451b44SJordan Rupprecht            "Member value missing or invalid: %s" %
86*99451b44SJordan Rupprecht            (testValue.GetError().GetCString()))
87*99451b44SJordan Rupprecht        self.assertTrue(
88*99451b44SJordan Rupprecht            memberValue.GetTypeName() == "int",
89*99451b44SJordan Rupprecht            "Member type incorrect")
90*99451b44SJordan Rupprecht        self.assertEqual(
91*99451b44SJordan Rupprecht            123,
92*99451b44SJordan Rupprecht            memberValue.GetValueAsSigned(),
93*99451b44SJordan Rupprecht            "Member value incorrect")
94*99451b44SJordan Rupprecht
95