https://github.com/Overhatted created 
https://github.com/llvm/llvm-project/pull/69887

I'm using Buck2 to create the compile_commands.json and since it uses a cl.bat 
wrapper around cl.exe, that's what shows up in the compile_commands.json. Of 
course Buck2 could be changed to create a compile_commands.json with the cl.exe 
path but I think this change to clang is better.

Please let me know what you think.

>From 29715f3a97f077d1a8aaf2042de91ac08d6cc1a9 Mon Sep 17 00:00:00 2001
From: Overhatted <15021741+overhat...@users.noreply.github.com>
Date: Sun, 22 Oct 2023 18:59:46 +0100
Subject: [PATCH] Added removal of file extension when guessing the toolchain

---
 clang/lib/Driver/ToolChain.cpp           |  7 ++++---
 clang/unittests/Driver/ToolChainTest.cpp | 12 ++++++++++++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index ab19166f18c2dcf..c8bb6ffe0a9bc7d 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -345,10 +345,11 @@ static const DriverSuffix *parseDriverSuffix(StringRef 
ProgName, size_t &Pos) {
   // added via -target as implicit first argument.
   const DriverSuffix *DS = FindDriverSuffix(ProgName, Pos);
 
-  if (!DS && ProgName.endswith(".exe")) {
-    // Try again after stripping the executable suffix:
+  if (!DS) {
+    // Try again after stripping the file extension suffix:
     // clang++.exe -> clang++
-    ProgName = ProgName.drop_back(StringRef(".exe").size());
+    // cl.bat -> cl
+    ProgName = ProgName.slice(0, ProgName.find('.'));
     DS = FindDriverSuffix(ProgName, Pos);
   }
 
diff --git a/clang/unittests/Driver/ToolChainTest.cpp 
b/clang/unittests/Driver/ToolChainTest.cpp
index acbbb87390d5e9a..f193706adf2cd2d 100644
--- a/clang/unittests/Driver/ToolChainTest.cpp
+++ b/clang/unittests/Driver/ToolChainTest.cpp
@@ -509,6 +509,18 @@ TEST(ToolChainTest, GetTargetAndMode) {
   EXPECT_TRUE(Res.ModeSuffix == "clang-dxc");
   EXPECT_STREQ(Res.DriverMode, "--driver-mode=dxc");
   EXPECT_FALSE(Res.TargetIsValid);
+
+  Res = ToolChain::getTargetAndModeFromProgramName("cl.exe");
+  EXPECT_TRUE(Res.TargetPrefix.empty());
+  EXPECT_TRUE(Res.ModeSuffix == "cl");
+  EXPECT_STREQ(Res.DriverMode, "--driver-mode=cl");
+  EXPECT_FALSE(Res.TargetIsValid);
+
+  Res = ToolChain::getTargetAndModeFromProgramName("cl.bat");
+  EXPECT_TRUE(Res.TargetPrefix.empty());
+  EXPECT_TRUE(Res.ModeSuffix == "cl");
+  EXPECT_STREQ(Res.DriverMode, "--driver-mode=cl");
+  EXPECT_FALSE(Res.TargetIsValid);
 }
 
 TEST(ToolChainTest, CommandOutput) {

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to