diff options
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 32 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ObjDumper.h | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 7 |
3 files changed, 42 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index dbeb03df9f4..a200c10296b 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -129,6 +129,8 @@ public: void printMipsReginfo() override; void printMipsOptions() override; + void printAMDGPURuntimeMD() override; + void printStackMap() const override; void printHashHistogram() override; @@ -2339,6 +2341,36 @@ template <class ELFT> void ELFDumper<ELFT>::printMipsOptions() { } } +template <class ELFT> void ELFDumper<ELFT>::printAMDGPURuntimeMD() { + const Elf_Shdr *Shdr = findSectionByName(*Obj, ".note"); + if (!Shdr) { + W.startLine() << "There is no .note section in the file.\n"; + return; + } + ArrayRef<uint8_t> Sec = unwrapOrError(Obj->getSectionContents(Shdr)); + + const uint32_t RuntimeMDNoteType = 7; + for (auto I = reinterpret_cast<const uint32_t *>(&Sec[0]), + E = I + Sec.size()/4; I != E;) { + uint32_t NameSZ = I[0]; + uint32_t DescSZ = I[1]; + uint32_t Type = I[2]; + I += 3; + + StringRef Name; + if (NameSZ) { + Name = StringRef(reinterpret_cast<const char *>(I), NameSZ - 1); + I += alignTo<4>(NameSZ)/4; + } + + if (Name == "AMD" && Type == RuntimeMDNoteType) { + StringRef Desc(reinterpret_cast<const char *>(I), DescSZ); + W.printString(Desc); + } + I += alignTo<4>(DescSZ)/4; + } +} + template <class ELFT> void ELFDumper<ELFT>::printStackMap() const { const Elf_Shdr *StackMapSection = nullptr; for (const auto &Sec : unwrapOrError(Obj->sections())) { diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index e3b65038aeb..c91558ecbfa 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/tools/llvm-readobj/ObjDumper.h @@ -58,6 +58,9 @@ public: virtual void printMipsReginfo() { } virtual void printMipsOptions() { } + // Only implemented for AMDGPU ELF at this time. + virtual void printAMDGPURuntimeMD() {} + // Only implemented for PE/COFF. virtual void printCOFFImports() { } virtual void printCOFFExports() { } diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index afe7521ea89..78e72ac7903 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -186,6 +186,10 @@ namespace opts { cl::opt<bool> MipsOptions("mips-options", cl::desc("Display the MIPS .MIPS.options section")); + // -amdgpu-runtime-metadata + cl::opt<bool> AMDGPURuntimeMD("amdgpu-runtime-metadata", + cl::desc("Display AMDGPU runtime metadata")); + // -coff-imports cl::opt<bool> COFFImports("coff-imports", cl::desc("Display the PE/COFF import table")); @@ -415,6 +419,9 @@ static void dumpObject(const ObjectFile *Obj) { if (opts::MipsOptions) Dumper->printMipsOptions(); } + if (Obj->getArch() == llvm::Triple::amdgcn) + if (opts::AMDGPURuntimeMD) + Dumper->printAMDGPURuntimeMD(); if (opts::SectionGroups) Dumper->printGroupSections(); if (opts::HashHistogram) |