[llvm] r293569 - [WebAssembly] Add wasm support for llvm-readobj

Derek Schuff via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 30 15:30:53 PST 2017


Author: dschuff
Date: Mon Jan 30 17:30:52 2017
New Revision: 293569

URL: http://llvm.org/viewvc/llvm-project?rev=293569&view=rev
Log:
[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

Added:
    llvm/trunk/test/tools/llvm-readobj/Inputs/trivial.obj.wasm
    llvm/trunk/tools/llvm-readobj/WasmDumper.cpp
Modified:
    llvm/trunk/include/llvm/Object/Wasm.h
    llvm/trunk/include/llvm/Support/Wasm.h
    llvm/trunk/lib/Object/WasmObjectFile.cpp
    llvm/trunk/test/tools/llvm-readobj/file-headers.test
    llvm/trunk/test/tools/llvm-readobj/sections.test
    llvm/trunk/tools/llvm-readobj/CMakeLists.txt
    llvm/trunk/tools/llvm-readobj/ObjDumper.h
    llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp

Modified: llvm/trunk/include/llvm/Object/Wasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Wasm.h?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/Wasm.h (original)
+++ llvm/trunk/include/llvm/Object/Wasm.h Mon Jan 30 17:30:52 2017
@@ -87,8 +87,8 @@ protected:
 
 private:
   const uint8_t *getPtr(size_t Offset) const;
-  Error parseUserSection(wasm::WasmSection &Sec, const uint8_t *Ptr,
-                         size_t Length);
+  Error parseCustomSection(wasm::WasmSection &Sec, const uint8_t *Ptr,
+                           size_t Length);
 
   wasm::WasmObjectHeader Header;
   std::vector<wasm::WasmSection> Sections;

Modified: llvm/trunk/include/llvm/Support/Wasm.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Wasm.h?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/Wasm.h (original)
+++ llvm/trunk/include/llvm/Support/Wasm.h Mon Jan 30 17:30:52 2017
@@ -38,7 +38,7 @@ struct WasmSection {
 };
 
 enum : unsigned {
-  WASM_SEC_USER = 0,     // User-defined section
+  WASM_SEC_CUSTOM = 0,   // Custom / User-defined section
   WASM_SEC_TYPE = 1,     // Function signature declarations
   WASM_SEC_IMPORT = 2,   // Import declarations
   WASM_SEC_FUNCTION = 3, // Function declarations

Modified: llvm/trunk/lib/Object/WasmObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/WasmObjectFile.cpp?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/lib/Object/WasmObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/WasmObjectFile.cpp Mon Jan 30 17:30:52 2017
@@ -83,16 +83,17 @@ WasmObjectFile::WasmObjectFile(MemoryBuf
   while (Ptr < Eof) {
     if ((Err = readSection(Sec, Ptr, getPtr(0))))
       return;
-    if (Sec.Type == wasm::WASM_SEC_USER) {
-      if ((Err = parseUserSection(Sec, Sec.Content.data(), Sec.Content.size())))
+    if (Sec.Type == wasm::WASM_SEC_CUSTOM) {
+      if ((Err =
+               parseCustomSection(Sec, Sec.Content.data(), Sec.Content.size())))
         return;
     }
     Sections.push_back(Sec);
   }
 }
 
-Error WasmObjectFile::parseUserSection(wasm::WasmSection &Sec,
-                                       const uint8_t *Ptr, size_t Length) {
+Error WasmObjectFile::parseCustomSection(wasm::WasmSection &Sec,
+                                         const uint8_t *Ptr, size_t Length) {
   Sec.Name = readString(Ptr);
   return Error::success();
 }
@@ -186,7 +187,7 @@ std::error_code WasmObjectFile::getSecti
     ECase(ELEM);
     ECase(CODE);
     ECase(DATA);
-  case wasm::WASM_SEC_USER:
+  case wasm::WASM_SEC_CUSTOM:
     Res = S.Name;
     break;
   default:

Added: llvm/trunk/test/tools/llvm-readobj/Inputs/trivial.obj.wasm
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/trivial.obj.wasm?rev=293569&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-readobj/Inputs/trivial.obj.wasm (added) and llvm/trunk/test/tools/llvm-readobj/Inputs/trivial.obj.wasm Mon Jan 30 17:30:52 2017 differ

Modified: llvm/trunk/test/tools/llvm-readobj/file-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/file-headers.test?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/file-headers.test (original)
+++ llvm/trunk/test/tools/llvm-readobj/file-headers.test Mon Jan 30 17:30:52 2017
@@ -26,6 +26,12 @@ RUN: llvm-readobj -h %p/Inputs/magic.cof
 RUN:   | FileCheck %s -check-prefix COFF-IMPORTLIB
 RUN: llvm-readobj -h %p/Inputs/trivial.obj.elf-lanai \
 RUN:   | FileCheck %s -check-prefix ELF-LANAI
+# trivial.obj.wasm was generated using wast2wasm which is part of the wabt
+# project (https://github.com/WebAssembly/wabt) using the following command:
+# $ wast2wasm --debug-names ./test/roundtrip/generate-some-names.txt -o \
+#   trivial.obj.wasm
+RUN: llvm-readobj -h %p/Inputs/trivial.obj.wasm \
+RUN:   | FileCheck %s -check-prefix WASM
 
 COFF-ARM:      File: {{(.*[/\\])?}}trivial.obj.coff-arm
 COFF-ARM-NEXT: Format: COFF-ARM
@@ -367,3 +373,8 @@ ELF-LANAI-NEXT:   SectionHeaderEntrySize
 ELF-LANAI-NEXT:   SectionHeaderCount: 8
 ELF-LANAI-NEXT:   StringTableSectionIndex: 1
 ELF-LANAI-NEXT: }
+
+WASM: Format: WASM
+WASM-NEXT: Arch: wasm32
+WASM-NEXT: AddressSize: 32bit
+WASM-NEXT: Version: 0xD

Modified: llvm/trunk/test/tools/llvm-readobj/sections.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/sections.test?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/sections.test (original)
+++ llvm/trunk/test/tools/llvm-readobj/sections.test Mon Jan 30 17:30:52 2017
@@ -14,6 +14,8 @@ RUN: llvm-readobj -s %p/Inputs/trivial.o
 RUN:   | FileCheck %s -check-prefix MACHO-PPC64
 RUN: llvm-readobj -s %p/Inputs/trivial.obj.macho-arm \
 RUN:   | FileCheck %s -check-prefix MACHO-ARM
+RUN: llvm-readobj -s %p/Inputs/trivial.obj.wasm \
+RUN:   | FileCheck %s -check-prefix WASM
 
 COFF:      Sections [
 COFF-NEXT:   Section {
@@ -490,3 +492,47 @@ MACHO-ARM-NEXT:    Reserved1: 0x0
 MACHO-ARM-NEXT:    Reserved2: 0x0
 MACHO-ARM-NEXT:  }
 MACHO-ARM-NEXT:]
+
+WASM: Sections [
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: TYPE (0x1)
+WASM-NEXT:     Size: 15
+WASM-NEXT:     Offset: 8
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: IMPORT (0x2)
+WASM-NEXT:     Size: 11
+WASM-NEXT:     Offset: 25
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: FUNCTION (0x3)
+WASM-NEXT:     Size: 3
+WASM-NEXT:     Offset: 38
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: TABLE (0x4)
+WASM-NEXT:     Size: 5
+WASM-NEXT:     Offset: 43
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: EXPORT (0x7)
+WASM-NEXT:     Size: 14
+WASM-NEXT:     Offset: 50
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: ELEM (0x9)
+WASM-NEXT:     Size: 7
+WASM-NEXT:     Offset: 66
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: CODE (0xA)
+WASM-NEXT:     Size: 42
+WASM-NEXT:     Offset: 75
+WASM-NEXT:   }
+WASM-NEXT:   Section {
+WASM-NEXT:     Type: CUSTOM (0x0)
+WASM-NEXT:     Size: 44
+WASM-NEXT:     Offset: 119
+WASM-NEXT:     Name: name
+WASM-NEXT:   }
+WASM-NEXT: ]

Modified: llvm/trunk/tools/llvm-readobj/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/CMakeLists.txt?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-readobj/CMakeLists.txt Mon Jan 30 17:30:52 2017
@@ -15,5 +15,6 @@ add_llvm_tool(llvm-readobj
   llvm-readobj.cpp
   MachODumper.cpp
   ObjDumper.cpp
+  WasmDumper.cpp
   Win64EHDumper.cpp
   )

Modified: llvm/trunk/tools/llvm-readobj/ObjDumper.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/ObjDumper.h?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/ObjDumper.h (original)
+++ llvm/trunk/tools/llvm-readobj/ObjDumper.h Mon Jan 30 17:30:52 2017
@@ -96,6 +96,10 @@ std::error_code createMachODumper(const
                                   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,

Added: llvm/trunk/tools/llvm-readobj/WasmDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/WasmDumper.cpp?rev=293569&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-readobj/WasmDumper.cpp (added)
+++ llvm/trunk/tools/llvm-readobj/WasmDumper.cpp Mon Jan 30 17:30:52 2017
@@ -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

Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=293569&r1=293568&r2=293569&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp Mon Jan 30 17:30:52 2017
@@ -358,6 +358,8 @@ static std::error_code createDumper(cons
     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;
 }




More information about the llvm-commits mailing list