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" 12fe6060f1SDimitry Andric 13fe6060f1SDimitry Andric using namespace llvm; 14fe6060f1SDimitry Andric 15fe6060f1SDimitry Andric void MachineModuleSlotTracker::processMachineFunctionMetadata( 16fe6060f1SDimitry Andric AbstractSlotTrackerStorage *AST, const MachineFunction &MF) { 17fe6060f1SDimitry Andric // Create metadata created within the backend. 18fe6060f1SDimitry Andric for (const MachineBasicBlock &MBB : MF) 19fe6060f1SDimitry Andric for (const MachineInstr &MI : MBB.instrs()) 20fe6060f1SDimitry Andric for (const MachineMemOperand *MMO : MI.memoperands()) { 21fe6060f1SDimitry Andric AAMDNodes AAInfo = MMO->getAAInfo(); 22fe6060f1SDimitry Andric if (AAInfo.TBAA) 23fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.TBAA); 24fe6060f1SDimitry Andric if (AAInfo.TBAAStruct) 25fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.TBAAStruct); 26fe6060f1SDimitry Andric if (AAInfo.Scope) 27fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.Scope); 28fe6060f1SDimitry Andric if (AAInfo.NoAlias) 29fe6060f1SDimitry Andric AST->createMetadataSlot(AAInfo.NoAlias); 30fe6060f1SDimitry Andric } 31fe6060f1SDimitry Andric } 32fe6060f1SDimitry Andric 33fe6060f1SDimitry Andric void MachineModuleSlotTracker::processMachineModule( 34fe6060f1SDimitry Andric AbstractSlotTrackerStorage *AST, const Module *M, 35fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 36fe6060f1SDimitry Andric if (ShouldInitializeAllMetadata) { 37fe6060f1SDimitry Andric for (const Function &F : *M) { 38fe6060f1SDimitry Andric if (&F != &TheFunction) 39fe6060f1SDimitry Andric continue; 40fe6060f1SDimitry Andric MDNStartSlot = AST->getNextMetadataSlot(); 41fe6060f1SDimitry Andric if (auto *MF = TheMMI.getMachineFunction(F)) 42fe6060f1SDimitry Andric processMachineFunctionMetadata(AST, *MF); 43fe6060f1SDimitry Andric MDNEndSlot = AST->getNextMetadataSlot(); 44fe6060f1SDimitry Andric break; 45fe6060f1SDimitry Andric } 46fe6060f1SDimitry Andric } 47fe6060f1SDimitry Andric } 48fe6060f1SDimitry Andric 49fe6060f1SDimitry Andric void MachineModuleSlotTracker::processMachineFunction( 50fe6060f1SDimitry Andric AbstractSlotTrackerStorage *AST, const Function *F, 51fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 52fe6060f1SDimitry Andric if (!ShouldInitializeAllMetadata && F == &TheFunction) { 53fe6060f1SDimitry Andric MDNStartSlot = AST->getNextMetadataSlot(); 54fe6060f1SDimitry Andric if (auto *MF = TheMMI.getMachineFunction(*F)) 55fe6060f1SDimitry Andric processMachineFunctionMetadata(AST, *MF); 56fe6060f1SDimitry Andric MDNEndSlot = AST->getNextMetadataSlot(); 57fe6060f1SDimitry Andric } 58fe6060f1SDimitry Andric } 59fe6060f1SDimitry Andric 60fe6060f1SDimitry Andric void MachineModuleSlotTracker::collectMachineMDNodes( 61fe6060f1SDimitry Andric MachineMDNodeListType &L) const { 62fe6060f1SDimitry Andric collectMDNodes(L, MDNStartSlot, MDNEndSlot); 63fe6060f1SDimitry Andric } 64fe6060f1SDimitry Andric 65fe6060f1SDimitry Andric MachineModuleSlotTracker::MachineModuleSlotTracker( 66fe6060f1SDimitry Andric const MachineFunction *MF, bool ShouldInitializeAllMetadata) 67fe6060f1SDimitry Andric : ModuleSlotTracker(MF->getFunction().getParent(), 68fe6060f1SDimitry Andric ShouldInitializeAllMetadata), 69*1fd87a68SDimitry Andric TheFunction(MF->getFunction()), TheMMI(MF->getMMI()) { 70fe6060f1SDimitry Andric setProcessHook([this](AbstractSlotTrackerStorage *AST, const Module *M, 71fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 72fe6060f1SDimitry Andric this->processMachineModule(AST, M, ShouldInitializeAllMetadata); 73fe6060f1SDimitry Andric }); 74fe6060f1SDimitry Andric setProcessHook([this](AbstractSlotTrackerStorage *AST, const Function *F, 75fe6060f1SDimitry Andric bool ShouldInitializeAllMetadata) { 76fe6060f1SDimitry Andric this->processMachineFunction(AST, F, ShouldInitializeAllMetadata); 77fe6060f1SDimitry Andric }); 78fe6060f1SDimitry Andric } 79fe6060f1SDimitry Andric 80fe6060f1SDimitry Andric MachineModuleSlotTracker::~MachineModuleSlotTracker() = default; 81