1*fe6060f1SDimitry Andric //===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// 2*fe6060f1SDimitry Andric // 3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*fe6060f1SDimitry Andric // 7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8*fe6060f1SDimitry Andric 9*fe6060f1SDimitry Andric #include "llvm/CodeGen/MachineModuleSlotTracker.h" 10*fe6060f1SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 11*fe6060f1SDimitry Andric #include "llvm/CodeGen/MachineModuleInfo.h" 12*fe6060f1SDimitry Andric 13*fe6060f1SDimitry Andric using namespace llvm; 14*fe6060f1SDimitry Andric 15*fe6060f1SDimitry Andric void MachineModuleSlotTracker::processMachineFunctionMetadata( 16*fe6060f1SDimitry Andric AbstractSlotTrackerStorage *AST, const MachineFunction &MF) { 17*fe6060f1SDimitry Andric // Create metadata created within the backend. 18*fe6060f1SDimitry Andric for (const MachineBasicBlock &MBB : MF) 19*fe6060f1SDimitry Andric for (const MachineInstr &MI : MBB.instrs()) 20*fe6060f1SDimitry Andric for (const MachineMemOperand *MMO : MI.memoperands()) { 21*fe6060f1SDimitry Andric AAMDNodes AAInfo = MMO->getAAInfo(); 22*fe6060f1SDimitry Andric if (AAInfo.TBAA) 23*fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.TBAA); 24*fe6060f1SDimitry Andric if (AAInfo.TBAAStruct) 25*fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.TBAAStruct); 26*fe6060f1SDimitry Andric if (AAInfo.Scope) 27*fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.Scope); 28*fe6060f1SDimitry Andric if (AAInfo.NoAlias) 29*fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.NoAlias); 30*fe6060f1SDimitry Andric } 31*fe6060f1SDimitry Andric } 32*fe6060f1SDimitry Andric 33*fe6060f1SDimitry Andric void MachineModuleSlotTracker::processMachineModule( 34*fe6060f1SDimitry Andric AbstractSlotTrackerStorage *AST, const Module *M, 35*fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 36*fe6060f1SDimitry Andric if (ShouldInitializeAllMetadata) { 37*fe6060f1SDimitry Andric for (const Function &F : *M) { 38*fe6060f1SDimitry Andric if (&F != &TheFunction) 39*fe6060f1SDimitry Andric continue; 40*fe6060f1SDimitry Andric MDNStartSlot = AST->getNextMetadataSlot(); 41*fe6060f1SDimitry Andric if (auto *MF = TheMMI.getMachineFunction(F)) 42*fe6060f1SDimitry Andric processMachineFunctionMetadata(AST, *MF); 43*fe6060f1SDimitry Andric MDNEndSlot = AST->getNextMetadataSlot(); 44*fe6060f1SDimitry Andric break; 45*fe6060f1SDimitry Andric } 46*fe6060f1SDimitry Andric } 47*fe6060f1SDimitry Andric } 48*fe6060f1SDimitry Andric 49*fe6060f1SDimitry Andric void MachineModuleSlotTracker::processMachineFunction( 50*fe6060f1SDimitry Andric AbstractSlotTrackerStorage *AST, const Function *F, 51*fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 52*fe6060f1SDimitry Andric if (!ShouldInitializeAllMetadata && F == &TheFunction) { 53*fe6060f1SDimitry Andric MDNStartSlot = AST->getNextMetadataSlot(); 54*fe6060f1SDimitry Andric if (auto *MF = TheMMI.getMachineFunction(*F)) 55*fe6060f1SDimitry Andric processMachineFunctionMetadata(AST, *MF); 56*fe6060f1SDimitry Andric MDNEndSlot = AST->getNextMetadataSlot(); 57*fe6060f1SDimitry Andric } 58*fe6060f1SDimitry Andric } 59*fe6060f1SDimitry Andric 60*fe6060f1SDimitry Andric void MachineModuleSlotTracker::collectMachineMDNodes( 61*fe6060f1SDimitry Andric MachineMDNodeListType &L) const { 62*fe6060f1SDimitry Andric collectMDNodes(L, MDNStartSlot, MDNEndSlot); 63*fe6060f1SDimitry Andric } 64*fe6060f1SDimitry Andric 65*fe6060f1SDimitry Andric MachineModuleSlotTracker::MachineModuleSlotTracker( 66*fe6060f1SDimitry Andric const MachineFunction *MF, bool ShouldInitializeAllMetadata) 67*fe6060f1SDimitry Andric : ModuleSlotTracker(MF->getFunction().getParent(), 68*fe6060f1SDimitry Andric ShouldInitializeAllMetadata), 69*fe6060f1SDimitry Andric TheFunction(MF->getFunction()), TheMMI(MF->getMMI()), MDNStartSlot(0), 70*fe6060f1SDimitry Andric MDNEndSlot(0) { 71*fe6060f1SDimitry Andric setProcessHook([this](AbstractSlotTrackerStorage *AST, const Module *M, 72*fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 73*fe6060f1SDimitry Andric this->processMachineModule(AST, M, ShouldInitializeAllMetadata); 74*fe6060f1SDimitry Andric }); 75*fe6060f1SDimitry Andric setProcessHook([this](AbstractSlotTrackerStorage *AST, const Function *F, 76*fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 77*fe6060f1SDimitry Andric this->processMachineFunction(AST, F, ShouldInitializeAllMetadata); 78*fe6060f1SDimitry Andric }); 79*fe6060f1SDimitry Andric } 80*fe6060f1SDimitry Andric 81*fe6060f1SDimitry Andric MachineModuleSlotTracker::~MachineModuleSlotTracker() = default; 82