diff options
| author | Heejin Ahn <aheejin@gmail.com> | 2018-11-02 18:38:52 +0000 |
|---|---|---|
| committer | Heejin Ahn <aheejin@gmail.com> | 2018-11-02 18:38:52 +0000 |
| commit | 5b023e07eafe1c358b02b2ae0bf88bcaadceaf60 (patch) | |
| tree | d4598fc8032cb445e2107604aeb3d1a3c5f42e1a /llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp | |
| parent | b8cfcc71469d40a98f4cc79fcdc46cd67bea45f7 (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.cpp | 15 |
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: |
