Index: lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h =================================================================== --- lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h +++ lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h @@ -20,6 +20,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCDisassembler/MCDisassembler.h" +#include "llvm/MC/MCDisassembler/MCELFNoteDisassembler.h" #include "llvm/MC/MCDisassembler/MCRelocationInfo.h" #include "llvm/MC/MCDisassembler/MCSymbolizer.h" #include "llvm/Object/ELFNoteDumper.h" @@ -169,6 +170,21 @@ support::endianness TargetEndianness, raw_ostream &OS) override; }; +//===----------------------------------------------------------------------===// +// AMDGPUMCELFNoteDisassembler +//===----------------------------------------------------------------------===// + +class AMDGPUMCELFNoteDisassembler : public MCELFNoteDisassembler { +public: + AMDGPUMCELFNoteDisassembler(MCContext &Ctx, const MCSubtargetInfo *STI) + : MCELFNoteDisassembler(Ctx, STI) {} + + // Disassemble one note from the ELF .note section. + // Returns false if the note type is not recognized or disassembly fails. + virtual bool disassembleNote(unsigned Type, StringRef Name, StringRef Desc, + support::endianness TargetEndianness, MCTargetStreamer *TS) override; +}; + } // end namespace llvm #endif // LLVM_LIB_TARGET_AMDGPU_DISASSEMBLER_AMDGPUDISASSEMBLER_H Index: lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp =================================================================== --- lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp +++ lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp @@ -970,6 +970,37 @@ } //===----------------------------------------------------------------------===// +// AMDGPUMCELFNoteDisassembler +//===----------------------------------------------------------------------===// + +// Disassemble one note from the ELF .note section. +// Returns false if the note type is not recognized or disassembly fails. +bool AMDGPUMCELFNoteDisassembler::disassembleNote(unsigned Type, StringRef Name, + StringRef Desc, support::endianness TargetEndianness, + MCTargetStreamer *TS) { + if (Name != "AMD") + return false; + auto ATS = static_cast(TS); + switch (Type) { + + // PAL metadata is in 32-bit words and only exists on AMDGPU, which is + // always little endian, so the following does not work if running + // llvm-readobj on a big-endian host. +#if BYTE_ORDER == LITTLE_ENDIAN + case ELF::NT_AMD_AMDGPU_PAL_METADATA: { + ArrayRef DescAsU32( + reinterpret_cast(Desc.data()), + Desc.size() / sizeof(uint32_t)); + AMDGPU::PALMD::Metadata MD(DescAsU32.begin(), DescAsU32.end()); + ATS->EmitPALMetadata(MD); + ATS->getStreamer().AddBlankLine(); + return true; + } +#endif + return false; +} + +//===----------------------------------------------------------------------===// // Initialization //===----------------------------------------------------------------------===// @@ -992,6 +1023,11 @@ return new AMDGPUELFNoteDumper(); } +static MCELFNoteDisassembler *createAMDGPUMCELFNoteDisassembler(const Target &T, + MCContext &Ctx, const MCSubtargetInfo &STI) { + return new AMDGPUMCELFNoteDisassembler(Ctx, &STI); +} + extern "C" void LLVMInitializeAMDGPUDisassembler() { TargetRegistry::RegisterMCDisassembler(getTheGCNTarget(), createAMDGPUDisassembler); @@ -999,4 +1035,6 @@ createAMDGPUSymbolizer); TargetRegistry::RegisterELFNoteDumper(getTheGCNTarget(), createAMDGPUELFNoteDumper); + TargetRegistry::RegisterMCELFNoteDisassembler(getTheGCNTarget(), + createAMDGPUMCELFNoteDisassembler); }