@@ -81,17 +81,11 @@ struct CStringsManager {
8181 return createCStringsRef (*OwnedStdStr.back ());
8282 }
8383};
84-
85- struct DependencyScannerService {
86- DependencyScanningService Service;
87- CStringsManager StrMgr{};
88- };
8984} // end anonymous namespace
9085
9186DEFINE_SIMPLE_CONVERSION_FUNCTIONS (DependencyScannerServiceOptions,
9287 CXDependencyScannerServiceOptions)
93-
94- DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScannerService,
88+ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScanningService,
9589 CXDependencyScannerService)
9690DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScanningWorker,
9791 CXDependencyScannerWorker)
@@ -172,9 +166,9 @@ clang_experimental_DependencyScannerService_create_v0(CXDependencyMode Format) {
172166 // FIXME: Pass default CASOpts and nullptr as CachingOnDiskFileSystem now.
173167 CASOptions CASOpts;
174168 IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> FS;
175- return wrap (new DependencyScannerService{ DependencyScanningService (
169+ return wrap (new DependencyScanningService (
176170 ScanningMode::DependencyDirectivesScan, unwrap (Format), CASOpts,
177- /* CAS=*/ nullptr , /* ActionCache=*/ nullptr , FS)} );
171+ /* CAS=*/ nullptr , /* ActionCache=*/ nullptr , FS));
178172}
179173
180174ScanningOutputFormat DependencyScannerServiceOptions::getFormat () const {
@@ -210,10 +204,10 @@ clang_experimental_DependencyScannerService_create_v1(
210204 FS = llvm::cantFail (
211205 llvm::cas::createCachingOnDiskFileSystem (CAS));
212206 }
213- return wrap (new DependencyScannerService{ DependencyScanningService (
207+ return wrap (new DependencyScanningService (
214208 ScanningMode::DependencyDirectivesScan, Format, unwrap (Opts)->CASOpts ,
215209 std::move (CAS), std::move (Cache), std::move (FS),
216- unwrap (Opts)->OptimizeArgs )} );
210+ unwrap (Opts)->OptimizeArgs ));
217211}
218212
219213void clang_experimental_DependencyScannerService_dispose_v0 (
@@ -223,16 +217,16 @@ void clang_experimental_DependencyScannerService_dispose_v0(
223217
224218CXDependencyScannerWorker clang_experimental_DependencyScannerWorker_create_v0 (
225219 CXDependencyScannerService S) {
226- ScanningOutputFormat Format = unwrap (S)->Service . getFormat ();
220+ ScanningOutputFormat Format = unwrap (S)->getFormat ();
227221 bool IsIncludeTreeOutput = Format == ScanningOutputFormat::IncludeTree ||
228222 Format == ScanningOutputFormat::FullIncludeTree;
229223 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
230224 llvm::vfs::createPhysicalFileSystem ();
231225 if (IsIncludeTreeOutput)
232- FS = llvm::cas::createCASProvidingFileSystem (unwrap (S)->Service . getCAS (),
226+ FS = llvm::cas::createCASProvidingFileSystem (unwrap (S)->getCAS (),
233227 std::move (FS));
234228
235- return wrap (new DependencyScanningWorker (unwrap (S)-> Service , FS));
229+ return wrap (new DependencyScanningWorker (* unwrap (S), FS));
236230}
237231
238232void clang_experimental_DependencyScannerWorker_dispose_v0 (
@@ -566,43 +560,6 @@ CXDiagnosticSet clang_experimental_DepGraph_getDiagnostics(CXDepGraph Graph) {
566560 return unwrap (Graph)->getDiagnosticSet ();
567561}
568562
569- CXCStringArray
570- clang_experimental_DependencyScannerService_getInvalidNegStatCachedPaths (
571- CXDependencyScannerService S) {
572- DependencyScanningService &Service = unwrap (S)->Service ;
573- CStringsManager &StrMgr = unwrap (S)->StrMgr ;
574-
575- // FIXME: CAS currently does not use the shared cache, and cannot produce
576- // the same diagnostics. We should add such a diagnostics to CAS as well.
577- if (Service.useCASFS ())
578- return {nullptr , 0 };
579-
580- DependencyScanningFilesystemSharedCache &SharedCache =
581- Service.getSharedCache ();
582-
583- // Note that it is critical that this FS is the same as the default virtual
584- // file system we pass to the DependencyScanningWorkers.
585- llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
586- llvm::vfs::createPhysicalFileSystem ();
587-
588- auto OutOfDateEntries = SharedCache.getOutOfDateEntries (*FS);
589-
590- // FIXME: replace this code with proper APIs that handles the
591- // OutOfDateEntries.
592- std::vector<const char *> OutOfDatePaths;
593- for (const auto &E : OutOfDateEntries)
594- OutOfDatePaths.emplace_back (E.Path );
595-
596- // FIXME: This code here creates copies of strings from
597- // InvaidNegStatCachedPaths. It is acceptable because this C-API is expected
598- // to be called only at the end of a CXDependencyScannerService's lifetime.
599- // In other words, it is called very infrequently. We can change
600- // CStringsManager's interface to accommodate handling arbitrary StringRefs
601- // (which may not be null terminated) if we want to avoid copying.
602- return StrMgr.createCStringsOwned (
603- {OutOfDatePaths.begin (), OutOfDatePaths.end ()});
604- }
605-
606563static std::string
607564lookupModuleOutput (const ModuleDeps &MD, ModuleOutputKind MOK, void *MLOContext,
608565 std::variant<CXModuleLookupOutputCallback *,
@@ -646,6 +603,98 @@ std::string OutputLookup::lookupModuleOutput(const ModuleDeps &MD,
646603 return PCMPath.first ->second ;
647604}
648605
606+ namespace {
607+ typedef std::vector<DependencyScanningFilesystemSharedCache::OutOfDateEntry>
608+ DependencyScannerFSOutOfDateEntrySet;
609+
610+ typedef DependencyScanningFilesystemSharedCache::OutOfDateEntry
611+ DependencyScannerFSOutOfDateEntry;
612+ } // namespace
613+
614+ DEFINE_SIMPLE_CONVERSION_FUNCTIONS (DependencyScannerFSOutOfDateEntrySet,
615+ CXDepScanFSOutOfDateEntrySet)
616+ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScannerFSOutOfDateEntry,
617+ CXDepScanFSOutOfDateEntry)
618+
619+ CXDepScanFSOutOfDateEntrySet
620+ clang_experimental_DependencyScannerService_getFSCacheOutOfDateEntrySet(
621+ CXDependencyScannerService S) {
622+ DependencyScanningService &Service = *unwrap (S);
623+
624+ // FIXME: CAS FS currently does not use the shared cache, and cannot produce
625+ // the same diagnostics. We should add such a diagnostics to CAS as well.
626+ if (Service.useCASFS ())
627+ return nullptr ;
628+
629+ // Note that it is critical that this FS is the same as the default virtual
630+ // file system we pass to the DependencyScanningWorkers.
631+ llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
632+ llvm::vfs::createPhysicalFileSystem ();
633+
634+ DependencyScannerFSOutOfDateEntrySet *OODEntrySet =
635+ new DependencyScannerFSOutOfDateEntrySet ();
636+ *OODEntrySet = Service.getSharedCache ().getOutOfDateEntries (*FS);
637+
638+ return wrap (OODEntrySet);
639+ }
640+
641+ size_t clang_experimental_DepScanFSCacheOutOfDateEntrySet_getNumOfEntries (
642+ CXDepScanFSOutOfDateEntrySet Entries) {
643+ return unwrap (Entries)->size ();
644+ }
645+
646+ CXDepScanFSOutOfDateEntry
647+ clang_experimental_DepScanFSCacheOutOfDateEntrySet_getEntry (
648+ CXDepScanFSOutOfDateEntrySet Entries, size_t Idx) {
649+ DependencyScannerFSOutOfDateEntrySet *EntSet = unwrap (Entries);
650+ return wrap (&(*EntSet)[Idx]);
651+ }
652+
653+ CXDepScanFSCacheOutOfDateKind
654+ clang_experimental_DepScanFSCacheOutOfDateEntry_getKind (
655+ CXDepScanFSOutOfDateEntry Entry) {
656+ DependencyScannerFSOutOfDateEntry *E = unwrap (Entry);
657+ auto &Info = E->Info ;
658+ return std::visit (
659+ llvm::makeVisitor (
660+ [](const DependencyScannerFSOutOfDateEntry::NegativelyCachedInfo
661+ &Info) { return NegativelyCached; },
662+ [](const DependencyScannerFSOutOfDateEntry::SizeChangedInfo &Info) {
663+ return SizeChanged;
664+ }),
665+ Info);
666+ }
667+
668+ CXString clang_experimental_DepScanFSCacheOutOfDateEntry_getPath (
669+ CXDepScanFSOutOfDateEntry Entry) {
670+ return cxstring::createRef (unwrap (Entry)->Path );
671+ }
672+
673+ static DependencyScannerFSOutOfDateEntry::SizeChangedInfo *
674+ getOutOfDateEntrySizeChangedInfo (DependencyScannerFSOutOfDateEntry *E) {
675+ auto *SizeInfo =
676+ std::get_if<DependencyScannerFSOutOfDateEntry::SizeChangedInfo>(&E->Info );
677+ assert (SizeInfo && " Wrong entry kind to get size changed info!" );
678+ return SizeInfo;
679+ }
680+
681+ uint64_t clang_experimental_DepScanFSCacheOutOfDateEntry_getCachedSize (
682+ CXDepScanFSOutOfDateEntry Entry) {
683+ DependencyScannerFSOutOfDateEntry *E = unwrap (Entry);
684+ return getOutOfDateEntrySizeChangedInfo (E)->CachedSize ;
685+ }
686+
687+ uint64_t clang_experimental_DepScanFSCacheOutOfDateEntry_getActualSize (
688+ CXDepScanFSOutOfDateEntry Entry) {
689+ DependencyScannerFSOutOfDateEntry *E = unwrap (Entry);
690+ return getOutOfDateEntrySizeChangedInfo (E)->ActualSize ;
691+ }
692+
693+ void clang_experimental_DepScanFSCacheOutOfDateEntrySet_disposeSet (
694+ CXDepScanFSOutOfDateEntrySet Entries) {
695+ delete unwrap (Entries);
696+ }
697+
649698namespace {
650699struct DependencyScannerReproducerOptions {
651700 std::vector<std::string> BuildArgs;
0 commit comments