Author: Jonas Devlieghere Date: 2020-08-20T18:08:59-07:00 New Revision: c90ca0c8e4956e051e2f29cff0c38f9f03b32f87
URL: https://github.com/llvm/llvm-project/commit/c90ca0c8e4956e051e2f29cff0c38f9f03b32f87 DIFF: https://github.com/llvm/llvm-project/commit/c90ca0c8e4956e051e2f29cff0c38f9f03b32f87.diff LOG: [lldb] Implement WorkingDirectoryProvider in terms of DirectoryProvider (NFC) Add an abstract base class that can be used to create other directory providers. Added: Modified: lldb/include/lldb/Utility/Reproducer.h lldb/source/API/SBReproducer.cpp lldb/source/Initialization/SystemInitializerCommon.cpp lldb/source/Utility/Reproducer.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Utility/Reproducer.h b/lldb/include/lldb/Utility/Reproducer.h index 21f43b6ad5e0..da8fd6754a20 100644 --- a/lldb/include/lldb/Utility/Reproducer.h +++ b/lldb/include/lldb/Utility/Reproducer.h @@ -138,28 +138,46 @@ class VersionProvider : public Provider<VersionProvider> { static char ID; }; -/// Provider for the LLDB current working directory. +/// Abstract provider to storing directory paths. +template <typename T> class DirectoryProvider : public repro::Provider<T> { +public: + DirectoryProvider(const FileSpec &root) : Provider<T>(root) {} + void SetDirectory(std::string directory) { + m_directory = std::move(directory); + } + llvm::StringRef GetDirectory() { return m_directory; } + + void Keep() override { + FileSpec file = this->GetRoot().CopyByAppendingPathComponent(T::Info::file); + std::error_code ec; + llvm::raw_fd_ostream os(file.GetPath(), ec, llvm::sys::fs::OF_Text); + if (ec) + return; + os << m_directory << "\n"; + } + +protected: + std::string m_directory; +}; + +/// Provider for the current working directory. /// /// When the reproducer is kept, it writes lldb's current working directory to /// a file named cwd.txt in the reproducer root. -class WorkingDirectoryProvider : public Provider<WorkingDirectoryProvider> { +class WorkingDirectoryProvider + : public DirectoryProvider<WorkingDirectoryProvider> { public: - WorkingDirectoryProvider(const FileSpec &directory) : Provider(directory) { + WorkingDirectoryProvider(const FileSpec &directory) + : DirectoryProvider(directory) { llvm::SmallString<128> cwd; if (std::error_code EC = llvm::sys::fs::current_path(cwd)) return; - m_cwd = std::string(cwd.str()); + SetDirectory(std::string(cwd)); } - - void Update(llvm::StringRef path) { m_cwd = std::string(path); } - llvm::StringRef GetWorkingDirectory() { return m_cwd; } - struct Info { static const char *name; static const char *file; }; - void Keep() override; - std::string m_cwd; static char ID; }; diff --git a/lldb/source/API/SBReproducer.cpp b/lldb/source/API/SBReproducer.cpp index 9815bf11263c..7d08a88fe9e3 100644 --- a/lldb/source/API/SBReproducer.cpp +++ b/lldb/source/API/SBReproducer.cpp @@ -235,9 +235,9 @@ const char *SBReproducer::GetPath() { void SBReproducer::SetWorkingDirectory(const char *path) { if (auto *g = lldb_private::repro::Reproducer::Instance().GetGenerator()) { auto &wp = g->GetOrCreate<repro::WorkingDirectoryProvider>(); - wp.Update(path); + wp.SetDirectory(path); auto &fp = g->GetOrCreate<repro::FileProvider>(); - fp.RecordInterestingDirectory(wp.GetWorkingDirectory()); + fp.RecordInterestingDirectory(wp.GetDirectory()); } } diff --git a/lldb/source/Initialization/SystemInitializerCommon.cpp b/lldb/source/Initialization/SystemInitializerCommon.cpp index 028040b59683..c3bef4139bcc 100644 --- a/lldb/source/Initialization/SystemInitializerCommon.cpp +++ b/lldb/source/Initialization/SystemInitializerCommon.cpp @@ -75,7 +75,7 @@ static llvm::Error InitializeFileSystem() { repro::WorkingDirectoryProvider &wp = g->GetOrCreate<repro::WorkingDirectoryProvider>(); - fp.RecordInterestingDirectory(wp.GetWorkingDirectory()); + fp.RecordInterestingDirectory(wp.GetDirectory()); return llvm::Error::success(); } diff --git a/lldb/source/Utility/Reproducer.cpp b/lldb/source/Utility/Reproducer.cpp index 4441f3d475ea..935e41a08a4e 100644 --- a/lldb/source/Utility/Reproducer.cpp +++ b/lldb/source/Utility/Reproducer.cpp @@ -290,15 +290,6 @@ void VersionProvider::Keep() { os << m_version << "\n"; } -void WorkingDirectoryProvider::Keep() { - FileSpec file = GetRoot().CopyByAppendingPathComponent(Info::file); - std::error_code ec; - llvm::raw_fd_ostream os(file.GetPath(), ec, llvm::sys::fs::OF_Text); - if (ec) - return; - os << m_cwd << "\n"; -} - void FileProvider::RecordInterestingDirectory(const llvm::Twine &dir) { if (m_collector) m_collector->addFile(dir); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits