1212#include " clang/CAS/IncludeTree.h"
1313#include " clang/Frontend/CompilerInstance.h"
1414#include " clang/Lex/Preprocessor.h"
15+ #include " llvm/CAS/CASProvidingFileSystem.h"
1516#include " llvm/CAS/ObjectStore.h"
1617#include " llvm/Support/PrefixMapper.h"
1718#include " llvm/Support/PrefixMappingFileSystem.h"
@@ -26,9 +27,9 @@ class IncludeTreeBuilder;
2627
2728class IncludeTreeActionController : public CallbackActionController {
2829public:
29- IncludeTreeActionController (cas::ObjectStore & DB,
30+ IncludeTreeActionController (std::shared_ptr< cas::ObjectStore> DB,
3031 LookupModuleOutputCallback LookupOutput)
31- : CallbackActionController(LookupOutput), DB(DB ) {}
32+ : CallbackActionController(LookupOutput), DB(std::move(DB) ) {}
3233
3334 Expected<cas::IncludeTreeRoot> getIncludeTree ();
3435
@@ -52,7 +53,7 @@ class IncludeTreeActionController : public CallbackActionController {
5253 }
5354
5455private:
55- cas::ObjectStore & DB;
56+ std::shared_ptr< cas::ObjectStore> DB;
5657 CASOptions CASOpts;
5758 llvm::PrefixMapper PrefixMapper;
5859 // IncludeTreePPCallbacks keeps a pointer to the current builder, so use a
@@ -274,22 +275,6 @@ class LookupPCHModulesListener : public ASTReaderListener {
274275};
275276} // namespace
276277
277- // / The PCH recorded file paths with canonical paths, create a VFS that
278- // / allows remapping back to the non-canonical source paths so that they are
279- // / found during dep-scanning.
280- void dependencies::addReversePrefixMappingFileSystem (
281- const llvm::PrefixMapper &PrefixMapper, CompilerInstance &ScanInstance) {
282- llvm::PrefixMapper ReverseMapper;
283- ReverseMapper.addInverseRange (PrefixMapper.getMappings ());
284- ReverseMapper.sort ();
285- IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
286- llvm::vfs::createPrefixMappingFileSystem (
287- std::move (ReverseMapper), &ScanInstance.getVirtualFileSystem ());
288-
289- ScanInstance.setVirtualFileSystem (FS);
290- ScanInstance.getFileManager ().setVirtualFileSystem (std::move (FS));
291- }
292-
293278Expected<cas::IncludeTreeRoot> IncludeTreeActionController::getIncludeTree () {
294279 if (IncludeTreeResult)
295280 return *IncludeTreeResult;
@@ -301,25 +286,35 @@ Error IncludeTreeActionController::initialize(
301286 CompilerInstance &ScanInstance, CompilerInvocation &NewInvocation) {
302287 DepscanPrefixMapping::configurePrefixMapper (NewInvocation, PrefixMapper);
303288
304- auto ensurePathRemapping = [&]() {
305- if (PrefixMapper. empty ())
306- return ;
307-
289+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
290+ ScanInstance. getVirtualFileSystemPtr ();
291+ FS = llvm::cas::createCASProvidingFileSystem (DB, std::move (FS)) ;
292+ if (!PrefixMapper. empty ()) {
308293 PreprocessorOptions &PPOpts = ScanInstance.getPreprocessorOpts ();
309- if (PPOpts.Includes .empty () && PPOpts.ImplicitPCHInclude .empty () &&
310- !ScanInstance.getLangOpts ().Modules )
311- return ;
312-
313- addReversePrefixMappingFileSystem (PrefixMapper, ScanInstance);
294+ if (!PPOpts.Includes .empty () || !PPOpts.ImplicitPCHInclude .empty () ||
295+ ScanInstance.getLangOpts ().Modules ) {
296+
297+ // / The PCH recorded file paths with canonical paths, create a VFS that
298+ // / allows remapping back to the non-canonical source paths so that they
299+ // / are found during dep-scanning.
300+ llvm::PrefixMapper ReverseMapper;
301+ ReverseMapper.addInverseRange (PrefixMapper.getMappings ());
302+ ReverseMapper.sort ();
303+
304+ FS = llvm::vfs::createPrefixMappingFileSystem (std::move (ReverseMapper),
305+ std::move (FS));
306+ }
314307
315308 // These are written in the predefines buffer, so we need to remap them.
316309 for (std::string &Include : PPOpts.Includes )
317310 PrefixMapper.mapInPlace (Include);
318- };
319- ensurePathRemapping ();
311+ }
312+
313+ ScanInstance.setVirtualFileSystem (FS);
314+ ScanInstance.getFileManager ().setVirtualFileSystem (std::move (FS));
320315
321316 BuilderStack.push_back (
322- std::make_unique<IncludeTreeBuilder>(DB, PrefixMapper));
317+ std::make_unique<IncludeTreeBuilder>(* DB, PrefixMapper));
323318
324319 // Attach callbacks for the IncludeTree of the TU. The preprocessor
325320 // does not exist yet, so we need to indirect this via DependencyCollector.
@@ -400,7 +395,7 @@ std::optional<std::string> IncludeTreeActionController::getCacheKey(
400395Error IncludeTreeActionController::initializeModuleBuild (
401396 CompilerInstance &ModuleScanInstance) {
402397 BuilderStack.push_back (
403- std::make_unique<IncludeTreeBuilder>(DB, PrefixMapper));
398+ std::make_unique<IncludeTreeBuilder>(* DB, PrefixMapper));
404399
405400 // Attach callbacks for the IncludeTree of the module. The preprocessor
406401 // does not exist yet, so we need to indirect this via DependencyCollector.
@@ -942,6 +937,6 @@ IncludeTreeBuilder::createIncludeFile(StringRef Filename,
942937
943938std::unique_ptr<DependencyActionController>
944939dependencies::createIncludeTreeActionController (
945- LookupModuleOutputCallback LookupModuleOutput, cas::ObjectStore & DB) {
946- return std::make_unique<IncludeTreeActionController>(DB , LookupModuleOutput);
940+ LookupModuleOutputCallback LookupModuleOutput, std::shared_ptr< cas::ObjectStore> DB) {
941+ return std::make_unique<IncludeTreeActionController>(std::move (DB) , LookupModuleOutput);
947942}
0 commit comments