diff options
-rw-r--r-- | src/passes/SafeHeap.cpp | 30 |
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)); } }; |