|
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" |
@@ -332,14 +333,18 @@ static CXErrorCode getFileDependencies(CXDependencyScannerWorker W, int argc, |
332 | 333 | namespace { |
333 | 334 | class OutputLookup { |
334 | 335 | public: |
335 | | - OutputLookup(void *MLOContext, CXModuleLookupOutputCallback *MLO) |
| 336 | + OutputLookup(void *MLOContext, std::variant<CXModuleLookupOutputCallback *, |
| 337 | + CXModuleLookupOutputCallback_v2 *> |
| 338 | + MLO) |
336 | 339 | : MLOContext(MLOContext), MLO(MLO) {} |
337 | 340 | std::string lookupModuleOutput(const ModuleDeps &MD, ModuleOutputKind MOK); |
338 | 341 |
|
339 | 342 | private: |
340 | 343 | llvm::DenseMap<ModuleID, std::string> PCMPaths; |
341 | 344 | void *MLOContext; |
342 | | - CXModuleLookupOutputCallback *MLO; |
| 345 | + std::variant<CXModuleLookupOutputCallback *, |
| 346 | + CXModuleLookupOutputCallback_v2 *> |
| 347 | + MLO; |
343 | 348 | }; |
344 | 349 | } // end anonymous namespace |
345 | 350 |
|
@@ -422,7 +427,9 @@ struct DependencyScannerWorkerScanSettings { |
422 | 427 | const char *ModuleName; |
423 | 428 | const char *WorkingDirectory; |
424 | 429 | void *MLOContext; |
425 | | - CXModuleLookupOutputCallback *MLO; |
| 430 | + std::variant<CXModuleLookupOutputCallback *, |
| 431 | + CXModuleLookupOutputCallback_v2 *> |
| 432 | + MLO; |
426 | 433 | }; |
427 | 434 |
|
428 | 435 | struct CStringsManager { |
@@ -482,7 +489,7 @@ struct DependencyGraph { |
482 | 489 | }; |
483 | 490 |
|
484 | 491 | struct DependencyGraphModule { |
485 | | - ModuleDeps *ModDeps; |
| 492 | + const ModuleDeps *ModDeps; |
486 | 493 | CStringsManager StrMgr{}; |
487 | 494 | }; |
488 | 495 |
|
@@ -523,7 +530,9 @@ enum CXErrorCode clang_experimental_DependencyScannerWorker_getDepGraph( |
523 | 530 | const char *ModuleName = Settings.ModuleName; |
524 | 531 | const char *WorkingDirectory = Settings.WorkingDirectory; |
525 | 532 | void *MLOContext = Settings.MLOContext; |
526 | | - CXModuleLookupOutputCallback *MLO = Settings.MLO; |
| 533 | + std::variant<CXModuleLookupOutputCallback *, |
| 534 | + CXModuleLookupOutputCallback_v2 *> |
| 535 | + MLO = Settings.MLO; |
527 | 536 |
|
528 | 537 | OutputLookup OL(MLOContext, MLO); |
529 | 538 | auto LookupOutputs = [&](const ModuleDeps &MD, ModuleOutputKind MOK) { |
@@ -582,60 +591,65 @@ void clang_experimental_DepGraphModule_dispose(CXDepGraphModule CXDepMod) { |
582 | 591 |
|
583 | 592 | const char * |
584 | 593 | clang_experimental_DepGraphModule_getName(CXDepGraphModule CXDepMod) { |
585 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 594 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
586 | 595 | return ModDeps.ID.ModuleName.c_str(); |
587 | 596 | } |
588 | 597 |
|
589 | 598 | const char * |
590 | 599 | clang_experimental_DepGraphModule_getContextHash(CXDepGraphModule CXDepMod) { |
591 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 600 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
592 | 601 | return ModDeps.ID.ContextHash.c_str(); |
593 | 602 | } |
594 | 603 |
|
595 | 604 | const char * |
596 | 605 | clang_experimental_DepGraphModule_getModuleMapPath(CXDepGraphModule CXDepMod) { |
597 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 606 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
598 | 607 | if (ModDeps.ClangModuleMapFile.empty()) |
599 | 608 | return nullptr; |
600 | 609 | return ModDeps.ClangModuleMapFile.c_str(); |
601 | 610 | } |
602 | 611 |
|
603 | 612 | CXCStringArray |
604 | 613 | clang_experimental_DepGraphModule_getFileDeps(CXDepGraphModule CXDepMod) { |
605 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 614 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
606 | 615 | std::vector<std::string> FileDeps; |
607 | 616 | ModDeps.forEachFileDep([&](StringRef File) { FileDeps.emplace_back(File); }); |
608 | 617 | return unwrap(CXDepMod)->StrMgr.createCStringsOwned(std::move(FileDeps)); |
609 | 618 | } |
610 | 619 |
|
611 | 620 | CXCStringArray |
612 | 621 | clang_experimental_DepGraphModule_getModuleDeps(CXDepGraphModule CXDepMod) { |
613 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 622 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
614 | 623 | std::vector<std::string> Modules; |
615 | 624 | Modules.reserve(ModDeps.ClangModuleDeps.size()); |
616 | 625 | for (const ModuleID &MID : ModDeps.ClangModuleDeps) |
617 | 626 | Modules.push_back(MID.ModuleName + ":" + MID.ContextHash); |
618 | 627 | return unwrap(CXDepMod)->StrMgr.createCStringsOwned(std::move(Modules)); |
619 | 628 | } |
620 | 629 |
|
| 630 | +bool clang_experimental_DepGraphModule_isInStableDirs( |
| 631 | + CXDepGraphModule CXDepMod) { |
| 632 | + return unwrap(CXDepMod)->ModDeps->IsInStableDirectories; |
| 633 | +} |
| 634 | + |
621 | 635 | CXCStringArray |
622 | 636 | clang_experimental_DepGraphModule_getBuildArguments(CXDepGraphModule CXDepMod) { |
623 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 637 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
624 | 638 | return unwrap(CXDepMod)->StrMgr.createCStringsRef( |
625 | 639 | ModDeps.getBuildArguments()); |
626 | 640 | } |
627 | 641 |
|
628 | 642 | const char * |
629 | 643 | clang_experimental_DepGraphModule_getIncludeTreeID(CXDepGraphModule CXDepMod) { |
630 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 644 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
631 | 645 | if (ModDeps.IncludeTreeID) |
632 | 646 | return ModDeps.IncludeTreeID->c_str(); |
633 | 647 | return nullptr; |
634 | 648 | } |
635 | 649 |
|
636 | 650 | const char * |
637 | 651 | clang_experimental_DepGraphModule_getCacheKey(CXDepGraphModule CXDepMod) { |
638 | | - ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
| 652 | + const ModuleDeps &ModDeps = *unwrap(CXDepMod)->ModDeps; |
639 | 653 | if (ModDeps.ModuleCacheKey) |
640 | 654 | return ModDeps.ModuleCacheKey->c_str(); |
641 | 655 | return nullptr; |
@@ -706,22 +720,46 @@ const char *clang_experimental_DepGraph_getTUContextHash(CXDepGraph Graph) { |
706 | 720 | return TUDeps.ID.ContextHash.c_str(); |
707 | 721 | } |
708 | 722 |
|
| 723 | +void clang_experimental_DependencyScannerWorkerScanSettings_setModuleLookupCallback( |
| 724 | + CXDependencyScannerWorkerScanSettings CXSettings, |
| 725 | + CXModuleLookupOutputCallback_v2 *MLO) { |
| 726 | + DependencyScannerWorkerScanSettings &Settings = *unwrap(CXSettings); |
| 727 | + Settings.MLO = MLO; |
| 728 | +} |
| 729 | + |
709 | 730 | CXDiagnosticSet clang_experimental_DepGraph_getDiagnostics(CXDepGraph Graph) { |
710 | 731 | return unwrap(Graph)->getDiagnosticSet(); |
711 | 732 | } |
712 | 733 |
|
713 | | -static std::string lookupModuleOutput(const ModuleDeps &MD, |
714 | | - ModuleOutputKind MOK, void *MLOContext, |
715 | | - CXModuleLookupOutputCallback *MLO) { |
| 734 | +static std::string |
| 735 | +lookupModuleOutput(const ModuleDeps &MD, ModuleOutputKind MOK, void *MLOContext, |
| 736 | + std::variant<CXModuleLookupOutputCallback *, |
| 737 | + CXModuleLookupOutputCallback_v2 *> |
| 738 | + MLO) { |
716 | 739 | SmallVector<char, 256> Buffer(256); |
717 | | - size_t Len = |
718 | | - MLO(MLOContext, MD.ID.ModuleName.c_str(), MD.ID.ContextHash.c_str(), |
719 | | - wrap(MOK), Buffer.data(), Buffer.size()); |
| 740 | + auto GetLengthFromOutputCallback = [&]() { |
| 741 | + return std::visit(llvm::makeVisitor( |
| 742 | + [&](CXModuleLookupOutputCallback *) -> size_t { |
| 743 | + return std::get<CXModuleLookupOutputCallback *>( |
| 744 | + MLO)(MLOContext, MD.ID.ModuleName.c_str(), |
| 745 | + MD.ID.ContextHash.c_str(), wrap(MOK), |
| 746 | + Buffer.data(), Buffer.size()); |
| 747 | + }, |
| 748 | + [&](CXModuleLookupOutputCallback_v2 *) -> size_t { |
| 749 | + return std::get<CXModuleLookupOutputCallback_v2 *>( |
| 750 | + MLO)(MLOContext, |
| 751 | + wrap(new DependencyGraphModule{&MD}), |
| 752 | + wrap(MOK), Buffer.data(), Buffer.size()); |
| 753 | + }), |
| 754 | + MLO); |
| 755 | + }; |
| 756 | + |
| 757 | + size_t Len = GetLengthFromOutputCallback(); |
720 | 758 | if (Len > Buffer.size()) { |
721 | 759 | Buffer.resize(Len); |
722 | | - Len = MLO(MLOContext, MD.ID.ModuleName.c_str(), MD.ID.ContextHash.c_str(), |
723 | | - wrap(MOK), Buffer.data(), Buffer.size()); |
| 760 | + Len = GetLengthFromOutputCallback(); |
724 | 761 | } |
| 762 | + |
725 | 763 | return std::string(Buffer.begin(), Len); |
726 | 764 | } |
727 | 765 |
|
|
0 commit comments