[Lldb-commits] [PATCH] D158182: [lldb] Try to find relative DWO files by file name only, as a last resort

David Spickett via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 17 07:05:09 PDT 2023


DavidSpickett created this revision.
Herald added a project: All.
DavidSpickett requested review of this revision.
Herald added a reviewer: jdoerfert.
Herald added subscribers: lldb-commits, jplehr, sstefan1.
Herald added a project: LLDB.

Relative DWO files are normally found at some/path/to/file.dwo.
Currently lldb will find the file by adding that path to the
binary's location and to any debug search paths that are set.

This patch adds a fallback on top of that where lldb will look
for just the filename (file.dwo) in those same places.

So if you had flattened a build directory before distribution,
you could still get symbols. Or perhaps you send out a DWO file
on demand, and don't want people to have to recreate the directory
layout.

For example if you were built:
program
obj/program.dwo

And changed to:
program
program.dwo

<binary dir>/obj/program.dwo is not found.
<binary dir>/program.dwo is.

If the layout was changed to:
program
mydebuginfo/progam.dwo

And we had a debug search path of <binary dir>/mydebuginfo:

- <binary dir>/mydebuginfo/obj/program.dwo is not found.
- <binary dir>/mydebuginfo/program.dwo is found.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D158182

Files:
  lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
  lldb/test/Shell/SymbolFile/DWARF/dwo-debug-file-search-paths-filename-only.c
  lldb/test/Shell/SymbolFile/DWARF/dwo-relative-filename-only-binary-dir.c


Index: lldb/test/Shell/SymbolFile/DWARF/dwo-relative-filename-only-binary-dir.c
===================================================================
--- /dev/null
+++ lldb/test/Shell/SymbolFile/DWARF/dwo-relative-filename-only-binary-dir.c
@@ -0,0 +1,22 @@
+/// Check that LLDB can find a relative DWO file next to a binary just using the
+/// filename of that DWO. For example "main.dwo" not "a/b/main.dwo".
+// RUN: rm -rf %t.compdir/
+// RUN: mkdir -p %t.compdir/a/b/
+// RUN: cp %s %t.compdir/a/b/main.c
+// RUN: cd %t.compdir/a/
+/// The produced DWO is named b/main-main.dwo, with a DW_AT_comp_dir of a/.
+// RUN: %clang_host -g -gsplit-dwarf -fdebug-prefix-map=%t.compdir=. b/main.c -o b/main
+// RUN: cd ../..
+/// Move binary and DWO out of expected locations.
+// RUN: mv %t.compdir/a/b/main %t.compdir/
+// RUN: mv %t.compdir/a/b/main-main.dwo %t.compdir/
+// RUN: %lldb --no-lldbinit %t.compdir/main \
+// RUN:   -o "b main.c:21" -o "run" -o "frame variable" --batch 2>&1 | FileCheck %s
+
+// CHECK-NOT: warning: {{.*}}main unable to locate separate debug file (dwo, dwp). Debugging will be degraded.
+// CHECK: (int) num = 5
+
+int main(void) {
+  int num = 5;
+  return 0;
+}
\ No newline at end of file
Index: lldb/test/Shell/SymbolFile/DWARF/dwo-debug-file-search-paths-filename-only.c
===================================================================
--- /dev/null
+++ lldb/test/Shell/SymbolFile/DWARF/dwo-debug-file-search-paths-filename-only.c
@@ -0,0 +1,27 @@
+/// Check that when LLDB is looking for a relative DWO it uses the debug search
+/// paths setting. If it doesn't find it by adding the whole relative path to
+/// of DWO it should try adding just the filename (e.g. main.dwo) to each debug
+/// search path.
+// RUN: rm -rf %t.compdir/
+// RUN: mkdir -p %t.compdir/a/b/
+// RUN: cp %s %t.compdir/a/b/main.c
+// RUN: cd %t.compdir/a/
+/// The produced DWO is named /b//main-main.dwo, with a DW_AT_comp_dir of a/.
+// RUN: %clang_host -g -gsplit-dwarf -fdebug-prefix-map=%t.compdir=. b/main.c -o b/main
+// RUN: cd ../..
+/// Move the DWO file away from the expected location.
+// RUN: mv %t.compdir/a/b/main-main.dwo %t.compdir/
+/// LLDB won't find the DWO next to the binary or by adding the relative path
+/// to any of the search paths. So it should find the DWO file at
+/// %t.compdir/main-main.dwo.
+// RUN: %lldb --no-lldbinit %t.compdir/a/b/main \
+// RUN:   -O "settings append target.debug-file-search-paths %t.compdir" \
+// RUN:   -o "b main.c:26" -o "run" -o "frame variable" --batch 2>&1 | FileCheck %s
+
+// CHECK-NOT: warning: {{.*}}main unable to locate separate debug file (dwo, dwp). Debugging will be degraded.
+// CHECK: (int) num = 5
+
+int main(void) {
+  int num = 5;
+  return 0;
+}
\ No newline at end of file
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1781,6 +1781,27 @@
         dwo_paths.Append(dirspec);
       }
 
+      FileSpec spec_to_get_name(dwo_name);
+      llvm::StringRef filename_only = spec_to_get_name.GetFilename();
+
+      // Try binary dir plus DWO filename only.
+      FileSpec filename_next_to_binary(
+          m_objfile_sp->GetFileSpec().GetDirectory().GetStringRef());
+      FileSystem::Instance().Resolve(filename_next_to_binary);
+      filename_next_to_binary.AppendPathComponent(filename_only);
+      dwo_paths.Append(filename_next_to_binary);
+
+      // Try adding just the filename to each of the search paths.
+      for (size_t idx = 0; idx < num_directories; ++idx) {
+        FileSpec dirspec = debug_file_search_paths.GetFileSpecAtIndex(idx);
+        FileSystem::Instance().Resolve(dirspec);
+        if (!FileSystem::Instance().IsDirectory(dirspec))
+          continue;
+
+        dirspec.AppendPathComponent(filename_only);
+        dwo_paths.Append(dirspec);
+      }
+
       size_t num_possible = dwo_paths.GetSize();
       for (size_t idx = 0; idx < num_possible && !found; ++idx) {
         FileSpec dwo_spec = dwo_paths.GetFileSpecAtIndex(idx);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158182.551123.patch
Type: text/x-patch
Size: 4171 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20230817/68cfed84/attachment-0001.bin>


More information about the lldb-commits mailing list