LLDB mainline
ArchSpec.cpp
Go to the documentation of this file.
1//===-- ArchSpec.cpp ------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
11
12#include "lldb/Utility/Log.h"
14#include "lldb/lldb-defines.h"
15#include "llvm/ADT/STLExtras.h"
16#include "llvm/ADT/StringSwitch.h"
17#include "llvm/BinaryFormat/COFF.h"
18#include "llvm/BinaryFormat/ELF.h"
19#include "llvm/BinaryFormat/MachO.h"
20#include "llvm/BinaryFormat/XCOFF.h"
21#include "llvm/Support/Compiler.h"
22#include "llvm/TargetParser/ARMTargetParser.h"
23
24using namespace lldb;
25using namespace lldb_private;
26
27static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2,
28 bool try_inverse, bool enforce_exact_match);
29
30namespace lldb_private {
31
37 llvm::Triple::ArchType machine;
39 const char *const name;
40};
41
42} // namespace lldb_private
43
44#define AMD_GPU_CORE_DEF_R600(sub) \
45 {eByteOrderLittle, \
46 4, \
47 4, \
48 16, \
49 llvm::Triple::r600, \
50 ArchSpec::eCore_amd_gpu_r600_##sub, \
51 "r600"}
52#define AMD_GPU_CORE_DEF_GCN(sub) \
53 {eByteOrderLittle, \
54 8, \
55 4, \
56 16, \
57 llvm::Triple::amdgpu, \
58 ArchSpec::eCore_amd_gpu_gcn_##sub, \
59 "amdgpu"}
60// This core information can be looked using the ArchSpec::Core as the index
61static constexpr const CoreDefinition g_core_definitions[] = {
62 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_generic,
63 "arm"},
64 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv4,
65 "armv4"},
66 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv4t,
67 "armv4t"},
68 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5,
69 "armv5"},
70 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5e,
71 "armv5e"},
72 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5t,
73 "armv5t"},
74 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv6,
75 "armv6"},
76 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv6m,
77 "armv6m"},
78 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7,
79 "armv7"},
80 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7a,
81 "armv7a"},
82 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7l,
83 "armv7l"},
84 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7f,
85 "armv7f"},
86 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7s,
87 "armv7s"},
88 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7k,
89 "armv7k"},
90 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7m,
91 "armv7m"},
92 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7em,
93 "armv7em"},
94 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm,
95 ArchSpec::eCore_arm_armv8m_base, "armv8m.base"},
96 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm,
97 ArchSpec::eCore_arm_armv8m_main, "armv8m.main"},
98 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm,
99 ArchSpec::eCore_arm_armv8_1m_main, "armv8.1m.main"},
100 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_xscale,
101 "xscale"},
102 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumb,
103 "thumb"},
104 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv4t,
105 "thumbv4t"},
106 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv5,
107 "thumbv5"},
108 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv5e,
109 "thumbv5e"},
110 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv6,
111 "thumbv6"},
112 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv6m,
113 "thumbv6m"},
114 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7,
115 "thumbv7"},
116 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7s,
117 "thumbv7s"},
118 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7k,
119 "thumbv7k"},
120 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7f,
121 "thumbv7f"},
122 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7m,
123 "thumbv7m"},
124 {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7em,
125 "thumbv7em"},
126 {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,
128 {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,
130 {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,
132 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv8l,
133 "armv8l"},
134 {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,
136 {eByteOrderLittle, 4, 4, 4, llvm::Triple::aarch64_32,
137 ArchSpec::eCore_arm_arm64_32, "arm64_32"},
138 {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,
139 ArchSpec::eCore_arm_aarch64, "aarch64"},
140
141 // mips32, mips32r2, mips32r3, mips32r5, mips32r6
142 {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32,
143 "mips"},
144 {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r2,
145 "mipsr2"},
146 {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r3,
147 "mipsr3"},
148 {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r5,
149 "mipsr5"},
150 {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r6,
151 "mipsr6"},
152 {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, ArchSpec::eCore_mips32el,
153 "mipsel"},
154 {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,
155 ArchSpec::eCore_mips32r2el, "mipsr2el"},
156 {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,
157 ArchSpec::eCore_mips32r3el, "mipsr3el"},
158 {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,
159 ArchSpec::eCore_mips32r5el, "mipsr5el"},
160 {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,
161 ArchSpec::eCore_mips32r6el, "mipsr6el"},
162
163 // mips64, mips64r2, mips64r3, mips64r5, mips64r6
164 {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64,
165 "mips64"},
166 {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r2,
167 "mips64r2"},
168 {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r3,
169 "mips64r3"},
170 {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r5,
171 "mips64r5"},
172 {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r6,
173 "mips64r6"},
174 {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,
175 ArchSpec::eCore_mips64el, "mips64el"},
176 {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,
177 ArchSpec::eCore_mips64r2el, "mips64r2el"},
178 {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,
179 ArchSpec::eCore_mips64r3el, "mips64r3el"},
180 {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,
181 ArchSpec::eCore_mips64r5el, "mips64r5el"},
182 {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,
183 ArchSpec::eCore_mips64r6el, "mips64r6el"},
184
185 // MSP430
186 {eByteOrderLittle, 2, 2, 4, llvm::Triple::msp430, ArchSpec::eCore_msp430,
187 "msp430"},
188
189 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_generic,
190 "powerpc"},
191 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc601,
192 "ppc601"},
193 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc602,
194 "ppc602"},
195 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603,
196 "ppc603"},
197 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603e,
198 "ppc603e"},
199 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603ev,
200 "ppc603ev"},
201 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc604,
202 "ppc604"},
203 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc604e,
204 "ppc604e"},
205 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc620,
206 "ppc620"},
207 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc750,
208 "ppc750"},
209 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc7400,
210 "ppc7400"},
211 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc7450,
212 "ppc7450"},
213 {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc970,
214 "ppc970"},
215
216 {eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64le,
217 ArchSpec::eCore_ppc64le_generic, "powerpc64le"},
218 {eByteOrderBig, 8, 4, 4, llvm::Triple::ppc64, ArchSpec::eCore_ppc64_generic,
219 "powerpc64"},
220 {eByteOrderBig, 8, 4, 4, llvm::Triple::ppc64,
222
223 {eByteOrderBig, 8, 2, 6, llvm::Triple::systemz,
225
226 {eByteOrderLittle, 4, 4, 4, llvm::Triple::sparc,
228 {eByteOrderLittle, 8, 4, 4, llvm::Triple::sparcv9,
230
231 {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i386,
232 "i386"},
233 {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i486,
234 "i486"},
235 {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86,
237 {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i686,
238 "i686"},
239
240 {eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64,
242 {eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64,
244 {eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64,
246
247 {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon,
249 {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon,
251 {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon,
253
254 {eByteOrderLittle, 4, 2, 8, llvm::Triple::riscv32, ArchSpec::eCore_riscv32,
255 "riscv32"},
256 {eByteOrderLittle, 8, 2, 8, llvm::Triple::riscv64, ArchSpec::eCore_riscv64,
257 "riscv64"},
258
259 {eByteOrderLittle, 4, 4, 4, llvm::Triple::loongarch32,
260 ArchSpec::eCore_loongarch32, "loongarch32"},
261 {eByteOrderLittle, 8, 4, 4, llvm::Triple::loongarch64,
262 ArchSpec::eCore_loongarch64, "loongarch64"},
263
264 {eByteOrderLittle, 4, 4, 4, llvm::Triple::UnknownArch,
265 ArchSpec::eCore_uknownMach32, "unknown-mach-32"},
266 {eByteOrderLittle, 8, 4, 4, llvm::Triple::UnknownArch,
267 ArchSpec::eCore_uknownMach64, "unknown-mach-64"},
268 {eByteOrderLittle, 4, 2, 4, llvm::Triple::arc, ArchSpec::eCore_arc, "arc"},
269
270 {eByteOrderLittle, 2, 2, 4, llvm::Triple::avr, ArchSpec::eCore_avr, "avr"},
271
272 {eByteOrderLittle, 4, 1, 4, llvm::Triple::wasm32, ArchSpec::eCore_wasm32,
273 "wasm32"},
282 AMD_GPU_CORE_DEF_R600(CYPRESS),
283 AMD_GPU_CORE_DEF_R600(JUNIPER),
284 AMD_GPU_CORE_DEF_R600(REDWOOD),
287 AMD_GPU_CORE_DEF_R600(CAICOS),
288 AMD_GPU_CORE_DEF_R600(CAYMAN),
290 AMD_GPU_CORE_DEF_GCN(GFX600),
291 AMD_GPU_CORE_DEF_GCN(GFX601),
292 AMD_GPU_CORE_DEF_GCN(GFX602),
293 AMD_GPU_CORE_DEF_GCN(GFX700),
294 AMD_GPU_CORE_DEF_GCN(GFX701),
295 AMD_GPU_CORE_DEF_GCN(GFX702),
296 AMD_GPU_CORE_DEF_GCN(GFX703),
297 AMD_GPU_CORE_DEF_GCN(GFX704),
298 AMD_GPU_CORE_DEF_GCN(GFX705),
299 AMD_GPU_CORE_DEF_GCN(GFX801),
300 AMD_GPU_CORE_DEF_GCN(GFX802),
301 AMD_GPU_CORE_DEF_GCN(GFX803),
302 AMD_GPU_CORE_DEF_GCN(GFX805),
303 AMD_GPU_CORE_DEF_GCN(GFX810),
304 AMD_GPU_CORE_DEF_GCN(GFX900),
305 AMD_GPU_CORE_DEF_GCN(GFX902),
306 AMD_GPU_CORE_DEF_GCN(GFX904),
307 AMD_GPU_CORE_DEF_GCN(GFX906),
308 AMD_GPU_CORE_DEF_GCN(GFX908),
309 AMD_GPU_CORE_DEF_GCN(GFX909),
310 AMD_GPU_CORE_DEF_GCN(GFX90A),
311 AMD_GPU_CORE_DEF_GCN(GFX90C),
312 AMD_GPU_CORE_DEF_GCN(GFX942),
313 AMD_GPU_CORE_DEF_GCN(GFX950),
314 AMD_GPU_CORE_DEF_GCN(GFX1010),
315 AMD_GPU_CORE_DEF_GCN(GFX1011),
316 AMD_GPU_CORE_DEF_GCN(GFX1012),
317 AMD_GPU_CORE_DEF_GCN(GFX1013),
318 AMD_GPU_CORE_DEF_GCN(GFX1030),
319 AMD_GPU_CORE_DEF_GCN(GFX1031),
320 AMD_GPU_CORE_DEF_GCN(GFX1032),
321 AMD_GPU_CORE_DEF_GCN(GFX1033),
322 AMD_GPU_CORE_DEF_GCN(GFX1034),
323 AMD_GPU_CORE_DEF_GCN(GFX1035),
324 AMD_GPU_CORE_DEF_GCN(GFX1036),
325 AMD_GPU_CORE_DEF_GCN(GFX1100),
326 AMD_GPU_CORE_DEF_GCN(GFX1101),
327 AMD_GPU_CORE_DEF_GCN(GFX1102),
328 AMD_GPU_CORE_DEF_GCN(GFX1103),
329 AMD_GPU_CORE_DEF_GCN(GFX1150),
330 AMD_GPU_CORE_DEF_GCN(GFX1151),
331 AMD_GPU_CORE_DEF_GCN(GFX1152),
332 AMD_GPU_CORE_DEF_GCN(GFX1153),
333 AMD_GPU_CORE_DEF_GCN(GFX1154),
334 AMD_GPU_CORE_DEF_GCN(GFX1170),
335 AMD_GPU_CORE_DEF_GCN(GFX1171),
336 AMD_GPU_CORE_DEF_GCN(GFX1172),
337 AMD_GPU_CORE_DEF_GCN(GFX1200),
338 AMD_GPU_CORE_DEF_GCN(GFX1201),
339 AMD_GPU_CORE_DEF_GCN(GFX1250),
340 AMD_GPU_CORE_DEF_GCN(GFX1251),
341 AMD_GPU_CORE_DEF_GCN(GFX1310),
342 AMD_GPU_CORE_DEF_GCN(GFX9_GENERIC),
343 AMD_GPU_CORE_DEF_GCN(GFX9_4_GENERIC),
344 AMD_GPU_CORE_DEF_GCN(GFX10_1_GENERIC),
345 AMD_GPU_CORE_DEF_GCN(GFX10_3_GENERIC),
346 AMD_GPU_CORE_DEF_GCN(GFX11_GENERIC),
347 AMD_GPU_CORE_DEF_GCN(GFX12_GENERIC),
348 AMD_GPU_CORE_DEF_GCN(GFX12_5_GENERIC),
349 AMD_GPU_CORE_DEF_GCN(GFX11_7_GENERIC),
350 AMD_GPU_CORE_DEF_GCN(GFX13_GENERIC),
351 {eByteOrderLittle, 8, 4, 16, llvm::Triple::amdgpu,
353};
354
355// Ensure that we have an entry in the g_core_definitions for each core. If you
356// comment out an entry above, you will need to comment out the corresponding
357// ArchSpec::Core enumeration.
358static_assert(sizeof(g_core_definitions) / sizeof(CoreDefinition) ==
360 "make sure we have one core definition for each core");
361
362template <int I> struct ArchSpecValidator : ArchSpecValidator<I + 1> {
363 static_assert(g_core_definitions[I].core == I,
364 "g_core_definitions order doesn't match Core enumeration");
365};
366
367template <> struct ArchSpecValidator<ArchSpec::kNumCores> {};
368
370
378
385
387 for (const auto &def : g_core_definitions)
388 list.AppendString(def.name);
389}
390
392 for (const auto &def : g_core_definitions)
393 request.TryCompleteCurrentArg(def.name);
394}
395
396#define CPU_ANY (UINT32_MAX)
397
398//===----------------------------------------------------------------------===//
399// A table that gets searched linearly for matches. This table is used to
400// convert cpu type and subtypes to architecture names, and to convert
401// architecture names to cpu types and subtypes. The ordering is important and
402// allows the precedence to be set when the table is built.
403#define SUBTYPE_MASK 0x00FFFFFFu
404
405// clang-format off
407 {ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, CPU_ANY, UINT32_MAX, UINT32_MAX},
408 {ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK},
409 {ArchSpec::eCore_arm_armv4, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},
410 {ArchSpec::eCore_arm_armv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},
411 {ArchSpec::eCore_arm_armv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK},
412 {ArchSpec::eCore_arm_armv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK},
413 {ArchSpec::eCore_arm_armv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},
414 {ArchSpec::eCore_arm_armv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},
415 {ArchSpec::eCore_arm_armv5t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},
416 {ArchSpec::eCore_arm_xscale, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_XSCALE, UINT32_MAX, SUBTYPE_MASK},
417 {ArchSpec::eCore_arm_armv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK},
418 {ArchSpec::eCore_arm_armv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK},
419 {ArchSpec::eCore_arm_armv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK},
420 {ArchSpec::eCore_arm_armv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},
421 {ArchSpec::eCore_arm_armv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},
422 {ArchSpec::eCore_arm_armv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},
423 {ArchSpec::eCore_arm_armv8m_base, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_BASE, UINT32_MAX, SUBTYPE_MASK},
424 {ArchSpec::eCore_arm_armv8m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_MAIN, UINT32_MAX, SUBTYPE_MASK},
425 {ArchSpec::eCore_arm_armv8_1m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN, UINT32_MAX, SUBTYPE_MASK},
426 {ArchSpec::eCore_arm_arm64e, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64E, UINT32_MAX, SUBTYPE_MASK},
427 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_ALL, UINT32_MAX, SUBTYPE_MASK},
428 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_V8, UINT32_MAX, SUBTYPE_MASK},
429 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, 13, UINT32_MAX, SUBTYPE_MASK},
430 {ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 0, UINT32_MAX, SUBTYPE_MASK},
431 {ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 1, UINT32_MAX, SUBTYPE_MASK},
432 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},
433 {ArchSpec::eCore_thumb, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK},
434 {ArchSpec::eCore_thumbv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},
435 {ArchSpec::eCore_thumbv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK},
436 {ArchSpec::eCore_thumbv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK},
437 {ArchSpec::eCore_thumbv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK},
438 {ArchSpec::eCore_thumbv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK},
439 {ArchSpec::eCore_thumbv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK},
440 {ArchSpec::eCore_thumbv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK},
441 {ArchSpec::eCore_thumbv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK},
442 {ArchSpec::eCore_thumbv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},
443 {ArchSpec::eCore_thumbv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},
444 {ArchSpec::eCore_thumbv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},
445 {ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, CPU_ANY, UINT32_MAX, UINT32_MAX},
446 {ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK},
447 {ArchSpec::eCore_ppc_ppc601, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_601, UINT32_MAX, SUBTYPE_MASK},
448 {ArchSpec::eCore_ppc_ppc602, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_602, UINT32_MAX, SUBTYPE_MASK},
449 {ArchSpec::eCore_ppc_ppc603, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603, UINT32_MAX, SUBTYPE_MASK},
450 {ArchSpec::eCore_ppc_ppc603e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603e, UINT32_MAX, SUBTYPE_MASK},
451 {ArchSpec::eCore_ppc_ppc603ev, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603ev, UINT32_MAX, SUBTYPE_MASK},
452 {ArchSpec::eCore_ppc_ppc604, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604, UINT32_MAX, SUBTYPE_MASK},
453 {ArchSpec::eCore_ppc_ppc604e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604e, UINT32_MAX, SUBTYPE_MASK},
454 {ArchSpec::eCore_ppc_ppc620, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_620, UINT32_MAX, SUBTYPE_MASK},
455 {ArchSpec::eCore_ppc_ppc750, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_750, UINT32_MAX, SUBTYPE_MASK},
456 {ArchSpec::eCore_ppc_ppc7400, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7400, UINT32_MAX, SUBTYPE_MASK},
457 {ArchSpec::eCore_ppc_ppc7450, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7450, UINT32_MAX, SUBTYPE_MASK},
458 {ArchSpec::eCore_ppc_ppc970, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_970, UINT32_MAX, SUBTYPE_MASK},
459 {ArchSpec::eCore_ppc64_generic, llvm::MachO::CPU_TYPE_POWERPC64, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK},
460 {ArchSpec::eCore_ppc64le_generic, llvm::MachO::CPU_TYPE_POWERPC64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},
461 {ArchSpec::eCore_ppc64_ppc970_64, llvm::MachO::CPU_TYPE_POWERPC64, 100, UINT32_MAX, SUBTYPE_MASK},
462 {ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_I386_ALL, UINT32_MAX, SUBTYPE_MASK},
463 {ArchSpec::eCore_x86_32_i486, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486, UINT32_MAX, SUBTYPE_MASK},
464 {ArchSpec::eCore_x86_32_i486sx, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486SX, UINT32_MAX, SUBTYPE_MASK},
465 {ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, CPU_ANY, UINT32_MAX, UINT32_MAX},
466 {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_ALL, UINT32_MAX, SUBTYPE_MASK},
467 {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_ARCH1, UINT32_MAX, SUBTYPE_MASK},
468 {ArchSpec::eCore_x86_64_x86_64h, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_H, UINT32_MAX, SUBTYPE_MASK},
469 {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, CPU_ANY, UINT32_MAX, UINT32_MAX},
470 {ArchSpec::eCore_riscv32, llvm::MachO::CPU_TYPE_RISCV, llvm::MachO::CPU_SUBTYPE_RISCV_ALL, UINT32_MAX, SUBTYPE_MASK},
471 {ArchSpec::eCore_riscv32, llvm::MachO::CPU_TYPE_RISCV, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},
472 // Catch any unknown mach architectures so we can always use the object and symbol mach-o files
473 {ArchSpec::eCore_uknownMach32, 0, 0, 0xFF000000u, 0x00000000u},
474 {ArchSpec::eCore_uknownMach64, llvm::MachO::CPU_ARCH_ABI64, 0, 0xFF000000u, 0x00000000u}
475};
476// clang-format on
477
481
482#define AMD_GPU_ARCH_DEF_R600(sub) \
483 {ArchSpec::eCore_amd_gpu_r600_##sub, llvm::ELF::EM_AMDGPU, \
484 llvm::ELF::EF_AMDGPU_MACH_R600_##sub}
485#define AMD_GPU_ARCH_DEF_GCN(sub) \
486 {ArchSpec::eCore_amd_gpu_gcn_##sub, llvm::ELF::EM_AMDGPU, \
487 llvm::ELF::EF_AMDGPU_MACH_AMDGCN_##sub}
488//===----------------------------------------------------------------------===//
489// A table that gets searched linearly for matches. This table is used to
490// convert cpu type and subtypes to architecture names, and to convert
491// architecture names to cpu types and subtypes. The ordering is important and
492// allows the precedence to be set when the table is built.
493// clang-format off
495 {ArchSpec::eCore_sparc_generic, llvm::ELF::EM_SPARC }, // Sparc
496 {ArchSpec::eCore_x86_32_i386, llvm::ELF::EM_386 }, // Intel 80386
497 {ArchSpec::eCore_x86_32_i486, llvm::ELF::EM_IAMCU }, // Intel MCU // FIXME: is this correct?
498 {ArchSpec::eCore_ppc_generic, llvm::ELF::EM_PPC }, // PowerPC
499 {ArchSpec::eCore_ppc64le_generic, llvm::ELF::EM_PPC64, ArchSpec::eCore_ppc64le_generic}, // PowerPC64le
500 {ArchSpec::eCore_ppc64_generic, llvm::ELF::EM_PPC64, ArchSpec::eCore_ppc64_generic}, // PowerPC64
501 {ArchSpec::eCore_arm_generic, llvm::ELF::EM_ARM }, // ARM
502 {ArchSpec::eCore_arm_aarch64, llvm::ELF::EM_AARCH64 }, // ARM64
503 {ArchSpec::eCore_s390x_generic, llvm::ELF::EM_S390 }, // SystemZ
504 {ArchSpec::eCore_sparc9_generic, llvm::ELF::EM_SPARCV9 }, // SPARC V9
505 {ArchSpec::eCore_x86_64_x86_64, llvm::ELF::EM_X86_64 }, // AMD64
506 {ArchSpec::eCore_mips32, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32}, // mips32
507 {ArchSpec::eCore_mips32r2, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r2}, // mips32r2
508 {ArchSpec::eCore_mips32r6, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r6}, // mips32r6
509 {ArchSpec::eCore_mips32el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32el}, // mips32el
510 {ArchSpec::eCore_mips32r2el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r2el}, // mips32r2el
511 {ArchSpec::eCore_mips32r6el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r6el}, // mips32r6el
513 {ArchSpec::eCore_mips64r2, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r2}, // mips64r2
514 {ArchSpec::eCore_mips64r6, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r6}, // mips64r6
515 {ArchSpec::eCore_mips64el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64el}, // mips64el
516 {ArchSpec::eCore_mips64r2el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r2el}, // mips64r2el
517 {ArchSpec::eCore_mips64r6el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r6el}, // mips64r6el
518 {ArchSpec::eCore_msp430, llvm::ELF::EM_MSP430 }, // MSP430
519 {ArchSpec::eCore_hexagon_generic, llvm::ELF::EM_HEXAGON }, // HEXAGON
520 {ArchSpec::eCore_arc, llvm::ELF::EM_ARC_COMPACT2}, // ARC
521 {ArchSpec::eCore_avr, llvm::ELF::EM_AVR }, // AVR
522 {ArchSpec::eCore_riscv32, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv32}, // riscv32
523 {ArchSpec::eCore_riscv64, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv64}, // riscv64
524 {ArchSpec::eCore_loongarch32, llvm::ELF::EM_LOONGARCH, ArchSpec::eLoongArchSubType_loongarch32}, // loongarch32
525 {ArchSpec::eCore_loongarch64, llvm::ELF::EM_LOONGARCH, ArchSpec::eLoongArchSubType_loongarch64}, // loongarch64
534 AMD_GPU_ARCH_DEF_R600(CYPRESS),
535 AMD_GPU_ARCH_DEF_R600(JUNIPER),
536 AMD_GPU_ARCH_DEF_R600(REDWOOD),
539 AMD_GPU_ARCH_DEF_R600(CAICOS),
540 AMD_GPU_ARCH_DEF_R600(CAYMAN),
542 AMD_GPU_ARCH_DEF_GCN(GFX600),
543 AMD_GPU_ARCH_DEF_GCN(GFX601),
544 AMD_GPU_ARCH_DEF_GCN(GFX602),
545 AMD_GPU_ARCH_DEF_GCN(GFX700),
546 AMD_GPU_ARCH_DEF_GCN(GFX701),
547 AMD_GPU_ARCH_DEF_GCN(GFX702),
548 AMD_GPU_ARCH_DEF_GCN(GFX703),
549 AMD_GPU_ARCH_DEF_GCN(GFX704),
550 AMD_GPU_ARCH_DEF_GCN(GFX705),
551 AMD_GPU_ARCH_DEF_GCN(GFX801),
552 AMD_GPU_ARCH_DEF_GCN(GFX802),
553 AMD_GPU_ARCH_DEF_GCN(GFX803),
554 AMD_GPU_ARCH_DEF_GCN(GFX805),
555 AMD_GPU_ARCH_DEF_GCN(GFX810),
556 AMD_GPU_ARCH_DEF_GCN(GFX900),
557 AMD_GPU_ARCH_DEF_GCN(GFX902),
558 AMD_GPU_ARCH_DEF_GCN(GFX904),
559 AMD_GPU_ARCH_DEF_GCN(GFX906),
560 AMD_GPU_ARCH_DEF_GCN(GFX908),
561 AMD_GPU_ARCH_DEF_GCN(GFX909),
562 AMD_GPU_ARCH_DEF_GCN(GFX90A),
563 AMD_GPU_ARCH_DEF_GCN(GFX90C),
564 AMD_GPU_ARCH_DEF_GCN(GFX942),
565 AMD_GPU_ARCH_DEF_GCN(GFX950),
566 AMD_GPU_ARCH_DEF_GCN(GFX1010),
567 AMD_GPU_ARCH_DEF_GCN(GFX1011),
568 AMD_GPU_ARCH_DEF_GCN(GFX1012),
569 AMD_GPU_ARCH_DEF_GCN(GFX1013),
570 AMD_GPU_ARCH_DEF_GCN(GFX1030),
571 AMD_GPU_ARCH_DEF_GCN(GFX1031),
572 AMD_GPU_ARCH_DEF_GCN(GFX1032),
573 AMD_GPU_ARCH_DEF_GCN(GFX1033),
574 AMD_GPU_ARCH_DEF_GCN(GFX1034),
575 AMD_GPU_ARCH_DEF_GCN(GFX1035),
576 AMD_GPU_ARCH_DEF_GCN(GFX1036),
577 AMD_GPU_ARCH_DEF_GCN(GFX1100),
578 AMD_GPU_ARCH_DEF_GCN(GFX1101),
579 AMD_GPU_ARCH_DEF_GCN(GFX1102),
580 AMD_GPU_ARCH_DEF_GCN(GFX1103),
581 AMD_GPU_ARCH_DEF_GCN(GFX1150),
582 AMD_GPU_ARCH_DEF_GCN(GFX1151),
583 AMD_GPU_ARCH_DEF_GCN(GFX1152),
584 AMD_GPU_ARCH_DEF_GCN(GFX1153),
585 AMD_GPU_ARCH_DEF_GCN(GFX1154),
586 AMD_GPU_ARCH_DEF_GCN(GFX1170),
587 AMD_GPU_ARCH_DEF_GCN(GFX1171),
588 AMD_GPU_ARCH_DEF_GCN(GFX1172),
589 AMD_GPU_ARCH_DEF_GCN(GFX1200),
590 AMD_GPU_ARCH_DEF_GCN(GFX1201),
591 AMD_GPU_ARCH_DEF_GCN(GFX1250),
592 AMD_GPU_ARCH_DEF_GCN(GFX1251),
593 AMD_GPU_ARCH_DEF_GCN(GFX1310),
594 AMD_GPU_ARCH_DEF_GCN(GFX9_GENERIC),
595 AMD_GPU_ARCH_DEF_GCN(GFX9_4_GENERIC),
596 AMD_GPU_ARCH_DEF_GCN(GFX10_1_GENERIC),
597 AMD_GPU_ARCH_DEF_GCN(GFX10_3_GENERIC),
598 AMD_GPU_ARCH_DEF_GCN(GFX11_GENERIC),
599 AMD_GPU_ARCH_DEF_GCN(GFX12_GENERIC),
600 AMD_GPU_ARCH_DEF_GCN(GFX12_5_GENERIC),
601 AMD_GPU_ARCH_DEF_GCN(GFX11_7_GENERIC),
602 AMD_GPU_ARCH_DEF_GCN(GFX13_GENERIC),
603 // Any AMDGPU object with no recognized model resolves here.
604 {ArchSpec::eCore_amd_gpu_unknown, llvm::ELF::EM_AMDGPU},
605};
606// clang-format on
607
610 std::size(g_elf_arch_entries),
612 "elf",
613};
614// clang-format off
616 {ArchSpec::eCore_x86_32_i386, llvm::COFF::IMAGE_FILE_MACHINE_I386}, // Intel 80x86
617 {ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPC}, // PowerPC
618 {ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP}, // PowerPC (with FPU)
619 {ArchSpec::eCore_arm_generic, llvm::COFF::IMAGE_FILE_MACHINE_ARM}, // ARM
620 {ArchSpec::eCore_arm_armv7, llvm::COFF::IMAGE_FILE_MACHINE_ARMNT}, // ARMv7
621 {ArchSpec::eCore_thumb, llvm::COFF::IMAGE_FILE_MACHINE_THUMB}, // ARMv7
622 {ArchSpec::eCore_x86_64_x86_64, llvm::COFF::IMAGE_FILE_MACHINE_AMD64}, // AMD64
623 {ArchSpec::eCore_arm_arm64, llvm::COFF::IMAGE_FILE_MACHINE_ARM64} // ARM64
624};
625// clang-format on
626
629 std::size(g_coff_arch_entries),
631 "pe-coff",
632};
633
634// clang-format off
636 {ArchSpec::eCore_ppc_generic, llvm::XCOFF::TCPU_PPC},
637 {ArchSpec::eCore_ppc64_generic, llvm::XCOFF::TCPU_PPC64}
638};
639// clang-format on
640
643 std::size(g_xcoff_arch_entries),
645 "xcoff",
646};
647
648//===----------------------------------------------------------------------===//
649// Table of all ArchDefinitions
652
653//===----------------------------------------------------------------------===//
654// Static helper functions.
655
656// Get the architecture definition for a given object type.
658 for (const ArchDefinition *def : g_arch_definitions) {
659 if (def->type == arch_type)
660 return def;
661 }
662 return nullptr;
663}
664
665// Get an architecture definition by name.
666static const CoreDefinition *FindCoreDefinition(llvm::StringRef name) {
667 for (const auto &def : g_core_definitions) {
668 if (name.equals_insensitive(def.name))
669 return &def;
670 }
671 return nullptr;
672}
673
675 if (core < std::size(g_core_definitions))
676 return &g_core_definitions[core];
677 return nullptr;
678}
679
680// Get a definition entry by cpu type and subtype.
681static const ArchDefinitionEntry *
682FindArchDefinitionEntry(const ArchDefinition *def, uint32_t cpu, uint32_t sub) {
683 if (def == nullptr)
684 return nullptr;
685
686 const ArchDefinitionEntry *entries = def->entries;
687 for (size_t i = 0; i < def->num_entries; ++i) {
688 if (entries[i].cpu == (cpu & entries[i].cpu_mask))
689 if (entries[i].sub == (sub & entries[i].sub_mask))
690 return &entries[i];
691 }
692 return nullptr;
693}
694
695static const ArchDefinitionEntry *
697 if (def == nullptr)
698 return nullptr;
699
700 const ArchDefinitionEntry *entries = def->entries;
701 for (size_t i = 0; i < def->num_entries; ++i) {
702 if (entries[i].core == core)
703 return &entries[i];
704 }
705 return nullptr;
706}
707
708static llvm::StringRef GetAMDGPUVariantName(uint32_t sub);
709
710//===----------------------------------------------------------------------===//
711// Constructors and destructors.
712
713ArchSpec::ArchSpec() = default;
714
715ArchSpec::ArchSpec(const char *triple_cstr) {
716 if (triple_cstr)
717 SetTriple(triple_cstr);
718}
719
720ArchSpec::ArchSpec(llvm::StringRef triple_str) { SetTriple(triple_str); }
721
722ArchSpec::ArchSpec(const llvm::Triple &triple) { SetTriple(triple); }
723
724ArchSpec::ArchSpec(ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) {
725 SetArchitecture(arch_type, cpu, subtype);
726}
727
728ArchSpec::~ArchSpec() = default;
729
731 m_triple = llvm::Triple();
734 m_flags = 0;
735}
736
737//===----------------------------------------------------------------------===//
738// Predicates.
739
740const char *ArchSpec::GetArchitectureName() const {
741 const CoreDefinition *core_def = FindCoreDefinition(m_core);
742 if (core_def)
743 return core_def->name;
744 return "unknown";
745}
746
747bool ArchSpec::IsMIPS() const { return GetTriple().isMIPS(); }
748
749bool ArchSpec::IsNVPTX() const { return GetTriple().isNVPTX(); }
750
751std::string ArchSpec::GetTargetABI() const {
752
753 std::string abi;
754
755 if (IsMIPS()) {
756 switch (GetFlags() & ArchSpec::eMIPSABI_mask) {
758 abi = "n64";
759 return abi;
761 abi = "n32";
762 return abi;
764 abi = "o32";
765 return abi;
766 default:
767 return abi;
768 }
769 }
770 return abi;
771}
772
773void ArchSpec::SetFlags(const std::string &elf_abi) {
774
775 uint32_t flag = GetFlags();
776 if (IsMIPS()) {
777 if (elf_abi == "n64")
779 else if (elf_abi == "n32")
781 else if (elf_abi == "o32")
783 }
784 SetFlags(flag);
785}
786
787std::string ArchSpec::GetClangTargetCPU() const {
788 std::string cpu;
789 if (IsMIPS()) {
790 switch (m_core) {
793 cpu = "mips32";
794 break;
797 cpu = "mips32r2";
798 break;
801 cpu = "mips32r3";
802 break;
805 cpu = "mips32r5";
806 break;
809 cpu = "mips32r6";
810 break;
813 cpu = "mips64";
814 break;
817 cpu = "mips64r2";
818 break;
821 cpu = "mips64r3";
822 break;
825 cpu = "mips64r5";
826 break;
829 cpu = "mips64r6";
830 break;
831 default:
832 break;
833 }
834 }
835
836 if (GetTriple().isARM())
837 cpu = llvm::ARM::getARMCPUForArch(GetTriple(), "").str();
838
839 if (GetTriple().isAMDGPU()) {
840 uint32_t sub = GetElfCPUSubType();
841 if (sub != LLDB_INVALID_CPUTYPE)
842 cpu = GetAMDGPUVariantName(sub);
843 }
844 return cpu;
845}
846
847static const ArchDefinitionEntry *
849 if (const CoreDefinition *core_def = FindCoreDefinition(core))
850 return FindArchDefinitionEntry(def, core_def->core);
851
852 return nullptr;
853}
854
855static uint32_t GetCPUType(const ArchDefinition *def, ArchSpec::Core core) {
856 if (const ArchDefinitionEntry *arch_def =
858 return arch_def->cpu;
860}
861
862static uint32_t GetCPUSubType(const ArchDefinition *def, ArchSpec::Core core) {
863 if (const ArchDefinitionEntry *arch_def =
865 return arch_def->sub;
867}
868
871}
872
876
879}
880
881llvm::Triple::ArchType ArchSpec::GetMachine() const {
882 const CoreDefinition *core_def = FindCoreDefinition(m_core);
883 if (core_def)
884 return core_def->machine;
885
886 return llvm::Triple::UnknownArch;
887}
888
890 const CoreDefinition *core_def = FindCoreDefinition(m_core);
891 if (core_def) {
892 if (core_def->machine == llvm::Triple::mips64 ||
893 core_def->machine == llvm::Triple::mips64el) {
894 // For N32/O32 applications Address size is 4 bytes.
896 return 4;
897 }
898 return core_def->addr_byte_size;
899 }
900 return 0;
901}
902
904 const CoreDefinition *core_def = FindCoreDefinition(m_core);
905 if (core_def)
906 return core_def->default_byte_order;
907 return eByteOrderInvalid;
908}
909
911 switch (m_triple.getArch()) {
912 default:
913 return true;
914
915 case llvm::Triple::aarch64:
916 case llvm::Triple::aarch64_32:
917 case llvm::Triple::aarch64_be:
918 case llvm::Triple::arm:
919 case llvm::Triple::armeb:
920 case llvm::Triple::thumb:
921 case llvm::Triple::thumbeb:
922 return m_triple.isOSDarwin() || m_triple.isOSWindows();
923
924 case llvm::Triple::ppc:
925 case llvm::Triple::ppc64:
926 return m_triple.isOSDarwin();
927
928 case llvm::Triple::riscv64:
929 case llvm::Triple::riscv32:
930 case llvm::Triple::ppc64le:
931 case llvm::Triple::systemz:
932 case llvm::Triple::xcore:
933 case llvm::Triple::arc:
934 return false;
935 }
936}
937
943
944//===----------------------------------------------------------------------===//
945// Mutators.
946
947bool ArchSpec::SetTriple(const llvm::Triple &triple) {
948 m_triple = triple;
949 UpdateCore();
950 return IsValid();
951}
952
953bool lldb_private::ParseMachCPUDashSubtypeTriple(llvm::StringRef triple_str,
954 ArchSpec &arch) {
955 // Accept "12-10" or "12.10" as cpu type/subtype
956 if (triple_str.empty())
957 return false;
958
959 size_t pos = triple_str.find_first_of("-.");
960 if (pos == llvm::StringRef::npos)
961 return false;
962
963 llvm::StringRef cpu_str = triple_str.substr(0, pos);
964 llvm::StringRef remainder = triple_str.substr(pos + 1);
965 if (cpu_str.empty() || remainder.empty())
966 return false;
967
968 llvm::StringRef sub_str;
969 llvm::StringRef vendor;
970 llvm::StringRef os;
971 std::tie(sub_str, remainder) = remainder.split('-');
972 std::tie(vendor, os) = remainder.split('-');
973
974 uint32_t cpu = 0;
975 uint32_t sub = 0;
976 if (cpu_str.getAsInteger(10, cpu) || sub_str.getAsInteger(10, sub))
977 return false;
978
979 if (!arch.SetArchitecture(eArchTypeMachO, cpu, sub))
980 return false;
981 if (!vendor.empty() && !os.empty()) {
982 arch.GetTriple().setVendorName(vendor);
983 arch.GetTriple().setOSName(os);
984 }
985
986 return true;
987}
988
989bool ArchSpec::SetTriple(llvm::StringRef triple) {
990 if (triple.empty()) {
991 Clear();
992 return false;
993 }
994
995 if (ParseMachCPUDashSubtypeTriple(triple, *this))
996 return true;
997
998 SetTriple(llvm::Triple(llvm::Triple::normalize(triple)));
999 return IsValid();
1000}
1001
1002bool ArchSpec::ContainsOnlyArch(const llvm::Triple &normalized_triple) {
1003 return !normalized_triple.getArchName().empty() &&
1004 normalized_triple.getOSName().empty() &&
1005 normalized_triple.getVendorName().empty() &&
1006 normalized_triple.getEnvironmentName().empty();
1007}
1008
1009void ArchSpec::MergeFrom(const ArchSpec &other) {
1010 // ios-macabi always wins over macosx.
1011 if ((GetTriple().getOS() == llvm::Triple::MacOSX ||
1012 GetTriple().getOS() == llvm::Triple::UnknownOS) &&
1013 other.GetTriple().getOS() == llvm::Triple::IOS &&
1014 other.GetTriple().getEnvironment() == llvm::Triple::MacABI) {
1015 (*this) = other;
1016 return;
1017 }
1018
1020 GetTriple().setVendor(other.GetTriple().getVendor());
1022 GetTriple().setOS(other.GetTriple().getOS());
1023 if (GetTriple().getArch() == llvm::Triple::UnknownArch) {
1024 GetTriple().setArch(other.GetTriple().getArch());
1025
1026 // MachO unknown64 isn't really invalid as the debugger can still obtain
1027 // information from the binary, e.g. line tables. As such, we don't update
1028 // the core here.
1029 if (other.GetCore() != eCore_uknownMach64)
1030 UpdateCore();
1031 }
1034 GetTriple().setEnvironment(other.GetTriple().getEnvironment());
1035 }
1036 // If this and other are both arm ArchSpecs and this ArchSpec is a generic
1037 // "some kind of arm" spec but the other ArchSpec is a specific arm core,
1038 // adopt the specific arm core.
1039 if (GetTriple().getArch() == llvm::Triple::arm &&
1040 other.GetTriple().getArch() == llvm::Triple::arm &&
1043 m_core = other.GetCore();
1044 CoreUpdated(false);
1045 }
1046 if (GetFlags() == 0) {
1047 SetFlags(other.GetFlags());
1048 }
1049}
1050
1051static llvm::StringRef GetAMDGPUVariantName(uint32_t sub) {
1052 switch (sub) {
1053 case llvm::ELF::EF_AMDGPU_MACH_R600_R600:
1054 return "r600";
1055 case llvm::ELF::EF_AMDGPU_MACH_R600_R630:
1056 return "r630";
1057 case llvm::ELF::EF_AMDGPU_MACH_R600_RS880:
1058 return "rs880";
1059 case llvm::ELF::EF_AMDGPU_MACH_R600_RV670:
1060 return "rv670";
1061 case llvm::ELF::EF_AMDGPU_MACH_R600_RV710:
1062 return "rv710";
1063 case llvm::ELF::EF_AMDGPU_MACH_R600_RV730:
1064 return "rv730";
1065 case llvm::ELF::EF_AMDGPU_MACH_R600_RV770:
1066 return "rv770";
1067 case llvm::ELF::EF_AMDGPU_MACH_R600_CEDAR:
1068 return "cedar";
1069 case llvm::ELF::EF_AMDGPU_MACH_R600_CYPRESS:
1070 return "cypress";
1071 case llvm::ELF::EF_AMDGPU_MACH_R600_JUNIPER:
1072 return "juniper";
1073 case llvm::ELF::EF_AMDGPU_MACH_R600_REDWOOD:
1074 return "redwood";
1075 case llvm::ELF::EF_AMDGPU_MACH_R600_SUMO:
1076 return "sumo";
1077 case llvm::ELF::EF_AMDGPU_MACH_R600_BARTS:
1078 return "barts";
1079 case llvm::ELF::EF_AMDGPU_MACH_R600_CAICOS:
1080 return "caicos";
1081 case llvm::ELF::EF_AMDGPU_MACH_R600_CAYMAN:
1082 return "cayman";
1083 case llvm::ELF::EF_AMDGPU_MACH_R600_TURKS:
1084 return "turks";
1085 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX600:
1086 return "gfx600";
1087 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX601:
1088 return "gfx601";
1089 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX602:
1090 return "gfx602";
1091 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX700:
1092 return "gfx700";
1093 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX701:
1094 return "gfx701";
1095 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX702:
1096 return "gfx702";
1097 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX703:
1098 return "gfx703";
1099 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX704:
1100 return "gfx704";
1101 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX705:
1102 return "gfx705";
1103 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX801:
1104 return "gfx801";
1105 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX802:
1106 return "gfx802";
1107 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX803:
1108 return "gfx803";
1109 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX805:
1110 return "gfx805";
1111 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX810:
1112 return "gfx810";
1113 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX900:
1114 return "gfx900";
1115 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX902:
1116 return "gfx902";
1117 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX904:
1118 return "gfx904";
1119 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX906:
1120 return "gfx906";
1121 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX908:
1122 return "gfx908";
1123 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX909:
1124 return "gfx909";
1125 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A:
1126 return "gfx90a";
1127 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C:
1128 return "gfx90c";
1129 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX942:
1130 return "gfx942";
1131 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX950:
1132 return "gfx950";
1133 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010:
1134 return "gfx1010";
1135 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011:
1136 return "gfx1011";
1137 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012:
1138 return "gfx1012";
1139 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013:
1140 return "gfx1013";
1141 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030:
1142 return "gfx1030";
1143 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031:
1144 return "gfx1031";
1145 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032:
1146 return "gfx1032";
1147 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033:
1148 return "gfx1033";
1149 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034:
1150 return "gfx1034";
1151 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035:
1152 return "gfx1035";
1153 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036:
1154 return "gfx1036";
1155 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100:
1156 return "gfx1100";
1157 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101:
1158 return "gfx1101";
1159 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102:
1160 return "gfx1102";
1161 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103:
1162 return "gfx1103";
1163 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150:
1164 return "gfx1150";
1165 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151:
1166 return "gfx1151";
1167 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152:
1168 return "gfx1152";
1169 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153:
1170 return "gfx1153";
1171 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1154:
1172 return "gfx1154";
1173 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170:
1174 return "gfx1170";
1175 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171:
1176 return "gfx1171";
1177 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172:
1178 return "gfx1172";
1179 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200:
1180 return "gfx1200";
1181 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201:
1182 return "gfx1201";
1183 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250:
1184 return "gfx1250";
1185 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251:
1186 return "gfx1251";
1187 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310:
1188 return "gfx1310";
1189 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC:
1190 return "gfx9-generic";
1191 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC:
1192 return "gfx9-4-generic";
1193 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC:
1194 return "gfx10-1-generic";
1195 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC:
1196 return "gfx10-3-generic";
1197 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC:
1198 return "gfx11-generic";
1199 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC:
1200 return "gfx12-generic";
1201 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC:
1202 return "gfx12-5-generic";
1203 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_7_GENERIC:
1204 return "gfx11-7-generic";
1205 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX13_GENERIC:
1206 return "gfx13-generic";
1207 default:
1208 break;
1209 }
1210 return llvm::StringRef("unknown");
1211}
1212
1213static ArchSpec::Core GetAMDGPUVariantToCoreR600(llvm::StringRef core_name) {
1214 return llvm::StringSwitch<ArchSpec::Core>(core_name)
1223 .Case("cypress", ArchSpec::eCore_amd_gpu_r600_CYPRESS)
1224 .Case("juniper", ArchSpec::eCore_amd_gpu_r600_JUNIPER)
1225 .Case("redwood", ArchSpec::eCore_amd_gpu_r600_REDWOOD)
1232}
1233
1234static ArchSpec::Core GetAMDGPUVariantToCoreGCN(llvm::StringRef core_name) {
1235 return llvm::StringSwitch<ArchSpec::Core>(core_name)
1236 .Case("gfx600", ArchSpec::eCore_amd_gpu_gcn_GFX600)
1237 .Case("gfx601", ArchSpec::eCore_amd_gpu_gcn_GFX601)
1238 .Case("gfx602", ArchSpec::eCore_amd_gpu_gcn_GFX602)
1239 .Case("gfx700", ArchSpec::eCore_amd_gpu_gcn_GFX700)
1240 .Case("gfx701", ArchSpec::eCore_amd_gpu_gcn_GFX701)
1241 .Case("gfx702", ArchSpec::eCore_amd_gpu_gcn_GFX702)
1242 .Case("gfx703", ArchSpec::eCore_amd_gpu_gcn_GFX703)
1243 .Case("gfx704", ArchSpec::eCore_amd_gpu_gcn_GFX704)
1244 .Case("gfx705", ArchSpec::eCore_amd_gpu_gcn_GFX705)
1245 .Case("gfx801", ArchSpec::eCore_amd_gpu_gcn_GFX801)
1246 .Case("gfx802", ArchSpec::eCore_amd_gpu_gcn_GFX802)
1247 .Case("gfx803", ArchSpec::eCore_amd_gpu_gcn_GFX803)
1248 .Case("gfx805", ArchSpec::eCore_amd_gpu_gcn_GFX805)
1249 .Case("gfx810", ArchSpec::eCore_amd_gpu_gcn_GFX810)
1250 .Case("gfx900", ArchSpec::eCore_amd_gpu_gcn_GFX900)
1251 .Case("gfx902", ArchSpec::eCore_amd_gpu_gcn_GFX902)
1252 .Case("gfx904", ArchSpec::eCore_amd_gpu_gcn_GFX904)
1253 .Case("gfx906", ArchSpec::eCore_amd_gpu_gcn_GFX906)
1254 .Case("gfx908", ArchSpec::eCore_amd_gpu_gcn_GFX908)
1255 .Case("gfx909", ArchSpec::eCore_amd_gpu_gcn_GFX909)
1256 .Case("gfx90a", ArchSpec::eCore_amd_gpu_gcn_GFX90A)
1257 .Case("gfx90c", ArchSpec::eCore_amd_gpu_gcn_GFX90C)
1258 .Case("gfx942", ArchSpec::eCore_amd_gpu_gcn_GFX942)
1259 .Case("gfx950", ArchSpec::eCore_amd_gpu_gcn_GFX950)
1260 .Case("gfx1010", ArchSpec::eCore_amd_gpu_gcn_GFX1010)
1261 .Case("gfx1011", ArchSpec::eCore_amd_gpu_gcn_GFX1011)
1262 .Case("gfx1012", ArchSpec::eCore_amd_gpu_gcn_GFX1012)
1263 .Case("gfx1013", ArchSpec::eCore_amd_gpu_gcn_GFX1013)
1264 .Case("gfx1030", ArchSpec::eCore_amd_gpu_gcn_GFX1030)
1265 .Case("gfx1031", ArchSpec::eCore_amd_gpu_gcn_GFX1031)
1266 .Case("gfx1032", ArchSpec::eCore_amd_gpu_gcn_GFX1032)
1267 .Case("gfx1033", ArchSpec::eCore_amd_gpu_gcn_GFX1033)
1268 .Case("gfx1034", ArchSpec::eCore_amd_gpu_gcn_GFX1034)
1269 .Case("gfx1035", ArchSpec::eCore_amd_gpu_gcn_GFX1035)
1270 .Case("gfx1036", ArchSpec::eCore_amd_gpu_gcn_GFX1036)
1271 .Case("gfx1100", ArchSpec::eCore_amd_gpu_gcn_GFX1100)
1272 .Case("gfx1101", ArchSpec::eCore_amd_gpu_gcn_GFX1101)
1273 .Case("gfx1102", ArchSpec::eCore_amd_gpu_gcn_GFX1102)
1274 .Case("gfx1103", ArchSpec::eCore_amd_gpu_gcn_GFX1103)
1275 .Case("gfx1150", ArchSpec::eCore_amd_gpu_gcn_GFX1150)
1276 .Case("gfx1151", ArchSpec::eCore_amd_gpu_gcn_GFX1151)
1277 .Case("gfx1152", ArchSpec::eCore_amd_gpu_gcn_GFX1152)
1278 .Case("gfx1153", ArchSpec::eCore_amd_gpu_gcn_GFX1153)
1279 .Case("gfx1154", ArchSpec::eCore_amd_gpu_gcn_GFX1154)
1280 .Case("gfx1170", ArchSpec::eCore_amd_gpu_gcn_GFX1170)
1281 .Case("gfx1171", ArchSpec::eCore_amd_gpu_gcn_GFX1171)
1282 .Case("gfx1172", ArchSpec::eCore_amd_gpu_gcn_GFX1172)
1283 .Case("gfx1200", ArchSpec::eCore_amd_gpu_gcn_GFX1200)
1284 .Case("gfx1201", ArchSpec::eCore_amd_gpu_gcn_GFX1201)
1285 .Case("gfx1250", ArchSpec::eCore_amd_gpu_gcn_GFX1250)
1286 .Case("gfx1251", ArchSpec::eCore_amd_gpu_gcn_GFX1251)
1287 .Case("gfx1310", ArchSpec::eCore_amd_gpu_gcn_GFX1310)
1288 .Case("gfx9-generic", ArchSpec::eCore_amd_gpu_gcn_GFX9_GENERIC)
1289 .Case("gfx9-4-generic", ArchSpec::eCore_amd_gpu_gcn_GFX9_4_GENERIC)
1290 .Case("gfx10-1-generic", ArchSpec::eCore_amd_gpu_gcn_GFX10_1_GENERIC)
1291 .Case("gfx10-3-generic", ArchSpec::eCore_amd_gpu_gcn_GFX10_3_GENERIC)
1292 .Case("gfx11-generic", ArchSpec::eCore_amd_gpu_gcn_GFX11_GENERIC)
1293 .Case("gfx12-generic", ArchSpec::eCore_amd_gpu_gcn_GFX12_GENERIC)
1294 .Case("gfx12-5-generic", ArchSpec::eCore_amd_gpu_gcn_GFX12_5_GENERIC)
1295 .Case("gfx11-7-generic", ArchSpec::eCore_amd_gpu_gcn_GFX11_7_GENERIC)
1296 .Case("gfx13-generic", ArchSpec::eCore_amd_gpu_gcn_GFX13_GENERIC)
1298}
1299
1300bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu,
1301 uint32_t sub, uint32_t os) {
1303 bool update_triple = true;
1304 const ArchDefinition *arch_def = FindArchDefinition(arch_type);
1305 if (arch_def) {
1306 const ArchDefinitionEntry *arch_def_entry =
1307 FindArchDefinitionEntry(arch_def, cpu, sub);
1308 if (arch_def_entry) {
1309 const CoreDefinition *core_def = FindCoreDefinition(arch_def_entry->core);
1310 if (core_def) {
1311 m_core = core_def->core;
1312 update_triple = false;
1313 // Always use the architecture name because it might be more
1314 // descriptive than the architecture enum ("armv7" ->
1315 // llvm::Triple::arm).
1316 m_triple.setArchName(llvm::StringRef(core_def->name));
1317 if (arch_type == eArchTypeMachO) {
1318 m_triple.setVendor(llvm::Triple::Apple);
1319
1320 // Don't set the OS. It could be simulator, macosx, ios, watchos,
1321 // tvos, bridgeos. We could get close with the cpu type - but we
1322 // can't get it right all of the time. Better to leave this unset
1323 // so other sections of code will set it when they have more
1324 // information. NB: don't call m_triple.setOS
1325 // (llvm::Triple::UnknownOS). That sets the OSName to "unknown" and
1326 // the ArchSpec::TripleVendorWasSpecified() method says that any
1327 // OSName setting means it was specified.
1328 } else if (arch_type == eArchTypeELF) {
1329 switch (os) {
1330 case llvm::ELF::ELFOSABI_AIX:
1331 m_triple.setOS(llvm::Triple::OSType::AIX);
1332 break;
1333 case llvm::ELF::ELFOSABI_FREEBSD:
1334 m_triple.setOS(llvm::Triple::OSType::FreeBSD);
1335 break;
1336 case llvm::ELF::ELFOSABI_GNU:
1337 m_triple.setOS(llvm::Triple::OSType::Linux);
1338 break;
1339 case llvm::ELF::ELFOSABI_NETBSD:
1340 m_triple.setOS(llvm::Triple::OSType::NetBSD);
1341 break;
1342 case llvm::ELF::ELFOSABI_OPENBSD:
1343 m_triple.setOS(llvm::Triple::OSType::OpenBSD);
1344 break;
1345 case llvm::ELF::ELFOSABI_SOLARIS:
1346 m_triple.setOS(llvm::Triple::OSType::Solaris);
1347 break;
1348 case llvm::ELF::ELFOSABI_STANDALONE:
1349 m_triple.setOS(llvm::Triple::OSType::UnknownOS);
1350 break;
1351 case llvm::ELF::ELFOSABI_AMDGPU_HSA:
1352 m_triple.setVendor(llvm::Triple::VendorType::AMD);
1353 m_triple.setOS(llvm::Triple::OSType::AMDHSA);
1354 break;
1355 }
1356 } else if (arch_type == eArchTypeCOFF && os == llvm::Triple::Win32) {
1357 m_triple.setVendor(llvm::Triple::PC);
1358 m_triple.setOS(llvm::Triple::Win32);
1359 } else if (arch_type == eArchTypeXCOFF && os == llvm::Triple::AIX) {
1360 m_triple.setVendor(llvm::Triple::IBM);
1361 m_triple.setOS(llvm::Triple::AIX);
1362 } else {
1363 m_triple.setVendor(llvm::Triple::UnknownVendor);
1364 m_triple.setOS(llvm::Triple::UnknownOS);
1365 }
1366 switch (m_triple.getArch()) {
1367 case llvm::Triple::UnknownArch:
1368 // Fall back onto setting the machine type if the arch by name
1369 // failed...
1370 m_triple.setArch(core_def->machine);
1371 break;
1372 case llvm::Triple::r600:
1373 case llvm::Triple::amdgpu: {
1374 // AMDGPU arches are special: they append a 5th element to the triple
1375 // that comes after the environment and contains the sub type name.
1376 std::string environment("-");
1377 environment += GetAMDGPUVariantName(arch_def_entry->sub);
1378 m_triple.setEnvironmentName(environment);
1379 break;
1380 }
1381 default:
1382 break;
1383 }
1384 }
1385 } else {
1387 LLDB_LOGF(log,
1388 "Unable to find a core definition for cpu 0x%" PRIx32
1389 " sub %" PRId32,
1390 cpu, sub);
1391 }
1392 }
1393 CoreUpdated(update_triple);
1394 return IsValid();
1395}
1396
1398 const CoreDefinition *core_def = FindCoreDefinition(m_core);
1399 if (core_def)
1400 return core_def->min_opcode_byte_size;
1401 return 0;
1402}
1403
1405 const CoreDefinition *core_def = FindCoreDefinition(m_core);
1406 if (core_def)
1407 return core_def->max_opcode_byte_size;
1408 return 0;
1409}
1410
1411static bool IsCompatibleEnvironment(llvm::Triple::EnvironmentType lhs,
1412 llvm::Triple::EnvironmentType rhs) {
1413 if (lhs == rhs)
1414 return true;
1415
1416 // Apple simulators are a different platform than what they simulate.
1417 // As the environments are different at this point, if one of them is a
1418 // simulator, then they are different.
1419 if (lhs == llvm::Triple::Simulator || rhs == llvm::Triple::Simulator)
1420 return false;
1421
1422 // If any of the environment is unknown then they are compatible
1423 if (lhs == llvm::Triple::UnknownEnvironment ||
1424 rhs == llvm::Triple::UnknownEnvironment)
1425 return true;
1426
1427 // If one of the environment is Android and the other one is EABI then they
1428 // are considered to be compatible. This is required as a workaround for
1429 // shared libraries compiled for Android without the NOTE section indicating
1430 // that they are using the Android ABI.
1431 if ((lhs == llvm::Triple::Android && rhs == llvm::Triple::EABI) ||
1432 (rhs == llvm::Triple::Android && lhs == llvm::Triple::EABI) ||
1433 (lhs == llvm::Triple::GNUEABI && rhs == llvm::Triple::EABI) ||
1434 (rhs == llvm::Triple::GNUEABI && lhs == llvm::Triple::EABI) ||
1435 (lhs == llvm::Triple::GNUEABIHF && rhs == llvm::Triple::EABIHF) ||
1436 (rhs == llvm::Triple::GNUEABIHF && lhs == llvm::Triple::EABIHF))
1437 return true;
1438
1439 return false;
1440}
1441
1442bool ArchSpec::IsMatch(const ArchSpec &rhs, MatchType match) const {
1443 if (GetByteOrder() != rhs.GetByteOrder() ||
1444 !cores_match(GetCore(), rhs.GetCore(), true, match == ExactMatch))
1445 return false;
1446
1447 const llvm::Triple &lhs_triple = GetTriple();
1448 const llvm::Triple &rhs_triple = rhs.GetTriple();
1449
1450 const llvm::Triple::VendorType lhs_triple_vendor = lhs_triple.getVendor();
1451 const llvm::Triple::VendorType rhs_triple_vendor = rhs_triple.getVendor();
1452
1453 const llvm::Triple::OSType lhs_triple_os = lhs_triple.getOS();
1454 const llvm::Triple::OSType rhs_triple_os = rhs_triple.getOS();
1455
1456 bool both_windows = lhs_triple.isOSWindows() && rhs_triple.isOSWindows();
1457
1458 // On Windows, the vendor field doesn't have any practical effect, but
1459 // it is often set to either "pc" or "w64".
1460 if ((lhs_triple_vendor != rhs_triple_vendor) &&
1461 (match == ExactMatch || !both_windows)) {
1462 const bool rhs_vendor_specified = rhs.TripleVendorWasSpecified();
1463 const bool lhs_vendor_specified = TripleVendorWasSpecified();
1464 // Both architectures had the vendor specified, so if they aren't equal
1465 // then we return false
1466 if (rhs_vendor_specified && lhs_vendor_specified)
1467 return false;
1468
1469 // Only fail if both vendor types are not unknown
1470 if (lhs_triple_vendor != llvm::Triple::UnknownVendor &&
1471 rhs_triple_vendor != llvm::Triple::UnknownVendor)
1472 return false;
1473 }
1474
1475 const llvm::Triple::EnvironmentType lhs_triple_env =
1476 lhs_triple.getEnvironment();
1477 const llvm::Triple::EnvironmentType rhs_triple_env =
1478 rhs_triple.getEnvironment();
1479
1480 if (match == CompatibleMatch) {
1481 // x86_64-apple-ios-macabi, x86_64-apple-macosx are compatible, no match.
1482 if ((lhs_triple_os == llvm::Triple::IOS &&
1483 lhs_triple_env == llvm::Triple::MacABI &&
1484 rhs_triple_os == llvm::Triple::MacOSX) ||
1485 (lhs_triple_os == llvm::Triple::MacOSX &&
1486 rhs_triple_os == llvm::Triple::IOS &&
1487 rhs_triple_env == llvm::Triple::MacABI))
1488 return true;
1489 // x86_64-apple-driverkit, x86_64-apple-macosx are compatible, no match.
1490 if ((lhs_triple_os == llvm::Triple::DriverKit &&
1491 rhs_triple_os == llvm::Triple::MacOSX) ||
1492 (lhs_triple_os == llvm::Triple::MacOSX &&
1493 rhs_triple_os == llvm::Triple::DriverKit))
1494 return true;
1495 }
1496
1497 // x86_64-apple-ios-macabi and x86_64-apple-ios are not compatible.
1498 if (lhs_triple_os == llvm::Triple::IOS &&
1499 rhs_triple_os == llvm::Triple::IOS &&
1500 (lhs_triple_env == llvm::Triple::MacABI ||
1501 rhs_triple_env == llvm::Triple::MacABI) &&
1502 lhs_triple_env != rhs_triple_env)
1503 return false;
1504
1505 if (lhs_triple_os != rhs_triple_os) {
1506 const bool lhs_os_specified = TripleOSWasSpecified();
1507 const bool rhs_os_specified = rhs.TripleOSWasSpecified();
1508 // If both OS types are specified and different, fail.
1509 if (lhs_os_specified && rhs_os_specified)
1510 return false;
1511
1512 // If the pair of os+env is both unspecified, match any other os+env combo.
1513 if (match == CompatibleMatch &&
1514 ((!lhs_os_specified && !lhs_triple.hasEnvironment()) ||
1515 (!rhs_os_specified && !rhs_triple.hasEnvironment())))
1516 return true;
1517 }
1518
1519 if (match == CompatibleMatch && both_windows)
1520 return true; // The Windows environments (MSVC vs GNU) are compatible
1521
1522 return IsCompatibleEnvironment(lhs_triple_env, rhs_triple_env);
1523}
1524
1526 llvm::StringRef arch_name(m_triple.getArchName());
1527 const CoreDefinition *core_def = FindCoreDefinition(arch_name);
1528 if (core_def) {
1529 m_core = core_def->core;
1530 // Set the byte order to the default byte order for an architecture. This
1531 // can be modified if needed for cases when cores handle both big and
1532 // little endian
1533 m_byte_order = core_def->default_byte_order;
1534
1535 // amdgpu/r600 match their first table entry (GFX600/R600), so refine the
1536 // core from the model in the triple environment.
1539 m_triple.getEnvironmentName().split('-').second);
1540 } else if (m_core == eCore_amd_gpu_r600_R600) {
1542 m_triple.getEnvironmentName().split('-').second);
1543 }
1544 } else {
1545 Clear();
1546 }
1547}
1548
1549//===----------------------------------------------------------------------===//
1550// Helper methods.
1551
1552void ArchSpec::CoreUpdated(bool update_triple) {
1553 const CoreDefinition *core_def = FindCoreDefinition(m_core);
1554 if (core_def) {
1555 if (update_triple)
1556 m_triple = llvm::Triple(core_def->name, "unknown", "unknown");
1557 m_byte_order = core_def->default_byte_order;
1558 } else {
1559 if (update_triple)
1560 m_triple = llvm::Triple();
1562 }
1563}
1564
1565//===----------------------------------------------------------------------===//
1566// Operators.
1567
1568static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2,
1569 bool try_inverse, bool enforce_exact_match) {
1570 if (core1 == core2)
1571 return true;
1572
1573 switch (core1) {
1575 return true;
1576
1578 if (enforce_exact_match)
1579 break;
1580 [[fallthrough]];
1582 if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last)
1583 return true;
1584 if (core2 >= ArchSpec::kCore_thumb_first &&
1586 return true;
1587 if (core2 == ArchSpec::kCore_arm_any)
1588 return true;
1589 break;
1590
1592 if ((core2 >= ArchSpec::kCore_x86_32_first &&
1593 core2 <= ArchSpec::kCore_x86_32_last) ||
1594 (core2 == ArchSpec::kCore_x86_32_any))
1595 return true;
1596 break;
1597
1599 if ((core2 >= ArchSpec::kCore_x86_64_first &&
1600 core2 <= ArchSpec::kCore_x86_64_last) ||
1601 (core2 == ArchSpec::kCore_x86_64_any))
1602 return true;
1603 break;
1604
1606 if ((core2 >= ArchSpec::kCore_ppc_first &&
1607 core2 <= ArchSpec::kCore_ppc_last) ||
1608 (core2 == ArchSpec::kCore_ppc_any))
1609 return true;
1610 break;
1611
1613 if ((core2 >= ArchSpec::kCore_ppc64_first &&
1614 core2 <= ArchSpec::kCore_ppc64_last) ||
1615 (core2 == ArchSpec::kCore_ppc64_any))
1616 return true;
1617 break;
1618
1620 if ((core2 >= ArchSpec::kCore_hexagon_first &&
1621 core2 <= ArchSpec::kCore_hexagon_last) ||
1622 (core2 == ArchSpec::kCore_hexagon_any))
1623 return true;
1624 break;
1625
1626 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization
1627 // Cortex-M0 - ARMv6-M - armv6m
1628 // Cortex-M3 - ARMv7-M - armv7m
1629 // Cortex-M4 - ARMv7E-M - armv7em
1631 if (!enforce_exact_match) {
1632 if (core2 == ArchSpec::eCore_arm_generic)
1633 return true;
1634 if (core2 == ArchSpec::eCore_arm_armv7m)
1635 return true;
1636 if (core2 == ArchSpec::eCore_arm_armv6m)
1637 return true;
1638 if (core2 == ArchSpec::eCore_arm_armv7)
1639 return true;
1640 try_inverse = true;
1641 }
1642 break;
1643
1644 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization
1645 // Cortex-M0 - ARMv6-M - armv6m
1646 // Cortex-M3 - ARMv7-M - armv7m
1647 // Cortex-M4 - ARMv7E-M - armv7em
1649 if (!enforce_exact_match) {
1650 if (core2 == ArchSpec::eCore_arm_generic)
1651 return true;
1652 if (core2 == ArchSpec::eCore_arm_armv6m)
1653 return true;
1654 if (core2 == ArchSpec::eCore_arm_armv7)
1655 return true;
1656 if (core2 == ArchSpec::eCore_arm_armv7em)
1657 return true;
1658 try_inverse = true;
1659 }
1660 break;
1661
1662 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization
1663 // Cortex-M0 - ARMv6-M - armv6m
1664 // Cortex-M3 - ARMv7-M - armv7m
1665 // Cortex-M4 - ARMv7E-M - armv7em
1667 if (!enforce_exact_match) {
1668 if (core2 == ArchSpec::eCore_arm_generic)
1669 return true;
1670 if (core2 == ArchSpec::eCore_arm_armv7em)
1671 return true;
1672 if (core2 == ArchSpec::eCore_arm_armv7)
1673 return true;
1674 if (core2 == ArchSpec::eCore_arm_armv6m)
1675 return true;
1676 try_inverse = false;
1677 }
1678 break;
1679
1685 if (!enforce_exact_match) {
1686 if (core2 == ArchSpec::eCore_arm_generic)
1687 return true;
1688 if (core2 == ArchSpec::eCore_arm_armv7)
1689 return true;
1690 try_inverse = false;
1691 }
1692 break;
1693
1696 if (!enforce_exact_match) {
1697 try_inverse = false;
1698 if (core2 == ArchSpec::eCore_x86_64_x86_64)
1699 return true;
1700 }
1701 break;
1702
1704 if (!enforce_exact_match) {
1705 if (core2 == ArchSpec::eCore_arm_arm64)
1706 return true;
1707 if (core2 == ArchSpec::eCore_arm_aarch64)
1708 return true;
1709 if (core2 == ArchSpec::eCore_arm_arm64e)
1710 return true;
1711 try_inverse = false;
1712 }
1713 break;
1714
1716 if (!enforce_exact_match) {
1717 if (core2 == ArchSpec::eCore_arm_arm64)
1718 return true;
1719 if (core2 == ArchSpec::eCore_arm_aarch64)
1720 return true;
1721 if (core2 == ArchSpec::eCore_arm_armv8)
1722 return true;
1723 try_inverse = false;
1724 }
1725 break;
1727 if (!enforce_exact_match) {
1728 if (core2 == ArchSpec::eCore_arm_arm64)
1729 return true;
1730 if (core2 == ArchSpec::eCore_arm_armv8)
1731 return true;
1732 if (core2 == ArchSpec::eCore_arm_arm64e)
1733 return true;
1734 try_inverse = false;
1735 }
1736 break;
1737
1739 if (!enforce_exact_match) {
1740 if (core2 == ArchSpec::eCore_arm_aarch64)
1741 return true;
1742 if (core2 == ArchSpec::eCore_arm_armv8)
1743 return true;
1744 if (core2 == ArchSpec::eCore_arm_arm64e)
1745 return true;
1746 try_inverse = false;
1747 }
1748 break;
1749
1751 if (!enforce_exact_match) {
1752 if (core2 == ArchSpec::eCore_arm_generic)
1753 return true;
1754 try_inverse = false;
1755 }
1756 break;
1757
1759 if (!enforce_exact_match) {
1760 if (core2 >= ArchSpec::kCore_mips32_first &&
1762 return true;
1763 try_inverse = false;
1764 }
1765 break;
1766
1768 if (!enforce_exact_match) {
1769 if (core2 >= ArchSpec::kCore_mips32el_first &&
1771 return true;
1772 try_inverse = true;
1773 }
1774 break;
1775
1777 if (!enforce_exact_match) {
1778 if (core2 >= ArchSpec::kCore_mips32_first &&
1780 return true;
1781 if (core2 >= ArchSpec::kCore_mips64_first &&
1783 return true;
1784 try_inverse = false;
1785 }
1786 break;
1787
1789 if (!enforce_exact_match) {
1790 if (core2 >= ArchSpec::kCore_mips32el_first &&
1792 return true;
1793 if (core2 >= ArchSpec::kCore_mips64el_first &&
1795 return true;
1796 try_inverse = false;
1797 }
1798 break;
1799
1803 if (!enforce_exact_match) {
1804 if (core2 >= ArchSpec::kCore_mips32_first && core2 <= (core1 - 10))
1805 return true;
1806 if (core2 >= ArchSpec::kCore_mips64_first && core2 <= (core1 - 1))
1807 return true;
1808 try_inverse = false;
1809 }
1810 break;
1811
1815 if (!enforce_exact_match) {
1816 if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= (core1 - 10))
1817 return true;
1818 if (core2 >= ArchSpec::kCore_mips64el_first && core2 <= (core1 - 1))
1819 return true;
1820 try_inverse = false;
1821 }
1822 break;
1823
1827 if (!enforce_exact_match) {
1828 if (core2 >= ArchSpec::kCore_mips32_first && core2 <= core1)
1829 return true;
1830 }
1831 break;
1832
1836 if (!enforce_exact_match) {
1837 if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= core1)
1838 return true;
1839 }
1840 break;
1841
1843 if (!enforce_exact_match) {
1844 if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6)
1845 return true;
1846 }
1847 break;
1848
1850 if (!enforce_exact_match) {
1851 if (core2 == ArchSpec::eCore_mips32el ||
1853 return true;
1854 }
1855 break;
1856
1858 if (!enforce_exact_match) {
1859 if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6)
1860 return true;
1861 if (core2 == ArchSpec::eCore_mips64 || core2 == ArchSpec::eCore_mips64r6)
1862 return true;
1863 }
1864 break;
1865
1867 if (!enforce_exact_match) {
1868 if (core2 == ArchSpec::eCore_mips32el ||
1870 return true;
1871 if (core2 == ArchSpec::eCore_mips64el ||
1873 return true;
1874 }
1875 break;
1876
1877 default:
1878 break;
1879 }
1880 if (try_inverse)
1881 return cores_match(core2, core1, false, enforce_exact_match);
1882 return false;
1883}
1884
1885bool lldb_private::operator<(const ArchSpec &lhs, const ArchSpec &rhs) {
1886 const ArchSpec::Core lhs_core = lhs.GetCore();
1887 const ArchSpec::Core rhs_core = rhs.GetCore();
1888 return lhs_core < rhs_core;
1889}
1890
1891bool lldb_private::operator==(const ArchSpec &lhs, const ArchSpec &rhs) {
1892 return lhs.GetCore() == rhs.GetCore();
1893}
1894
1895bool lldb_private::operator!=(const ArchSpec &lhs, const ArchSpec &rhs) {
1896 return !(lhs == rhs);
1897}
1898
1900 if (!TripleOSWasSpecified())
1901 return false;
1902
1904 return false;
1905
1906 const unsigned unspecified = 0;
1907 const llvm::Triple &triple = GetTriple();
1908 if (triple.isOSDarwin() && triple.getOSMajorVersion() == unspecified)
1909 return false;
1910
1911 return true;
1912}
1913
1915 if (GetTriple().getArch() == llvm::Triple::arm ||
1916 GetTriple().getArch() == llvm::Triple::thumb) {
1917 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M
1918 //
1919 // Cortex-M0 through Cortex-M7 are ARM processor cores which can only
1920 // execute thumb instructions. We map the cores to arch names like this:
1921 //
1922 // Cortex-M0, Cortex-M0+, Cortex-M1: armv6m Cortex-M3: armv7m Cortex-M4,
1923 // Cortex-M7: armv7em
1924
1931 return true;
1932 }
1933 // Windows on ARM is always thumb.
1934 if (GetTriple().isOSWindows())
1935 return true;
1936 }
1937 return false;
1938}
1939
1940void ArchSpec::DumpTriple(llvm::raw_ostream &s) const {
1941 const llvm::Triple &triple = GetTriple();
1942 llvm::StringRef arch_str = triple.getArchName();
1943 llvm::StringRef vendor_str = triple.getVendorName();
1944 llvm::StringRef os_str = triple.getOSName();
1945 llvm::StringRef environ_str = triple.getEnvironmentName();
1946
1947 s << llvm::formatv("{0}-{1}-{2}", arch_str.empty() ? "*" : arch_str,
1948 vendor_str.empty() ? "*" : vendor_str,
1949 os_str.empty() ? "*" : os_str);
1950
1951 if (!environ_str.empty())
1952 s << "-" << environ_str;
1953}
static uint32_t GetCPUType(const ArchDefinition *def, ArchSpec::Core core)
Definition ArchSpec.cpp:855
#define SUBTYPE_MASK
Definition ArchSpec.cpp:403
static const ArchDefinition g_elf_arch_def
Definition ArchSpec.cpp:608
static const CoreDefinition * FindCoreDefinition(llvm::StringRef name)
Definition ArchSpec.cpp:666
static const ArchDefinitionEntry * FindArchDefEntryIfCoreIsValid(const ArchDefinition *def, ArchSpec::Core core)
Definition ArchSpec.cpp:848
static const ArchDefinitionEntry * FindArchDefinitionEntry(const ArchDefinition *def, uint32_t cpu, uint32_t sub)
Definition ArchSpec.cpp:682
static uint32_t GetCPUSubType(const ArchDefinition *def, ArchSpec::Core core)
Definition ArchSpec.cpp:862
static const ArchDefinitionEntry g_macho_arch_entries[]
Definition ArchSpec.cpp:406
static const ArchDefinitionEntry g_xcoff_arch_entries[]
Definition ArchSpec.cpp:635
static const ArchDefinitionEntry g_coff_arch_entries[]
Definition ArchSpec.cpp:615
static const ArchDefinitionEntry g_elf_arch_entries[]
Definition ArchSpec.cpp:494
static const ArchDefinition * FindArchDefinition(ArchitectureType arch_type)
Definition ArchSpec.cpp:657
static llvm::StringRef GetAMDGPUVariantName(uint32_t sub)
static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_inverse, bool enforce_exact_match)
#define AMD_GPU_CORE_DEF_GCN(sub)
Definition ArchSpec.cpp:52
#define AMD_GPU_ARCH_DEF_GCN(sub)
Definition ArchSpec.cpp:485
#define CPU_ANY
Definition ArchSpec.cpp:396
static const ArchDefinition g_xcoff_arch_def
Definition ArchSpec.cpp:641
static ArchSpec::Core GetAMDGPUVariantToCoreR600(llvm::StringRef core_name)
static constexpr const CoreDefinition g_core_definitions[]
Definition ArchSpec.cpp:61
static const ArchDefinition * g_arch_definitions[]
Definition ArchSpec.cpp:650
#define AMD_GPU_CORE_DEF_R600(sub)
Definition ArchSpec.cpp:44
static const ArchDefinition g_coff_arch_def
Definition ArchSpec.cpp:627
static bool IsCompatibleEnvironment(llvm::Triple::EnvironmentType lhs, llvm::Triple::EnvironmentType rhs)
#define AMD_GPU_ARCH_DEF_R600(sub)
Definition ArchSpec.cpp:482
static const ArchDefinition g_macho_arch_def
Definition ArchSpec.cpp:478
static ArchSpec::Core GetAMDGPUVariantToCoreGCN(llvm::StringRef core_name)
#define LLDB_LOGF(log,...)
Definition Log.h:389
An architecture specification class.
Definition ArchSpec.h:32
static void ListSupportedArchNames(StringList &list)
Definition ArchSpec.cpp:386
bool IsFullySpecifiedTriple() const
bool IsNVPTX() const
If NVPTX architecture return true.
Definition ArchSpec.cpp:749
static void AutoComplete(CompletionRequest &request)
Definition ArchSpec.cpp:391
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
Definition ArchSpec.cpp:889
bool IsValid() const
Tests if this ArchSpec is valid.
Definition ArchSpec.h:452
void Clear()
Clears the object state.
Definition ArchSpec.cpp:730
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition ArchSpec.h:544
void SetFlags(uint32_t flags)
Definition ArchSpec.h:617
bool IsAlwaysThumbInstructions() const
Detect whether this architecture uses thumb code exclusively.
bool TripleEnvironmentWasSpecified() const
Definition ArchSpec.h:463
bool IsMatch(const ArchSpec &rhs, MatchType match) const
Compare this ArchSpec to another ArchSpec.
bool SetTriple(const llvm::Triple &triple)
Architecture triple setter.
Definition ArchSpec.cpp:947
llvm::Triple m_triple
Definition ArchSpec.h:632
lldb::ByteOrder GetDefaultEndian() const
Returns the default endianness of the architecture.
Definition ArchSpec.cpp:903
lldb::ByteOrder m_byte_order
Definition ArchSpec.h:634
uint32_t GetElfCPUSubType() const
Definition ArchSpec.cpp:877
~ArchSpec()
Destructor.
bool SetArchitecture(ArchitectureType arch_type, uint32_t cpu, uint32_t sub, uint32_t os=0)
Change the architecture object type, CPU type and OS type.
void MergeFrom(const ArchSpec &other)
Merges fields from another ArchSpec into this ArchSpec.
void DumpTriple(llvm::raw_ostream &s) const
uint32_t GetMachOCPUSubType() const
Definition ArchSpec.cpp:873
void CoreUpdated(bool update_triple)
bool IsMIPS() const
if MIPS architecture return true.
Definition ArchSpec.cpp:747
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
Definition ArchSpec.h:596
bool CharIsSignedByDefault() const
Returns true if 'char' is a signed type by default in the architecture false otherwise.
Definition ArchSpec.cpp:910
ArchSpec()
Default constructor.
uint32_t GetMachOCPUType() const
Definition ArchSpec.cpp:869
std::string GetTargetABI() const
Return a string representing target application ABI.
Definition ArchSpec.cpp:751
uint32_t GetMinimumOpcodeByteSize() const
uint32_t GetFlags() const
Definition ArchSpec.h:615
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
Definition ArchSpec.cpp:938
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
Definition ArchSpec.cpp:881
std::string GetClangTargetCPU() const
Returns a string representing current architecture as a target CPU for tools like compiler,...
Definition ArchSpec.cpp:787
uint32_t GetMaximumOpcodeByteSize() const
bool TripleVendorWasSpecified() const
Definition ArchSpec.h:457
Core GetCore() const
Definition ArchSpec.h:533
bool TripleOSWasSpecified() const
Definition ArchSpec.h:461
static bool ContainsOnlyArch(const llvm::Triple &normalized_triple)
Returns true if the OS, vendor and environment fields of the triple are unset.
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
Definition ArchSpec.cpp:740
"lldb/Utility/ArgCompletionRequest.h"
void TryCompleteCurrentArg(llvm::StringRef completion, llvm::StringRef description="")
Adds a possible completion string if the completion would complete the current argument.
void AppendString(const std::string &s)
#define LLDB_INVALID_CPUTYPE
#define UINT32_MAX
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:338
bool ParseMachCPUDashSubtypeTriple(llvm::StringRef triple_str, ArchSpec &arch)
Definition ArchSpec.cpp:953
bool operator!=(const Address &lhs, const Address &rhs)
Definition Address.cpp:1010
TableValidator< 0 > validator
bool operator==(const Address &lhs, const Address &rhs)
Definition Address.cpp:1004
bool operator<(const Address &lhs, const Address &rhs)
Definition Address.cpp:973
ByteOrder
Byte ordering definitions.
ArchSpec::Core core
Definition ArchSpec.cpp:372
ArchitectureType type
Definition ArchSpec.cpp:380
const ArchDefinitionEntry * entries
Definition ArchSpec.cpp:382
size_t num_entries
Definition ArchSpec.cpp:381
const char * name
Definition ArchSpec.cpp:383
llvm::Triple::ArchType machine
Definition ArchSpec.cpp:37
const char *const name
Definition ArchSpec.cpp:39