xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionAnalysis.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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 
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
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