diff --git a/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h b/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h index 2553a086cd53b..7dd8b0b7d3778 100644 --- a/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h +++ b/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h @@ -217,6 +217,9 @@ class MCDisassembler { const MCSubtargetInfo& getSubtargetInfo() const { return STI; } + /// ELF-specific, set the ABI version from the object header. + virtual void setABIVersion(unsigned Version) {} + // Marked mutable because we cache it inside the disassembler, rather than // having to pass it around as an argument through all the autogenerated code. mutable raw_ostream *CommentStream = nullptr; diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h index 7124df50b561d..c9227da65708c 100644 --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -103,6 +103,8 @@ class ELFObjectFileBase : public ObjectFile { virtual uint16_t getEMachine() const = 0; + virtual uint8_t getEIdentABIVersion() const = 0; + std::vector getPltEntries() const; /// Returns a vector containing a symbol version for each dynamic symbol. @@ -251,6 +253,7 @@ ELFObjectFileBase::symbols() const { template class ELFObjectFile : public ELFObjectFileBase { uint16_t getEMachine() const override; uint16_t getEType() const override; + uint8_t getEIdentABIVersion() const override; uint64_t getSymbolSize(DataRefImpl Sym) const override; public: @@ -645,6 +648,10 @@ template uint16_t ELFObjectFile::getEType() const { return EF.getHeader().e_type; } +template uint8_t ELFObjectFile::getEIdentABIVersion() const { + return EF.getHeader().e_ident[ELF::EI_ABIVERSION]; +} + template uint64_t ELFObjectFile::getSymbolSize(DataRefImpl Sym) const { Expected SymOrErr = getSymbol(Sym); diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp index 9dedd39908989..fba9eb53c8a8b 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp @@ -47,12 +47,17 @@ using DecodeStatus = llvm::MCDisassembler::DecodeStatus; AMDGPUDisassembler::AMDGPUDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, MCInstrInfo const *MCII) : MCDisassembler(STI, Ctx), MCII(MCII), MRI(*Ctx.getRegisterInfo()), - MAI(*Ctx.getAsmInfo()), TargetMaxInstBytes(MAI.getMaxInstLength(&STI)) { + MAI(*Ctx.getAsmInfo()), TargetMaxInstBytes(MAI.getMaxInstLength(&STI)), + CodeObjectVersion(AMDGPU::getDefaultAMDHSACodeObjectVersion()) { // ToDo: AMDGPUDisassembler supports only VI ISA. if (!STI.hasFeature(AMDGPU::FeatureGCN3Encoding) && !isGFX10Plus()) report_fatal_error("Disassembly not yet supported for subtarget"); } +void AMDGPUDisassembler::setABIVersion(unsigned Version) { + CodeObjectVersion = AMDGPU::getAMDHSACodeObjectVersion(Version); +} + inline static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand& Opnd) { Inst.addOperand(Opnd); @@ -2202,8 +2207,7 @@ AMDGPUDisassembler::decodeKernelDescriptorDirective( KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32); } - // FIXME: We should be looking at the ELF header ABI version for this. - if (AMDGPU::getDefaultAMDHSACodeObjectVersion() >= AMDGPU::AMDHSA_COV5) + if (CodeObjectVersion >= AMDGPU::AMDHSA_COV5) PRINT_DIRECTIVE(".amdhsa_uses_dynamic_stack", KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK); diff --git a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h index 233581949d712..5a89b30f6fb36 100644 --- a/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h +++ b/llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h @@ -100,12 +100,15 @@ class AMDGPUDisassembler : public MCDisassembler { mutable uint64_t Literal64; mutable bool HasLiteral; mutable std::optional EnableWavefrontSize32; + unsigned CodeObjectVersion; public: AMDGPUDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, MCInstrInfo const *MCII); ~AMDGPUDisassembler() override = default; + void setABIVersion(unsigned Version) override; + DecodeStatus getInstruction(MCInst &MI, uint64_t &Size, ArrayRef Bytes, uint64_t Address, raw_ostream &CS) const override; diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp index 106fdb19f2789..89c066613bd91 100644 --- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp +++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp @@ -175,6 +175,17 @@ unsigned getDefaultAMDHSACodeObjectVersion() { return DefaultAMDHSACodeObjectVersion; } +unsigned getAMDHSACodeObjectVersion(unsigned ABIVersion) { + switch (ABIVersion) { + case ELF::ELFABIVERSION_AMDGPU_HSA_V4: + return 4; + case ELF::ELFABIVERSION_AMDGPU_HSA_V5: + return 5; + default: + return getDefaultAMDHSACodeObjectVersion(); + } +} + uint8_t getELFABIVersion(const Triple &T, unsigned CodeObjectVersion) { if (T.getOS() != Triple::AMDHSA) return 0; diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h index 11b0bc5c81711..c0be034ff0ebd 100644 --- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h +++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h @@ -50,12 +50,15 @@ bool isHsaAbi(const MCSubtargetInfo &STI); /// \returns Code object version from the IR module flag. unsigned getAMDHSACodeObjectVersion(const Module &M); +/// \returns Code object version from ELF's e_ident[EI_ABIVERSION]. +unsigned getAMDHSACodeObjectVersion(unsigned ABIVersion); + /// \returns The default HSA code object version. This should only be used when /// we lack a more accurate CodeObjectVersion value (e.g. from the IR module /// flag or a .amdhsa_code_object_version directive) unsigned getDefaultAMDHSACodeObjectVersion(); -/// \returns ABIVersion suitable for use in ELF's e_ident[ABIVERSION]. \param +/// \returns ABIVersion suitable for use in ELF's e_ident[EI_ABIVERSION]. \param /// CodeObjectVersion is a value returned by getAMDHSACodeObjectVersion(). uint8_t getELFABIVersion(const Triple &OS, unsigned CodeObjectVersion); diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-cov5.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-cov5.s new file mode 100644 index 0000000000000..ece36c6ad2672 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-cov5.s @@ -0,0 +1,21 @@ +; RUN: sed 's/CODE_OBJECT_VERSION/5/g' %s \ +; RUN: | llvm-mc --triple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=-xnack,+wavefrontsize32,-wavefrontsize64 -filetype=obj > %t.o +; RUN: llvm-objdump --disassemble-symbols=kernel.kd %t.o | FileCheck %s --check-prefixes=COV5,CHECK + +; RUN: sed 's/CODE_OBJECT_VERSION/4/g' %s \ +; RUN: | llvm-mc --triple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=-xnack,+wavefrontsize32,-wavefrontsize64 -filetype=obj > %t.o +; RUN: llvm-objdump --disassemble-symbols=kernel.kd %t.o | FileCheck %s --check-prefixes=COV4,CHECK + +;; Verify that .amdhsa_uses_dynamic_stack is only printed on COV5+. + +; CHECK: .amdhsa_kernel kernel +; COV5: .amdhsa_uses_dynamic_stack 0 +; COV4-NOT: .amdhsa_uses_dynamic_stack +; CHECK: .end_amdhsa_kernel + +.amdhsa_code_object_version CODE_OBJECT_VERSION + +.amdhsa_kernel kernel + .amdhsa_next_free_vgpr 32 + .amdhsa_next_free_sgpr 32 +.end_amdhsa_kernel diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx10.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx10.s index 781729d5c4cc1..81d0d868ab918 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx10.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx10.s @@ -4,7 +4,8 @@ ;--- 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize32,-wavefrontsize64 -filetype=obj -mcpu=gfx1010 < 1.s > 1.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee 1-disasm.s | FileCheck 1.s +; RUN: echo '.amdhsa_code_object_version 5' > 1-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee -a 1-disasm.s | FileCheck 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize32,-wavefrontsize64 -filetype=obj -mcpu=gfx1010 < 1-disasm.s > 1-disasm.o ; RUN: cmp 1.o 1-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -50,6 +51,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 1 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -58,7 +60,8 @@ ;--- 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1010 < 2.s > 2.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee 2-disasm.s | FileCheck 2.s +; RUN: echo '.amdhsa_code_object_version 5' > 2-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee -a 2-disasm.s | FileCheck 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1010 < 2-disasm.s > 2-disasm.o ; RUN: cmp 2.o 2-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -104,6 +107,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -112,7 +116,8 @@ ;--- 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1010 < 3.s > 3.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee 3-disasm.s | FileCheck 3.s +; RUN: echo '.amdhsa_code_object_version 5' > 3-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee -a 3-disasm.s | FileCheck 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1010 < 3-disasm.s > 3-disasm.o ; RUN: cmp 3.o 3-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -158,6 +163,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -166,7 +172,8 @@ ;--- 4.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1010 < 4.s > 4.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 4.o | tail -n +7 | tee 4-disasm.s | FileCheck 4.s +; RUN: echo '.amdhsa_code_object_version 5' > 4-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 4.o | tail -n +7 | tee -a 4-disasm.s | FileCheck 4.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack,+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1010 < 4-disasm.s > 4-disasm.o ; RUN: cmp 4.o 4-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -212,6 +219,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx11.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx11.s index 019c20754f389..750809128189f 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx11.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx11.s @@ -4,7 +4,8 @@ ;--- 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize32,-wavefrontsize64 -filetype=obj -mcpu=gfx1100 < 1.s > 1.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee 1-disasm.s | FileCheck 1.s +; RUN: echo '.amdhsa_code_object_version 5' > 1-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee -a 1-disasm.s | FileCheck 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize32,-wavefrontsize64 -filetype=obj -mcpu=gfx1100 < 1-disasm.s > 1-disasm.o ; RUN: cmp 1.o 1-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -51,6 +52,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 1 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -59,7 +61,8 @@ ;--- 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1100 < 2.s > 2.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee 2-disasm.s | FileCheck 2.s +; RUN: echo '.amdhsa_code_object_version 5' > 2-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee -a 2-disasm.s | FileCheck 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1100 < 2-disasm.s > 2-disasm.o ; RUN: cmp 2.o 2-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -106,6 +109,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -114,7 +118,8 @@ ;--- 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1100 < 3.s > 3.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee 3-disasm.s | FileCheck 3.s +; RUN: echo '.amdhsa_code_object_version 5' > 3-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee -a 3-disasm.s | FileCheck 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1100 < 3-disasm.s > 3-disasm.o ; RUN: cmp 3.o 3-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -161,6 +166,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -169,7 +175,8 @@ ;--- 4.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1100 < 4.s > 4.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 4.o | tail -n +7 | tee 4-disasm.s | FileCheck 4.s +; RUN: echo '.amdhsa_code_object_version 5' > 4-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 4.o | tail -n +7 | tee -a 4-disasm.s | FileCheck 4.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64,-wavefrontsize32 -filetype=obj -mcpu=gfx1100 < 4-disasm.s > 4-disasm.o ; RUN: cmp 4.o 4-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -216,6 +223,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx12.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx12.s index 86af4810059ec..c644e15efc8d7 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx12.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx12.s @@ -4,7 +4,8 @@ ;--- 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize32,-wavefrontsize64 -filetype=obj -mcpu=gfx1200 < 1.s > 1.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee 1-disasm.s | FileCheck 1.s +; RUN: echo '.amdhsa_code_object_version 5' > 1-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee -a 1-disasm.s | FileCheck 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=+wavefrontsize32,-wavefrontsize64 -filetype=obj -mcpu=gfx1200 < 1-disasm.s > 1-disasm.o ; RUN: cmp 1.o 1-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -48,6 +49,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 1 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 @@ -56,7 +58,8 @@ ;--- 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-wavefrontsize32,+wavefrontsize64 -filetype=obj -mcpu=gfx1200 < 2.s > 2.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee 2-disasm.s | FileCheck 2.s +; RUN: echo '.amdhsa_code_object_version 5' > 2-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee -a 2-disasm.s | FileCheck 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-wavefrontsize32,+wavefrontsize64 -filetype=obj -mcpu=gfx1200 < 2-disasm.s > 2-disasm.o ; RUN: cmp 2.o 2-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -100,6 +103,7 @@ ; CHECK-NEXT: .amdhsa_wavefront_size32 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 32 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx90a.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx90a.s index 4978f6974fd33..d1062c8946677 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx90a.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-gfx90a.s @@ -4,7 +4,8 @@ ;--- 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx90a < 1.s > 1.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee 1-disasm.s | FileCheck 1.s +; RUN: echo '.amdhsa_code_object_version 5' > 1-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee -a 1-disasm.s | FileCheck 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx90a < 1-disasm.s > 1-disasm.o ; RUN: cmp 1.o 1-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -47,6 +48,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 0 .amdhsa_next_free_sgpr 0 @@ -55,7 +57,8 @@ ;--- 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx90a < 2.s > 2.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee 2-disasm.s | FileCheck 2.s +; RUN: echo '.amdhsa_code_object_version 5' > 2-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee -a 2-disasm.s | FileCheck 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx90a < 2-disasm.s > 2-disasm.o ; RUN: cmp 2.o 2-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -98,6 +101,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 0 @@ -106,7 +110,8 @@ ;--- 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx90a < 3.s > 3.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee 3-disasm.s | FileCheck 3.s +; RUN: echo '.amdhsa_code_object_version 5' > 3-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee -a 3-disasm.s | FileCheck 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx90a < 3-disasm.s > 3-disasm.o ; RUN: cmp 3.o 3-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -151,6 +156,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_kernarg_preload_length 2 ; CHECK-NEXT: .amdhsa_user_sgpr_kernarg_preload_offset 1 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 0 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-sgpr.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-sgpr.s index a40cf1d377693..021d7b415e5ed 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-sgpr.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-sgpr.s @@ -5,7 +5,8 @@ ;--- 1.s ;; Only set next_free_sgpr. ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 1.s > 1.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee 1-disasm.s | FileCheck 1.s +; RUN: echo '.amdhsa_code_object_version 5' > 1-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee -a 1-disasm.s | FileCheck 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 1-disasm.s > 1-disasm.o ; RUN: cmp 1.o 1-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -46,6 +47,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 0 .amdhsa_next_free_sgpr 42 @@ -57,7 +59,8 @@ ;--- 2.s ;; Only set other directives. ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 2.s > 2.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee 2-disasm.s | FileCheck 2.s +; RUN: echo '.amdhsa_code_object_version 5' > 2-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee -a 2-disasm.s | FileCheck 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 2-disasm.s > 2-disasm.o ; RUN: cmp 2.o 2-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -98,6 +101,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 0 .amdhsa_next_free_sgpr 0 @@ -109,7 +113,8 @@ ;--- 3.s ;; Set all affecting directives. ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 3.s > 3.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee 3-disasm.s | FileCheck 3.s +; RUN: echo '.amdhsa_code_object_version 5' > 3-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee -a 3-disasm.s | FileCheck 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 3-disasm.s > 3-disasm.o ; RUN: cmp 3.o 3-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -150,6 +155,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 0 .amdhsa_next_free_sgpr 35 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-vgpr.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-vgpr.s index b6b9c91b14246..3c0bfd7e372b9 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-vgpr.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-vgpr.s @@ -4,7 +4,8 @@ ;--- 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 1.s > 1.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee 1-disasm.s | FileCheck 1.s +; RUN: echo '.amdhsa_code_object_version 5' > 1-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 1.o | tail -n +7 | tee -a 1-disasm.s | FileCheck 1.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 1-disasm.s > 1-disasm.o ; RUN: cmp 1.o 1-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -45,6 +46,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 23 .amdhsa_next_free_sgpr 0 @@ -52,7 +54,8 @@ ;--- 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 2.s > 2.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee 2-disasm.s | FileCheck 2.s +; RUN: echo '.amdhsa_code_object_version 5' > 2-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 2.o | tail -n +7 | tee -a 2-disasm.s | FileCheck 2.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 2-disasm.s > 2-disasm.o ; RUN: cmp 2.o 2-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -93,6 +96,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 14 .amdhsa_next_free_sgpr 0 @@ -100,7 +104,8 @@ ;--- 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 3.s > 3.o -; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee 3-disasm.s | FileCheck 3.s +; RUN: echo '.amdhsa_code_object_version 5' > 3-disasm.s +; RUN: llvm-objdump --disassemble-symbols=kernel.kd 3.o | tail -n +7 | tee -a 3-disasm.s | FileCheck 3.s ; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mattr=-xnack -filetype=obj -mcpu=gfx908 < 3-disasm.s > 3-disasm.o ; RUN: cmp 3.o 3-disasm.o ; CHECK: .amdhsa_kernel kernel @@ -141,6 +146,7 @@ ; CHECK-NEXT: .amdhsa_user_sgpr_private_segment_size 0 ; CHECK-NEXT: .amdhsa_uses_dynamic_stack 0 ; CHECK-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel kernel .amdhsa_next_free_vgpr 32 .amdhsa_next_free_sgpr 0 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s index 39739c957350c..f9d68e81e940b 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx10.s @@ -65,6 +65,7 @@ ; OBJDUMP-NEXT: .amdhsa_uses_dynamic_stack 0 ; OBJDUMP-NEXT: .end_amdhsa_kernel +.amdhsa_code_object_version 5 .amdhsa_kernel my_kernel .amdhsa_group_segment_fixed_size 0 .amdhsa_private_segment_fixed_size 0 diff --git a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx9.s b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx9.s index 78b405097cf60..5f8e9ad5c1929 100644 --- a/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx9.s +++ b/llvm/test/tools/llvm-objdump/ELF/AMDGPU/kd-zeroed-gfx9.s @@ -1,8 +1,9 @@ ;; Entirely zeroed kernel descriptor (for GFX9). ; RUN: llvm-mc %s --triple=amdgcn-amd-amdhsa -mcpu=gfx908 -mattr=-xnack -filetype=obj -o %t1 -; RUN: llvm-objdump --disassemble-symbols=my_kernel.kd %t1 \ -; RUN: | tail -n +7 | llvm-mc --triple=amdgcn-amd-amdhsa -mcpu=gfx908 -mattr=-xnack -filetype=obj -o %t2 +; RUN: echo '.amdhsa_code_object_version 5' > %t2.s +; RUN: llvm-objdump --disassemble-symbols=my_kernel.kd %t1 | tail -n +7 >> %t2.s +; RUN: llvm-mc --triple=amdgcn-amd-amdhsa -mcpu=gfx908 -mattr=-xnack -filetype=obj -o %t2 %t2.s ; RUN: diff %t1 %t2 ; RUN: llvm-objdump -s -j .text %t1 | FileCheck --check-prefix=OBJDUMP %s @@ -15,6 +16,7 @@ ;; This file and kd-zeroed-raw.s produce the same output for the kernel ;; descriptor - a block of 64 zeroed bytes. +.amdhsa_code_object_version 5 .amdhsa_kernel my_kernel .amdhsa_group_segment_fixed_size 0 .amdhsa_private_segment_fixed_size 0 diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index a80f4c2d90865..7f57713e6f946 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -913,6 +913,9 @@ DisassemblerTarget::DisassemblerTarget(const Target *TheTarget, ObjectFile &Obj, if (!DisAsm) reportError(Obj.getFileName(), "no disassembler for target " + TripleName); + if (auto *ELFObj = dyn_cast(&Obj)) + DisAsm->setABIVersion(ELFObj->getEIdentABIVersion()); + InstrAnalysis.reset(TheTarget->createMCInstrAnalysis(InstrInfo.get())); int AsmPrinterVariant = AsmInfo->getAssemblerDialect();