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