|
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