xref: /llvm-project/lldb/test/API/functionalities/json/symbol-file/TestSymbolFileJSON.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1f40ed1f6SJonas Devlieghere""" Testing symbol loading via JSON file. """
2f40ed1f6SJonas Devlieghereimport lldb
3f40ed1f6SJonas Devliegherefrom lldbsuite.test.decorators import *
4f40ed1f6SJonas Devliegherefrom lldbsuite.test.lldbtest import *
5f40ed1f6SJonas Devliegherefrom lldbsuite.test import lldbutil
6f40ed1f6SJonas Devlieghere
7f40ed1f6SJonas Devlieghereimport json
8f40ed1f6SJonas Devlieghere
9f40ed1f6SJonas Devlieghere
10f40ed1f6SJonas Devlieghereclass TargetSymbolsFileJSON(TestBase):
11f40ed1f6SJonas Devlieghere    def setUp(self):
12f40ed1f6SJonas Devlieghere        TestBase.setUp(self)
13*2238dcc3SJonas Devlieghere        self.source = "main.c"
14f40ed1f6SJonas Devlieghere
15f40ed1f6SJonas Devlieghere    @no_debug_info_test
16f40ed1f6SJonas Devlieghere    @skipIfWindows  # No 'strip'
17f40ed1f6SJonas Devlieghere    def test_symbol_file_json_address(self):
18f40ed1f6SJonas Devlieghere        """Test that 'target symbols add' can load the symbols from a JSON file using file addresses."""
19f40ed1f6SJonas Devlieghere
20f40ed1f6SJonas Devlieghere        self.build()
21f40ed1f6SJonas Devlieghere        stripped = self.getBuildArtifact("stripped.out")
22f40ed1f6SJonas Devlieghere        unstripped = self.getBuildArtifact("a.out")
23f40ed1f6SJonas Devlieghere
24f40ed1f6SJonas Devlieghere        # Create a JSON symbol file from the unstripped target.
25f40ed1f6SJonas Devlieghere        unstripped_target = self.dbg.CreateTarget(unstripped)
26f40ed1f6SJonas Devlieghere        self.assertTrue(unstripped_target, VALID_TARGET)
27f40ed1f6SJonas Devlieghere
28f40ed1f6SJonas Devlieghere        unstripped_module = unstripped_target.GetModuleAtIndex(0)
29f40ed1f6SJonas Devlieghere        main_symbol = unstripped_module.FindSymbol("main")
30f40ed1f6SJonas Devlieghere        foo_symbol = unstripped_module.FindSymbol("foo")
31f40ed1f6SJonas Devlieghere
32f40ed1f6SJonas Devlieghere        data = {
33f40ed1f6SJonas Devlieghere            "triple": unstripped_module.GetTriple(),
34f40ed1f6SJonas Devlieghere            "uuid": unstripped_module.GetUUIDString(),
35*2238dcc3SJonas Devlieghere            "symbols": list(),
36f40ed1f6SJonas Devlieghere        }
37*2238dcc3SJonas Devlieghere        data["symbols"].append(
38*2238dcc3SJonas Devlieghere            {
39f40ed1f6SJonas Devlieghere                "name": "main",
40f40ed1f6SJonas Devlieghere                "type": "code",
41f40ed1f6SJonas Devlieghere                "size": main_symbol.GetSize(),
42f40ed1f6SJonas Devlieghere                "address": main_symbol.addr.GetFileAddress(),
43*2238dcc3SJonas Devlieghere            }
44*2238dcc3SJonas Devlieghere        )
45*2238dcc3SJonas Devlieghere        data["symbols"].append(
46*2238dcc3SJonas Devlieghere            {
47f40ed1f6SJonas Devlieghere                "name": "foo",
48f40ed1f6SJonas Devlieghere                "type": "code",
49f40ed1f6SJonas Devlieghere                "size": foo_symbol.GetSize(),
50f40ed1f6SJonas Devlieghere                "address": foo_symbol.addr.GetFileAddress(),
51*2238dcc3SJonas Devlieghere            }
52*2238dcc3SJonas Devlieghere        )
53*2238dcc3SJonas Devlieghere        data["symbols"].append(
54*2238dcc3SJonas Devlieghere            {
55f40ed1f6SJonas Devlieghere                "name": "bar",
56f40ed1f6SJonas Devlieghere                "type": "code",
57f40ed1f6SJonas Devlieghere                "size": 0,
58f40ed1f6SJonas Devlieghere                "value": 0xFF,
59*2238dcc3SJonas Devlieghere            }
60*2238dcc3SJonas Devlieghere        )
61f40ed1f6SJonas Devlieghere
62f40ed1f6SJonas Devlieghere        json_object = json.dumps(data, indent=4)
63f40ed1f6SJonas Devlieghere        json_symbol_file = self.getBuildArtifact("a.json")
64f40ed1f6SJonas Devlieghere        with open(json_symbol_file, "w") as outfile:
65f40ed1f6SJonas Devlieghere            outfile.write(json_object)
66f40ed1f6SJonas Devlieghere
67f40ed1f6SJonas Devlieghere        # Create a stripped target.
68f40ed1f6SJonas Devlieghere        stripped_target = self.dbg.CreateTarget(stripped)
69f40ed1f6SJonas Devlieghere        self.assertTrue(stripped_target, VALID_TARGET)
70f40ed1f6SJonas Devlieghere
71f40ed1f6SJonas Devlieghere        # Ensure there's no symbol for main and foo.
72f40ed1f6SJonas Devlieghere        stripped_module = stripped_target.GetModuleAtIndex(0)
73f40ed1f6SJonas Devlieghere        self.assertFalse(stripped_module.FindSymbol("main").IsValid())
74f40ed1f6SJonas Devlieghere        self.assertFalse(stripped_module.FindSymbol("foo").IsValid())
75f40ed1f6SJonas Devlieghere        self.assertFalse(stripped_module.FindSymbol("bar").IsValid())
76f40ed1f6SJonas Devlieghere
77*2238dcc3SJonas Devlieghere        main_bp = stripped_target.BreakpointCreateByName("main", "stripped.out")
78f40ed1f6SJonas Devlieghere        self.assertTrue(main_bp, VALID_BREAKPOINT)
79f40ed1f6SJonas Devlieghere        self.assertEqual(main_bp.num_locations, 0)
80f40ed1f6SJonas Devlieghere
81f40ed1f6SJonas Devlieghere        # Load the JSON symbol file.
82*2238dcc3SJonas Devlieghere        self.runCmd(
83*2238dcc3SJonas Devlieghere            "target symbols add -s %s %s" % (stripped, self.getBuildArtifact("a.json"))
84*2238dcc3SJonas Devlieghere        )
85f40ed1f6SJonas Devlieghere
86f40ed1f6SJonas Devlieghere        stripped_main_symbol = stripped_module.FindSymbol("main")
87f40ed1f6SJonas Devlieghere        stripped_foo_symbol = stripped_module.FindSymbol("foo")
88f40ed1f6SJonas Devlieghere        stripped_bar_symbol = stripped_module.FindSymbol("bar")
89f40ed1f6SJonas Devlieghere
90f40ed1f6SJonas Devlieghere        # Ensure main and foo are available now.
91f40ed1f6SJonas Devlieghere        self.assertTrue(stripped_main_symbol.IsValid())
92f40ed1f6SJonas Devlieghere        self.assertTrue(stripped_foo_symbol.IsValid())
93f40ed1f6SJonas Devlieghere        self.assertTrue(stripped_bar_symbol.IsValid())
94f40ed1f6SJonas Devlieghere        self.assertEqual(main_bp.num_locations, 1)
95f40ed1f6SJonas Devlieghere
96f40ed1f6SJonas Devlieghere        # Ensure the file address matches between the stripped and unstripped target.
97*2238dcc3SJonas Devlieghere        self.assertEqual(
98*2238dcc3SJonas Devlieghere            stripped_main_symbol.addr.GetFileAddress(),
99*2238dcc3SJonas Devlieghere            main_symbol.addr.GetFileAddress(),
100*2238dcc3SJonas Devlieghere        )
101*2238dcc3SJonas Devlieghere        self.assertEqual(
102*2238dcc3SJonas Devlieghere            stripped_main_symbol.addr.GetFileAddress(),
103*2238dcc3SJonas Devlieghere            main_symbol.addr.GetFileAddress(),
104*2238dcc3SJonas Devlieghere        )
105f40ed1f6SJonas Devlieghere
106f40ed1f6SJonas Devlieghere        # Ensure the size matches.
107f40ed1f6SJonas Devlieghere        self.assertEqual(stripped_main_symbol.GetSize(), main_symbol.GetSize())
108f40ed1f6SJonas Devlieghere        self.assertEqual(stripped_main_symbol.GetSize(), main_symbol.GetSize())
109f40ed1f6SJonas Devlieghere
110f40ed1f6SJonas Devlieghere        # Ensure the type matches.
111f40ed1f6SJonas Devlieghere        self.assertEqual(stripped_main_symbol.GetType(), main_symbol.GetType())
112f40ed1f6SJonas Devlieghere        self.assertEqual(stripped_main_symbol.GetType(), main_symbol.GetType())
113f40ed1f6SJonas Devlieghere
114f40ed1f6SJonas Devlieghere        # Ensure the bar symbol has a fixed value of 10.
115*2238dcc3SJonas Devlieghere        self.assertEqual(stripped_bar_symbol.GetValue(), 0xFF)
116