jansvoboda11 created this revision. jansvoboda11 added reviewers: Bigcheese, dexonsmith. jansvoboda11 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Dependency scanning currently performs an implicit build. When testing that the command-lines produced for modular dependencies work when passed to Clang, they would overwrite the implicitly built PCM with an explicitly built PCM. This makes debugging harder than it should be. This patch adds new flag to `clang-scan-deps` that allows developers to customize the PCM build directory, preventing file overwrites. Moreover, the explicit context hash is now part of the PCM path. This is useful in D102488 <https://reviews.llvm.org/D102488>, where the context hash can change due to command-line pruning. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103516 Files: clang/test/ClangScanDeps/modules-full.cpp clang/tools/clang-scan-deps/ClangScanDeps.cpp
Index: clang/tools/clang-scan-deps/ClangScanDeps.cpp =================================================================== --- clang/tools/clang-scan-deps/ClangScanDeps.cpp +++ clang/tools/clang-scan-deps/ClangScanDeps.cpp @@ -163,6 +163,12 @@ "'-fmodule-file=', '-o', '-fmodule-map-file='."), llvm::cl::init(false), llvm::cl::cat(DependencyScannerCategory)); +static llvm::cl::opt<std::string> BuildDir( + "build-dir", + llvm::cl::desc("With '-generate-modules-path-args', put the PCM files in" + "the provided directory instead of the module cache."), + llvm::cl::cat(DependencyScannerCategory)); + llvm::cl::opt<unsigned> NumThreads("j", llvm::cl::Optional, llvm::cl::desc("Number of worker threads to use (default: use " @@ -357,7 +363,22 @@ private: StringRef lookupPCMPath(ModuleID MID) { - return Modules[IndexedModuleID{MID, 0}].ImplicitModulePCMPath; + auto PCMPath = PCMPaths.insert({IndexedModuleID{MID, 0}, ""}); + if (PCMPath.second) + PCMPath.first->second = constructPCMPath(lookupModuleDeps(MID)); + return PCMPath.first->second; + } + + /// Construct a path where to put the explicitly built PCM. + std::string constructPCMPath(const ModuleDeps &MD) const { + StringRef Filename = llvm::sys::path::filename(MD.ImplicitModulePCMPath); + + SmallString<256> ExplicitPCMPath( + !BuildDir.empty() + ? BuildDir + : MD.Invocation.getHeaderSearchOpts().ModuleCachePath); + llvm::sys::path::append(ExplicitPCMPath, MD.ID.ContextHash, Filename); + return std::string(ExplicitPCMPath); } const ModuleDeps &lookupModuleDeps(ModuleID MID) { @@ -395,6 +416,8 @@ std::mutex Lock; std::unordered_map<IndexedModuleID, ModuleDeps, IndexedModuleIDHasher> Modules; + std::unordered_map<IndexedModuleID, std::string, IndexedModuleIDHasher> + PCMPaths; std::vector<InputDeps> Inputs; }; Index: clang/test/ClangScanDeps/modules-full.cpp =================================================================== --- clang/test/ClangScanDeps/modules-full.cpp +++ clang/test/ClangScanDeps/modules-full.cpp @@ -20,6 +20,12 @@ // RUN: -generate-modules-path-args -mode preprocess-minimized-sources >> %t.result // RUN: cat %t.result | sed 's/\\/\//g' | FileCheck --check-prefixes=CHECK,CHECK-ABS %s // +// RUN: echo %t.dir > %t.result +// RUN: clang-scan-deps -compilation-database %t.cdb -j 4 -format experimental-full \ +// RUN: -generate-modules-path-args -build-dir %t.dir/build \ +// RUN: -mode preprocess-minimized-sources >> %t.result +// RUN: cat %t.result | sed 's/\\/\//g' | FileCheck --check-prefixes=CHECK,CHECK-ABS-BUILD %s +// // RUN: echo %t.dir > %t_clangcl.result // RUN: clang-scan-deps -compilation-database %t_clangcl.cdb -j 4 -format experimental-full \ // RUN: -mode preprocess-minimized-sources >> %t_clangcl.result @@ -45,9 +51,11 @@ // CHECK-NEXT: "-cc1" // CHECK-NO-ABS-NOT: "-fmodule-map-file={{.*}}" // CHECK-ABS: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" +// CHECK-ABS-BUILD: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" // CHECK: "-emit-module" // CHECK-NO-ABS-NOT: "-fmodule-file={{.*}}" // CHECK-ABS: "-fmodule-file=[[PREFIX]]/module-cache{{(_clangcl)?}}/[[CONTEXT_HASH_H1]]/header2-{{[A-Z0-9]+}}.pcm" +// CHECK-ABS-BUILD: "-fmodule-file=[[PREFIX]]/build/[[CONTEXT_HASH_H1]]/header2-{{[A-Z0-9]+}}.pcm" // CHECK: "-fmodule-name=header1" // CHECK: "-fno-implicit-modules" // CHECK: ], @@ -105,8 +113,10 @@ // CHECK-NEXT: "-fno-implicit-module-maps" // CHECK-NO-ABS-NOT: "-fmodule-file={{.*}}" // CHECK-ABS-NEXT: "-fmodule-file=[[PREFIX]]/module-cache{{(_clangcl)?}}/[[CONTEXT_HASH_H2]]/header1-{{[A-Z0-9]+}}.pcm" +// CHECK-ABS-BUILD-NEXT: "-fmodule-file=[[PREFIX]]/build/[[CONTEXT_HASH_H2]]/header1-{{[A-Z0-9]+}}.pcm" // CHECK-NO-ABS-NOT: "-fmodule-map-file={{.*}}" // CHECK-ABS-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" +// CHECK-ABS-BUILD-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/modules_cdb_input.cpp" @@ -126,8 +136,10 @@ // CHECK-NEXT: "-fno-implicit-module-maps" // CHECK-NO-ABS-NOT: "-fmodule-file={{.*}}, // CHECK-ABS-NEXT: "-fmodule-file=[[PREFIX]]/module-cache{{(_clangcl)?}}/[[CONTEXT_HASH_H2]]/header1-{{[A-Z0-9]+}}.pcm" +// CHECK-ABS-BUILD-NEXT: "-fmodule-file=[[PREFIX]]/build/[[CONTEXT_HASH_H2]]/header1-{{[A-Z0-9]+}}.pcm" // CHECK-NO-ABS-NOT: "-fmodule-map-file={{.*}} // CHECK-ABS-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" +// CHECK-ABS-BUILD-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/modules_cdb_input.cpp" @@ -147,8 +159,10 @@ // CHECK-NEXT: "-fno-implicit-module-maps" // CHECK-NO-ABS-NOT: "-fmodule-file={{.*}}" // CHECK-ABS-NEXT: "-fmodule-file=[[PREFIX]]/module-cache{{(_clangcl)?}}/[[CONTEXT_HASH_H2]]/header1-{{[A-Z0-9]+}}.pcm" +// CHECK-ABS-BUILD-NEXT: "-fmodule-file=[[PREFIX]]/build/[[CONTEXT_HASH_H2]]/header1-{{[A-Z0-9]+}}.pcm" // CHECK-NO-ABS-NOT: "-fmodule-map-file={{.*}}" // CHECK-ABS-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" +// CHECK-ABS-BUILD-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/modules_cdb_input.cpp" @@ -169,9 +183,13 @@ // CHECK-NO-ABS-NOT: "-fmodule-file={{.*}}" // CHECK-ABS-NEXT: "-fmodule-file=[[PREFIX]]/module-cache{{(_clangcl)?}}/[[CONTEXT_HASH_H1]]/header2-{{[A-Z0-9]+}}.pcm" // CHECK-ABS-NEXT: "-fmodule-file=[[PREFIX]]/module-cache{{(_clangcl)?}}/[[CONTEXT_HASH_H1]]/header1-{{[A-Z0-9]+}}.pcm" +// CHECK-ABS-BUILD-NEXT: "-fmodule-file=[[PREFIX]]/build/[[CONTEXT_HASH_H1]]/header2-{{[A-Z0-9]+}}.pcm" +// CHECK-ABS-BUILD-NEXT: "-fmodule-file=[[PREFIX]]/build/[[CONTEXT_HASH_H1]]/header1-{{[A-Z0-9]+}}.pcm" // CHECK-NO-ABS-NOT: "-fmodule-map-file={{.*}}" // CHECK-ABS-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" // CHECK-ABS-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" +// CHECK-ABS-BUILD-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" +// CHECK-ABS-BUILD-NEXT: "-fmodule-map-file=[[PREFIX]]/Inputs/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/modules_cdb_input2.cpp"
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits