Skip to content

Commit 477a00f

Browse files
committed
[libclang][cas] Optionally enable include-tree in libclang dependency scanner
Obey CLANG_CACHE_USE_INCLUDE_TREE and CLANG_CACHE_USE_CASFS_DEPSCAN. For now the default is still cas-fs since that supports modules and include-tree does not. (cherry picked from commit 72a7cc4)
1 parent 8f11e8c commit 477a00f

File tree

2 files changed

+59
-14
lines changed

2 files changed

+59
-14
lines changed

clang/test/Index/Core/scan-deps-cas.m

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
// RUN: rm -rf %t.mcp %t
2-
// RUN: echo %S > %t.result
3-
//
2+
43
// RUN: c-index-test core --scan-deps %S -output-dir=%t -cas-path %t/cas \
54
// RUN: -- %clang -c -I %S/Inputs/module \
65
// RUN: -fmodules -fmodules-cache-path=%t.mcp \
7-
// RUN: -o FoE.o -x objective-c %s >> %t.result
8-
// RUN: cat %t.result | sed 's/\\/\//g' | FileCheck %s -DOUTPUTS=%/t
6+
// RUN: -o FoE.o -x objective-c %s > %t.result
7+
// RUN: cat %t.result | sed 's/\\/\//g' | FileCheck %s -DPREFIX=%S -DOUTPUTS=%/t
8+
9+
// RUN: env CLANG_CACHE_USE_CASFS_DEPSCAN=1 c-index-test core --scan-deps %S -output-dir=%t -cas-path %t/cas \
10+
// RUN: -- %clang -c -I %S/Inputs/module \
11+
// RUN: -fmodules -fmodules-cache-path=%t.mcp \
12+
// RUN: -o FoE.o -x objective-c %s > %t.casfs.result
13+
// RUN: cat %t.casfs.result | sed 's/\\/\//g' | FileCheck %s -DPREFIX=%S -DOUTPUTS=%/t
14+
15+
// FIXME: enable modules when supported.
16+
// RUN: env CLANG_CACHE_USE_INCLUDE_TREE=1 c-index-test core --scan-deps %S -output-dir=%t -cas-path %t/cas \
17+
// RUN: -- %clang -c -I %S/Inputs/module \
18+
// RUN: -o FoE.o -x objective-c %s > %t.includetree.result
19+
// RUN: cat %t.includetree.result | sed 's/\\/\//g' | FileCheck %s -DPREFIX=%S -DOUTPUTS=%/t -check-prefix=INCLUDE_TREE
920

1021
// RUN: c-index-test core --scan-deps %S -output-dir=%t \
1122
// RUN: -- %clang -c -I %S/Inputs/module \
@@ -15,10 +26,9 @@
1526
// NO_CAS-NOT: faction-cache
1627
// NO_CAS-NOT: fcache-compile-job
1728

18-
@import ModA;
29+
#include "ModA.h"
1930

20-
// CHECK: [[PREFIX:.*]]
21-
// CHECK-NEXT: modules:
31+
// CHECK: modules:
2232
// CHECK-NEXT: module:
2333
// CHECK-NEXT: name: ModA
2434
// CHECK-NEXT: context-hash: [[HASH_MOD_A:[A-Z0-9]+]]
@@ -52,3 +62,16 @@
5262
// CHECK-SAME: -fcache-compile-job
5363
// CHECK-SAME: -fmodule-file-cache-key [[PCM:.*ModA_.*pcm]] llvmcas://{{[[:xdigit:]]+}}
5464
// CHECK-SAME: -fmodule-file={{(ModA=)?}}[[PCM]]
65+
66+
// INCLUDE_TREE: dependencies:
67+
// INCLUDE_TREE-NEXT: command 0:
68+
// INCLUDE_TREE-NEXT: context-hash: [[HASH_TU:[A-Z0-9]+]]
69+
// INCLUDE_TREE-NEXT: module-deps:
70+
// INCLUDE_TREE-NEXT: file-deps:
71+
// INCLUDE_TREE-NEXT: [[PREFIX]]/scan-deps-cas.m
72+
// INCLUDE_TREE-NEXT: [[PREFIX]]/Inputs/module/ModA.h
73+
// INCLUDE_TREE-NEXT: build-args:
74+
// INCLUDE_TREE-SAME: -cc1
75+
// INCLUDE_TREE-SAME: -fcas-path
76+
// INCLUDE_TREE-SAME: -fcas-include-tree llvmcas://{{[[:xdigit:]]+}}
77+
// INCLUDE_TREE-SAME: -fcache-compile-job

clang/tools/libclang/CDependencies.cpp

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,19 @@
2222
#include "clang/Tooling/DependencyScanning/DependencyScanningTool.h"
2323
#include "clang/Tooling/DependencyScanning/DependencyScanningWorker.h"
2424
#include "llvm/CAS/CachingOnDiskFileSystem.h"
25+
#include "llvm/Support/Process.h"
2526

2627
using namespace clang;
2728
using namespace clang::tooling::dependencies;
2829

2930
namespace {
3031
struct DependencyScannerServiceOptions {
31-
ScanningOutputFormat Format = ScanningOutputFormat::Full;
32+
ScanningOutputFormat ConfiguredFormat = ScanningOutputFormat::Full;
3233
CASOptions CASOpts;
3334
std::shared_ptr<cas::ObjectStore> CAS;
3435
std::shared_ptr<cas::ActionCache> Cache;
36+
37+
ScanningOutputFormat getFormat() const;
3538
};
3639
} // end anonymous namespace
3740

@@ -93,7 +96,7 @@ void clang_experimental_DependencyScannerServiceOptions_dispose(
9396

9497
void clang_experimental_DependencyScannerServiceOptions_setDependencyMode(
9598
CXDependencyScannerServiceOptions Opts, CXDependencyMode Mode) {
96-
unwrap(Opts)->Format = unwrap(Mode);
99+
unwrap(Opts)->ConfiguredFormat = unwrap(Mode);
97100
}
98101

99102
void clang_experimental_DependencyScannerServiceOptions_setCASDatabases(
@@ -122,10 +125,27 @@ clang_experimental_DependencyScannerService_create_v0(CXDependencyMode Format) {
122125
IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> FS;
123126
return wrap(new DependencyScanningService(
124127
ScanningMode::DependencyDirectivesScan, unwrap(Format), CASOpts,
125-
/*ActionCache=*/nullptr, FS,
128+
/*CAS=*/nullptr, /*ActionCache=*/nullptr, FS,
126129
/*ReuseFilemanager=*/false));
127130
}
128131

132+
ScanningOutputFormat DependencyScannerServiceOptions::getFormat() const {
133+
if (ConfiguredFormat != ScanningOutputFormat::Full)
134+
return ConfiguredFormat;
135+
136+
if (!CAS || !Cache)
137+
return ConfiguredFormat;
138+
139+
if (llvm::sys::Process::GetEnv("CLANG_CACHE_USE_INCLUDE_TREE"))
140+
return ScanningOutputFormat::FullIncludeTree;
141+
142+
if (llvm::sys::Process::GetEnv("CLANG_CACHE_USE_CASFS_DEPSCAN"))
143+
return ScanningOutputFormat::FullTree;
144+
145+
// Note: default caching behaviour is currently cas-fs.
146+
return ConfiguredFormat;
147+
}
148+
129149
CXDependencyScannerService
130150
clang_experimental_DependencyScannerService_create_v1(
131151
CXDependencyScannerServiceOptions Opts) {
@@ -137,11 +157,11 @@ clang_experimental_DependencyScannerService_create_v1(
137157
assert(unwrap(Opts)->CASOpts.getKind() != CASOptions::UnknownCAS &&
138158
"CAS and ActionCache must match CASOptions");
139159
FS = llvm::cantFail(
140-
llvm::cas::createCachingOnDiskFileSystem(std::move(CAS)));
160+
llvm::cas::createCachingOnDiskFileSystem(CAS));
141161
}
142162
return wrap(new DependencyScanningService(
143-
ScanningMode::DependencyDirectivesScan, unwrap(Opts)->Format,
144-
unwrap(Opts)->CASOpts, std::move(Cache), std::move(FS),
163+
ScanningMode::DependencyDirectivesScan, unwrap(Opts)->getFormat(),
164+
unwrap(Opts)->CASOpts, std::move(CAS), std::move(Cache), std::move(FS),
145165
/*ReuseFilemanager=*/false));
146166
}
147167

@@ -257,7 +277,9 @@ static CXErrorCode getFileDependencies(CXDependencyScannerWorker W, int argc,
257277

258278
DependencyScanningWorker *Worker = unwrap(W);
259279

260-
if (Worker->getScanningFormat() != ScanningOutputFormat::Full)
280+
if (Worker->getScanningFormat() != ScanningOutputFormat::Full &&
281+
Worker->getScanningFormat() != ScanningOutputFormat::FullTree &&
282+
Worker->getScanningFormat() != ScanningOutputFormat::FullIncludeTree)
261283
return CXError_InvalidArguments;
262284

263285
std::vector<std::string> Compilation{argv, argv + argc};

0 commit comments

Comments
 (0)