summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@google.com>2017-01-30 23:30:52 +0000
committerDerek Schuff <dschuff@google.com>2017-01-30 23:30:52 +0000
commit6d76b7b455cdc9927371785f77f7ae38509c1b03 (patch)
treeca59483bff106edbfd4d5b874efc4dee4ec5c2a9 /llvm/tools/llvm-readobj
parent642a2365fbcaf53e9eab2b9ec30985abf34c134f (diff)
downloadbcm5719-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.txt1
-rw-r--r--llvm/tools/llvm-readobj/ObjDumper.h4
-rw-r--r--llvm/tools/llvm-readobj/WasmDumper.cpp92
-rw-r--r--llvm/tools/llvm-readobj/llvm-readobj.cpp2
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;
}
OpenPOWER on IntegriCloud