xref: /llvm-project/lldb/test/API/lang/cpp/gmodules/basic/TestWithModuleDebugging.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
13b44c9afSMichael Buchimport lldb
23b44c9afSMichael Buchimport os
33b44c9afSMichael Buchfrom lldbsuite.test.decorators import *
43b44c9afSMichael Buchfrom lldbsuite.test.lldbtest import *
53b44c9afSMichael Buchfrom lldbsuite.test import lldbutil
63b44c9afSMichael Buch
73b44c9afSMichael Buch
83b44c9afSMichael Buchclass TestWithGmodulesDebugInfo(TestBase):
93b44c9afSMichael Buch    @skipIf(bugnumber="llvm.org/pr36146", oslist=["linux"], archs=["i386"])
103b44c9afSMichael Buch    @add_test_categories(["gmodules"])
113b44c9afSMichael Buch    def test_specialized_typedef_from_pch(self):
123b44c9afSMichael Buch        self.build()
133b44c9afSMichael Buch
143b44c9afSMichael Buch        src_file = os.path.join(self.getSourceDir(), "main.cpp")
153b44c9afSMichael Buch        src_file_spec = lldb.SBFileSpec(src_file)
163b44c9afSMichael Buch        self.assertTrue(src_file_spec.IsValid(), "breakpoint file")
173b44c9afSMichael Buch
183b44c9afSMichael Buch        # Get the path of the executable
193b44c9afSMichael Buch        exe_path = self.getBuildArtifact("a.out")
203b44c9afSMichael Buch
213b44c9afSMichael Buch        # Load the executable
223b44c9afSMichael Buch        target = self.dbg.CreateTarget(exe_path)
233b44c9afSMichael Buch        self.assertTrue(target.IsValid(), VALID_TARGET)
243b44c9afSMichael Buch
253b44c9afSMichael Buch        # Break on interesting line
26*2238dcc3SJonas Devlieghere        breakpoint = target.BreakpointCreateBySourceRegex("break here", src_file_spec)
273b44c9afSMichael Buch        self.assertTrue(
28*2238dcc3SJonas Devlieghere            breakpoint.IsValid() and breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT
29*2238dcc3SJonas Devlieghere        )
303b44c9afSMichael Buch
313b44c9afSMichael Buch        # Launch the process
32*2238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
333b44c9afSMichael Buch        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
343b44c9afSMichael Buch
353b44c9afSMichael Buch        # Get the thread of the process
363b44c9afSMichael Buch        self.assertState(process.GetState(), lldb.eStateStopped)
37*2238dcc3SJonas Devlieghere        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
383b44c9afSMichael Buch        self.assertTrue(
393b44c9afSMichael Buch            thread.IsValid(),
40*2238dcc3SJonas Devlieghere            "There should be a thread stopped due to breakpoint condition",
41*2238dcc3SJonas Devlieghere        )
423b44c9afSMichael Buch
433b44c9afSMichael Buch        # Get frame for current thread
443b44c9afSMichael Buch        frame = thread.frames[0]
453b44c9afSMichael Buch
463b44c9afSMichael Buch        testValue = frame.EvaluateExpression("test")
473b44c9afSMichael Buch        self.assertTrue(
483b44c9afSMichael Buch            testValue.GetError().Success(),
49*2238dcc3SJonas Devlieghere            "Test expression value invalid: %s" % (testValue.GetError().GetCString()),
50*2238dcc3SJonas Devlieghere        )
513b44c9afSMichael Buch        self.assertEqual(
52*2238dcc3SJonas Devlieghere            testValue.GetTypeName(), "IntContainer", "Test expression type incorrect"
53*2238dcc3SJonas Devlieghere        )
543b44c9afSMichael Buch
553b44c9afSMichael Buch        memberValue = testValue.GetChildMemberWithName("storage")
563b44c9afSMichael Buch        self.assertTrue(
573b44c9afSMichael Buch            memberValue.GetError().Success(),
58*2238dcc3SJonas Devlieghere            "Member value missing or invalid: %s" % (testValue.GetError().GetCString()),
59*2238dcc3SJonas Devlieghere        )
60*2238dcc3SJonas Devlieghere        self.assertEqual(memberValue.GetTypeName(), "int", "Member type incorrect")
61*2238dcc3SJonas Devlieghere        self.assertEqual(42, memberValue.GetValueAsSigned(), "Member value incorrect")
623b44c9afSMichael Buch
633b44c9afSMichael Buch        testValue = frame.EvaluateExpression("bar")
643b44c9afSMichael Buch        self.assertTrue(
653b44c9afSMichael Buch            testValue.GetError().Success(),
66*2238dcc3SJonas Devlieghere            "Test expression value invalid: %s" % (testValue.GetError().GetCString()),
67*2238dcc3SJonas Devlieghere        )
683b44c9afSMichael Buch        self.assertEqual(
69*2238dcc3SJonas Devlieghere            testValue.GetTypeName(), "Foo::Bar", "Test expression type incorrect"
70*2238dcc3SJonas Devlieghere        )
713b44c9afSMichael Buch
723b44c9afSMichael Buch        memberValue = testValue.GetChildMemberWithName("i")
733b44c9afSMichael Buch        self.assertTrue(
743b44c9afSMichael Buch            memberValue.GetError().Success(),
75*2238dcc3SJonas Devlieghere            "Member value missing or invalid: %s" % (testValue.GetError().GetCString()),
76*2238dcc3SJonas Devlieghere        )
77*2238dcc3SJonas Devlieghere        self.assertEqual(memberValue.GetTypeName(), "int", "Member type incorrect")
78*2238dcc3SJonas Devlieghere        self.assertEqual(123, memberValue.GetValueAsSigned(), "Member value incorrect")
79