Path: blob/main/contrib/llvm-project/lldb/source/Utility/ArchSpec.cpp
39587 views
//===-- ArchSpec.cpp ------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Utility/ArchSpec.h"9#include "lldb/Utility/LLDBLog.h"1011#include "lldb/Utility/Log.h"12#include "lldb/Utility/StringList.h"13#include "lldb/lldb-defines.h"14#include "llvm/ADT/STLExtras.h"15#include "llvm/BinaryFormat/COFF.h"16#include "llvm/BinaryFormat/ELF.h"17#include "llvm/BinaryFormat/MachO.h"18#include "llvm/Support/Compiler.h"19#include "llvm/TargetParser/ARMTargetParser.h"2021using namespace lldb;22using namespace lldb_private;2324static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2,25bool try_inverse, bool enforce_exact_match);2627namespace lldb_private {2829struct CoreDefinition {30ByteOrder default_byte_order;31uint32_t addr_byte_size;32uint32_t min_opcode_byte_size;33uint32_t max_opcode_byte_size;34llvm::Triple::ArchType machine;35ArchSpec::Core core;36const char *const name;37};3839} // namespace lldb_private4041// This core information can be looked using the ArchSpec::Core as the index42static const CoreDefinition g_core_definitions[] = {43{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_generic,44"arm"},45{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv4,46"armv4"},47{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv4t,48"armv4t"},49{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5,50"armv5"},51{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5e,52"armv5e"},53{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv5t,54"armv5t"},55{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv6,56"armv6"},57{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv6m,58"armv6m"},59{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7,60"armv7"},61{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7l,62"armv7l"},63{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7f,64"armv7f"},65{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7s,66"armv7s"},67{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7k,68"armv7k"},69{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7m,70"armv7m"},71{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv7em,72"armv7em"},73{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_xscale,74"xscale"},75{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumb,76"thumb"},77{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv4t,78"thumbv4t"},79{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv5,80"thumbv5"},81{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv5e,82"thumbv5e"},83{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv6,84"thumbv6"},85{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv6m,86"thumbv6m"},87{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7,88"thumbv7"},89{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7f,90"thumbv7f"},91{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7s,92"thumbv7s"},93{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7k,94"thumbv7k"},95{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7m,96"thumbv7m"},97{eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb, ArchSpec::eCore_thumbv7em,98"thumbv7em"},99{eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,100ArchSpec::eCore_arm_arm64, "arm64"},101{eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,102ArchSpec::eCore_arm_armv8, "armv8"},103{eByteOrderLittle, 4, 2, 4, llvm::Triple::arm, ArchSpec::eCore_arm_armv8l,104"armv8l"},105{eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,106ArchSpec::eCore_arm_arm64e, "arm64e"},107{eByteOrderLittle, 4, 4, 4, llvm::Triple::aarch64_32,108ArchSpec::eCore_arm_arm64_32, "arm64_32"},109{eByteOrderLittle, 8, 4, 4, llvm::Triple::aarch64,110ArchSpec::eCore_arm_aarch64, "aarch64"},111112// mips32, mips32r2, mips32r3, mips32r5, mips32r6113{eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32,114"mips"},115{eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r2,116"mipsr2"},117{eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r3,118"mipsr3"},119{eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r5,120"mipsr5"},121{eByteOrderBig, 4, 2, 4, llvm::Triple::mips, ArchSpec::eCore_mips32r6,122"mipsr6"},123{eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel, ArchSpec::eCore_mips32el,124"mipsel"},125{eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,126ArchSpec::eCore_mips32r2el, "mipsr2el"},127{eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,128ArchSpec::eCore_mips32r3el, "mipsr3el"},129{eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,130ArchSpec::eCore_mips32r5el, "mipsr5el"},131{eByteOrderLittle, 4, 2, 4, llvm::Triple::mipsel,132ArchSpec::eCore_mips32r6el, "mipsr6el"},133134// mips64, mips64r2, mips64r3, mips64r5, mips64r6135{eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64,136"mips64"},137{eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r2,138"mips64r2"},139{eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r3,140"mips64r3"},141{eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r5,142"mips64r5"},143{eByteOrderBig, 8, 2, 4, llvm::Triple::mips64, ArchSpec::eCore_mips64r6,144"mips64r6"},145{eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,146ArchSpec::eCore_mips64el, "mips64el"},147{eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,148ArchSpec::eCore_mips64r2el, "mips64r2el"},149{eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,150ArchSpec::eCore_mips64r3el, "mips64r3el"},151{eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,152ArchSpec::eCore_mips64r5el, "mips64r5el"},153{eByteOrderLittle, 8, 2, 4, llvm::Triple::mips64el,154ArchSpec::eCore_mips64r6el, "mips64r6el"},155156// MSP430157{eByteOrderLittle, 2, 2, 4, llvm::Triple::msp430, ArchSpec::eCore_msp430,158"msp430"},159160{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_generic,161"powerpc"},162{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc601,163"ppc601"},164{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc602,165"ppc602"},166{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603,167"ppc603"},168{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603e,169"ppc603e"},170{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc603ev,171"ppc603ev"},172{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc604,173"ppc604"},174{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc604e,175"ppc604e"},176{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc620,177"ppc620"},178{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc750,179"ppc750"},180{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc7400,181"ppc7400"},182{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc7450,183"ppc7450"},184{eByteOrderBig, 4, 4, 4, llvm::Triple::ppc, ArchSpec::eCore_ppc_ppc970,185"ppc970"},186187{eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64le,188ArchSpec::eCore_ppc64le_generic, "powerpc64le"},189{eByteOrderBig, 8, 4, 4, llvm::Triple::ppc64, ArchSpec::eCore_ppc64_generic,190"powerpc64"},191{eByteOrderBig, 8, 4, 4, llvm::Triple::ppc64,192ArchSpec::eCore_ppc64_ppc970_64, "ppc970-64"},193194{eByteOrderBig, 8, 2, 6, llvm::Triple::systemz,195ArchSpec::eCore_s390x_generic, "s390x"},196197{eByteOrderLittle, 4, 4, 4, llvm::Triple::sparc,198ArchSpec::eCore_sparc_generic, "sparc"},199{eByteOrderLittle, 8, 4, 4, llvm::Triple::sparcv9,200ArchSpec::eCore_sparc9_generic, "sparcv9"},201202{eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i386,203"i386"},204{eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i486,205"i486"},206{eByteOrderLittle, 4, 1, 15, llvm::Triple::x86,207ArchSpec::eCore_x86_32_i486sx, "i486sx"},208{eByteOrderLittle, 4, 1, 15, llvm::Triple::x86, ArchSpec::eCore_x86_32_i686,209"i686"},210211{eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64,212ArchSpec::eCore_x86_64_x86_64, "x86_64"},213{eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64,214ArchSpec::eCore_x86_64_x86_64h, "x86_64h"},215{eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon,216ArchSpec::eCore_hexagon_generic, "hexagon"},217{eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon,218ArchSpec::eCore_hexagon_hexagonv4, "hexagonv4"},219{eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon,220ArchSpec::eCore_hexagon_hexagonv5, "hexagonv5"},221222{eByteOrderLittle, 4, 2, 4, llvm::Triple::riscv32, ArchSpec::eCore_riscv32,223"riscv32"},224{eByteOrderLittle, 8, 2, 4, llvm::Triple::riscv64, ArchSpec::eCore_riscv64,225"riscv64"},226227{eByteOrderLittle, 4, 4, 4, llvm::Triple::loongarch32,228ArchSpec::eCore_loongarch32, "loongarch32"},229{eByteOrderLittle, 8, 4, 4, llvm::Triple::loongarch64,230ArchSpec::eCore_loongarch64, "loongarch64"},231232{eByteOrderLittle, 4, 4, 4, llvm::Triple::UnknownArch,233ArchSpec::eCore_uknownMach32, "unknown-mach-32"},234{eByteOrderLittle, 8, 4, 4, llvm::Triple::UnknownArch,235ArchSpec::eCore_uknownMach64, "unknown-mach-64"},236{eByteOrderLittle, 4, 2, 4, llvm::Triple::arc, ArchSpec::eCore_arc, "arc"},237238{eByteOrderLittle, 2, 2, 4, llvm::Triple::avr, ArchSpec::eCore_avr, "avr"},239240{eByteOrderLittle, 4, 1, 4, llvm::Triple::wasm32, ArchSpec::eCore_wasm32,241"wasm32"},242};243244// Ensure that we have an entry in the g_core_definitions for each core. If you245// comment out an entry above, you will need to comment out the corresponding246// ArchSpec::Core enumeration.247static_assert(sizeof(g_core_definitions) / sizeof(CoreDefinition) ==248ArchSpec::kNumCores,249"make sure we have one core definition for each core");250251struct ArchDefinitionEntry {252ArchSpec::Core core;253uint32_t cpu;254uint32_t sub;255uint32_t cpu_mask;256uint32_t sub_mask;257};258259struct ArchDefinition {260ArchitectureType type;261size_t num_entries;262const ArchDefinitionEntry *entries;263const char *name;264};265266void ArchSpec::ListSupportedArchNames(StringList &list) {267for (const auto &def : g_core_definitions)268list.AppendString(def.name);269}270271void ArchSpec::AutoComplete(CompletionRequest &request) {272for (const auto &def : g_core_definitions)273request.TryCompleteCurrentArg(def.name);274}275276#define CPU_ANY (UINT32_MAX)277278//===----------------------------------------------------------------------===//279// A table that gets searched linearly for matches. This table is used to280// convert cpu type and subtypes to architecture names, and to convert281// architecture names to cpu types and subtypes. The ordering is important and282// allows the precedence to be set when the table is built.283#define SUBTYPE_MASK 0x00FFFFFFu284285// clang-format off286static const ArchDefinitionEntry g_macho_arch_entries[] = {287{ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, CPU_ANY, UINT32_MAX, UINT32_MAX},288{ArchSpec::eCore_arm_generic, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK},289{ArchSpec::eCore_arm_armv4, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},290{ArchSpec::eCore_arm_armv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},291{ArchSpec::eCore_arm_armv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK},292{ArchSpec::eCore_arm_armv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK},293{ArchSpec::eCore_arm_armv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},294{ArchSpec::eCore_arm_armv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},295{ArchSpec::eCore_arm_armv5t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5TEJ, UINT32_MAX, SUBTYPE_MASK},296{ArchSpec::eCore_arm_xscale, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_XSCALE, UINT32_MAX, SUBTYPE_MASK},297{ArchSpec::eCore_arm_armv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK},298{ArchSpec::eCore_arm_armv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK},299{ArchSpec::eCore_arm_armv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK},300{ArchSpec::eCore_arm_armv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},301{ArchSpec::eCore_arm_armv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},302{ArchSpec::eCore_arm_armv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},303{ArchSpec::eCore_arm_arm64e, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64E, UINT32_MAX, SUBTYPE_MASK},304{ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_ALL, UINT32_MAX, SUBTYPE_MASK},305{ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, llvm::MachO::CPU_SUBTYPE_ARM64_V8, UINT32_MAX, SUBTYPE_MASK},306{ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, 13, UINT32_MAX, SUBTYPE_MASK},307{ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 0, UINT32_MAX, SUBTYPE_MASK},308{ArchSpec::eCore_arm_arm64_32, llvm::MachO::CPU_TYPE_ARM64_32, 1, UINT32_MAX, SUBTYPE_MASK},309{ArchSpec::eCore_arm_arm64, llvm::MachO::CPU_TYPE_ARM64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},310{ArchSpec::eCore_thumb, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_ALL, UINT32_MAX, SUBTYPE_MASK},311{ArchSpec::eCore_thumbv4t, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V4T, UINT32_MAX, SUBTYPE_MASK},312{ArchSpec::eCore_thumbv5, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK},313{ArchSpec::eCore_thumbv5e, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V5, UINT32_MAX, SUBTYPE_MASK},314{ArchSpec::eCore_thumbv6, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6, UINT32_MAX, SUBTYPE_MASK},315{ArchSpec::eCore_thumbv6m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6M, UINT32_MAX, SUBTYPE_MASK},316{ArchSpec::eCore_thumbv7, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7, UINT32_MAX, SUBTYPE_MASK},317{ArchSpec::eCore_thumbv7f, llvm::MachO::CPU_TYPE_ARM, 10, UINT32_MAX, SUBTYPE_MASK},318{ArchSpec::eCore_thumbv7s, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S, UINT32_MAX, SUBTYPE_MASK},319{ArchSpec::eCore_thumbv7k, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7K, UINT32_MAX, SUBTYPE_MASK},320{ArchSpec::eCore_thumbv7m, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7M, UINT32_MAX, SUBTYPE_MASK},321{ArchSpec::eCore_thumbv7em, llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7EM, UINT32_MAX, SUBTYPE_MASK},322{ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, CPU_ANY, UINT32_MAX, UINT32_MAX},323{ArchSpec::eCore_ppc_generic, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK},324{ArchSpec::eCore_ppc_ppc601, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_601, UINT32_MAX, SUBTYPE_MASK},325{ArchSpec::eCore_ppc_ppc602, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_602, UINT32_MAX, SUBTYPE_MASK},326{ArchSpec::eCore_ppc_ppc603, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603, UINT32_MAX, SUBTYPE_MASK},327{ArchSpec::eCore_ppc_ppc603e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603e, UINT32_MAX, SUBTYPE_MASK},328{ArchSpec::eCore_ppc_ppc603ev, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_603ev, UINT32_MAX, SUBTYPE_MASK},329{ArchSpec::eCore_ppc_ppc604, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604, UINT32_MAX, SUBTYPE_MASK},330{ArchSpec::eCore_ppc_ppc604e, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_604e, UINT32_MAX, SUBTYPE_MASK},331{ArchSpec::eCore_ppc_ppc620, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_620, UINT32_MAX, SUBTYPE_MASK},332{ArchSpec::eCore_ppc_ppc750, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_750, UINT32_MAX, SUBTYPE_MASK},333{ArchSpec::eCore_ppc_ppc7400, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7400, UINT32_MAX, SUBTYPE_MASK},334{ArchSpec::eCore_ppc_ppc7450, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_7450, UINT32_MAX, SUBTYPE_MASK},335{ArchSpec::eCore_ppc_ppc970, llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_970, UINT32_MAX, SUBTYPE_MASK},336{ArchSpec::eCore_ppc64_generic, llvm::MachO::CPU_TYPE_POWERPC64, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL, UINT32_MAX, SUBTYPE_MASK},337{ArchSpec::eCore_ppc64le_generic, llvm::MachO::CPU_TYPE_POWERPC64, CPU_ANY, UINT32_MAX, SUBTYPE_MASK},338{ArchSpec::eCore_ppc64_ppc970_64, llvm::MachO::CPU_TYPE_POWERPC64, 100, UINT32_MAX, SUBTYPE_MASK},339{ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_I386_ALL, UINT32_MAX, SUBTYPE_MASK},340{ArchSpec::eCore_x86_32_i486, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486, UINT32_MAX, SUBTYPE_MASK},341{ArchSpec::eCore_x86_32_i486sx, llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_486SX, UINT32_MAX, SUBTYPE_MASK},342{ArchSpec::eCore_x86_32_i386, llvm::MachO::CPU_TYPE_I386, CPU_ANY, UINT32_MAX, UINT32_MAX},343{ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_ALL, UINT32_MAX, SUBTYPE_MASK},344{ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_ARCH1, UINT32_MAX, SUBTYPE_MASK},345{ArchSpec::eCore_x86_64_x86_64h, llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_H, UINT32_MAX, SUBTYPE_MASK},346{ArchSpec::eCore_x86_64_x86_64, llvm::MachO::CPU_TYPE_X86_64, CPU_ANY, UINT32_MAX, UINT32_MAX},347// Catch any unknown mach architectures so we can always use the object and symbol mach-o files348{ArchSpec::eCore_uknownMach32, 0, 0, 0xFF000000u, 0x00000000u},349{ArchSpec::eCore_uknownMach64, llvm::MachO::CPU_ARCH_ABI64, 0, 0xFF000000u, 0x00000000u}};350// clang-format on351352static const ArchDefinition g_macho_arch_def = {eArchTypeMachO,353std::size(g_macho_arch_entries),354g_macho_arch_entries, "mach-o"};355356//===----------------------------------------------------------------------===//357// A table that gets searched linearly for matches. This table is used to358// convert cpu type and subtypes to architecture names, and to convert359// architecture names to cpu types and subtypes. The ordering is important and360// allows the precedence to be set when the table is built.361static const ArchDefinitionEntry g_elf_arch_entries[] = {362{ArchSpec::eCore_sparc_generic, llvm::ELF::EM_SPARC, LLDB_INVALID_CPUTYPE,3630xFFFFFFFFu, 0xFFFFFFFFu}, // Sparc364{ArchSpec::eCore_x86_32_i386, llvm::ELF::EM_386, LLDB_INVALID_CPUTYPE,3650xFFFFFFFFu, 0xFFFFFFFFu}, // Intel 80386366{ArchSpec::eCore_x86_32_i486, llvm::ELF::EM_IAMCU, LLDB_INVALID_CPUTYPE,3670xFFFFFFFFu, 0xFFFFFFFFu}, // Intel MCU // FIXME: is this correct?368{ArchSpec::eCore_ppc_generic, llvm::ELF::EM_PPC, LLDB_INVALID_CPUTYPE,3690xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC370{ArchSpec::eCore_ppc64le_generic, llvm::ELF::EM_PPC64,371ArchSpec::eCore_ppc64le_generic, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC64le372{ArchSpec::eCore_ppc64_generic, llvm::ELF::EM_PPC64,373ArchSpec::eCore_ppc64_generic, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC64374{ArchSpec::eCore_arm_generic, llvm::ELF::EM_ARM, LLDB_INVALID_CPUTYPE,3750xFFFFFFFFu, 0xFFFFFFFFu}, // ARM376{ArchSpec::eCore_arm_aarch64, llvm::ELF::EM_AARCH64, LLDB_INVALID_CPUTYPE,3770xFFFFFFFFu, 0xFFFFFFFFu}, // ARM64378{ArchSpec::eCore_s390x_generic, llvm::ELF::EM_S390, LLDB_INVALID_CPUTYPE,3790xFFFFFFFFu, 0xFFFFFFFFu}, // SystemZ380{ArchSpec::eCore_sparc9_generic, llvm::ELF::EM_SPARCV9,381LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // SPARC V9382{ArchSpec::eCore_x86_64_x86_64, llvm::ELF::EM_X86_64, LLDB_INVALID_CPUTYPE,3830xFFFFFFFFu, 0xFFFFFFFFu}, // AMD64384{ArchSpec::eCore_mips32, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips32,3850xFFFFFFFFu, 0xFFFFFFFFu}, // mips32386{ArchSpec::eCore_mips32r2, llvm::ELF::EM_MIPS,387ArchSpec::eMIPSSubType_mips32r2, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips32r2388{ArchSpec::eCore_mips32r6, llvm::ELF::EM_MIPS,389ArchSpec::eMIPSSubType_mips32r6, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips32r6390{ArchSpec::eCore_mips32el, llvm::ELF::EM_MIPS,391ArchSpec::eMIPSSubType_mips32el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips32el392{ArchSpec::eCore_mips32r2el, llvm::ELF::EM_MIPS,393ArchSpec::eMIPSSubType_mips32r2el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips32r2el394{ArchSpec::eCore_mips32r6el, llvm::ELF::EM_MIPS,395ArchSpec::eMIPSSubType_mips32r6el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips32r6el396{ArchSpec::eCore_mips64, llvm::ELF::EM_MIPS, ArchSpec::eMIPSSubType_mips64,3970xFFFFFFFFu, 0xFFFFFFFFu}, // mips64398{ArchSpec::eCore_mips64r2, llvm::ELF::EM_MIPS,399ArchSpec::eMIPSSubType_mips64r2, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips64r2400{ArchSpec::eCore_mips64r6, llvm::ELF::EM_MIPS,401ArchSpec::eMIPSSubType_mips64r6, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips64r6402{ArchSpec::eCore_mips64el, llvm::ELF::EM_MIPS,403ArchSpec::eMIPSSubType_mips64el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips64el404{ArchSpec::eCore_mips64r2el, llvm::ELF::EM_MIPS,405ArchSpec::eMIPSSubType_mips64r2el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips64r2el406{ArchSpec::eCore_mips64r6el, llvm::ELF::EM_MIPS,407ArchSpec::eMIPSSubType_mips64r6el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips64r6el408{ArchSpec::eCore_msp430, llvm::ELF::EM_MSP430, LLDB_INVALID_CPUTYPE,4090xFFFFFFFFu, 0xFFFFFFFFu}, // MSP430410{ArchSpec::eCore_hexagon_generic, llvm::ELF::EM_HEXAGON,411LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // HEXAGON412{ArchSpec::eCore_arc, llvm::ELF::EM_ARC_COMPACT2, LLDB_INVALID_CPUTYPE,4130xFFFFFFFFu, 0xFFFFFFFFu}, // ARC414{ArchSpec::eCore_avr, llvm::ELF::EM_AVR, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu,4150xFFFFFFFFu}, // AVR416{ArchSpec::eCore_riscv32, llvm::ELF::EM_RISCV,417ArchSpec::eRISCVSubType_riscv32, 0xFFFFFFFFu, 0xFFFFFFFFu}, // riscv32418{ArchSpec::eCore_riscv64, llvm::ELF::EM_RISCV,419ArchSpec::eRISCVSubType_riscv64, 0xFFFFFFFFu, 0xFFFFFFFFu}, // riscv64420{ArchSpec::eCore_loongarch32, llvm::ELF::EM_LOONGARCH,421ArchSpec::eLoongArchSubType_loongarch32, 0xFFFFFFFFu,4220xFFFFFFFFu}, // loongarch32423{ArchSpec::eCore_loongarch64, llvm::ELF::EM_LOONGARCH,424ArchSpec::eLoongArchSubType_loongarch64, 0xFFFFFFFFu,4250xFFFFFFFFu}, // loongarch64426};427428static const ArchDefinition g_elf_arch_def = {429eArchTypeELF,430std::size(g_elf_arch_entries),431g_elf_arch_entries,432"elf",433};434435static const ArchDefinitionEntry g_coff_arch_entries[] = {436{ArchSpec::eCore_x86_32_i386, llvm::COFF::IMAGE_FILE_MACHINE_I386,437LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // Intel 80x86438{ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPC,439LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC440{ArchSpec::eCore_ppc_generic, llvm::COFF::IMAGE_FILE_MACHINE_POWERPCFP,441LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // PowerPC (with FPU)442{ArchSpec::eCore_arm_generic, llvm::COFF::IMAGE_FILE_MACHINE_ARM,443LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // ARM444{ArchSpec::eCore_arm_armv7, llvm::COFF::IMAGE_FILE_MACHINE_ARMNT,445LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // ARMv7446{ArchSpec::eCore_thumb, llvm::COFF::IMAGE_FILE_MACHINE_THUMB,447LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // ARMv7448{ArchSpec::eCore_x86_64_x86_64, llvm::COFF::IMAGE_FILE_MACHINE_AMD64,449LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // AMD64450{ArchSpec::eCore_arm_arm64, llvm::COFF::IMAGE_FILE_MACHINE_ARM64,451LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu} // ARM64452};453454static const ArchDefinition g_coff_arch_def = {455eArchTypeCOFF,456std::size(g_coff_arch_entries),457g_coff_arch_entries,458"pe-coff",459};460461//===----------------------------------------------------------------------===//462// Table of all ArchDefinitions463static const ArchDefinition *g_arch_definitions[] = {464&g_macho_arch_def, &g_elf_arch_def, &g_coff_arch_def};465466//===----------------------------------------------------------------------===//467// Static helper functions.468469// Get the architecture definition for a given object type.470static const ArchDefinition *FindArchDefinition(ArchitectureType arch_type) {471for (const ArchDefinition *def : g_arch_definitions) {472if (def->type == arch_type)473return def;474}475return nullptr;476}477478// Get an architecture definition by name.479static const CoreDefinition *FindCoreDefinition(llvm::StringRef name) {480for (const auto &def : g_core_definitions) {481if (name.equals_insensitive(def.name))482return &def;483}484return nullptr;485}486487static inline const CoreDefinition *FindCoreDefinition(ArchSpec::Core core) {488if (core < std::size(g_core_definitions))489return &g_core_definitions[core];490return nullptr;491}492493// Get a definition entry by cpu type and subtype.494static const ArchDefinitionEntry *495FindArchDefinitionEntry(const ArchDefinition *def, uint32_t cpu, uint32_t sub) {496if (def == nullptr)497return nullptr;498499const ArchDefinitionEntry *entries = def->entries;500for (size_t i = 0; i < def->num_entries; ++i) {501if (entries[i].cpu == (cpu & entries[i].cpu_mask))502if (entries[i].sub == (sub & entries[i].sub_mask))503return &entries[i];504}505return nullptr;506}507508static const ArchDefinitionEntry *509FindArchDefinitionEntry(const ArchDefinition *def, ArchSpec::Core core) {510if (def == nullptr)511return nullptr;512513const ArchDefinitionEntry *entries = def->entries;514for (size_t i = 0; i < def->num_entries; ++i) {515if (entries[i].core == core)516return &entries[i];517}518return nullptr;519}520521//===----------------------------------------------------------------------===//522// Constructors and destructors.523524ArchSpec::ArchSpec() = default;525526ArchSpec::ArchSpec(const char *triple_cstr) {527if (triple_cstr)528SetTriple(triple_cstr);529}530531ArchSpec::ArchSpec(llvm::StringRef triple_str) { SetTriple(triple_str); }532533ArchSpec::ArchSpec(const llvm::Triple &triple) { SetTriple(triple); }534535ArchSpec::ArchSpec(ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) {536SetArchitecture(arch_type, cpu, subtype);537}538539ArchSpec::~ArchSpec() = default;540541void ArchSpec::Clear() {542m_triple = llvm::Triple();543m_core = kCore_invalid;544m_byte_order = eByteOrderInvalid;545m_flags = 0;546}547548//===----------------------------------------------------------------------===//549// Predicates.550551const char *ArchSpec::GetArchitectureName() const {552const CoreDefinition *core_def = FindCoreDefinition(m_core);553if (core_def)554return core_def->name;555return "unknown";556}557558bool ArchSpec::IsMIPS() const { return GetTriple().isMIPS(); }559560std::string ArchSpec::GetTargetABI() const {561562std::string abi;563564if (IsMIPS()) {565switch (GetFlags() & ArchSpec::eMIPSABI_mask) {566case ArchSpec::eMIPSABI_N64:567abi = "n64";568return abi;569case ArchSpec::eMIPSABI_N32:570abi = "n32";571return abi;572case ArchSpec::eMIPSABI_O32:573abi = "o32";574return abi;575default:576return abi;577}578}579return abi;580}581582void ArchSpec::SetFlags(const std::string &elf_abi) {583584uint32_t flag = GetFlags();585if (IsMIPS()) {586if (elf_abi == "n64")587flag |= ArchSpec::eMIPSABI_N64;588else if (elf_abi == "n32")589flag |= ArchSpec::eMIPSABI_N32;590else if (elf_abi == "o32")591flag |= ArchSpec::eMIPSABI_O32;592}593SetFlags(flag);594}595596std::string ArchSpec::GetClangTargetCPU() const {597std::string cpu;598if (IsMIPS()) {599switch (m_core) {600case ArchSpec::eCore_mips32:601case ArchSpec::eCore_mips32el:602cpu = "mips32";603break;604case ArchSpec::eCore_mips32r2:605case ArchSpec::eCore_mips32r2el:606cpu = "mips32r2";607break;608case ArchSpec::eCore_mips32r3:609case ArchSpec::eCore_mips32r3el:610cpu = "mips32r3";611break;612case ArchSpec::eCore_mips32r5:613case ArchSpec::eCore_mips32r5el:614cpu = "mips32r5";615break;616case ArchSpec::eCore_mips32r6:617case ArchSpec::eCore_mips32r6el:618cpu = "mips32r6";619break;620case ArchSpec::eCore_mips64:621case ArchSpec::eCore_mips64el:622cpu = "mips64";623break;624case ArchSpec::eCore_mips64r2:625case ArchSpec::eCore_mips64r2el:626cpu = "mips64r2";627break;628case ArchSpec::eCore_mips64r3:629case ArchSpec::eCore_mips64r3el:630cpu = "mips64r3";631break;632case ArchSpec::eCore_mips64r5:633case ArchSpec::eCore_mips64r5el:634cpu = "mips64r5";635break;636case ArchSpec::eCore_mips64r6:637case ArchSpec::eCore_mips64r6el:638cpu = "mips64r6";639break;640default:641break;642}643}644645if (GetTriple().isARM())646cpu = llvm::ARM::getARMCPUForArch(GetTriple(), "").str();647return cpu;648}649650uint32_t ArchSpec::GetMachOCPUType() const {651const CoreDefinition *core_def = FindCoreDefinition(m_core);652if (core_def) {653const ArchDefinitionEntry *arch_def =654FindArchDefinitionEntry(&g_macho_arch_def, core_def->core);655if (arch_def) {656return arch_def->cpu;657}658}659return LLDB_INVALID_CPUTYPE;660}661662uint32_t ArchSpec::GetMachOCPUSubType() const {663const CoreDefinition *core_def = FindCoreDefinition(m_core);664if (core_def) {665const ArchDefinitionEntry *arch_def =666FindArchDefinitionEntry(&g_macho_arch_def, core_def->core);667if (arch_def) {668return arch_def->sub;669}670}671return LLDB_INVALID_CPUTYPE;672}673674uint32_t ArchSpec::GetDataByteSize() const {675return 1;676}677678uint32_t ArchSpec::GetCodeByteSize() const {679return 1;680}681682llvm::Triple::ArchType ArchSpec::GetMachine() const {683const CoreDefinition *core_def = FindCoreDefinition(m_core);684if (core_def)685return core_def->machine;686687return llvm::Triple::UnknownArch;688}689690uint32_t ArchSpec::GetAddressByteSize() const {691const CoreDefinition *core_def = FindCoreDefinition(m_core);692if (core_def) {693if (core_def->machine == llvm::Triple::mips64 ||694core_def->machine == llvm::Triple::mips64el) {695// For N32/O32 applications Address size is 4 bytes.696if (m_flags & (eMIPSABI_N32 | eMIPSABI_O32))697return 4;698}699return core_def->addr_byte_size;700}701return 0;702}703704ByteOrder ArchSpec::GetDefaultEndian() const {705const CoreDefinition *core_def = FindCoreDefinition(m_core);706if (core_def)707return core_def->default_byte_order;708return eByteOrderInvalid;709}710711bool ArchSpec::CharIsSignedByDefault() const {712switch (m_triple.getArch()) {713default:714return true;715716case llvm::Triple::aarch64:717case llvm::Triple::aarch64_32:718case llvm::Triple::aarch64_be:719case llvm::Triple::arm:720case llvm::Triple::armeb:721case llvm::Triple::thumb:722case llvm::Triple::thumbeb:723return m_triple.isOSDarwin() || m_triple.isOSWindows();724725case llvm::Triple::ppc:726case llvm::Triple::ppc64:727return m_triple.isOSDarwin();728729case llvm::Triple::ppc64le:730case llvm::Triple::systemz:731case llvm::Triple::xcore:732case llvm::Triple::arc:733return false;734}735}736737lldb::ByteOrder ArchSpec::GetByteOrder() const {738if (m_byte_order == eByteOrderInvalid)739return GetDefaultEndian();740return m_byte_order;741}742743//===----------------------------------------------------------------------===//744// Mutators.745746bool ArchSpec::SetTriple(const llvm::Triple &triple) {747m_triple = triple;748UpdateCore();749return IsValid();750}751752bool lldb_private::ParseMachCPUDashSubtypeTriple(llvm::StringRef triple_str,753ArchSpec &arch) {754// Accept "12-10" or "12.10" as cpu type/subtype755if (triple_str.empty())756return false;757758size_t pos = triple_str.find_first_of("-.");759if (pos == llvm::StringRef::npos)760return false;761762llvm::StringRef cpu_str = triple_str.substr(0, pos);763llvm::StringRef remainder = triple_str.substr(pos + 1);764if (cpu_str.empty() || remainder.empty())765return false;766767llvm::StringRef sub_str;768llvm::StringRef vendor;769llvm::StringRef os;770std::tie(sub_str, remainder) = remainder.split('-');771std::tie(vendor, os) = remainder.split('-');772773uint32_t cpu = 0;774uint32_t sub = 0;775if (cpu_str.getAsInteger(10, cpu) || sub_str.getAsInteger(10, sub))776return false;777778if (!arch.SetArchitecture(eArchTypeMachO, cpu, sub))779return false;780if (!vendor.empty() && !os.empty()) {781arch.GetTriple().setVendorName(vendor);782arch.GetTriple().setOSName(os);783}784785return true;786}787788bool ArchSpec::SetTriple(llvm::StringRef triple) {789if (triple.empty()) {790Clear();791return false;792}793794if (ParseMachCPUDashSubtypeTriple(triple, *this))795return true;796797SetTriple(llvm::Triple(llvm::Triple::normalize(triple)));798return IsValid();799}800801bool ArchSpec::ContainsOnlyArch(const llvm::Triple &normalized_triple) {802return !normalized_triple.getArchName().empty() &&803normalized_triple.getOSName().empty() &&804normalized_triple.getVendorName().empty() &&805normalized_triple.getEnvironmentName().empty();806}807808void ArchSpec::MergeFrom(const ArchSpec &other) {809// ios-macabi always wins over macosx.810if ((GetTriple().getOS() == llvm::Triple::MacOSX ||811GetTriple().getOS() == llvm::Triple::UnknownOS) &&812other.GetTriple().getOS() == llvm::Triple::IOS &&813other.GetTriple().getEnvironment() == llvm::Triple::MacABI) {814(*this) = other;815return;816}817818if (!TripleVendorWasSpecified() && other.TripleVendorWasSpecified())819GetTriple().setVendor(other.GetTriple().getVendor());820if (!TripleOSWasSpecified() && other.TripleOSWasSpecified())821GetTriple().setOS(other.GetTriple().getOS());822if (GetTriple().getArch() == llvm::Triple::UnknownArch) {823GetTriple().setArch(other.GetTriple().getArch());824825// MachO unknown64 isn't really invalid as the debugger can still obtain826// information from the binary, e.g. line tables. As such, we don't update827// the core here.828if (other.GetCore() != eCore_uknownMach64)829UpdateCore();830}831if (!TripleEnvironmentWasSpecified() &&832other.TripleEnvironmentWasSpecified()) {833GetTriple().setEnvironment(other.GetTriple().getEnvironment());834}835// If this and other are both arm ArchSpecs and this ArchSpec is a generic836// "some kind of arm" spec but the other ArchSpec is a specific arm core,837// adopt the specific arm core.838if (GetTriple().getArch() == llvm::Triple::arm &&839other.GetTriple().getArch() == llvm::Triple::arm &&840IsCompatibleMatch(other) && GetCore() == ArchSpec::eCore_arm_generic &&841other.GetCore() != ArchSpec::eCore_arm_generic) {842m_core = other.GetCore();843CoreUpdated(false);844}845if (GetFlags() == 0) {846SetFlags(other.GetFlags());847}848}849850bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu,851uint32_t sub, uint32_t os) {852m_core = kCore_invalid;853bool update_triple = true;854const ArchDefinition *arch_def = FindArchDefinition(arch_type);855if (arch_def) {856const ArchDefinitionEntry *arch_def_entry =857FindArchDefinitionEntry(arch_def, cpu, sub);858if (arch_def_entry) {859const CoreDefinition *core_def = FindCoreDefinition(arch_def_entry->core);860if (core_def) {861m_core = core_def->core;862update_triple = false;863// Always use the architecture name because it might be more864// descriptive than the architecture enum ("armv7" ->865// llvm::Triple::arm).866m_triple.setArchName(llvm::StringRef(core_def->name));867if (arch_type == eArchTypeMachO) {868m_triple.setVendor(llvm::Triple::Apple);869870// Don't set the OS. It could be simulator, macosx, ios, watchos,871// tvos, bridgeos. We could get close with the cpu type - but we872// can't get it right all of the time. Better to leave this unset873// so other sections of code will set it when they have more874// information. NB: don't call m_triple.setOS875// (llvm::Triple::UnknownOS). That sets the OSName to "unknown" and876// the ArchSpec::TripleVendorWasSpecified() method says that any877// OSName setting means it was specified.878} else if (arch_type == eArchTypeELF) {879switch (os) {880case llvm::ELF::ELFOSABI_AIX:881m_triple.setOS(llvm::Triple::OSType::AIX);882break;883case llvm::ELF::ELFOSABI_FREEBSD:884m_triple.setOS(llvm::Triple::OSType::FreeBSD);885break;886case llvm::ELF::ELFOSABI_GNU:887m_triple.setOS(llvm::Triple::OSType::Linux);888break;889case llvm::ELF::ELFOSABI_NETBSD:890m_triple.setOS(llvm::Triple::OSType::NetBSD);891break;892case llvm::ELF::ELFOSABI_OPENBSD:893m_triple.setOS(llvm::Triple::OSType::OpenBSD);894break;895case llvm::ELF::ELFOSABI_SOLARIS:896m_triple.setOS(llvm::Triple::OSType::Solaris);897break;898case llvm::ELF::ELFOSABI_STANDALONE:899m_triple.setOS(llvm::Triple::OSType::UnknownOS);900break;901}902} else if (arch_type == eArchTypeCOFF && os == llvm::Triple::Win32) {903m_triple.setVendor(llvm::Triple::PC);904m_triple.setOS(llvm::Triple::Win32);905} else {906m_triple.setVendor(llvm::Triple::UnknownVendor);907m_triple.setOS(llvm::Triple::UnknownOS);908}909// Fall back onto setting the machine type if the arch by name910// failed...911if (m_triple.getArch() == llvm::Triple::UnknownArch)912m_triple.setArch(core_def->machine);913}914} else {915Log *log(GetLog(LLDBLog::Target | LLDBLog::Process | LLDBLog::Platform));916LLDB_LOGF(log,917"Unable to find a core definition for cpu 0x%" PRIx32918" sub %" PRId32,919cpu, sub);920}921}922CoreUpdated(update_triple);923return IsValid();924}925926uint32_t ArchSpec::GetMinimumOpcodeByteSize() const {927const CoreDefinition *core_def = FindCoreDefinition(m_core);928if (core_def)929return core_def->min_opcode_byte_size;930return 0;931}932933uint32_t ArchSpec::GetMaximumOpcodeByteSize() const {934const CoreDefinition *core_def = FindCoreDefinition(m_core);935if (core_def)936return core_def->max_opcode_byte_size;937return 0;938}939940static bool IsCompatibleEnvironment(llvm::Triple::EnvironmentType lhs,941llvm::Triple::EnvironmentType rhs) {942if (lhs == rhs)943return true;944945// Apple simulators are a different platform than what they simulate.946// As the environments are different at this point, if one of them is a947// simulator, then they are different.948if (lhs == llvm::Triple::Simulator || rhs == llvm::Triple::Simulator)949return false;950951// If any of the environment is unknown then they are compatible952if (lhs == llvm::Triple::UnknownEnvironment ||953rhs == llvm::Triple::UnknownEnvironment)954return true;955956// If one of the environment is Android and the other one is EABI then they957// are considered to be compatible. This is required as a workaround for958// shared libraries compiled for Android without the NOTE section indicating959// that they are using the Android ABI.960if ((lhs == llvm::Triple::Android && rhs == llvm::Triple::EABI) ||961(rhs == llvm::Triple::Android && lhs == llvm::Triple::EABI) ||962(lhs == llvm::Triple::GNUEABI && rhs == llvm::Triple::EABI) ||963(rhs == llvm::Triple::GNUEABI && lhs == llvm::Triple::EABI) ||964(lhs == llvm::Triple::GNUEABIHF && rhs == llvm::Triple::EABIHF) ||965(rhs == llvm::Triple::GNUEABIHF && lhs == llvm::Triple::EABIHF))966return true;967968return false;969}970971bool ArchSpec::IsMatch(const ArchSpec &rhs, MatchType match) const {972if (GetByteOrder() != rhs.GetByteOrder() ||973!cores_match(GetCore(), rhs.GetCore(), true, match == ExactMatch))974return false;975976const llvm::Triple &lhs_triple = GetTriple();977const llvm::Triple &rhs_triple = rhs.GetTriple();978979const llvm::Triple::VendorType lhs_triple_vendor = lhs_triple.getVendor();980const llvm::Triple::VendorType rhs_triple_vendor = rhs_triple.getVendor();981982const llvm::Triple::OSType lhs_triple_os = lhs_triple.getOS();983const llvm::Triple::OSType rhs_triple_os = rhs_triple.getOS();984985bool both_windows = lhs_triple.isOSWindows() && rhs_triple.isOSWindows();986987// On Windows, the vendor field doesn't have any practical effect, but988// it is often set to either "pc" or "w64".989if ((lhs_triple_vendor != rhs_triple_vendor) &&990(match == ExactMatch || !both_windows)) {991const bool rhs_vendor_specified = rhs.TripleVendorWasSpecified();992const bool lhs_vendor_specified = TripleVendorWasSpecified();993// Both architectures had the vendor specified, so if they aren't equal994// then we return false995if (rhs_vendor_specified && lhs_vendor_specified)996return false;997998// Only fail if both vendor types are not unknown999if (lhs_triple_vendor != llvm::Triple::UnknownVendor &&1000rhs_triple_vendor != llvm::Triple::UnknownVendor)1001return false;1002}10031004const llvm::Triple::EnvironmentType lhs_triple_env =1005lhs_triple.getEnvironment();1006const llvm::Triple::EnvironmentType rhs_triple_env =1007rhs_triple.getEnvironment();10081009if (match == CompatibleMatch) {1010// x86_64-apple-ios-macabi, x86_64-apple-macosx are compatible, no match.1011if ((lhs_triple_os == llvm::Triple::IOS &&1012lhs_triple_env == llvm::Triple::MacABI &&1013rhs_triple_os == llvm::Triple::MacOSX) ||1014(lhs_triple_os == llvm::Triple::MacOSX &&1015rhs_triple_os == llvm::Triple::IOS &&1016rhs_triple_env == llvm::Triple::MacABI))1017return true;1018}10191020// x86_64-apple-ios-macabi and x86_64-apple-ios are not compatible.1021if (lhs_triple_os == llvm::Triple::IOS &&1022rhs_triple_os == llvm::Triple::IOS &&1023(lhs_triple_env == llvm::Triple::MacABI ||1024rhs_triple_env == llvm::Triple::MacABI) &&1025lhs_triple_env != rhs_triple_env)1026return false;10271028if (lhs_triple_os != rhs_triple_os) {1029const bool lhs_os_specified = TripleOSWasSpecified();1030const bool rhs_os_specified = rhs.TripleOSWasSpecified();1031// If both OS types are specified and different, fail.1032if (lhs_os_specified && rhs_os_specified)1033return false;10341035// If the pair of os+env is both unspecified, match any other os+env combo.1036if (match == CompatibleMatch &&1037((!lhs_os_specified && !lhs_triple.hasEnvironment()) ||1038(!rhs_os_specified && !rhs_triple.hasEnvironment())))1039return true;1040}10411042if (match == CompatibleMatch && both_windows)1043return true; // The Windows environments (MSVC vs GNU) are compatible10441045return IsCompatibleEnvironment(lhs_triple_env, rhs_triple_env);1046}10471048void ArchSpec::UpdateCore() {1049llvm::StringRef arch_name(m_triple.getArchName());1050const CoreDefinition *core_def = FindCoreDefinition(arch_name);1051if (core_def) {1052m_core = core_def->core;1053// Set the byte order to the default byte order for an architecture. This1054// can be modified if needed for cases when cores handle both big and1055// little endian1056m_byte_order = core_def->default_byte_order;1057} else {1058Clear();1059}1060}10611062//===----------------------------------------------------------------------===//1063// Helper methods.10641065void ArchSpec::CoreUpdated(bool update_triple) {1066const CoreDefinition *core_def = FindCoreDefinition(m_core);1067if (core_def) {1068if (update_triple)1069m_triple = llvm::Triple(core_def->name, "unknown", "unknown");1070m_byte_order = core_def->default_byte_order;1071} else {1072if (update_triple)1073m_triple = llvm::Triple();1074m_byte_order = eByteOrderInvalid;1075}1076}10771078//===----------------------------------------------------------------------===//1079// Operators.10801081static bool cores_match(const ArchSpec::Core core1, const ArchSpec::Core core2,1082bool try_inverse, bool enforce_exact_match) {1083if (core1 == core2)1084return true;10851086switch (core1) {1087case ArchSpec::kCore_any:1088return true;10891090case ArchSpec::eCore_arm_generic:1091if (enforce_exact_match)1092break;1093[[fallthrough]];1094case ArchSpec::kCore_arm_any:1095if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last)1096return true;1097if (core2 >= ArchSpec::kCore_thumb_first &&1098core2 <= ArchSpec::kCore_thumb_last)1099return true;1100if (core2 == ArchSpec::kCore_arm_any)1101return true;1102break;11031104case ArchSpec::kCore_x86_32_any:1105if ((core2 >= ArchSpec::kCore_x86_32_first &&1106core2 <= ArchSpec::kCore_x86_32_last) ||1107(core2 == ArchSpec::kCore_x86_32_any))1108return true;1109break;11101111case ArchSpec::kCore_x86_64_any:1112if ((core2 >= ArchSpec::kCore_x86_64_first &&1113core2 <= ArchSpec::kCore_x86_64_last) ||1114(core2 == ArchSpec::kCore_x86_64_any))1115return true;1116break;11171118case ArchSpec::kCore_ppc_any:1119if ((core2 >= ArchSpec::kCore_ppc_first &&1120core2 <= ArchSpec::kCore_ppc_last) ||1121(core2 == ArchSpec::kCore_ppc_any))1122return true;1123break;11241125case ArchSpec::kCore_ppc64_any:1126if ((core2 >= ArchSpec::kCore_ppc64_first &&1127core2 <= ArchSpec::kCore_ppc64_last) ||1128(core2 == ArchSpec::kCore_ppc64_any))1129return true;1130break;11311132case ArchSpec::kCore_hexagon_any:1133if ((core2 >= ArchSpec::kCore_hexagon_first &&1134core2 <= ArchSpec::kCore_hexagon_last) ||1135(core2 == ArchSpec::kCore_hexagon_any))1136return true;1137break;11381139// v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization1140// Cortex-M0 - ARMv6-M - armv6m1141// Cortex-M3 - ARMv7-M - armv7m1142// Cortex-M4 - ARMv7E-M - armv7em1143case ArchSpec::eCore_arm_armv7em:1144if (!enforce_exact_match) {1145if (core2 == ArchSpec::eCore_arm_generic)1146return true;1147if (core2 == ArchSpec::eCore_arm_armv7m)1148return true;1149if (core2 == ArchSpec::eCore_arm_armv6m)1150return true;1151if (core2 == ArchSpec::eCore_arm_armv7)1152return true;1153try_inverse = true;1154}1155break;11561157// v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization1158// Cortex-M0 - ARMv6-M - armv6m1159// Cortex-M3 - ARMv7-M - armv7m1160// Cortex-M4 - ARMv7E-M - armv7em1161case ArchSpec::eCore_arm_armv7m:1162if (!enforce_exact_match) {1163if (core2 == ArchSpec::eCore_arm_generic)1164return true;1165if (core2 == ArchSpec::eCore_arm_armv6m)1166return true;1167if (core2 == ArchSpec::eCore_arm_armv7)1168return true;1169if (core2 == ArchSpec::eCore_arm_armv7em)1170return true;1171try_inverse = true;1172}1173break;11741175// v. https://en.wikipedia.org/wiki/ARM_Cortex-M#Silicon_customization1176// Cortex-M0 - ARMv6-M - armv6m1177// Cortex-M3 - ARMv7-M - armv7m1178// Cortex-M4 - ARMv7E-M - armv7em1179case ArchSpec::eCore_arm_armv6m:1180if (!enforce_exact_match) {1181if (core2 == ArchSpec::eCore_arm_generic)1182return true;1183if (core2 == ArchSpec::eCore_arm_armv7em)1184return true;1185if (core2 == ArchSpec::eCore_arm_armv7)1186return true;1187if (core2 == ArchSpec::eCore_arm_armv6m)1188return true;1189try_inverse = false;1190}1191break;11921193case ArchSpec::eCore_arm_armv7f:1194case ArchSpec::eCore_arm_armv7k:1195case ArchSpec::eCore_arm_armv7s:1196case ArchSpec::eCore_arm_armv7l:1197case ArchSpec::eCore_arm_armv8l:1198if (!enforce_exact_match) {1199if (core2 == ArchSpec::eCore_arm_generic)1200return true;1201if (core2 == ArchSpec::eCore_arm_armv7)1202return true;1203try_inverse = false;1204}1205break;12061207case ArchSpec::eCore_x86_64_x86_64h:1208if (!enforce_exact_match) {1209try_inverse = false;1210if (core2 == ArchSpec::eCore_x86_64_x86_64)1211return true;1212}1213break;12141215case ArchSpec::eCore_arm_armv8:1216if (!enforce_exact_match) {1217if (core2 == ArchSpec::eCore_arm_arm64)1218return true;1219if (core2 == ArchSpec::eCore_arm_aarch64)1220return true;1221if (core2 == ArchSpec::eCore_arm_arm64e)1222return true;1223try_inverse = false;1224}1225break;12261227case ArchSpec::eCore_arm_arm64e:1228if (!enforce_exact_match) {1229if (core2 == ArchSpec::eCore_arm_arm64)1230return true;1231if (core2 == ArchSpec::eCore_arm_aarch64)1232return true;1233if (core2 == ArchSpec::eCore_arm_armv8)1234return true;1235try_inverse = false;1236}1237break;1238case ArchSpec::eCore_arm_aarch64:1239if (!enforce_exact_match) {1240if (core2 == ArchSpec::eCore_arm_arm64)1241return true;1242if (core2 == ArchSpec::eCore_arm_armv8)1243return true;1244if (core2 == ArchSpec::eCore_arm_arm64e)1245return true;1246try_inverse = false;1247}1248break;12491250case ArchSpec::eCore_arm_arm64:1251if (!enforce_exact_match) {1252if (core2 == ArchSpec::eCore_arm_aarch64)1253return true;1254if (core2 == ArchSpec::eCore_arm_armv8)1255return true;1256if (core2 == ArchSpec::eCore_arm_arm64e)1257return true;1258try_inverse = false;1259}1260break;12611262case ArchSpec::eCore_arm_arm64_32:1263if (!enforce_exact_match) {1264if (core2 == ArchSpec::eCore_arm_generic)1265return true;1266try_inverse = false;1267}1268break;12691270case ArchSpec::eCore_mips32:1271if (!enforce_exact_match) {1272if (core2 >= ArchSpec::kCore_mips32_first &&1273core2 <= ArchSpec::kCore_mips32_last)1274return true;1275try_inverse = false;1276}1277break;12781279case ArchSpec::eCore_mips32el:1280if (!enforce_exact_match) {1281if (core2 >= ArchSpec::kCore_mips32el_first &&1282core2 <= ArchSpec::kCore_mips32el_last)1283return true;1284try_inverse = true;1285}1286break;12871288case ArchSpec::eCore_mips64:1289if (!enforce_exact_match) {1290if (core2 >= ArchSpec::kCore_mips32_first &&1291core2 <= ArchSpec::kCore_mips32_last)1292return true;1293if (core2 >= ArchSpec::kCore_mips64_first &&1294core2 <= ArchSpec::kCore_mips64_last)1295return true;1296try_inverse = false;1297}1298break;12991300case ArchSpec::eCore_mips64el:1301if (!enforce_exact_match) {1302if (core2 >= ArchSpec::kCore_mips32el_first &&1303core2 <= ArchSpec::kCore_mips32el_last)1304return true;1305if (core2 >= ArchSpec::kCore_mips64el_first &&1306core2 <= ArchSpec::kCore_mips64el_last)1307return true;1308try_inverse = false;1309}1310break;13111312case ArchSpec::eCore_mips64r2:1313case ArchSpec::eCore_mips64r3:1314case ArchSpec::eCore_mips64r5:1315if (!enforce_exact_match) {1316if (core2 >= ArchSpec::kCore_mips32_first && core2 <= (core1 - 10))1317return true;1318if (core2 >= ArchSpec::kCore_mips64_first && core2 <= (core1 - 1))1319return true;1320try_inverse = false;1321}1322break;13231324case ArchSpec::eCore_mips64r2el:1325case ArchSpec::eCore_mips64r3el:1326case ArchSpec::eCore_mips64r5el:1327if (!enforce_exact_match) {1328if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= (core1 - 10))1329return true;1330if (core2 >= ArchSpec::kCore_mips64el_first && core2 <= (core1 - 1))1331return true;1332try_inverse = false;1333}1334break;13351336case ArchSpec::eCore_mips32r2:1337case ArchSpec::eCore_mips32r3:1338case ArchSpec::eCore_mips32r5:1339if (!enforce_exact_match) {1340if (core2 >= ArchSpec::kCore_mips32_first && core2 <= core1)1341return true;1342}1343break;13441345case ArchSpec::eCore_mips32r2el:1346case ArchSpec::eCore_mips32r3el:1347case ArchSpec::eCore_mips32r5el:1348if (!enforce_exact_match) {1349if (core2 >= ArchSpec::kCore_mips32el_first && core2 <= core1)1350return true;1351}1352break;13531354case ArchSpec::eCore_mips32r6:1355if (!enforce_exact_match) {1356if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6)1357return true;1358}1359break;13601361case ArchSpec::eCore_mips32r6el:1362if (!enforce_exact_match) {1363if (core2 == ArchSpec::eCore_mips32el ||1364core2 == ArchSpec::eCore_mips32r6el)1365return true;1366}1367break;13681369case ArchSpec::eCore_mips64r6:1370if (!enforce_exact_match) {1371if (core2 == ArchSpec::eCore_mips32 || core2 == ArchSpec::eCore_mips32r6)1372return true;1373if (core2 == ArchSpec::eCore_mips64 || core2 == ArchSpec::eCore_mips64r6)1374return true;1375}1376break;13771378case ArchSpec::eCore_mips64r6el:1379if (!enforce_exact_match) {1380if (core2 == ArchSpec::eCore_mips32el ||1381core2 == ArchSpec::eCore_mips32r6el)1382return true;1383if (core2 == ArchSpec::eCore_mips64el ||1384core2 == ArchSpec::eCore_mips64r6el)1385return true;1386}1387break;13881389default:1390break;1391}1392if (try_inverse)1393return cores_match(core2, core1, false, enforce_exact_match);1394return false;1395}13961397bool lldb_private::operator<(const ArchSpec &lhs, const ArchSpec &rhs) {1398const ArchSpec::Core lhs_core = lhs.GetCore();1399const ArchSpec::Core rhs_core = rhs.GetCore();1400return lhs_core < rhs_core;1401}140214031404bool lldb_private::operator==(const ArchSpec &lhs, const ArchSpec &rhs) {1405return lhs.GetCore() == rhs.GetCore();1406}14071408bool ArchSpec::IsFullySpecifiedTriple() const {1409if (!TripleOSWasSpecified())1410return false;14111412if (!TripleVendorWasSpecified())1413return false;14141415const unsigned unspecified = 0;1416const llvm::Triple &triple = GetTriple();1417if (triple.isOSDarwin() && triple.getOSMajorVersion() == unspecified)1418return false;14191420return true;1421}14221423bool ArchSpec::IsAlwaysThumbInstructions() const {1424std::string Status;1425if (GetTriple().getArch() == llvm::Triple::arm ||1426GetTriple().getArch() == llvm::Triple::thumb) {1427// v. https://en.wikipedia.org/wiki/ARM_Cortex-M1428//1429// Cortex-M0 through Cortex-M7 are ARM processor cores which can only1430// execute thumb instructions. We map the cores to arch names like this:1431//1432// Cortex-M0, Cortex-M0+, Cortex-M1: armv6m Cortex-M3: armv7m Cortex-M4,1433// Cortex-M7: armv7em14341435if (GetCore() == ArchSpec::Core::eCore_arm_armv7m ||1436GetCore() == ArchSpec::Core::eCore_arm_armv7em ||1437GetCore() == ArchSpec::Core::eCore_arm_armv6m ||1438GetCore() == ArchSpec::Core::eCore_thumbv7m ||1439GetCore() == ArchSpec::Core::eCore_thumbv7em ||1440GetCore() == ArchSpec::Core::eCore_thumbv6m) {1441return true;1442}1443// Windows on ARM is always thumb.1444if (GetTriple().isOSWindows())1445return true;1446}1447return false;1448}14491450void ArchSpec::DumpTriple(llvm::raw_ostream &s) const {1451const llvm::Triple &triple = GetTriple();1452llvm::StringRef arch_str = triple.getArchName();1453llvm::StringRef vendor_str = triple.getVendorName();1454llvm::StringRef os_str = triple.getOSName();1455llvm::StringRef environ_str = triple.getEnvironmentName();14561457s << llvm::formatv("{0}-{1}-{2}", arch_str.empty() ? "*" : arch_str,1458vendor_str.empty() ? "*" : vendor_str,1459os_str.empty() ? "*" : os_str);14601461if (!environ_str.empty())1462s << "-" << environ_str;1463}146414651466