Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 97abf24

Browse files
committed
Support Asyncify
1 parent 5fc2896 commit 97abf24

File tree

6 files changed

+766
-0
lines changed

6 files changed

+766
-0
lines changed

include/llvm/InitializePasses.h

+1
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ void initializeStripMetadataPass(PassRegistry&);
308308
void initializeExpandI64Pass(PassRegistry&); // XXX EMSCRIPTEN
309309
void initializeLowerEmExceptionsPass(PassRegistry&); // XXX EMSCRIPTEN
310310
void initializeLowerEmSetjmpPass(PassRegistry&); // XXX EMSCRIPTEN
311+
void initializeLowerEmAsyncifyPass(PassRegistry&); // XXX EMSCRIPTEN
311312
void initializeNoExitRuntimePass(PassRegistry&); // XXX EMSCRIPTEN
312313
// @LOCALMOD-END
313314
}

include/llvm/Transforms/NaCl.h

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ ModulePass *createExpandI64Pass(); // XXX EMSCRIPTEN
5454
ModulePass *createLowerEmExceptionsPass(); // XXX EMSCRIPTEN
5555
ModulePass *createLowerEmSetjmpPass(); // XXX EMSCRIPTEN
5656
ModulePass *createNoExitRuntimePass(); // XXX EMSCRIPTEN
57+
ModulePass *createLowerEmAsyncifyPass(); // XXX EMSCRIPTEN
5758

5859
void PNaClABISimplifyAddPreOptPasses(PassManager &PM);
5960
void PNaClABISimplifyAddPostOptPasses(PassManager &PM);

lib/Target/JSBackend/CallHandlers.h

+26
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,27 @@ DEF_CALL_HANDLER(emscripten_get_longjmp_result, {
189189
return getAssign(CI) + "tempRet0";
190190
})
191191

192+
// supporting async functions, see `<emscripten>/src/library_async.js` for detail.
193+
DEF_CALL_HANDLER(emscripten_alloc_async_context, {
194+
// insert sp as the 2nd parameter
195+
return getAssign(CI) + "_emscripten_alloc_async_context(" + getValueAsStr(CI->getOperand(0)) + ",sp)|0";
196+
})
197+
DEF_CALL_HANDLER(emscripten_check_async, {
198+
return getAssign(CI) + "___async";
199+
})
200+
// prevent unwinding the stack
201+
// preserve the return value of the return inst
202+
DEF_CALL_HANDLER(emscripten_do_not_unwind, {
203+
return "sp = STACKTOP";
204+
})
205+
// prevent unwinding the async stack
206+
DEF_CALL_HANDLER(emscripten_do_not_unwind_async, {
207+
return "___async_unwind = 0";
208+
})
209+
DEF_CALL_HANDLER(emscripten_get_async_return_value_addr, {
210+
return getAssign(CI) + "___async_retval";
211+
})
212+
192213
// emscripten instrinsics
193214
DEF_CALL_HANDLER(emscripten_debugger, {
194215
CanValidate = false;
@@ -560,6 +581,11 @@ void setupCallHandlers() {
560581
SETUP_CALL_HANDLER(emscripten_longjmp);
561582
SETUP_CALL_HANDLER(emscripten_check_longjmp);
562583
SETUP_CALL_HANDLER(emscripten_get_longjmp_result);
584+
SETUP_CALL_HANDLER(emscripten_alloc_async_context);
585+
SETUP_CALL_HANDLER(emscripten_check_async);
586+
SETUP_CALL_HANDLER(emscripten_do_not_unwind);
587+
SETUP_CALL_HANDLER(emscripten_do_not_unwind_async);
588+
SETUP_CALL_HANDLER(emscripten_get_async_return_value_addr);
563589
SETUP_CALL_HANDLER(emscripten_debugger);
564590
SETUP_CALL_HANDLER(getHigh32);
565591
SETUP_CALL_HANDLER(setHigh32);

lib/Transforms/NaCl/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ add_llvm_library(LLVMNaClTransforms
3030
StripMetadata.cpp
3131
LowerEmExceptionsPass.cpp
3232
LowerEmSetjmp.cpp
33+
LowerEmAsyncify.cpp
3334
NoExitRuntime.cpp
3435
)
3536

0 commit comments

Comments
 (0)