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