23
23
#include " clang/Tooling/DependencyScanning/DependencyScanningService.h"
24
24
#include " clang/Tooling/DependencyScanning/DependencyScanningTool.h"
25
25
#include " clang/Tooling/DependencyScanning/DependencyScanningWorker.h"
26
+ #include " llvm/ADT/STLExtras.h"
26
27
#include " llvm/CAS/CASProvidingFileSystem.h"
27
28
#include " llvm/CAS/CachingOnDiskFileSystem.h"
28
29
#include " llvm/Support/Process.h"
@@ -197,14 +198,18 @@ void clang_experimental_DependencyScannerWorker_dispose_v0(
197
198
namespace {
198
199
class OutputLookup {
199
200
public:
200
- OutputLookup (void *MLOContext, CXModuleLookupOutputCallback *MLO)
201
+ OutputLookup (void *MLOContext, std::variant<CXModuleLookupOutputCallback *,
202
+ CXModuleLookupOutputCallback_v2 *>
203
+ MLO)
201
204
: MLOContext(MLOContext), MLO(MLO) {}
202
205
std::string lookupModuleOutput (const ModuleDeps &MD, ModuleOutputKind MOK);
203
206
204
207
private:
205
208
llvm::DenseMap<ModuleID, std::string> PCMPaths;
206
209
void *MLOContext;
207
- CXModuleLookupOutputCallback *MLO;
210
+ std::variant<CXModuleLookupOutputCallback *,
211
+ CXModuleLookupOutputCallback_v2 *>
212
+ MLO;
208
213
};
209
214
210
215
struct DependencyScannerWorkerScanSettings {
@@ -213,7 +218,9 @@ struct DependencyScannerWorkerScanSettings {
213
218
const char *ModuleName;
214
219
const char *WorkingDirectory;
215
220
void *MLOContext;
216
- CXModuleLookupOutputCallback *MLO;
221
+ std::variant<CXModuleLookupOutputCallback *,
222
+ CXModuleLookupOutputCallback_v2 *>
223
+ MLO;
217
224
};
218
225
219
226
struct CStringsManager {
@@ -273,7 +280,7 @@ struct DependencyGraph {
273
280
};
274
281
275
282
struct DependencyGraphModule {
276
- ModuleDeps *ModDeps;
283
+ const ModuleDeps *ModDeps;
277
284
CStringsManager StrMgr{};
278
285
};
279
286
@@ -314,7 +321,9 @@ enum CXErrorCode clang_experimental_DependencyScannerWorker_getDepGraph(
314
321
const char *ModuleName = Settings.ModuleName ;
315
322
const char *WorkingDirectory = Settings.WorkingDirectory ;
316
323
void *MLOContext = Settings.MLOContext ;
317
- CXModuleLookupOutputCallback *MLO = Settings.MLO ;
324
+ std::variant<CXModuleLookupOutputCallback *,
325
+ CXModuleLookupOutputCallback_v2 *>
326
+ MLO = Settings.MLO ;
318
327
319
328
OutputLookup OL (MLOContext, MLO);
320
329
auto LookupOutputs = [&](const ModuleDeps &MD, ModuleOutputKind MOK) {
@@ -396,68 +405,73 @@ void clang_experimental_DepGraphModule_dispose(CXDepGraphModule CXDepMod) {
396
405
397
406
const char *
398
407
clang_experimental_DepGraphModule_getName (CXDepGraphModule CXDepMod) {
399
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
408
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
400
409
return ModDeps.ID .ModuleName .c_str ();
401
410
}
402
411
403
412
const char *
404
413
clang_experimental_DepGraphModule_getContextHash (CXDepGraphModule CXDepMod) {
405
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
414
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
406
415
return ModDeps.ID .ContextHash .c_str ();
407
416
}
408
417
409
418
const char *
410
419
clang_experimental_DepGraphModule_getModuleMapPath (CXDepGraphModule CXDepMod) {
411
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
420
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
412
421
if (ModDeps.ClangModuleMapFile .empty ())
413
422
return nullptr ;
414
423
return ModDeps.ClangModuleMapFile .c_str ();
415
424
}
416
425
417
426
CXCStringArray
418
427
clang_experimental_DepGraphModule_getFileDeps (CXDepGraphModule CXDepMod) {
419
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
428
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
420
429
std::vector<std::string> FileDeps;
421
430
ModDeps.forEachFileDep ([&](StringRef File) { FileDeps.emplace_back (File); });
422
431
return unwrap (CXDepMod)->StrMgr .createCStringsOwned (std::move (FileDeps));
423
432
}
424
433
425
434
CXCStringArray
426
435
clang_experimental_DepGraphModule_getModuleDeps (CXDepGraphModule CXDepMod) {
427
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
436
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
428
437
std::vector<std::string> Modules;
429
438
Modules.reserve (ModDeps.ClangModuleDeps .size ());
430
439
for (const ModuleID &MID : ModDeps.ClangModuleDeps )
431
440
Modules.push_back (MID.ModuleName + " :" + MID.ContextHash );
432
441
return unwrap (CXDepMod)->StrMgr .createCStringsOwned (std::move (Modules));
433
442
}
434
443
444
+ bool clang_experimental_DepGraphModule_isInStableDirs (
445
+ CXDepGraphModule CXDepMod) {
446
+ return unwrap (CXDepMod)->ModDeps ->IsInStableDirectories ;
447
+ }
448
+
435
449
CXCStringArray
436
450
clang_experimental_DepGraphModule_getBuildArguments (CXDepGraphModule CXDepMod) {
437
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
451
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
438
452
return unwrap (CXDepMod)->StrMgr .createCStringsRef (
439
453
ModDeps.getBuildArguments ());
440
454
}
441
455
442
456
const char *clang_experimental_DepGraphModule_getFileSystemRootID (
443
457
CXDepGraphModule CXDepMod) {
444
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
458
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
445
459
if (ModDeps.CASFileSystemRootID )
446
460
return ModDeps.CASFileSystemRootID ->c_str ();
447
461
return nullptr ;
448
462
}
449
463
450
464
const char *
451
465
clang_experimental_DepGraphModule_getIncludeTreeID (CXDepGraphModule CXDepMod) {
452
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
466
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
453
467
if (ModDeps.IncludeTreeID )
454
468
return ModDeps.IncludeTreeID ->c_str ();
455
469
return nullptr ;
456
470
}
457
471
458
472
const char *
459
473
clang_experimental_DepGraphModule_getCacheKey (CXDepGraphModule CXDepMod) {
460
- ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
474
+ const ModuleDeps &ModDeps = *unwrap (CXDepMod)->ModDeps ;
461
475
if (ModDeps.ModuleCacheKey )
462
476
return ModDeps.ModuleCacheKey ->c_str ();
463
477
return nullptr ;
@@ -536,22 +550,46 @@ const char *clang_experimental_DepGraph_getTUContextHash(CXDepGraph Graph) {
536
550
return TUDeps.ID .ContextHash .c_str ();
537
551
}
538
552
553
+ void clang_experimental_DependencyScannerWorkerScanSettings_setModuleLookupCallback (
554
+ CXDependencyScannerWorkerScanSettings CXSettings,
555
+ CXModuleLookupOutputCallback_v2 *MLO) {
556
+ DependencyScannerWorkerScanSettings &Settings = *unwrap (CXSettings);
557
+ Settings.MLO = MLO;
558
+ }
559
+
539
560
CXDiagnosticSet clang_experimental_DepGraph_getDiagnostics (CXDepGraph Graph) {
540
561
return unwrap (Graph)->getDiagnosticSet ();
541
562
}
542
563
543
- static std::string lookupModuleOutput (const ModuleDeps &MD,
544
- ModuleOutputKind MOK, void *MLOContext,
545
- CXModuleLookupOutputCallback *MLO) {
564
+ static std::string
565
+ lookupModuleOutput (const ModuleDeps &MD, ModuleOutputKind MOK, void *MLOContext,
566
+ std::variant<CXModuleLookupOutputCallback *,
567
+ CXModuleLookupOutputCallback_v2 *>
568
+ MLO) {
546
569
SmallVector<char , 256 > Buffer (256 );
547
- size_t Len =
548
- MLO (MLOContext, MD.ID .ModuleName .c_str (), MD.ID .ContextHash .c_str (),
549
- wrap (MOK), Buffer.data (), Buffer.size ());
570
+ auto GetLengthFromOutputCallback = [&]() {
571
+ return std::visit (llvm::makeVisitor (
572
+ [&](CXModuleLookupOutputCallback *) -> size_t {
573
+ return std::get<CXModuleLookupOutputCallback *>(
574
+ MLO)(MLOContext, MD.ID .ModuleName .c_str (),
575
+ MD.ID .ContextHash .c_str (), wrap (MOK),
576
+ Buffer.data (), Buffer.size ());
577
+ },
578
+ [&](CXModuleLookupOutputCallback_v2 *) -> size_t {
579
+ return std::get<CXModuleLookupOutputCallback_v2 *>(
580
+ MLO)(MLOContext,
581
+ wrap (new DependencyGraphModule{&MD}),
582
+ wrap (MOK), Buffer.data (), Buffer.size ());
583
+ }),
584
+ MLO);
585
+ };
586
+
587
+ size_t Len = GetLengthFromOutputCallback ();
550
588
if (Len > Buffer.size ()) {
551
589
Buffer.resize (Len);
552
- Len = MLO (MLOContext, MD.ID .ModuleName .c_str (), MD.ID .ContextHash .c_str (),
553
- wrap (MOK), Buffer.data (), Buffer.size ());
590
+ Len = GetLengthFromOutputCallback ();
554
591
}
592
+
555
593
return std::string (Buffer.begin (), Len);
556
594
}
557
595
0 commit comments