[Lldb-commits] [PATCH] D122293: [intelpt] Refactoring instruction decoding for flexibility
wallace updated this revision to Diff 418404. wallace added a comment. - make tests pass - simplified the error handling. In fact, using Error objects might be too expensive and potentially provides little value in the API, because the user needs to consume the Error forcefully. Besides that, once we expose this python, the error will be a plain string, therefore, I'm now storing the error as a string. Error won't be that frequent, so the cost of that is okay. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D122293/new/ https://reviews.llvm.org/D122293 Files: lldb/include/lldb/Target/TraceCursor.h lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp lldb/source/Plugins/Trace/intel-pt/DecodedThread.h lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp lldb/source/Target/TraceInstructionDumper.cpp lldb/test/API/commands/trace/TestTraceDumpInfo.py lldb/test/API/commands/trace/TestTraceLoad.py Index: lldb/test/API/commands/trace/TestTraceLoad.py === --- lldb/test/API/commands/trace/TestTraceLoad.py +++ lldb/test/API/commands/trace/TestTraceLoad.py @@ -38,7 +38,8 @@ thread #1: tid = 3842849 Raw trace size: 4 KiB Total number of instructions: 21 - Total approximate memory usage: 5.38 KiB''']) + Total approximate memory usage: 5.31 KiB + Average memory usage per instruction: 259 bytes''']) def testLoadInvalidTraces(self): src_dir = self.getSourceDir() Index: lldb/test/API/commands/trace/TestTraceDumpInfo.py === --- lldb/test/API/commands/trace/TestTraceDumpInfo.py +++ lldb/test/API/commands/trace/TestTraceDumpInfo.py @@ -40,4 +40,5 @@ thread #1: tid = 3842849 Raw trace size: 4 KiB Total number of instructions: 21 - Total approximate memory usage: 5.38 KiB''']) + Total approximate memory usage: 5.31 KiB + Average memory usage per instruction: 259 bytes''']) Index: lldb/source/Target/TraceInstructionDumper.cpp === --- lldb/source/Target/TraceInstructionDumper.cpp +++ lldb/source/Target/TraceInstructionDumper.cpp @@ -250,14 +250,14 @@ break; } -if (Error err = m_cursor_up->GetError()) { +if (const char *err = m_cursor_up->GetError()) { if (!m_cursor_up->IsForwards() && !was_prev_instruction_an_error) printMissingInstructionsMessage(); was_prev_instruction_an_error = true; printInstructionIndex(); - s << toString(std::move(err)); + s << err; } else { if (m_cursor_up->IsForwards() && was_prev_instruction_an_error) printMissingInstructionsMessage(); Index: lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp === --- lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp +++ lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp @@ -112,12 +112,15 @@ } s.Printf("\n"); + size_t insn_len = Decode(thread)->GetInstructions().size(); size_t mem_used = Decode(thread)->CalculateApproximateMemoryUsage(); + s.Printf(" Raw trace size: %zu KiB\n", *raw_size / 1024); - s.Printf(" Total number of instructions: %zu\n", - Decode(thread)->GetInstructions().size()); + s.Printf(" Total number of instructions: %zu\n", insn_len); s.Printf(" Total approximate memory usage: %0.2lf KiB\n", (double)mem_used / 1024); + s.Printf(" Average memory usage per instruction: %zu bytes\n", + mem_used / insn_len); return; } Index: lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h === --- lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h +++ lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h @@ -24,7 +24,7 @@ virtual bool Next() override; - llvm::Error GetError() override; + const char *GetError() override; lldb::addr_t GetLoadAddress() override; Index: lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp === --- lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp +++ lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp @@ -77,8 +77,8 @@ return m_decoded_thread_sp->GetInstructions()[m_pos].IsError(); } -Error TraceCursorIntelPT::GetError() { - return m_decoded_thread_sp->GetInstructions()[m_pos].ToError(); +const char *TraceCursorIntelPT::GetError() { + return m_decoded_thread_sp->GetErrorByInstructionIndex(m_pos); } lldb::addr_t TraceCursorIntelPT::GetLoadAddress() { Index: lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp === --- lldb/s
[Lldb-commits] [lldb] bcf1978 - [intelpt] Refactoring instruction decoding for flexibility
Author: Alisamar Husain Date: 2022-03-26T11:34:47-07:00 New Revision: bcf1978a871535e297c965195afe467134164413 URL: https://github.com/llvm/llvm-project/commit/bcf1978a871535e297c965195afe467134164413 DIFF: https://github.com/llvm/llvm-project/commit/bcf1978a871535e297c965195afe467134164413.diff LOG: [intelpt] Refactoring instruction decoding for flexibility Now the decoded thread has Append methods that provide more flexibility in terms of the underlying data structure that represents the instructions. In this case, we are able to represent the sporadic errors as map and thus reduce the size of each instruction. Differential Revision: https://reviews.llvm.org/D122293 Added: Modified: lldb/include/lldb/Target/TraceCursor.h lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp lldb/source/Plugins/Trace/intel-pt/DecodedThread.h lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp lldb/source/Target/TraceInstructionDumper.cpp lldb/test/API/commands/trace/TestTraceDumpInfo.py lldb/test/API/commands/trace/TestTraceLoad.py Removed: diff --git a/lldb/include/lldb/Target/TraceCursor.h b/lldb/include/lldb/Target/TraceCursor.h index 83ab22b367c53..2e3c4eb22b04e 100644 --- a/lldb/include/lldb/Target/TraceCursor.h +++ b/lldb/include/lldb/Target/TraceCursor.h @@ -170,9 +170,9 @@ class TraceCursor { /// the trace. /// /// \return - /// \b llvm::Error::success if the cursor is not pointing to an error in - /// the trace. Otherwise return an \a llvm::Error describing the issue. - virtual llvm::Error GetError() = 0; + /// \b nullptr if the cursor is not pointing to an error in + /// the trace. Otherwise return the actual error message. + virtual const char *GetError() = 0; /// \return /// The load address of the instruction the cursor is pointing at. If the diff --git a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp index a81a779302605..3c39c4d9a96d3 100644 --- a/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp +++ b/lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp @@ -35,35 +35,27 @@ void IntelPTError::log(llvm::raw_ostream &OS) const { OS << "error: " << libipt_error_message; } -IntelPTInstruction::IntelPTInstruction(llvm::Error err) { - llvm::handleAllErrors(std::move(err), -[&](std::unique_ptr info) { - m_error = std::move(info); -}); +IntelPTInstruction::IntelPTInstruction() { m_pt_insn.ip = LLDB_INVALID_ADDRESS; m_pt_insn.iclass = ptic_error; + m_is_error = true; } -bool IntelPTInstruction::IsError() const { return (bool)m_error; } +bool IntelPTInstruction::IsError() const { return m_is_error; } lldb::addr_t IntelPTInstruction::GetLoadAddress() const { return m_pt_insn.ip; } -size_t IntelPTInstruction::GetNonErrorMemoryUsage() { return sizeof(IntelPTInstruction); } +size_t IntelPTInstruction::GetMemoryUsage() { + return sizeof(IntelPTInstruction); +} Optional IntelPTInstruction::GetTimestampCounter() const { return m_timestamp; } -Error IntelPTInstruction::ToError() const { - if (!IsError()) -return Error::success(); - - if (m_error->isA()) -return make_error(static_cast(*m_error)); - return make_error(m_error->message(), - m_error->convertToErrorCode()); +Optional DecodedThread::GetRawTraceSize() const { + return m_raw_trace_size; } -size_t DecodedThread::GetRawTraceSize() const { return m_raw_trace_size; } TraceInstructionControlFlowType IntelPTInstruction::GetControlFlowType(lldb::addr_t next_load_address) const { @@ -96,31 +88,44 @@ IntelPTInstruction::GetControlFlowType(lldb::addr_t next_load_address) const { return mask; } +ThreadSP DecodedThread::GetThread() { return m_thread_sp; } + +void DecodedThread::AppendError(llvm::Error &&error) { + m_errors.try_emplace(m_instructions.size(), toString(std::move(error))); + m_instructions.emplace_back(); +} + ArrayRef DecodedThread::GetInstructions() const { return makeArrayRef(m_instructions); } -DecodedThread::DecodedThread(ThreadSP thread_sp, Error error) -: m_thread_sp(thread_sp) { - m_instructions.emplace_back(std::move(error)); +const char *DecodedThread::GetErrorByInstructionIndex(uint64_t idx) { + auto it = m_errors.find(idx); + if (it == m_errors.end()) +return nullptr; + + return it->second.c_str(); } -DecodedThread::DecodedThread(ThreadSP thread_sp, - std::vector &&instructions, - size_t raw_trace_size) -: m_thread_sp(thread_sp), m_instructions(std::move(instructions)), - m_raw_trace_size(ra
[Lldb-commits] [PATCH] D122293: [intelpt] Refactoring instruction decoding for flexibility
This revision was automatically updated to reflect the committed changes. Closed by commit rGbcf1978a8715: [intelpt] Refactoring instruction decoding for flexibility (authored by zrthxn, committed by Walter Erquinigo). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D122293/new/ https://reviews.llvm.org/D122293 Files: lldb/include/lldb/Target/TraceCursor.h lldb/source/Plugins/Trace/intel-pt/DecodedThread.cpp lldb/source/Plugins/Trace/intel-pt/DecodedThread.h lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp lldb/source/Target/TraceInstructionDumper.cpp lldb/test/API/commands/trace/TestTraceDumpInfo.py lldb/test/API/commands/trace/TestTraceLoad.py Index: lldb/test/API/commands/trace/TestTraceLoad.py === --- lldb/test/API/commands/trace/TestTraceLoad.py +++ lldb/test/API/commands/trace/TestTraceLoad.py @@ -38,7 +38,8 @@ thread #1: tid = 3842849 Raw trace size: 4 KiB Total number of instructions: 21 - Total approximate memory usage: 5.38 KiB''']) + Total approximate memory usage: 5.31 KiB + Average memory usage per instruction: 259 bytes''']) def testLoadInvalidTraces(self): src_dir = self.getSourceDir() Index: lldb/test/API/commands/trace/TestTraceDumpInfo.py === --- lldb/test/API/commands/trace/TestTraceDumpInfo.py +++ lldb/test/API/commands/trace/TestTraceDumpInfo.py @@ -40,4 +40,5 @@ thread #1: tid = 3842849 Raw trace size: 4 KiB Total number of instructions: 21 - Total approximate memory usage: 5.38 KiB''']) + Total approximate memory usage: 5.31 KiB + Average memory usage per instruction: 259 bytes''']) Index: lldb/source/Target/TraceInstructionDumper.cpp === --- lldb/source/Target/TraceInstructionDumper.cpp +++ lldb/source/Target/TraceInstructionDumper.cpp @@ -250,14 +250,14 @@ break; } -if (Error err = m_cursor_up->GetError()) { +if (const char *err = m_cursor_up->GetError()) { if (!m_cursor_up->IsForwards() && !was_prev_instruction_an_error) printMissingInstructionsMessage(); was_prev_instruction_an_error = true; printInstructionIndex(); - s << toString(std::move(err)); + s << err; } else { if (m_cursor_up->IsForwards() && was_prev_instruction_an_error) printMissingInstructionsMessage(); Index: lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp === --- lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp +++ lldb/source/Plugins/Trace/intel-pt/TraceIntelPT.cpp @@ -112,12 +112,15 @@ } s.Printf("\n"); + size_t insn_len = Decode(thread)->GetInstructions().size(); size_t mem_used = Decode(thread)->CalculateApproximateMemoryUsage(); + s.Printf(" Raw trace size: %zu KiB\n", *raw_size / 1024); - s.Printf(" Total number of instructions: %zu\n", - Decode(thread)->GetInstructions().size()); + s.Printf(" Total number of instructions: %zu\n", insn_len); s.Printf(" Total approximate memory usage: %0.2lf KiB\n", (double)mem_used / 1024); + s.Printf(" Average memory usage per instruction: %zu bytes\n", + mem_used / insn_len); return; } Index: lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h === --- lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h +++ lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.h @@ -24,7 +24,7 @@ virtual bool Next() override; - llvm::Error GetError() override; + const char *GetError() override; lldb::addr_t GetLoadAddress() override; Index: lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp === --- lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp +++ lldb/source/Plugins/Trace/intel-pt/TraceCursorIntelPT.cpp @@ -77,8 +77,8 @@ return m_decoded_thread_sp->GetInstructions()[m_pos].IsError(); } -Error TraceCursorIntelPT::GetError() { - return m_decoded_thread_sp->GetInstructions()[m_pos].ToError(); +const char *TraceCursorIntelPT::GetError() { + return m_decoded_thread_sp->GetErrorByInstructionIndex(m_pos); } lldb::addr_t TraceCursorIntelPT::GetLoadAddress() { Index: lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp === --- lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp +++ lldb/source/Plugins/Trace/intel-pt/IntelPTDecoder.cpp @@ -16,6 +16,7 @@ #include "lldb/Core/Section.h" #include "lldb/Target/Target.h" #include "lldb/Utility/StringExtractor.h" +
[Lldb-commits] [lldb] bc13101 - [lldb] Fix building for mingw after changes to sigtstp_handler
Author: Martin Storsjö Date: 2022-03-26T22:32:53+02:00 New Revision: bc13101cf945114f2b573aa66845bec9c20f4e48 URL: https://github.com/llvm/llvm-project/commit/bc13101cf945114f2b573aa66845bec9c20f4e48 DIFF: https://github.com/llvm/llvm-project/commit/bc13101cf945114f2b573aa66845bec9c20f4e48.diff LOG: [lldb] Fix building for mingw after changes to sigtstp_handler Some signal handlers were set up within an !_MSC_VER condition, i.e. omitted in MSVC builds but included in mingw builds. Previously sigtstp_handler was defined in all builds, but since 4bcadd66864bf4af929ac8753a51d7ad408cdef0 / D120320 it's only defined non platforms other than Windows. Change the condition to !_WIN32 for consistency between the MSVC and mingw builds, fixing the build for mingw. Differential Revision: https://reviews.llvm.org/D122486 Added: Modified: lldb/tools/driver/Driver.cpp Removed: diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index cf396c37fd3a9..16fa2f1393d54 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -829,7 +829,7 @@ int main(int argc, char const *argv[]) { SBHostOS::ThreadCreated(""); signal(SIGINT, sigint_handler); -#if !defined(_MSC_VER) +#if !defined(_WIN32) signal(SIGPIPE, SIG_IGN); signal(SIGWINCH, sigwinch_handler); signal(SIGTSTP, sigtstp_handler); ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] b548f58 - [lldb] Fix interpreting absolute Windows paths with forward slashes
Author: Martin Storsjö Date: 2022-03-26T22:34:02+02:00 New Revision: b548f5847235118878c15caa8df1b89e75fc965b URL: https://github.com/llvm/llvm-project/commit/b548f5847235118878c15caa8df1b89e75fc965b DIFF: https://github.com/llvm/llvm-project/commit/b548f5847235118878c15caa8df1b89e75fc965b.diff LOG: [lldb] Fix interpreting absolute Windows paths with forward slashes In practice, Windows paths can use either backslashes or forward slashes. This fixes an issue reported downstream at https://github.com/mstorsjo/llvm-mingw/issues/266. Differential Revision: https://reviews.llvm.org/D122389 Added: Modified: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp lldb/source/Utility/FileSpec.cpp lldb/unittests/Utility/FileSpecTest.cpp Removed: diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp index 085c9e9ce1a6e..295433ddb78b9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -772,7 +772,8 @@ removeHostnameFromPathname(llvm::StringRef path_from_dwarf) { // check whether we have a windows path, and so the first character is a // drive-letter not a hostname. - if (host.size() == 1 && llvm::isAlpha(host[0]) && path.startswith("\\")) + if (host.size() == 1 && llvm::isAlpha(host[0]) && + (path.startswith("\\") || path.startswith("/"))) return path_from_dwarf; return path; diff --git a/lldb/source/Utility/FileSpec.cpp b/lldb/source/Utility/FileSpec.cpp index 24f8c2b1c23fc..eed3bbd46026f 100644 --- a/lldb/source/Utility/FileSpec.cpp +++ b/lldb/source/Utility/FileSpec.cpp @@ -311,7 +311,8 @@ llvm::Optional FileSpec::GuessPathStyle(llvm::StringRef absolut if (absolute_path.startswith(R"(\\)")) return Style::windows; if (absolute_path.size() >= 3 && llvm::isAlpha(absolute_path[0]) && - absolute_path.substr(1, 2) == R"(:\)") + (absolute_path.substr(1, 2) == R"(:\)" || + absolute_path.substr(1, 2) == R"(:/)")) return Style::windows; return llvm::None; } diff --git a/lldb/unittests/Utility/FileSpecTest.cpp b/lldb/unittests/Utility/FileSpecTest.cpp index 64b72bec483e5..f92be63892cd9 100644 --- a/lldb/unittests/Utility/FileSpecTest.cpp +++ b/lldb/unittests/Utility/FileSpecTest.cpp @@ -196,9 +196,12 @@ TEST(FileSpecTest, GuessPathStyle) { 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"(C:/foo.txt)")); EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(\\net\foo.txt)")); EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(Z:\)")); + EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(Z:/)")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo.txt")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo/bar.txt")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("Z:")); ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D122486: [lldb] Fix building for mingw after changes to sigtstp_handler
This revision was automatically updated to reflect the committed changes. Closed by commit rGbc13101cf945: [lldb] Fix building for mingw after changes to sigtstp_handler (authored by mstorsjo). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D122486/new/ https://reviews.llvm.org/D122486 Files: lldb/tools/driver/Driver.cpp Index: lldb/tools/driver/Driver.cpp === --- lldb/tools/driver/Driver.cpp +++ lldb/tools/driver/Driver.cpp @@ -829,7 +829,7 @@ SBHostOS::ThreadCreated(""); signal(SIGINT, sigint_handler); -#if !defined(_MSC_VER) +#if !defined(_WIN32) signal(SIGPIPE, SIG_IGN); signal(SIGWINCH, sigwinch_handler); signal(SIGTSTP, sigtstp_handler); Index: lldb/tools/driver/Driver.cpp === --- lldb/tools/driver/Driver.cpp +++ lldb/tools/driver/Driver.cpp @@ -829,7 +829,7 @@ SBHostOS::ThreadCreated(""); signal(SIGINT, sigint_handler); -#if !defined(_MSC_VER) +#if !defined(_WIN32) signal(SIGPIPE, SIG_IGN); signal(SIGWINCH, sigwinch_handler); signal(SIGTSTP, sigtstp_handler); ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [PATCH] D122389: [lldb] Fix interpreting absolute Windows paths with forward slashes
This revision was automatically updated to reflect the committed changes. Closed by commit rGb548f5847235: [lldb] Fix interpreting absolute Windows paths with forward slashes (authored by mstorsjo). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D122389/new/ https://reviews.llvm.org/D122389 Files: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp lldb/source/Utility/FileSpec.cpp lldb/unittests/Utility/FileSpecTest.cpp Index: lldb/unittests/Utility/FileSpecTest.cpp === --- lldb/unittests/Utility/FileSpecTest.cpp +++ lldb/unittests/Utility/FileSpecTest.cpp @@ -196,9 +196,12 @@ 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"(C:/foo.txt)")); EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(\\net\foo.txt)")); EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(Z:\)")); + EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(Z:/)")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo.txt")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo/bar.txt")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("Z:")); Index: lldb/source/Utility/FileSpec.cpp === --- lldb/source/Utility/FileSpec.cpp +++ lldb/source/Utility/FileSpec.cpp @@ -311,7 +311,8 @@ if (absolute_path.startswith(R"(\\)")) return Style::windows; if (absolute_path.size() >= 3 && llvm::isAlpha(absolute_path[0]) && - absolute_path.substr(1, 2) == R"(:\)") + (absolute_path.substr(1, 2) == R"(:\)" || + absolute_path.substr(1, 2) == R"(:/)")) return Style::windows; return llvm::None; } Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp === --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -772,7 +772,8 @@ // check whether we have a windows path, and so the first character is a // drive-letter not a hostname. - if (host.size() == 1 && llvm::isAlpha(host[0]) && path.startswith("\\")) + if (host.size() == 1 && llvm::isAlpha(host[0]) && + (path.startswith("\\") || path.startswith("/"))) return path_from_dwarf; return path; Index: lldb/unittests/Utility/FileSpecTest.cpp === --- lldb/unittests/Utility/FileSpecTest.cpp +++ lldb/unittests/Utility/FileSpecTest.cpp @@ -196,9 +196,12 @@ 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"(C:/foo.txt)")); EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(\\net\foo.txt)")); EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(Z:\)")); + EXPECT_EQ(FileSpec::Style::windows, FileSpec::GuessPathStyle(R"(Z:/)")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo.txt")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("foo/bar.txt")); EXPECT_EQ(llvm::None, FileSpec::GuessPathStyle("Z:")); Index: lldb/source/Utility/FileSpec.cpp === --- lldb/source/Utility/FileSpec.cpp +++ lldb/source/Utility/FileSpec.cpp @@ -311,7 +311,8 @@ if (absolute_path.startswith(R"(\\)")) return Style::windows; if (absolute_path.size() >= 3 && llvm::isAlpha(absolute_path[0]) && - absolute_path.substr(1, 2) == R"(:\)") + (absolute_path.substr(1, 2) == R"(:\)" || + absolute_path.substr(1, 2) == R"(:/)")) return Style::windows; return llvm::None; } Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp === --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -772,7 +772,8 @@ // check whether we have a windows path, and so the first character is a // drive-letter not a hostname. - if (host.size() == 1 && llvm::isAlpha(host[0]) && path.startswith("\\")) + if (host.size() == 1 && llvm::isAlpha(host[0]) && + (path.startswith("\\") || path.startswith("/"))) return path_from_dwarf; return path; ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits