[PATCH] D53819: [WebAssembly] Fix bugs in rethrow depth counting and InstPrinter
Heejin Ahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 29 08:53:45 PDT 2018
aheejin created this revision.
aheejin added a reviewer: dschuff.
Herald added subscribers: llvm-commits, sunfish, jgravelle-google, sbc100.
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.
Repository:
rL LLVM
https://reviews.llvm.org/D53819
Files:
lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
test/CodeGen/WebAssembly/exception.ll
Index: test/CodeGen/WebAssembly/exception.ll
===================================================================
--- test/CodeGen/WebAssembly/exception.ll
+++ test/CodeGen/WebAssembly/exception.ll
@@ -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"
Index: lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
===================================================================
--- lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
+++ lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
@@ -739,7 +739,20 @@
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:
Index: lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
===================================================================
--- lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
+++ lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
@@ -120,10 +120,9 @@
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()) + ':');
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53819.171513.patch
Type: text/x-patch
Size: 2619 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181029/72114ee9/attachment.bin>
More information about the llvm-commits
mailing list