Author: Sam McCall Date: 2022-01-04T11:38:27+01:00 New Revision: f2b3e25f860ed029ddb9d96744a8158ba2a95b23
URL: https://github.com/llvm/llvm-project/commit/f2b3e25f860ed029ddb9d96744a8158ba2a95b23 DIFF: https://github.com/llvm/llvm-project/commit/f2b3e25f860ed029ddb9d96744a8158ba2a95b23.diff LOG: [clangd] Add CompileFlags.Compiler option to override argv0 This is separate from --query-driver but can combine with it. Fixes https://github.com/clangd/clangd/issues/642 Differential Revision: https://reviews.llvm.org/D116196 Added: Modified: clang-tools-extra/clangd/ConfigCompile.cpp clang-tools-extra/clangd/ConfigFragment.h clang-tools-extra/clangd/ConfigYAML.cpp clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/ConfigCompile.cpp b/clang-tools-extra/clangd/ConfigCompile.cpp index 4f7f90847433e..18afdeb3cb5c6 100644 --- a/clang-tools-extra/clangd/ConfigCompile.cpp +++ b/clang-tools-extra/clangd/ConfigCompile.cpp @@ -253,6 +253,16 @@ struct FragmentCompiler { } void compile(Fragment::CompileFlagsBlock &&F) { + if (F.Compiler) + Out.Apply.push_back( + [Compiler(std::move(**F.Compiler))](const Params &, Config &C) { + C.CompileFlags.Edits.push_back( + [Compiler](std::vector<std::string> &Args) { + if (!Args.empty()) + Args.front() = Compiler; + }); + }); + if (!F.Remove.empty()) { auto Remove = std::make_shared<ArgStripper>(); for (auto &A : F.Remove) diff --git a/clang-tools-extra/clangd/ConfigFragment.h b/clang-tools-extra/clangd/ConfigFragment.h index 63d2d75a22628..31c4636efa0b2 100644 --- a/clang-tools-extra/clangd/ConfigFragment.h +++ b/clang-tools-extra/clangd/ConfigFragment.h @@ -134,6 +134,16 @@ struct Fragment { /// /// This section modifies how the compile command is constructed. struct CompileFlagsBlock { + /// Override the compiler executable name to simulate. + /// + /// The name can affect how flags are parsed (clang++ vs clang). + /// If the executable name is in the --query-driver allowlist, then it will + /// be invoked to extract include paths. + /// + /// (That this simply replaces argv[0], and may mangle commands that use + /// more complicated drivers like ccache). + llvm::Optional<Located<std::string>> Compiler; + /// List of flags to append to the compile command. std::vector<Located<std::string>> Add; /// List of flags to remove from the compile command. diff --git a/clang-tools-extra/clangd/ConfigYAML.cpp b/clang-tools-extra/clangd/ConfigYAML.cpp index 6be11f199b489..0487c32815766 100644 --- a/clang-tools-extra/clangd/ConfigYAML.cpp +++ b/clang-tools-extra/clangd/ConfigYAML.cpp @@ -90,6 +90,10 @@ class Parser { void parse(Fragment::CompileFlagsBlock &F, Node &N) { DictParser Dict("CompileFlags", this); + Dict.handle("Compiler", [&](Node &N) { + if (auto Value = scalarValue(N, "Compiler")) + F.Compiler = std::move(*Value); + }); Dict.handle("Add", [&](Node &N) { if (auto Values = scalarValues(N)) F.Add = std::move(*Values); diff --git a/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp b/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp index 87d8b9d976f0f..661784256af80 100644 --- a/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp +++ b/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp @@ -121,14 +121,15 @@ TEST_F(ConfigCompileTests, Condition) { } TEST_F(ConfigCompileTests, CompileCommands) { + Frag.CompileFlags.Compiler.emplace("tpc.exe"); Frag.CompileFlags.Add.emplace_back("-foo"); Frag.CompileFlags.Remove.emplace_back("--include-directory="); std::vector<std::string> Argv = {"clang", "-I", "bar/", "--", "a.cc"}; EXPECT_TRUE(compileAndApply()); - EXPECT_THAT(Conf.CompileFlags.Edits, SizeIs(2)); + EXPECT_THAT(Conf.CompileFlags.Edits, SizeIs(3)); for (auto &Edit : Conf.CompileFlags.Edits) Edit(Argv); - EXPECT_THAT(Argv, ElementsAre("clang", "-foo", "--", "a.cc")); + EXPECT_THAT(Argv, ElementsAre("tpc.exe", "-foo", "--", "a.cc")); } TEST_F(ConfigCompileTests, CompilationDatabase) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits