Skip to content

Commit

Permalink
[WebAssembly] Fix landingpad-only case in Emscripten EH (llvm#30)
Browse files Browse the repository at this point in the history
Summary:
Previously we didn't set `Changed` to true when there are only landing
pads but not invokes. This fixes it and we set `Changed` to true
whenever we have landing pads. (There can't be invokes without landing
pads, so that case is covered too)

The test case for this has to be a separate file because this pass is a
`ModulePass` and `Changed` is computed based on the whole module.

Reviewers: tlively

Subscribers: dschuff, sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D72308

Co-authored-by: Heejin Ahn <aheejin@gmail.com>
  • Loading branch information
2 people authored and alexcrichton committed Jan 7, 2020
1 parent 9330ec5 commit 24100f0
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -755,7 +755,6 @@ bool WebAssemblyLowerEmscriptenEHSjLj::runEHOnFunction(Function &F) {
auto *II = dyn_cast<InvokeInst>(BB.getTerminator());
if (!II)
continue;
Changed = true;
LandingPads.insert(II->getLandingPadInst());
IRB.SetInsertPoint(II);

Expand Down Expand Up @@ -835,6 +834,7 @@ bool WebAssemblyLowerEmscriptenEHSjLj::runEHOnFunction(Function &F) {
if (auto *LPI = dyn_cast<LandingPadInst>(I))
LandingPads.insert(LPI);
}
Changed = !LandingPads.empty();

// Handle all the landingpad for this function together, as multiple invokes
// may share a single lp
Expand Down
25 changes: 25 additions & 0 deletions llvm/test/CodeGen/WebAssembly/lower-em-exceptions-lpad-only.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
; RUN: opt < %s -wasm-lower-em-ehsjlj -S | FileCheck %s

target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-unknown"

@_ZTIi = external constant i8*

; Checks if a module that only contains a landingpad (and resume) but not an
; invoke works correctly and does not crash.
; CHECK-LABEL: @landingpad_only
define void @landingpad_only() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
entry:
br label %cont

lpad: ; preds = %entry
%0 = landingpad { i8*, i32 }
catch i8* bitcast (i8** @_ZTIi to i8*)
catch i8* null
resume { i8*, i32 } %0

cont:
ret void
}

declare i32 @__gxx_personality_v0(...)

0 comments on commit 24100f0

Please sign in to comment.