wallace created this revision. wallace added reviewers: clayborg, labath, kusmour, aadsm. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
Several lldb-vscode users have noticed that when a source map rule is invalid (because a folder doesn't exist anymore), the rest of the source maps from their configurations are not applied. This happens because lldb-vscode executes a single "settings set target.source-map" command with all the source maps and LLDB processes them one by one until one fails. Instead of doing this, we can process in LLDB all the source map rules and apply the valid ones instead of failing fast. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D77186 Files: lldb/source/Interpreter/OptionValuePathMappings.cpp lldb/test/API/functionalities/source-map/TestTargetSourceMap.py
Index: lldb/test/API/functionalities/source-map/TestTargetSourceMap.py =================================================================== --- lldb/test/API/functionalities/source-map/TestTargetSourceMap.py +++ lldb/test/API/functionalities/source-map/TestTargetSourceMap.py @@ -1,6 +1,7 @@ import lldb from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * +import os class TestTargetSourceMap(TestBase): @@ -9,6 +10,20 @@ @no_debug_info_test def test_source_map(self): + def assertSourceMaps(src_path): + # Set a breakpoint after we remap source and verify that it succeeds + bp = target.BreakpointCreateByLocation(src_path, 2) + self.assertEquals(bp.GetNumLocations(), 1, + "make sure breakpoint was resolved with map") + + # Now make sure that we can actually FIND the source file using this + # remapping: + retval = lldb.SBCommandReturnObject() + self.dbg.GetCommandInterpreter().HandleCommand("source list -f main.c -l 2", retval) + self.assertTrue(retval.Succeeded(), "source list didn't succeed.") + self.assertNotEqual(retval.GetOutput(), None, "We got no ouput from source list") + self.assertTrue("return" in retval.GetOutput(), "We didn't find the source file...") + """Test target.source-map' functionality.""" # Set the target soure map to map "./" to the current test directory src_dir = self.getSourceDir() @@ -25,19 +40,28 @@ bp = target.BreakpointCreateByLocation(src_path, 2) self.assertEquals(bp.GetNumLocations(), 0, "make sure no breakpoints were resolved without map") - src_map_cmd = 'settings set target.source-map . "%s"' % (src_dir) + + src_map_cmd = 'settings set target.source-map . "%s" . "%s"' % (src_dir + "invalid_path", src_dir) self.dbg.HandleCommand(src_map_cmd) + assertSourceMaps(src_path) - # Set a breakpoint after we remap source and verify that it succeeds - bp = target.BreakpointCreateByLocation(src_path, 2) - self.assertEquals(bp.GetNumLocations(), 1, - "make sure breakpoint was resolved with map") - - # Now make sure that we can actually FIND the source file using this - # remapping: - retval = lldb.SBCommandReturnObject() - self.dbg.GetCommandInterpreter().HandleCommand("source list -f main.c -l 2", retval) - self.assertTrue(retval.Succeeded(), "source list didn't succeed.") - self.assertNotEqual(retval.GetOutput(), None, "We got no ouput from source list") - self.assertTrue("return" in retval.GetOutput(), "We didn't find the source file...") - + # Index 0 is the valid mapping, and modifying it to an invalid one should have no effect + src_map_cmd = 'settings replace target.source-map 0 . "%s"' % (src_dir + "invalid_path") + self.dbg.HandleCommand(src_map_cmd) + assertSourceMaps(src_path) + + # Let's clear and add the mapping in with insert-after + self.dbg.HandleCommand('settings remove target.source-map 0') + # We add a valid but useless mapping so that we can use insert-after + src_map_cmd = 'settings set target.source-map . "%s"' % (os.path.dirname(__file__)) + self.dbg.HandleCommand(src_map_cmd) + + src_map_cmd = 'settings insert-after target.source-map 0 . "%s" . "%s"' % (src_dir + "invalid_path", src_dir) + self.dbg.HandleCommand(src_map_cmd) + assertSourceMaps(src_path) + + # Let's clear and add the mapping in with append + self.dbg.HandleCommand('settings remove target.source-map 0') + src_map_cmd = 'settings append target.source-map . "%s" . "%s"' % (src_dir + "invalid_path", src_dir) + self.dbg.HandleCommand(src_map_cmd) + assertSourceMaps(src_path) Index: lldb/source/Interpreter/OptionValuePathMappings.cpp =================================================================== --- lldb/source/Interpreter/OptionValuePathMappings.cpp +++ lldb/source/Interpreter/OptionValuePathMappings.cpp @@ -61,7 +61,7 @@ count); } else { bool changed = false; - for (size_t i = 1; i < argc; i += 2, ++idx) { + for (size_t i = 1; i < argc; i += 2) { const char *orginal_path = args.GetArgumentAtIndex(i); const char *replace_path = args.GetArgumentAtIndex(i + 1); if (VerifyPathExists(replace_path)) { @@ -70,6 +70,7 @@ if (!m_path_mappings.Replace(a, b, idx, m_notify_changes)) m_path_mappings.Append(a, b, m_notify_changes); changed = true; + idx++; } else { error.SetErrorStringWithFormat( "the replacement path doesn't exist: \"%s\"", replace_path); @@ -111,7 +112,6 @@ } else { error.SetErrorStringWithFormat( "the replacement path doesn't exist: \"%s\"", replace_path); - break; } } if (changed) @@ -135,7 +135,7 @@ bool changed = false; if (op == eVarSetOperationInsertAfter) ++idx; - for (size_t i = 1; i < argc; i += 2, ++idx) { + for (size_t i = 1; i < argc; i += 2) { const char *orginal_path = args.GetArgumentAtIndex(i); const char *replace_path = args.GetArgumentAtIndex(i + 1); if (VerifyPathExists(replace_path)) { @@ -143,6 +143,7 @@ ConstString b(replace_path); m_path_mappings.Insert(a, b, idx, m_notify_changes); changed = true; + idx++; } else { error.SetErrorStringWithFormat( "the replacement path doesn't exist: \"%s\"", replace_path);
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits