[PATCH] D66356: [WebAssembly] Forbid use of EM_ASM with setjmp/longjmp
Guanzhong Chen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 16 11:23:45 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL369137: [WebAssembly] Forbid use of EM_ASM with setjmp/longjmp (authored by quantum, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D66356?vs=215640&id=215644#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D66356/new/
https://reviews.llvm.org/D66356
Files:
llvm/trunk/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
===================================================================
--- llvm/trunk/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
+++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
@@ -274,6 +274,7 @@
bool areAllExceptionsAllowed() const { return EHWhitelistSet.empty(); }
bool canLongjmp(Module &M, const Value *Callee) const;
+ bool isEmAsmCall(Module &M, const Value *Callee) const;
void rebuildSSA(Function &F);
@@ -537,6 +538,23 @@
return true;
}
+bool WebAssemblyLowerEmscriptenEHSjLj::isEmAsmCall(Module &M,
+ const Value *Callee) const {
+ // This is an exhaustive list from Emscripten's <emscripten/em_asm.h>.
+ Function *EmAsmConstIntF = M.getFunction("emscripten_asm_const_int");
+ Function *EmAsmConstDoubleF = M.getFunction("emscripten_asm_const_double");
+ Function *EmAsmConstIntSyncMainF =
+ M.getFunction("emscripten_asm_const_int_sync_on_main_thread");
+ Function *EmAsmConstDoubleSyncMainF =
+ M.getFunction("emscripten_asm_const_double_sync_on_main_thread");
+ Function *EmAsmConstAsyncMainF =
+ M.getFunction("emscripten_asm_const_async_on_main_thread");
+
+ return Callee == EmAsmConstIntF || Callee == EmAsmConstDoubleF ||
+ Callee == EmAsmConstIntSyncMainF ||
+ Callee == EmAsmConstDoubleSyncMainF || Callee == EmAsmConstAsyncMainF;
+}
+
// Generate testSetjmp function call seqence with preamble and postamble.
// The code this generates is equivalent to the following JavaScript code:
// if (%__THREW__.val != 0 & threwValue != 0) {
@@ -983,6 +1001,12 @@
const Value *Callee = CI->getCalledValue();
if (!canLongjmp(M, Callee))
continue;
+ if (isEmAsmCall(M, Callee))
+ report_fatal_error("Cannot use EM_ASM* alongside setjmp/longjmp in " +
+ F.getName() +
+ ". Please consider using EM_JS, or move the "
+ "EM_ASM into another function.",
+ false);
Value *Threw = nullptr;
BasicBlock *Tail;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66356.215644.patch
Type: text/x-patch
Size: 2212 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190816/52dc3921/attachment.bin>
More information about the llvm-commits
mailing list