|  | //===- MachineFunctionAnalysis.cpp ----------------------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains the definitions of the MachineFunctionAnalysis | 
|  | // members. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/CodeGen/MachineFunctionAnalysis.h" | 
|  | #include "llvm/CodeGen/MachineFunction.h" | 
|  | #include "llvm/CodeGen/MachineModuleInfo.h" | 
|  | #include "llvm/IR/Function.h" | 
|  | #include "llvm/Target/TargetMachine.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | AnalysisKey MachineFunctionAnalysis::Key; | 
|  |  | 
|  | llvm::MachineFunctionAnalysis::Result::Result( | 
|  | std::unique_ptr<MachineFunction> MF) | 
|  | : MF(std::move(MF)) {} | 
|  |  | 
|  | bool MachineFunctionAnalysis::Result::invalidate( | 
|  | Function &, const PreservedAnalyses &PA, | 
|  | FunctionAnalysisManager::Invalidator &) { | 
|  | // Unless it is invalidated explicitly, it should remain preserved. | 
|  | auto PAC = PA.getChecker<MachineFunctionAnalysis>(); | 
|  | return !PAC.preservedWhenStateless(); | 
|  | } | 
|  |  | 
|  | MachineFunctionAnalysis::Result | 
|  | MachineFunctionAnalysis::run(Function &F, FunctionAnalysisManager &FAM) { | 
|  | auto &Context = F.getContext(); | 
|  | const TargetSubtargetInfo &STI = *TM->getSubtargetImpl(F); | 
|  | auto &MMI = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F) | 
|  | .getCachedResult<MachineModuleAnalysis>(*F.getParent()) | 
|  | ->getMMI(); | 
|  | auto MF = std::make_unique<MachineFunction>( | 
|  | F, *TM, STI, MMI.getContext(), Context.generateMachineFunctionNum(F)); | 
|  | MF->initTargetMachineFunctionInfo(STI); | 
|  |  | 
|  | // MRI callback for target specific initializations. | 
|  | TM->registerMachineRegisterInfoCallback(*MF); | 
|  |  | 
|  | return Result(std::move(MF)); | 
|  | } | 
|  |  | 
|  | PreservedAnalyses FreeMachineFunctionPass::run(Function &F, | 
|  | FunctionAnalysisManager &FAM) { | 
|  | FAM.clearAnalysis<MachineFunctionAnalysis>(F); | 
|  | return PreservedAnalyses::all(); | 
|  | } |