labath updated this revision to Diff 185937. labath added a comment. Rename arg to `absolute_path`.
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D57895/new/ https://reviews.llvm.org/D57895 Files: include/lldb/Utility/FileSpec.h lit/SymbolFile/Breakpad/Inputs/line-table-mixed-path-styles.syms lit/SymbolFile/Breakpad/line-table-discontinuous-file-ids.test lit/SymbolFile/Breakpad/line-table-edgecases.test lit/SymbolFile/Breakpad/line-table-missing-file.test lit/SymbolFile/Breakpad/line-table-mixed-path-styles.test lit/SymbolFile/Breakpad/line-table.test source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp source/Utility/FileSpec.cpp unittests/Utility/FileSpecTest.cpp
Index: unittests/Utility/FileSpecTest.cpp =================================================================== --- unittests/Utility/FileSpecTest.cpp +++ unittests/Utility/FileSpecTest.cpp @@ -189,6 +189,17 @@ } } +TEST(FileSpecTest, GuessPathStyle) { + EXPECT_EQ(FileSpec::Style::posix, FileSpec::GuessPathStyle("/foo/bar.txt")); + EXPECT_EQ(FileSpec::Style::posix, FileSpec::GuessPathStyle("//net/bar.txt")); + EXPECT_EQ(FileSpec::Style::windows, + FileSpec::GuessPathStyle(R"(C:\foo.txt)")); + EXPECT_EQ(FileSpec::Style::windows, + FileSpec::GuessPathStyle(R"(\\net\foo.txt)")); + EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo.txt")); + EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo/bar.txt")); +} + TEST(FileSpecTest, GetNormalizedPath) { std::pair<const char *, const char *> posix_tests[] = { {"/foo/.././bar", "/bar"}, Index: source/Utility/FileSpec.cpp =================================================================== --- source/Utility/FileSpec.cpp +++ source/Utility/FileSpec.cpp @@ -365,6 +365,17 @@ return a == b; } +llvm::Optional<FileSpec::Style> FileSpec::GuessPathStyle(llvm::StringRef absolute_path) { + if (absolute_path.startswith("/")) + return Style::posix; + if (absolute_path.startswith(R"(\\)")) + return Style::windows; + if (absolute_path.size() > 3 && llvm::isAlpha(absolute_path[0]) && + absolute_path.substr(1, 2) == R"(:\)") + return Style::windows; + return llvm::None; +} + //------------------------------------------------------------------ // Dump the object to the supplied stream. If the object contains a valid // directory name, it will be displayed followed by a directory delimiter, and Index: source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -820,22 +820,19 @@ if (!die) return; - auto guess = [](llvm::StringRef str) { - if (str.startswith("/")) - return FileSpec::Style::posix; - if (str.size() > 3 && llvm::isAlpha(str[0]) && str.substr(1, 2) == ":\\") - return FileSpec::Style::windows; - return FileSpec::Style::native; - }; llvm::StringRef comp_dir = removeHostnameFromPathname( die->GetAttributeValueAsString(m_dwarf, this, DW_AT_comp_dir, NULL)); if (!comp_dir.empty()) { - m_comp_dir = resolveCompDir(FileSpec(comp_dir, guess(comp_dir))); + FileSpec::Style comp_dir_style = + FileSpec::GuessPathStyle(comp_dir).getValueOr(FileSpec::Style::native); + m_comp_dir = resolveCompDir(FileSpec(comp_dir, comp_dir_style)); } else { // Try to detect the style based on the DW_AT_name attribute, but just store // the detected style in the m_comp_dir field. - m_comp_dir = FileSpec("", guess(die->GetAttributeValueAsString( - m_dwarf, this, DW_AT_name, NULL))); + const char *name = + die->GetAttributeValueAsString(m_dwarf, this, DW_AT_name, NULL); + m_comp_dir = FileSpec( + "", FileSpec::GuessPathStyle(name).getValueOr(FileSpec::Style::native)); } } Index: source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp =================================================================== --- source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp +++ source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp @@ -398,7 +398,9 @@ if (record->Number >= m_files->size()) m_files->resize(record->Number + 1); - (*m_files)[record->Number] = FileSpec(record->Name); + FileSpec::Style style = FileSpec::GuessPathStyle(record->Name) + .getValueOr(FileSpec::Style::native); + (*m_files)[record->Number] = FileSpec(record->Name, style); } } Index: lit/SymbolFile/Breakpad/line-table.test =================================================================== --- lit/SymbolFile/Breakpad/line-table.test +++ lit/SymbolFile/Breakpad/line-table.test @@ -1,5 +1,3 @@ -# XFAIL: system-windows - # RUN: yaml2obj %S/Inputs/basic-elf.yaml > %T/line-table.out # RUN: %lldb %T/line-table.out -o "target symbols add -s line-table.out %S/Inputs/line-table.syms" \ # RUN: -s %s -o exit | FileCheck %s Index: lit/SymbolFile/Breakpad/line-table-mixed-path-styles.test =================================================================== --- /dev/null +++ lit/SymbolFile/Breakpad/line-table-mixed-path-styles.test @@ -0,0 +1,11 @@ +# RUN: yaml2obj %S/Inputs/basic-elf.yaml > %T/line-table-mixed-path-styles.out +# RUN: %lldb %T/line-table-mixed-path-styles.out \ +# RUN: -o "target symbols add -s line-table-mixed-path-styles.out %S/Inputs/line-table-mixed-path-styles.syms" \ +# RUN: -s %s -o exit | FileCheck %s + +image dump line-table a.c +# CHECK-LABEL: Line table for /tmp/a.c +# CHECK-NEXT: 0x00000000004000b0: /tmp/a.c:1 +# CHECK-NEXT: 0x00000000004000b1: c:\tmp\b.c:1 +# CHECK-NEXT: 0x00000000004000b2: +# CHECK-EMPTY: Index: lit/SymbolFile/Breakpad/line-table-missing-file.test =================================================================== --- lit/SymbolFile/Breakpad/line-table-missing-file.test +++ lit/SymbolFile/Breakpad/line-table-missing-file.test @@ -3,8 +3,6 @@ # Right now, "something reasonable" means creating a line entry with an empty # file. -# XFAIL: system-windows - # RUN: yaml2obj %S/Inputs/basic-elf.yaml > %T/line-table-missing-file.out # RUN: %lldb %T/line-table-missing-file.out \ # RUN: -o "target symbols add -s line-table-missing-file.out %S/Inputs/line-table-missing-file.syms" \ Index: lit/SymbolFile/Breakpad/line-table-edgecases.test =================================================================== --- lit/SymbolFile/Breakpad/line-table-edgecases.test +++ lit/SymbolFile/Breakpad/line-table-edgecases.test @@ -2,8 +2,6 @@ # input contains a LINE record which does not belong to any function as well as # a FUNC record without any LINE records. -# XFAIL: system-windows - # RUN: yaml2obj %S/Inputs/basic-elf.yaml > %T/line-table-edgecases.out # RUN: %lldb %T/line-table-edgecases.out \ # RUN: -o "target symbols add -s line-table-edgecases.out %S/Inputs/line-table-edgecases.syms" \ Index: lit/SymbolFile/Breakpad/line-table-discontinuous-file-ids.test =================================================================== --- lit/SymbolFile/Breakpad/line-table-discontinuous-file-ids.test +++ lit/SymbolFile/Breakpad/line-table-discontinuous-file-ids.test @@ -1,7 +1,5 @@ # Test that we handle files which has gaps in the FILE record IDs. -# XFAIL: system-windows - # RUN: yaml2obj %S/Inputs/basic-elf.yaml > %T/line-table-discontinuous-file-ids.out # RUN: %lldb %T/line-table-discontinuous-file-ids.out \ # RUN: -o "target symbols add -s line-table-discontinuous-file-ids.out %S/Inputs/line-table-discontinuous-file-ids.syms" \ Index: lit/SymbolFile/Breakpad/Inputs/line-table-mixed-path-styles.syms =================================================================== --- /dev/null +++ lit/SymbolFile/Breakpad/Inputs/line-table-mixed-path-styles.syms @@ -0,0 +1,7 @@ +MODULE Linux x86_64 761550E08086333960A9074A9CE2895C0 a.out +INFO CODE_ID E05015768680393360A9074A9CE2895C +FILE 0 /tmp/a.c +FILE 1 c:\tmp\b.c +FUNC b0 10 0 func +b0 1 1 0 +b1 1 1 1 Index: include/lldb/Utility/FileSpec.h =================================================================== --- include/lldb/Utility/FileSpec.h +++ include/lldb/Utility/FileSpec.h @@ -242,6 +242,13 @@ static bool Equal(const FileSpec &a, const FileSpec &b, bool full); + /// Attempt to guess path style for a given path string. It returns a style, + /// if it was able to make a reasonable guess, or None if it wasn't. The guess + /// will be correct if the input path was a valid absolute path on the system + /// which produced it. On other paths the result of this function is + /// unreliable (e.g. "c:\foo.txt" is a valid relative posix path). + static llvm::Optional<Style> GuessPathStyle(llvm::StringRef absolute_path); + //------------------------------------------------------------------ /// Case sensitivity of path. ///
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits