1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

[DebugLine] Improve path handling.

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

llvm-svn: 368879
This commit is contained in:
Jonas Devlieghere 2019-08-14 17:00:10 +00:00
parent dd2ad96c34
commit 570b0503d9

View File

@ -1041,6 +1041,24 @@ static bool isPathAbsoluteOnWindowsOrPosix(const Twine &Path) {
sys::path::is_absolute(Path, sys::path::Style::windows); 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, bool DWARFDebugLine::Prologue::getFileNameByIndex(uint64_t FileIndex,
StringRef CompDir, StringRef CompDir,
FileLineInfoKind Kind, 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 // We know that FileName is not absolute, the only way to have an
// absolute path at this point would be if IncludeDir is absolute. // absolute path at this point would be if IncludeDir is absolute.
if (!CompDir.empty() && !isPathAbsoluteOnWindowsOrPosix(IncludeDir)) 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 skips empty strings.
sys::path::append(FilePath, IncludeDir, FileName); sys::path::append(FilePath, GuessPathStyle(IncludeDir), IncludeDir, FileName);
Result = FilePath.str(); Result = FilePath.str();
return true; return true;
} }