diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/subtarget.ll @@ -0,0 +1,83 @@ +define amdgpu_kernel void @test_kernel() { + ret void +} + +; Test subtarget detection. +; +; ----------------------------------GFX10-------------------------------------- +; +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1030 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1030 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1012 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1012 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1011 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1011 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx1010 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + + +; ----------------------------------GFX9--------------------------------------- +; +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx909 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx909 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx908 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx908 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx906 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx904 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx904 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx902 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx902 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx900 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + + +; ----------------------------------GFX8--------------------------------------- +; +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx810 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx810 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx803 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx802 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx802 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt + +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx801 -filetype=obj -O0 -o %t.o %s +; RUN: llvm-objdump -D --arch-name=amdgcn --mcpu=gfx801 %t.o > specify.txt +; RUN: llvm-objdump -D %t.o > detect.txt +; RUN: diff specify.txt detect.txt diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -2067,6 +2067,61 @@ reportWarning("failed to disassemble missing symbol " + Sym, FileName); } +static Optional getAMDGPUCPU(const ObjectFile *Obj) { + using namespace llvm::ELF; +#define IS_AMDGPU_CPU(CPU_FLAG) ((Flags) & (CPU_FLAG)) == (CPU_FLAG) + + const ELF64LEFile *EF = cast>(Obj)->getELFFile(); + auto *TheElfHeader = EF->getHeader(); + assert(TheElfHeader->e_machine == ELF::EM_AMDGPU); + uint64_t Flags = TheElfHeader->e_flags; + + // Compare codes in descending order. + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX1030)) + return StringRef("gfx1030"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX1012)) + return StringRef("gfx1012"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX1011)) + return StringRef("gfx1011"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX1010)) + return StringRef("gfx1010"); + + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX909)) + return StringRef("gfx909"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX908)) + return StringRef("gfx908"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX906)) + return StringRef("gfx906"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX904)) + return StringRef("gfx904"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX902)) + return StringRef("gfx902"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX900)) + return StringRef("gfx900"); + + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX810)) + return StringRef("gfx810"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX803)) + return StringRef("gfx803"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX802)) + return StringRef("gfx802"); + if (IS_AMDGPU_CPU(EF_AMDGPU_MACH_AMDGCN_GFX801)) + return StringRef("gfx801"); + +#undef IS_AMDGPU_CPU + + return None; +} + +static Optional getTargetCPUIfPossible(const ObjectFile *Obj) { + switch (Obj->getArch()) { + case Triple::amdgcn: + return getAMDGPUCPU(Obj); + default: + return None; + } +} + static void disassembleObject(const ObjectFile *Obj, bool InlineRelocs) { const Target *TheTarget = getTarget(Obj); @@ -2089,6 +2144,11 @@ if (!AsmInfo) reportError(Obj->getFileName(), "no assembly info for target " + TripleName); + + auto TargetCPUString = getTargetCPUIfPossible(Obj); + if (MCPU.empty() && TargetCPUString) + MCPU = TargetCPUString.getValue().str(); + std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TripleName, MCPU, Features.getString())); if (!STI)