xref: /freebsd/contrib/llvm-project/clang/lib/Basic/OffloadArch.cpp (revision 770cf0a5f02dc8983a89c6568d741fbc25baa999)
1 #include "clang/Basic/OffloadArch.h"
2 
3 #include "llvm/ADT/STLExtras.h"
4 #include "llvm/ADT/StringRef.h"
5 
6 namespace clang {
7 
8 namespace {
9 struct 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"}
18 static const OffloadArchToStringMap ArchNames[] = {
19     // clang-format off
20     {OffloadArch::UNUSED, "", ""},
21     SM(20), {OffloadArch::SM_21, "sm_21", "compute_20"}, // Fermi
22     SM(30), {OffloadArch::SM_32_, "sm_32", "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     {OffloadArch::GFX9_GENERIC, "gfx9-generic", "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     {OffloadArch::GFX9_4_GENERIC, "gfx9-4-generic", "compute_amdgcn"},
62     GFX(942),  // gfx942
63     GFX(950),  // gfx950
64     {OffloadArch::GFX10_1_GENERIC, "gfx10-1-generic", "compute_amdgcn"},
65     GFX(1010), // gfx1010
66     GFX(1011), // gfx1011
67     GFX(1012), // gfx1012
68     GFX(1013), // gfx1013
69     {OffloadArch::GFX10_3_GENERIC, "gfx10-3-generic", "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     {OffloadArch::GFX11_GENERIC, "gfx11-generic", "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     {OffloadArch::GFX12_GENERIC, "gfx12-generic", "compute_amdgcn"},
87     GFX(1200), // gfx1200
88     GFX(1201), // gfx1201
89     GFX(1250), // gfx1250
90     {OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"},
91     // Intel CPUs
92     {OffloadArch::GRANITERAPIDS, "graniterapids", ""},
93     // Intel GPUS
94     {OffloadArch::BMG_G21, "bmg_g21", ""},
95     {OffloadArch::Generic, "generic", ""},
96     // clang-format on
97 };
98 #undef SM
99 #undef GFX
100 
101 const char *OffloadArchToString(OffloadArch A) {
102   auto Result =
103       llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {
104         return A == Map.Arch;
105       });
106   if (Result == std::end(ArchNames))
107     return "unknown";
108   return Result->ArchName;
109 }
110 
111 const char *OffloadArchToVirtualArchString(OffloadArch A) {
112   auto Result =
113       llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {
114         return A == Map.Arch;
115       });
116   if (Result == std::end(ArchNames))
117     return "unknown";
118   return Result->VirtualArchName;
119 }
120 
121 OffloadArch StringToOffloadArch(llvm::StringRef S) {
122   auto Result =
123       llvm::find_if(ArchNames, [S](const OffloadArchToStringMap &Map) {
124         return S == Map.ArchName;
125       });
126   if (Result == std::end(ArchNames))
127     return OffloadArch::UNKNOWN;
128   return Result->Arch;
129 }
130 
131 } // namespace clang
132