[clang] [clang][Tooling] Fix target option detection (PR #224568)
Ayan Khan via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 18 03:31:42 PDT 2026
https://github.com/ThunderKhan updated https://github.com/llvm/llvm-project/pull/224568
>From ee0e155f9d526d6f599bdb8be3a25e3f9e6891be Mon Sep 17 00:00:00 2001
From: Ayan Khan <AyanKhanOffiiciall at gmail.com>
Date: Fri, 18 Sep 2026 16:01:14 +0530
Subject: [PATCH 1/2] [clang][Tooling] Fix target option detection
---
clang/lib/Tooling/Tooling.cpp | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp
index 71307d1fe73076..229e86a1b27099 100644
--- a/clang/lib/Tooling/Tooling.cpp
+++ b/clang/lib/Tooling/Tooling.cpp
@@ -290,8 +290,12 @@ void addTargetAndModeForProgramName(std::vector<std::string> &CommandLine,
for (auto Token = ++CommandLine.begin(); Token != CommandLine.end();
++Token) {
StringRef TokenRef(*Token);
- ShouldAddTarget = ShouldAddTarget && !TokenRef.starts_with(TargetOPT) &&
- TokenRef != TargetOPTLegacy;
+ const bool HasTargetOption =
+ TokenRef == TargetOPT || TokenRef == TargetOPTLegacy ||
+ (TokenRef.starts_with(TargetOPT) &&
+ TokenRef.size() > TargetOPT.size() &&
+ TokenRef[TargetOPT.size()] == '=');
+ ShouldAddTarget = ShouldAddTarget && !HasTargetOption;
ShouldAddMode = ShouldAddMode && !TokenRef.starts_with(DriverModeOPT);
}
if (ShouldAddMode) {
>From 49d97b4f7bbb20074a007c2540c80c7db5207cc3 Mon Sep 17 00:00:00 2001
From: Ayan Khan <AyanKhanOffiiciall at gmail.com>
Date: Fri, 18 Sep 2026 16:01:27 +0530
Subject: [PATCH 2/2] [clang][Tooling] Add target suboption regression test
---
clang/unittests/Tooling/ToolingTest.cpp | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/clang/unittests/Tooling/ToolingTest.cpp b/clang/unittests/Tooling/ToolingTest.cpp
index 11a5491dd35fb1..01e324058f10d4 100644
--- a/clang/unittests/Tooling/ToolingTest.cpp
+++ b/clang/unittests/Tooling/ToolingTest.cpp
@@ -996,6 +996,18 @@ TEST(addTargetAndModeForProgramName, IgnoresExistingTarget) {
ArgsAlt);
}
+
+TEST(addTargetAndModeForProgramName, DoesNotConfuseTargetSuboptions) {
+ llvm::InitializeAllTargets();
+ std::string Target = getAnyTargetForTesting();
+ ASSERT_FALSE(Target.empty());
+
+ std::vector<std::string> Args = {
+ "clang", "--target-cpu=cortex-a53", "-foo"};
+ addTargetAndModeForProgramName(Args, Target + "-g++");
+
+ EXPECT_TRUE(llvm::is_contained(Args, "--target=" + Target));
+}
TEST(addTargetAndModeForProgramName, IgnoresExistingMode) {
llvm::InitializeAllTargets();
std::string Target = getAnyTargetForTesting();
More information about the cfe-commits
mailing list