[llvm] r293569 - [WebAssembly] Add wasm support for llvm-readobj
Vedant Kumar via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 30 16:13:45 PST 2017
Hi Derek,
I saw a build error after this, and tried to address it in r293573. PTAL and
let me know if it's OK.
thanks
vedant
> On Jan 30, 2017, at 3:30 PM, Derek Schuff via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> 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;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list