diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2016-12-22 07:06:03 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2016-12-22 07:06:03 +0000 |
commit | 82ec4fde42176d315fd859514c3b3d0aa364acf0 (patch) | |
tree | 675f3f87f7577d48bf8fdaa6d64eda17174ecb34 /clang/lib/Frontend/CompilerInstance.cpp | |
parent | e3f5064b723536b34a9477c884b920938601b3fe (diff) | |
download | llvm-82ec4fde42176d315fd859514c3b3d0aa364acf0.zip llvm-82ec4fde42176d315fd859514c3b3d0aa364acf0.tar.gz llvm-82ec4fde42176d315fd859514c3b3d0aa364acf0.tar.bz2 |
[CrashReproducer] Add support for merging -ivfsoverlay
Merge all VFS mapped files inside -ivfsoverlay inputs into the vfs
overlay provided by the crash reproducer. This is the last missing piece
to allow crash reproducers to fully work with user frameworks; when
combined with headermaps, it allows clang to find additional frameworks.
rdar://problem/27913709
llvm-svn: 290326
Diffstat (limited to 'clang/lib/Frontend/CompilerInstance.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 5c78f81..ccddd14 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -181,6 +181,26 @@ static void collectIncludePCH(CompilerInstance &CI, } } +static void collectVFSEntries(CompilerInstance &CI, + std::shared_ptr<ModuleDependencyCollector> MDC) { + if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty()) + return; + + // Collect all VFS found. + SmallVector<vfs::YAMLVFSEntry, 16> VFSEntries; + for (const std::string &VFSFile : CI.getHeaderSearchOpts().VFSOverlayFiles) { + llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = + llvm::MemoryBuffer::getFile(VFSFile); + if (!Buffer) + return; + vfs::collectVFSFromYAML(std::move(Buffer.get()), /*DiagHandler*/ nullptr, + VFSFile, VFSEntries); + } + + for (auto &E : VFSEntries) + MDC->addFile(E.VPath, E.RPath); +} + // Diagnostics static void SetUpDiagnosticLog(DiagnosticOptions *DiagOpts, const CodeGenOptions *CodeGenOpts, @@ -412,6 +432,7 @@ void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) { addDependencyCollector(ModuleDepCollector); collectHeaderMaps(PP->getHeaderSearchInfo(), ModuleDepCollector); collectIncludePCH(*this, ModuleDepCollector); + collectVFSEntries(*this, ModuleDepCollector); } for (auto &Listener : DependencyCollectors) |