[Lldb-commits] [PATCH] D66227: [DebugLine] Improve path handling.

Jonas Devlieghere via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Aug 14 09:32:47 PDT 2019


JDevlieghere created this revision.
JDevlieghere added reviewers: labath, wolfgangp, stella.stamenova.
Herald added subscribers: llvm-commits, hiraditya, aprantl.
Herald added projects: LLDB, LLVM.
JDevlieghere added a comment.

This should fix the following two test failures on the Windows LLDB bot (http://lab.llvm.org:8011/builders/lldb-x64-windows-ninja)

  LLDB :: SymbolFile/DWARF/debug-line-basic.s
  LLDB :: SymbolFile/DWARF/dir-separator-posix.s

Unfortunately I don't have access to a Windows machine, so I'm not able to verify this.


After switching over LLDB's line table parser to libDebugInfo, we noticed two regressions on the Windows bot. The problem is that when obtaining a file from the line table prologue, we append paths without specifying a path style. This leads to incorrect results on Windows for debug info containing Posix paths:

  0x0000000000201000: /tmp\b.c, is_start_of_statement = TRUE

This patch is an attempt to fix that by guessing the path style whenever possible.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D66227

Files:
  lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
  llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp


Index: llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
===================================================================
--- llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
+++ llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
@@ -1041,6 +1041,22 @@
          sys::path::is_absolute(Path, sys::path::Style::windows);
 }
 
+/// Guess the path style from the given absolute path.
+static sys::path::Style GuessPathStyle(StringRef Path) {
+  bool Posix = sys::path::is_absolute(Path, sys::path::Style::posix);
+  bool Windows = sys::path::is_absolute(Path, sys::path::Style::windows);
+  if (!Posix && !Windows)
+    return sys::path::Style::native;
+  if (Posix && Windows)
+    return sys::path::Style::native;
+  if (Posix)
+    return sys::path::Style::posix;
+  if (Windows)
+    return sys::path::Style::windows;
+
+  llvm_unreachable("All combinations should have been handled");
+}
+
 bool DWARFDebugLine::Prologue::getFileNameByIndex(uint64_t FileIndex,
                                                   StringRef CompDir,
                                                   FileLineInfoKind Kind,
@@ -1070,11 +1086,11 @@
     // We know that FileName is not absolute, the only way to have an
     // absolute path at this point would be if IncludeDir is absolute.
     if (!CompDir.empty() && !isPathAbsoluteOnWindowsOrPosix(IncludeDir))
-      sys::path::append(FilePath, CompDir);
+      sys::path::append(FilePath, GuessPathStyle(CompDir), CompDir);
   }
 
   // sys::path::append skips empty strings.
-  sys::path::append(FilePath, IncludeDir, FileName);
+  sys::path::append(FilePath, GuessPathStyle(IncludeDir), IncludeDir, FileName);
   Result = FilePath.str();
   return true;
 }
Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -178,6 +178,11 @@
   return *line_table;
 }
 
+static FileSpec::Style GuessPathStyleOrNative(llvm::StringRef p) {
+  llvm::Optional<FileSpec::Style> style = FileSpec::GuessPathStyle(p);
+  return style ? *style : FileSpec::Style::native;
+}
+
 static FileSpecList
 ParseSupportFilesFromPrologue(const lldb::ModuleSP &module,
                               const llvm::DWARFDebugLine::Prologue &prologue,
@@ -186,8 +191,6 @@
   FileSpecList support_files;
   support_files.Append(first_file);
 
-  llvm::Optional<FileSpec::Style> compile_dir_style =
-      FileSpec::GuessPathStyle(compile_dir);
   const size_t number_of_files = prologue.FileNames.size();
   for (size_t idx = 1; idx <= number_of_files; ++idx) {
     std::string original_file;
@@ -200,26 +203,20 @@
       continue;
     }
 
-    FileSpec::Style style = FileSpec::Style::native;
-    if (compile_dir_style) {
-      style = *compile_dir_style;
-    } else if (llvm::Optional<FileSpec::Style> file_style =
-                   FileSpec::GuessPathStyle(original_file)) {
-      style = *file_style;
-    }
-
     std::string remapped_file;
     if (!prologue.getFileNameByIndex(
             idx, compile_dir,
             llvm::DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
             remapped_file)) {
       // Always add an entry so the indexes remain correct.
-      support_files.EmplaceBack(original_file, style);
+      support_files.EmplaceBack(original_file,
+                                GuessPathStyleOrNative(original_file));
       continue;
     }
 
     module->RemapSourceFile(llvm::StringRef(original_file), remapped_file);
-    support_files.EmplaceBack(remapped_file, style);
+    support_files.EmplaceBack(remapped_file,
+                              GuessPathStyleOrNative(remapped_file));
   }
 
   return support_files;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66227.215142.patch
Type: text/x-patch
Size: 3766 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190814/20b0d4ae/attachment-0001.bin>


More information about the lldb-commits mailing list