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