[llvm-branch-commits] [clang] clang: Simplify OpenMP triple adjustment (PR #189265)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Mar 29 09:39:35 PDT 2026
https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/189265
Previously this would find a list of offloading triples,
then later fill in the unknown components specifically for
OpenMP after the fact. Start normalizing the triples upfront,
before inserting into the set. Also stop special casing OpenMP
since there's no apparent reason to treat it differently from
other offload languages.
Also operate on the Triple rather than the string, and handle
the unset OS and environment separately.
>From cd9a6533ff93c2602856b0678577d10e5b622fa2 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Sun, 29 Mar 2026 13:40:04 +0200
Subject: [PATCH] clang: Simplify OpenMP triple adjustment
Previously this would find a list of offloading triples,
then later fill in the unknown components specifically for
OpenMP after the fact. Start normalizing the triples upfront,
before inserting into the set. Also stop special casing OpenMP
since there's no apparent reason to treat it differently from
other offload languages.
Also operate on the Triple rather than the string, and handle
the unset OS and environment separately.
---
clang/include/clang/Driver/ToolChain.h | 32 +++++++++++++++-----------
clang/lib/Driver/Driver.cpp | 19 ++++++++-------
clang/lib/Driver/ToolChain.cpp | 2 +-
clang/lib/Driver/ToolChains/Clang.cpp | 2 +-
4 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h
index 7f6d779565434..720562efc3026 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -850,22 +850,28 @@ class ToolChain {
// We want to expand the shortened versions of the triples passed in to
// the values used for the bitcode libraries.
- static llvm::Triple getOpenMPTriple(StringRef TripleStr) {
- llvm::Triple TT(TripleStr);
- if (TT.getVendor() == llvm::Triple::UnknownVendor ||
- TT.getOS() == llvm::Triple::UnknownOS) {
- if (TT.getArch() == llvm::Triple::nvptx)
- return llvm::Triple("nvptx-nvidia-cuda");
- if (TT.getArch() == llvm::Triple::nvptx64)
- return llvm::Triple("nvptx64-nvidia-cuda");
- if (TT.isAMDGCN())
- return llvm::Triple("amdgcn-amd-amdhsa");
+ static void normalizeOffloadTriple(llvm::Triple &TT) {
+ if (TT.isNVPTX()) {
+ if (TT.getVendor() == llvm::Triple::UnknownVendor)
+ TT.setVendor(llvm::Triple::NVIDIA);
+ if (TT.getOS() == llvm::Triple::UnknownOS)
+ TT.setOS(llvm::Triple::CUDA);
+ return;
+ }
+
+ if (TT.isAMDGPU()) {
+ if (TT.getVendor() == llvm::Triple::UnknownVendor)
+ TT.setVendor(llvm::Triple::AMD);
+ if (TT.getOS() == llvm::Triple::UnknownOS)
+ TT.setOS(llvm::Triple::AMDHSA);
+ return;
}
- return TT;
}
- static llvm::Triple getOpenMPTriple(const llvm::Triple &OrigTT) {
- return getOpenMPTriple(OrigTT.str());
+ static llvm::Triple normalizeOffloadTriple(llvm::StringRef OrigTT) {
+ llvm::Triple TT(OrigTT);
+ normalizeOffloadTriple(TT);
+ return TT;
}
};
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index f0e112a482881..d2f2322b6c775 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1002,7 +1002,7 @@ static TripleSet inferOffloadToolchains(Compilation &C,
if (TripleStr.empty())
continue;
- llvm::Triple Triple(TripleStr);
+ llvm::Triple Triple = ToolChain::normalizeOffloadTriple(TripleStr);
// Make a new argument that dispatches this argument to the appropriate
// toolchain. This is required when we infer it and create potentially
@@ -1096,8 +1096,9 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
if (C.getInputArgs().hasArg(options::OPT_offload_targets_EQ)) {
std::vector<std::string> ArgValues =
C.getInputArgs().getAllArgValues(options::OPT_offload_targets_EQ);
- for (llvm::StringRef Target : ArgValues)
- Triples.insert(llvm::Triple(C.getInputArgs().MakeArgString(Target)));
+ for (llvm::StringRef Target : ArgValues) {
+ Triples.insert(ToolChain::normalizeOffloadTriple(Target));
+ }
if (ArgValues.empty())
Diag(clang::diag::warn_drv_empty_joined_argument)
@@ -1133,15 +1134,13 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
// Create a device toolchain for every specified kind and triple.
for (Action::OffloadKind Kind : Kinds) {
- llvm::Triple TT = Kind == Action::OFK_OpenMP
- ? ToolChain::getOpenMPTriple(Target)
- : llvm::Triple(Target);
- if (TT.getArch() == llvm::Triple::ArchType::UnknownArch) {
- Diag(diag::err_drv_invalid_or_unsupported_offload_target) << TT.str();
+ if (Target.getArch() == llvm::Triple::ArchType::UnknownArch) {
+ Diag(diag::err_drv_invalid_or_unsupported_offload_target)
+ << Target.str();
continue;
}
- std::string NormalizedName = TT.normalize();
+ std::string NormalizedName = Target.normalize();
auto [TripleIt, Inserted] =
FoundNormalizedTriples.try_emplace(NormalizedName, Target.str());
if (!Inserted) {
@@ -1150,7 +1149,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
continue;
}
- auto &TC = getOffloadToolChain(C.getInputArgs(), Kind, TT,
+ auto &TC = getOffloadToolChain(C.getInputArgs(), Kind, Target,
C.getDefaultToolChain().getTriple());
// Emit a warning if the detected CUDA version is too new.
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 94913837f5339..a19e459fecbec 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1783,7 +1783,7 @@ llvm::opt::DerivedArgList *ToolChain::TranslateOpenMPTargetArgs(
A->getOption().matches(options::OPT_Xopenmp_target);
if (A->getOption().matches(options::OPT_Xopenmp_target_EQ)) {
- llvm::Triple TT(getOpenMPTriple(A->getValue(0)));
+ llvm::Triple TT = normalizeOffloadTriple(A->getValue(0));
// Passing device args: -Xopenmp-target=<triple> -opt=val.
if (TT.getTriple() == getTripleString())
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index d86f387dde38b..86b0a705c7fe9 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -9564,7 +9564,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
else
CmdArgs.push_back(Args.MakeArgString(
WrapperOption +
- ToolChain::getOpenMPTriple(Val.drop_front()).getTriple() + "=" +
+ ToolChain::normalizeOffloadTriple(Val.drop_front()).str() + "=" +
A->getValue(1)));
}
Args.ClaimAllArgs(options::OPT_Xoffload_compiler);
More information about the llvm-branch-commits
mailing list