[clang-tools-extra] [clangd][modules] Remove the options that is for gcc, make modules work for clangd when using gcc (PR #200001)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 5 01:33:49 PDT 2026
https://github.com/Decodetalkers updated https://github.com/llvm/llvm-project/pull/200001
>From 4000c1b315e1547d55cde0b98c1bc56383a31933 Mon Sep 17 00:00:00 2001
From: ShootingStarDragons <ShootingStarDragons at protonmail.com>
Date: Thu, 28 May 2026 00:16:49 +0900
Subject: [PATCH 1/2] feat: allow modules work for gcc
Remove the command options which is for gcc, and this will erase the
wrong error when using gcc, and make modules work
---
clang-tools-extra/clangd/CompileCommands.cpp | 26 ++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp
index 4eda330716f21..aa7234bf06853 100644
--- a/clang-tools-extra/clangd/CompileCommands.cpp
+++ b/clang-tools-extra/clangd/CompileCommands.cpp
@@ -327,6 +327,32 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
return Elem.starts_with("--save-temps") || Elem.starts_with("-save-temps");
});
+ llvm::erase_if(Cmd, [](llvm::StringRef FModuleTs) {
+ return FModuleTs == "-fmodules-ts";
+ });
+
+ llvm::erase_if(Cmd, [](llvm::StringRef MnoDirectExternalAccess) {
+ return MnoDirectExternalAccess == "-mno-direct-extern-access";
+ });
+
+ // NOTE: now clang++ cannot understand fdeps* flags, so we remove it this time
+ // After clang++ can understand it, remove these lines
+ llvm::erase_if(Cmd, [](llvm::StringRef FDepFormat) {
+ return FDepFormat.starts_with("-fdeps-format=");
+ });
+
+ llvm::erase_if(Cmd, [](llvm::StringRef FdepsOutput) {
+ return FdepsOutput.starts_with("-fdeps-output=");
+ });
+
+ llvm::erase_if(Cmd, [](llvm::StringRef FdepsTarget) {
+ return FdepsTarget.starts_with("-fdeps-target=");
+ });
+
+ llvm::erase_if(Cmd, [](llvm::StringRef Elm) {
+ return Elm.starts_with("-fmodule-mapper=");
+ });
+
std::vector<std::string> ToAppend;
if (ResourceDir && !HasExact("-resource-dir") && !HasPrefix("-resource-dir="))
ToAppend.push_back(("-resource-dir=" + *ResourceDir));
>From 0bc6c4b4c7539f7740ef8d4c430333a7e653eb35 Mon Sep 17 00:00:00 2001
From: ShootingStarDragons <ShootingStarDragons at protonmail.com>
Date: Fri, 5 Jun 2026 17:32:43 +0900
Subject: [PATCH 2/2] chore: emit warning when unsupported gcc flags are
detected
And if clang supports these flags in the feature, the relative logic
should be removed
---
clang-tools-extra/clangd/CompileCommands.cpp | 35 ++++++++++++++------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp
index aa7234bf06853..11decb77cde1f 100644
--- a/clang-tools-extra/clangd/CompileCommands.cpp
+++ b/clang-tools-extra/clangd/CompileCommands.cpp
@@ -327,8 +327,11 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
return Elem.starts_with("--save-temps") || Elem.starts_with("-save-temps");
});
- llvm::erase_if(Cmd, [](llvm::StringRef FModuleTs) {
- return FModuleTs == "-fmodules-ts";
+ bool GccUnsupportedFlag = false;
+ llvm::erase_if(Cmd, [&](llvm::StringRef FModuleTs) {
+ bool FModuleTSExists = FModuleTs == "-fmodules-ts";
+ GccUnsupportedFlag |= FModuleTSExists;
+ return FModuleTSExists;
});
llvm::erase_if(Cmd, [](llvm::StringRef MnoDirectExternalAccess) {
@@ -337,22 +340,34 @@ void CommandMangler::operator()(tooling::CompileCommand &Command,
// NOTE: now clang++ cannot understand fdeps* flags, so we remove it this time
// After clang++ can understand it, remove these lines
- llvm::erase_if(Cmd, [](llvm::StringRef FDepFormat) {
- return FDepFormat.starts_with("-fdeps-format=");
+ llvm::erase_if(Cmd, [&](llvm::StringRef FDepFormat) {
+ bool FDepsFormatExists = FDepFormat.starts_with("-fdeps-format=");
+ GccUnsupportedFlag |= FDepsFormatExists;
+ return FDepsFormatExists;
});
- llvm::erase_if(Cmd, [](llvm::StringRef FdepsOutput) {
- return FdepsOutput.starts_with("-fdeps-output=");
+ llvm::erase_if(Cmd, [&](llvm::StringRef FdepsOutput) {
+ bool FDepsOutputExists = FdepsOutput.starts_with("-fdeps-output=");
+ GccUnsupportedFlag |= FDepsOutputExists;
+ return FDepsOutputExists;
});
- llvm::erase_if(Cmd, [](llvm::StringRef FdepsTarget) {
- return FdepsTarget.starts_with("-fdeps-target=");
+ llvm::erase_if(Cmd, [&](llvm::StringRef FdepsTarget) {
+ bool DefTargetExists = FdepsTarget.starts_with("-fdeps-target=");
+ GccUnsupportedFlag |= DefTargetExists;
+ return DefTargetExists;
});
- llvm::erase_if(Cmd, [](llvm::StringRef Elm) {
- return Elm.starts_with("-fmodule-mapper=");
+ llvm::erase_if(Cmd, [&](llvm::StringRef Elm) {
+ bool GccMapperExists = Elm.starts_with("-fmodule-mapper=");
+ GccUnsupportedFlag |= GccMapperExists;
+ return GccMapperExists;
});
+ if (GccUnsupportedFlag) {
+ log("Warning: detected unsupported gcc Flags. Remove them this time");
+ }
+
std::vector<std::string> ToAppend;
if (ResourceDir && !HasExact("-resource-dir") && !HasPrefix("-resource-dir="))
ToAppend.push_back(("-resource-dir=" + *ResourceDir));
More information about the cfe-commits
mailing list