From 028ce2accf46279814f5f7db1d34b753398c37a1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 23 Jan 2015 14:15:49 -0800 Subject: [PATCH 1/4] update Math_min usage now that we use it on stdlib instead of as an ffi --- lib/Target/JSBackend/CallHandlers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h index a181955c1c7..46cb3fa5b70 100644 --- a/lib/Target/JSBackend/CallHandlers.h +++ b/lib/Target/JSBackend/CallHandlers.h @@ -234,7 +234,7 @@ DEF_CALL_HANDLER(low, { \ DEF_CALL_HANDLER(high, { \ std::string Input = getValueAsStr(CI->getOperand(0)); \ if (PreciseF32 && CI->getOperand(0)->getType()->isFloatTy()) Input = "+" + Input; \ - return getAssign(CI) + "+Math_abs(" + Input + ") >= +1 ? " + Input + " > +0 ? (Math_min(+Math_floor(" + Input + " / +4294967296), +4294967295) | 0) >>> 0 : ~~+Math_ceil((" + Input + " - +(~~" + Input + " >>> 0)) / +4294967296) >>> 0 : 0"; \ + return getAssign(CI) + "+Math_abs(" + Input + ") >= +1 ? " + Input + " > +0 ? (~~+Math_min(+Math_floor(" + Input + " / +4294967296), +4294967295)) >>> 0 : ~~+Math_ceil((" + Input + " - +(~~" + Input + " >>> 0)) / +4294967296) >>> 0 : 0"; \ }) TO_I(FtoILow, FtoIHigh); TO_I(DtoILow, DtoIHigh); From 45dd6a0d4aee1e4bac6812ab6d2d7f88ee12fff8 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Fri, 23 Jan 2015 15:01:08 -0800 Subject: [PATCH 2/4] use Math.clz32 --- lib/Target/JSBackend/CallHandlers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h index 46cb3fa5b70..3ab5867c0d8 100644 --- a/lib/Target/JSBackend/CallHandlers.h +++ b/lib/Target/JSBackend/CallHandlers.h @@ -456,7 +456,7 @@ DEF_CALL_HANDLER(bitshift64Shl, { }) DEF_CALL_HANDLER(llvm_ctlz_i32, { - return CH___default__(CI, "_llvm_ctlz_i32", 1); + return CH___default__(CI, "Math_clz32", 1); }) DEF_CALL_HANDLER(llvm_cttz_i32, { From 09e06d45b67697f92b2bd45b6763af1a14860050 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 27 Jan 2015 13:21:15 -0800 Subject: [PATCH 3/4] remove MAX_SETJMPS, use realloc --- lib/Target/JSBackend/CallHandlers.h | 11 ++++++++--- lib/Target/JSBackend/JSBackend.cpp | 5 ----- lib/Transforms/NaCl/LowerEmSetjmp.cpp | 13 ++++++++++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h index 3ab5867c0d8..28b4191e6bd 100644 --- a/lib/Target/JSBackend/CallHandlers.h +++ b/lib/Target/JSBackend/CallHandlers.h @@ -162,13 +162,17 @@ DEF_CALL_HANDLER(emscripten_resume, { // setjmp support DEF_CALL_HANDLER(emscripten_prep_setjmp, { - return getAdHocAssign("_setjmpTable", Type::getInt32Ty(CI->getContext())) + "STACKTOP; " + getStackBump(4 * 2 * (MaxSetjmps+1)) + + return getAdHocAssign("_setjmpTableSize", Type::getInt32Ty(CI->getContext())) + "4;" + + getAdHocAssign("_setjmpTable", Type::getInt32Ty(CI->getContext())) + "_malloc(40) | 0;" + "HEAP32[_setjmpTable>>2]=0"; }) +DEF_CALL_HANDLER(emscripten_cleanup_setjmp, { + return "_free(_setjmpTable|0)"; +}) DEF_CALL_HANDLER(emscripten_setjmp, { // env, label, table Declares.insert("saveSetjmp"); - return "_saveSetjmp(" + getValueAsStr(CI->getOperand(0)) + "," + getValueAsStr(CI->getOperand(1)) + ",_setjmpTable|0)|0"; + return "_setjmpTable = _saveSetjmp(" + getValueAsStr(CI->getOperand(0)) + "," + getValueAsStr(CI->getOperand(1)) + ",_setjmpTable|0,_setjmpTableSize|0)|0;_setjmpTableSize = tempRet0"; }) DEF_CALL_HANDLER(emscripten_longjmp, { Declares.insert("longjmp"); @@ -179,7 +183,7 @@ DEF_CALL_HANDLER(emscripten_check_longjmp, { std::string Target = getJSName(CI); std::string Assign = getAssign(CI); return "if (((" + Threw + "|0) != 0) & ((threwValue|0) != 0)) { " + - Assign + "_testSetjmp(HEAP32[" + Threw + ">>2]|0, _setjmpTable)|0; " + + Assign + "_testSetjmp(HEAP32[" + Threw + ">>2]|0, _setjmpTable|0, _setjmpTableSize|0)|0; " + "if ((" + Target + "|0) == 0) { _longjmp(" + Threw + "|0, threwValue|0); } " + // rethrow "tempRet0 = threwValue; " + "} else { " + Assign + "-1; }"; @@ -583,6 +587,7 @@ void setupCallHandlers() { SETUP_CALL_HANDLER(emscripten_landingpad); SETUP_CALL_HANDLER(emscripten_resume); SETUP_CALL_HANDLER(emscripten_prep_setjmp); + SETUP_CALL_HANDLER(emscripten_cleanup_setjmp); SETUP_CALL_HANDLER(emscripten_setjmp); SETUP_CALL_HANDLER(emscripten_longjmp); SETUP_CALL_HANDLER(emscripten_check_longjmp); diff --git a/lib/Target/JSBackend/JSBackend.cpp b/lib/Target/JSBackend/JSBackend.cpp index 5c468f16863..ace15ac68d0 100644 --- a/lib/Target/JSBackend/JSBackend.cpp +++ b/lib/Target/JSBackend/JSBackend.cpp @@ -88,11 +88,6 @@ NoAliasingFunctionPointers("emscripten-no-aliasing-function-pointers", cl::desc("Forces function pointers to not alias (this is more correct, but rarely needed, and has the cost of much larger function tables; it is useful for debugging though; see emscripten ALIASING_FUNCTION_POINTERS option)"), cl::init(false)); -static cl::opt -MaxSetjmps("emscripten-max-setjmps", - cl::desc("Maximum amount of setjmp() calls per function stack frame (see emscripten MAX_SETJMPS)"), - cl::init(20)); - static cl::opt GlobalBase("emscripten-global-base", cl::desc("Where global variables start out in memory (see emscripten GLOBAL_BASE option)"), diff --git a/lib/Transforms/NaCl/LowerEmSetjmp.cpp b/lib/Transforms/NaCl/LowerEmSetjmp.cpp index d0a0012df9c..4d85efea6d0 100644 --- a/lib/Transforms/NaCl/LowerEmSetjmp.cpp +++ b/lib/Transforms/NaCl/LowerEmSetjmp.cpp @@ -190,6 +190,8 @@ bool LowerEmSetjmp::runOnModule(Module &M) { FunctionType *VoidFunc = FunctionType::get(Void, false); Function *PrepSetjmp = Function::Create(VoidFunc, GlobalValue::ExternalLinkage, "emscripten_prep_setjmp", TheModule); + Function *CleanupSetjmp = Function::Create(VoidFunc, GlobalValue::ExternalLinkage, "emscripten_cleanup_setjmp", TheModule); + Function *PreInvoke = TheModule->getFunction("emscripten_preinvoke"); if (!PreInvoke) PreInvoke = Function::Create(VoidFunc, GlobalValue::ExternalLinkage, "emscripten_preinvoke", TheModule); @@ -244,7 +246,7 @@ bool LowerEmSetjmp::runOnModule(Module &M) { Function *F = I->first; Phis& P = I->second; - CallInst::Create(PrepSetjmp, "", F->begin()->begin()); // FIXME: adding after other allocas might be better + CallInst::Create(PrepSetjmp, "", F->begin()->begin()); // Update each call that can longjmp so it can return to a setjmp where relevant @@ -309,6 +311,15 @@ bool LowerEmSetjmp::runOnModule(Module &M) { } } } + + // add a cleanup before each return + for (Function::iterator BBI = F->begin(), E = F->end(); BBI != E; ) { + BasicBlock *BB = BBI++; + TerminatorInst *TI = BB->getTerminator(); + if (isa(TI)) { + CallInst::Create(CleanupSetjmp, "", TI); + } + } } for (unsigned i = 0; i < ToErase.size(); i++) { From 5ff8cead25c31bd92af013152e41013c8c14c945 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 27 Jan 2015 15:26:46 -0800 Subject: [PATCH 4/4] 1.29.7 --- emscripten-version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emscripten-version.txt b/emscripten-version.txt index 5661285e15a..ade2da5da3b 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1,2 +1,2 @@ -1.29.6 +1.29.7