brintos

brintos / llvm-project-archived public Read only

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