[llvm-branch-commits] [clang] clang: Simplify OpenMP triple adjustment (PR #189265)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Mar 29 09:41:18 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-driver
Author: Matt Arsenault (arsenm)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/189265.diff
4 Files Affected:
- (modified) clang/include/clang/Driver/ToolChain.h (+19-13)
- (modified) clang/lib/Driver/Driver.cpp (+9-10)
- (modified) clang/lib/Driver/ToolChain.cpp (+1-1)
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1-1)
``````````diff
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);
``````````
</details>
https://github.com/llvm/llvm-project/pull/189265
More information about the llvm-branch-commits
mailing list