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