brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 3f73ca6 Raw
97 lines · cpp
1//===-- WebAssemblyMCLowerPrePass.cpp - Prepare for MC lower --------------===//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/// Some information in MC lowering / asm printing gets generated as11/// instructions get emitted, but may be necessary at the start, such as for12/// .globaltype declarations. This pass collects this information.13///14//===----------------------------------------------------------------------===//15 16#include "WebAssembly.h"17#include "WebAssemblyUtilities.h"18#include "llvm/CodeGen/MachineFrameInfo.h"19#include "llvm/CodeGen/MachineFunction.h"20#include "llvm/CodeGen/MachineModuleInfoImpls.h"21#include "llvm/CodeGen/Passes.h"22#include "llvm/IR/Module.h"23#include "llvm/Support/Debug.h"24#include "llvm/Support/raw_ostream.h"25using namespace llvm;26 27#define DEBUG_TYPE "wasm-mclower-prepass"28 29namespace {30class WebAssemblyMCLowerPrePass final : public ModulePass {31  StringRef getPassName() const override {32    return "WebAssembly MC Lower Pre Pass";33  }34 35  void getAnalysisUsage(AnalysisUsage &AU) const override {36    AU.setPreservesCFG();37    ModulePass::getAnalysisUsage(AU);38  }39 40  bool runOnModule(Module &M) override;41 42public:43  static char ID; // Pass identification, replacement for typeid44  WebAssemblyMCLowerPrePass() : ModulePass(ID) {}45};46} // end anonymous namespace47 48char WebAssemblyMCLowerPrePass::ID = 0;49INITIALIZE_PASS(50    WebAssemblyMCLowerPrePass, DEBUG_TYPE,51    "Collects information ahead of time for MC lowering",52    false, false)53 54ModulePass *llvm::createWebAssemblyMCLowerPrePass() {55  return new WebAssemblyMCLowerPrePass();56}57 58// NOTE: this is a ModulePass since we need to enforce that this code has run59// for all functions before AsmPrinter. If this way of doing things is ever60// suboptimal, we could opt to make it a MachineFunctionPass and instead use61// something like createBarrierNoopPass() to enforce ordering.62//63// The information stored here is essential for emitExternalDecls in the Wasm64// AsmPrinter65bool WebAssemblyMCLowerPrePass::runOnModule(Module &M) {66  auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();67  if (!MMIWP)68    return true;69 70  MachineModuleInfo &MMI = MMIWP->getMMI();71  MachineModuleInfoWasm &MMIW = MMI.getObjFileInfo<MachineModuleInfoWasm>();72 73  for (Function &F : M) {74    MachineFunction *MF = MMI.getMachineFunction(F);75    if (!MF)76      continue;77 78    LLVM_DEBUG(dbgs() << "********** MC Lower Pre Pass **********\n"79                         "********** Function: "80                      << MF->getName() << '\n');81 82    for (MachineBasicBlock &MBB : *MF) {83      for (auto &MI : MBB) {84        // FIXME: what should all be filtered out beyond these?85        if (MI.isDebugInstr() || MI.isInlineAsm())86          continue;87        for (MachineOperand &MO : MI.uses()) {88          if (MO.isSymbol()) {89            MMIW.MachineSymbolsUsed.insert(MO.getSymbolName());90          }91        }92      }93    }94  }95  return true;96}97