xref: /llvm-project/lldb/test/API/functionalities/json/object-file/TestObjectFileJSON.py (revision f40ed1f619046e98d08b092b1afb835ed5156f52)
1*f40ed1f6SJonas Devlieghereimport lldb
2*f40ed1f6SJonas Devliegherefrom lldbsuite.test.decorators import *
3*f40ed1f6SJonas Devliegherefrom lldbsuite.test.lldbtest import *
4*f40ed1f6SJonas Devliegherefrom lldbsuite.test import lldbutil
5*f40ed1f6SJonas Devlieghere
6*f40ed1f6SJonas Devlieghereimport json
7*f40ed1f6SJonas Devlieghereimport uuid
8*f40ed1f6SJonas Devlieghereimport os
9*f40ed1f6SJonas Devlieghereimport shutil
10*f40ed1f6SJonas Devlieghereimport time
11*f40ed1f6SJonas Devlieghere
12*f40ed1f6SJonas Devlieghere
13*f40ed1f6SJonas Devlieghereclass TestObjectFileJSON(TestBase):
14*f40ed1f6SJonas Devlieghere    TRIPLE = "arm64-apple-macosx13.0.0"
15*f40ed1f6SJonas Devlieghere
16*f40ed1f6SJonas Devlieghere    def setUp(self):
17*f40ed1f6SJonas Devlieghere        TestBase.setUp(self)
18*f40ed1f6SJonas Devlieghere        self.source = "main.c"
19*f40ed1f6SJonas Devlieghere
20*f40ed1f6SJonas Devlieghere    def emitJSON(self, data, path):
21*f40ed1f6SJonas Devlieghere        json_object = json.dumps(data, indent=4)
22*f40ed1f6SJonas Devlieghere        with open(path, "w") as outfile:
23*f40ed1f6SJonas Devlieghere            outfile.write(json_object)
24*f40ed1f6SJonas Devlieghere
25*f40ed1f6SJonas Devlieghere    def toModuleSpec(self, path):
26*f40ed1f6SJonas Devlieghere        module_spec = lldb.SBModuleSpec()
27*f40ed1f6SJonas Devlieghere        module_spec.SetFileSpec(lldb.SBFileSpec(path))
28*f40ed1f6SJonas Devlieghere        return module_spec
29*f40ed1f6SJonas Devlieghere
30*f40ed1f6SJonas Devlieghere    @no_debug_info_test
31*f40ed1f6SJonas Devlieghere    def test_target(self):
32*f40ed1f6SJonas Devlieghere        triple = "arm64-apple-macosx13.0.0"
33*f40ed1f6SJonas Devlieghere        data = {
34*f40ed1f6SJonas Devlieghere            "triple": triple,
35*f40ed1f6SJonas Devlieghere            "uuid": str(uuid.uuid4()),
36*f40ed1f6SJonas Devlieghere            "type": "executable",
37*f40ed1f6SJonas Devlieghere        }
38*f40ed1f6SJonas Devlieghere
39*f40ed1f6SJonas Devlieghere        json_object_file = self.getBuildArtifact("a.json")
40*f40ed1f6SJonas Devlieghere        self.emitJSON(data, json_object_file)
41*f40ed1f6SJonas Devlieghere
42*f40ed1f6SJonas Devlieghere        target = self.dbg.CreateTarget(json_object_file)
43*f40ed1f6SJonas Devlieghere        self.assertTrue(target.IsValid())
44*f40ed1f6SJonas Devlieghere        self.assertEqual(target.GetTriple(), triple)
45*f40ed1f6SJonas Devlieghere
46*f40ed1f6SJonas Devlieghere    @no_debug_info_test
47*f40ed1f6SJonas Devlieghere    def test_module(self):
48*f40ed1f6SJonas Devlieghere        self.build()
49*f40ed1f6SJonas Devlieghere        exe = self.getBuildArtifact("a.out")
50*f40ed1f6SJonas Devlieghere        target = self.dbg.CreateTarget(exe)
51*f40ed1f6SJonas Devlieghere
52*f40ed1f6SJonas Devlieghere        data = {
53*f40ed1f6SJonas Devlieghere            "triple": target.GetTriple(),
54*f40ed1f6SJonas Devlieghere            "uuid": str(uuid.uuid4()),
55*f40ed1f6SJonas Devlieghere        }
56*f40ed1f6SJonas Devlieghere
57*f40ed1f6SJonas Devlieghere        json_object_file_b = self.getBuildArtifact("b.json")
58*f40ed1f6SJonas Devlieghere        self.emitJSON(data, json_object_file_b)
59*f40ed1f6SJonas Devlieghere
60*f40ed1f6SJonas Devlieghere        module = target.AddModule(self.toModuleSpec(json_object_file_b))
61*f40ed1f6SJonas Devlieghere        self.assertFalse(module.IsValid())
62*f40ed1f6SJonas Devlieghere
63*f40ed1f6SJonas Devlieghere        data = {
64*f40ed1f6SJonas Devlieghere            "triple": target.GetTriple(),
65*f40ed1f6SJonas Devlieghere            "uuid": str(uuid.uuid4()),
66*f40ed1f6SJonas Devlieghere            "type": "sharedlibrary",
67*f40ed1f6SJonas Devlieghere            "sections": [
68*f40ed1f6SJonas Devlieghere                {
69*f40ed1f6SJonas Devlieghere                    "name": "__TEXT",
70*f40ed1f6SJonas Devlieghere                    "type": "code",
71*f40ed1f6SJonas Devlieghere                    "address": 0,
72*f40ed1f6SJonas Devlieghere                    "size": 0x222,
73*f40ed1f6SJonas Devlieghere                }
74*f40ed1f6SJonas Devlieghere            ],
75*f40ed1f6SJonas Devlieghere            "symbols": [
76*f40ed1f6SJonas Devlieghere                {
77*f40ed1f6SJonas Devlieghere                    "name": "foo",
78*f40ed1f6SJonas Devlieghere                    "address": 0x100,
79*f40ed1f6SJonas Devlieghere                    "size": 0x11,
80*f40ed1f6SJonas Devlieghere                }
81*f40ed1f6SJonas Devlieghere            ],
82*f40ed1f6SJonas Devlieghere        }
83*f40ed1f6SJonas Devlieghere
84*f40ed1f6SJonas Devlieghere        json_object_file_c = self.getBuildArtifact("c.json")
85*f40ed1f6SJonas Devlieghere        self.emitJSON(data, json_object_file_c)
86*f40ed1f6SJonas Devlieghere
87*f40ed1f6SJonas Devlieghere        module = target.AddModule(self.toModuleSpec(json_object_file_c))
88*f40ed1f6SJonas Devlieghere        self.assertTrue(module.IsValid())
89*f40ed1f6SJonas Devlieghere
90*f40ed1f6SJonas Devlieghere        section = module.GetSectionAtIndex(0)
91*f40ed1f6SJonas Devlieghere        self.assertTrue(section.IsValid())
92*f40ed1f6SJonas Devlieghere        self.assertEqual(section.GetName(), "__TEXT")
93*f40ed1f6SJonas Devlieghere        self.assertEqual(section.file_addr, 0x0)
94*f40ed1f6SJonas Devlieghere        self.assertEqual(section.size, 0x222)
95*f40ed1f6SJonas Devlieghere
96*f40ed1f6SJonas Devlieghere        symbol = module.FindSymbol("foo")
97*f40ed1f6SJonas Devlieghere        self.assertTrue(symbol.IsValid())
98*f40ed1f6SJonas Devlieghere        self.assertEqual(symbol.addr.GetFileAddress(), 0x100)
99*f40ed1f6SJonas Devlieghere        self.assertEqual(symbol.GetSize(), 0x11)
100*f40ed1f6SJonas Devlieghere
101*f40ed1f6SJonas Devlieghere        error = target.SetSectionLoadAddress(section, 0x1000)
102*f40ed1f6SJonas Devlieghere        self.assertSuccess(error)
103*f40ed1f6SJonas Devlieghere        self.assertEqual(symbol.addr.GetLoadAddress(target), 0x1100)
104