diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2019-08-14 17:00:10 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2019-08-14 17:00:10 +0000 |
commit | c0a9b1edca4192acc6128e92cdd17a5553118745 (patch) | |
tree | 2f5da178e01344b0293969853c80f58e47fab8bd | |
parent | aa3855694ff45fc51bd71774c8bb15738b83ef16 (diff) | |
download | bcm5719-llvm-c0a9b1edca4192acc6128e92cdd17a5553118745.tar.gz bcm5719-llvm-c0a9b1edca4192acc6128e92cdd17a5553118745.zip |
[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
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp | 22 |
2 files changed, 31 insertions, 14 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 59d9d64fc04..f37d3b22dfd 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -178,6 +178,11 @@ ParseLLVMLineTable(lldb_private::DWARFContext &context, 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 @@ ParseSupportFilesFromPrologue(const lldb::ModuleSP &module, 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,22 @@ ParseSupportFilesFromPrologue(const lldb::ModuleSP &module, 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, + FileSpec::GuessPathStyle(original_file) + .getValueOr(FileSpec::Style::native)); continue; } module->RemapSourceFile(llvm::StringRef(original_file), remapped_file); - support_files.EmplaceBack(remapped_file, style); + support_files.EmplaceBack(remapped_file, + FileSpec::GuessPathStyle(remapped_file) + .getValueOr(FileSpec::Style::native)); } return support_files; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp index 1b4341d6d33..bc32b742394 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/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; } |