summaryrefslogtreecommitdiffstats
path: root/lldb/source/Initialization/SystemInitializerCommon.cpp
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-01-29 20:36:38 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-01-29 20:36:38 +0000
commit46575176e9642e9f8567e75e05a98867396803cc (patch)
tree0572584914eb135af50920d5bb3a3faebb7e5911 /lldb/source/Initialization/SystemInitializerCommon.cpp
parent6159e8693ea182078a509b197373fab2127ecd66 (diff)
downloadbcm5719-llvm-46575176e9642e9f8567e75e05a98867396803cc.tar.gz
bcm5719-llvm-46575176e9642e9f8567e75e05a98867396803cc.zip
[Reproducers] Add file provider
This patch adds the file provider which is responsible for capturing files used by LLDB. When capturing a reproducer, we use a file collector that is very similar to the one used in clang. For every file that we touch, we add an entry with a mapping from its virtual to its real path. When we decide to generate a reproducer we copy over the files and their permission into to reproducer folder. When replaying a reproducer, we load the VFS mapping and instantiate a RedirectingFileSystem. The latter will transparently use the files available in the reproducer. I've tested this on two macOS machines with an artificial example. Still, it is very likely that I missed some places where we (still) use native file system calls. I'm hoping to flesh those out while testing with more advanced examples. However, I will fix those things in separate patches. Differential revision: https://reviews.llvm.org/D54617 llvm-svn: 352538
Diffstat (limited to 'lldb/source/Initialization/SystemInitializerCommon.cpp')
-rw-r--r--lldb/source/Initialization/SystemInitializerCommon.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/lldb/source/Initialization/SystemInitializerCommon.cpp b/lldb/source/Initialization/SystemInitializerCommon.cpp
index 2cc3aa8c643..173d48308c6 100644
--- a/lldb/source/Initialization/SystemInitializerCommon.cpp
+++ b/lldb/source/Initialization/SystemInitializerCommon.cpp
@@ -65,6 +65,7 @@ SystemInitializerCommon::Initialize(const InitializerOptions &options) {
}
#endif
+ // Initialize the reproducer.
ReproducerMode mode = ReproducerMode::Off;
if (options.reproducer_capture)
mode = ReproducerMode::Capture;
@@ -74,7 +75,23 @@ SystemInitializerCommon::Initialize(const InitializerOptions &options) {
if (auto e = Reproducer::Initialize(mode, FileSpec(options.reproducer_path)))
return e;
- FileSystem::Initialize();
+ // Initialize the file system.
+ auto &r = repro::Reproducer::Instance();
+ if (repro::Loader *loader = r.GetLoader()) {
+ FileSpec vfs_mapping = loader->GetFile<FileInfo>();
+ if (vfs_mapping) {
+ if (llvm::Error e = FileSystem::Initialize(vfs_mapping))
+ return e;
+ } else {
+ FileSystem::Initialize();
+ }
+ } else if (repro::Generator *g = r.GetGenerator()) {
+ repro::FileProvider &fp = g->GetOrCreate<repro::FileProvider>();
+ FileSystem::Initialize(fp.GetFileCollector());
+ } else {
+ FileSystem::Initialize();
+ }
+
Log::Initialize();
HostInfo::Initialize();
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
OpenPOWER on IntegriCloud