[Lldb-commits] [lldb] [lldb] Add AMD and NVIDIA GPU architectures to ArchSpec (PR #206246)
via lldb-commits
lldb-commits at lists.llvm.org
Sat Jun 27 05:57:53 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: satyanarayana reddy janga (satyajanga)
<details>
<summary>Changes</summary>
Teach ArchSpec and ObjectFileELF about AMD (R600 and GCN/amdgcn) and NVIDIA (nvptx/nvptx64) GPU architectures so GPU object files and triples resolve to a precise architecture.
- ArchSpec: add eCore_amd_gpu_* and eCore_nvidia_nvptx[64] cores with matching kCore ranges, core definitions, and ELF arch-definition entries (EM_AMDGPU + EF_AMDGPU_MACH_* flags, EM_CUDA). 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 GetElfCPUType/GetElfCPUSubType and GetData/CodeByteSize accessors.
- ObjectFileELF: decode the GPU model from the AMDGPU ELF header (AMDGPUVariantFromElfFlags) and map ELFOSABI_AMDGPU_HSA to the AMDHSA OS; allow the AMDGPU vendor in the post-detection validation.
- Tests: unit-test the ELF-header -> architecture mapping in ArchSpecTest and an end-to-end AMDGPU ELF in TestObjectFileELF.
---
Patch is 34.02 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/206246.diff
5 Files Affected:
- (modified) lldb/include/lldb/Utility/ArchSpec.h (+97-1)
- (modified) lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (+33-2)
- (modified) lldb/source/Utility/ArchSpec.cpp (+469-21)
- (modified) lldb/unittests/ObjectFile/ELF/TestObjectFileELF.cpp (+33)
- (modified) lldb/unittests/Utility/ArchSpecTest.cpp (+43)
``````````diff
diff --git a/lldb/include/lldb/Utility/ArchSpec.h b/lldb/include/lldb/Utility/ArchSpec.h
index 160f81c2fa501..633227abaa639 100644
--- a/lldb/include/lldb/Utility/ArchSpec.h
+++ b/lldb/include/lldb/Utility/ArchSpec.h
@@ -240,6 +240,80 @@ 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_r600_unknown,
+ 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_GFX1200,
+ eCore_amd_gpu_gcn_GFX1201,
+ eCore_amd_gpu_gcn_GFX1250,
+ 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_unknown,
+
+ eCore_nvidia_nvptx,
+ eCore_nvidia_nvptx64,
+
kNumCores,
kCore_invalid,
@@ -286,7 +360,13 @@ 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_gcn_unknown,
+
+ kCore_nvidia_gpu_first = eCore_nvidia_nvptx,
+ kCore_nvidia_gpu_last = eCore_nvidia_nvptx64
};
@@ -454,6 +534,22 @@ class ArchSpec {
uint32_t GetMachOCPUSubType() const;
+ uint32_t GetElfCPUType() const;
+
+ uint32_t GetElfCPUSubType() const;
+
+ /// Architecture data byte width accessor
+ ///
+ /// \return the size in 8-bit (host) bytes of a minimum addressable unit
+ /// from the Architecture's data bus
+ uint32_t GetDataByteSize() const;
+
+ /// Architecture code byte width accessor
+ ///
+ /// \return the size in 8-bit (host) bytes of a minimum addressable unit
+ /// from the Architecture's code bus
+ uint32_t GetCodeByteSize() 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..883de89ee9154 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -362,6 +362,29 @@ static uint32_t loongarchVariantFromElfFlags(const elf::ELFHeader &header) {
}
}
+static uint32_t AMDGPUVariantFromElfFlags(const elf::ELFHeader &header) {
+ // The flags contain the exact GPU model for HSA only. The sub type is set to
+ // a valid EF_AMDGPU_MACH_ define from the ELF.h file in llvm.
+ if (header.e_ident[EI_OSABI] == ELFOSABI_AMDGPU_HSA) {
+ switch (header.e_ident[EI_ABIVERSION]) {
+ case ELFABIVERSION_AMDGPU_HSA_V2:
+ // Flags bits not parsed for this include:
+ // EF_AMDGPU_FEATURE_XNACK_V2
+ // EF_AMDGPU_FEATURE_TRAP_HANDLER_V2
+ break; // No CPU model is defined in HSA V2
+
+ case ELFABIVERSION_AMDGPU_HSA_V3:
+ case ELFABIVERSION_AMDGPU_HSA_V4:
+ case ELFABIVERSION_AMDGPU_HSA_V5:
+ case ELFABIVERSION_AMDGPU_HSA_V6:
+ // The sub type is the bottom byte of the e_flags which defines the
+ // EF_AMDGPU_MACH value that identifies the actual CPU model.
+ return header.e_flags & EF_AMDGPU_MACH;
+ }
+ }
+ return LLDB_INVALID_CPUTYPE; // No subtype.
+}
+
static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
if (header.e_machine == llvm::ELF::EM_MIPS)
return mipsVariantFromElfFlags(header);
@@ -371,6 +394,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 +609,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;
}
@@ -626,9 +654,12 @@ ModuleSpecList ObjectFileELF::GetModuleSpecifications(
__FUNCTION__, file.GetPath().c_str(),
OSABIAsCString(header.e_ident[EI_OSABI]));
- // SetArchitecture should have set the vendor to unknown
+ // SetArchitecture should have set the vendor to unknown, except for
+ // GPU architectures (e.g. AMDGPU) whose canonical triple names a
+ // vendor.
vendor = spec.GetArchitecture().GetTriple().getVendor();
- assert(vendor == llvm::Triple::UnknownVendor);
+ assert(vendor == llvm::Triple::UnknownVendor ||
+ spec.GetArchitecture().GetTriple().isAMDGPU());
UNUSED_IF_ASSERT_DISABLED(vendor);
//
diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp
index 6eecf4f1b0995..e19c2acb4d50b 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,80 @@ 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_R600(unknown),
+ 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(GFX1200),
+ AMD_GPU_CORE_DEF_GCN(GFX1201),
+ AMD_GPU_CORE_DEF_GCN(GFX1250),
+ 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(unknown),
+ {eByteOrderLittle, 4, 4, 4, llvm::Triple::nvptx,
+ ArchSpec::eCore_nvidia_nvptx, "nvptx"},
+ {eByteOrderLittle, 8, 4, 4, llvm::Triple::nvptx64,
+ ArchSpec::eCore_nvidia_nvptx64, "nvptx64"},
};
// Ensure that we have an entry in the g_core_definitions for each core. If you
@@ -383,6 +474,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 +518,81 @@ 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),
+ // Unknown AMD R600 GPU
+ {ArchSpec::eCore_amd_gpu_r600_unknown, llvm::ELF::EM_AMDGPU},
+ 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(GFX1200),
+ AMD_GPU_ARCH_DEF_GCN(GFX1201),
+ AMD_GPU_ARCH_DEF_GCN(GFX1250),
+ 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),
+ // Unknown AMD GCN GPU
+ {ArchSpec::eCore_amd_gpu_gcn_unknown, llvm::ELF::EM_AMDGPU},
+
+ {ArchSpec::eCore_nvidia_nvptx, llvm::ELF::EM_CUDA }, // NVIDIA GPU
+ {ArchSpec::eCore_nvidia_nvptx64, llvm::ELF::EM_CUDA },
};
// clang-format on
@@ -524,6 +696,8 @@ FindArchDefinitionEntry(const ArchDefinition *def, ArchSpec::Core core) {
return nullptr;
}
+static llvm::StringRef GetAMDGPUVariantName(uint32_t sub);
+
//===----------------------------------------------------------------------===//
// Constructors and destructors.
@@ -652,33 +826,57 @@ 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::GetElfCPUType() const {
+ return GetCPUType(&g_elf_arch_def, m_core);
+}
+
+uint32_t ArchSpec::GetElfCPUSubType() const {
+ return GetCPUSubType(&g_elf_arch_def, m_core);
+}
+
+uint32_t ArchSpec::GetDataByteSize() const { return 1; }
+
+uint32_t ArchSpec::GetCodeByteSize() const { return 1; }
+
llvm::Triple::ArchType ArchSpec::GetMachine() const {
const CoreDefinition *core_def = FindCoreDefinition(m_core);
if (core_def)
@@ -849,6 +1047,228 @@ 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 ...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/206246
More information about the lldb-commits
mailing list