summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2017-04-28 21:12:09 +0000
committerSam Clegg <sbc@chromium.org>2017-04-28 21:12:09 +0000
commitff0730b3fcd488caf121e2e4d1aa8506ff13f3c6 (patch)
tree1ef967cec5a0f6d43a28015a9bd81ede35262ad4 /llvm
parent267ba94ce6593ba09b1d45ac04d8cc5851685f9c (diff)
downloadbcm5719-llvm-ff0730b3fcd488caf121e2e4d1aa8506ff13f3c6.tar.gz
bcm5719-llvm-ff0730b3fcd488caf121e2e4d1aa8506ff13f3c6.zip
[WebAssembly] Write initial memory in pages not bytes
Subscribers: jfb, dschuff Differential Revision: https://reviews.llvm.org/D32660 llvm-svn: 301687
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Support/Wasm.h2
-rw-r--r--llvm/lib/MC/WasmObjectWriter.cpp6
-rw-r--r--llvm/test/MC/WebAssembly/sections.ll5
-rw-r--r--llvm/test/tools/llvm-readobj/sections.test5
-rw-r--r--llvm/tools/llvm-readobj/WasmDumper.cpp14
5 files changed, 29 insertions, 3 deletions
diff --git a/llvm/include/llvm/Support/Wasm.h b/llvm/include/llvm/Support/Wasm.h
index 8e6c418c818..b02fcb19e3d 100644
--- a/llvm/include/llvm/Support/Wasm.h
+++ b/llvm/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/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp
index 6444046a30d..ae66829741b 100644
--- a/llvm/lib/MC/WasmObjectWriter.cpp
+++ b/llvm/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/llvm/test/MC/WebAssembly/sections.ll b/llvm/test/MC/WebAssembly/sections.ll
index e7ae2b3beea..85bf0818509 100644
--- a/llvm/test/MC/WebAssembly/sections.ll
+++ b/llvm/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/llvm/test/tools/llvm-readobj/sections.test b/llvm/test/tools/llvm-readobj/sections.test
index 312c47fe4c8..1747ee45d4f 100644
--- a/llvm/test/tools/llvm-readobj/sections.test
+++ b/llvm/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/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/WasmDumper.cpp
index f07dd07b59f..21614297e46 100644
--- a/llvm/tools/llvm-readobj/WasmDumper.cpp
+++ b/llvm/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) {
OpenPOWER on IntegriCloud