From: Sam Clegg Date: Fri, 28 Apr 2017 21:12:09 +0000 (+0000) Subject: [WebAssembly] Write initial memory in pages not bytes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=649003c411300b4ce60f1ce9799e398363569def;p=llvm [WebAssembly] Write initial memory in pages not bytes Subscribers: jfb, dschuff Differential Revision: https://reviews.llvm.org/D32660 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301687 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/Wasm.h b/include/llvm/Support/Wasm.h index 8e6c418c818..b02fcb19e3d 100644 --- a/include/llvm/Support/Wasm.h +++ b/include/llvm/Support/Wasm.h @@ -24,6 +24,8 @@ namespace wasm { const char WasmMagic[] = {'\0', 'a', 's', 'm'}; // Wasm binary format version const uint32_t WasmVersion = 0x1; +// Wasm uses a 64k page size +const uint32_t WasmPageSize = 65536; struct WasmObjectHeader { StringRef Magic; diff --git a/lib/MC/WasmObjectWriter.cpp b/lib/MC/WasmObjectWriter.cpp index 6444046a30d..ae66829741b 100644 --- a/lib/MC/WasmObjectWriter.cpp +++ b/lib/MC/WasmObjectWriter.cpp @@ -913,12 +913,14 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm, // For now, always emit the memory section, since loads and stores are not // valid without it. In the future, we could perhaps be more clever and omit // it if there are no loads or stores. - startSection(Section, wasm::WASM_SEC_MEMORY); + uint32_t NumPages = + (DataBytes.size() + wasm::WasmPageSize - 1) / wasm::WasmPageSize; + startSection(Section, wasm::WASM_SEC_MEMORY); encodeULEB128(1, getStream()); // number of memory spaces encodeULEB128(0, getStream()); // flags - encodeULEB128(DataBytes.size(), getStream()); // initial + encodeULEB128(NumPages, getStream()); // initial endSection(Section); diff --git a/test/MC/WebAssembly/sections.ll b/test/MC/WebAssembly/sections.ll index e7ae2b3beea..85bf0818509 100644 --- a/test/MC/WebAssembly/sections.ll +++ b/test/MC/WebAssembly/sections.ll @@ -32,6 +32,11 @@ entry: ; CHECK: } ; CHECK: Section { ; CHECK: Type: MEMORY (0x5) +; CHECK: Memories [ +; CHECK: Memory { +; CHECK: InitialPages: 1 +; CHECK: } +; CHECK: ] ; CHECK: } ; CHECK: Section { ; CHECK: Type: GLOBAL (0x6) diff --git a/test/tools/llvm-readobj/sections.test b/test/tools/llvm-readobj/sections.test index 312c47fe4c8..1747ee45d4f 100644 --- a/test/tools/llvm-readobj/sections.test +++ b/test/tools/llvm-readobj/sections.test @@ -518,6 +518,11 @@ WASM-NEXT: Section { WASM-NEXT: Type: MEMORY (0x5) WASM-NEXT: Size: 3 WASM-NEXT: Offset: 66 +WASM-NEXT: Memories [ +WASM-NEXT: Memory { +WASM-NEXT: InitialPages: 0 +WASM-NEXT: } +WASM-NEXT: ] WASM-NEXT: } WASM-NEXT: Section { WASM-NEXT: Type: EXPORT (0x7) diff --git a/tools/llvm-readobj/WasmDumper.cpp b/tools/llvm-readobj/WasmDumper.cpp index f07dd07b59f..21614297e46 100644 --- a/tools/llvm-readobj/WasmDumper.cpp +++ b/tools/llvm-readobj/WasmDumper.cpp @@ -150,8 +150,20 @@ void WasmDumper::printSections() { W.printEnum("Type", WasmSec.Type, makeArrayRef(WasmSectionTypes)); W.printNumber("Size", (uint64_t)WasmSec.Content.size()); W.printNumber("Offset", WasmSec.Offset); - if (WasmSec.Type == wasm::WASM_SEC_CUSTOM) { + switch (WasmSec.Type) { + case wasm::WASM_SEC_CUSTOM: W.printString("Name", WasmSec.Name); + break; + case wasm::WASM_SEC_MEMORY: + ListScope Group(W, "Memories"); + for (const wasm::WasmLimits &Memory : Obj->memories()) { + DictScope Group(W, "Memory"); + W.printNumber("InitialPages", Memory.Initial); + if (Memory.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX) { + W.printNumber("MaxPages", WasmSec.Offset); + } + } + break; } if (opts::SectionRelocations) {