[PATCH] D77437: [lld][WebAssembly] Handle 4gb max memories
Thomas Lively via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 7 19:05:01 PDT 2020
tlively updated this revision to Diff 255876.
tlively added a comment.
- Add error checking and make zStackSize 64-bit too
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77437/new/
https://reviews.llvm.org/D77437
Files:
lld/test/wasm/large-memory.test
lld/wasm/Config.h
lld/wasm/Writer.cpp
Index: lld/wasm/Writer.cpp
===================================================================
--- lld/wasm/Writer.cpp
+++ lld/wasm/Writer.cpp
@@ -201,7 +201,7 @@
// rather than overwriting global data, but also increases code size since all
// static data loads and stores requires larger offsets.
void Writer::layoutMemory() {
- uint32_t memoryPtr = 0;
+ uint64_t memoryPtr = 0;
auto placeStack = [&]() {
if (config->relocatable || config->isPic)
@@ -227,7 +227,7 @@
if (WasmSym::globalBase)
WasmSym::globalBase->setVirtualAddress(memoryPtr);
- uint32_t dataStart = memoryPtr;
+ uint64_t dataStart = memoryPtr;
// Arbitrarily set __dso_handle handle to point to the start of the data
// segments.
@@ -286,8 +286,9 @@
error("initial memory must be " + Twine(WasmPageSize) + "-byte aligned");
if (memoryPtr > config->initialMemory)
error("initial memory too small, " + Twine(memoryPtr) + " bytes needed");
- else
- memoryPtr = config->initialMemory;
+ if (config->initialMemory > (1ULL << 32))
+ error("initial memory too large, cannot be greater than 4294967296");
+ memoryPtr = config->initialMemory;
}
out.dylinkSec->memSize = memoryPtr;
out.memorySec->numMemoryPages =
@@ -300,6 +301,8 @@
error("maximum memory must be " + Twine(WasmPageSize) + "-byte aligned");
if (memoryPtr > config->maxMemory)
error("maximum memory too small, " + Twine(memoryPtr) + " bytes needed");
+ if (config->maxMemory > (1ULL << 32))
+ error("maximum memory too large, cannot be greater than 4294967296");
out.memorySec->maxMemoryPages = config->maxMemory / WasmPageSize;
log("mem: max pages = " + Twine(out.memorySec->maxMemoryPages));
}
Index: lld/wasm/Config.h
===================================================================
--- lld/wasm/Config.h
+++ lld/wasm/Config.h
@@ -46,10 +46,10 @@
bool stripDebug;
bool stackFirst;
bool trace;
- uint32_t globalBase;
- uint32_t initialMemory;
- uint32_t maxMemory;
- uint32_t zStackSize;
+ uint64_t globalBase;
+ uint64_t initialMemory;
+ uint64_t maxMemory;
+ uint64_t zStackSize;
unsigned ltoPartitions;
unsigned ltoo;
unsigned optimize;
Index: lld/test/wasm/large-memory.test
===================================================================
--- lld/test/wasm/large-memory.test
+++ lld/test/wasm/large-memory.test
@@ -2,4 +2,23 @@
; Verify we can parse large integers such as when we ask for 2G of total
; memory.
-RUN: wasm-ld %t.o -o %t.wasm --max-memory=2147483648
+RUN: wasm-ld %t.o -o %t1.wasm --max-memory=2147483648
+RUN: obj2yaml %t1.wasm | FileCheck %s --check-prefixes=CHECK,CHECK-2G
+
+; And also 4G of total memory
+RUN: wasm-ld %t.o -o %t2.wasm --max-memory=4294967296
+RUN: obj2yaml %t2.wasm | FileCheck %s --check-prefixes=CHECK,CHECK-4G
+
+CHECK: - Type: MEMORY
+CHECK-NEXT: Memories:
+CHECK-NEXT: - Flags: [ HAS_MAX ]
+CHECK-NEXT: Initial: 0x00000002
+CHECK-2G-NEXT: Maximum: 0x00008000
+CHECK-4G-NEXT: Maximum: 0x00010000
+
+; Test error for more than 4G of memory
+RUN: not wasm-ld %t.o -o %t3.wasm --initial-memory=4295032832 2>&1 | FileCheck %s --check-prefix INIT-ERROR
+RUN: not wasm-ld %t.o -o %t4.wasm --max-memory=4295032832 2>&1 | FileCheck %s --check-prefix MAX-ERROR
+
+INIT-ERROR: initial memory too large, cannot be greater than 4294967296
+MAX-ERROR: maximum memory too large, cannot be greater than 4294967296
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D77437.255876.patch
Type: text/x-patch
Size: 3500 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200408/85d6fcf5/attachment.bin>
More information about the llvm-commits
mailing list