summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2018-11-02 18:38:52 +0000
committerHeejin Ahn <aheejin@gmail.com>2018-11-02 18:38:52 +0000
commit5b023e07eafe1c358b02b2ae0bf88bcaadceaf60 (patch)
treed4598fc8032cb445e2107604aeb3d1a3c5f42e1a /llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
parentb8cfcc71469d40a98f4cc79fcdc46cd67bea45f7 (diff)
[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
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
index a3b3901f0199..b1955017c687 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp
@@ -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: