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()) {
 | 
					    switch (MI->getOpcode()) {
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case WebAssembly::LOOP: {
 | 
					    case WebAssembly::LOOP:
 | 
				
			||||||
 | 
					    case WebAssembly::LOOP_S: {
 | 
				
			||||||
      printAnnotation(OS, "label" + utostr(ControlFlowCounter) + ':');
 | 
					      printAnnotation(OS, "label" + utostr(ControlFlowCounter) + ':');
 | 
				
			||||||
      ControlFlowStack.push_back(std::make_pair(ControlFlowCounter++, true));
 | 
					      ControlFlowStack.push_back(std::make_pair(ControlFlowCounter++, true));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    case WebAssembly::BLOCK:
 | 
					    case WebAssembly::BLOCK:
 | 
				
			||||||
 | 
					    case WebAssembly::BLOCK_S:
 | 
				
			||||||
      ControlFlowStack.push_back(std::make_pair(ControlFlowCounter++, false));
 | 
					      ControlFlowStack.push_back(std::make_pair(ControlFlowCounter++, false));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case WebAssembly::END_LOOP:
 | 
					    case WebAssembly::END_LOOP:
 | 
				
			||||||
 | 
					    case WebAssembly::END_LOOP_S:
 | 
				
			||||||
      // Have to guard against an empty stack, in case of mismatched pairs
 | 
					      // Have to guard against an empty stack, in case of mismatched pairs
 | 
				
			||||||
      // in assembly parsing.
 | 
					      // in assembly parsing.
 | 
				
			||||||
      if (!ControlFlowStack.empty()) ControlFlowStack.pop_back();
 | 
					      if (!ControlFlowStack.empty()) ControlFlowStack.pop_back();
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case WebAssembly::END_BLOCK:
 | 
					    case WebAssembly::END_BLOCK:
 | 
				
			||||||
 | 
					    case WebAssembly::END_BLOCK_S:
 | 
				
			||||||
      if (!ControlFlowStack.empty()) printAnnotation(
 | 
					      if (!ControlFlowStack.empty()) printAnnotation(
 | 
				
			||||||
          OS, "label" + utostr(ControlFlowStack.pop_back_val().first) + ':');
 | 
					          OS, "label" + utostr(ControlFlowStack.pop_back_val().first) + ':');
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue