19647a6f7SWouter van Oortmerssen //===-- WebAssemblyMCLowerPrePass.cpp - Prepare for MC lower --------------===// 29647a6f7SWouter van Oortmerssen // 39647a6f7SWouter van Oortmerssen // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 49647a6f7SWouter van Oortmerssen // See https://llvm.org/LICENSE.txt for license information. 59647a6f7SWouter van Oortmerssen // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69647a6f7SWouter van Oortmerssen // 79647a6f7SWouter van Oortmerssen //===----------------------------------------------------------------------===// 89647a6f7SWouter van Oortmerssen /// 99647a6f7SWouter van Oortmerssen /// \file 109647a6f7SWouter van Oortmerssen /// Some information in MC lowering / asm printing gets generated as 119647a6f7SWouter van Oortmerssen /// instructions get emitted, but may be necessary at the start, such as for 129647a6f7SWouter van Oortmerssen /// .globaltype declarations. This pass collects this information. 139647a6f7SWouter van Oortmerssen /// 149647a6f7SWouter van Oortmerssen //===----------------------------------------------------------------------===// 159647a6f7SWouter van Oortmerssen 169647a6f7SWouter van Oortmerssen #include "WebAssembly.h" 17984dc4b9SReid Kleckner #include "WebAssemblyUtilities.h" 189647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineFrameInfo.h" 199647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineFunction.h" 209647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineModuleInfoImpls.h" 219647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/Passes.h" 22*4169338eSNikita Popov #include "llvm/IR/Module.h" 239647a6f7SWouter van Oortmerssen #include "llvm/Support/Debug.h" 249647a6f7SWouter van Oortmerssen #include "llvm/Support/raw_ostream.h" 259647a6f7SWouter van Oortmerssen using namespace llvm; 269647a6f7SWouter van Oortmerssen 279647a6f7SWouter van Oortmerssen #define DEBUG_TYPE "wasm-mclower-prepass" 289647a6f7SWouter van Oortmerssen 299647a6f7SWouter van Oortmerssen namespace { 30a99fb86cSWouter van Oortmerssen class WebAssemblyMCLowerPrePass final : public ModulePass { 319647a6f7SWouter van Oortmerssen StringRef getPassName() const override { 329647a6f7SWouter van Oortmerssen return "WebAssembly MC Lower Pre Pass"; 339647a6f7SWouter van Oortmerssen } 349647a6f7SWouter van Oortmerssen 359647a6f7SWouter van Oortmerssen void getAnalysisUsage(AnalysisUsage &AU) const override { 369647a6f7SWouter van Oortmerssen AU.setPreservesCFG(); 37a99fb86cSWouter van Oortmerssen ModulePass::getAnalysisUsage(AU); 389647a6f7SWouter van Oortmerssen } 399647a6f7SWouter van Oortmerssen 40a99fb86cSWouter van Oortmerssen bool runOnModule(Module &M) override; 419647a6f7SWouter van Oortmerssen 429647a6f7SWouter van Oortmerssen public: 439647a6f7SWouter van Oortmerssen static char ID; // Pass identification, replacement for typeid 44a99fb86cSWouter van Oortmerssen WebAssemblyMCLowerPrePass() : ModulePass(ID) {} 459647a6f7SWouter van Oortmerssen }; 469647a6f7SWouter van Oortmerssen } // end anonymous namespace 479647a6f7SWouter van Oortmerssen 489647a6f7SWouter van Oortmerssen char WebAssemblyMCLowerPrePass::ID = 0; 499647a6f7SWouter van Oortmerssen INITIALIZE_PASS( 509647a6f7SWouter van Oortmerssen WebAssemblyMCLowerPrePass, DEBUG_TYPE, 519647a6f7SWouter van Oortmerssen "Collects information ahead of time for MC lowering", 529647a6f7SWouter van Oortmerssen false, false) 539647a6f7SWouter van Oortmerssen 54a99fb86cSWouter van Oortmerssen ModulePass *llvm::createWebAssemblyMCLowerPrePass() { 559647a6f7SWouter van Oortmerssen return new WebAssemblyMCLowerPrePass(); 569647a6f7SWouter van Oortmerssen } 579647a6f7SWouter van Oortmerssen 58a99fb86cSWouter van Oortmerssen // NOTE: this is a ModulePass since we need to enforce that this code has run 59a99fb86cSWouter van Oortmerssen // for all functions before AsmPrinter. If this way of doing things is ever 60a99fb86cSWouter van Oortmerssen // suboptimal, we could opt to make it a MachineFunctionPass and instead use 61a99fb86cSWouter van Oortmerssen // something like createBarrierNoopPass() to enforce ordering. 62c67c9cfeSPaulo Matos // 63c67c9cfeSPaulo Matos // The information stored here is essential for emitExternalDecls in the Wasm 64c67c9cfeSPaulo Matos // AsmPrinter 65a99fb86cSWouter van Oortmerssen bool WebAssemblyMCLowerPrePass::runOnModule(Module &M) { 66a99fb86cSWouter van Oortmerssen auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>(); 67a99fb86cSWouter van Oortmerssen if (!MMIWP) 68a99fb86cSWouter van Oortmerssen return true; 699647a6f7SWouter van Oortmerssen 70a99fb86cSWouter van Oortmerssen MachineModuleInfo &MMI = MMIWP->getMMI(); 719647a6f7SWouter van Oortmerssen MachineModuleInfoWasm &MMIW = MMI.getObjFileInfo<MachineModuleInfoWasm>(); 729647a6f7SWouter van Oortmerssen 73a99fb86cSWouter van Oortmerssen for (Function &F : M) { 74a99fb86cSWouter van Oortmerssen MachineFunction *MF = MMI.getMachineFunction(F); 75a99fb86cSWouter van Oortmerssen if (!MF) 76a99fb86cSWouter van Oortmerssen continue; 77a99fb86cSWouter van Oortmerssen 78a99fb86cSWouter van Oortmerssen LLVM_DEBUG(dbgs() << "********** MC Lower Pre Pass **********\n" 79a99fb86cSWouter van Oortmerssen "********** Function: " 80a99fb86cSWouter van Oortmerssen << MF->getName() << '\n'); 81a99fb86cSWouter van Oortmerssen 82a99fb86cSWouter van Oortmerssen for (MachineBasicBlock &MBB : *MF) { 839647a6f7SWouter van Oortmerssen for (auto &MI : MBB) { 849647a6f7SWouter van Oortmerssen // FIXME: what should all be filtered out beyond these? 859647a6f7SWouter van Oortmerssen if (MI.isDebugInstr() || MI.isInlineAsm()) 869647a6f7SWouter van Oortmerssen continue; 879647a6f7SWouter van Oortmerssen for (MachineOperand &MO : MI.uses()) { 889647a6f7SWouter van Oortmerssen if (MO.isSymbol()) { 899647a6f7SWouter van Oortmerssen MMIW.MachineSymbolsUsed.insert(MO.getSymbolName()); 909647a6f7SWouter van Oortmerssen } 919647a6f7SWouter van Oortmerssen } 929647a6f7SWouter van Oortmerssen } 939647a6f7SWouter van Oortmerssen } 94a99fb86cSWouter van Oortmerssen } 959647a6f7SWouter van Oortmerssen return true; 969647a6f7SWouter van Oortmerssen } 97