summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-08-14 17:00:10 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-08-14 17:00:10 +0000
commitc0a9b1edca4192acc6128e92cdd17a5553118745 (patch)
tree2f5da178e01344b0293969853c80f58e47fab8bd
parentaa3855694ff45fc51bd71774c8bb15738b83ef16 (diff)
downloadbcm5719-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.cpp23
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp22
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;
}
OpenPOWER on IntegriCloud