Fix WebAssembly instruction printer after r339474

Treat the stack variants of control instructions the same as regular
instructions.  Otherwise, the vector ControlFlowStack will be the wrong
size and have out-of-bounds access.  This was detected by MemorySanitizer.

llvm-svn: 339495
This commit is contained in:
Richard Trieu 2018-08-11 04:18:05 +00:00
parent 9b6cd711d6
commit 01f99f3cd6
1 changed files with 5 additions and 1 deletions

View File

@ -73,20 +73,24 @@ void WebAssemblyInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
switch (MI->getOpcode()) {
default:
break;
case WebAssembly::LOOP: {
case WebAssembly::LOOP:
case WebAssembly::LOOP_S: {
printAnnotation(OS, "label" + utostr(ControlFlowCounter) + ':');
ControlFlowStack.push_back(std::make_pair(ControlFlowCounter++, true));
break;
}
case WebAssembly::BLOCK:
case WebAssembly::BLOCK_S:
ControlFlowStack.push_back(std::make_pair(ControlFlowCounter++, false));
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();
break;
case WebAssembly::END_BLOCK:
case WebAssembly::END_BLOCK_S:
if (!ControlFlowStack.empty()) printAnnotation(
OS, "label" + utostr(ControlFlowStack.pop_back_val().first) + ':');
break;