]> granicus.if.org Git - llvm/commitdiff
[DebugLine] Improve path handling.
authorJonas Devlieghere <jonas@devlieghere.com>
Wed, 14 Aug 2019 17:00:10 +0000 (17:00 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Wed, 14 Aug 2019 17:00:10 +0000 (17:00 +0000)
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.

Differential revision: https://reviews.llvm.org/D66227

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368879 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/DWARF/DWARFDebugLine.cpp

index 1b4341d6d33dea081f8c2b5f956685b2735884f9..bc32b742394a0ebb834e1f2c9322d42bd9508d1f 100644 (file)
@@ -1041,6 +1041,24 @@ static bool isPathAbsoluteOnWindowsOrPosix(const Twine &Path) {
          sys::path::is_absolute(Path, sys::path::Style::windows);
 }
 
+/// If given an absolute path, guess the path style.
+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);
+  // This is a relative path.
+  if (!Posix && !Windows)
+    return sys::path::Style::native;
+  // This is a valid absolute path for both Windows and Posix.
+  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 +1088,11 @@ bool DWARFDebugLine::Prologue::getFileNameByIndex(uint64_t FileIndex,
     // 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;
 }