Files
llvm-project/clang/lib/Basic/OffloadArch.cpp
Matt Arsenault 3cd4a795d9 clang: Avoid hardcoding some offload triple strings (#193811)
This will make it easier to use the subarch field in the future.
2026-04-23 22:02:19 +01:00

174 lines
5.8 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "clang/Basic/OffloadArch.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/TargetParser/Triple.h"
namespace clang {
namespace {
struct OffloadArchToStringMap {
OffloadArch Arch;
const char *ArchName;
const char *VirtualArchName;
};
} // namespace
#define SM(sm) {OffloadArch::SM_##sm, "sm_" #sm, "compute_" #sm}
#define GFX(gpu) {OffloadArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn"}
static const OffloadArchToStringMap ArchNames[] = {
// clang-format off
{OffloadArch::Unused, "", ""},
SM(20), {OffloadArch::SM_21, "sm_21", "compute_20"}, // Fermi
SM(30), {OffloadArch::SM_32_, "sm_32", "compute_32"}, SM(35), SM(37), // Kepler
SM(50), SM(52), SM(53), // Maxwell
SM(60), SM(61), SM(62), // Pascal
SM(70), SM(72), // Volta
SM(75), // Turing
SM(80), SM(86), // Ampere
SM(87), // Jetson/Drive AGX Orin
SM(88), // Ampere
SM(89), // Ada Lovelace
SM(90), // Hopper
SM(90a), // Hopper
SM(100), // Blackwell
SM(100a), // Blackwell
SM(101), // Blackwell
SM(101a), // Blackwell
SM(103), // Blackwell
SM(103a), // Blackwell
SM(110), // Blackwell
SM(110a), // Blackwell
SM(120), // Blackwell
SM(120a), // Blackwell
SM(121), // Blackwell
SM(121a), // Blackwell
GFX(600), // gfx600
GFX(601), // gfx601
GFX(602), // gfx602
GFX(700), // gfx700
GFX(701), // gfx701
GFX(702), // gfx702
GFX(703), // gfx703
GFX(704), // gfx704
GFX(705), // gfx705
GFX(801), // gfx801
GFX(802), // gfx802
GFX(803), // gfx803
GFX(805), // gfx805
GFX(810), // gfx810
{OffloadArch::GFX9_GENERIC, "gfx9-generic", "compute_amdgcn"},
GFX(900), // gfx900
GFX(902), // gfx902
GFX(904), // gfx903
GFX(906), // gfx906
GFX(908), // gfx908
GFX(909), // gfx909
GFX(90a), // gfx90a
GFX(90c), // gfx90c
{OffloadArch::GFX9_4_GENERIC, "gfx9-4-generic", "compute_amdgcn"},
GFX(942), // gfx942
GFX(950), // gfx950
{OffloadArch::GFX10_1_GENERIC, "gfx10-1-generic", "compute_amdgcn"},
GFX(1010), // gfx1010
GFX(1011), // gfx1011
GFX(1012), // gfx1012
GFX(1013), // gfx1013
{OffloadArch::GFX10_3_GENERIC, "gfx10-3-generic", "compute_amdgcn"},
GFX(1030), // gfx1030
GFX(1031), // gfx1031
GFX(1032), // gfx1032
GFX(1033), // gfx1033
GFX(1034), // gfx1034
GFX(1035), // gfx1035
GFX(1036), // gfx1036
{OffloadArch::GFX11_GENERIC, "gfx11-generic", "compute_amdgcn"},
GFX(1100), // gfx1100
GFX(1101), // gfx1101
GFX(1102), // gfx1102
GFX(1103), // gfx1103
GFX(1150), // gfx1150
GFX(1151), // gfx1151
GFX(1152), // gfx1152
GFX(1153), // gfx1153
GFX(1170), // gfx1170
GFX(1171), // gfx1171
GFX(1172), // gfx1172
{OffloadArch::GFX12_GENERIC, "gfx12-generic", "compute_amdgcn"},
GFX(1200), // gfx1200
GFX(1201), // gfx1201
GFX(1250), // gfx1250
GFX(1251), // gfx1251
{OffloadArch::GFX12_5_GENERIC, "gfx12-5-generic", "compute_amdgcn"},
GFX(1310), // gfx1310
{OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"},
// Intel CPUs
{OffloadArch::GRANITERAPIDS, "graniterapids", ""},
// Intel GPUS
{OffloadArch::BMG_G21, "bmg_g21", ""},
{OffloadArch::Generic, "generic", ""},
// clang-format on
};
#undef SM
#undef GFX
const char *OffloadArchToString(OffloadArch A) {
auto Result =
llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {
return A == Map.Arch;
});
if (Result == std::end(ArchNames))
return "unknown";
return Result->ArchName;
}
const char *OffloadArchToVirtualArchString(OffloadArch A) {
auto Result =
llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {
return A == Map.Arch;
});
if (Result == std::end(ArchNames))
return "unknown";
return Result->VirtualArchName;
}
OffloadArch StringToOffloadArch(llvm::StringRef S) {
auto Result =
llvm::find_if(ArchNames, [S](const OffloadArchToStringMap &Map) {
return S == Map.ArchName;
});
if (Result == std::end(ArchNames))
return OffloadArch::Unknown;
return Result->Arch;
}
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
OffloadArch ID) {
if (ID == OffloadArch::AMDGCNSPIRV)
return llvm::Triple(llvm::Triple::spirv64, llvm::Triple::NoSubArch,
llvm::Triple::AMD, llvm::Triple::AMDHSA);
if (IsNVIDIAOffloadArch(ID)) {
llvm::Triple::ArchType Arch = DefaultToolchainTriple.isArch64Bit()
? llvm::Triple::nvptx64
: llvm::Triple::nvptx;
return llvm::Triple(Arch, llvm::Triple::NoSubArch, llvm::Triple::NVIDIA,
llvm::Triple::CUDA);
}
if (IsAMDOffloadArch(ID))
return llvm::Triple(llvm::Triple::amdgcn, llvm::Triple::NoSubArch,
llvm::Triple::AMD, llvm::Triple::AMDHSA);
return {};
}
} // namespace clang