[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