From 109bc024c8d741e57fa6bb5a028d8a4ed4e64a61 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 24 Aug 2023 10:59:28 -0400 Subject: [PATCH] [clangd] Add --query-driver flag to clangd-indexer When using `clangd` for cross-compiled projects, it's necessary to use the `--query-driver` flag so that `clangd` can extract the compiler's built-in header paths. However, there's no such flag for `clangd-indexer` so we're unable to build a working static index for these projects. This patch adds a `--query-driver` flag to `clangd-indexer` for this scenario. I saw some tests under `clang-tools-extra/clangd/test/` but I think the cross-compilation case is a bit more complex to test. Let me know if you'd like me to look into this further. Resolves: https://github.com/clangd/clangd/issues/1717 Reviewed By: nridge Differential Revision: https://reviews.llvm.org/D157990 --- .../clangd/indexer/IndexerMain.cpp | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clangd/indexer/IndexerMain.cpp b/clang-tools-extra/clangd/indexer/IndexerMain.cpp index 2717030e9796..bc5d1a740899 100644 --- a/clang-tools-extra/clangd/indexer/IndexerMain.cpp +++ b/clang-tools-extra/clangd/indexer/IndexerMain.cpp @@ -38,6 +38,16 @@ static llvm::cl::opt "binary RIFF format")), llvm::cl::init(IndexFileFormat::RIFF)); +static llvm::cl::list QueryDriverGlobs{ + "query-driver", + llvm::cl::desc( + "Comma separated list of globs for white-listing gcc-compatible " + "drivers that are safe to execute. Drivers matching any of these globs " + "will be used to extract system includes. e.g. " + "/usr/bin/**/clang-*,/path/to/repo/**/g++-*"), + llvm::cl::CommaSeparated, +}; + class IndexActionFactory : public tooling::FrontendActionFactory { public: IndexActionFactory(IndexFileIn &Result) : Result(Result) {} @@ -144,12 +154,16 @@ int main(int argc, const char **argv) { // Collect symbols found in each translation unit, merging as we go. clang::clangd::IndexFileIn Data; + auto Mangler = std::make_shared( + clang::clangd::CommandMangler::detect()); + Mangler->SystemIncludeExtractor = clang::clangd::getSystemIncludeExtractor( + static_cast>( + clang::clangd::QueryDriverGlobs)); auto Err = Executor->get()->execute( std::make_unique(Data), clang::tooling::ArgumentsAdjuster( - [Mangler = std::make_shared( - clang::clangd::CommandMangler::detect())]( - const std::vector &Args, llvm::StringRef File) { + [Mangler = std::move(Mangler)](const std::vector &Args, + llvm::StringRef File) { clang::tooling::CompileCommand Cmd; Cmd.CommandLine = Args; Mangler->operator()(Cmd, File);