crr0004 created this revision.
crr0004 added a reviewer: sammccall.
Herald added subscribers: usaxena95, kadircet, arphaman.
crr0004 requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov.
Herald added a project: clang-tools-extra.
This adds a new option to change the root directory of where the index files
get stored.
I mainly added this because I am doing profiling of indexing and needed a way
for multiple instances of index files not to conflict with each other.
The extact naming of variables and the help text can be changed, I just guessed.
I tried to add a test for the change however I couldn't find a way to neatly
check storage root directory. I am not sure if the test I've written is all
that helpful.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D103377
Files:
clang-tools-extra/clangd/ClangdServer.cpp
clang-tools-extra/clangd/ClangdServer.h
clang-tools-extra/clangd/index/Background.h
clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
clang-tools-extra/clangd/tool/ClangdMain.cpp
clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
Index: clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
+++ clang-tools-extra/clangd/unittests/BackgroundIndexTests.cpp
@@ -161,6 +161,30 @@
QName("bar"), QName("bar::one")));
}
+TEST_F(BackgroundIndexTest, StoreIndexedFilesInCustomPath){
+
+ OverlayCDB CDB(/*Base=*/nullptr);
+ auto DiskStorage = BackgroundIndexStorage::createDiskBackedStorageFactory(
+ [&CDB](llvm::StringRef File) {
+ return CDB.getProjectInfo(File);
+ },
+ testing::TempDir()
+ );
+
+ auto *Result = DiskStorage("root/A.cc");
+ IndexFileIn ShardIn{
+ SymbolSlab{},
+ RefSlab{},
+ RelationSlab{},
+ IncludeGraph{},
+ tooling::CompileCommand{}
+ };
+ IndexFileOut Shard{ShardIn};
+ auto Result2 = Result->storeShard("root/A.cc", Shard);
+
+ ASSERT_TRUE(Result);
+ ASSERT_FALSE(llvm::errorToBool(std::move(Result2)));
+}
TEST_F(BackgroundIndexTest, IndexTwoFiles) {
MockFS FS;
// a.h yields different symbols when included by A.cc vs B.cc.
Index: clang-tools-extra/clangd/tool/ClangdMain.cpp
===================================================================
--- clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -339,6 +339,14 @@
Hidden,
};
+opt<Path> BackgroundIndexCachePath{
+ "background-index-storage",
+ cat(Misc),
+ desc("The path to store the index files generated by background indexing"),
+ init(""),
+ Hidden
+};
+
opt<bool> Test{
"lit-test",
cat(Misc),
@@ -830,6 +838,7 @@
#endif
Opts.BackgroundIndex = EnableBackgroundIndex;
Opts.ReferencesLimit = ReferencesLimit;
+ Opts.BackgroundIndexCachePath = BackgroundIndexCachePath;
auto PAI = createProjectAwareIndex(loadExternalIndex, Sync);
if (StaticIdx) {
IdxStack.emplace_back(std::move(StaticIdx));
Index: clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
===================================================================
--- clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
+++ clang-tools-extra/clangd/index/BackgroundIndexStorage.cpp
@@ -100,9 +100,11 @@
class DiskBackedIndexStorageManager {
public:
DiskBackedIndexStorageManager(
- std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo)
+ std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo,
+ llvm::Optional<std::string> BackgroundDiskCachePath)
: IndexStorageMapMu(std::make_unique<std::mutex>()),
- GetProjectInfo(std::move(GetProjectInfo)) {
+ GetProjectInfo(std::move(GetProjectInfo)),
+ BackgroundDiskCachePath(BackgroundDiskCachePath) {
llvm::SmallString<128> FallbackDir;
if (llvm::sys::path::cache_directory(FallbackDir))
llvm::sys::path::append(FallbackDir, "clangd", "index");
@@ -113,7 +115,12 @@
BackgroundIndexStorage *operator()(PathRef File) {
std::lock_guard<std::mutex> Lock(*IndexStorageMapMu);
llvm::SmallString<128> StorageDir(FallbackDir);
- if (auto PI = GetProjectInfo(File)) {
+ if (BackgroundDiskCachePath &&
+ !BackgroundDiskCachePath.getValue().empty()) {
+ StorageDir = BackgroundDiskCachePath.getValue();
+ llvm::sys::path::append(StorageDir, ".cache", "clangd", "index");
+
+ } else if (auto PI = GetProjectInfo(File)) {
StorageDir = PI->SourceRoot;
llvm::sys::path::append(StorageDir, ".cache", "clangd", "index");
}
@@ -138,14 +145,17 @@
std::unique_ptr<std::mutex> IndexStorageMapMu;
std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo;
+ llvm::Optional<std::string> BackgroundDiskCachePath;
};
} // namespace
BackgroundIndexStorage::Factory
BackgroundIndexStorage::createDiskBackedStorageFactory(
- std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo) {
- return DiskBackedIndexStorageManager(std::move(GetProjectInfo));
+ std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo,
+ llvm::Optional<std::string> BackgroundIndexCachePath) {
+ return DiskBackedIndexStorageManager(std::move(GetProjectInfo),
+ std::move(BackgroundIndexCachePath));
}
} // namespace clangd
Index: clang-tools-extra/clangd/index/Background.h
===================================================================
--- clang-tools-extra/clangd/index/Background.h
+++ clang-tools-extra/clangd/index/Background.h
@@ -62,7 +62,8 @@
// CDBDirectory is the first directory containing a CDB in parent directories
// of a file, or user cache directory if none was found, e.g. stdlib headers.
static Factory createDiskBackedStorageFactory(
- std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo);
+ std::function<llvm::Optional<ProjectInfo>(PathRef)> GetProjectInfo,
+ llvm::Optional<std::string> BackgroundIndexCachePath);
};
// A priority queue of tasks which can be run on (external) worker threads.
Index: clang-tools-extra/clangd/ClangdServer.h
===================================================================
--- clang-tools-extra/clangd/ClangdServer.h
+++ clang-tools-extra/clangd/ClangdServer.h
@@ -114,6 +114,8 @@
/// If true, ClangdServer automatically indexes files in the current project
/// on background threads. The index is stored in the project root.
bool BackgroundIndex = false;
+ /// Path to force the disk storage of the index cache
+ llvm::Optional<std::string> BackgroundIndexCachePath;
/// If set, use this index to augment code completion results.
SymbolIndex *StaticIndex = nullptr;
Index: clang-tools-extra/clangd/ClangdServer.cpp
===================================================================
--- clang-tools-extra/clangd/ClangdServer.cpp
+++ clang-tools-extra/clangd/ClangdServer.cpp
@@ -188,7 +188,7 @@
BackgroundIdx = std::make_unique<BackgroundIndex>(
TFS, CDB,
BackgroundIndexStorage::createDiskBackedStorageFactory(
- [&CDB](llvm::StringRef File) { return CDB.getProjectInfo(File); }),
+ [&CDB](llvm::StringRef File) { return CDB.getProjectInfo(File); }, Opts.BackgroundIndexCachePath),
std::move(BGOpts));
AddIndex(BackgroundIdx.get());
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits