summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/MultiMemoryLowering.cpp13
-rw-r--r--test/lit/passes/multi-memory-lowering.wast36
2 files changed, 36 insertions, 13 deletions
diff --git a/src/passes/MultiMemoryLowering.cpp b/src/passes/MultiMemoryLowering.cpp
index 9e9637b36..527a15804 100644
--- a/src/passes/MultiMemoryLowering.cpp
+++ b/src/passes/MultiMemoryLowering.cpp
@@ -304,12 +304,17 @@ struct MultiMemoryLowering : public Pass {
sizeLocal, builder.makeMemorySize(combinedMemory, memoryInfo)));
}
- // TODO: Check the result of makeMemoryGrow for errors and return the error
- // instead
+ // Attempt to grow the combinedMemory. If -1 returns, enough memory could
+ // not be allocated, so return -1.
functionBody = builder.blockify(
functionBody,
- builder.makeDrop(builder.makeMemoryGrow(
- builder.makeLocalGet(0, pointerType), combinedMemory, memoryInfo)));
+ builder.makeIf(
+ builder.makeBinary(
+ EqInt32,
+ builder.makeMemoryGrow(
+ builder.makeLocalGet(0, pointerType), combinedMemory, memoryInfo),
+ builder.makeConst(-1)),
+ builder.makeReturn(builder.makeConst(-1))));
// If we are not growing the last memory, then we need to copy data,
// shifting it over to accomodate the increase from page_delta
diff --git a/test/lit/passes/multi-memory-lowering.wast b/test/lit/passes/multi-memory-lowering.wast
index 6bf1ecc7c..fc402d877 100644
--- a/test/lit/passes/multi-memory-lowering.wast
+++ b/test/lit/passes/multi-memory-lowering.wast
@@ -147,9 +147,15 @@
;; CHECK-NEXT: (local.set $memory_size
;; CHECK-NEXT: (memory.size)
;; CHECK-NEXT: )
-;; CHECK-NEXT: (drop
-;; CHECK-NEXT: (memory.grow
-;; CHECK-NEXT: (local.get $page_delta)
+;; CHECK-NEXT: (if
+;; CHECK-NEXT: (i32.eq
+;; CHECK-NEXT: (memory.grow
+;; CHECK-NEXT: (local.get $page_delta)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (i32.const -1)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (return
+;; CHECK-NEXT: (i32.const -1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.copy
@@ -199,9 +205,15 @@
;; CHECK-NEXT: (local.set $memory_size
;; CHECK-NEXT: (memory.size)
;; CHECK-NEXT: )
-;; CHECK-NEXT: (drop
-;; CHECK-NEXT: (memory.grow
-;; CHECK-NEXT: (local.get $page_delta)
+;; CHECK-NEXT: (if
+;; CHECK-NEXT: (i32.eq
+;; CHECK-NEXT: (memory.grow
+;; CHECK-NEXT: (local.get $page_delta)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (i32.const -1)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (return
+;; CHECK-NEXT: (i32.const -1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (memory.copy
@@ -238,9 +250,15 @@
;; CHECK-NEXT: (local.set $return_size
;; CHECK-NEXT: (call $memory3_size)
;; CHECK-NEXT: )
-;; CHECK-NEXT: (drop
-;; CHECK-NEXT: (memory.grow
-;; CHECK-NEXT: (local.get $page_delta)
+;; CHECK-NEXT: (if
+;; CHECK-NEXT: (i32.eq
+;; CHECK-NEXT: (memory.grow
+;; CHECK-NEXT: (local.get $page_delta)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (i32.const -1)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: (return
+;; CHECK-NEXT: (i32.const -1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $return_size)