summaryrefslogtreecommitdiffstats
path: root/llvm/tools/obj2yaml
diff options
context:
space:
mode:
authorHubert Tong <hubert.reinterpretcast@gmail.com>2019-04-04 00:53:21 +0000
committerHubert Tong <hubert.reinterpretcast@gmail.com>2019-04-04 00:53:21 +0000
commitab2eb2bfacb4b2a3642e7716ddaf2638149aa0b4 (patch)
tree08b208b82c24c6722d0288752c5703ba06c4e86a /llvm/tools/obj2yaml
parent7f8b3bf2475624c4bd1140a4b48c83b738ddd0ec (diff)
downloadbcm5719-llvm-ab2eb2bfacb4b2a3642e7716ddaf2638149aa0b4.tar.gz
bcm5719-llvm-ab2eb2bfacb4b2a3642e7716ddaf2638149aa0b4.zip
[XCOFF] Add functionality for parsing AIX XCOFF object file headers
Summary: 1. Add functionality for parsing AIX XCOFF object files headers. 2. Only support 32-bit AIX XCOFF object files in this patch. 3. Print out the AIX XCOFF object file header in YAML format. Reviewers: sfertile, hubert.reinterpretcast, jasonliu, mstorsjo, zturner, rnk Reviewed By: sfertile, hubert.reinterpretcast Subscribers: jsji, mgorny, hiraditya, jdoerfert, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D59419 Patch by Digger Lin llvm-svn: 357663
Diffstat (limited to 'llvm/tools/obj2yaml')
-rw-r--r--llvm/tools/obj2yaml/CMakeLists.txt1
-rw-r--r--llvm/tools/obj2yaml/obj2yaml.cpp4
-rw-r--r--llvm/tools/obj2yaml/obj2yaml.h3
-rw-r--r--llvm/tools/obj2yaml/xcoff2yaml.cpp52
4 files changed, 60 insertions, 0 deletions
diff --git a/llvm/tools/obj2yaml/CMakeLists.txt b/llvm/tools/obj2yaml/CMakeLists.txt
index 5bac7c02465..f76983e0e8e 100644
--- a/llvm/tools/obj2yaml/CMakeLists.txt
+++ b/llvm/tools/obj2yaml/CMakeLists.txt
@@ -14,6 +14,7 @@ add_llvm_tool(obj2yaml
elf2yaml.cpp
macho2yaml.cpp
minidump2yaml.cpp
+ xcoff2yaml.cpp
wasm2yaml.cpp
Error.cpp
)
diff --git a/llvm/tools/obj2yaml/obj2yaml.cpp b/llvm/tools/obj2yaml/obj2yaml.cpp
index 9ae861dd13e..8622e38319b 100644
--- a/llvm/tools/obj2yaml/obj2yaml.cpp
+++ b/llvm/tools/obj2yaml/obj2yaml.cpp
@@ -20,6 +20,10 @@ using namespace llvm::object;
static std::error_code dumpObject(const ObjectFile &Obj) {
if (Obj.isCOFF())
return coff2yaml(outs(), cast<COFFObjectFile>(Obj));
+
+ if (Obj.isXCOFF())
+ return xcoff2yaml(outs(), cast<XCOFFObjectFile>(Obj));
+
if (Obj.isELF())
return elf2yaml(outs(), Obj);
if (Obj.isWasm())
diff --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h
index c34a6814c5e..b40e2c5c5a6 100644
--- a/llvm/tools/obj2yaml/obj2yaml.h
+++ b/llvm/tools/obj2yaml/obj2yaml.h
@@ -15,6 +15,7 @@
#include "llvm/Object/COFF.h"
#include "llvm/Object/Minidump.h"
#include "llvm/Object/Wasm.h"
+#include "llvm/Object/XCOFFObjectFile.h"
#include "llvm/Support/raw_ostream.h"
#include <system_error>
@@ -26,6 +27,8 @@ std::error_code macho2yaml(llvm::raw_ostream &Out,
const llvm::object::Binary &Obj);
llvm::Error minidump2yaml(llvm::raw_ostream &Out,
const llvm::object::MinidumpFile &Obj);
+std::error_code xcoff2yaml(llvm::raw_ostream &Out,
+ const llvm::object::XCOFFObjectFile &Obj);
std::error_code wasm2yaml(llvm::raw_ostream &Out,
const llvm::object::WasmObjectFile &Obj);
diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp
new file mode 100644
index 00000000000..5ee9eafbcbe
--- /dev/null
+++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp
@@ -0,0 +1,52 @@
+//===------ xcoff2yaml.cpp - XCOFF YAMLIO implementation --------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "obj2yaml.h"
+#include "llvm/Object/XCOFFObjectFile.h"
+#include "llvm/ObjectYAML/XCOFFYAML.h"
+#include "llvm/Support/YAMLTraits.h"
+
+using namespace llvm;
+using namespace llvm::object;
+namespace {
+
+class XCOFFDumper {
+ const object::XCOFFObjectFile &Obj;
+ XCOFFYAML::Object YAMLObj;
+ void dumpHeader();
+
+public:
+ XCOFFDumper(const object::XCOFFObjectFile &obj);
+ XCOFFYAML::Object &getYAMLObj() { return YAMLObj; }
+};
+} // namespace
+
+XCOFFDumper::XCOFFDumper(const object::XCOFFObjectFile &obj) : Obj(obj) {
+ dumpHeader();
+}
+
+void XCOFFDumper::dumpHeader() {
+ const XCOFFFileHeader *FileHdrPtr = Obj.getFileHeader();
+
+ YAMLObj.Header.Magic = FileHdrPtr->Magic;
+ YAMLObj.Header.NumberOfSections = FileHdrPtr->NumberOfSections;
+ YAMLObj.Header.TimeStamp = FileHdrPtr->TimeStamp;
+ YAMLObj.Header.SymbolTableOffset = FileHdrPtr->SymbolTableOffset;
+ YAMLObj.Header.NumberOfSymTableEntries = FileHdrPtr->NumberOfSymTableEntries;
+ YAMLObj.Header.AuxHeaderSize = FileHdrPtr->AuxHeaderSize;
+ YAMLObj.Header.Flags = FileHdrPtr->Flags;
+}
+
+std::error_code xcoff2yaml(raw_ostream &Out,
+ const object::XCOFFObjectFile &Obj) {
+ XCOFFDumper Dumper(Obj);
+ yaml::Output Yout(Out);
+ Yout << Dumper.getYAMLObj();
+
+ return std::error_code();
+}
OpenPOWER on IntegriCloud