forked from OSchip/llvm-project
[WebAssembly] Fix bugs in rethrow depth counting and InstPrinter
Summary: EH stack depth is incremented at `try` and decremented at `catch`. When there are more than two catch instructions for a try instruction, we shouldn't count non-first catches when calculating EH stack depths. This patch fixes two bugs: - CFGStackify: Exclude `catch_all` in the terminate catch pad when calculating EH pad stack, because when we have multiple catches for a try we should count only the first catch instruction when calculating EH pad stack. - InstPrinter: The initial intention was also to exclude non-first catches, but it didn't account nested try-catches, so it failed on this case: ``` try try catch end catch <-- (1) end ``` In the example, when we are at the catch (1), the last seen EH instruction is not `try` but `end_try`, violating the wrong assumption. We don't need these after we switch to the second proposal because there is gonna be only one `catch` instruction. But anyway before then these bugfixes are necessary for keep trunk in working state. Reviewers: dschuff Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D53819 llvm-svn: 346029
This commit is contained in:
parent
b8cfcc7146
commit
5b023e07ea
|
@ -120,10 +120,9 @@ void WebAssemblyInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
|
|||
case WebAssembly::CATCH_I64_S:
|
||||
case WebAssembly::CATCH_ALL:
|
||||
case WebAssembly::CATCH_ALL_S:
|
||||
assert(LastSeenEHInst != END_TRY);
|
||||
// There can be multiple catch instructions for one try instruction, so we
|
||||
// only print 'catch' label when the last seen EH instruction was 'try'.
|
||||
if (LastSeenEHInst == TRY) {
|
||||
// print a label only for the first 'catch' label.
|
||||
if (LastSeenEHInst != CATCH) {
|
||||
assert(!EHPadStack.empty() && "try-catch mismatch!");
|
||||
printAnnotation(OS, "catch" + utostr(EHPadStack.pop_back_val()) + ':');
|
||||
}
|
||||
|
|
|
@ -739,7 +739,20 @@ void WebAssemblyCFGStackify::rewriteDepthImmediates(MachineFunction &MF) {
|
|||
case WebAssembly::CATCH_I32:
|
||||
case WebAssembly::CATCH_I64:
|
||||
case WebAssembly::CATCH_ALL:
|
||||
EHPadStack.push_back(&MBB);
|
||||
// Currently the only case there are more than one catch for a try is
|
||||
// for catch terminate pad, in the form of
|
||||
// try
|
||||
// catch
|
||||
// call @__clang_call_terminate
|
||||
// unreachable
|
||||
// catch_all
|
||||
// call @std::terminate
|
||||
// unreachable
|
||||
// end
|
||||
// So we shouldn't push the current BB for the second catch_all block
|
||||
// here.
|
||||
if (!WebAssembly::isCatchAllTerminatePad(MBB))
|
||||
EHPadStack.push_back(&MBB);
|
||||
break;
|
||||
|
||||
case WebAssembly::LOOP:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
; RUN: not llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -exception-model=wasm
|
||||
; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt -wasm-keep-registers -exception-model=wasm -mattr=+exception-handling | FileCheck -allow-deprecated-dag-overlap %s
|
||||
; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-keep-registers -exception-model=wasm -mattr=+exception-handling
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
||||
target triple = "wasm32-unknown-unknown"
|
||||
|
|
Loading…
Reference in New Issue