1*0fca6ea1SDimitry Andric //===- MachineFunctionAnalysis.cpp ----------------------------------------===//
2*0fca6ea1SDimitry Andric //
3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0fca6ea1SDimitry Andric //
7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
8*0fca6ea1SDimitry Andric //
9*0fca6ea1SDimitry Andric // This file contains the definitions of the MachineFunctionAnalysis
10*0fca6ea1SDimitry Andric // members.
11*0fca6ea1SDimitry Andric //
12*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===//
13*0fca6ea1SDimitry Andric
14*0fca6ea1SDimitry Andric #include "llvm/CodeGen/MachineFunctionAnalysis.h"
15*0fca6ea1SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
16*0fca6ea1SDimitry Andric #include "llvm/CodeGen/MachineModuleInfo.h"
17*0fca6ea1SDimitry Andric #include "llvm/IR/Function.h"
18*0fca6ea1SDimitry Andric #include "llvm/Target/TargetMachine.h"
19*0fca6ea1SDimitry Andric
20*0fca6ea1SDimitry Andric using namespace llvm;
21*0fca6ea1SDimitry Andric
22*0fca6ea1SDimitry Andric AnalysisKey MachineFunctionAnalysis::Key;
23*0fca6ea1SDimitry Andric
invalidate(Function &,const PreservedAnalyses & PA,FunctionAnalysisManager::Invalidator &)24*0fca6ea1SDimitry Andric bool MachineFunctionAnalysis::Result::invalidate(
25*0fca6ea1SDimitry Andric Function &, const PreservedAnalyses &PA,
26*0fca6ea1SDimitry Andric FunctionAnalysisManager::Invalidator &) {
27*0fca6ea1SDimitry Andric // Unless it is invalidated explicitly, it should remain preserved.
28*0fca6ea1SDimitry Andric auto PAC = PA.getChecker<MachineFunctionAnalysis>();
29*0fca6ea1SDimitry Andric return !PAC.preservedWhenStateless();
30*0fca6ea1SDimitry Andric }
31*0fca6ea1SDimitry Andric
32*0fca6ea1SDimitry Andric MachineFunctionAnalysis::Result
run(Function & F,FunctionAnalysisManager & FAM)33*0fca6ea1SDimitry Andric MachineFunctionAnalysis::run(Function &F, FunctionAnalysisManager &FAM) {
34*0fca6ea1SDimitry Andric auto &Context = F.getContext();
35*0fca6ea1SDimitry Andric const TargetSubtargetInfo &STI = *TM->getSubtargetImpl(F);
36*0fca6ea1SDimitry Andric auto &MMI = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F)
37*0fca6ea1SDimitry Andric .getCachedResult<MachineModuleAnalysis>(*F.getParent())
38*0fca6ea1SDimitry Andric ->getMMI();
39*0fca6ea1SDimitry Andric auto MF = std::make_unique<MachineFunction>(
40*0fca6ea1SDimitry Andric F, *TM, STI, Context.generateMachineFunctionNum(F), MMI);
41*0fca6ea1SDimitry Andric MF->initTargetMachineFunctionInfo(STI);
42*0fca6ea1SDimitry Andric
43*0fca6ea1SDimitry Andric // MRI callback for target specific initializations.
44*0fca6ea1SDimitry Andric TM->registerMachineRegisterInfoCallback(*MF);
45*0fca6ea1SDimitry Andric
46*0fca6ea1SDimitry Andric return Result(std::move(MF));
47*0fca6ea1SDimitry Andric }
48