https://github.com/satyajanga updated https://github.com/llvm/llvm-project/pull/206369
>From 6b1ffee6b773e673a79e1526704f822d39fffed7 Mon Sep 17 00:00:00 2001 From: satya janga <[email protected]> Date: Fri, 26 Jun 2026 21:10:28 -0700 Subject: [PATCH] [lldb] Add AMD GPU architectures to ArchSpec Teach ArchSpec and ObjectFileELF about AMD (R600 and GCN/amdgcn) GPU architectures so GPU ELF object files and triples resolve to a precise architecture. - ArchSpec: add eCore_amd_gpu_* cores with matching kCore ranges, core definitions, and ELF arch-definition entries (EM_AMDGPU + EF_AMDGPU_MACH_* flags). The exact AMD GPU model is carried in the bottom byte of the ELF e_flags and stored as the architecture sub type; for amdgcn/r600 the model name is also appended to the triple environment so it round-trips through the triple string. Add a GetElfCPUSubType accessor. - ObjectFileELF: decode the GPU model from the AMDGPU ELF header (AMDGPUVariantFromElfFlags) and map ELFOSABI_AMDGPU_HSA to the AMDHSA OS. Remove the stale post-detection vendor assert (legacy scaffolding from commit f6a1312f1b30, which assumed ELF never sets a vendor): AMDGPU's canonical triple amdgcn-amd-amdhsa legitimately names AMD as the vendor. - Tests: parameterized tests covering every AMD GPU model. In ArchSpecTest, SetTriple() from a triple string resolves to the expected arch and core (exercising ArchSpec::UpdateCore()); in TestObjectFileELF, an AMDGPU ELF header built from YAML decodes to the expected arch and core. The processor list, e_flags machine values, OSABI and ABI versions follow llvm/include/llvm/BinaryFormat/ELF.h (AMDGPU_MACH_LIST) and the AMDGPU code-object spec documented at https://llvm.org/docs/AMDGPUUsage.html. NVIDIA (nvptx) support is intentionally omitted until there is a code path that parses it. --- lldb/include/lldb/Utility/ArchSpec.h | 84 ++- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 32 +- lldb/source/Utility/ArchSpec.cpp | 508 +++++++++++++++++- .../ObjectFile/ELF/TestObjectFileELF.cpp | 289 ++++++++++ lldb/unittests/Utility/ArchSpecTest.cpp | 227 ++++++++ 5 files changed, 1111 insertions(+), 29 deletions(-) diff --git a/lldb/include/lldb/Utility/ArchSpec.h b/lldb/include/lldb/Utility/ArchSpec.h index 160f81c2fa501..a0fa3654c0dac 100644 --- a/lldb/include/lldb/Utility/ArchSpec.h +++ b/lldb/include/lldb/Utility/ArchSpec.h @@ -240,6 +240,83 @@ class ArchSpec { eCore_wasm32, + eCore_amd_gpu_r600_R600, + eCore_amd_gpu_r600_R630, + eCore_amd_gpu_r600_RS880, + eCore_amd_gpu_r600_RV670, + eCore_amd_gpu_r600_RV710, + eCore_amd_gpu_r600_RV730, + eCore_amd_gpu_r600_RV770, + eCore_amd_gpu_r600_CEDAR, + eCore_amd_gpu_r600_CYPRESS, + eCore_amd_gpu_r600_JUNIPER, + eCore_amd_gpu_r600_REDWOOD, + eCore_amd_gpu_r600_SUMO, + eCore_amd_gpu_r600_BARTS, + eCore_amd_gpu_r600_CAICOS, + eCore_amd_gpu_r600_CAYMAN, + eCore_amd_gpu_r600_TURKS, + eCore_amd_gpu_gcn_GFX600, + eCore_amd_gpu_gcn_GFX601, + eCore_amd_gpu_gcn_GFX602, + eCore_amd_gpu_gcn_GFX700, + eCore_amd_gpu_gcn_GFX701, + eCore_amd_gpu_gcn_GFX702, + eCore_amd_gpu_gcn_GFX703, + eCore_amd_gpu_gcn_GFX704, + eCore_amd_gpu_gcn_GFX705, + eCore_amd_gpu_gcn_GFX801, + eCore_amd_gpu_gcn_GFX802, + eCore_amd_gpu_gcn_GFX803, + eCore_amd_gpu_gcn_GFX805, + eCore_amd_gpu_gcn_GFX810, + eCore_amd_gpu_gcn_GFX900, + eCore_amd_gpu_gcn_GFX902, + eCore_amd_gpu_gcn_GFX904, + eCore_amd_gpu_gcn_GFX906, + eCore_amd_gpu_gcn_GFX908, + eCore_amd_gpu_gcn_GFX909, + eCore_amd_gpu_gcn_GFX90A, + eCore_amd_gpu_gcn_GFX90C, + eCore_amd_gpu_gcn_GFX942, + eCore_amd_gpu_gcn_GFX950, + eCore_amd_gpu_gcn_GFX1010, + eCore_amd_gpu_gcn_GFX1011, + eCore_amd_gpu_gcn_GFX1012, + eCore_amd_gpu_gcn_GFX1013, + eCore_amd_gpu_gcn_GFX1030, + eCore_amd_gpu_gcn_GFX1031, + eCore_amd_gpu_gcn_GFX1032, + eCore_amd_gpu_gcn_GFX1033, + eCore_amd_gpu_gcn_GFX1034, + eCore_amd_gpu_gcn_GFX1035, + eCore_amd_gpu_gcn_GFX1036, + eCore_amd_gpu_gcn_GFX1100, + eCore_amd_gpu_gcn_GFX1101, + eCore_amd_gpu_gcn_GFX1102, + eCore_amd_gpu_gcn_GFX1103, + eCore_amd_gpu_gcn_GFX1150, + eCore_amd_gpu_gcn_GFX1151, + eCore_amd_gpu_gcn_GFX1152, + eCore_amd_gpu_gcn_GFX1153, + eCore_amd_gpu_gcn_GFX1154, + eCore_amd_gpu_gcn_GFX1170, + eCore_amd_gpu_gcn_GFX1171, + eCore_amd_gpu_gcn_GFX1172, + eCore_amd_gpu_gcn_GFX1200, + eCore_amd_gpu_gcn_GFX1201, + eCore_amd_gpu_gcn_GFX1250, + eCore_amd_gpu_gcn_GFX1251, + eCore_amd_gpu_gcn_GFX1310, + eCore_amd_gpu_gcn_GFX9_GENERIC, + eCore_amd_gpu_gcn_GFX9_4_GENERIC, + eCore_amd_gpu_gcn_GFX10_1_GENERIC, + eCore_amd_gpu_gcn_GFX10_3_GENERIC, + eCore_amd_gpu_gcn_GFX11_GENERIC, + eCore_amd_gpu_gcn_GFX12_GENERIC, + eCore_amd_gpu_gcn_GFX12_5_GENERIC, + eCore_amd_gpu_unknown, + kNumCores, kCore_invalid, @@ -286,7 +363,10 @@ class ArchSpec { kCore_mips64el_last = eCore_mips64r6el, kCore_mips_first = eCore_mips32, - kCore_mips_last = eCore_mips64r6el + kCore_mips_last = eCore_mips64r6el, + + kCore_amd_gpu_first = eCore_amd_gpu_r600_R600, + kCore_amd_gpu_last = eCore_amd_gpu_unknown }; @@ -454,6 +534,8 @@ class ArchSpec { uint32_t GetMachOCPUSubType() const; + uint32_t GetElfCPUSubType() const; + /// Architecture triple accessor. /// /// \return A triple describing this ArchSpec. diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 7e4190d673fc5..3ffdbc25a310b 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -362,6 +362,26 @@ static uint32_t loongarchVariantFromElfFlags(const elf::ELFHeader &header) { } } +static uint32_t AMDGPUVariantFromElfFlags(const elf::ELFHeader &header) { + // Only HSA objects encode the exact GPU model, as an EF_AMDGPU_MACH value. + if (header.e_ident[EI_OSABI] == ELFOSABI_AMDGPU_HSA) { + switch (header.e_ident[EI_ABIVERSION]) { + // HSA V2 does not encode a CPU model. + case ELFABIVERSION_AMDGPU_HSA_V2: + break; + + case ELFABIVERSION_AMDGPU_HSA_V3: + case ELFABIVERSION_AMDGPU_HSA_V4: + case ELFABIVERSION_AMDGPU_HSA_V5: + case ELFABIVERSION_AMDGPU_HSA_V6: + // The CPU model is the EF_AMDGPU_MACH value in the bottom byte of + // e_flags. + return header.e_flags & EF_AMDGPU_MACH; + } + } + return LLDB_INVALID_CPUTYPE; +} + static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) { if (header.e_machine == llvm::ELF::EM_MIPS) return mipsVariantFromElfFlags(header); @@ -371,6 +391,8 @@ static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) { return riscvVariantFromElfFlags(header); else if (header.e_machine == llvm::ELF::EM_LOONGARCH) return loongarchVariantFromElfFlags(header); + else if (header.e_machine == llvm::ELF::EM_AMDGPU) + return AMDGPUVariantFromElfFlags(header); return LLDB_INVALID_CPUTYPE; } @@ -584,6 +606,9 @@ static bool GetOsFromOSABI(unsigned char osabi_byte, case ELFOSABI_SOLARIS: ostype = llvm::Triple::OSType::Solaris; break; + case ELFOSABI_AMDGPU_HSA: + ostype = llvm::Triple::OSType::AMDHSA; + break; default: ostype = llvm::Triple::OSType::UnknownOS; } @@ -618,7 +643,6 @@ ModuleSpecList ObjectFileELF::GetModuleSpecifications( if (spec.GetArchitecture().IsValid()) { llvm::Triple::OSType ostype; - llvm::Triple::VendorType vendor; llvm::Triple::OSType spec_ostype = spec.GetArchitecture().GetTriple().getOS(); @@ -626,12 +650,6 @@ ModuleSpecList ObjectFileELF::GetModuleSpecifications( __FUNCTION__, file.GetPath().c_str(), OSABIAsCString(header.e_ident[EI_OSABI])); - // SetArchitecture should have set the vendor to unknown - vendor = spec.GetArchitecture().GetTriple().getVendor(); - assert(vendor == llvm::Triple::UnknownVendor); - UNUSED_IF_ASSERT_DISABLED(vendor); - - // // Validate it is ok to remove GetOsFromOSABI GetOsFromOSABI(header.e_ident[EI_OSABI], ostype); assert(spec_ostype == ostype); diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp index 6eecf4f1b0995..3f2c792171a87 100644 --- a/lldb/source/Utility/ArchSpec.cpp +++ b/lldb/source/Utility/ArchSpec.cpp @@ -13,6 +13,7 @@ #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" @@ -40,6 +41,22 @@ struct CoreDefinition { } // 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::amdgcn, \ + ArchSpec::eCore_amd_gpu_gcn_##sub, \ + "amdgcn"} // 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, @@ -254,6 +271,83 @@ static constexpr const CoreDefinition g_core_definitions[] = { {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), + 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), + {eByteOrderLittle, 8, 4, 16, llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_unknown, "amdgcn"}, }; // Ensure that we have an entry in the g_core_definitions for each core. If you @@ -383,6 +477,12 @@ 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 @@ -421,6 +521,83 @@ static const ArchDefinitionEntry g_elf_arch_entries[] = { {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), + 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), + // Any AMDGPU object with no recognized model resolves here. + {ArchSpec::eCore_amd_gpu_unknown, llvm::ELF::EM_AMDGPU}, }; // clang-format on @@ -524,6 +701,8 @@ FindArchDefinitionEntry(const ArchDefinition *def, ArchSpec::Core core) { return nullptr; } +static llvm::StringRef GetAMDGPUVariantName(uint32_t sub); + //===----------------------------------------------------------------------===// // Constructors and destructors. @@ -652,33 +831,49 @@ std::string ArchSpec::GetClangTargetCPU() const { 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; } -uint32_t ArchSpec::GetMachOCPUType() const { - const CoreDefinition *core_def = FindCoreDefinition(m_core); - if (core_def) { - const ArchDefinitionEntry *arch_def = - FindArchDefinitionEntry(&g_macho_arch_def, core_def->core); - if (arch_def) { - return arch_def->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; } -uint32_t ArchSpec::GetMachOCPUSubType() const { - const CoreDefinition *core_def = FindCoreDefinition(m_core); - if (core_def) { - const ArchDefinitionEntry *arch_def = - FindArchDefinitionEntry(&g_macho_arch_def, core_def->core); - if (arch_def) { - return arch_def->sub; - } - } +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) @@ -849,6 +1044,249 @@ void ArchSpec::MergeFrom(const ArchSpec &other) { } } +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: + 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"; + 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", 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) + .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; @@ -900,6 +1338,10 @@ bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu, 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); @@ -911,10 +1353,24 @@ bool ArchSpec::SetArchitecture(ArchitectureType arch_type, uint32_t cpu, m_triple.setVendor(llvm::Triple::UnknownVendor); m_triple.setOS(llvm::Triple::UnknownOS); } - // Fall back onto setting the machine type if the arch by name - // failed... - if (m_triple.getArch() == llvm::Triple::UnknownArch) + 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::amdgcn: { + // 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)); @@ -1065,6 +1521,16 @@ void ArchSpec::UpdateCore() { // can be modified if needed for cases when cores handle both big and // little endian m_byte_order = core_def->default_byte_order; + + // amdgcn/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(); } diff --git a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp index 6da2663ff3ae4..971f42d040d7c 100644 --- a/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp +++ b/lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp @@ -191,6 +191,295 @@ TEST_F(ObjectFileELFTest, GetModuleSpecifications_OffsetSizeWithOffsetFile) { EXPECT_EQ(FileSystem::Instance().GetByteSize(FileSpec(SO)), 4640UL); } +// Verify an AMDGPU ELF header decodes to its exact GPU model. +TEST_F(ObjectFileELFTest, GPUArchitectureFromAMDGPUHeader) { + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_AMDGPU_HSA + ABIVersion: 0x1 + Type: ET_DYN + Machine: EM_AMDGPU + Flags: [ EF_AMDGPU_MACH_AMDGCN_GFX942 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000000020 + Size: 0x0000000000000040 +... +)"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + + auto module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec()); + const ArchSpec &arch = module_sp->GetArchitecture(); + ASSERT_TRUE(arch.IsValid()); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_gcn_GFX942, arch.GetCore()); + EXPECT_EQ(llvm::Triple::amdgcn, arch.GetTriple().getArch()); + EXPECT_EQ(llvm::Triple::AMD, arch.GetTriple().getVendor()); + EXPECT_EQ(llvm::Triple::AMDHSA, arch.GetTriple().getOS()); +} + +// An AMDGPU object with no decodable model resolves to the generic "unknown" +// catch-all. +TEST_F(ObjectFileELFTest, GPUArchitectureUnknownAMDGPUModel) { + // No model byte is parsed unless the OS ABI is AMDGPU HSA. + { + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_NONE + Type: ET_DYN + Machine: EM_AMDGPU +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000000020 + Size: 0x0000000000000040 +... +)"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + auto module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec()); + const ArchSpec &arch = module_sp->GetArchitecture(); + ASSERT_TRUE(arch.IsValid()); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_unknown, arch.GetCore()); + } + + // HSA code-object v2 (ABIVersion 0) carries no model byte, so even a + // populated mach flag is ignored. + { + auto ExpectedFile = TestFile::fromYaml(R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_AMDGPU_HSA + ABIVersion: 0x0 + Type: ET_DYN + Machine: EM_AMDGPU + Flags: [ EF_AMDGPU_MACH_AMDGCN_GFX942 ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000000020 + Size: 0x0000000000000040 +... +)"); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + auto module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec()); + const ArchSpec &arch = module_sp->GetArchitecture(); + ASSERT_TRUE(arch.IsValid()); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_unknown, arch.GetCore()); + } +} + +struct AMDGPUMachToCore { + const char *mach_flag; + llvm::Triple::ArchType arch; + ArchSpec::Core core; +}; + +class ObjectFileELFAMDGPUTest + : public ObjectFileELFTest, + public ::testing::WithParamInterface<AMDGPUMachToCore> {}; + +// Every AMD GPU model must decode from an ELF header to the right arch and +// core. The model is the EF_AMDGPU_MACH value in e_flags. +static const AMDGPUMachToCore kAMDGPUMachCases[] = { + {"EF_AMDGPU_MACH_R600_R600", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_R600}, + {"EF_AMDGPU_MACH_R600_R630", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_R630}, + {"EF_AMDGPU_MACH_R600_RS880", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RS880}, + {"EF_AMDGPU_MACH_R600_RV670", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV670}, + {"EF_AMDGPU_MACH_R600_RV710", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV710}, + {"EF_AMDGPU_MACH_R600_RV730", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV730}, + {"EF_AMDGPU_MACH_R600_RV770", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV770}, + {"EF_AMDGPU_MACH_R600_CEDAR", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CEDAR}, + {"EF_AMDGPU_MACH_R600_CYPRESS", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CYPRESS}, + {"EF_AMDGPU_MACH_R600_JUNIPER", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_JUNIPER}, + {"EF_AMDGPU_MACH_R600_REDWOOD", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_REDWOOD}, + {"EF_AMDGPU_MACH_R600_SUMO", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_SUMO}, + {"EF_AMDGPU_MACH_R600_BARTS", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_BARTS}, + {"EF_AMDGPU_MACH_R600_CAICOS", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CAICOS}, + {"EF_AMDGPU_MACH_R600_CAYMAN", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CAYMAN}, + {"EF_AMDGPU_MACH_R600_TURKS", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_TURKS}, + {"EF_AMDGPU_MACH_AMDGCN_GFX600", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX600}, + {"EF_AMDGPU_MACH_AMDGCN_GFX601", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX601}, + {"EF_AMDGPU_MACH_AMDGCN_GFX602", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX602}, + {"EF_AMDGPU_MACH_AMDGCN_GFX700", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX700}, + {"EF_AMDGPU_MACH_AMDGCN_GFX701", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX701}, + {"EF_AMDGPU_MACH_AMDGCN_GFX702", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX702}, + {"EF_AMDGPU_MACH_AMDGCN_GFX703", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX703}, + {"EF_AMDGPU_MACH_AMDGCN_GFX704", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX704}, + {"EF_AMDGPU_MACH_AMDGCN_GFX705", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX705}, + {"EF_AMDGPU_MACH_AMDGCN_GFX801", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX801}, + {"EF_AMDGPU_MACH_AMDGCN_GFX802", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX802}, + {"EF_AMDGPU_MACH_AMDGCN_GFX803", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX803}, + {"EF_AMDGPU_MACH_AMDGCN_GFX805", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX805}, + {"EF_AMDGPU_MACH_AMDGCN_GFX810", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX810}, + {"EF_AMDGPU_MACH_AMDGCN_GFX900", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX900}, + {"EF_AMDGPU_MACH_AMDGCN_GFX902", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX902}, + {"EF_AMDGPU_MACH_AMDGCN_GFX904", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX904}, + {"EF_AMDGPU_MACH_AMDGCN_GFX906", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX906}, + {"EF_AMDGPU_MACH_AMDGCN_GFX908", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX908}, + {"EF_AMDGPU_MACH_AMDGCN_GFX909", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX909}, + {"EF_AMDGPU_MACH_AMDGCN_GFX90A", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX90A}, + {"EF_AMDGPU_MACH_AMDGCN_GFX90C", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX90C}, + {"EF_AMDGPU_MACH_AMDGCN_GFX942", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX942}, + {"EF_AMDGPU_MACH_AMDGCN_GFX950", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX950}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1010", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1010}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1011", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1011}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1012", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1012}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1013", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1013}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1030", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1030}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1031", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1031}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1032", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1032}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1033", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1033}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1034", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1034}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1035", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1035}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1036", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1036}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1100", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1100}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1101", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1101}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1102", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1102}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1103", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1103}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1150", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1150}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1151", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1151}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1152", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1152}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1153", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1153}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1154", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1154}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1170", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1170}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1171", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1171}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1172", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1172}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1200", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1200}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1201", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1201}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1250", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1250}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1251", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1251}, + {"EF_AMDGPU_MACH_AMDGCN_GFX1310", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1310}, + {"EF_AMDGPU_MACH_AMDGCN_GFX9_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX9_GENERIC}, + {"EF_AMDGPU_MACH_AMDGCN_GFX9_4_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX9_4_GENERIC}, + {"EF_AMDGPU_MACH_AMDGCN_GFX10_1_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX10_1_GENERIC}, + {"EF_AMDGPU_MACH_AMDGCN_GFX10_3_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX10_3_GENERIC}, + {"EF_AMDGPU_MACH_AMDGCN_GFX11_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX11_GENERIC}, + {"EF_AMDGPU_MACH_AMDGCN_GFX12_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX12_GENERIC}, + {"EF_AMDGPU_MACH_AMDGCN_GFX12_5_GENERIC", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX12_5_GENERIC}, +}; + +TEST_P(ObjectFileELFAMDGPUTest, DecodesAMDGPUModel) { + const AMDGPUMachToCore &tc = GetParam(); + std::string yaml = R"(--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_AMDGPU_HSA + ABIVersion: 0x1 + Type: ET_DYN + Machine: EM_AMDGPU + Flags: [ )" + + std::string(tc.mach_flag) + R"( ] +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x0000000000000020 + Size: 0x0000000000000040 +... +)"; + auto ExpectedFile = TestFile::fromYaml(yaml); + ASSERT_THAT_EXPECTED(ExpectedFile, llvm::Succeeded()); + auto module_sp = std::make_shared<Module>(ExpectedFile->moduleSpec()); + const ArchSpec &arch = module_sp->GetArchitecture(); + ASSERT_TRUE(arch.IsValid()); + EXPECT_EQ(tc.core, arch.GetCore()); + EXPECT_EQ(tc.arch, arch.GetTriple().getArch()); +} + +INSTANTIATE_TEST_SUITE_P( + AMDGPUModels, ObjectFileELFAMDGPUTest, + ::testing::ValuesIn(kAMDGPUMachCases), + [](const ::testing::TestParamInfo<AMDGPUMachToCore> &info) { + return std::string(info.param.mach_flag); + }); + TEST_F(ObjectFileELFTest, GetSymtab_SynthesizedEntryPointSymbol) { auto ExpectedFile = TestFile::fromYaml(R"( --- !ELF diff --git a/lldb/unittests/Utility/ArchSpecTest.cpp b/lldb/unittests/Utility/ArchSpecTest.cpp index 2f6cc01a315e8..46ec3b67baf34 100644 --- a/lldb/unittests/Utility/ArchSpecTest.cpp +++ b/lldb/unittests/Utility/ArchSpecTest.cpp @@ -155,6 +155,233 @@ TEST(ArchSpecTest, TestSetTriple) { EXPECT_FALSE(AS.SetTriple("")); } +TEST(ArchSpecTest, TestSetArchitectureFromELFForGPU) { + // GCN: the model is the bottom byte of e_flags, passed as the sub type. + { + ArchSpec AS; + EXPECT_TRUE(AS.SetArchitecture(eArchTypeELF, llvm::ELF::EM_AMDGPU, + llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX942, + llvm::ELF::ELFOSABI_AMDGPU_HSA)); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_gcn_GFX942, AS.GetCore()); + EXPECT_EQ(llvm::Triple::amdgcn, AS.GetTriple().getArch()); + EXPECT_EQ(llvm::Triple::AMD, AS.GetTriple().getVendor()); + EXPECT_EQ(llvm::Triple::AMDHSA, AS.GetTriple().getOS()); + EXPECT_EQ(llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX942, AS.GetElfCPUSubType()); + EXPECT_EQ("gfx942", AS.GetClangTargetCPU()); + + // Round-trip through the triple string to recover the model. + ArchSpec RT(AS.GetTriple().str()); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_gcn_GFX942, RT.GetCore()); + } + + // A newer GCN model still resolves. + { + ArchSpec AS; + EXPECT_TRUE(AS.SetArchitecture(eArchTypeELF, llvm::ELF::EM_AMDGPU, + llvm::ELF::EF_AMDGPU_MACH_AMDGCN_GFX1310, + llvm::ELF::ELFOSABI_AMDGPU_HSA)); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_gcn_GFX1310, AS.GetCore()); + EXPECT_EQ("gfx1310", AS.GetClangTargetCPU()); + } + + // AMD R600 (legacy) GPU. + { + ArchSpec AS; + EXPECT_TRUE(AS.SetArchitecture(eArchTypeELF, llvm::ELF::EM_AMDGPU, + llvm::ELF::EF_AMDGPU_MACH_R600_CAYMAN, + llvm::ELF::ELFOSABI_AMDGPU_HSA)); + EXPECT_EQ(ArchSpec::eCore_amd_gpu_r600_CAYMAN, AS.GetCore()); + EXPECT_EQ(llvm::Triple::r600, AS.GetTriple().getArch()); + } +} + +struct AMDGPUTripleToCore { + const char *triple; + llvm::Triple::ArchType arch; + ArchSpec::Core core; +}; + +class ArchSpecAMDGPUTripleTest + : public ::testing::TestWithParam<AMDGPUTripleToCore> {}; + +// SetTriple() must map every AMD GPU triple to the correct arch and core. This +// exercises ArchSpec::UpdateCore(), which refines the core from the GPU model +// in the triple environment. +static const AMDGPUTripleToCore kAMDGPUTripleCases[] = { + // R600 (legacy) models. + {"r600-amd-amdhsa--r600", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_R600}, + {"r600-amd-amdhsa--r630", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_R630}, + {"r600-amd-amdhsa--rs880", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RS880}, + {"r600-amd-amdhsa--rv670", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV670}, + {"r600-amd-amdhsa--rv710", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV710}, + {"r600-amd-amdhsa--rv730", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV730}, + {"r600-amd-amdhsa--rv770", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_RV770}, + {"r600-amd-amdhsa--cedar", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CEDAR}, + {"r600-amd-amdhsa--cypress", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CYPRESS}, + {"r600-amd-amdhsa--juniper", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_JUNIPER}, + {"r600-amd-amdhsa--redwood", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_REDWOOD}, + {"r600-amd-amdhsa--sumo", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_SUMO}, + {"r600-amd-amdhsa--barts", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_BARTS}, + {"r600-amd-amdhsa--caicos", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CAICOS}, + {"r600-amd-amdhsa--cayman", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_CAYMAN}, + {"r600-amd-amdhsa--turks", llvm::Triple::r600, + ArchSpec::eCore_amd_gpu_r600_TURKS}, + // GCN models. + {"amdgcn-amd-amdhsa--gfx600", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX600}, + {"amdgcn-amd-amdhsa--gfx601", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX601}, + {"amdgcn-amd-amdhsa--gfx602", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX602}, + {"amdgcn-amd-amdhsa--gfx700", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX700}, + {"amdgcn-amd-amdhsa--gfx701", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX701}, + {"amdgcn-amd-amdhsa--gfx702", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX702}, + {"amdgcn-amd-amdhsa--gfx703", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX703}, + {"amdgcn-amd-amdhsa--gfx704", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX704}, + {"amdgcn-amd-amdhsa--gfx705", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX705}, + {"amdgcn-amd-amdhsa--gfx801", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX801}, + {"amdgcn-amd-amdhsa--gfx802", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX802}, + {"amdgcn-amd-amdhsa--gfx803", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX803}, + {"amdgcn-amd-amdhsa--gfx805", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX805}, + {"amdgcn-amd-amdhsa--gfx810", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX810}, + {"amdgcn-amd-amdhsa--gfx900", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX900}, + {"amdgcn-amd-amdhsa--gfx902", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX902}, + {"amdgcn-amd-amdhsa--gfx904", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX904}, + {"amdgcn-amd-amdhsa--gfx906", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX906}, + {"amdgcn-amd-amdhsa--gfx908", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX908}, + {"amdgcn-amd-amdhsa--gfx909", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX909}, + {"amdgcn-amd-amdhsa--gfx90a", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX90A}, + {"amdgcn-amd-amdhsa--gfx90c", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX90C}, + {"amdgcn-amd-amdhsa--gfx942", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX942}, + {"amdgcn-amd-amdhsa--gfx950", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX950}, + {"amdgcn-amd-amdhsa--gfx1010", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1010}, + {"amdgcn-amd-amdhsa--gfx1011", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1011}, + {"amdgcn-amd-amdhsa--gfx1012", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1012}, + {"amdgcn-amd-amdhsa--gfx1013", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1013}, + {"amdgcn-amd-amdhsa--gfx1030", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1030}, + {"amdgcn-amd-amdhsa--gfx1031", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1031}, + {"amdgcn-amd-amdhsa--gfx1032", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1032}, + {"amdgcn-amd-amdhsa--gfx1033", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1033}, + {"amdgcn-amd-amdhsa--gfx1034", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1034}, + {"amdgcn-amd-amdhsa--gfx1035", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1035}, + {"amdgcn-amd-amdhsa--gfx1036", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1036}, + {"amdgcn-amd-amdhsa--gfx1100", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1100}, + {"amdgcn-amd-amdhsa--gfx1101", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1101}, + {"amdgcn-amd-amdhsa--gfx1102", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1102}, + {"amdgcn-amd-amdhsa--gfx1103", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1103}, + {"amdgcn-amd-amdhsa--gfx1150", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1150}, + {"amdgcn-amd-amdhsa--gfx1151", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1151}, + {"amdgcn-amd-amdhsa--gfx1152", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1152}, + {"amdgcn-amd-amdhsa--gfx1153", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1153}, + {"amdgcn-amd-amdhsa--gfx1154", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1154}, + {"amdgcn-amd-amdhsa--gfx1170", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1170}, + {"amdgcn-amd-amdhsa--gfx1171", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1171}, + {"amdgcn-amd-amdhsa--gfx1172", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1172}, + {"amdgcn-amd-amdhsa--gfx1200", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1200}, + {"amdgcn-amd-amdhsa--gfx1201", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1201}, + {"amdgcn-amd-amdhsa--gfx1250", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1250}, + {"amdgcn-amd-amdhsa--gfx1251", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1251}, + {"amdgcn-amd-amdhsa--gfx1310", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX1310}, + {"amdgcn-amd-amdhsa--gfx9-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX9_GENERIC}, + {"amdgcn-amd-amdhsa--gfx9-4-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX9_4_GENERIC}, + {"amdgcn-amd-amdhsa--gfx10-1-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX10_1_GENERIC}, + {"amdgcn-amd-amdhsa--gfx10-3-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX10_3_GENERIC}, + {"amdgcn-amd-amdhsa--gfx11-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX11_GENERIC}, + {"amdgcn-amd-amdhsa--gfx12-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX12_GENERIC}, + {"amdgcn-amd-amdhsa--gfx12-5-generic", llvm::Triple::amdgcn, + ArchSpec::eCore_amd_gpu_gcn_GFX12_5_GENERIC}, +}; + +TEST_P(ArchSpecAMDGPUTripleTest, SetTriple) { + const AMDGPUTripleToCore &tc = GetParam(); + ArchSpec AS; + EXPECT_TRUE(AS.SetTriple(tc.triple)); + EXPECT_EQ(tc.arch, AS.GetTriple().getArch()); + EXPECT_EQ(tc.core, AS.GetCore()); +} + +INSTANTIATE_TEST_SUITE_P( + AMDGPU, ArchSpecAMDGPUTripleTest, ::testing::ValuesIn(kAMDGPUTripleCases), + [](const ::testing::TestParamInfo<AMDGPUTripleToCore> &info) { + // Name each case by its model (the triple's last "--" component). + std::string name = + llvm::StringRef(info.param.triple).rsplit("--").second.str(); + for (char &c : name) + if (c == '-') + c = '_'; + return name; + }); + TEST(ArchSpecTest, MergeFrom) { { ArchSpec A; _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
