[PATCH] D109375: [WebAssembly] Error out on indirect uses of setjmp
Heejin Ahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 7 15:50:49 PDT 2021
aheejin updated this revision to Diff 371206.
aheejin marked an inline comment as done.
aheejin added a comment.
Change the error message
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D109375/new/
https://reviews.llvm.org/D109375
Files:
llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
llvm/test/CodeGen/WebAssembly/lower-em-sjlj-indirect-setjmp.ll
Index: llvm/test/CodeGen/WebAssembly/lower-em-sjlj-indirect-setjmp.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/lower-em-sjlj-indirect-setjmp.ll
@@ -0,0 +1,27 @@
+; RUN: not --crash llc < %s -enable-emscripten-sjlj 2>&1 | FileCheck %s
+; RUN: not --crash llc < %s -wasm-enable-sjlj -mattr=+exception-handling -exception-model=wasm 2>&1 | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+%struct.__jmp_buf_tag = type { [6 x i32], i32, [32 x i32] }
+
+; CHECK: LLVM ERROR: Does not support indirect uses of setjmp
+ at setjmp_fp = global i32 (%struct.__jmp_buf_tag*)* @setjmp, align 4
+
+define void @indirect_setjmp_call() {
+entry:
+ %buf = alloca [1 x %struct.__jmp_buf_tag], align 16
+ %0 = load i32 (%struct.__jmp_buf_tag*)*, i32 (%struct.__jmp_buf_tag*)** @setjmp_fp, align 4
+ %arraydecay = getelementptr inbounds [1 x %struct.__jmp_buf_tag], [1 x %struct.__jmp_buf_tag]* %buf, i32 0, i32 0
+ %call = call i32 %0(%struct.__jmp_buf_tag* %arraydecay)
+ call void @foo()
+ ret void
+}
+
+declare void @foo()
+; Function Attrs: returns_twice
+declare i32 @setjmp(%struct.__jmp_buf_tag*) #0
+
+attributes #0 = { returns_twice }
+
Index: llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
===================================================================
--- llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
+++ llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
@@ -867,13 +867,19 @@
if ((EnableEmSjLj || EnableWasmSjLj) && SetjmpF) {
// Precompute setjmp users
for (User *U : SetjmpF->users()) {
- if (auto *UI = dyn_cast<Instruction>(U)) {
- auto *UserF = UI->getFunction();
+ if (auto *CB = dyn_cast<CallBase>(U)) {
+ auto *UserF = CB->getFunction();
// If a function that calls setjmp does not contain any other calls that
// can longjmp, we don't need to do any transformation on that function,
// so can ignore it
if (containsLongjmpableCalls(UserF))
SetjmpUsers.insert(UserF);
+ } else {
+ std::string S;
+ raw_string_ostream SS(S);
+ SS << *U;
+ report_fatal_error(Twine("Indirect use of setjmp is not supported: ") +
+ SS.str());
}
}
}
@@ -1217,9 +1223,10 @@
Function *SetjmpF = M.getFunction("setjmp");
for (User *U : SetjmpF->users()) {
auto *CI = dyn_cast<CallInst>(U);
+ // FIXME 'invoke' to setjmp can happen when we use Wasm EH + Wasm SjLj, but
+ // we don't support two being used together yet.
if (!CI)
- report_fatal_error("Does not support indirect calls to setjmp");
-
+ report_fatal_error("Wasm EH + Wasm SjLj is not fully supported yet");
BasicBlock *BB = CI->getParent();
if (BB->getParent() != &F) // in other function
continue;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D109375.371206.patch
Type: text/x-patch
Size: 2950 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210907/ce32383d/attachment.bin>
More information about the llvm-commits
mailing list