summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/InstPrinter
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/InstPrinter
parentb8cfcc71469d40a98f4cc79fcdc46cd67bea45f7 (diff)
downloadbcm5719-llvm-5b023e07eafe1c358b02b2ae0bf88bcaadceaf60.tar.gz
bcm5719-llvm-5b023e07eafe1c358b02b2ae0bf88bcaadceaf60.zip
[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/InstPrinter')
-rw-r--r--llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp5
1 files changed, 2 insertions, 3 deletions
diff --git a/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp b/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
index 6b97e14364f..e94faa1a214 100644
--- a/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp
@@ -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()) + ':');
}
OpenPOWER on IntegriCloud