diff options
Diffstat (limited to 'clang/lib/Frontend')
-rw-r--r-- | clang/lib/Frontend/ASTUnit.cpp | 29 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 11 |
2 files changed, 38 insertions, 2 deletions
diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 3827891..c5c5bb7 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -87,6 +87,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SaveAndRestore.h" #include "llvm/Support/Timer.h" #include "llvm/Support/VirtualFileSystem.h" #include "llvm/Support/raw_ostream.h" @@ -524,6 +525,7 @@ class ASTInfoCollector : public ASTReaderListener { IntrusiveRefCntPtr<TargetInfo> &Target; unsigned &Counter; bool InitializedLanguage = false; + bool InitializedHeaderSearchPaths = false; public: ASTInfoCollector(Preprocessor &PP, ASTContext *Context, @@ -550,7 +552,34 @@ public: bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, bool Complain) override { + // Preserve previously set header search paths. + llvm::SaveAndRestore X(this->HSOpts.UserEntries); + llvm::SaveAndRestore Y(this->HSOpts.SystemHeaderPrefixes); + llvm::SaveAndRestore Z(this->HSOpts.VFSOverlayFiles); + this->HSOpts = HSOpts; + + return false; + } + + bool ReadHeaderSearchPaths(const HeaderSearchOptions &HSOpts, + bool Complain) override { + if (InitializedHeaderSearchPaths) + return false; + + this->HSOpts.UserEntries = HSOpts.UserEntries; + this->HSOpts.SystemHeaderPrefixes = HSOpts.SystemHeaderPrefixes; + this->HSOpts.VFSOverlayFiles = HSOpts.VFSOverlayFiles; + + // Initialize the FileManager. We can't do this in update(), since that + // performs the initialization too late (once both target and language + // options are read). + PP.getFileManager().setVirtualFileSystem(createVFSFromOverlayFiles( + HSOpts.VFSOverlayFiles, PP.getDiagnostics(), + PP.getFileManager().getVirtualFileSystemPtr())); + + InitializedHeaderSearchPaths = true; + return false; } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 9536319..a637b92 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4737,12 +4737,19 @@ IntrusiveRefCntPtr<llvm::vfs::FileSystem> clang::createVFSFromCompilerInvocation( const CompilerInvocation &CI, DiagnosticsEngine &Diags, IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS) { - if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty()) + return createVFSFromOverlayFiles(CI.getHeaderSearchOpts().VFSOverlayFiles, + Diags, std::move(BaseFS)); +} + +IntrusiveRefCntPtr<llvm::vfs::FileSystem> clang::createVFSFromOverlayFiles( + ArrayRef<std::string> VFSOverlayFiles, DiagnosticsEngine &Diags, + IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS) { + if (VFSOverlayFiles.empty()) return BaseFS; IntrusiveRefCntPtr<llvm::vfs::FileSystem> Result = BaseFS; // earlier vfs files are on the bottom - for (const auto &File : CI.getHeaderSearchOpts().VFSOverlayFiles) { + for (const auto &File : VFSOverlayFiles) { llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = Result->getBufferForFile(File); if (!Buffer) { |