From 763d29274361d1aef1b655dc76b088c1cba75911 Mon Sep 17 00:00:00 2001 From: Qiongsi Wu Date: Thu, 13 Nov 2025 13:56:29 -0800 Subject: [PATCH 1/2] Fix two bugs introduced during merge conflict resolution of https://github.com/llvm/llvm-project/pull/164345. --- .../lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp | 2 +- .../lib/Tooling/DependencyScanning/DependencyScanningTool.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp index c2e0f4a06b9e3..b9b19cfc86a6a 100644 --- a/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp @@ -1028,7 +1028,7 @@ bool CompilerInstanceWithContext::initialize(DiagnosticConsumer *DC) { Worker.Service, Worker.DepFS, false, nullptr, Worker.DepCASFS)) return false; - llvm::SmallVector StableDirs = getInitialStableDirs(CI); + StableDirs = getInitialStableDirs(CI); auto MaybePrebuiltModulesASTMap = computePrebuiltModulesASTMap(CI, StableDirs); if (!MaybePrebuiltModulesASTMap) diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp index c5561762df7d3..b92a4d05494e0 100644 --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp @@ -315,9 +315,9 @@ DependencyScanningTool::computeDependenciesByNameWithContext( StringRef ModuleName, const llvm::DenseSet &AlreadySeen, LookupModuleOutputCallback LookupModuleOutput) { FullDependencyConsumer Consumer(AlreadySeen); - CallbackActionController Controller(LookupModuleOutput); + auto Controller = createActionController(LookupModuleOutput); llvm::Error Result = Worker.computeDependenciesByNameWithContextOrError( - ModuleName, Consumer, Controller); + ModuleName, Consumer, *Controller); if (Result) return std::move(Result); From b39a61181835c174512ebd901d45b30c4bebbaca Mon Sep 17 00:00:00 2001 From: Qiongsi Wu Date: Fri, 14 Nov 2025 15:51:54 -0800 Subject: [PATCH 2/2] Adding an include-tree test case. --- .../modules-include-tree-by-mult-mod-names.c | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 clang/test/ClangScanDeps/modules-include-tree-by-mult-mod-names.c diff --git a/clang/test/ClangScanDeps/modules-include-tree-by-mult-mod-names.c b/clang/test/ClangScanDeps/modules-include-tree-by-mult-mod-names.c new file mode 100644 index 0000000000000..033d3a5157345 --- /dev/null +++ b/clang/test/ClangScanDeps/modules-include-tree-by-mult-mod-names.c @@ -0,0 +1,129 @@ +// UNSUPPORTED: target=powerpc64-ibm-aix{{.*}} +// REQUIRES: ondisk_cas + +// RUN: rm -rf %t +// RUN: split-file %s %t + +//--- module.modulemap +module root { header "root.h" } +module direct { header "direct.h" } +module transitive { header "transitive.h" } +module root1 { header "root1.h"} +//--- root.h +#include "direct.h" +#include "root/textual.h" + +//--- root1.h +#include "direct.h" + +//--- direct.h +#include "transitive.h" +//--- transitive.h +// empty + +//--- root/textual.h +// This is here to verify that the "root" directory doesn't clash with name of +// the "root" module. + +//--- cdb.json.template +[{ + "file": "", + "directory": "DIR", + "command": "clang -fmodules -fmodules-cache-path=DIR/cache -I DIR -x c" +}] + +// RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json +// RUN: clang-scan-deps -compilation-database %t/cdb.json \ +// RUN: -cas-path %t/cas -format experimental-include-tree-full -module-names=root,root1,direct > %t/result.json +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t %s + +// CHECK: { +// CHECK-NEXT: "modules": [ +// CHECK-NEXT: { +// CHECK-NEXT: "cache-key": "[[DIRECT_CACHE_KEY:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "cas-include-tree-id": "[[LEFT_ROOT_ID:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "clang-module-deps": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "module-name": "transitive" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "command-line": [ +// CHECK: "-fmodule-file-cache-key" +// CHECK-NEXT: "{{.*transitive-.*\.pcm}}" +// CHECK-NEXT: "[[TRANSITIVE_CACHE_KEY:llvmcas://[[:xdigit:]]+]]" +// CHECK: ], +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "file-deps": [ +// CHECK-NEXT: "[[PREFIX]]/module.modulemap" +// CHECK-NEXT: "[[PREFIX]]/direct.h" +// CHECK-NEXT: ], +// CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "name": "direct" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "cache-key": "[[ROOT_CACHE_KEY:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "cas-include-tree-id": "[[ROOT_ROOT_ID:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "clang-module-deps": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "module-name": "direct" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "command-line": [ +// CHECK: "-fmodule-file-cache-key" +// CHECK-NEXT: "{{.*direct-.*\.pcm}}" +// CHECK-NEXT: "[[DIRECT_CACHE_KEY]]" +// CHECK: ], +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "file-deps": [ +// CHECK-NEXT: "[[PREFIX]]/module.modulemap" +// CHECK-NEXT: "[[PREFIX]]/root.h" +// CHECK-NEXT: "[[PREFIX]]/root/textual.h" +// CHECK-NEXT: ], +// CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "name": "root" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "cache-key": "[[ROOT_CACHE_KEY:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "cas-include-tree-id": "[[ROOT_ROOT_ID:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "clang-module-deps": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "module-name": "direct" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "command-line": [ +// CHECK: "-fmodule-file-cache-key" +// CHECK-NEXT: "{{.*direct-.*\.pcm}}" +// CHECK-NEXT: "[[DIRECT_CACHE_KEY]]" +// CHECK: ], +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "file-deps": [ +// CHECK-NEXT: "[[PREFIX]]/module.modulemap" +// CHECK-NEXT: "[[PREFIX]]/root1.h" +// CHECK-NEXT: ], +// CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "name": "root1" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "cache-key": "[[TRANSITIVE_CACHE_KEY]]" +// CHECK-NEXT: "cas-include-tree-id": "[[TRANSITIVE_ROOT_ID:llvmcas://[[:xdigit:]]+]]" +// CHECK-NEXT: "clang-module-deps": [], +// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "command-line": [ +// CHECK: ], +// CHECK-NEXT: "context-hash": "{{.*}}", +// CHECK-NEXT: "file-deps": [ +// CHECK-NEXT: "[[PREFIX]]/module.modulemap" +// CHECK-NEXT: "[[PREFIX]]/transitive.h" +// CHECK-NEXT: ], +// CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "name": "transitive" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "translation-units": [] +// CHECK-NEXT: }