| //===-- ArchSpec.cpp ------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "lldb/Utility/ArchSpec.h" | |
| #include "lldb/Utility/LLDBLog.h" | |
| #include "lldb/Utility/Log.h" | |
| #include "lldb/Utility/StringList.h" | |
| #include "lldb/lldb-defines.h" | |
| #include "llvm/ADT/STLExtras.h" | |
| #include "llvm/ADT/StringSwitch.h" | |
| #include "llvm/BinaryFormat/COFF.h" | |
| #include "llvm/BinaryFormat/ELF.h" | |
| #include "llvm/BinaryFormat/MachO.h" | |
| #include "llvm/BinaryFormat/XCOFF.h" | |
| #include "llvm/Support/Compiler.h" | |
| #include "llvm/TargetParser/ARMTargetParser.h" | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2, | |
| bool enforce_exact_match); | |
| namespace lldb_private { | |
| struct CoreDefinition { | |
| ByteOrder default_byte_order; | |
| uint32_t addr_byte_size; | |
| uint32_t min_opcode_byte_size; | |
| uint32_t max_opcode_byte_size; | |
| llvm::Triple::ArchType machine; | |
| ArchSpec::Core core; | |
| const char *const name; | |
| }; | |
| } // namespace lldb_private | |
| #define AMD_GPU_CORE_DEF_R600(sub) \ | |
| {eByteOrderLittle, \ | |
| 4, \ | |
| 4, \ | |
| 16, \ | |
| llvm::Triple::r600, \ | |
| ArchSpec::eCore_amd_gpu_r600_##sub, \ | |
| "r600"} | |
| #define AMD_GPU_CORE_DEF_GCN(sub) \ | |
| {eByteOrderLittle, \ | |
| 8, \ | |
| 4, \ | |
| 16, \ | |
| llvm::Triple::amdgpu, \ | |
| ArchSpec::eCore_amd_gpu_gcn_##sub, \ | |
| "amdgpu"} | |
| // This core information can be looked using the ArchSpec::Core as the index | |
| static constexpr const CoreDefinition g_core_definitions[] = { | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_generic, | |
| "arm"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv4, | |
| "armv4"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv4t, | |
| "armv4t"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5, | |
| "armv5"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5e, | |
| "armv5e"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5t, | |
| "armv5t"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv6, | |
| "armv6"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv6m, | |
| "armv6m"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7, | |
| "armv7"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7a, | |
| "armv7a"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7l, | |
| "armv7l"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7f, | |
| "armv7f"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7s, | |
| "armv7s"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7k, | |
| "armv7k"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7m, | |
| "armv7m"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7em, | |
| "armv7em"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, | |
| ArchSpec::eCore_arm_armv8m_base, "armv8m.base"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, | |
| ArchSpec::eCore_arm_armv8m_main, "armv8m.main"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, | |
| ArchSpec::eCore_arm_armv8_1m_main, "armv8.1m.main"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_xscale, | |
| "xscale"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumb, | |
| "thumb"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv4t, | |
| "thumbv4t"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv5, | |
| "thumbv5"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv5e, | |
| "thumbv5e"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv6, | |
| "thumbv6"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv6m, | |
| "thumbv6m"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7, | |
| "thumbv7"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7s, | |
| "thumbv7s"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7k, | |
| "thumbv7k"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7f, | |
| "thumbv7f"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7m, | |
| "thumbv7m"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7em, | |
| "thumbv7em"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64, | |
| ArchSpec::eCore_arm_arm64, "arm64"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64, | |
| ArchSpec::eCore_arm_armv8, "armv8"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64, | |
| ArchSpec::eCore_arm_armv8a, "armv8a"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv8l, | |
| "armv8l"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64, | |
| ArchSpec::eCore_arm_arm64e, "arm64e"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::aarch64_32, | |
| ArchSpec::eCore_arm_arm64_32, "arm64_32"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64, | |
| ArchSpec::eCore_arm_aarch64, "aarch64"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64, | |
| ArchSpec::eCore_arm_arm64ex1, "arm64e.x1"}, | |
| // mips32, mips32r2, mips32r3, mips32r5, mips32r6 | |
| {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32, | |
| "mips"}, | |
| {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r2, | |
| "mipsr2"}, | |
| {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r3, | |
| "mipsr3"}, | |
| {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r5, | |
| "mipsr5"}, | |
| {eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r6, | |
| "mipsr6"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, ArchSpec::eCore_mips32el, | |
| "mipsel"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, | |
| ArchSpec::eCore_mips32r2el, "mipsr2el"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, | |
| ArchSpec::eCore_mips32r3el, "mipsr3el"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, | |
| ArchSpec::eCore_mips32r5el, "mipsr5el"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, | |
| ArchSpec::eCore_mips32r6el, "mipsr6el"}, | |
| // mips64, mips64r2, mips64r3, mips64r5, mips64r6 | |
| {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64, | |
| "mips64"}, | |
| {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r2, | |
| "mips64r2"}, | |
| {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r3, | |
| "mips64r3"}, | |
| {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r5, | |
| "mips64r5"}, | |
| {eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r6, | |
| "mips64r6"}, | |
| {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el, | |
| ArchSpec::eCore_mips64el, "mips64el"}, | |
| {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el, | |
| ArchSpec::eCore_mips64r2el, "mips64r2el"}, | |
| {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el, | |
| ArchSpec::eCore_mips64r3el, "mips64r3el"}, | |
| {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el, | |
| ArchSpec::eCore_mips64r5el, "mips64r5el"}, | |
| {eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el, | |
| ArchSpec::eCore_mips64r6el, "mips64r6el"}, | |
| // MSP430 | |
| {eByteOrderLittle, 2, 2, 4, llvm::Triple::msp430, ArchSpec::eCore_msp430, | |
| "msp430"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_generic, | |
| "powerpc"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc601, | |
| "ppc601"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc602, | |
| "ppc602"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603, | |
| "ppc603"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603e, | |
| "ppc603e"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603ev, | |
| "ppc603ev"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc604, | |
| "ppc604"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc604e, | |
| "ppc604e"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc620, | |
| "ppc620"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc750, | |
| "ppc750"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc7400, | |
| "ppc7400"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc7450, | |
| "ppc7450"}, | |
| {eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc970, | |
| "ppc970"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64le, | |
| ArchSpec::eCore_ppc64le_generic, "powerpc64le"}, | |
| {eByteOrderBig, 8, 4, 4, llvm::Triple::ppc64, ArchSpec::eCore_ppc64_generic, | |
| "powerpc64"}, | |
| {eByteOrderBig, 8, 4, 4, llvm::Triple::ppc64, | |
| ArchSpec::eCore_ppc64_ppc970_64, "ppc970-64"}, | |
| {eByteOrderBig, 8, 2, 6, llvm::Triple::systemz, | |
| ArchSpec::eCore_s390x_generic, "s390x"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::sparc, | |
| ArchSpec::eCore_sparc_generic, "sparc"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::sparcv9, | |
| ArchSpec::eCore_sparc9_generic, "sparcv9"}, | |
| {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i386, | |
| "i386"}, | |
| {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i486, | |
| "i486"}, | |
| {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, | |
| ArchSpec::eCore_x86_32_i486sx, "i486sx"}, | |
| {eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i686, | |
| "i686"}, | |
| {eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64, | |
| ArchSpec::eCore_x86_64_x86_64, "x86_64"}, | |
| {eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64, | |
| ArchSpec::eCore_x86_64_x86_64h, "x86_64h"}, | |
| {eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64, | |
| ArchSpec::eCore_x86_64_amd64, "amd64"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon, | |
| ArchSpec::eCore_hexagon_generic, "hexagon"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon, | |
| ArchSpec::eCore_hexagon_hexagonv4, "hexagonv4"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon, | |
| ArchSpec::eCore_hexagon_hexagonv5, "hexagonv5"}, | |
| {eByteOrderLittle, 4, 2, 8, llvm::Triple::riscv32, ArchSpec::eCore_riscv32, | |
| "riscv32"}, | |
| {eByteOrderLittle, 8, 2, 8, llvm::Triple::riscv64, ArchSpec::eCore_riscv64, | |
| "riscv64"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::loongarch32, | |
| ArchSpec::eCore_loongarch32, "loongarch32"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::loongarch64, | |
| ArchSpec::eCore_loongarch64, "loongarch64"}, | |
| {eByteOrderLittle, 4, 4, 4, llvm::Triple::UnknownArch, | |
| ArchSpec::eCore_uknownMach32, "unknown-mach-32"}, | |
| {eByteOrderLittle, 8, 4, 4, llvm::Triple::UnknownArch, | |
| ArchSpec::eCore_uknownMach64, "unknown-mach-64"}, | |
| {eByteOrderLittle, 4, 2, 4, llvm::Triple::arc, ArchSpec::eCore_arc, "arc"}, | |
| {eByteOrderLittle, 2, 2, 4, llvm::Triple::avr, ArchSpec::eCore_avr, "avr"}, | |
| {eByteOrderLittle, 4, 1, 4, llvm::Triple::wasm32, ArchSpec::eCore_wasm32, | |
| "wasm32"}, | |
| AMD_GPU_CORE_DEF_R600(R600), | |
| AMD_GPU_CORE_DEF_R600(R630), | |
| AMD_GPU_CORE_DEF_R600(RS880), | |
| AMD_GPU_CORE_DEF_R600(RV670), | |
| AMD_GPU_CORE_DEF_R600(RV710), | |
| AMD_GPU_CORE_DEF_R600(RV730), | |
| AMD_GPU_CORE_DEF_R600(RV770), | |
| AMD_GPU_CORE_DEF_R600(CEDAR), | |
| AMD_GPU_CORE_DEF_R600(CYPRESS), | |
| AMD_GPU_CORE_DEF_R600(JUNIPER), | |
| AMD_GPU_CORE_DEF_R600(REDWOOD), | |
| AMD_GPU_CORE_DEF_R600(SUMO), | |
| AMD_GPU_CORE_DEF_R600(BARTS), | |
| AMD_GPU_CORE_DEF_R600(CAICOS), | |
| AMD_GPU_CORE_DEF_R600(CAYMAN), | |
| AMD_GPU_CORE_DEF_R600(TURKS), | |
| AMD_GPU_CORE_DEF_GCN(GFX600), | |
| AMD_GPU_CORE_DEF_GCN(GFX601), | |
| AMD_GPU_CORE_DEF_GCN(GFX602), | |
| AMD_GPU_CORE_DEF_GCN(GFX700), | |
| AMD_GPU_CORE_DEF_GCN(GFX701), | |
| AMD_GPU_CORE_DEF_GCN(GFX702), | |
| AMD_GPU_CORE_DEF_GCN(GFX703), | |
| AMD_GPU_CORE_DEF_GCN(GFX704), | |
| AMD_GPU_CORE_DEF_GCN(GFX705), | |
| AMD_GPU_CORE_DEF_GCN(GFX801), | |
| AMD_GPU_CORE_DEF_GCN(GFX802), | |
| AMD_GPU_CORE_DEF_GCN(GFX803), | |
| AMD_GPU_CORE_DEF_GCN(GFX805), | |
| AMD_GPU_CORE_DEF_GCN(GFX810), | |
| AMD_GPU_CORE_DEF_GCN(GFX900), | |
| AMD_GPU_CORE_DEF_GCN(GFX902), | |
| AMD_GPU_CORE_DEF_GCN(GFX904), | |
| AMD_GPU_CORE_DEF_GCN(GFX906), | |
| AMD_GPU_CORE_DEF_GCN(GFX908), | |
| AMD_GPU_CORE_DEF_GCN(GFX909), | |
| AMD_GPU_CORE_DEF_GCN(GFX90A), | |
| AMD_GPU_CORE_DEF_GCN(GFX90C), | |
| AMD_GPU_CORE_DEF_GCN(GFX942), | |
| AMD_GPU_CORE_DEF_GCN(GFX950), | |
| AMD_GPU_CORE_DEF_GCN(GFX1010), | |
| AMD_GPU_CORE_DEF_GCN(GFX1011), | |
| AMD_GPU_CORE_DEF_GCN(GFX1012), | |
| AMD_GPU_CORE_DEF_GCN(GFX1013), | |
| AMD_GPU_CORE_DEF_GCN(GFX1030), | |
| AMD_GPU_CORE_DEF_GCN(GFX1031), | |
| AMD_GPU_CORE_DEF_GCN(GFX1032), | |
| AMD_GPU_CORE_DEF_GCN(GFX1033), | |
| AMD_GPU_CORE_DEF_GCN(GFX1034), | |
| AMD_GPU_CORE_DEF_GCN(GFX1035), | |
| AMD_GPU_CORE_DEF_GCN(GFX1036), | |
| AMD_GPU_CORE_DEF_GCN(GFX1100), | |
| AMD_GPU_CORE_DEF_GCN(GFX1101), | |
| AMD_GPU_CORE_DEF_GCN(GFX1102), | |
| AMD_GPU_CORE_DEF_GCN(GFX1103), | |
| AMD_GPU_CORE_DEF_GCN(GFX1150), | |
| AMD_GPU_CORE_DEF_GCN(GFX1151), | |
| AMD_GPU_CORE_DEF_GCN(GFX1152), | |
| AMD_GPU_CORE_DEF_GCN(GFX1153), | |
| AMD_GPU_CORE_DEF_GCN(GFX1154), | |
| AMD_GPU_CORE_DEF_GCN(GFX1170), | |
| AMD_GPU_CORE_DEF_GCN(GFX1171), | |
| AMD_GPU_CORE_DEF_GCN(GFX1172), | |
| AMD_GPU_CORE_DEF_GCN(GFX1200), | |
| AMD_GPU_CORE_DEF_GCN(GFX1201), | |
| AMD_GPU_CORE_DEF_GCN(GFX1250_STRICT), | |
| AMD_GPU_CORE_DEF_GCN(GFX1250), | |
| AMD_GPU_CORE_DEF_GCN(GFX1251), | |
| AMD_GPU_CORE_DEF_GCN(GFX1310), | |
| AMD_GPU_CORE_DEF_GCN(GFX9_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX9_4_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX10_1_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX10_3_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX11_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX12_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX12_5_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX11_7_GENERIC), | |
| AMD_GPU_CORE_DEF_GCN(GFX13_GENERIC), | |
| {eByteOrderLittle, 8, 4, 16, llvm::Triple::amdgpu, | |
| ArchSpec::eCore_amd_gpu_unknown, "amdgpu"}, | |
| }; | |
| // Ensure that we have an entry in the g_core_definitions for each core. If you | |
| // comment out an entry above, you will need to comment out the corresponding | |
| // ArchSpec::Core enumeration. | |
| static_assert(sizeof(g_core_definitions) / sizeof(CoreDefinition) == | |
| ArchSpec::kNumCores, | |
| "make sure we have one core definition for each core"); | |
| template <int I> struct ArchSpecValidator : ArchSpecValidator<I + 1> { | |
| static_assert(g_core_definitions[I].core == I, | |
| "g_core_definitions order doesn't match Core enumeration"); | |
| }; | |
| template <> struct ArchSpecValidator<ArchSpec::kNumCores> {}; | |
| ArchSpecValidator<ArchSpec::eCore_arm_generic> validator; | |
| struct ArchDefinitionEntry { | |
| ArchSpec::Core core; | |
| uint32_t cpu; | |
| uint32_t sub = LLDB_INVALID_CPUTYPE; | |
| uint32_t cpu_mask = UINT32_MAX; | |
| uint32_t sub_mask = UINT32_MAX; | |
| }; | |
| struct ArchDefinition { | |
| ArchitectureType type; | |
| size_t num_entries; | |
| const ArchDefinitionEntry *entries; | |
| const char *name; | |
| }; | |
| void ArchSpec::ListSupportedArchNames(StringList &list) { | |
| for (const auto &def : g_core_definitions) | |
| list.AppendString(def.name); | |
| } | |
| void ArchSpec::AutoComplete(CompletionRequest &request) { | |
| for (const auto &def : g_core_definitions) | |
| request.TryCompleteCurrentArg(def.name); | |
| } | |
| #define CPU_ANY (UINT32_MAX) | |
| //===----------------------------------------------------------------------===// | |
| // A table that gets searched linearly for matches. This table is used to | |
| // convert cpu type and subtypes to architecture names, and to convert | |
| // architecture names to cpu types and subtypes. The ordering is important and | |
| // allows the precedence to be set when the table is built. | |
| #define SUBTYPE_MASK 0x00FFFFFFu | |
| // clang-format off | |
| static const ArchDefinitionEntry g_macho_arch_entries[] = { | |
| {ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, CPU_ANY, UINT32_MAX, UINT32_MAX}, | |
| {ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv4, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv5t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_xscale, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_XSCALE, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv8m_base, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_BASE, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv8m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8M_MAIN, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_armv8_1m_main, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V8_1M_MAIN, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64e, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64E, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64ex1, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64E_X1, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_V8, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, 13, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 0, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 1, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumb, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_thumbv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, CPU_ANY, UINT32_MAX, UINT32_MAX}, | |
| {ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc601, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_601, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc602, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_602, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc603, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc603e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603e, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc603ev, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603ev, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc604, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc604e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604e, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc620, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_620, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc750, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_750, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc7400, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7400, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc7450, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7450, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc_ppc970, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_970, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc64_generic, llvm::MachO::CPU_TYPE_POWERPC64, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc64le_generic, llvm::MachO::CPU_TYPE_POWERPC64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_ppc64_ppc970_64, llvm::MachO::CPU_TYPE_POWERPC64, 100, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_I386_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_32_i486, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_32_i486sx, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486SX, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, CPU_ANY, UINT32_MAX, UINT32_MAX}, | |
| {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_ARCH1, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_64_x86_64h, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_H, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, CPU_ANY, UINT32_MAX, UINT32_MAX}, | |
| {ArchSpec::eCore_riscv32, llvm::MachO::CPU_TYPE_RISCV, llvm::MachO::CPU_SUBTYPE_RISCV_ALL, UINT32_MAX, SUBTYPE_MASK}, | |
| {ArchSpec::eCore_riscv32, llvm::MachO::CPU_TYPE_RISCV, CPU_ANY, UINT32_MAX, SUBTYPE_MASK}, | |
| // Catch any unknown mach architectures so we can always use the object and symbol mach-o files | |
| {ArchSpec::eCore_uknownMach32, 0, 0, 0xFF000000u, 0x00000000u}, | |
| {ArchSpec::eCore_uknownMach64, llvm::MachO::CPU_ARCH_ABI64, 0, 0xFF000000u, 0x00000000u} | |
| }; | |
| // clang-format on | |
| static const ArchDefinition g_macho_arch_def = {eArchTypeMachO, | |
| std::size(g_macho_arch_entries), | |
| g_macho_arch_entries, "mach-o"}; | |
| #define AMD_GPU_ARCH_DEF_R600(sub) \ | |
| {ArchSpec::eCore_amd_gpu_r600_##sub, llvm::ELF::EM_AMDGPU, \ | |
| llvm::ELF::EF_AMDGPU_MACH_R600_##sub} | |
| #define AMD_GPU_ARCH_DEF_GCN(sub) \ | |
| {ArchSpec::eCore_amd_gpu_gcn_##sub, llvm::ELF::EM_AMDGPU, \ | |
| llvm::ELF::EF_AMDGPU_MACH_AMDGCN_##sub} | |
| //===----------------------------------------------------------------------===// | |
| // A table that gets searched linearly for matches. This table is used to | |
| // convert cpu type and subtypes to architecture names, and to convert | |
| // architecture names to cpu types and subtypes. The ordering is important and | |
| // allows the precedence to be set when the table is built. | |
| // clang-format off | |
| static const ArchDefinitionEntry g_elf_arch_entries[] = { | |
| {ArchSpec::eCore_sparc_generic, llvm::ELF::EM_SPARC }, // Sparc | |
| {ArchSpec::eCore_x86_32_i386, llvm::ELF::EM_386 }, // Intel 80386 | |
| {ArchSpec::eCore_x86_32_i486, llvm::ELF::EM_IAMCU }, // Intel MCU // FIXME: is this correct? | |
| {ArchSpec::eCore_ppc_generic, llvm::ELF::EM_PPC }, // PowerPC | |
| {ArchSpec::eCore_ppc64le_generic, llvm::ELF::EM_PPC64, ArchSpec::eCore_ppc64le_generic}, // PowerPC64le | |
| {ArchSpec::eCore_ppc64_generic, llvm::ELF::EM_PPC64, ArchSpec::eCore_ppc64_generic}, // PowerPC64 | |
| {ArchSpec::eCore_arm_generic, llvm::ELF::EM_ARM }, // ARM | |
| {ArchSpec::eCore_arm_aarch64, llvm::ELF::EM_AARCH64 }, // ARM64 | |
| {ArchSpec::eCore_s390x_generic, llvm::ELF::EM_S390 }, // SystemZ | |
| {ArchSpec::eCore_sparc9_generic, llvm::ELF::EM_SPARCV9 }, // SPARC V9 | |
| {ArchSpec::eCore_x86_64_x86_64, llvm::ELF::EM_X86_64 }, // AMD64 | |
| {ArchSpec::eCore_mips32, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32}, // mips32 | |
| {ArchSpec::eCore_mips32r2, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r2}, // mips32r2 | |
| {ArchSpec::eCore_mips32r6, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r6}, // mips32r6 | |
| {ArchSpec::eCore_mips32el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32el}, // mips32el | |
| {ArchSpec::eCore_mips32r2el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r2el}, // mips32r2el | |
| {ArchSpec::eCore_mips32r6el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32r6el}, // mips32r6el | |
| {ArchSpec::eCore_mips64, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64}, | |
| {ArchSpec::eCore_mips64r2, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r2}, // mips64r2 | |
| {ArchSpec::eCore_mips64r6, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r6}, // mips64r6 | |
| {ArchSpec::eCore_mips64el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64el}, // mips64el | |
| {ArchSpec::eCore_mips64r2el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r2el}, // mips64r2el | |
| {ArchSpec::eCore_mips64r6el, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64r6el}, // mips64r6el | |
| {ArchSpec::eCore_msp430, llvm::ELF::EM_MSP430 }, // MSP430 | |
| {ArchSpec::eCore_hexagon_generic, llvm::ELF::EM_HEXAGON }, // HEXAGON | |
| {ArchSpec::eCore_arc, llvm::ELF::EM_ARC_COMPACT2}, // ARC | |
| {ArchSpec::eCore_avr, llvm::ELF::EM_AVR }, // AVR | |
| {ArchSpec::eCore_riscv32, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv32}, // riscv32 | |
| {ArchSpec::eCore_riscv64, llvm::ELF::EM_RISCV, ArchSpec::eRISCVSubType_riscv64}, // riscv64 | |
| {ArchSpec::eCore_loongarch32, llvm::ELF::EM_LOONGARCH, ArchSpec::eLoongArchSubType_loongarch32}, // loongarch32 | |
| {ArchSpec::eCore_loongarch64, llvm::ELF::EM_LOONGARCH, ArchSpec::eLoongArchSubType_loongarch64}, // loongarch64 | |
| AMD_GPU_ARCH_DEF_R600(R600), | |
| AMD_GPU_ARCH_DEF_R600(R630), | |
| AMD_GPU_ARCH_DEF_R600(RS880), | |
| AMD_GPU_ARCH_DEF_R600(RV670), | |
| AMD_GPU_ARCH_DEF_R600(RV710), | |
| AMD_GPU_ARCH_DEF_R600(RV730), | |
| AMD_GPU_ARCH_DEF_R600(RV770), | |
| AMD_GPU_ARCH_DEF_R600(CEDAR), | |
| AMD_GPU_ARCH_DEF_R600(CYPRESS), | |
| AMD_GPU_ARCH_DEF_R600(JUNIPER), | |
| AMD_GPU_ARCH_DEF_R600(REDWOOD), | |
| AMD_GPU_ARCH_DEF_R600(SUMO), | |
| AMD_GPU_ARCH_DEF_R600(BARTS), | |
| AMD_GPU_ARCH_DEF_R600(CAICOS), | |
| AMD_GPU_ARCH_DEF_R600(CAYMAN), | |
| AMD_GPU_ARCH_DEF_R600(TURKS), | |
| AMD_GPU_ARCH_DEF_GCN(GFX600), | |
| AMD_GPU_ARCH_DEF_GCN(GFX601), | |
| AMD_GPU_ARCH_DEF_GCN(GFX602), | |
| AMD_GPU_ARCH_DEF_GCN(GFX700), | |
| AMD_GPU_ARCH_DEF_GCN(GFX701), | |
| AMD_GPU_ARCH_DEF_GCN(GFX702), | |
| AMD_GPU_ARCH_DEF_GCN(GFX703), | |
| AMD_GPU_ARCH_DEF_GCN(GFX704), | |
| AMD_GPU_ARCH_DEF_GCN(GFX705), | |
| AMD_GPU_ARCH_DEF_GCN(GFX801), | |
| AMD_GPU_ARCH_DEF_GCN(GFX802), | |
| AMD_GPU_ARCH_DEF_GCN(GFX803), | |
| AMD_GPU_ARCH_DEF_GCN(GFX805), | |
| AMD_GPU_ARCH_DEF_GCN(GFX810), | |
| AMD_GPU_ARCH_DEF_GCN(GFX900), | |
| AMD_GPU_ARCH_DEF_GCN(GFX902), | |
| AMD_GPU_ARCH_DEF_GCN(GFX904), | |
| AMD_GPU_ARCH_DEF_GCN(GFX906), | |
| AMD_GPU_ARCH_DEF_GCN(GFX908), | |
| AMD_GPU_ARCH_DEF_GCN(GFX909), | |
| AMD_GPU_ARCH_DEF_GCN(GFX90A), | |
| AMD_GPU_ARCH_DEF_GCN(GFX90C), | |
| AMD_GPU_ARCH_DEF_GCN(GFX942), | |
| AMD_GPU_ARCH_DEF_GCN(GFX950), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1010), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1011), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1012), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1013), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1030), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1031), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1032), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1033), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1034), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1035), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1036), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1100), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1101), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1102), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1103), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1150), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1151), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1152), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1153), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1154), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1170), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1171), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1172), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1200), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1201), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1250_STRICT), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1250), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1251), | |
| AMD_GPU_ARCH_DEF_GCN(GFX1310), | |
| AMD_GPU_ARCH_DEF_GCN(GFX9_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX9_4_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX10_1_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX10_3_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX11_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX12_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX12_5_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX11_7_GENERIC), | |
| AMD_GPU_ARCH_DEF_GCN(GFX13_GENERIC), | |
| // Any AMDGPU object with no recognized model resolves here. | |
| {ArchSpec::eCore_amd_gpu_unknown, llvm::ELF::EM_AMDGPU}, | |
| }; | |
| // clang-format on | |
| static const ArchDefinition g_elf_arch_def = { | |
| eArchTypeELF, | |
| std::size(g_elf_arch_entries), | |
| g_elf_arch_entries, | |
| "elf", | |
| }; | |
| // clang-format off | |
| static const ArchDefinitionEntry g_coff_arch_entries[] = { | |
| {ArchSpec::eCore_x86_32_i386, llvm::COFF::IMAGE_FILE_MACHINE_I386}, // Intel 80x86 | |
| {ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPC}, // PowerPC | |
| {ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP}, // PowerPC (with FPU) | |
| {ArchSpec::eCore_arm_generic, llvm::COFF::IMAGE_FILE_MACHINE_ARM}, // ARM | |
| {ArchSpec::eCore_arm_armv7, llvm::COFF::IMAGE_FILE_MACHINE_ARMNT}, // ARMv7 | |
| {ArchSpec::eCore_thumb, llvm::COFF::IMAGE_FILE_MACHINE_THUMB}, // ARMv7 | |
| {ArchSpec::eCore_x86_64_x86_64, llvm::COFF::IMAGE_FILE_MACHINE_AMD64}, // AMD64 | |
| {ArchSpec::eCore_arm_arm64, llvm::COFF::IMAGE_FILE_MACHINE_ARM64} // ARM64 | |
| }; | |
| // clang-format on | |
| static const ArchDefinition g_coff_arch_def = { | |
| eArchTypeCOFF, | |
| std::size(g_coff_arch_entries), | |
| g_coff_arch_entries, | |
| "pe-coff", | |
| }; | |
| // clang-format off | |
| static const ArchDefinitionEntry g_xcoff_arch_entries[] = { | |
| {ArchSpec::eCore_ppc_generic, llvm::XCOFF::TCPU_PPC}, | |
| {ArchSpec::eCore_ppc64_generic, llvm::XCOFF::TCPU_PPC64} | |
| }; | |
| // clang-format on | |
| static const ArchDefinition g_xcoff_arch_def = { | |
| eArchTypeXCOFF, | |
| std::size(g_xcoff_arch_entries), | |
| g_xcoff_arch_entries, | |
| "xcoff", | |
| }; | |
| //===----------------------------------------------------------------------===// | |
| // Table of all ArchDefinitions | |
| static const ArchDefinition *g_arch_definitions[] = { | |
| &g_macho_arch_def, &g_elf_arch_def, &g_coff_arch_def, &g_xcoff_arch_def}; | |
| //===----------------------------------------------------------------------===// | |
| // Static helper functions. | |
| // Get the architecture definition for a given object type. | |
| static const ArchDefinition *FindArchDefinition(ArchitectureType arch_type) { | |
| for (const ArchDefinition *def : g_arch_definitions) { | |
| if (def->type == arch_type) | |
| return def; | |
| } | |
| return nullptr; | |
| } | |
| // Get an architecture definition by name. | |
| static const CoreDefinition *FindCoreDefinition(llvm::StringRef name) { | |
| for (const auto &def : g_core_definitions) { | |
| if (name.equals_insensitive(def.name)) | |
| return &def; | |
| } | |
| return nullptr; | |
| } | |
| static inline const CoreDefinition *FindCoreDefinition(ArchSpec::Core core) { | |
| if (core < std::size(g_core_definitions)) | |
| return &g_core_definitions[core]; | |
| return nullptr; | |
| } | |
| // Get a definition entry by cpu type and subtype. | |
| static const ArchDefinitionEntry * | |
| FindArchDefinitionEntry(const ArchDefinition *def, uint32_t cpu, uint32_t sub) { | |
| if (def == nullptr) | |
| return nullptr; | |
| const ArchDefinitionEntry *entries = def->entries; | |
| for (size_t i = 0; i < def->num_entries; ++i) { | |
| if (entries[i].cpu == (cpu & entries[i].cpu_mask)) | |
| if (entries[i].sub == (sub & entries[i].sub_mask)) | |
| return &entries[i]; | |
| } | |
| return nullptr; | |
| } | |
| static const ArchDefinitionEntry * | |
| FindArchDefinitionEntry(const ArchDefinition *def, ArchSpec::Core core) { | |
| if (def == nullptr) | |
| return nullptr; | |
| const ArchDefinitionEntry *entries = def->entries; | |
| for (size_t i = 0; i < def->num_entries; ++i) { | |
| if (entries[i].core == core) | |
| return &entries[i]; | |
| } | |
| return nullptr; | |
| } | |
| static llvm::StringRef GetAMDGPUVariantName(uint32_t sub); | |
| //===----------------------------------------------------------------------===// | |
| // Constructors and destructors. | |
| ArchSpec::ArchSpec() = default; | |
| ArchSpec::ArchSpec(const char *triple_cstr) { | |
| if (triple_cstr) | |
| SetTriple(triple_cstr); | |
| } | |
| ArchSpec::ArchSpec(llvm::StringRef triple_str) { SetTriple(triple_str); } | |
| ArchSpec::ArchSpec(const llvm::Triple &triple) { SetTriple(triple); } | |
| ArchSpec::ArchSpec(ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) { | |
| SetArchitecture(arch_type, cpu, subtype); | |
| } | |
| ArchSpec::~ArchSpec() = default; | |
| void ArchSpec::Clear() { | |
| m_triple = llvm::Triple(); | |
| m_core = kCore_invalid; | |
| m_byte_order = eByteOrderInvalid; | |
| m_flags = 0; | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // Predicates. | |
| const char *ArchSpec::GetArchitectureName() const { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) | |
| return core_def->name; | |
| return "unknown"; | |
| } | |
| bool ArchSpec::IsMIPS() const { return GetTriple().isMIPS(); } | |
| bool ArchSpec::IsNVPTX() const { return GetTriple().isNVPTX(); } | |
| std::string ArchSpec::GetTargetABI() const { | |
| std::string abi; | |
| if (IsMIPS()) { | |
| switch (GetFlags() & ArchSpec::eMIPSABI_mask) { | |
| case ArchSpec::eMIPSABI_N64: | |
| abi = "n64"; | |
| return abi; | |
| case ArchSpec::eMIPSABI_N32: | |
| abi = "n32"; | |
| return abi; | |
| case ArchSpec::eMIPSABI_O32: | |
| abi = "o32"; | |
| return abi; | |
| default: | |
| return abi; | |
| } | |
| } | |
| return abi; | |
| } | |
| void ArchSpec::SetFlags(const std::string &elf_abi) { | |
| uint32_t flag = GetFlags(); | |
| if (IsMIPS()) { | |
| if (elf_abi == "n64") | |
| flag |= ArchSpec::eMIPSABI_N64; | |
| else if (elf_abi == "n32") | |
| flag |= ArchSpec::eMIPSABI_N32; | |
| else if (elf_abi == "o32") | |
| flag |= ArchSpec::eMIPSABI_O32; | |
| } | |
| SetFlags(flag); | |
| } | |
| std::string ArchSpec::GetClangTargetCPU() const { | |
| std::string cpu; | |
| if (IsMIPS()) { | |
| switch (m_core) { | |
| case ArchSpec::eCore_mips32: | |
| case ArchSpec::eCore_mips32el: | |
| cpu = "mips32"; | |
| break; | |
| case ArchSpec::eCore_mips32r2: | |
| case ArchSpec::eCore_mips32r2el: | |
| cpu = "mips32r2"; | |
| break; | |
| case ArchSpec::eCore_mips32r3: | |
| case ArchSpec::eCore_mips32r3el: | |
| cpu = "mips32r3"; | |
| break; | |
| case ArchSpec::eCore_mips32r5: | |
| case ArchSpec::eCore_mips32r5el: | |
| cpu = "mips32r5"; | |
| break; | |
| case ArchSpec::eCore_mips32r6: | |
| case ArchSpec::eCore_mips32r6el: | |
| cpu = "mips32r6"; | |
| break; | |
| case ArchSpec::eCore_mips64: | |
| case ArchSpec::eCore_mips64el: | |
| cpu = "mips64"; | |
| break; | |
| case ArchSpec::eCore_mips64r2: | |
| case ArchSpec::eCore_mips64r2el: | |
| cpu = "mips64r2"; | |
| break; | |
| case ArchSpec::eCore_mips64r3: | |
| case ArchSpec::eCore_mips64r3el: | |
| cpu = "mips64r3"; | |
| break; | |
| case ArchSpec::eCore_mips64r5: | |
| case ArchSpec::eCore_mips64r5el: | |
| cpu = "mips64r5"; | |
| break; | |
| case ArchSpec::eCore_mips64r6: | |
| case ArchSpec::eCore_mips64r6el: | |
| cpu = "mips64r6"; | |
| break; | |
| default: | |
| break; | |
| } | |
| } | |
| if (GetTriple().isARM()) | |
| cpu = llvm::ARM::getARMCPUForArch(GetTriple(), "").str(); | |
| if (GetTriple().isAMDGPU()) { | |
| uint32_t sub = GetElfCPUSubType(); | |
| if (sub != LLDB_INVALID_CPUTYPE) | |
| cpu = GetAMDGPUVariantName(sub); | |
| } | |
| return cpu; | |
| } | |
| static const ArchDefinitionEntry * | |
| FindArchDefEntryIfCoreIsValid(const ArchDefinition *def, ArchSpec::Core core) { | |
| if (const CoreDefinition *core_def = FindCoreDefinition(core)) | |
| return FindArchDefinitionEntry(def, core_def->core); | |
| return nullptr; | |
| } | |
| static uint32_t GetCPUType(const ArchDefinition *def, ArchSpec::Core core) { | |
| if (const ArchDefinitionEntry *arch_def = | |
| FindArchDefEntryIfCoreIsValid(def, core)) | |
| return arch_def->cpu; | |
| return LLDB_INVALID_CPUTYPE; | |
| } | |
| static uint32_t GetCPUSubType(const ArchDefinition *def, ArchSpec::Core core) { | |
| if (const ArchDefinitionEntry *arch_def = | |
| FindArchDefEntryIfCoreIsValid(def, core)) | |
| return arch_def->sub; | |
| return LLDB_INVALID_CPUTYPE; | |
| } | |
| uint32_t ArchSpec::GetMachOCPUType() const { | |
| return GetCPUType(&g_macho_arch_def, m_core); | |
| } | |
| uint32_t ArchSpec::GetMachOCPUSubType() const { | |
| return GetCPUSubType(&g_macho_arch_def, m_core); | |
| } | |
| uint32_t ArchSpec::GetElfCPUSubType() const { | |
| return GetCPUSubType(&g_elf_arch_def, m_core); | |
| } | |
| llvm::Triple::ArchType ArchSpec::GetMachine() const { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) | |
| return core_def->machine; | |
| return llvm::Triple::UnknownArch; | |
| } | |
| uint32_t ArchSpec::GetAddressByteSize() const { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) { | |
| if (core_def->machine == llvm::Triple::mips64 || | |
| core_def->machine == llvm::Triple::mips64el) { | |
| // For N32/O32 applications Address size is 4 bytes. | |
| if (m_flags & (eMIPSABI_N32 | eMIPSABI_O32)) | |
| return 4; | |
| } | |
| return core_def->addr_byte_size; | |
| } | |
| return 0; | |
| } | |
| ByteOrder ArchSpec::GetDefaultEndian() const { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) | |
| return core_def->default_byte_order; | |
| return eByteOrderInvalid; | |
| } | |
| bool ArchSpec::CharIsSignedByDefault() const { | |
| switch (m_triple.getArch()) { | |
| default: | |
| return true; | |
| case llvm::Triple::aarch64: | |
| case llvm::Triple::aarch64_32: | |
| case llvm::Triple::aarch64_be: | |
| case llvm::Triple::arm: | |
| case llvm::Triple::armeb: | |
| case llvm::Triple::thumb: | |
| case llvm::Triple::thumbeb: | |
| return m_triple.isOSDarwin() || m_triple.isOSWindows(); | |
| case llvm::Triple::ppc: | |
| case llvm::Triple::ppc64: | |
| return m_triple.isOSDarwin(); | |
| case llvm::Triple::riscv64: | |
| case llvm::Triple::riscv32: | |
| case llvm::Triple::ppc64le: | |
| case llvm::Triple::systemz: | |
| case llvm::Triple::xcore: | |
| case llvm::Triple::arc: | |
| return false; | |
| } | |
| } | |
| lldb::ByteOrder ArchSpec::GetByteOrder() const { | |
| if (m_byte_order == eByteOrderInvalid) | |
| return GetDefaultEndian(); | |
| return m_byte_order; | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // Mutators. | |
| bool ArchSpec::SetTriple(const llvm::Triple &triple) { | |
| m_triple = triple; | |
| UpdateCore(); | |
| return IsValid(); | |
| } | |
| bool lldb_private::ParseMachCPUDashSubtypeTriple(llvm::StringRef triple_str, | |
| ArchSpec &arch) { | |
| // Accept "12-10" or "12.10" as cpu type/subtype | |
| if (triple_str.empty()) | |
| return false; | |
| size_t pos = triple_str.find_first_of("-."); | |
| if (pos == llvm::StringRef::npos) | |
| return false; | |
| llvm::StringRef cpu_str = triple_str.substr(0, pos); | |
| llvm::StringRef remainder = triple_str.substr(pos + 1); | |
| if (cpu_str.empty() || remainder.empty()) | |
| return false; | |
| llvm::StringRef sub_str; | |
| llvm::StringRef vendor; | |
| llvm::StringRef os; | |
| std::tie(sub_str, remainder) = remainder.split('-'); | |
| std::tie(vendor, os) = remainder.split('-'); | |
| uint32_t cpu = 0; | |
| uint32_t sub = 0; | |
| if (cpu_str.getAsInteger(10, cpu) || sub_str.getAsInteger(10, sub)) | |
| return false; | |
| if (!arch.SetArchitecture(eArchTypeMachO, cpu, sub)) | |
| return false; | |
| if (!vendor.empty() && !os.empty()) { | |
| arch.GetTriple().setVendorName(vendor); | |
| arch.GetTriple().setOSName(os); | |
| } | |
| return true; | |
| } | |
| bool ArchSpec::SetTriple(llvm::StringRef triple) { | |
| if (triple.empty()) { | |
| Clear(); | |
| return false; | |
| } | |
| if (ParseMachCPUDashSubtypeTriple(triple, *this)) | |
| return true; | |
| SetTriple(llvm::Triple(llvm::Triple::normalize(triple))); | |
| return IsValid(); | |
| } | |
| bool ArchSpec::ContainsOnlyArch(const llvm::Triple &normalized_triple) { | |
| return !normalized_triple.getArchName().empty() && | |
| normalized_triple.getOSName().empty() && | |
| normalized_triple.getVendorName().empty() && | |
| normalized_triple.getEnvironmentName().empty(); | |
| } | |
| void ArchSpec::MergeFrom(const ArchSpec &other) { | |
| // ios-macabi always wins over macosx. | |
| if ((GetTriple().getOS() == llvm::Triple::MacOSX || | |
| GetTriple().getOS() == llvm::Triple::UnknownOS) && | |
| other.GetTriple().getOS() == llvm::Triple::IOS && | |
| other.GetTriple().getEnvironment() == llvm::Triple::MacABI) { | |
| (*this) = other; | |
| return; | |
| } | |
| if (!TripleVendorWasSpecified() && other.TripleVendorWasSpecified()) | |
| GetTriple().setVendor(other.GetTriple().getVendor()); | |
| if (!TripleOSWasSpecified() && other.TripleOSWasSpecified()) | |
| GetTriple().setOS(other.GetTriple().getOS()); | |
| if (GetTriple().getArch() == llvm::Triple::UnknownArch) { | |
| GetTriple().setArch(other.GetTriple().getArch()); | |
| // MachO unknown64 isn't really invalid as the debugger can still obtain | |
| // information from the binary, e.g. line tables. As such, we don't update | |
| // the core here. | |
| if (other.GetCore() != eCore_uknownMach64) | |
| UpdateCore(); | |
| } | |
| if (!TripleEnvironmentWasSpecified() && | |
| other.TripleEnvironmentWasSpecified()) { | |
| GetTriple().setEnvironment(other.GetTriple().getEnvironment()); | |
| } | |
| // If this and other are both arm ArchSpecs and this ArchSpec is a generic | |
| // "some kind of arm" spec but the other ArchSpec is a specific arm core, | |
| // adopt the specific arm core. | |
| if (GetTriple().getArch() == llvm::Triple::arm && | |
| other.GetTriple().getArch() == llvm::Triple::arm && | |
| IsCompatibleMatch(other) && GetCore() == ArchSpec::eCore_arm_generic && | |
| other.GetCore() != ArchSpec::eCore_arm_generic) { | |
| m_core = other.GetCore(); | |
| CoreUpdated(false); | |
| } | |
| if (GetFlags() == 0) { | |
| SetFlags(other.GetFlags()); | |
| } | |
| } | |
| static llvm::StringRef GetAMDGPUVariantName(uint32_t sub) { | |
| switch (sub) { | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_R600: | |
| return "r600"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_R630: | |
| return "r630"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_RS880: | |
| return "rs880"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_RV670: | |
| return "rv670"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_RV710: | |
| return "rv710"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_RV730: | |
| return "rv730"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_RV770: | |
| return "rv770"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_CEDAR: | |
| return "cedar"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_CYPRESS: | |
| return "cypress"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_JUNIPER: | |
| return "juniper"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_REDWOOD: | |
| return "redwood"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_SUMO: | |
| return "sumo"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_BARTS: | |
| return "barts"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_CAICOS: | |
| return "caicos"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_CAYMAN: | |
| return "cayman"; | |
| case llvm::ELF::EF_AMDGPU_MACH_R600_TURKS: | |
| return "turks"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX600: | |
| return "gfx600"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX601: | |
| return "gfx601"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX602: | |
| return "gfx602"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX700: | |
| return "gfx700"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX701: | |
| return "gfx701"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX702: | |
| return "gfx702"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX703: | |
| return "gfx703"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX704: | |
| return "gfx704"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX705: | |
| return "gfx705"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX801: | |
| return "gfx801"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX802: | |
| return "gfx802"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX803: | |
| return "gfx803"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX805: | |
| return "gfx805"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX810: | |
| return "gfx810"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX900: | |
| return "gfx900"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX902: | |
| return "gfx902"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX904: | |
| return "gfx904"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX906: | |
| return "gfx906"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX908: | |
| return "gfx908"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX909: | |
| return "gfx909"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX90A: | |
| return "gfx90a"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX90C: | |
| return "gfx90c"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX942: | |
| return "gfx942"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX950: | |
| return "gfx950"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1010: | |
| return "gfx1010"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1011: | |
| return "gfx1011"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1012: | |
| return "gfx1012"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1013: | |
| return "gfx1013"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1030: | |
| return "gfx1030"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1031: | |
| return "gfx1031"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1032: | |
| return "gfx1032"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1033: | |
| return "gfx1033"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1034: | |
| return "gfx1034"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1035: | |
| return "gfx1035"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1036: | |
| return "gfx1036"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1100: | |
| return "gfx1100"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1101: | |
| return "gfx1101"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1102: | |
| return "gfx1102"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1103: | |
| return "gfx1103"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1150: | |
| return "gfx1150"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1151: | |
| return "gfx1151"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1152: | |
| return "gfx1152"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1153: | |
| return "gfx1153"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1154: | |
| return "gfx1154"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1170: | |
| return "gfx1170"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1171: | |
| return "gfx1171"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1172: | |
| return "gfx1172"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1200: | |
| return "gfx1200"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1201: | |
| return "gfx1201"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250_STRICT: | |
| return "gfx1250-strict"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1250: | |
| return "gfx1250"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1251: | |
| return "gfx1251"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310: | |
| return "gfx1310"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC: | |
| return "gfx9-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC: | |
| return "gfx9-4-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC: | |
| return "gfx10-1-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC: | |
| return "gfx10-3-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC: | |
| return "gfx11-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC: | |
| return "gfx12-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC: | |
| return "gfx12-5-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX11_7_GENERIC: | |
| return "gfx11-7-generic"; | |
| case llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX13_GENERIC: | |
| return "gfx13-generic"; | |
| default: | |
| break; | |
| } | |
| return llvm::StringRef("unknown"); | |
| } | |
| static ArchSpec::Core GetAMDGPUVariantToCoreR600(llvm::StringRef core_name) { | |
| return llvm::StringSwitch<ArchSpec::Core>(core_name) | |
| .Case("r600", ArchSpec::eCore_amd_gpu_r600_R600) | |
| .Case("r630", ArchSpec::eCore_amd_gpu_r600_R630) | |
| .Case("rs880", ArchSpec::eCore_amd_gpu_r600_RS880) | |
| .Case("rv670", ArchSpec::eCore_amd_gpu_r600_RV670) | |
| .Case("rv710", ArchSpec::eCore_amd_gpu_r600_RV710) | |
| .Case("rv730", ArchSpec::eCore_amd_gpu_r600_RV730) | |
| .Case("rv770", ArchSpec::eCore_amd_gpu_r600_RV770) | |
| .Case("cedar", ArchSpec::eCore_amd_gpu_r600_CEDAR) | |
| .Case("cypress", ArchSpec::eCore_amd_gpu_r600_CYPRESS) | |
| .Case("juniper", ArchSpec::eCore_amd_gpu_r600_JUNIPER) | |
| .Case("redwood", ArchSpec::eCore_amd_gpu_r600_REDWOOD) | |
| .Case("sumo", ArchSpec::eCore_amd_gpu_r600_SUMO) | |
| .Case("barts", ArchSpec::eCore_amd_gpu_r600_BARTS) | |
| .Case("caicos", ArchSpec::eCore_amd_gpu_r600_CAICOS) | |
| .Case("cayman", ArchSpec::eCore_amd_gpu_r600_CAYMAN) | |
| .Case("turks", ArchSpec::eCore_amd_gpu_r600_TURKS) | |
| .Default(ArchSpec::eCore_amd_gpu_unknown); | |
| } | |
| static ArchSpec::Core GetAMDGPUVariantToCoreGCN(llvm::StringRef core_name) { | |
| return llvm::StringSwitch<ArchSpec::Core>(core_name) | |
| .Case("gfx600", ArchSpec::eCore_amd_gpu_gcn_GFX600) | |
| .Case("gfx601", ArchSpec::eCore_amd_gpu_gcn_GFX601) | |
| .Case("gfx602", ArchSpec::eCore_amd_gpu_gcn_GFX602) | |
| .Case("gfx700", ArchSpec::eCore_amd_gpu_gcn_GFX700) | |
| .Case("gfx701", ArchSpec::eCore_amd_gpu_gcn_GFX701) | |
| .Case("gfx702", ArchSpec::eCore_amd_gpu_gcn_GFX702) | |
| .Case("gfx703", ArchSpec::eCore_amd_gpu_gcn_GFX703) | |
| .Case("gfx704", ArchSpec::eCore_amd_gpu_gcn_GFX704) | |
| .Case("gfx705", ArchSpec::eCore_amd_gpu_gcn_GFX705) | |
| .Case("gfx801", ArchSpec::eCore_amd_gpu_gcn_GFX801) | |
| .Case("gfx802", ArchSpec::eCore_amd_gpu_gcn_GFX802) | |
| .Case("gfx803", ArchSpec::eCore_amd_gpu_gcn_GFX803) | |
| .Case("gfx805", ArchSpec::eCore_amd_gpu_gcn_GFX805) | |
| .Case("gfx810", ArchSpec::eCore_amd_gpu_gcn_GFX810) | |
| .Case("gfx900", ArchSpec::eCore_amd_gpu_gcn_GFX900) | |
| .Case("gfx902", ArchSpec::eCore_amd_gpu_gcn_GFX902) | |
| .Case("gfx904", ArchSpec::eCore_amd_gpu_gcn_GFX904) | |
| .Case("gfx906", ArchSpec::eCore_amd_gpu_gcn_GFX906) | |
| .Case("gfx908", ArchSpec::eCore_amd_gpu_gcn_GFX908) | |
| .Case("gfx909", ArchSpec::eCore_amd_gpu_gcn_GFX909) | |
| .Case("gfx90a", ArchSpec::eCore_amd_gpu_gcn_GFX90A) | |
| .Case("gfx90c", ArchSpec::eCore_amd_gpu_gcn_GFX90C) | |
| .Case("gfx942", ArchSpec::eCore_amd_gpu_gcn_GFX942) | |
| .Case("gfx950", ArchSpec::eCore_amd_gpu_gcn_GFX950) | |
| .Case("gfx1010", ArchSpec::eCore_amd_gpu_gcn_GFX1010) | |
| .Case("gfx1011", ArchSpec::eCore_amd_gpu_gcn_GFX1011) | |
| .Case("gfx1012", ArchSpec::eCore_amd_gpu_gcn_GFX1012) | |
| .Case("gfx1013", ArchSpec::eCore_amd_gpu_gcn_GFX1013) | |
| .Case("gfx1030", ArchSpec::eCore_amd_gpu_gcn_GFX1030) | |
| .Case("gfx1031", ArchSpec::eCore_amd_gpu_gcn_GFX1031) | |
| .Case("gfx1032", ArchSpec::eCore_amd_gpu_gcn_GFX1032) | |
| .Case("gfx1033", ArchSpec::eCore_amd_gpu_gcn_GFX1033) | |
| .Case("gfx1034", ArchSpec::eCore_amd_gpu_gcn_GFX1034) | |
| .Case("gfx1035", ArchSpec::eCore_amd_gpu_gcn_GFX1035) | |
| .Case("gfx1036", ArchSpec::eCore_amd_gpu_gcn_GFX1036) | |
| .Case("gfx1100", ArchSpec::eCore_amd_gpu_gcn_GFX1100) | |
| .Case("gfx1101", ArchSpec::eCore_amd_gpu_gcn_GFX1101) | |
| .Case("gfx1102", ArchSpec::eCore_amd_gpu_gcn_GFX1102) | |
| .Case("gfx1103", ArchSpec::eCore_amd_gpu_gcn_GFX1103) | |
| .Case("gfx1150", ArchSpec::eCore_amd_gpu_gcn_GFX1150) | |
| .Case("gfx1151", ArchSpec::eCore_amd_gpu_gcn_GFX1151) | |
| .Case("gfx1152", ArchSpec::eCore_amd_gpu_gcn_GFX1152) | |
| .Case("gfx1153", ArchSpec::eCore_amd_gpu_gcn_GFX1153) | |
| .Case("gfx1154", ArchSpec::eCore_amd_gpu_gcn_GFX1154) | |
| .Case("gfx1170", ArchSpec::eCore_amd_gpu_gcn_GFX1170) | |
| .Case("gfx1171", ArchSpec::eCore_amd_gpu_gcn_GFX1171) | |
| .Case("gfx1172", ArchSpec::eCore_amd_gpu_gcn_GFX1172) | |
| .Case("gfx1200", ArchSpec::eCore_amd_gpu_gcn_GFX1200) | |
| .Case("gfx1201", ArchSpec::eCore_amd_gpu_gcn_GFX1201) | |
| .Case("gfx1250-strict", ArchSpec::eCore_amd_gpu_gcn_GFX1250_STRICT) | |
| .Case("gfx1250", ArchSpec::eCore_amd_gpu_gcn_GFX1250) | |
| .Case("gfx1251", ArchSpec::eCore_amd_gpu_gcn_GFX1251) | |
| .Case("gfx1310", ArchSpec::eCore_amd_gpu_gcn_GFX1310) | |
| .Case("gfx9-generic", ArchSpec::eCore_amd_gpu_gcn_GFX9_GENERIC) | |
| .Case("gfx9-4-generic", ArchSpec::eCore_amd_gpu_gcn_GFX9_4_GENERIC) | |
| .Case("gfx10-1-generic", ArchSpec::eCore_amd_gpu_gcn_GFX10_1_GENERIC) | |
| .Case("gfx10-3-generic", ArchSpec::eCore_amd_gpu_gcn_GFX10_3_GENERIC) | |
| .Case("gfx11-generic", ArchSpec::eCore_amd_gpu_gcn_GFX11_GENERIC) | |
| .Case("gfx12-generic", ArchSpec::eCore_amd_gpu_gcn_GFX12_GENERIC) | |
| .Case("gfx12-5-generic", ArchSpec::eCore_amd_gpu_gcn_GFX12_5_GENERIC) | |
| .Case("gfx11-7-generic", ArchSpec::eCore_amd_gpu_gcn_GFX11_7_GENERIC) | |
| .Case("gfx13-generic", ArchSpec::eCore_amd_gpu_gcn_GFX13_GENERIC) | |
| .Default(ArchSpec::eCore_amd_gpu_unknown); | |
| } | |
| bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu, | |
| uint32_t sub, uint32_t os) { | |
| m_core = kCore_invalid; | |
| bool update_triple = true; | |
| const ArchDefinition *arch_def = FindArchDefinition(arch_type); | |
| if (arch_def) { | |
| const ArchDefinitionEntry *arch_def_entry = | |
| FindArchDefinitionEntry(arch_def, cpu, sub); | |
| if (arch_def_entry) { | |
| const CoreDefinition *core_def = FindCoreDefinition(arch_def_entry->core); | |
| if (core_def) { | |
| m_core = core_def->core; | |
| update_triple = false; | |
| // Always use the architecture name because it might be more | |
| // descriptive than the architecture enum ("armv7" -> | |
| // llvm::Triple::arm). | |
| m_triple.setArchName(llvm::StringRef(core_def->name)); | |
| if (arch_type == eArchTypeMachO) { | |
| m_triple.setVendor(llvm::Triple::Apple); | |
| // Don't set the OS. It could be simulator, macosx, ios, watchos, | |
| // tvos, bridgeos. We could get close with the cpu type - but we | |
| // can't get it right all of the time. Better to leave this unset | |
| // so other sections of code will set it when they have more | |
| // information. NB: don't call m_triple.setOS | |
| // (llvm::Triple::UnknownOS). That sets the OSName to "unknown" and | |
| // the ArchSpec::TripleVendorWasSpecified() method says that any | |
| // OSName setting means it was specified. | |
| } else if (arch_type == eArchTypeELF) { | |
| switch (os) { | |
| case llvm::ELF::ELFOSABI_AIX: | |
| m_triple.setOS(llvm::Triple::OSType::AIX); | |
| break; | |
| case llvm::ELF::ELFOSABI_FREEBSD: | |
| m_triple.setOS(llvm::Triple::OSType::FreeBSD); | |
| break; | |
| case llvm::ELF::ELFOSABI_GNU: | |
| m_triple.setOS(llvm::Triple::OSType::Linux); | |
| break; | |
| case llvm::ELF::ELFOSABI_NETBSD: | |
| m_triple.setOS(llvm::Triple::OSType::NetBSD); | |
| break; | |
| case llvm::ELF::ELFOSABI_OPENBSD: | |
| m_triple.setOS(llvm::Triple::OSType::OpenBSD); | |
| break; | |
| case llvm::ELF::ELFOSABI_SOLARIS: | |
| m_triple.setOS(llvm::Triple::OSType::Solaris); | |
| break; | |
| case llvm::ELF::ELFOSABI_STANDALONE: | |
| m_triple.setOS(llvm::Triple::OSType::UnknownOS); | |
| break; | |
| case llvm::ELF::ELFOSABI_AMDGPU_HSA: | |
| m_triple.setVendor(llvm::Triple::VendorType::AMD); | |
| m_triple.setOS(llvm::Triple::OSType::AMDHSA); | |
| break; | |
| } | |
| } else if (arch_type == eArchTypeCOFF && os == llvm::Triple::Win32) { | |
| m_triple.setVendor(llvm::Triple::PC); | |
| m_triple.setOS(llvm::Triple::Win32); | |
| } else if (arch_type == eArchTypeXCOFF && os == llvm::Triple::AIX) { | |
| m_triple.setVendor(llvm::Triple::IBM); | |
| m_triple.setOS(llvm::Triple::AIX); | |
| } else { | |
| m_triple.setVendor(llvm::Triple::UnknownVendor); | |
| m_triple.setOS(llvm::Triple::UnknownOS); | |
| } | |
| switch (m_triple.getArch()) { | |
| case llvm::Triple::UnknownArch: | |
| // Fall back onto setting the machine type if the arch by name | |
| // failed... | |
| m_triple.setArch(core_def->machine); | |
| break; | |
| case llvm::Triple::r600: | |
| case llvm::Triple::amdgpu: { | |
| // AMDGPU arches are special: they append a 5th element to the triple | |
| // that comes after the environment and contains the sub type name. | |
| std::string environment("-"); | |
| environment += GetAMDGPUVariantName(arch_def_entry->sub); | |
| m_triple.setEnvironmentName(environment); | |
| break; | |
| } | |
| default: | |
| break; | |
| } | |
| } | |
| } else { | |
| Log *log(GetLog(LLDBLog::Target | LLDBLog::Process | LLDBLog::Platform)); | |
| LLDB_LOGF(log, | |
| "Unable to find a core definition for cpu 0x%" PRIx32 | |
| " sub %" PRId32, | |
| cpu, sub); | |
| } | |
| } | |
| CoreUpdated(update_triple); | |
| return IsValid(); | |
| } | |
| uint32_t ArchSpec::GetMinimumOpcodeByteSize() const { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) | |
| return core_def->min_opcode_byte_size; | |
| return 0; | |
| } | |
| uint32_t ArchSpec::GetMaximumOpcodeByteSize() const { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) | |
| return core_def->max_opcode_byte_size; | |
| return 0; | |
| } | |
| static bool IsCompatibleEnvironment(llvm::Triple::EnvironmentType lhs, | |
| llvm::Triple::EnvironmentType rhs) { | |
| if (lhs == rhs) | |
| return true; | |
| // Apple simulators are a different platform than what they simulate. | |
| // As the environments are different at this point, if one of them is a | |
| // simulator, then they are different. | |
| if (lhs == llvm::Triple::Simulator || rhs == llvm::Triple::Simulator) | |
| return false; | |
| // If any of the environment is unknown then they are compatible | |
| if (lhs == llvm::Triple::UnknownEnvironment || | |
| rhs == llvm::Triple::UnknownEnvironment) | |
| return true; | |
| // If one of the environment is Android and the other one is EABI then they | |
| // are considered to be compatible. This is required as a workaround for | |
| // shared libraries compiled for Android without the NOTE section indicating | |
| // that they are using the Android ABI. | |
| if ((lhs == llvm::Triple::Android && rhs == llvm::Triple::EABI) || | |
| (rhs == llvm::Triple::Android && lhs == llvm::Triple::EABI) || | |
| (lhs == llvm::Triple::GNUEABI && rhs == llvm::Triple::EABI) || | |
| (rhs == llvm::Triple::GNUEABI && lhs == llvm::Triple::EABI) || | |
| (lhs == llvm::Triple::GNUEABIHF && rhs == llvm::Triple::EABIHF) || | |
| (rhs == llvm::Triple::GNUEABIHF && lhs == llvm::Triple::EABIHF)) | |
| return true; | |
| return false; | |
| } | |
| bool ArchSpec::IsMatch(const ArchSpec &rhs, MatchType match) const { | |
| if (GetByteOrder() != rhs.GetByteOrder() || | |
| !cores_match(GetCore(), rhs.GetCore(), match == ExactMatch)) | |
| return false; | |
| const llvm::Triple &lhs_triple = GetTriple(); | |
| const llvm::Triple &rhs_triple = rhs.GetTriple(); | |
| const llvm::Triple::VendorType lhs_triple_vendor = lhs_triple.getVendor(); | |
| const llvm::Triple::VendorType rhs_triple_vendor = rhs_triple.getVendor(); | |
| const llvm::Triple::OSType lhs_triple_os = lhs_triple.getOS(); | |
| const llvm::Triple::OSType rhs_triple_os = rhs_triple.getOS(); | |
| bool both_windows = lhs_triple.isOSWindows() && rhs_triple.isOSWindows(); | |
| // On Windows, the vendor field doesn't have any practical effect, but | |
| // it is often set to either "pc" or "w64". | |
| if ((lhs_triple_vendor != rhs_triple_vendor) && | |
| (match == ExactMatch || !both_windows)) { | |
| const bool rhs_vendor_specified = rhs.TripleVendorWasSpecified(); | |
| const bool lhs_vendor_specified = TripleVendorWasSpecified(); | |
| // Both architectures had the vendor specified, so if they aren't equal | |
| // then we return false | |
| if (rhs_vendor_specified && lhs_vendor_specified) | |
| return false; | |
| // Only fail if both vendor types are not unknown | |
| if (lhs_triple_vendor != llvm::Triple::UnknownVendor && | |
| rhs_triple_vendor != llvm::Triple::UnknownVendor) | |
| return false; | |
| } | |
| const llvm::Triple::EnvironmentType lhs_triple_env = | |
| lhs_triple.getEnvironment(); | |
| const llvm::Triple::EnvironmentType rhs_triple_env = | |
| rhs_triple.getEnvironment(); | |
| if (match == CompatibleMatch) { | |
| // x86_64-apple-ios-macabi, x86_64-apple-macosx are compatible, no match. | |
| if ((lhs_triple_os == llvm::Triple::IOS && | |
| lhs_triple_env == llvm::Triple::MacABI && | |
| rhs_triple_os == llvm::Triple::MacOSX) || | |
| (lhs_triple_os == llvm::Triple::MacOSX && | |
| rhs_triple_os == llvm::Triple::IOS && | |
| rhs_triple_env == llvm::Triple::MacABI)) | |
| return true; | |
| // x86_64-apple-driverkit, x86_64-apple-macosx are compatible, no match. | |
| if ((lhs_triple_os == llvm::Triple::DriverKit && | |
| rhs_triple_os == llvm::Triple::MacOSX) || | |
| (lhs_triple_os == llvm::Triple::MacOSX && | |
| rhs_triple_os == llvm::Triple::DriverKit)) | |
| return true; | |
| } | |
| // x86_64-apple-ios-macabi and x86_64-apple-ios are not compatible. | |
| if (lhs_triple_os == llvm::Triple::IOS && | |
| rhs_triple_os == llvm::Triple::IOS && | |
| (lhs_triple_env == llvm::Triple::MacABI || | |
| rhs_triple_env == llvm::Triple::MacABI) && | |
| lhs_triple_env != rhs_triple_env) | |
| return false; | |
| if (lhs_triple_os != rhs_triple_os) { | |
| const bool lhs_os_specified = TripleOSWasSpecified(); | |
| const bool rhs_os_specified = rhs.TripleOSWasSpecified(); | |
| // If both OS types are specified and different, fail. | |
| if (lhs_os_specified && rhs_os_specified) | |
| return false; | |
| // If the pair of os+env is both unspecified, match any other os+env combo. | |
| if (match == CompatibleMatch && | |
| ((!lhs_os_specified && !lhs_triple.hasEnvironment()) || | |
| (!rhs_os_specified && !rhs_triple.hasEnvironment()))) | |
| return true; | |
| } | |
| if (match == CompatibleMatch && both_windows) | |
| return true; // The Windows environments (MSVC vs GNU) are compatible | |
| return IsCompatibleEnvironment(lhs_triple_env, rhs_triple_env); | |
| } | |
| void ArchSpec::UpdateCore() { | |
| llvm::StringRef arch_name(m_triple.getArchName()); | |
| const CoreDefinition *core_def = FindCoreDefinition(arch_name); | |
| if (core_def) { | |
| m_core = core_def->core; | |
| // Set the byte order to the default byte order for an architecture. This | |
| // can be modified if needed for cases when cores handle both big and | |
| // little endian | |
| m_byte_order = core_def->default_byte_order; | |
| // amdgpu/r600 match their first table entry (GFX600/R600), so refine the | |
| // core from the model in the triple environment. | |
| if (m_core == eCore_amd_gpu_gcn_GFX600) { | |
| m_core = GetAMDGPUVariantToCoreGCN( | |
| m_triple.getEnvironmentName().split('-').second); | |
| } else if (m_core == eCore_amd_gpu_r600_R600) { | |
| m_core = GetAMDGPUVariantToCoreR600( | |
| m_triple.getEnvironmentName().split('-').second); | |
| } | |
| } else { | |
| Clear(); | |
| } | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // Helper methods. | |
| void ArchSpec::CoreUpdated(bool update_triple) { | |
| const CoreDefinition *core_def = FindCoreDefinition(m_core); | |
| if (core_def) { | |
| if (update_triple) | |
| m_triple = llvm::Triple(core_def->name, "unknown", "unknown"); | |
| m_byte_order = core_def->default_byte_order; | |
| } else { | |
| if (update_triple) | |
| m_triple = llvm::Triple(); | |
| m_byte_order = eByteOrderInvalid; | |
| } | |
| } | |
| //===----------------------------------------------------------------------===// | |
| // Operators. | |
| // Checks core1's rules only, because they are not symmetric. Must not call | |
| // cores_match() here, or an unmatched pair would loop between the two | |
| // directions forever. | |
| static bool cores_match_one_direction(const ArchSpec::Core core1, | |
| const ArchSpec::Core core2, | |
| bool enforce_exact_match) { | |
| switch (core1) { | |
| case ArchSpec::kCore_any: | |
| return true; | |
| case ArchSpec::eCore_arm_generic: | |
| if (enforce_exact_match) | |
| break; | |
| [[fallthrough]]; | |
| case ArchSpec::kCore_arm_any: | |
| if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last) | |
| return true; | |
| if (core2 >= ArchSpec::kCore_thumb_first && | |
| core2 <= ArchSpec::kCore_thumb_last) | |
| return true; | |
| if (core2 == ArchSpec::kCore_arm_any) | |
| return true; | |
| break; | |
| case ArchSpec::kCore_x86_32_any: | |
| if ((core2 >= ArchSpec::kCore_x86_32_first && | |
| core2 <= ArchSpec::kCore_x86_32_last) || | |
| (core2 == ArchSpec::kCore_x86_32_any)) | |
| return true; | |
| break; | |
| case ArchSpec::kCore_x86_64_any: | |
| if ((core2 >= ArchSpec::kCore_x86_64_first && | |
| core2 <= ArchSpec::kCore_x86_64_last) || | |
| (core2 == ArchSpec::kCore_x86_64_any)) | |
| return true; | |
| break; | |
| case ArchSpec::kCore_ppc_any: | |
| if ((core2 >= ArchSpec::kCore_ppc_first && | |
| core2 <= ArchSpec::kCore_ppc_last) || | |
| (core2 == ArchSpec::kCore_ppc_any)) | |
| return true; | |
| break; | |
| case ArchSpec::kCore_ppc64_any: | |
| if ((core2 >= ArchSpec::kCore_ppc64_first && | |
| core2 <= ArchSpec::kCore_ppc64_last) || | |
| (core2 == ArchSpec::kCore_ppc64_any)) | |
| return true; | |
| break; | |
| case ArchSpec::kCore_hexagon_any: | |
| if ((core2 >= ArchSpec::kCore_hexagon_first && | |
| core2 <= ArchSpec::kCore_hexagon_last) || | |
| (core2 == ArchSpec::kCore_hexagon_any)) | |
| return true; | |
| break; | |
| // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization | |
| // Cortex-M0 - ARMv6-M - armv6m | |
| // Cortex-M3 - ARMv7-M - armv7m | |
| // Cortex-M4 - ARMv7E-M - armv7em | |
| case ArchSpec::eCore_arm_armv7em: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_generic) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7m) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv6m) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7) | |
| return true; | |
| } | |
| break; | |
| // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization | |
| // Cortex-M0 - ARMv6-M - armv6m | |
| // Cortex-M3 - ARMv7-M - armv7m | |
| // Cortex-M4 - ARMv7E-M - armv7em | |
| case ArchSpec::eCore_arm_armv7m: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_generic) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv6m) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7em) | |
| return true; | |
| } | |
| break; | |
| // v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization | |
| // Cortex-M0 - ARMv6-M - armv6m | |
| // Cortex-M3 - ARMv7-M - armv7m | |
| // Cortex-M4 - ARMv7E-M - armv7em | |
| case ArchSpec::eCore_arm_armv6m: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_generic) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7em) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv6m) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_armv7f: | |
| case ArchSpec::eCore_arm_armv7k: | |
| case ArchSpec::eCore_arm_armv7s: | |
| case ArchSpec::eCore_arm_armv7l: | |
| case ArchSpec::eCore_arm_armv8l: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_generic) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv7) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_x86_64_x86_64h: | |
| case ArchSpec::eCore_x86_64_amd64: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_x86_64_x86_64) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_armv8: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_arm64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_aarch64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64e) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64ex1) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_arm64e: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_arm64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_aarch64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv8) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64ex1) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_aarch64: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_arm64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv8) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64e) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64ex1) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_arm64: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_aarch64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv8) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64e) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64ex1) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_arm64ex1: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_arm64e) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_arm64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_aarch64) | |
| return true; | |
| if (core2 == ArchSpec::eCore_arm_armv8) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_arm_arm64_32: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_arm_generic) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips32: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32_first && | |
| core2 <= ArchSpec::kCore_mips32_last) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips32el: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32el_first && | |
| core2 <= ArchSpec::kCore_mips32el_last) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips64: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32_first && | |
| core2 <= ArchSpec::kCore_mips32_last) | |
| return true; | |
| if (core2 >= ArchSpec::kCore_mips64_first && | |
| core2 <= ArchSpec::kCore_mips64_last) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips64el: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32el_first && | |
| core2 <= ArchSpec::kCore_mips32el_last) | |
| return true; | |
| if (core2 >= ArchSpec::kCore_mips64el_first && | |
| core2 <= ArchSpec::kCore_mips64el_last) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips64r2: | |
| case ArchSpec::eCore_mips64r3: | |
| case ArchSpec::eCore_mips64r5: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32_first && core2 <= (core1 - 10)) | |
| return true; | |
| if (core2 >= ArchSpec::kCore_mips64_first && core2 <= (core1 - 1)) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips64r2el: | |
| case ArchSpec::eCore_mips64r3el: | |
| case ArchSpec::eCore_mips64r5el: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= (core1 - 10)) | |
| return true; | |
| if (core2 >= ArchSpec::kCore_mips64el_first && core2 <= (core1 - 1)) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips32r2: | |
| case ArchSpec::eCore_mips32r3: | |
| case ArchSpec::eCore_mips32r5: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32_first && core2 <= core1) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips32r2el: | |
| case ArchSpec::eCore_mips32r3el: | |
| case ArchSpec::eCore_mips32r5el: | |
| if (!enforce_exact_match) { | |
| if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= core1) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips32r6: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips32r6el: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_mips32el || | |
| core2 == ArchSpec::eCore_mips32r6el) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips64r6: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6) | |
| return true; | |
| if (core2 == ArchSpec::eCore_mips64 || core2 == ArchSpec::eCore_mips64r6) | |
| return true; | |
| } | |
| break; | |
| case ArchSpec::eCore_mips64r6el: | |
| if (!enforce_exact_match) { | |
| if (core2 == ArchSpec::eCore_mips32el || | |
| core2 == ArchSpec::eCore_mips32r6el) | |
| return true; | |
| if (core2 == ArchSpec::eCore_mips64el || | |
| core2 == ArchSpec::eCore_mips64r6el) | |
| return true; | |
| } | |
| break; | |
| default: | |
| break; | |
| } | |
| return false; | |
| } | |
| // The match rules only work in one direction, so this checks both ways. | |
| static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2, | |
| bool enforce_exact_match) { | |
| if (core1 == core2) | |
| return true; | |
| return cores_match_one_direction(core1, core2, enforce_exact_match) || | |
| cores_match_one_direction(core2, core1, enforce_exact_match); | |
| } | |
| bool lldb_private::operator<(const ArchSpec &lhs, const ArchSpec &rhs) { | |
| const ArchSpec::Core lhs_core = lhs.GetCore(); | |
| const ArchSpec::Core rhs_core = rhs.GetCore(); | |
| return lhs_core < rhs_core; | |
| } | |
| bool lldb_private::operator==(const ArchSpec &lhs, const ArchSpec &rhs) { | |
| return lhs.GetCore() == rhs.GetCore(); | |
| } | |
| bool lldb_private::operator!=(const ArchSpec &lhs, const ArchSpec &rhs) { | |
| return !(lhs == rhs); | |
| } | |
| bool ArchSpec::IsFullySpecifiedTriple() const { | |
| if (!TripleOSWasSpecified()) | |
| return false; | |
| if (!TripleVendorWasSpecified()) | |
| return false; | |
| const unsigned unspecified = 0; | |
| const llvm::Triple &triple = GetTriple(); | |
| if (triple.isOSDarwin() && triple.getOSMajorVersion() == unspecified) | |
| return false; | |
| return true; | |
| } | |
| bool ArchSpec::IsAlwaysThumbInstructions() const { | |
| if (GetTriple().getArch() == llvm::Triple::arm || | |
| GetTriple().getArch() == llvm::Triple::thumb) { | |
| // v. https://en.wikipedia.org/wiki/ARM_Cortex-M | |
| // | |
| // Cortex-M0 through Cortex-M7 are ARM processor cores which can only | |
| // execute thumb instructions. We map the cores to arch names like this: | |
| // | |
| // Cortex-M0, Cortex-M0+, Cortex-M1: armv6m Cortex-M3: armv7m Cortex-M4, | |
| // Cortex-M7: armv7em | |
| if (GetCore() == ArchSpec::Core::eCore_arm_armv7m || | |
| GetCore() == ArchSpec::Core::eCore_arm_armv7em || | |
| GetCore() == ArchSpec::Core::eCore_arm_armv6m || | |
| GetCore() == ArchSpec::Core::eCore_thumbv7m || | |
| GetCore() == ArchSpec::Core::eCore_thumbv7em || | |
| GetCore() == ArchSpec::Core::eCore_thumbv6m) { | |
| return true; | |
| } | |
| // Windows on ARM is always thumb. | |
| if (GetTriple().isOSWindows()) | |
| return true; | |
| } | |
| return false; | |
| } | |
| void ArchSpec::DumpTriple(llvm::raw_ostream &s) const { | |
| const llvm::Triple &triple = GetTriple(); | |
| llvm::StringRef arch_str = triple.getArchName(); | |
| llvm::StringRef vendor_str = triple.getVendorName(); | |
| llvm::StringRef os_str = triple.getOSName(); | |
| llvm::StringRef environ_str = triple.getEnvironmentName(); | |
| s << llvm::formatv("{0}-{1}-{2}", arch_str.empty() ? "*" : arch_str, | |
| vendor_str.empty() ? "*" : vendor_str, | |
| os_str.empty() ? "*" : os_str); | |
| if (!environ_str.empty()) | |
| s << "-" << environ_str; | |
| } |