summaryrefslogtreecommitdiff
path: root/tools/llvm-readobj/ELFDumper.cpp
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-01-30 04:46:33 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-01-30 04:46:33 +0000
commit459c9497772f7d4e8567233a99f126198ec93b68 (patch)
tree93a072e96630a1deda04f3c44526be79f470514b /tools/llvm-readobj/ELFDumper.cpp
parent7a38b33decb80eff92060b7ad95ff1b877f685c3 (diff)
downloadllvm-459c9497772f7d4e8567233a99f126198ec93b68.tar.gz
llvm-459c9497772f7d4e8567233a99f126198ec93b68.tar.bz2
llvm-459c9497772f7d4e8567233a99f126198ec93b68.tar.xz
tools: add support for decoding ARM attributes
Enhance the ARM specific parsing support in llvm-readobj to support attributes. This allows for simpler tests to validate encoding of the build attributes as specified in the ARM ELF specification. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200450 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r--tools/llvm-readobj/ELFDumper.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp
index feb77fd564..bf3c9423f5 100644
--- a/tools/llvm-readobj/ELFDumper.cpp
+++ b/tools/llvm-readobj/ELFDumper.cpp
@@ -13,12 +13,15 @@
//===----------------------------------------------------------------------===//
#include "llvm-readobj.h"
+#include "ARMAttributeParser.h"
#include "ARMEHABIPrinter.h"
#include "Error.h"
#include "ObjDumper.h"
#include "StreamWriter.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Support/ARMBuildAttributes.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/MathExtras.h"
@@ -50,6 +53,8 @@ public:
virtual void printNeededLibraries() LLVM_OVERRIDE;
virtual void printProgramHeaders() LLVM_OVERRIDE;
+ virtual void printAttributes() LLVM_OVERRIDE;
+
private:
typedef ELFFile<ELFT> ELFO;
typedef typename ELFO::Elf_Shdr Elf_Shdr;
@@ -855,3 +860,42 @@ void ELFDumper<ELFT>::printProgramHeaders() {
W.printNumber("Alignment", PI->p_align);
}
}
+
+template <class ELFT>
+void ELFDumper<ELFT>::printAttributes() {
+ W.startLine() << "Attributes not implemented.\n";
+}
+
+namespace {
+template <>
+void ELFDumper<ELFType<support::little, 2, false> >::printAttributes() {
+ if (Obj->getHeader()->e_machine != EM_ARM) {
+ W.startLine() << "Attributes not implemented.\n";
+ return;
+ }
+
+ DictScope BA(W, "BuildAttributes");
+ for (typename ELFO::Elf_Shdr_Iter SI = Obj->begin_sections(),
+ SE = Obj->end_sections(); SI != SE; ++SI) {
+ if (SI->sh_type != ELF::SHT_ARM_ATTRIBUTES)
+ continue;
+
+ ErrorOr<ArrayRef<uint8_t> > Contents = Obj->getSectionContents(&(*SI));
+ if (!Contents)
+ continue;
+
+ if ((*Contents)[0] != ARMBuildAttrs::Format_Version) {
+ errs() << "unrecognised FormatVersion: 0x" << utohexstr((*Contents)[0])
+ << '\n';
+ continue;
+ }
+
+ W.printHex("FormatVersion", (*Contents)[0]);
+ if (Contents->size() == 1)
+ continue;
+
+ ARMAttributeParser(W).Parse(*Contents);
+ }
+}
+}
+