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 "MCTargetDesc/WebAssemblyMCTargetDesc.h" 179647a6f7SWouter van Oortmerssen #include "Utils/WebAssemblyUtilities.h" 189647a6f7SWouter van Oortmerssen #include "WebAssembly.h" 199647a6f7SWouter van Oortmerssen #include "WebAssemblyMachineFunctionInfo.h" 209647a6f7SWouter van Oortmerssen #include "WebAssemblySubtarget.h" 219647a6f7SWouter van Oortmerssen #include "llvm/ADT/SCCIterator.h" 229647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineFrameInfo.h" 239647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineFunction.h" 249647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineInstrBuilder.h" 259647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineLoopInfo.h" 269647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineModuleInfoImpls.h" 279647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/MachineRegisterInfo.h" 289647a6f7SWouter van Oortmerssen #include "llvm/CodeGen/Passes.h" 299647a6f7SWouter van Oortmerssen #include "llvm/Support/Debug.h" 309647a6f7SWouter van Oortmerssen #include "llvm/Support/raw_ostream.h" 319647a6f7SWouter van Oortmerssen using namespace llvm; 329647a6f7SWouter van Oortmerssen 339647a6f7SWouter van Oortmerssen #define DEBUG_TYPE "wasm-mclower-prepass" 349647a6f7SWouter van Oortmerssen 359647a6f7SWouter van Oortmerssen namespace { 36a99fb86cSWouter van Oortmerssen class WebAssemblyMCLowerPrePass final : public ModulePass { getPassName() const379647a6f7SWouter van Oortmerssen StringRef getPassName() const override { 389647a6f7SWouter van Oortmerssen return "WebAssembly MC Lower Pre Pass"; 399647a6f7SWouter van Oortmerssen } 409647a6f7SWouter van Oortmerssen getAnalysisUsage(AnalysisUsage & AU) const419647a6f7SWouter van Oortmerssen void getAnalysisUsage(AnalysisUsage &AU) const override { 429647a6f7SWouter van Oortmerssen AU.setPreservesCFG(); 43a99fb86cSWouter van Oortmerssen ModulePass::getAnalysisUsage(AU); 449647a6f7SWouter van Oortmerssen } 459647a6f7SWouter van Oortmerssen 46a99fb86cSWouter van Oortmerssen bool runOnModule(Module &M) override; 479647a6f7SWouter van Oortmerssen 489647a6f7SWouter van Oortmerssen public: 499647a6f7SWouter van Oortmerssen static char ID; // Pass identification, replacement for typeid WebAssemblyMCLowerPrePass()50a99fb86cSWouter van Oortmerssen WebAssemblyMCLowerPrePass() : ModulePass(ID) {} 519647a6f7SWouter van Oortmerssen }; 529647a6f7SWouter van Oortmerssen } // end anonymous namespace 539647a6f7SWouter van Oortmerssen 549647a6f7SWouter van Oortmerssen char WebAssemblyMCLowerPrePass::ID = 0; 559647a6f7SWouter van Oortmerssen INITIALIZE_PASS( 569647a6f7SWouter van Oortmerssen WebAssemblyMCLowerPrePass, DEBUG_TYPE, 579647a6f7SWouter van Oortmerssen "Collects information ahead of time for MC lowering", 589647a6f7SWouter van Oortmerssen false, false) 599647a6f7SWouter van Oortmerssen createWebAssemblyMCLowerPrePass()60a99fb86cSWouter van OortmerssenModulePass *llvm::createWebAssemblyMCLowerPrePass() { 619647a6f7SWouter van Oortmerssen return new WebAssemblyMCLowerPrePass(); 629647a6f7SWouter van Oortmerssen } 639647a6f7SWouter van Oortmerssen 64a99fb86cSWouter van Oortmerssen // NOTE: this is a ModulePass since we need to enforce that this code has run 65a99fb86cSWouter van Oortmerssen // for all functions before AsmPrinter. If this way of doing things is ever 66a99fb86cSWouter van Oortmerssen // suboptimal, we could opt to make it a MachineFunctionPass and instead use 67a99fb86cSWouter van Oortmerssen // something like createBarrierNoopPass() to enforce ordering. 68*c67c9cfeSPaulo Matos // 69*c67c9cfeSPaulo Matos // The information stored here is essential for emitExternalDecls in the Wasm 70*c67c9cfeSPaulo Matos // AsmPrinter runOnModule(Module & M)71a99fb86cSWouter van Oortmerssenbool WebAssemblyMCLowerPrePass::runOnModule(Module &M) { 72a99fb86cSWouter van Oortmerssen auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>(); 73a99fb86cSWouter van Oortmerssen if (!MMIWP) 74a99fb86cSWouter van Oortmerssen return true; 759647a6f7SWouter van Oortmerssen 76a99fb86cSWouter van Oortmerssen MachineModuleInfo &MMI = MMIWP->getMMI(); 779647a6f7SWouter van Oortmerssen MachineModuleInfoWasm &MMIW = MMI.getObjFileInfo<MachineModuleInfoWasm>(); 789647a6f7SWouter van Oortmerssen 79a99fb86cSWouter van Oortmerssen for (Function &F : M) { 80a99fb86cSWouter van Oortmerssen MachineFunction *MF = MMI.getMachineFunction(F); 81a99fb86cSWouter van Oortmerssen if (!MF) 82a99fb86cSWouter van Oortmerssen continue; 83a99fb86cSWouter van Oortmerssen 84a99fb86cSWouter van Oortmerssen LLVM_DEBUG(dbgs() << "********** MC Lower Pre Pass **********\n" 85a99fb86cSWouter van Oortmerssen "********** Function: " 86a99fb86cSWouter van Oortmerssen << MF->getName() << '\n'); 87a99fb86cSWouter van Oortmerssen 88a99fb86cSWouter van Oortmerssen for (MachineBasicBlock &MBB : *MF) { 899647a6f7SWouter van Oortmerssen for (auto &MI : MBB) { 909647a6f7SWouter van Oortmerssen // FIXME: what should all be filtered out beyond these? 919647a6f7SWouter van Oortmerssen if (MI.isDebugInstr() || MI.isInlineAsm()) 929647a6f7SWouter van Oortmerssen continue; 939647a6f7SWouter van Oortmerssen for (MachineOperand &MO : MI.uses()) { 949647a6f7SWouter van Oortmerssen if (MO.isSymbol()) { 959647a6f7SWouter van Oortmerssen MMIW.MachineSymbolsUsed.insert(MO.getSymbolName()); 969647a6f7SWouter van Oortmerssen } 979647a6f7SWouter van Oortmerssen } 989647a6f7SWouter van Oortmerssen } 999647a6f7SWouter van Oortmerssen } 100a99fb86cSWouter van Oortmerssen } 1019647a6f7SWouter van Oortmerssen return true; 1029647a6f7SWouter van Oortmerssen } 103