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_STRICT),
340 AMD_GPU_CORE_DEF_GCN(GFX1250),
341 AMD_GPU_CORE_DEF_GCN(GFX1251),
342 AMD_GPU_CORE_DEF_GCN(GFX1310),
343 AMD_GPU_CORE_DEF_GCN(GFX9_GENERIC),
344 AMD_GPU_CORE_DEF_GCN(GFX9_4_GENERIC),
345 AMD_GPU_CORE_DEF_GCN(GFX10_1_GENERIC),
346 AMD_GPU_CORE_DEF_GCN(GFX10_3_GENERIC),
347 AMD_GPU_CORE_DEF_GCN(GFX11_GENERIC),
348 AMD_GPU_CORE_DEF_GCN(GFX12_GENERIC),
349 AMD_GPU_CORE_DEF_GCN(GFX12_5_GENERIC),
350 AMD_GPU_CORE_DEF_GCN(GFX11_7_GENERIC),
351 AMD_GPU_CORE_DEF_GCN(GFX13_GENERIC),
352 {eByteOrderLittle, 8, 4, 16, llvm::Triple::amdgpu,
354};
355
356// Ensure that we have an entry in the g_core_definitions for each core. If you
357// comment out an entry above, you will need to comment out the corresponding
358// ArchSpec::Core enumeration.
359static_assert(sizeof(g_core_definitions) / sizeof(CoreDefinition) ==
361 "make sure we have one core definition for each core");
362
363template <int I> struct ArchSpecValidator : ArchSpecValidator<I + 1> {
364 static_assert(g_core_definitions[I].core == I,
365 "g_core_definitions order doesn't match Core enumeration");
366};
367
368template <> struct ArchSpecValidator<ArchSpec::kNumCores> {};
369
371
379
386
388 for (const auto &def : g_core_definitions)
389 list.AppendString(def.name);
390}
391
393 for (const auto &def : g_core_definitions)
394 request.TryCompleteCurrentArg(def.name);
395}
396
397#define CPU_ANY (UINT32_MAX)
398
399//===----------------------------------------------------------------------===//
400// A table that gets searched linearly for matches. This table is used to
401// convert cpu type and subtypes to architecture names, and to convert
402// architecture names to cpu types and subtypes. The ordering is important and
403// allows the precedence to be set when the table is built.
404#define SUBTYPE_MASK 0x00FFFFFFu
405
406// clang-format off
408 {ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, CPU_ANY, UINT32_MAX, UINT32_MAX},
409 {ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK},
410 {ArchSpec::eCore_arm_armv4, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},
411 {ArchSpec::eCore_arm_armv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},
412 {ArchSpec::eCore_arm_armv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK},
413 {ArchSpec::eCore_arm_armv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK},
414 {ArchSpec::eCore_arm_armv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},
415 {ArchSpec::eCore_arm_armv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},
416 {ArchSpec::eCore_arm_armv5t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},
417 {ArchSpec::eCore_arm_xscale, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_XSCALE, UINT32_MAX, SUBTYPE_MASK},
418 {ArchSpec::eCore_arm_armv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK},
419 {ArchSpec::eCore_arm_armv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK},
420 {ArchSpec::eCore_arm_armv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK},
421 {ArchSpec::eCore_arm_armv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},
422 {ArchSpec::eCore_arm_armv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},
423 {ArchSpec::eCore_arm_armv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},
424 {ArchSpec::eCore_arm_armv8m_base, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_BASE, UINT32_MAX, SUBTYPE_MASK},
425 {ArchSpec::eCore_arm_armv8m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_MAIN, UINT32_MAX, SUBTYPE_MASK},
426 {ArchSpec::eCore_arm_armv8_1m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN, UINT32_MAX, SUBTYPE_MASK},
427 {ArchSpec::eCore_arm_arm64e, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64E, UINT32_MAX, SUBTYPE_MASK},
428 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_ALL, UINT32_MAX, SUBTYPE_MASK},
429 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_V8, UINT32_MAX, SUBTYPE_MASK},
430 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, 13, UINT32_MAX, SUBTYPE_MASK},
431 {ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 0, UINT32_MAX, SUBTYPE_MASK},
432 {ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 1, UINT32_MAX, SUBTYPE_MASK},
433 {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},
434 {ArchSpec::eCore_thumb, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK},
435 {ArchSpec::eCore_thumbv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},
436 {ArchSpec::eCore_thumbv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK},
437 {ArchSpec::eCore_thumbv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK},
438 {ArchSpec::eCore_thumbv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK},
439 {ArchSpec::eCore_thumbv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK},
440 {ArchSpec::eCore_thumbv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK},
441 {ArchSpec::eCore_thumbv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK},
442 {ArchSpec::eCore_thumbv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK},
443 {ArchSpec::eCore_thumbv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},
444 {ArchSpec::eCore_thumbv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},
445 {ArchSpec::eCore_thumbv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},
446 {ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, CPU_ANY, UINT32_MAX, UINT32_MAX},
447 {ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK},
448 {ArchSpec::eCore_ppc_ppc601, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_601, UINT32_MAX, SUBTYPE_MASK},
449 {ArchSpec::eCore_ppc_ppc602, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_602, UINT32_MAX, SUBTYPE_MASK},
450 {ArchSpec::eCore_ppc_ppc603, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603, UINT32_MAX, SUBTYPE_MASK},
451 {ArchSpec::eCore_ppc_ppc603e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603e, UINT32_MAX, SUBTYPE_MASK},
452 {ArchSpec::eCore_ppc_ppc603ev, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603ev, UINT32_MAX, SUBTYPE_MASK},
453 {ArchSpec::eCore_ppc_ppc604, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604, UINT32_MAX, SUBTYPE_MASK},
454 {ArchSpec::eCore_ppc_ppc604e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604e, UINT32_MAX, SUBTYPE_MASK},
455 {ArchSpec::eCore_ppc_ppc620, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_620, UINT32_MAX, SUBTYPE_MASK},
456 {ArchSpec::eCore_ppc_ppc750, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_750, UINT32_MAX, SUBTYPE_MASK},
457 {ArchSpec::eCore_ppc_ppc7400, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7400, UINT32_MAX, SUBTYPE_MASK},
458 {ArchSpec::eCore_ppc_ppc7450, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7450, UINT32_MAX, SUBTYPE_MASK},
459 {ArchSpec::eCore_ppc_ppc970, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_970, UINT32_MAX, SUBTYPE_MASK},
460 {ArchSpec::eCore_ppc64_generic, llvm::MachO::CPU_TYPE_POWERPC64, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK},
461 {ArchSpec::eCore_ppc64le_generic, llvm::MachO::CPU_TYPE_POWERPC64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},
462 {ArchSpec::eCore_ppc64_ppc970_64, llvm::MachO::CPU_TYPE_POWERPC64, 100, UINT32_MAX, SUBTYPE_MASK},
463 {ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_I386_ALL, UINT32_MAX, SUBTYPE_MASK},
464 {ArchSpec::eCore_x86_32_i486, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486, UINT32_MAX, SUBTYPE_MASK},
465 {ArchSpec::eCore_x86_32_i486sx, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486SX, UINT32_MAX, SUBTYPE_MASK},
466 {ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, CPU_ANY, UINT32_MAX, UINT32_MAX},
467 {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_ALL, UINT32_MAX, SUBTYPE_MASK},
468 {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_ARCH1, UINT32_MAX, SUBTYPE_MASK},
469 {ArchSpec::eCore_x86_64_x86_64h, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_H, UINT32_MAX, SUBTYPE_MASK},
470 {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, CPU_ANY, UINT32_MAX, UINT32_MAX},
471 {ArchSpec::eCore_riscv32, llvm::MachO::CPU_TYPE_RISCV, llvm::MachO::CPU_SUBTYPE_RISCV_ALL, UINT32_MAX, SUBTYPE_MASK},
472 {ArchSpec::eCore_riscv32, llvm::MachO::CPU_TYPE_RISCV, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},
473 // Catch any unknown mach architectures so we can always use the object and symbol mach-o files
474 {ArchSpec::eCore_uknownMach32, 0, 0, 0xFF000000u, 0x00000000u},
475 {ArchSpec::eCore_uknownMach64, llvm::MachO::CPU_ARCH_ABI64, 0, 0xFF000000u, 0x00000000u}
476};
477// clang-format on
478
482
483#define AMD_GPU_ARCH_DEF_R600(sub) \
484 {ArchSpec::eCore_amd_gpu_r600_##sub, llvm::ELF::EM_AMDGPU, \
485 llvm::ELF::EF_AMDGPU_MACH_R600_##sub}
486#define AMD_GPU_ARCH_DEF_GCN(sub) \
487 {ArchSpec::eCore_amd_gpu_gcn_##sub, llvm::ELF::EM_AMDGPU, \
488 llvm::ELF::EF_AMDGPU_MACH_AMDGCN_##sub}
489//===----------------------------------------------------------------------===//
490// A table that gets searched linearly for matches. This table is used to
491// convert cpu type and subtypes to architecture names, and to convert
492// architecture names to cpu types and subtypes. The ordering is important and
493// allows the precedence to be set when the table is built.
494// clang-format off
496 {ArchSpec::eCore_sparc_generic, llvm::ELF::EM_SPARC }, // Sparc
497 {ArchSpec::eCore_x86_32_i386, llvm::ELF::EM_386 }, // Intel 80386
498 {ArchSpec::eCore_x86_32_i486, llvm::ELF::EM_IAMCU }, // Intel MCU // FIXME: is this correct?
499 {ArchSpec::eCore_ppc_generic, llvm::ELF::EM_PPC }, // PowerPC
500 {ArchSpec::eCore_ppc64le_generic, llvm::ELF::EM_PPC64, ArchSpec::eCore_ppc64le_generic}, // PowerPC64le
501 {ArchSpec::eCore_ppc64_generic, llvm::ELF::EM_PPC64, ArchSpec::eCore_ppc64_generic}, // PowerPC64
502 {ArchSpec::eCore_arm_generic, llvm::ELF::EM_ARM }, // ARM
503 {ArchSpec::eCore_arm_aarch64, llvm::ELF::EM_AARCH64 }, // ARM64
504 {ArchSpec::eCore_s390x_generic, llvm::ELF::EM_S390 }, // SystemZ
505 {ArchSpec::eCore_sparc9_generic, llvm::ELF::EM_SPARCV9 }, // SPARC V9
506 {ArchSpec::eCore_x86_64_x86_64, llvm::ELF::EM_X86_64 }, // AMD64
507 {ArchSpec::eCore_mips32, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32}, // mips32
508 {ArchSpec::eCore_mips32r2, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r2}, // mips32r2
509 {ArchSpec::eCore_mips32r6, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r6}, // mips32r6
510 {ArchSpec::eCore_mips32el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32el}, // mips32el
511 {ArchSpec::eCore_mips32r2el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r2el}, // mips32r2el
512 {ArchSpec::eCore_mips32r6el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r6el}, // mips32r6el
514 {ArchSpec::eCore_mips64r2, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r2}, // mips64r2
515 {ArchSpec::eCore_mips64r6, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r6}, // mips64r6
516 {ArchSpec::eCore_mips64el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64el}, // mips64el
517 {ArchSpec::eCore_mips64r2el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r2el}, // mips64r2el
518 {ArchSpec::eCore_mips64r6el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r6el}, // mips64r6el
519 {ArchSpec::eCore_msp430, llvm::ELF::EM_MSP430 }, // MSP430
520 {ArchSpec::eCore_hexagon_generic, llvm::ELF::EM_HEXAGON }, // HEXAGON
521 {ArchSpec::eCore_arc, llvm::ELF::EM_ARC_COMPACT2}, // ARC
522 {ArchSpec::eCore_avr, llvm::ELF::EM_AVR }, // AVR
523 {ArchSpec::eCore_riscv32, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv32}, // riscv32
524 {ArchSpec::eCore_riscv64, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv64}, // riscv64
525 {ArchSpec::eCore_loongarch32, llvm::ELF::EM_LOONGARCH, ArchSpec::eLoongArchSubType_loongarch32}, // loongarch32
526 {ArchSpec::eCore_loongarch64, llvm::ELF::EM_LOONGARCH, ArchSpec::eLoongArchSubType_loongarch64}, // loongarch64
535 AMD_GPU_ARCH_DEF_R600(CYPRESS),
536 AMD_GPU_ARCH_DEF_R600(JUNIPER),
537 AMD_GPU_ARCH_DEF_R600(REDWOOD),
540 AMD_GPU_ARCH_DEF_R600(CAICOS),
541 AMD_GPU_ARCH_DEF_R600(CAYMAN),
543 AMD_GPU_ARCH_DEF_GCN(GFX600),
544 AMD_GPU_ARCH_DEF_GCN(GFX601),
545 AMD_GPU_ARCH_DEF_GCN(GFX602),
546 AMD_GPU_ARCH_DEF_GCN(GFX700),
547 AMD_GPU_ARCH_DEF_GCN(GFX701),
548 AMD_GPU_ARCH_DEF_GCN(GFX702),
549 AMD_GPU_ARCH_DEF_GCN(GFX703),
550 AMD_GPU_ARCH_DEF_GCN(GFX704),
551 AMD_GPU_ARCH_DEF_GCN(GFX705),
552 AMD_GPU_ARCH_DEF_GCN(GFX801),
553 AMD_GPU_ARCH_DEF_GCN(GFX802),
554 AMD_GPU_ARCH_DEF_GCN(GFX803),
555 AMD_GPU_ARCH_DEF_GCN(GFX805),
556 AMD_GPU_ARCH_DEF_GCN(GFX810),
557 AMD_GPU_ARCH_DEF_GCN(GFX900),
558 AMD_GPU_ARCH_DEF_GCN(GFX902),
559 AMD_GPU_ARCH_DEF_GCN(GFX904),
560 AMD_GPU_ARCH_DEF_GCN(GFX906),
561 AMD_GPU_ARCH_DEF_GCN(GFX908),
562 AMD_GPU_ARCH_DEF_GCN(GFX909),
563 AMD_GPU_ARCH_DEF_GCN(GFX90A),
564 AMD_GPU_ARCH_DEF_GCN(GFX90C),
565 AMD_GPU_ARCH_DEF_GCN(GFX942),
566 AMD_GPU_ARCH_DEF_GCN(GFX950),
567 AMD_GPU_ARCH_DEF_GCN(GFX1010),
568 AMD_GPU_ARCH_DEF_GCN(GFX1011),
569 AMD_GPU_ARCH_DEF_GCN(GFX1012),
570 AMD_GPU_ARCH_DEF_GCN(GFX1013),
571 AMD_GPU_ARCH_DEF_GCN(GFX1030),
572 AMD_GPU_ARCH_DEF_GCN(GFX1031),
573 AMD_GPU_ARCH_DEF_GCN(GFX1032),
574 AMD_GPU_ARCH_DEF_GCN(GFX1033),
575 AMD_GPU_ARCH_DEF_GCN(GFX1034),
576 AMD_GPU_ARCH_DEF_GCN(GFX1035),
577 AMD_GPU_ARCH_DEF_GCN(GFX1036),
578 AMD_GPU_ARCH_DEF_GCN(GFX1100),
579 AMD_GPU_ARCH_DEF_GCN(GFX1101),
580 AMD_GPU_ARCH_DEF_GCN(GFX1102),
581 AMD_GPU_ARCH_DEF_GCN(GFX1103),
582 AMD_GPU_ARCH_DEF_GCN(GFX1150),
583 AMD_GPU_ARCH_DEF_GCN(GFX1151),
584 AMD_GPU_ARCH_DEF_GCN(GFX1152),
585 AMD_GPU_ARCH_DEF_GCN(GFX1153),
586 AMD_GPU_ARCH_DEF_GCN(GFX1154),
587 AMD_GPU_ARCH_DEF_GCN(GFX1170),
588 AMD_GPU_ARCH_DEF_GCN(GFX1171),
589 AMD_GPU_ARCH_DEF_GCN(GFX1172),
590 AMD_GPU_ARCH_DEF_GCN(GFX1200),
591 AMD_GPU_ARCH_DEF_GCN(GFX1201),
592 AMD_GPU_ARCH_DEF_GCN(GFX1250_STRICT),
593 AMD_GPU_ARCH_DEF_GCN(GFX1250),
594 AMD_GPU_ARCH_DEF_GCN(GFX1251),
595 AMD_GPU_ARCH_DEF_GCN(GFX1310),
596 AMD_GPU_ARCH_DEF_GCN(GFX9_GENERIC),
597 AMD_GPU_ARCH_DEF_GCN(GFX9_4_GENERIC),
598 AMD_GPU_ARCH_DEF_GCN(GFX10_1_GENERIC),
599 AMD_GPU_ARCH_DEF_GCN(GFX10_3_GENERIC),
600 AMD_GPU_ARCH_DEF_GCN(GFX11_GENERIC),
601 AMD_GPU_ARCH_DEF_GCN(GFX12_GENERIC),
602 AMD_GPU_ARCH_DEF_GCN(GFX12_5_GENERIC),
603 AMD_GPU_ARCH_DEF_GCN(GFX11_7_GENERIC),
604 AMD_GPU_ARCH_DEF_GCN(GFX13_GENERIC),
605 // Any AMDGPU object with no recognized model resolves here.
606 {ArchSpec::eCore_amd_gpu_unknown, llvm::ELF::EM_AMDGPU},
607};
608// clang-format on
609
612 std::size(g_elf_arch_entries),
614 "elf",
615};
616// clang-format off
618 {ArchSpec::eCore_x86_32_i386, llvm::COFF::IMAGE_FILE_MACHINE_I386}, // Intel 80x86
619 {ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPC}, // PowerPC
620 {ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP}, // PowerPC (with FPU)
621 {ArchSpec::eCore_arm_generic, llvm::COFF::IMAGE_FILE_MACHINE_ARM}, // ARM
622 {ArchSpec::eCore_arm_armv7, llvm::COFF::IMAGE_FILE_MACHINE_ARMNT}, // ARMv7
623 {ArchSpec::eCore_thumb, llvm::COFF::IMAGE_FILE_MACHINE_THUMB}, // ARMv7
624 {ArchSpec::eCore_x86_64_x86_64, llvm::COFF::IMAGE_FILE_MACHINE_AMD64}, // AMD64
625 {ArchSpec::eCore_arm_arm64, llvm::COFF::IMAGE_FILE_MACHINE_ARM64} // ARM64
626};
627// clang-format on
628
631 std::size(g_coff_arch_entries),
633 "pe-coff",
634};
635
636// clang-format off
638 {ArchSpec::eCore_ppc_generic, llvm::XCOFF::TCPU_PPC},
639 {ArchSpec::eCore_ppc64_generic, llvm::XCOFF::TCPU_PPC64}
640};
641// clang-format on
642
645 std::size(g_xcoff_arch_entries),
647 "xcoff",
648};
649
650//===----------------------------------------------------------------------===//
651// Table of all ArchDefinitions
654
655//===----------------------------------------------------------------------===//
656// Static helper functions.
657
658// Get the architecture definition for a given object type.
660 for (const ArchDefinition *def : g_arch_definitions) {
661 if (def->type == arch_type)
662 return def;
663 }
664 return nullptr;
665}
666
667// Get an architecture definition by name.
668static const CoreDefinition *FindCoreDefinition(llvm::StringRef name) {
669 for (const auto &def : g_core_definitions) {
670 if (name.equals_insensitive(def.name))
671 return &def;
672 }
673 return nullptr;
674}
675
677 if (core < std::size(g_core_definitions))
678 return &g_core_definitions[core];
679 return nullptr;
680}
681
682// Get a definition entry by cpu type and subtype.
683static const ArchDefinitionEntry *
684FindArchDefinitionEntry(const ArchDefinition *def, uint32_t cpu, uint32_t sub) {
685 if (def == nullptr)
686 return nullptr;
687
688 const ArchDefinitionEntry *entries = def->entries;
689 for (size_t i = 0; i < def->num_entries; ++i) {
690 if (entries[i].cpu == (cpu & entries[i].cpu_mask))
691 if (entries[i].sub == (sub & entries[i].sub_mask))
692 return &entries[i];
693 }
694 return nullptr;
695}
696
697static const ArchDefinitionEntry *
699 if (def == nullptr)
700 return nullptr;
701
702 const ArchDefinitionEntry *entries = def->entries;
703 for (size_t i = 0; i < def->num_entries; ++i) {
704 if (entries[i].core == core)
705 return &entries[i];
706 }
707 return nullptr;
708}
709
710static llvm::StringRef GetAMDGPUVariantName(uint32_t sub);
711
712//===----------------------------------------------------------------------===//
713// Constructors and destructors.
714
715ArchSpec::ArchSpec() = default;
716
717ArchSpec::ArchSpec(const char *triple_cstr) {
718 if (triple_cstr)
719 SetTriple(triple_cstr);
720}
721
722ArchSpec::ArchSpec(llvm::StringRef triple_str) { SetTriple(triple_str); }
723
724ArchSpec::ArchSpec(const llvm::Triple &triple) { SetTriple(triple); }
725
726ArchSpec::ArchSpec(ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) {
727 SetArchitecture(arch_type, cpu, subtype);
728}
729
730ArchSpec::~ArchSpec() = default;
731
733 m_triple = llvm::Triple();
736 m_flags = 0;
737}
738
739//===----------------------------------------------------------------------===//
740// Predicates.
741
742const char *ArchSpec::GetArchitectureName() const {
743 const CoreDefinition *core_def = FindCoreDefinition(m_core);
744 if (core_def)
745 return core_def->name;
746 return "unknown";
747}
748
749bool ArchSpec::IsMIPS() const { return GetTriple().isMIPS(); }
750
751bool ArchSpec::IsNVPTX() const { return GetTriple().isNVPTX(); }
752
753std::string ArchSpec::GetTargetABI() const {
754
755 std::string abi;
756
757 if (IsMIPS()) {
758 switch (GetFlags() & ArchSpec::eMIPSABI_mask) {
760 abi = "n64";
761 return abi;
763 abi = "n32";
764 return abi;
766 abi = "o32";
767 return abi;
768 default:
769 return abi;
770 }
771 }
772 return abi;
773}
774
775void ArchSpec::SetFlags(const std::string &elf_abi) {
776
777 uint32_t flag = GetFlags();
778 if (IsMIPS()) {
779 if (elf_abi == "n64")
781 else if (elf_abi == "n32")
783 else if (elf_abi == "o32")
785 }
786 SetFlags(flag);
787}
788
789std::string ArchSpec::GetClangTargetCPU() const {
790 std::string cpu;
791 if (IsMIPS()) {
792 switch (m_core) {
795 cpu = "mips32";
796 break;
799 cpu = "mips32r2";
800 break;
803 cpu = "mips32r3";
804 break;
807 cpu = "mips32r5";
808 break;
811 cpu = "mips32r6";
812 break;
815 cpu = "mips64";
816 break;
819 cpu = "mips64r2";
820 break;
823 cpu = "mips64r3";
824 break;
827 cpu = "mips64r5";
828 break;
831 cpu = "mips64r6";
832 break;
833 default:
834 break;
835 }
836 }
837
838 if (GetTriple().isARM())
839 cpu = llvm::ARM::getARMCPUForArch(GetTriple(), "").str();
840
841 if (GetTriple().isAMDGPU()) {
842 uint32_t sub = GetElfCPUSubType();
843 if (sub != LLDB_INVALID_CPUTYPE)
844 cpu = GetAMDGPUVariantName(sub);
845 }
846 return cpu;
847}
848
849static const ArchDefinitionEntry *
851 if (const CoreDefinition *core_def = FindCoreDefinition(core))
852 return FindArchDefinitionEntry(def, core_def->core);
853
854 return nullptr;
855}
856
857static uint32_t GetCPUType(const ArchDefinition *def, ArchSpec::Core core) {
858 if (const ArchDefinitionEntry *arch_def =
860 return arch_def->cpu;
862}
863
864static uint32_t GetCPUSubType(const ArchDefinition *def, ArchSpec::Core core) {
865 if (const ArchDefinitionEntry *arch_def =
867 return arch_def->sub;
869}
870
873}
874
878
881}
882
883llvm::Triple::ArchType ArchSpec::GetMachine() const {
884 const CoreDefinition *core_def = FindCoreDefinition(m_core);
885 if (core_def)
886 return core_def->machine;
887
888 return llvm::Triple::UnknownArch;
889}
890
892 const CoreDefinition *core_def = FindCoreDefinition(m_core);
893 if (core_def) {
894 if (core_def->machine == llvm::Triple::mips64 ||
895 core_def->machine == llvm::Triple::mips64el) {
896 // For N32/O32 applications Address size is 4 bytes.
898 return 4;
899 }
900 return core_def->addr_byte_size;
901 }
902 return 0;
903}
904
906 const CoreDefinition *core_def = FindCoreDefinition(m_core);
907 if (core_def)
908 return core_def->default_byte_order;
909 return eByteOrderInvalid;
910}
911
913 switch (m_triple.getArch()) {
914 default:
915 return true;
916
917 case llvm::Triple::aarch64:
918 case llvm::Triple::aarch64_32:
919 case llvm::Triple::aarch64_be:
920 case llvm::Triple::arm:
921 case llvm::Triple::armeb:
922 case llvm::Triple::thumb:
923 case llvm::Triple::thumbeb:
924 return m_triple.isOSDarwin() || m_triple.isOSWindows();
925
926 case llvm::Triple::ppc:
927 case llvm::Triple::ppc64:
928 return m_triple.isOSDarwin();
929
930 case llvm::Triple::riscv64:
931 case llvm::Triple::riscv32:
932 case llvm::Triple::ppc64le:
933 case llvm::Triple::systemz:
934 case llvm::Triple::xcore:
935 case llvm::Triple::arc:
936 return false;
937 }
938}
939
945
946//===----------------------------------------------------------------------===//
947// Mutators.
948
949bool ArchSpec::SetTriple(const llvm::Triple &triple) {
950 m_triple = triple;
951 UpdateCore();
952 return IsValid();
953}
954
955bool lldb_private::ParseMachCPUDashSubtypeTriple(llvm::StringRef triple_str,
956 ArchSpec &arch) {
957 // Accept "12-10" or "12.10" as cpu type/subtype
958 if (triple_str.empty())
959 return false;
960
961 size_t pos = triple_str.find_first_of("-.");
962 if (pos == llvm::StringRef::npos)
963 return false;
964
965 llvm::StringRef cpu_str = triple_str.substr(0, pos);
966 llvm::StringRef remainder = triple_str.substr(pos + 1);
967 if (cpu_str.empty() || remainder.empty())
968 return false;
969
970 llvm::StringRef sub_str;
971 llvm::StringRef vendor;
972 llvm::StringRef os;
973 std::tie(sub_str, remainder) = remainder.split('-');
974 std::tie(vendor, os) = remainder.split('-');
975
976 uint32_t cpu = 0;
977 uint32_t sub = 0;
978 if (cpu_str.getAsInteger(10, cpu) || sub_str.getAsInteger(10, sub))
979 return false;
980
981 if (!arch.SetArchitecture(eArchTypeMachO, cpu, sub))
982 return false;
983 if (!vendor.empty() && !os.empty()) {
984 arch.GetTriple().setVendorName(vendor);
985 arch.GetTriple().setOSName(os);
986 }
987
988 return true;
989}
990
991bool ArchSpec::SetTriple(llvm::StringRef triple) {
992 if (triple.empty()) {
993 Clear();
994 return false;
995 }
996
997 if (ParseMachCPUDashSubtypeTriple(triple, *this))
998 return true;
999
1000 SetTriple(llvm::Triple(llvm::Triple::normalize(triple)));
1001 return IsValid();
1002}
1003
1004bool ArchSpec::ContainsOnlyArch(const llvm::Triple &normalized_triple) {
1005 return !normalized_triple.getArchName().empty() &&
1006 normalized_triple.getOSName().empty() &&
1007 normalized_triple.getVendorName().empty() &&
1008 normalized_triple.getEnvironmentName().empty();
1009}
1010
1011void ArchSpec::MergeFrom(const ArchSpec &other) {
1012 // ios-macabi always wins over macosx.
1013 if ((GetTriple().getOS() == llvm::Triple::MacOSX ||
1014 GetTriple().getOS() == llvm::Triple::UnknownOS) &&
1015 other.GetTriple().getOS() == llvm::Triple::IOS &&
1016 other.GetTriple().getEnvironment() == llvm::Triple::MacABI) {
1017 (*this) = other;
1018 return;
1019 }
1020
1022 GetTriple().setVendor(other.GetTriple().getVendor());
1024 GetTriple().setOS(other.GetTriple().getOS());
1025 if (GetTriple().getArch() == llvm::Triple::UnknownArch) {
1026 GetTriple().setArch(other.GetTriple().getArch());
1027
1028 // MachO unknown64 isn't really invalid as the debugger can still obtain
1029 // information from the binary, e.g. line tables. As such, we don't update
1030 // the core here.
1031 if (other.GetCore() != eCore_uknownMach64)
1032 UpdateCore();
1033 }
1036 GetTriple().setEnvironment(other.GetTriple().getEnvironment());
1037 }
1038 // If this and other are both arm ArchSpecs and this ArchSpec is a generic
1039 // "some kind of arm" spec but the other ArchSpec is a specific arm core,
1040 // adopt the specific arm core.
1041 if (GetTriple().getArch() == llvm::Triple::arm &&
1042 other.GetTriple().getArch() == llvm::Triple::arm &&
1045 m_core = other.GetCore();
1046 CoreUpdated(false);
1047 }
1048 if (GetFlags() == 0) {
1049 SetFlags(other.GetFlags());
1050 }
1051}
1052
1053static llvm::StringRef GetAMDGPUVariantName(uint32_t sub) {
1054 switch (sub) {
1055 case llvm::ELF::EF_AMDGPU_MACH_R600_R600:
1056 return "r600";
1057 case llvm::ELF::EF_AMDGPU_MACH_R600_R630:
1058 return "r630";
1059 case llvm::ELF::EF_AMDGPU_MACH_R600_RS880:
1060 return "rs880";
1061 case llvm::ELF::EF_AMDGPU_MACH_R600_RV670:
1062 return "rv670";
1063 case llvm::ELF::EF_AMDGPU_MACH_R600_RV710:
1064 return "rv710";
1065 case llvm::ELF::EF_AMDGPU_MACH_R600_RV730:
1066 return "rv730";
1067 case llvm::ELF::EF_AMDGPU_MACH_R600_RV770:
1068 return "rv770";
1069 case llvm::ELF::EF_AMDGPU_MACH_R600_CEDAR:
1070 return "cedar";
1071 case llvm::ELF::EF_AMDGPU_MACH_R600_CYPRESS:
1072 return "cypress";
1073 case llvm::ELF::EF_AMDGPU_MACH_R600_JUNIPER:
1074 return "juniper";
1075 case llvm::ELF::EF_AMDGPU_MACH_R600_REDWOOD:
1076 return "redwood";
1077 case llvm::ELF::EF_AMDGPU_MACH_R600_SUMO:
1078 return "sumo";
1079 case llvm::ELF::EF_AMDGPU_MACH_R600_BARTS:
1080 return "barts";
1081 case llvm::ELF::EF_AMDGPU_MACH_R600_CAICOS:
1082 return "caicos";
1083 case llvm::ELF::EF_AMDGPU_MACH_R600_CAYMAN:
1084 return "cayman";
1085 case llvm::ELF::EF_AMDGPU_MACH_R600_TURKS:
1086 return "turks";
1087 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX600:
1088 return "gfx600";
1089 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX601:
1090 return "gfx601";
1091 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX602:
1092 return "gfx602";
1093 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX700:
1094 return "gfx700";
1095 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX701:
1096 return "gfx701";
1097 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX702:
1098 return "gfx702";
1099 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX703:
1100 return "gfx703";
1101 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX704:
1102 return "gfx704";
1103 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX705:
1104 return "gfx705";
1105 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX801:
1106 return "gfx801";
1107 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX802:
1108 return "gfx802";
1109 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX803:
1110 return "gfx803";
1111 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX805:
1112 return "gfx805";
1113 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX810:
1114 return "gfx810";
1115 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX900:
1116 return "gfx900";
1117 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX902:
1118 return "gfx902";
1119 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX904:
1120 return "gfx904";
1121 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX906:
1122 return "gfx906";
1123 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX908:
1124 return "gfx908";
1125 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX909:
1126 return "gfx909";
1127 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A:
1128 return "gfx90a";
1129 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C:
1130 return "gfx90c";
1131 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX942:
1132 return "gfx942";
1133 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX950:
1134 return "gfx950";
1135 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010:
1136 return "gfx1010";
1137 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011:
1138 return "gfx1011";
1139 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012:
1140 return "gfx1012";
1141 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013:
1142 return "gfx1013";
1143 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030:
1144 return "gfx1030";
1145 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031:
1146 return "gfx1031";
1147 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032:
1148 return "gfx1032";
1149 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033:
1150 return "gfx1033";
1151 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034:
1152 return "gfx1034";
1153 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035:
1154 return "gfx1035";
1155 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036:
1156 return "gfx1036";
1157 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100:
1158 return "gfx1100";
1159 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101:
1160 return "gfx1101";
1161 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102:
1162 return "gfx1102";
1163 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103:
1164 return "gfx1103";
1165 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150:
1166 return "gfx1150";
1167 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151:
1168 return "gfx1151";
1169 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152:
1170 return "gfx1152";
1171 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153:
1172 return "gfx1153";
1173 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1154:
1174 return "gfx1154";
1175 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170:
1176 return "gfx1170";
1177 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171:
1178 return "gfx1171";
1179 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172:
1180 return "gfx1172";
1181 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200:
1182 return "gfx1200";
1183 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201:
1184 return "gfx1201";
1185 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250_STRICT:
1186 return "gfx1250-strict";
1187 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250:
1188 return "gfx1250";
1189 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251:
1190 return "gfx1251";
1191 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310:
1192 return "gfx1310";
1193 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC:
1194 return "gfx9-generic";
1195 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC:
1196 return "gfx9-4-generic";
1197 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC:
1198 return "gfx10-1-generic";
1199 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC:
1200 return "gfx10-3-generic";
1201 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC:
1202 return "gfx11-generic";
1203 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC:
1204 return "gfx12-generic";
1205 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC:
1206 return "gfx12-5-generic";
1207 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_7_GENERIC:
1208 return "gfx11-7-generic";
1209 case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX13_GENERIC:
1210 return "gfx13-generic";
1211 default:
1212 break;
1213 }
1214 return llvm::StringRef("unknown");
1215}
1216
1217static ArchSpec::Core GetAMDGPUVariantToCoreR600(llvm::StringRef core_name) {
1218 return llvm::StringSwitch<ArchSpec::Core>(core_name)
1227 .Case("cypress", ArchSpec::eCore_amd_gpu_r600_CYPRESS)
1228 .Case("juniper", ArchSpec::eCore_amd_gpu_r600_JUNIPER)
1229 .Case("redwood", ArchSpec::eCore_amd_gpu_r600_REDWOOD)
1236}
1237
1238static ArchSpec::Core GetAMDGPUVariantToCoreGCN(llvm::StringRef core_name) {
1239 return llvm::StringSwitch<ArchSpec::Core>(core_name)
1240 .Case("gfx600", ArchSpec::eCore_amd_gpu_gcn_GFX600)
1241 .Case("gfx601", ArchSpec::eCore_amd_gpu_gcn_GFX601)
1242 .Case("gfx602", ArchSpec::eCore_amd_gpu_gcn_GFX602)
1243 .Case("gfx700", ArchSpec::eCore_amd_gpu_gcn_GFX700)
1244 .Case("gfx701", ArchSpec::eCore_amd_gpu_gcn_GFX701)
1245 .Case("gfx702", ArchSpec::eCore_amd_gpu_gcn_GFX702)
1246 .Case("gfx703", ArchSpec::eCore_amd_gpu_gcn_GFX703)
1247 .Case("gfx704", ArchSpec::eCore_amd_gpu_gcn_GFX704)
1248 .Case("gfx705", ArchSpec::eCore_amd_gpu_gcn_GFX705)
1249 .Case("gfx801", ArchSpec::eCore_amd_gpu_gcn_GFX801)
1250 .Case("gfx802", ArchSpec::eCore_amd_gpu_gcn_GFX802)
1251 .Case("gfx803", ArchSpec::eCore_amd_gpu_gcn_GFX803)
1252 .Case("gfx805", ArchSpec::eCore_amd_gpu_gcn_GFX805)
1253 .Case("gfx810", ArchSpec::eCore_amd_gpu_gcn_GFX810)
1254 .Case("gfx900", ArchSpec::eCore_amd_gpu_gcn_GFX900)
1255 .Case("gfx902", ArchSpec::eCore_amd_gpu_gcn_GFX902)
1256 .Case("gfx904", ArchSpec::eCore_amd_gpu_gcn_GFX904)
1257 .Case("gfx906", ArchSpec::eCore_amd_gpu_gcn_GFX906)
1258 .Case("gfx908", ArchSpec::eCore_amd_gpu_gcn_GFX908)
1259 .Case("gfx909", ArchSpec::eCore_amd_gpu_gcn_GFX909)
1260 .Case("gfx90a", ArchSpec::eCore_amd_gpu_gcn_GFX90A)
1261 .Case("gfx90c", ArchSpec::eCore_amd_gpu_gcn_GFX90C)
1262 .Case("gfx942", ArchSpec::eCore_amd_gpu_gcn_GFX942)
1263 .Case("gfx950", ArchSpec::eCore_amd_gpu_gcn_GFX950)
1264 .Case("gfx1010", ArchSpec::eCore_amd_gpu_gcn_GFX1010)
1265 .Case("gfx1011", ArchSpec::eCore_amd_gpu_gcn_GFX1011)
1266 .Case("gfx1012", ArchSpec::eCore_amd_gpu_gcn_GFX1012)
1267 .Case("gfx1013", ArchSpec::eCore_amd_gpu_gcn_GFX1013)
1268 .Case("gfx1030", ArchSpec::eCore_amd_gpu_gcn_GFX1030)
1269 .Case("gfx1031", ArchSpec::eCore_amd_gpu_gcn_GFX1031)
1270 .Case("gfx1032", ArchSpec::eCore_amd_gpu_gcn_GFX1032)
1271 .Case("gfx1033", ArchSpec::eCore_amd_gpu_gcn_GFX1033)
1272 .Case("gfx1034", ArchSpec::eCore_amd_gpu_gcn_GFX1034)
1273 .Case("gfx1035", ArchSpec::eCore_amd_gpu_gcn_GFX1035)
1274 .Case("gfx1036", ArchSpec::eCore_amd_gpu_gcn_GFX1036)
1275 .Case("gfx1100", ArchSpec::eCore_amd_gpu_gcn_GFX1100)
1276 .Case("gfx1101", ArchSpec::eCore_amd_gpu_gcn_GFX1101)
1277 .Case("gfx1102", ArchSpec::eCore_amd_gpu_gcn_GFX1102)
1278 .Case("gfx1103", ArchSpec::eCore_amd_gpu_gcn_GFX1103)
1279 .Case("gfx1150", ArchSpec::eCore_amd_gpu_gcn_GFX1150)
1280 .Case("gfx1151", ArchSpec::eCore_amd_gpu_gcn_GFX1151)
1281 .Case("gfx1152", ArchSpec::eCore_amd_gpu_gcn_GFX1152)
1282 .Case("gfx1153", ArchSpec::eCore_amd_gpu_gcn_GFX1153)
1283 .Case("gfx1154", ArchSpec::eCore_amd_gpu_gcn_GFX1154)
1284 .Case("gfx1170", ArchSpec::eCore_amd_gpu_gcn_GFX1170)
1285 .Case("gfx1171", ArchSpec::eCore_amd_gpu_gcn_GFX1171)
1286 .Case("gfx1172", ArchSpec::eCore_amd_gpu_gcn_GFX1172)
1287 .Case("gfx1200", ArchSpec::eCore_amd_gpu_gcn_GFX1200)
1288 .Case("gfx1201", ArchSpec::eCore_amd_gpu_gcn_GFX1201)
1289 .Case("gfx1250-strict", ArchSpec::eCore_amd_gpu_gcn_GFX1250_STRICT)
1290 .Case("gfx1250", ArchSpec::eCore_amd_gpu_gcn_GFX1250)
1291 .Case("gfx1251", ArchSpec::eCore_amd_gpu_gcn_GFX1251)
1292 .Case("gfx1310", ArchSpec::eCore_amd_gpu_gcn_GFX1310)
1293 .Case("gfx9-generic", ArchSpec::eCore_amd_gpu_gcn_GFX9_GENERIC)
1294 .Case("gfx9-4-generic", ArchSpec::eCore_amd_gpu_gcn_GFX9_4_GENERIC)
1295 .Case("gfx10-1-generic", ArchSpec::eCore_amd_gpu_gcn_GFX10_1_GENERIC)
1296 .Case("gfx10-3-generic", ArchSpec::eCore_amd_gpu_gcn_GFX10_3_GENERIC)
1297 .Case("gfx11-generic", ArchSpec::eCore_amd_gpu_gcn_GFX11_GENERIC)
1298 .Case("gfx12-generic", ArchSpec::eCore_amd_gpu_gcn_GFX12_GENERIC)
1299 .Case("gfx12-5-generic", ArchSpec::eCore_amd_gpu_gcn_GFX12_5_GENERIC)
1300 .Case("gfx11-7-generic", ArchSpec::eCore_amd_gpu_gcn_GFX11_7_GENERIC)
1301 .Case("gfx13-generic", ArchSpec::eCore_amd_gpu_gcn_GFX13_GENERIC)
1303}
1304
1305bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu,
1306 uint32_t sub, uint32_t os) {
1308 bool update_triple = true;
1309 const ArchDefinition *arch_def = FindArchDefinition(arch_type);
1310 if (arch_def) {
1311 const ArchDefinitionEntry *arch_def_entry =
1312 FindArchDefinitionEntry(arch_def, cpu, sub);
1313 if (arch_def_entry) {
1314 const CoreDefinition *core_def = FindCoreDefinition(arch_def_entry->core);
1315 if (core_def) {
1316 m_core = core_def->core;
1317 update_triple = false;
1318 // Always use the architecture name because it might be more
1319 // descriptive than the architecture enum ("armv7" ->
1320 // llvm::Triple::arm).
1321 m_triple.setArchName(llvm::StringRef(core_def->name));
1322 if (arch_type == eArchTypeMachO) {
1323 m_triple.setVendor(llvm::Triple::Apple);
1324
1325 // Don't set the OS. It could be simulator, macosx, ios, watchos,
1326 // tvos, bridgeos. We could get close with the cpu type - but we
1327 // can't get it right all of the time. Better to leave this unset
1328 // so other sections of code will set it when they have more
1329 // information. NB: don't call m_triple.setOS
1330 // (llvm::Triple::UnknownOS). That sets the OSName to "unknown" and
1331 // the ArchSpec::TripleVendorWasSpecified() method says that any
1332 // OSName setting means it was specified.
1333 } else if (arch_type == eArchTypeELF) {
1334 switch (os) {
1335 case llvm::ELF::ELFOSABI_AIX:
1336 m_triple.setOS(llvm::Triple::OSType::AIX);
1337 break;
1338 case llvm::ELF::ELFOSABI_FREEBSD:
1339 m_triple.setOS(llvm::Triple::OSType::FreeBSD);
1340 break;
1341 case llvm::ELF::ELFOSABI_GNU:
1342 m_triple.setOS(llvm::Triple::OSType::Linux);
1343 break;
1344 case llvm::ELF::ELFOSABI_NETBSD:
1345 m_triple.setOS(llvm::Triple::OSType::NetBSD);
1346 break;
1347 case llvm::ELF::ELFOSABI_OPENBSD:
1348 m_triple.setOS(llvm::Triple::OSType::OpenBSD);
1349 break;
1350 case llvm::ELF::ELFOSABI_SOLARIS:
1351 m_triple.setOS(llvm::Triple::OSType::Solaris);
1352 break;
1353 case llvm::ELF::ELFOSABI_STANDALONE:
1354 m_triple.setOS(llvm::Triple::OSType::UnknownOS);
1355 break;
1356 case llvm::ELF::ELFOSABI_AMDGPU_HSA:
1357 m_triple.setVendor(llvm::Triple::VendorType::AMD);
1358 m_triple.setOS(llvm::Triple::OSType::AMDHSA);
1359 break;
1360 }
1361 } else if (arch_type == eArchTypeCOFF && os == llvm::Triple::Win32) {
1362 m_triple.setVendor(llvm::Triple::PC);
1363 m_triple.setOS(llvm::Triple::Win32);
1364 } else if (arch_type == eArchTypeXCOFF && os == llvm::Triple::AIX) {
1365 m_triple.setVendor(llvm::Triple::IBM);
1366 m_triple.setOS(llvm::Triple::AIX);
1367 } else {
1368 m_triple.setVendor(llvm::Triple::UnknownVendor);
1369 m_triple.setOS(llvm::Triple::UnknownOS);
1370 }
1371 switch (m_triple.getArch()) {
1372 case llvm::Triple::UnknownArch:
1373 // Fall back onto setting the machine type if the arch by name
1374 // failed...
1375 m_triple.setArch(core_def->machine);
1376 break;
1377 case llvm::Triple::r600:
1378 case llvm::Triple::amdgpu: {
1379 // AMDGPU arches are special: they append a 5th element to the triple
1380 // that comes after the environment and contains the sub type name.
1381 std::string environment("-");
1382 environment += GetAMDGPUVariantName(arch_def_entry->sub);
1383 m_triple.setEnvironmentName(environment);
1384 break;
1385 }
1386 default:
1387 break;
1388 }
1389 }
1390 } else {
1392 LLDB_LOGF(log,
1393 "Unable to find a core definition for cpu 0x%" PRIx32
1394 " sub %" PRId32,
1395 cpu, sub);
1396 }
1397 }
1398 CoreUpdated(update_triple);
1399 return IsValid();
1400}
1401
1403 const CoreDefinition *core_def = FindCoreDefinition(m_core);
1404 if (core_def)
1405 return core_def->min_opcode_byte_size;
1406 return 0;
1407}
1408
1410 const CoreDefinition *core_def = FindCoreDefinition(m_core);
1411 if (core_def)
1412 return core_def->max_opcode_byte_size;
1413 return 0;
1414}
1415
1416static bool IsCompatibleEnvironment(llvm::Triple::EnvironmentType lhs,
1417 llvm::Triple::EnvironmentType rhs) {
1418 if (lhs == rhs)
1419 return true;
1420
1421 // Apple simulators are a different platform than what they simulate.
1422 // As the environments are different at this point, if one of them is a
1423 // simulator, then they are different.
1424 if (lhs == llvm::Triple::Simulator || rhs == llvm::Triple::Simulator)
1425 return false;
1426
1427 // If any of the environment is unknown then they are compatible
1428 if (lhs == llvm::Triple::UnknownEnvironment ||
1429 rhs == llvm::Triple::UnknownEnvironment)
1430 return true;
1431
1432 // If one of the environment is Android and the other one is EABI then they
1433 // are considered to be compatible. This is required as a workaround for
1434 // shared libraries compiled for Android without the NOTE section indicating
1435 // that they are using the Android ABI.
1436 if ((lhs == llvm::Triple::Android && rhs == llvm::Triple::EABI) ||
1437 (rhs == llvm::Triple::Android && lhs == llvm::Triple::EABI) ||
1438 (lhs == llvm::Triple::GNUEABI && rhs == llvm::Triple::EABI) ||
1439 (rhs == llvm::Triple::GNUEABI && lhs == llvm::Triple::EABI) ||
1440 (lhs == llvm::Triple::GNUEABIHF && rhs == llvm::Triple::EABIHF) ||
1441 (rhs == llvm::Triple::GNUEABIHF && lhs == llvm::Triple::EABIHF))
1442 return true;
1443
1444 return false;
1445}
1446
1447bool ArchSpec::IsMatch(const ArchSpec &rhs, MatchType match) const {
1448 if (GetByteOrder() != rhs.GetByteOrder() ||
1449 !cores_match(GetCore(), rhs.GetCore(), true, match == ExactMatch))
1450 return false;
1451
1452 const llvm::Triple &lhs_triple = GetTriple();
1453 const llvm::Triple &rhs_triple = rhs.GetTriple();
1454
1455 const llvm::Triple::VendorType lhs_triple_vendor = lhs_triple.getVendor();
1456 const llvm::Triple::VendorType rhs_triple_vendor = rhs_triple.getVendor();
1457
1458 const llvm::Triple::OSType lhs_triple_os = lhs_triple.getOS();
1459 const llvm::Triple::OSType rhs_triple_os = rhs_triple.getOS();
1460
1461 bool both_windows = lhs_triple.isOSWindows() && rhs_triple.isOSWindows();
1462
1463 // On Windows, the vendor field doesn't have any practical effect, but
1464 // it is often set to either "pc" or "w64".
1465 if ((lhs_triple_vendor != rhs_triple_vendor) &&
1466 (match == ExactMatch || !both_windows)) {
1467 const bool rhs_vendor_specified = rhs.TripleVendorWasSpecified();
1468 const bool lhs_vendor_specified = TripleVendorWasSpecified();
1469 // Both architectures had the vendor specified, so if they aren't equal
1470 // then we return false
1471 if (rhs_vendor_specified && lhs_vendor_specified)
1472 return false;
1473
1474 // Only fail if both vendor types are not unknown
1475 if (lhs_triple_vendor != llvm::Triple::UnknownVendor &&
1476 rhs_triple_vendor != llvm::Triple::UnknownVendor)
1477 return false;
1478 }
1479
1480 const llvm::Triple::EnvironmentType lhs_triple_env =
1481 lhs_triple.getEnvironment();
1482 const llvm::Triple::EnvironmentType rhs_triple_env =
1483 rhs_triple.getEnvironment();
1484
1485 if (match == CompatibleMatch) {
1486 // x86_64-apple-ios-macabi, x86_64-apple-macosx are compatible, no match.
1487 if ((lhs_triple_os == llvm::Triple::IOS &&
1488 lhs_triple_env == llvm::Triple::MacABI &&
1489 rhs_triple_os == llvm::Triple::MacOSX) ||
1490 (lhs_triple_os == llvm::Triple::MacOSX &&
1491 rhs_triple_os == llvm::Triple::IOS &&
1492 rhs_triple_env == llvm::Triple::MacABI))
1493 return true;
1494 // x86_64-apple-driverkit, x86_64-apple-macosx are compatible, no match.
1495 if ((lhs_triple_os == llvm::Triple::DriverKit &&
1496 rhs_triple_os == llvm::Triple::MacOSX) ||
1497 (lhs_triple_os == llvm::Triple::MacOSX &&
1498 rhs_triple_os == llvm::Triple::DriverKit))
1499 return true;
1500 }
1501
1502 // x86_64-apple-ios-macabi and x86_64-apple-ios are not compatible.
1503 if (lhs_triple_os == llvm::Triple::IOS &&
1504 rhs_triple_os == llvm::Triple::IOS &&
1505 (lhs_triple_env == llvm::Triple::MacABI ||
1506 rhs_triple_env == llvm::Triple::MacABI) &&
1507 lhs_triple_env != rhs_triple_env)
1508 return false;
1509
1510 if (lhs_triple_os != rhs_triple_os) {
1511 const bool lhs_os_specified = TripleOSWasSpecified();
1512 const bool rhs_os_specified = rhs.TripleOSWasSpecified();
1513 // If both OS types are specified and different, fail.
1514 if (lhs_os_specified && rhs_os_specified)
1515 return false;
1516
1517 // If the pair of os+env is both unspecified, match any other os+env combo.
1518 if (match == CompatibleMatch &&
1519 ((!lhs_os_specified && !lhs_triple.hasEnvironment()) ||
1520 (!rhs_os_specified && !rhs_triple.hasEnvironment())))
1521 return true;
1522 }
1523
1524 if (match == CompatibleMatch && both_windows)
1525 return true; // The Windows environments (MSVC vs GNU) are compatible
1526
1527 return IsCompatibleEnvironment(lhs_triple_env, rhs_triple_env);
1528}
1529
1531 llvm::StringRef arch_name(m_triple.getArchName());
1532 const CoreDefinition *core_def = FindCoreDefinition(arch_name);
1533 if (core_def) {
1534 m_core = core_def->core;
1535 // Set the byte order to the default byte order for an architecture. This
1536 // can be modified if needed for cases when cores handle both big and
1537 // little endian
1538 m_byte_order = core_def->default_byte_order;
1539
1540 // amdgpu/r600 match their first table entry (GFX600/R600), so refine the
1541 // core from the model in the triple environment.
1544 m_triple.getEnvironmentName().split('-').second);
1545 } else if (m_core == eCore_amd_gpu_r600_R600) {
1547 m_triple.getEnvironmentName().split('-').second);
1548 }
1549 } else {
1550 Clear();
1551 }
1552}
1553
1554//===----------------------------------------------------------------------===//
1555// Helper methods.
1556
1557void ArchSpec::CoreUpdated(bool update_triple) {
1558 const CoreDefinition *core_def = FindCoreDefinition(m_core);
1559 if (core_def) {
1560 if (update_triple)
1561 m_triple = llvm::Triple(core_def->name, "unknown", "unknown");
1562 m_byte_order = core_def->default_byte_order;
1563 } else {
1564 if (update_triple)
1565 m_triple = llvm::Triple();
1567 }
1568}
1569
1570//===----------------------------------------------------------------------===//
1571// Operators.
1572
1573static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2,
1574 bool try_inverse, bool enforce_exact_match) {
1575 if (core1 == core2)
1576 return true;
1577
1578 switch (core1) {
1580 return true;
1581
1583 if (enforce_exact_match)
1584 break;
1585 [[fallthrough]];
1587 if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last)
1588 return true;
1589 if (core2 >= ArchSpec::kCore_thumb_first &&
1591 return true;
1592 if (core2 == ArchSpec::kCore_arm_any)
1593 return true;
1594 break;
1595
1597 if ((core2 >= ArchSpec::kCore_x86_32_first &&
1598 core2 <= ArchSpec::kCore_x86_32_last) ||
1599 (core2 == ArchSpec::kCore_x86_32_any))
1600 return true;
1601 break;
1602
1604 if ((core2 >= ArchSpec::kCore_x86_64_first &&
1605 core2 <= ArchSpec::kCore_x86_64_last) ||
1606 (core2 == ArchSpec::kCore_x86_64_any))
1607 return true;
1608 break;
1609
1611 if ((core2 >= ArchSpec::kCore_ppc_first &&
1612 core2 <= ArchSpec::kCore_ppc_last) ||
1613 (core2 == ArchSpec::kCore_ppc_any))
1614 return true;
1615 break;
1616
1618 if ((core2 >= ArchSpec::kCore_ppc64_first &&
1619 core2 <= ArchSpec::kCore_ppc64_last) ||
1620 (core2 == ArchSpec::kCore_ppc64_any))
1621 return true;
1622 break;
1623
1625 if ((core2 >= ArchSpec::kCore_hexagon_first &&
1626 core2 <= ArchSpec::kCore_hexagon_last) ||
1627 (core2 == ArchSpec::kCore_hexagon_any))
1628 return true;
1629 break;
1630
1631 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization
1632 // Cortex-M0 - ARMv6-M - armv6m
1633 // Cortex-M3 - ARMv7-M - armv7m
1634 // Cortex-M4 - ARMv7E-M - armv7em
1636 if (!enforce_exact_match) {
1637 if (core2 == ArchSpec::eCore_arm_generic)
1638 return true;
1639 if (core2 == ArchSpec::eCore_arm_armv7m)
1640 return true;
1641 if (core2 == ArchSpec::eCore_arm_armv6m)
1642 return true;
1643 if (core2 == ArchSpec::eCore_arm_armv7)
1644 return true;
1645 try_inverse = true;
1646 }
1647 break;
1648
1649 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization
1650 // Cortex-M0 - ARMv6-M - armv6m
1651 // Cortex-M3 - ARMv7-M - armv7m
1652 // Cortex-M4 - ARMv7E-M - armv7em
1654 if (!enforce_exact_match) {
1655 if (core2 == ArchSpec::eCore_arm_generic)
1656 return true;
1657 if (core2 == ArchSpec::eCore_arm_armv6m)
1658 return true;
1659 if (core2 == ArchSpec::eCore_arm_armv7)
1660 return true;
1661 if (core2 == ArchSpec::eCore_arm_armv7em)
1662 return true;
1663 try_inverse = true;
1664 }
1665 break;
1666
1667 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization
1668 // Cortex-M0 - ARMv6-M - armv6m
1669 // Cortex-M3 - ARMv7-M - armv7m
1670 // Cortex-M4 - ARMv7E-M - armv7em
1672 if (!enforce_exact_match) {
1673 if (core2 == ArchSpec::eCore_arm_generic)
1674 return true;
1675 if (core2 == ArchSpec::eCore_arm_armv7em)
1676 return true;
1677 if (core2 == ArchSpec::eCore_arm_armv7)
1678 return true;
1679 if (core2 == ArchSpec::eCore_arm_armv6m)
1680 return true;
1681 try_inverse = false;
1682 }
1683 break;
1684
1690 if (!enforce_exact_match) {
1691 if (core2 == ArchSpec::eCore_arm_generic)
1692 return true;
1693 if (core2 == ArchSpec::eCore_arm_armv7)
1694 return true;
1695 try_inverse = false;
1696 }
1697 break;
1698
1701 if (!enforce_exact_match) {
1702 try_inverse = false;
1703 if (core2 == ArchSpec::eCore_x86_64_x86_64)
1704 return true;
1705 }
1706 break;
1707
1709 if (!enforce_exact_match) {
1710 if (core2 == ArchSpec::eCore_arm_arm64)
1711 return true;
1712 if (core2 == ArchSpec::eCore_arm_aarch64)
1713 return true;
1714 if (core2 == ArchSpec::eCore_arm_arm64e)
1715 return true;
1716 try_inverse = false;
1717 }
1718 break;
1719
1721 if (!enforce_exact_match) {
1722 if (core2 == ArchSpec::eCore_arm_arm64)
1723 return true;
1724 if (core2 == ArchSpec::eCore_arm_aarch64)
1725 return true;
1726 if (core2 == ArchSpec::eCore_arm_armv8)
1727 return true;
1728 try_inverse = false;
1729 }
1730 break;
1732 if (!enforce_exact_match) {
1733 if (core2 == ArchSpec::eCore_arm_arm64)
1734 return true;
1735 if (core2 == ArchSpec::eCore_arm_armv8)
1736 return true;
1737 if (core2 == ArchSpec::eCore_arm_arm64e)
1738 return true;
1739 try_inverse = false;
1740 }
1741 break;
1742
1744 if (!enforce_exact_match) {
1745 if (core2 == ArchSpec::eCore_arm_aarch64)
1746 return true;
1747 if (core2 == ArchSpec::eCore_arm_armv8)
1748 return true;
1749 if (core2 == ArchSpec::eCore_arm_arm64e)
1750 return true;
1751 try_inverse = false;
1752 }
1753 break;
1754
1756 if (!enforce_exact_match) {
1757 if (core2 == ArchSpec::eCore_arm_generic)
1758 return true;
1759 try_inverse = false;
1760 }
1761 break;
1762
1764 if (!enforce_exact_match) {
1765 if (core2 >= ArchSpec::kCore_mips32_first &&
1767 return true;
1768 try_inverse = false;
1769 }
1770 break;
1771
1773 if (!enforce_exact_match) {
1774 if (core2 >= ArchSpec::kCore_mips32el_first &&
1776 return true;
1777 try_inverse = true;
1778 }
1779 break;
1780
1782 if (!enforce_exact_match) {
1783 if (core2 >= ArchSpec::kCore_mips32_first &&
1785 return true;
1786 if (core2 >= ArchSpec::kCore_mips64_first &&
1788 return true;
1789 try_inverse = false;
1790 }
1791 break;
1792
1794 if (!enforce_exact_match) {
1795 if (core2 >= ArchSpec::kCore_mips32el_first &&
1797 return true;
1798 if (core2 >= ArchSpec::kCore_mips64el_first &&
1800 return true;
1801 try_inverse = false;
1802 }
1803 break;
1804
1808 if (!enforce_exact_match) {
1809 if (core2 >= ArchSpec::kCore_mips32_first && core2 <= (core1 - 10))
1810 return true;
1811 if (core2 >= ArchSpec::kCore_mips64_first && core2 <= (core1 - 1))
1812 return true;
1813 try_inverse = false;
1814 }
1815 break;
1816
1820 if (!enforce_exact_match) {
1821 if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= (core1 - 10))
1822 return true;
1823 if (core2 >= ArchSpec::kCore_mips64el_first && core2 <= (core1 - 1))
1824 return true;
1825 try_inverse = false;
1826 }
1827 break;
1828
1832 if (!enforce_exact_match) {
1833 if (core2 >= ArchSpec::kCore_mips32_first && core2 <= core1)
1834 return true;
1835 }
1836 break;
1837
1841 if (!enforce_exact_match) {
1842 if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= core1)
1843 return true;
1844 }
1845 break;
1846
1848 if (!enforce_exact_match) {
1849 if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6)
1850 return true;
1851 }
1852 break;
1853
1855 if (!enforce_exact_match) {
1856 if (core2 == ArchSpec::eCore_mips32el ||
1858 return true;
1859 }
1860 break;
1861
1863 if (!enforce_exact_match) {
1864 if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6)
1865 return true;
1866 if (core2 == ArchSpec::eCore_mips64 || core2 == ArchSpec::eCore_mips64r6)
1867 return true;
1868 }
1869 break;
1870
1872 if (!enforce_exact_match) {
1873 if (core2 == ArchSpec::eCore_mips32el ||
1875 return true;
1876 if (core2 == ArchSpec::eCore_mips64el ||
1878 return true;
1879 }
1880 break;
1881
1882 default:
1883 break;
1884 }
1885 if (try_inverse)
1886 return cores_match(core2, core1, false, enforce_exact_match);
1887 return false;
1888}
1889
1890bool lldb_private::operator<(const ArchSpec &lhs, const ArchSpec &rhs) {
1891 const ArchSpec::Core lhs_core = lhs.GetCore();
1892 const ArchSpec::Core rhs_core = rhs.GetCore();
1893 return lhs_core < rhs_core;
1894}
1895
1896bool lldb_private::operator==(const ArchSpec &lhs, const ArchSpec &rhs) {
1897 return lhs.GetCore() == rhs.GetCore();
1898}
1899
1900bool lldb_private::operator!=(const ArchSpec &lhs, const ArchSpec &rhs) {
1901 return !(lhs == rhs);
1902}
1903
1905 if (!TripleOSWasSpecified())
1906 return false;
1907
1909 return false;
1910
1911 const unsigned unspecified = 0;
1912 const llvm::Triple &triple = GetTriple();
1913 if (triple.isOSDarwin() && triple.getOSMajorVersion() == unspecified)
1914 return false;
1915
1916 return true;
1917}
1918
1920 if (GetTriple().getArch() == llvm::Triple::arm ||
1921 GetTriple().getArch() == llvm::Triple::thumb) {
1922 // v. https://en.wikipedia.org/wiki/ARM_Cortex-M
1923 //
1924 // Cortex-M0 through Cortex-M7 are ARM processor cores which can only
1925 // execute thumb instructions. We map the cores to arch names like this:
1926 //
1927 // Cortex-M0, Cortex-M0+, Cortex-M1: armv6m Cortex-M3: armv7m Cortex-M4,
1928 // Cortex-M7: armv7em
1929
1936 return true;
1937 }
1938 // Windows on ARM is always thumb.
1939 if (GetTriple().isOSWindows())
1940 return true;
1941 }
1942 return false;
1943}
1944
1945void ArchSpec::DumpTriple(llvm::raw_ostream &s) const {
1946 const llvm::Triple &triple = GetTriple();
1947 llvm::StringRef arch_str = triple.getArchName();
1948 llvm::StringRef vendor_str = triple.getVendorName();
1949 llvm::StringRef os_str = triple.getOSName();
1950 llvm::StringRef environ_str = triple.getEnvironmentName();
1951
1952 s << llvm::formatv("{0}-{1}-{2}", arch_str.empty() ? "*" : arch_str,
1953 vendor_str.empty() ? "*" : vendor_str,
1954 os_str.empty() ? "*" : os_str);
1955
1956 if (!environ_str.empty())
1957 s << "-" << environ_str;
1958}
static uint32_t GetCPUType(const ArchDefinition *def, ArchSpec::Core core)
Definition ArchSpec.cpp:857
#define SUBTYPE_MASK
Definition ArchSpec.cpp:404
static const ArchDefinition g_elf_arch_def
Definition ArchSpec.cpp:610
static const CoreDefinition * FindCoreDefinition(llvm::StringRef name)
Definition ArchSpec.cpp:668
static const ArchDefinitionEntry * FindArchDefEntryIfCoreIsValid(const ArchDefinition *def, ArchSpec::Core core)
Definition ArchSpec.cpp:850
static const ArchDefinitionEntry * FindArchDefinitionEntry(const ArchDefinition *def, uint32_t cpu, uint32_t sub)
Definition ArchSpec.cpp:684
static uint32_t GetCPUSubType(const ArchDefinition *def, ArchSpec::Core core)
Definition ArchSpec.cpp:864
static const ArchDefinitionEntry g_macho_arch_entries[]
Definition ArchSpec.cpp:407
static const ArchDefinitionEntry g_xcoff_arch_entries[]
Definition ArchSpec.cpp:637
static const ArchDefinitionEntry g_coff_arch_entries[]
Definition ArchSpec.cpp:617
static const ArchDefinitionEntry g_elf_arch_entries[]
Definition ArchSpec.cpp:495
static const ArchDefinition * FindArchDefinition(ArchitectureType arch_type)
Definition ArchSpec.cpp:659
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:486
#define CPU_ANY
Definition ArchSpec.cpp:397
static const ArchDefinition g_xcoff_arch_def
Definition ArchSpec.cpp:643
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:652
#define AMD_GPU_CORE_DEF_R600(sub)
Definition ArchSpec.cpp:44
static const ArchDefinition g_coff_arch_def
Definition ArchSpec.cpp:629
static bool IsCompatibleEnvironment(llvm::Triple::EnvironmentType lhs, llvm::Triple::EnvironmentType rhs)
#define AMD_GPU_ARCH_DEF_R600(sub)
Definition ArchSpec.cpp:483
static const ArchDefinition g_macho_arch_def
Definition ArchSpec.cpp:479
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:387
bool IsFullySpecifiedTriple() const
bool IsNVPTX() const
If NVPTX architecture return true.
Definition ArchSpec.cpp:751
static void AutoComplete(CompletionRequest &request)
Definition ArchSpec.cpp:392
uint32_t GetAddressByteSize() const
Returns the size in bytes of an address of the current architecture.
Definition ArchSpec.cpp:891
bool IsValid() const
Tests if this ArchSpec is valid.
Definition ArchSpec.h:453
void Clear()
Clears the object state.
Definition ArchSpec.cpp:732
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition ArchSpec.h:545
void SetFlags(uint32_t flags)
Definition ArchSpec.h:618
bool IsAlwaysThumbInstructions() const
Detect whether this architecture uses thumb code exclusively.
bool TripleEnvironmentWasSpecified() const
Definition ArchSpec.h:464
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:949
llvm::Triple m_triple
Definition ArchSpec.h:633
lldb::ByteOrder GetDefaultEndian() const
Returns the default endianness of the architecture.
Definition ArchSpec.cpp:905
lldb::ByteOrder m_byte_order
Definition ArchSpec.h:635
uint32_t GetElfCPUSubType() const
Definition ArchSpec.cpp:879
~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:875
void CoreUpdated(bool update_triple)
bool IsMIPS() const
if MIPS architecture return true.
Definition ArchSpec.cpp:749
bool IsCompatibleMatch(const ArchSpec &rhs) const
Shorthand for IsMatch(rhs, CompatibleMatch).
Definition ArchSpec.h:597
bool CharIsSignedByDefault() const
Returns true if 'char' is a signed type by default in the architecture false otherwise.
Definition ArchSpec.cpp:912
ArchSpec()
Default constructor.
uint32_t GetMachOCPUType() const
Definition ArchSpec.cpp:871
std::string GetTargetABI() const
Return a string representing target application ABI.
Definition ArchSpec.cpp:753
uint32_t GetMinimumOpcodeByteSize() const
uint32_t GetFlags() const
Definition ArchSpec.h:616
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
Definition ArchSpec.cpp:940
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
Definition ArchSpec.cpp:883
std::string GetClangTargetCPU() const
Returns a string representing current architecture as a target CPU for tools like compiler,...
Definition ArchSpec.cpp:789
uint32_t GetMaximumOpcodeByteSize() const
bool TripleVendorWasSpecified() const
Definition ArchSpec.h:458
Core GetCore() const
Definition ArchSpec.h:534
bool TripleOSWasSpecified() const
Definition ArchSpec.h:462
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:742
"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:955
bool operator!=(const Address &lhs, const Address &rhs)
Definition Address.cpp:1011
TableValidator< 0 > validator
bool operator==(const Address &lhs, const Address &rhs)
Definition Address.cpp:1005
bool operator<(const Address &lhs, const Address &rhs)
Definition Address.cpp:974
ByteOrder
Byte ordering definitions.
ArchSpec::Core core
Definition ArchSpec.cpp:373
ArchitectureType type
Definition ArchSpec.cpp:381
const ArchDefinitionEntry * entries
Definition ArchSpec.cpp:383
size_t num_entries
Definition ArchSpec.cpp:382
const char * name
Definition ArchSpec.cpp:384
llvm::Triple::ArchType machine
Definition ArchSpec.cpp:37
const char *const name
Definition ArchSpec.cpp:39