[binutils-gdb] gdb/dap: only include sourceReference if file path does not exist

Tom Tromey tromey@sourceware.org
Wed Sep 20 17:41:05 GMT 2023


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=0b7de6d3ee07653e97e65a2968742c93b7102f62

commit 0b7de6d3ee07653e97e65a2968742c93b7102f62
Author: Gregory Anders <greg@gpanders.com>
Date:   Fri Sep 1 16:02:20 2023 -0500

    gdb/dap: only include sourceReference if file path does not exist
    
    According to the DAP specification if the "sourceReference" field is
    included in a Source object, then the DAP client _must_ make a "source"
    request to the debugger to retrieve file contents, even if the Source
    object also includes path information.
    
    If the Source's path field is a valid path that the DAP client is able
    to read from the filesystem, having to make another request to the
    debugger to get the file contents is wasteful and leads to incorrect
    results (DAP clients will try to get the contents from the server and
    display those contents as a file with the name in "source.path", but
    this will conflict with the _acutal_ existing file at "source.path").
    
    Instead, only set "sourceReference" if the source file path does not
    exist.
    
    Approved-By: Tom Tromey <tom@tromey.com>

Diff:
---
 gdb/python/lib/gdb/dap/sources.py | 16 +++++++++++-----
 gdb/testsuite/gdb.dap/sources.exp |  9 +++++----
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/gdb/python/lib/gdb/dap/sources.py b/gdb/python/lib/gdb/dap/sources.py
index 7fa1ae430c8..00a70701d26 100644
--- a/gdb/python/lib/gdb/dap/sources.py
+++ b/gdb/python/lib/gdb/dap/sources.py
@@ -13,6 +13,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import os
+
 import gdb
 
 from .server import request, capability
@@ -41,16 +43,20 @@ def make_source(fullname, filename):
     if fullname in _source_map:
         result = _source_map[fullname]
     else:
-        global _next_source
         result = {
             "name": filename,
             "path": fullname,
-            "sourceReference": _next_source,
         }
+
+        if not os.path.exists(fullname):
+            global _next_source
+            result["sourceReference"] = _next_source
+
+            global _id_map
+            _id_map[_next_source] = result
+            _next_source += 1
+
         _source_map[fullname] = result
-        global _id_map
-        _id_map[_next_source] = result
-        _next_source += 1
     return result
 
 
diff --git a/gdb/testsuite/gdb.dap/sources.exp b/gdb/testsuite/gdb.dap/sources.exp
index a12c2089417..f1b19acc2b7 100644
--- a/gdb/testsuite/gdb.dap/sources.exp
+++ b/gdb/testsuite/gdb.dap/sources.exp
@@ -30,20 +30,21 @@ if {[dap_launch $testfile stop_at_main 1] == ""} {
 }
 
 set obj [dap_check_request_and_response loadedSources loadedSources]
-set ref 0
+set path ""
 foreach src [dict get [lindex $obj 0] body sources] {
     if {[file tail [dict get $src name]] == "sources.c"} {
-	set ref [dict get $src sourceReference]
+	set path [dict get $src path]
     }	
 }
 
-if {$ref == 0} {
+if {$path == ""} {
     fail "sources.c in loadedSources"
 } else {
     pass "sources.c in loadedSources"
 
     set obj [dap_check_request_and_response "get source" source \
-		 [format {o sourceReference [i %d]} $ref]]
+		 [format {o source [o path [s %s]] \
+			    sourceReference [i 0]} $path]]
     set text [dict get [lindex $obj 0] body content]
     gdb_assert {[string first "Distinguishing comment" $text] != -1}
 }


More information about the Gdb-cvs mailing list