[llvm] r293569 - [WebAssembly] Add wasm support for llvm-readobj
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 30 16:47:27 PST 2017
On Mon, Jan 30, 2017 at 4:20 PM, Derek Schuff <dschuff at google.com> wrote:
> Hey, I was just looking at that, you are fast!
> Thanks for the fix.
> uint64_t should be fine.
>
> @sbc:
> I guess technically even for wasm32 the section size could still be >
> 32-bits because the encoding is LEB, right? It's a corner case but makes
> sense for this bit to be uint64.
Section size in the binary format is defined as varuint32 encoded as
LEB128, so in practice the section size will always be 0 to
MAX_UINT32. The in-memory section content is represented as an
ArrayRef though, whose size is always size_t, right? I'm not sure I
can think of a better fix. Do you have pointer to the actual failure?
Any idea why I didn't see it locally?
>
> On Mon, Jan 30, 2017 at 4:13 PM Vedant Kumar <vsk at apple.com> wrote:
>>
>> 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