Author: Matt Arsenault Date: 2026-03-30T10:10:37+02:00 New Revision: 013c79269b7c693082b4699c681630982766ef53
URL: https://github.com/llvm/llvm-project/commit/013c79269b7c693082b4699c681630982766ef53 DIFF: https://github.com/llvm/llvm-project/commit/013c79269b7c693082b4699c681630982766ef53.diff LOG: clang: Simplify OpenMP triple adjustment (#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. Added: Modified: clang/include/clang/Driver/ToolChain.h clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Clang.cpp Removed: ################################################################################ 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 c9ed799f010fb..76bf9ab84e97f 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) @@ -1132,15 +1133,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) { @@ -1149,7 +1148,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); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
