forked from OSchip/llvm-project
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