import lldbsuite.test.lldbutil as lldbutil from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * import shutil import os class TestCTF(TestBase): NO_DEBUG_INFO_TESTCASE = True def no_ctf_convert(self): if not shutil.which("ctfconvert"): return "ctfconvert not found in path" return None def no_objcopy(self): if not "OBJCOPY" in os.environ: return "llvm-objcopy not found in environment" return None @skipTestIfFn(no_ctf_convert) @skipTestIfFn(no_objcopy) @skipUnlessDarwin def test(self): self.build() self.do_test() @skipTestIfFn(no_ctf_convert) @skipTestIfFn(no_objcopy) @skipUnlessDarwin def test_compressed(self): self.build(dictionary={"COMPRESS_CTF": "YES"}) self.do_test() def do_test(self): lldbutil.run_to_name_breakpoint(self, "printf") symbol_file = self.getBuildArtifact("a.ctf") if self.TraceOn(): self.runCmd("log enable -v lldb symbol") self.runCmd("target symbols add {}".format(symbol_file)) self.expect( "target variable foo", substrs=[ "(MyStructT) foo", "i = 1", "foo", "'c'", "[0] = 'c'", "[1] = 'a'", "[2] = 'b'", "[3] = 'c'", 'u = (i = 1, s = "")', "f = 0x0000000000000000", ], ) self.expect("target variable foo.n.i", substrs=["(MyInt) foo.n.i = 1"]) self.expect( "target variable foo.n.s", substrs=["(const char *) foo.n.s", '"foo"'] ) self.expect( "target variable foo.n.c", substrs=["(volatile char) foo.n.c = 'c'"] ) self.expect( "target variable foo.n.a", substrs=[ "(char[4]:8) foo.n.a", "[0] = 'c'", "[1] = 'a'", "[2] = 'b'", "[3] = 'c'", ], ) self.expect( "target variable foo.n.u", substrs=['(MyUnionT) foo.n.u = (i = 1, s = "")'] ) self.expect( "target variable foo.f", substrs=["(void (*)(int)) foo.f = 0x0000000000000000"], ) self.expect( "type lookup MyEnum", substrs=[ "enum MyEnum {", "eOne,", "eTwo,", "eThree", "}", ], ) self.expect("type lookup RecursiveStruct", substrs=["RecursiveStruct *n;"])