1#include "clang/Basic/OffloadArch.h"
2
3#include "llvm/ADT/STLExtras.h"
4#include "llvm/ADT/StringRef.h"
5
6namespace clang {
7
8namespace {
9struct OffloadArchToStringMap {
10 OffloadArch Arch;
11 const char *ArchName;
12 const char *VirtualArchName;
13};
14} // namespace
15
16#define SM(sm) {OffloadArch::SM_##sm, "sm_" #sm, "compute_" #sm}
17#define GFX(gpu) {OffloadArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn"}
18static const OffloadArchToStringMap ArchNames[] = {
19 // clang-format off
20 {.Arch: OffloadArch::UNUSED, .ArchName: "", .VirtualArchName: ""},
21 SM(20), {.Arch: OffloadArch::SM_21, .ArchName: "sm_21", .VirtualArchName: "compute_20"}, // Fermi
22 SM(30), {.Arch: OffloadArch::SM_32_, .ArchName: "sm_32", .VirtualArchName: "compute_32"}, SM(35), SM(37), // Kepler
23 SM(50), SM(52), SM(53), // Maxwell
24 SM(60), SM(61), SM(62), // Pascal
25 SM(70), SM(72), // Volta
26 SM(75), // Turing
27 SM(80), SM(86), // Ampere
28 SM(87), // Jetson/Drive AGX Orin
29 SM(89), // Ada Lovelace
30 SM(90), // Hopper
31 SM(90a), // Hopper
32 SM(100), // Blackwell
33 SM(100a), // Blackwell
34 SM(101), // Blackwell
35 SM(101a), // Blackwell
36 SM(120), // Blackwell
37 SM(120a), // Blackwell
38 GFX(600), // gfx600
39 GFX(601), // gfx601
40 GFX(602), // gfx602
41 GFX(700), // gfx700
42 GFX(701), // gfx701
43 GFX(702), // gfx702
44 GFX(703), // gfx703
45 GFX(704), // gfx704
46 GFX(705), // gfx705
47 GFX(801), // gfx801
48 GFX(802), // gfx802
49 GFX(803), // gfx803
50 GFX(805), // gfx805
51 GFX(810), // gfx810
52 {.Arch: OffloadArch::GFX9_GENERIC, .ArchName: "gfx9-generic", .VirtualArchName: "compute_amdgcn"},
53 GFX(900), // gfx900
54 GFX(902), // gfx902
55 GFX(904), // gfx903
56 GFX(906), // gfx906
57 GFX(908), // gfx908
58 GFX(909), // gfx909
59 GFX(90a), // gfx90a
60 GFX(90c), // gfx90c
61 {.Arch: OffloadArch::GFX9_4_GENERIC, .ArchName: "gfx9-4-generic", .VirtualArchName: "compute_amdgcn"},
62 GFX(942), // gfx942
63 GFX(950), // gfx950
64 {.Arch: OffloadArch::GFX10_1_GENERIC, .ArchName: "gfx10-1-generic", .VirtualArchName: "compute_amdgcn"},
65 GFX(1010), // gfx1010
66 GFX(1011), // gfx1011
67 GFX(1012), // gfx1012
68 GFX(1013), // gfx1013
69 {.Arch: OffloadArch::GFX10_3_GENERIC, .ArchName: "gfx10-3-generic", .VirtualArchName: "compute_amdgcn"},
70 GFX(1030), // gfx1030
71 GFX(1031), // gfx1031
72 GFX(1032), // gfx1032
73 GFX(1033), // gfx1033
74 GFX(1034), // gfx1034
75 GFX(1035), // gfx1035
76 GFX(1036), // gfx1036
77 {.Arch: OffloadArch::GFX11_GENERIC, .ArchName: "gfx11-generic", .VirtualArchName: "compute_amdgcn"},
78 GFX(1100), // gfx1100
79 GFX(1101), // gfx1101
80 GFX(1102), // gfx1102
81 GFX(1103), // gfx1103
82 GFX(1150), // gfx1150
83 GFX(1151), // gfx1151
84 GFX(1152), // gfx1152
85 GFX(1153), // gfx1153
86 {.Arch: OffloadArch::GFX12_GENERIC, .ArchName: "gfx12-generic", .VirtualArchName: "compute_amdgcn"},
87 GFX(1200), // gfx1200
88 GFX(1201), // gfx1201
89 GFX(1250), // gfx1250
90 {.Arch: OffloadArch::AMDGCNSPIRV, .ArchName: "amdgcnspirv", .VirtualArchName: "compute_amdgcn"},
91 // Intel CPUs
92 {.Arch: OffloadArch::GRANITERAPIDS, .ArchName: "graniterapids", .VirtualArchName: ""},
93 // Intel GPUS
94 {.Arch: OffloadArch::BMG_G21, .ArchName: "bmg_g21", .VirtualArchName: ""},
95 {.Arch: OffloadArch::Generic, .ArchName: "generic", .VirtualArchName: ""},
96 // clang-format on
97};
98#undef SM
99#undef GFX
100
101const char *OffloadArchToString(OffloadArch A) {
102 auto Result =
103 llvm::find_if(Range: ArchNames, P: [A](const OffloadArchToStringMap &Map) {
104 return A == Map.Arch;
105 });
106 if (Result == std::end(arr: ArchNames))
107 return "unknown";
108 return Result->ArchName;
109}
110
111const char *OffloadArchToVirtualArchString(OffloadArch A) {
112 auto Result =
113 llvm::find_if(Range: ArchNames, P: [A](const OffloadArchToStringMap &Map) {
114 return A == Map.Arch;
115 });
116 if (Result == std::end(arr: ArchNames))
117 return "unknown";
118 return Result->VirtualArchName;
119}
120
121OffloadArch StringToOffloadArch(llvm::StringRef S) {
122 auto Result =
123 llvm::find_if(Range: ArchNames, P: [S](const OffloadArchToStringMap &Map) {
124 return S == Map.ArchName;
125 });
126 if (Result == std::end(arr: ArchNames))
127 return OffloadArch::UNKNOWN;
128 return Result->Arch;
129}
130
131} // namespace clang
132