Skip to content

Commit eaadce4

Browse files
committed
[clang][deps][cas] Add prefix mapping support to the cas-fs caching modes
Previously, cc1depscan supported prefix mapping for cas-fs and include-tree, but clang-scan-deps only supported prefix mapping for include-tree. Now it supports both. (cherry picked from commit ced8bbf)
1 parent fe94d6c commit eaadce4

File tree

4 files changed

+112
-9
lines changed

4 files changed

+112
-9
lines changed

clang/include/clang/Tooling/DependencyScanning/DependencyScanningTool.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ class DependencyScanningTool {
104104

105105
/// Collect dependency tree.
106106
llvm::Expected<llvm::cas::ObjectProxy>
107-
getDependencyTree(const std::vector<std::string> &CommandLine, StringRef CWD);
107+
getDependencyTree(const std::vector<std::string> &CommandLine, StringRef CWD,
108+
DepscanPrefixMapping PrefixMapping = {});
108109

109110
/// If \p DiagGenerationAsCompilation is true it will generate error
110111
/// diagnostics same way as the normal compilation, with "N errors generated"
@@ -151,7 +152,8 @@ class DependencyScanningTool {
151152
getFullDependencies(const std::vector<std::string> &CommandLine,
152153
StringRef CWD, const llvm::StringSet<> &AlreadySeen,
153154
LookupModuleOutputCallback LookupModuleOutput,
154-
llvm::Optional<StringRef> ModuleName = None);
155+
llvm::Optional<StringRef> ModuleName = None,
156+
DepscanPrefixMapping PrefixMapping = {});
155157

156158
ScanningOutputFormat getScanningFormat() const {
157159
return Worker.getScanningFormat();

clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,9 @@ class GetDependencyTree : public FullDependencyConsumer {
156156

157157
llvm::Expected<llvm::cas::ObjectProxy>
158158
DependencyScanningTool::getDependencyTree(
159-
const std::vector<std::string> &CommandLine, StringRef CWD) {
160-
GetDependencyTree Consumer(*Worker.getCASFS(), /*PrefixMapping=*/{});
159+
const std::vector<std::string> &CommandLine, StringRef CWD,
160+
DepscanPrefixMapping PrefixMapping) {
161+
GetDependencyTree Consumer(*Worker.getCASFS(), std::move(PrefixMapping));
161162
auto Result = Worker.computeDependencies(CWD, CommandLine, Consumer);
162163
if (Result)
163164
return std::move(Result);
@@ -558,10 +559,10 @@ DependencyScanningTool::getFullDependencies(
558559
const std::vector<std::string> &CommandLine, StringRef CWD,
559560
const llvm::StringSet<> &AlreadySeen,
560561
LookupModuleOutputCallback LookupModuleOutput,
561-
llvm::Optional<StringRef> ModuleName) {
562+
llvm::Optional<StringRef> ModuleName, DepscanPrefixMapping PrefixMapping) {
562563
FullDependencyConsumer Consumer(AlreadySeen, LookupModuleOutput,
563564
Worker.shouldEagerLoadModules(),
564-
Worker.getCASFS());
565+
Worker.getCASFS(), std::move(PrefixMapping));
565566
llvm::Error Result =
566567
Worker.computeDependencies(CWD, CommandLine, Consumer, ModuleName);
567568
if (Result)
@@ -637,6 +638,10 @@ Error FullDependencyConsumer::finalize(CompilerInstance &ScanInstance,
637638
CacheFS->getCurrentWorkingDirectory().get(),
638639
/*ProduceIncludeTree=*/false);
639640
}
641+
642+
if (Mapper)
643+
DepscanPrefixMapping::remapInvocationPaths(NewInvocation, *Mapper);
644+
640645
return Error::success();
641646
}
642647

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Test path prefix-mapping when using a cas-fs with clang-scan-deps in
2+
// tree, full-tree, and full dependencies modes.
3+
4+
// RUN: rm -rf %t
5+
// RUN: split-file %s %t
6+
// RUN: sed -e "s|DIR|%t|g" -e "s|CLANG|%clang|g" -e "s|SDK|%S/Inputs/SDK|g" %t/cdb.json.template > %t/cdb.json
7+
8+
// == Tree
9+
// Ensure the filesystem has the mapped paths.
10+
11+
// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-tree -cas-path %t/cas \
12+
// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \
13+
// RUN: | sed -E 's/tree ([^ ]+) for.*/\1/' > %t/tree_id.txt
14+
// RUN: llvm-cas -cas %t/cas -ls-tree-recursive @%t/tree_id.txt > %t/tree_result.txt
15+
// RUN: FileCheck %s -input-file %t/tree_result.txt -check-prefix=FILES
16+
17+
// FILES: file llvmcas://{{.*}} /^sdk/usr/include/stdlib.h
18+
// FILES: file llvmcas://{{.*}} /^src/t.c
19+
// FILES: file llvmcas://{{.*}} /^src/top.h
20+
// FILES: file llvmcas://{{.*}} /^tc/lib/clang/{{.*}}/include/stdarg.h
21+
22+
// == Full Tree
23+
// This should have the same filesystem as above, and we also check the command-
24+
// line.
25+
26+
// RUN: cat %t/tree_id.txt > %t/full_tree_result.txt
27+
// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-tree-full -cas-path %t/cas \
28+
// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \
29+
// RUN: >> %t/full_tree_result.txt
30+
// RUN: FileCheck %s -input-file %t/full_tree_result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK
31+
32+
// == Full
33+
// Same as full tree.
34+
35+
// RUN: cat %t/tree_id.txt > %t/full_result.txt
36+
// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -cas-path %t/cas \
37+
// RUN: -prefix-map=%t=/^src -prefix-map-sdk=/^sdk -prefix-map-toolchain=/^tc \
38+
// RUN: >> %t/full_result.txt
39+
// RUN: FileCheck %s -input-file %t/full_result.txt -DPREFIX=%t -DSDK_PREFIX=%S/Inputs/SDK
40+
41+
// CHECK: [[MAPPED_FS_ID:llvmcas://[[:xdigit:]]+]]
42+
// CHECK: "modules": []
43+
// CHECK: "translation-units": [
44+
// CHECK: {
45+
// CHECK: "commands": [
46+
// CHECK: {
47+
// CHECK: "casfs-root-id": "[[MAPPED_FS_ID]]"
48+
// CHECK: "clang-module-deps": []
49+
// CHECK: "command-line": [
50+
// CHECK: "-fcas-path"
51+
// CHECK-NEXT: "[[PREFIX]]/cas"
52+
// CHECK: "-fcas-fs"
53+
// CHECK-NEXT: "[[MAPPED_FS_ID]]"
54+
// CHECK: "-fcas-fs-working-directory"
55+
// CHECK-NEXT: "/^src"
56+
// CHECK: "-x"
57+
// CHECK-NEXT: "c"
58+
// CHECK-NEXT: "/^src/t.c"
59+
// CHECK: "-isysroot"
60+
// CHECK-NEXT: "/^sdk"
61+
// CHECK: "-resource-dir"
62+
// CHECK-NEXT: "/^tc/lib/clang/{{.*}}"
63+
// CHECK: "-isystem"
64+
// CHECK-NEXT: "/^sdk/usr/local/include
65+
// CHECK: "-isystem"
66+
// CHECK-NEXT: "/^tc/lib/clang/{{.*}}/include"
67+
// CHECK: "-internal-externc-isystem"
68+
// CHECK-NEXT: "/^sdk/usr/include"
69+
// CHECK: "-fdebug-compilation-dir=/^src"
70+
// CHECK: "-fcoverage-compilation-dir=/^src"
71+
// CHECK-NOT: [[PREFIX]]
72+
// CHECK-NOT: [[SDK_PREFIX]]
73+
// CHECK: ]
74+
// CHECK: "file-deps": [
75+
// CHECK: "[[PREFIX]]/t.c"
76+
// CHECK: "[[PREFIX]]/top.h"
77+
// CHECK: "{{.*}}include/stdarg.h"
78+
// CHECK: "[[SDK_PREFIX]]/usr/include/stdlib.h"
79+
// CHECK: ]
80+
// CHECK: "input-file": "[[PREFIX]]/t.c"
81+
82+
//--- cdb.json.template
83+
[
84+
{
85+
"directory": "DIR",
86+
"command": "CLANG -fsyntax-only DIR/t.c -target x86_64-apple-macos11 -isysroot SDK",
87+
"file": "DIR/t.c"
88+
}
89+
]
90+
91+
//--- t.c
92+
#include "top.h"
93+
94+
//--- top.h
95+
#include <stdarg.h>
96+
#include <stdlib.h>

clang/tools/clang-scan-deps/ClangScanDeps.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -934,8 +934,8 @@ int main(int argc, const char **argv) {
934934
Errs))
935935
HadErrors = true;
936936
} else if (Format == ScanningOutputFormat::Tree) {
937-
auto MaybeTree =
938-
WorkerTools[I]->getDependencyTree(Input->CommandLine, CWD);
937+
auto MaybeTree = WorkerTools[I]->getDependencyTree(
938+
Input->CommandLine, CWD, PrefixMapping);
939939
std::unique_lock<std::mutex> LockGuard(Lock);
940940
TreeResults.emplace_back(LocalIndex, std::move(Filename),
941941
std::move(MaybeTree));
@@ -956,7 +956,7 @@ int main(int argc, const char **argv) {
956956
} else {
957957
auto MaybeFullDeps = WorkerTools[I]->getFullDependencies(
958958
Input->CommandLine, CWD, AlreadySeenModules, LookupOutput,
959-
MaybeModuleName);
959+
MaybeModuleName, PrefixMapping);
960960
if (handleFullDependencyToolResult(Filename, MaybeFullDeps, FD,
961961
LocalIndex, DependencyOS, Errs))
962962
HadErrors = true;

0 commit comments

Comments
 (0)