From 01f99f3cd67bb51a9fc18aa95dc73be20a22288d Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Sat, 11 Aug 2018 04:18:05 +0000 Subject: [PATCH] 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 --- llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp b/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp index c040c81..99c8146 100644 --- a/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp @@ -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; -- 2.7.4