diff options
| -rw-r--r-- | llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp | 14 | ||||
| -rw-r--r-- | llvm/test/CodeGen/WebAssembly/block-mismatch.mir | 18 | 
2 files changed, 25 insertions, 7 deletions
diff --git a/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp b/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp index 08c1155fed7..e26cf1d8cf4 100644 --- a/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp @@ -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;      } diff --git a/llvm/test/CodeGen/WebAssembly/block-mismatch.mir b/llvm/test/CodeGen/WebAssembly/block-mismatch.mir new file mode 100644 index 00000000000..0da58e9ddb8 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/block-mismatch.mir @@ -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 +...  | 

