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:
parent
9b6cd711d6
commit
01f99f3cd6
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue