Index: llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp +++ llvm/trunk/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp @@ -85,16 +85,16 @@ 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; } Index: llvm/trunk/test/CodeGen/WebAssembly/block-mismatch.mir =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/block-mismatch.mir +++ llvm/trunk/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 +...