1*1a462296SCongcong Cai //===-- WebAssemblyCleanCodeAfterTrap.cpp - Clean Code After Trap ---------===// 2*1a462296SCongcong Cai // 3*1a462296SCongcong Cai // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*1a462296SCongcong Cai // See https://llvm.org/LICENSE.txt for license information. 5*1a462296SCongcong Cai // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*1a462296SCongcong Cai // 7*1a462296SCongcong Cai //===----------------------------------------------------------------------===// 8*1a462296SCongcong Cai /// 9*1a462296SCongcong Cai /// \file 10*1a462296SCongcong Cai /// This file remove instruction after trap. 11*1a462296SCongcong Cai /// ``llvm.trap`` will be convert as ``unreachable`` which is terminator. 12*1a462296SCongcong Cai /// Instruction after terminator will cause validation failed. 13*1a462296SCongcong Cai /// 14*1a462296SCongcong Cai //===----------------------------------------------------------------------===// 15*1a462296SCongcong Cai 16*1a462296SCongcong Cai #include "WebAssembly.h" 17*1a462296SCongcong Cai #include "WebAssemblyUtilities.h" 18*1a462296SCongcong Cai #include "llvm/ADT/SmallVector.h" 19*1a462296SCongcong Cai #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" 20*1a462296SCongcong Cai #include "llvm/CodeGen/Passes.h" 21*1a462296SCongcong Cai #include "llvm/MC/MCInstrDesc.h" 22*1a462296SCongcong Cai #include "llvm/Support/Debug.h" 23*1a462296SCongcong Cai #include "llvm/Support/raw_ostream.h" 24*1a462296SCongcong Cai using namespace llvm; 25*1a462296SCongcong Cai 26*1a462296SCongcong Cai #define DEBUG_TYPE "wasm-clean-code-after-trap" 27*1a462296SCongcong Cai 28*1a462296SCongcong Cai namespace { 29*1a462296SCongcong Cai class WebAssemblyCleanCodeAfterTrap final : public MachineFunctionPass { 30*1a462296SCongcong Cai public: 31*1a462296SCongcong Cai static char ID; // Pass identification, replacement for typeid WebAssemblyCleanCodeAfterTrap()32*1a462296SCongcong Cai WebAssemblyCleanCodeAfterTrap() : MachineFunctionPass(ID) {} 33*1a462296SCongcong Cai getPassName() const34*1a462296SCongcong Cai StringRef getPassName() const override { 35*1a462296SCongcong Cai return "WebAssembly Clean Code After Trap"; 36*1a462296SCongcong Cai } 37*1a462296SCongcong Cai 38*1a462296SCongcong Cai bool runOnMachineFunction(MachineFunction &MF) override; 39*1a462296SCongcong Cai }; 40*1a462296SCongcong Cai } // end anonymous namespace 41*1a462296SCongcong Cai 42*1a462296SCongcong Cai char WebAssemblyCleanCodeAfterTrap::ID = 0; 43*1a462296SCongcong Cai INITIALIZE_PASS(WebAssemblyCleanCodeAfterTrap, DEBUG_TYPE, 44*1a462296SCongcong Cai "WebAssembly Clean Code After Trap", false, false) 45*1a462296SCongcong Cai createWebAssemblyCleanCodeAfterTrap()46*1a462296SCongcong CaiFunctionPass *llvm::createWebAssemblyCleanCodeAfterTrap() { 47*1a462296SCongcong Cai return new WebAssemblyCleanCodeAfterTrap(); 48*1a462296SCongcong Cai } 49*1a462296SCongcong Cai runOnMachineFunction(MachineFunction & MF)50*1a462296SCongcong Caibool WebAssemblyCleanCodeAfterTrap::runOnMachineFunction(MachineFunction &MF) { 51*1a462296SCongcong Cai LLVM_DEBUG({ 52*1a462296SCongcong Cai dbgs() << "********** CleanCodeAfterTrap **********\n" 53*1a462296SCongcong Cai << "********** Function: " << MF.getName() << '\n'; 54*1a462296SCongcong Cai }); 55*1a462296SCongcong Cai 56*1a462296SCongcong Cai bool Changed = false; 57*1a462296SCongcong Cai 58*1a462296SCongcong Cai for (MachineBasicBlock &BB : MF) { 59*1a462296SCongcong Cai bool HasTerminator = false; 60*1a462296SCongcong Cai llvm::SmallVector<MachineInstr *> RemoveMI{}; 61*1a462296SCongcong Cai for (MachineInstr &MI : BB) { 62*1a462296SCongcong Cai if (HasTerminator) 63*1a462296SCongcong Cai RemoveMI.push_back(&MI); 64*1a462296SCongcong Cai if (MI.hasProperty(MCID::Trap) && MI.isTerminator()) 65*1a462296SCongcong Cai HasTerminator = true; 66*1a462296SCongcong Cai } 67*1a462296SCongcong Cai if (!RemoveMI.empty()) { 68*1a462296SCongcong Cai Changed = true; 69*1a462296SCongcong Cai LLVM_DEBUG({ 70*1a462296SCongcong Cai for (MachineInstr *MI : RemoveMI) { 71*1a462296SCongcong Cai llvm::dbgs() << "* remove "; 72*1a462296SCongcong Cai MI->print(llvm::dbgs()); 73*1a462296SCongcong Cai } 74*1a462296SCongcong Cai }); 75*1a462296SCongcong Cai for (MachineInstr *MI : RemoveMI) 76*1a462296SCongcong Cai MI->eraseFromParent(); 77*1a462296SCongcong Cai } 78*1a462296SCongcong Cai } 79*1a462296SCongcong Cai return Changed; 80*1a462296SCongcong Cai } 81