From 5b023e07eafe1c358b02b2ae0bf88bcaadceaf60 Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Fri, 2 Nov 2018 18:38:52 +0000 Subject: [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 --- llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Target/WebAssembly/InstPrinter') 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()) + ':'); } -- cgit v1.2.3