================ @@ -90,63 +90,132 @@ static bool checkHeaderSearchPaths(const HeaderSearchOptions &HSOpts, using PrebuiltModuleFilesT = decltype(HeaderSearchOptions::PrebuiltModuleFiles); -/// A listener that collects the imported modules and optionally the input -/// files. +/// A listener that collects the imported modules and the input +/// files. While visiting, collect vfsoverlays and file inputs that determine +/// whether prebuilt modules fully resolve in stable directories. class PrebuiltModuleListener : public ASTReaderListener { public: PrebuiltModuleListener(PrebuiltModuleFilesT &PrebuiltModuleFiles, llvm::SmallVector<std::string> &NewModuleFiles, - PrebuiltModuleVFSMapT &PrebuiltModuleVFSMap, + PrebuiltModulesAttrsMap &PrebuiltModulesASTMap, const HeaderSearchOptions &HSOpts, - const LangOptions &LangOpts, DiagnosticsEngine &Diags) + const LangOptions &LangOpts, DiagnosticsEngine &Diags, + const llvm::SmallVector<StringRef> &StableDirs) : PrebuiltModuleFiles(PrebuiltModuleFiles), NewModuleFiles(NewModuleFiles), - PrebuiltModuleVFSMap(PrebuiltModuleVFSMap), ExistingHSOpts(HSOpts), - ExistingLangOpts(LangOpts), Diags(Diags) {} + PrebuiltModulesASTMap(PrebuiltModulesASTMap), ExistingHSOpts(HSOpts), + ExistingLangOpts(LangOpts), Diags(Diags), StableDirs(StableDirs) {} bool needsImportVisitation() const override { return true; } + bool needsInputFileVisitation() override { return true; } + bool needsSystemInputFileVisitation() override { return true; } + /// Accumulate the modules are transitively depended on by the initial + /// prebuilt module. void visitImport(StringRef ModuleName, StringRef Filename) override { if (PrebuiltModuleFiles.insert({ModuleName.str(), Filename.str()}).second) NewModuleFiles.push_back(Filename.str()); + + if (PrebuiltModulesASTMap.try_emplace(Filename).second) + PrebuiltModulesASTMap[Filename].setInStableDir(!StableDirs.empty()); + + if (auto It = PrebuiltModulesASTMap.find(CurrentFile); + It != PrebuiltModulesASTMap.end() && CurrentFile != Filename) + PrebuiltModulesASTMap[Filename].addDependent(It->getKey()); + } + + /// For each input file discovered, check whether it's external path is in a + /// stable directory. Traversal is stopped if the current module is not + /// considered stable. + bool visitInputFile(StringRef FilenameAsRequested, StringRef ExternalFilename, + bool isSystem, bool isOverridden, + bool isExplicitModule) override { + if (StableDirs.empty()) + return false; + if (!PrebuiltModulesASTMap.contains(CurrentFile) || + !PrebuiltModulesASTMap[CurrentFile].isInStableDir()) + return false; + + PrebuiltModulesASTMap[CurrentFile].setInStableDir( + isPathInStableDir(StableDirs, ExternalFilename)); + return PrebuiltModulesASTMap[CurrentFile].isInStableDir(); ---------------- jansvoboda11 wrote:
Nit: Double lookup. https://github.com/llvm/llvm-project/pull/132237 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits