diff --git a/clang-tools-extra/clangd/Compiler.cpp b/clang-tools-extra/clangd/Compiler.cpp --- a/clang-tools-extra/clangd/Compiler.cpp +++ b/clang-tools-extra/clangd/Compiler.cpp @@ -85,10 +85,17 @@ std::unique_ptr buildCompilerInvocation(const ParseInputs &Inputs, clang::DiagnosticConsumer &D, std::vector *CC1Args) { - if (Inputs.CompileCommand.CommandLine.empty()) + llvm::ArrayRef Argv = Inputs.CompileCommand.CommandLine; + if (Argv.empty()) return nullptr; std::vector ArgStrs; - for (const auto &S : Inputs.CompileCommand.CommandLine) + ArgStrs.reserve(Argv.size() + 1); + ArgStrs.push_back(Argv.front().c_str()); + // In asserts builds, CompilerInvocation redundantly reads/parses cc1 args as + // a sanity test. This is not useful to clangd, and costs 10% of test time. + // To avoid mismatches between assert/production builds, disable it always. + ArgStrs.push_back("-Xclang=-no-round-trip-args"); + for (const auto &S : Argv.drop_front()) ArgStrs.push_back(S.c_str()); CreateInvocationOptions CIOpts;