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

Reply via email to