From: Jonas Devlieghere Date: Wed, 14 Aug 2019 17:00:10 +0000 (+0000) Subject: [DebugLine] Improve path handling. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5fbbf499ea804510a38287c8fee2f7e9c266edba;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368879 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/lib/DebugInfo/DWARF/DWARFDebugLine.cpp index 1b4341d6d33..bc32b742394 100644 --- a/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -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; }