diff options
| author | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2019-04-04 00:53:21 +0000 |
|---|---|---|
| committer | Hubert Tong <hubert.reinterpretcast@gmail.com> | 2019-04-04 00:53:21 +0000 |
| commit | ab2eb2bfacb4b2a3642e7716ddaf2638149aa0b4 (patch) | |
| tree | 08b208b82c24c6722d0288752c5703ba06c4e86a /llvm/tools/obj2yaml | |
| parent | 7f8b3bf2475624c4bd1140a4b48c83b738ddd0ec (diff) | |
| download | bcm5719-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.txt | 1 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/obj2yaml.cpp | 4 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/obj2yaml.h | 3 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/xcoff2yaml.cpp | 52 |
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(); +} |

