@@ -81,17 +81,11 @@ struct CStringsManager {
81
81
return createCStringsRef (*OwnedStdStr.back ());
82
82
}
83
83
};
84
-
85
- struct DependencyScannerService {
86
- DependencyScanningService Service;
87
- CStringsManager StrMgr{};
88
- };
89
84
} // end anonymous namespace
90
85
91
86
DEFINE_SIMPLE_CONVERSION_FUNCTIONS (DependencyScannerServiceOptions,
92
87
CXDependencyScannerServiceOptions)
93
-
94
- DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScannerService,
88
+ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScanningService,
95
89
CXDependencyScannerService)
96
90
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DependencyScanningWorker,
97
91
CXDependencyScannerWorker)
@@ -172,9 +166,9 @@ clang_experimental_DependencyScannerService_create_v0(CXDependencyMode Format) {
172
166
// FIXME: Pass default CASOpts and nullptr as CachingOnDiskFileSystem now.
173
167
CASOptions CASOpts;
174
168
IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> FS;
175
- return wrap (new DependencyScannerService{ DependencyScanningService (
169
+ return wrap (new DependencyScanningService (
176
170
ScanningMode::DependencyDirectivesScan, unwrap (Format), CASOpts,
177
- /* CAS=*/ nullptr , /* ActionCache=*/ nullptr , FS)} );
171
+ /* CAS=*/ nullptr , /* ActionCache=*/ nullptr , FS));
178
172
}
179
173
180
174
ScanningOutputFormat DependencyScannerServiceOptions::getFormat () const {
@@ -210,10 +204,10 @@ clang_experimental_DependencyScannerService_create_v1(
210
204
FS = llvm::cantFail (
211
205
llvm::cas::createCachingOnDiskFileSystem (CAS));
212
206
}
213
- return wrap (new DependencyScannerService{ DependencyScanningService (
207
+ return wrap (new DependencyScanningService (
214
208
ScanningMode::DependencyDirectivesScan, Format, unwrap (Opts)->CASOpts ,
215
209
std::move (CAS), std::move (Cache), std::move (FS),
216
- unwrap (Opts)->OptimizeArgs )} );
210
+ unwrap (Opts)->OptimizeArgs ));
217
211
}
218
212
219
213
void clang_experimental_DependencyScannerService_dispose_v0 (
@@ -223,16 +217,16 @@ void clang_experimental_DependencyScannerService_dispose_v0(
223
217
224
218
CXDependencyScannerWorker clang_experimental_DependencyScannerWorker_create_v0 (
225
219
CXDependencyScannerService S) {
226
- ScanningOutputFormat Format = unwrap (S)->Service . getFormat ();
220
+ ScanningOutputFormat Format = unwrap (S)->getFormat ();
227
221
bool IsIncludeTreeOutput = Format == ScanningOutputFormat::IncludeTree ||
228
222
Format == ScanningOutputFormat::FullIncludeTree;
229
223
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS =
230
224
llvm::vfs::createPhysicalFileSystem ();
231
225
if (IsIncludeTreeOutput)
232
- FS = llvm::cas::createCASProvidingFileSystem (unwrap (S)->Service . getCAS (),
226
+ FS = llvm::cas::createCASProvidingFileSystem (unwrap (S)->getCAS (),
233
227
std::move (FS));
234
228
235
- return wrap (new DependencyScanningWorker (unwrap (S)-> Service , FS));
229
+ return wrap (new DependencyScanningWorker (* unwrap (S), FS));
236
230
}
237
231
238
232
void clang_experimental_DependencyScannerWorker_dispose_v0 (
@@ -566,43 +560,6 @@ CXDiagnosticSet clang_experimental_DepGraph_getDiagnostics(CXDepGraph Graph) {
566
560
return unwrap (Graph)->getDiagnosticSet ();
567
561
}
568
562
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
-
606
563
static std::string
607
564
lookupModuleOutput (const ModuleDeps &MD, ModuleOutputKind MOK, void *MLOContext,
608
565
std::variant<CXModuleLookupOutputCallback *,
@@ -646,6 +603,98 @@ std::string OutputLookup::lookupModuleOutput(const ModuleDeps &MD,
646
603
return PCMPath.first ->second ;
647
604
}
648
605
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
+
649
698
namespace {
650
699
struct DependencyScannerReproducerOptions {
651
700
std::vector<std::string> BuildArgs;
0 commit comments