summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/SafeHeap.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp
index 6957478cf..d22ddea03 100644
--- a/src/passes/SafeHeap.cpp
+++ b/src/passes/SafeHeap.cpp
@@ -32,10 +32,11 @@
namespace wasm {
-const Name DYNAMICTOP_PTR_IMPORT("DYNAMICTOP_PTR");
-const Name GET_SBRK_PTR_IMPORT("emscripten_get_sbrk_ptr");
-const Name SEGFAULT_IMPORT("segfault");
-const Name ALIGNFAULT_IMPORT("alignfault");
+static const Name DYNAMICTOP_PTR_IMPORT("DYNAMICTOP_PTR");
+static const Name GET_SBRK_PTR_IMPORT("emscripten_get_sbrk_ptr");
+static const Name SBRK("sbrk");
+static const Name SEGFAULT_IMPORT("segfault");
+static const Name ALIGNFAULT_IMPORT("alignfault");
static Name getLoadName(Load* curr) {
std::string ret = "SAFE_HEAP_LOAD_";
@@ -112,7 +113,7 @@ struct SafeHeap : public Pass {
addGlobals(module, module->features);
}
- Name dynamicTopPtr, getSbrkPtr, segfault, alignfault;
+ Name dynamicTopPtr, getSbrkPtr, sbrk, segfault, alignfault;
void addImports(Module* module) {
ImportInfo info(*module);
@@ -124,6 +125,8 @@ struct SafeHeap : public Pass {
} else if (auto* existing =
info.getImportedFunction(ENV, GET_SBRK_PTR_IMPORT)) {
getSbrkPtr = existing->name;
+ } else if (auto* existing = info.getImportedFunction(ENV, SBRK)) {
+ sbrk = existing->name;
} else {
auto* import = new Function;
import->name = getSbrkPtr = GET_SBRK_PTR_IMPORT;
@@ -324,11 +327,18 @@ struct SafeHeap : public Pass {
makeBoundsCheck(Type type, Builder& builder, Index local, Index bytes) {
auto upperOp = options.lowMemoryUnused ? LtUInt32 : EqInt32;
auto upperBound = options.lowMemoryUnused ? PassOptions::LowMemoryBound : 0;
- Expression* sbrkPtr;
- if (dynamicTopPtr.is()) {
- sbrkPtr = builder.makeGlobalGet(dynamicTopPtr, i32);
+ Expression* brkLocation;
+ if (sbrk.is()) {
+ brkLocation =
+ builder.makeCall(sbrk, {builder.makeConst(Literal(int32_t(0)))}, i32);
} else {
- sbrkPtr = builder.makeCall(getSbrkPtr, {}, i32);
+ Expression* sbrkPtr;
+ if (dynamicTopPtr.is()) {
+ sbrkPtr = builder.makeGlobalGet(dynamicTopPtr, i32);
+ } else {
+ sbrkPtr = builder.makeCall(getSbrkPtr, {}, i32);
+ }
+ brkLocation = builder.makeLoad(4, false, 0, 4, sbrkPtr, i32);
}
return builder.makeIf(
builder.makeBinary(
@@ -341,7 +351,7 @@ struct SafeHeap : public Pass {
builder.makeBinary(AddInt32,
builder.makeLocalGet(local, i32),
builder.makeConst(Literal(int32_t(bytes)))),
- builder.makeLoad(4, false, 0, 4, sbrkPtr, i32))),
+ brkLocation)),
builder.makeCall(segfault, {}, none));
}
};