[WebAssembly] Error out when block/loop markers mismatch

Summary:
Currently InstPrinter ignores if there are mismatches between block/loop
and end markers by skipping the case if ControlFlowStack is empty. I
guess it is better to explicitly error out in this case, because this
signals invalid input.

Reviewers: aardappel

Subscribers: dschuff, sbc100, jgravelle-google, sunfish, llvm-commits

Differential Revision: https://reviews.llvm.org/D53620

llvm-svn: 345333
This commit is contained in:
Heejin Ahn 2018-10-25 23:35:13 +00:00
parent cc18f8aa0f
commit 1147d91402
2 changed files with 25 additions and 7 deletions

View File

@ -85,16 +85,16 @@ void WebAssemblyInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
break;
case WebAssembly::END_LOOP:
case WebAssembly::END_LOOP_S:
// Have to guard against an empty stack, in case of mismatched pairs
// in assembly parsing.
if (!ControlFlowStack.empty())
ControlFlowStack.pop_back();
if (ControlFlowStack.empty())
report_fatal_error("End marker mismatch!");
ControlFlowStack.pop_back();
break;
case WebAssembly::END_BLOCK:
case WebAssembly::END_BLOCK_S:
if (!ControlFlowStack.empty())
printAnnotation(
OS, "label" + utostr(ControlFlowStack.pop_back_val().first) + ':');
if (ControlFlowStack.empty())
report_fatal_error("END marker mismatch!");
printAnnotation(
OS, "label" + utostr(ControlFlowStack.pop_back_val().first) + ':');
break;
}

View File

@ -0,0 +1,18 @@
# RUN: not llc -mtriple=wasm32-unknown-unknown -start-after xray-instrumentation %s -o /dev/null 2>&1 | FileCheck %s
# This tests if there are block/loop marker mismatches, the program crashes.
---
name: block_mismatch
liveins:
- { reg: '$arguments', reg: '$value_stack' }
tracksRegLiveness: true
body: |
bb.0:
liveins: $arguments, $value_stack
BLOCK 64, implicit-def $value_stack, implicit $value_stack
END_BLOCK implicit-def $value_stack, implicit $value_stack
; CHECK: LLVM ERROR: END marker mismatch!
END_BLOCK implicit-def $value_stack, implicit $value_stack
RETURN_VOID implicit-def dead $arguments
...