summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp32
-rw-r--r--llvm/tools/llvm-readobj/ObjDumper.h3
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.cpp7
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)
OpenPOWER on IntegriCloud