xref: /llvm-project/lldb/test/API/macosx/ctf/TestCTF.py (revision fd4399cb11f4069888bc7eac01f74493b5a2af48)
1ee44310aSJonas Devlieghereimport lldbsuite.test.lldbutil as lldbutil
2ee44310aSJonas Devliegherefrom lldbsuite.test.lldbtest import *
3ee44310aSJonas Devliegherefrom lldbsuite.test.decorators import *
4ee44310aSJonas Devlieghereimport shutil
5ee44310aSJonas Devlieghereimport os
6ee44310aSJonas Devlieghere
7ee44310aSJonas Devlieghere
8ee44310aSJonas Devlieghereclass TestCTF(TestBase):
9ee44310aSJonas Devlieghere    NO_DEBUG_INFO_TESTCASE = True
10ee44310aSJonas Devlieghere
11ee44310aSJonas Devlieghere    def no_ctf_convert(self):
12ee44310aSJonas Devlieghere        if not shutil.which("ctfconvert"):
13ee44310aSJonas Devlieghere            return "ctfconvert not found in path"
14ee44310aSJonas Devlieghere        return None
15ee44310aSJonas Devlieghere
16ee44310aSJonas Devlieghere    def no_objcopy(self):
17ee44310aSJonas Devlieghere        if not "OBJCOPY" in os.environ:
18ee44310aSJonas Devlieghere            return "llvm-objcopy not found in environment"
19ee44310aSJonas Devlieghere        return None
20ee44310aSJonas Devlieghere
21b716d4e5SJonas Devlieghere    @skipTestIfFn(no_ctf_convert)
22b716d4e5SJonas Devlieghere    @skipTestIfFn(no_objcopy)
23b716d4e5SJonas Devlieghere    @skipUnlessDarwin
240e285a13SJonas Devlieghere    def test(self):
250e285a13SJonas Devlieghere        self.build()
260e285a13SJonas Devlieghere        self.do_test()
270e285a13SJonas Devlieghere
28ee44310aSJonas Devlieghere    @skipTestIfFn(no_ctf_convert)
29ee44310aSJonas Devlieghere    @skipTestIfFn(no_objcopy)
30ee44310aSJonas Devlieghere    @skipUnlessDarwin
31b716d4e5SJonas Devlieghere    def test_compressed(self):
32b716d4e5SJonas Devlieghere        self.build(dictionary={"COMPRESS_CTF": "YES"})
33b716d4e5SJonas Devlieghere        self.do_test()
34b716d4e5SJonas Devlieghere
350e285a13SJonas Devlieghere    def do_test(self):
36ee44310aSJonas Devlieghere        lldbutil.run_to_name_breakpoint(self, "printf")
37ee44310aSJonas Devlieghere
38ee44310aSJonas Devlieghere        symbol_file = self.getBuildArtifact("a.ctf")
39ee44310aSJonas Devlieghere
40b9867df6SJonas Devlieghere        if self.TraceOn():
41b9867df6SJonas Devlieghere            self.runCmd("log enable -v lldb symbol")
42b9867df6SJonas Devlieghere
43ee44310aSJonas Devlieghere        self.runCmd("target symbols add {}".format(symbol_file))
44ee44310aSJonas Devlieghere        self.expect(
45ee44310aSJonas Devlieghere            "target variable foo",
46ee44310aSJonas Devlieghere            substrs=[
47ee44310aSJonas Devlieghere                "(MyStructT) foo",
48ee44310aSJonas Devlieghere                "i = 1",
49ee44310aSJonas Devlieghere                "foo",
50ee44310aSJonas Devlieghere                "'c'",
51ee44310aSJonas Devlieghere                "[0] = 'c'",
52ee44310aSJonas Devlieghere                "[1] = 'a'",
53ee44310aSJonas Devlieghere                "[2] = 'b'",
54ee44310aSJonas Devlieghere                "[3] = 'c'",
55ee44310aSJonas Devlieghere                'u = (i = 1, s = "")',
56*fd4399cbSJonas Devlieghere                "b = false",
57ee44310aSJonas Devlieghere                "f = 0x0000000000000000",
58ee44310aSJonas Devlieghere            ],
59ee44310aSJonas Devlieghere        )
60ee44310aSJonas Devlieghere        self.expect("target variable foo.n.i", substrs=["(MyInt) foo.n.i = 1"])
61ee44310aSJonas Devlieghere        self.expect(
62ee44310aSJonas Devlieghere            "target variable foo.n.s", substrs=["(const char *) foo.n.s", '"foo"']
63ee44310aSJonas Devlieghere        )
64ee44310aSJonas Devlieghere        self.expect(
65ee44310aSJonas Devlieghere            "target variable foo.n.c", substrs=["(volatile char) foo.n.c = 'c'"]
66ee44310aSJonas Devlieghere        )
67ee44310aSJonas Devlieghere        self.expect(
68ee44310aSJonas Devlieghere            "target variable foo.n.a",
69ee44310aSJonas Devlieghere            substrs=[
70ee44310aSJonas Devlieghere                "(char[4]:8) foo.n.a",
71ee44310aSJonas Devlieghere                "[0] = 'c'",
72ee44310aSJonas Devlieghere                "[1] = 'a'",
73ee44310aSJonas Devlieghere                "[2] = 'b'",
74ee44310aSJonas Devlieghere                "[3] = 'c'",
75ee44310aSJonas Devlieghere            ],
76ee44310aSJonas Devlieghere        )
77ee44310aSJonas Devlieghere        self.expect(
78ee44310aSJonas Devlieghere            "target variable foo.n.u", substrs=['(MyUnionT) foo.n.u = (i = 1, s = "")']
79ee44310aSJonas Devlieghere        )
80ee44310aSJonas Devlieghere        self.expect(
81ee44310aSJonas Devlieghere            "target variable foo.f",
82ee44310aSJonas Devlieghere            substrs=["(void (*)(int)) foo.f = 0x0000000000000000"],
83ee44310aSJonas Devlieghere        )
840a5e0d3fSJonas Devlieghere
850a5e0d3fSJonas Devlieghere        self.expect(
860a5e0d3fSJonas Devlieghere            "type lookup MyEnum",
870a5e0d3fSJonas Devlieghere            substrs=[
880a5e0d3fSJonas Devlieghere                "enum MyEnum {",
890a5e0d3fSJonas Devlieghere                "eOne,",
900a5e0d3fSJonas Devlieghere                "eTwo,",
910a5e0d3fSJonas Devlieghere                "eThree",
920a5e0d3fSJonas Devlieghere                "}",
930a5e0d3fSJonas Devlieghere            ],
940a5e0d3fSJonas Devlieghere        )
9512f3d97fSJonas Devlieghere
9612f3d97fSJonas Devlieghere        self.expect("type lookup RecursiveStruct", substrs=["RecursiveStruct *n;"])
97