diff options
author | Derek Schuff <dschuff@google.com> | 2017-01-30 23:30:52 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2017-01-30 23:30:52 +0000 |
commit | 6d76b7b455cdc9927371785f77f7ae38509c1b03 (patch) | |
tree | ca59483bff106edbfd4d5b874efc4dee4ec5c2a9 /llvm/tools/llvm-readobj | |
parent | 642a2365fbcaf53e9eab2b9ec30985abf34c134f (diff) | |
download | bcm5719-llvm-6d76b7b455cdc9927371785f77f7ae38509c1b03.tar.gz bcm5719-llvm-6d76b7b455cdc9927371785f77f7ae38509c1b03.zip |
[WebAssembly] Add wasm support for llvm-readobj
Create a WasmDumper subclass of ObjDumper to support Webassembly binary
files.
Patch by Sam Clegg
Differential Revision: https://reviews.llvm.org/D27355
llvm-svn: 293569
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ObjDumper.h | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/WasmDumper.cpp | 92 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/llvm-readobj.cpp | 2 |
4 files changed, 99 insertions, 0 deletions
diff --git a/llvm/tools/llvm-readobj/CMakeLists.txt b/llvm/tools/llvm-readobj/CMakeLists.txt index d4b7125dbbb..5fd45a8cff6 100644 --- a/llvm/tools/llvm-readobj/CMakeLists.txt +++ b/llvm/tools/llvm-readobj/CMakeLists.txt @@ -15,5 +15,6 @@ add_llvm_tool(llvm-readobj llvm-readobj.cpp MachODumper.cpp ObjDumper.cpp + WasmDumper.cpp Win64EHDumper.cpp ) diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index c91558ecbfa..75090312b21 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/tools/llvm-readobj/ObjDumper.h @@ -96,6 +96,10 @@ std::error_code createMachODumper(const object::ObjectFile *Obj, ScopedPrinter &Writer, std::unique_ptr<ObjDumper> &Result); +std::error_code createWasmDumper(const object::ObjectFile *Obj, + ScopedPrinter &Writer, + std::unique_ptr<ObjDumper> &Result); + void dumpCOFFImportFile(const object::COFFImportFile *File); void dumpCodeViewMergedTypes(ScopedPrinter &Writer, diff --git a/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/WasmDumper.cpp new file mode 100644 index 00000000000..8f3ec575e47 --- /dev/null +++ b/llvm/tools/llvm-readobj/WasmDumper.cpp @@ -0,0 +1,92 @@ +//===-- WasmDumper.cpp - Wasm-specific object file dumper -----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the Wasm-specific dumper for llvm-readobj. +// +//===----------------------------------------------------------------------===// + +#include "Error.h" +#include "ObjDumper.h" +#include "llvm/Object/Wasm.h" +#include "llvm/Support/ScopedPrinter.h" + +using namespace llvm; +using namespace object; + +namespace { + +const char *wasmSectionTypeToString(uint32_t Type) { +#define ECase(X) \ + case wasm::WASM_SEC_##X: \ + return #X; + switch (Type) { + ECase(CUSTOM); + ECase(TYPE); + ECase(IMPORT); + ECase(FUNCTION); + ECase(TABLE); + ECase(MEMORY); + ECase(GLOBAL); + ECase(EXPORT); + ECase(START); + ECase(ELEM); + ECase(CODE); + ECase(DATA); + } +#undef ECase + return ""; +} + +class WasmDumper : public ObjDumper { +public: + WasmDumper(const WasmObjectFile *Obj, ScopedPrinter &Writer) + : ObjDumper(Writer), Obj(Obj) {} + + void printFileHeaders() override { + W.printHex("Version", Obj->getHeader().Version); + } + + void printSections() override { + ListScope Group(W, "Sections"); + for (const SectionRef &Section : Obj->sections()) { + const wasm::WasmSection *WasmSec = Obj->getWasmSection(Section); + DictScope SectionD(W, "Section"); + const char *Type = wasmSectionTypeToString(WasmSec->Type); + W.printHex("Type", Type, WasmSec->Type); + W.printNumber("Size", WasmSec->Content.size()); + W.printNumber("Offset", WasmSec->Offset); + if (WasmSec->Type == wasm::WASM_SEC_CUSTOM) { + W.printString("Name", WasmSec->Name); + } + } + } + void printRelocations() override { llvm_unreachable("unimplemented"); } + void printSymbols() override { llvm_unreachable("unimplemented"); } + void printDynamicSymbols() override { llvm_unreachable("unimplemented"); } + void printUnwindInfo() override { llvm_unreachable("unimplemented"); } + void printStackMap() const override { llvm_unreachable("unimplemented"); } + +private: + const WasmObjectFile *Obj; +}; +} + +namespace llvm { + +std::error_code createWasmDumper(const object::ObjectFile *Obj, + ScopedPrinter &Writer, + std::unique_ptr<ObjDumper> &Result) { + const WasmObjectFile *WasmObj = dyn_cast<WasmObjectFile>(Obj); + assert(WasmObj && "createWasmDumper called with non-wasm object"); + + Result.reset(new WasmDumper(WasmObj, Writer)); + return readobj_error::success; +} + +} // namespace llvm diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index 970e1545de0..fffcd1790e3 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -358,6 +358,8 @@ static std::error_code createDumper(const ObjectFile *Obj, return createELFDumper(Obj, Writer, Result); if (Obj->isMachO()) return createMachODumper(Obj, Writer, Result); + if (Obj->isWasm()) + return createWasmDumper(Obj, Writer, Result); return readobj_error::unsupported_obj_file_format; } |