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