mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
17b01651c8
When parsing .mir files immediately construct the MachineFunctions and put them into MachineModuleInfo. This allows us to get rid of the delayed construction (and delayed error reporting) through the MachineFunctionInitialzier interface. Differential Revision: https://reviews.llvm.org/D33809 llvm-svn: 304758
92 lines
3.3 KiB
C++
92 lines
3.3 KiB
C++
//===-- MachineFunctionPass.cpp -------------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the definitions of the MachineFunctionPass members.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
|
#include "llvm/Analysis/AliasAnalysis.h"
|
|
#include "llvm/Analysis/BasicAliasAnalysis.h"
|
|
#include "llvm/Analysis/DominanceFrontier.h"
|
|
#include "llvm/Analysis/GlobalsModRef.h"
|
|
#include "llvm/Analysis/IVUsers.h"
|
|
#include "llvm/Analysis/LoopInfo.h"
|
|
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
|
#include "llvm/Analysis/ScalarEvolution.h"
|
|
#include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"
|
|
#include "llvm/CodeGen/MachineFunction.h"
|
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
|
#include "llvm/CodeGen/Passes.h"
|
|
#include "llvm/CodeGen/StackProtector.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/IR/Function.h"
|
|
|
|
using namespace llvm;
|
|
|
|
Pass *MachineFunctionPass::createPrinterPass(raw_ostream &O,
|
|
const std::string &Banner) const {
|
|
return createMachineFunctionPrinterPass(O, Banner);
|
|
}
|
|
|
|
bool MachineFunctionPass::runOnFunction(Function &F) {
|
|
// Do not codegen any 'available_externally' functions at all, they have
|
|
// definitions outside the translation unit.
|
|
if (F.hasAvailableExternallyLinkage())
|
|
return false;
|
|
|
|
MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>();
|
|
MachineFunction &MF = MMI.getOrCreateMachineFunction(F);
|
|
|
|
MachineFunctionProperties &MFProps = MF.getProperties();
|
|
|
|
#ifndef NDEBUG
|
|
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
|
|
errs() << "MachineFunctionProperties required by " << getPassName()
|
|
<< " pass are not met by function " << F.getName() << ".\n"
|
|
<< "Required properties: ";
|
|
RequiredProperties.print(errs());
|
|
errs() << "\nCurrent properties: ";
|
|
MFProps.print(errs());
|
|
errs() << "\n";
|
|
llvm_unreachable("MachineFunctionProperties check failed");
|
|
}
|
|
#endif
|
|
|
|
bool RV = runOnMachineFunction(MF);
|
|
|
|
MFProps.set(SetProperties);
|
|
MFProps.reset(ClearedProperties);
|
|
return RV;
|
|
}
|
|
|
|
void MachineFunctionPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
AU.addRequired<MachineModuleInfo>();
|
|
AU.addPreserved<MachineModuleInfo>();
|
|
|
|
// MachineFunctionPass preserves all LLVM IR passes, but there's no
|
|
// high-level way to express this. Instead, just list a bunch of
|
|
// passes explicitly. This does not include setPreservesCFG,
|
|
// because CodeGen overloads that to mean preserving the MachineBasicBlock
|
|
// CFG in addition to the LLVM IR CFG.
|
|
AU.addPreserved<BasicAAWrapperPass>();
|
|
AU.addPreserved<DominanceFrontierWrapperPass>();
|
|
AU.addPreserved<DominatorTreeWrapperPass>();
|
|
AU.addPreserved<AAResultsWrapperPass>();
|
|
AU.addPreserved<GlobalsAAWrapperPass>();
|
|
AU.addPreserved<IVUsersWrapperPass>();
|
|
AU.addPreserved<LoopInfoWrapperPass>();
|
|
AU.addPreserved<MemoryDependenceWrapperPass>();
|
|
AU.addPreserved<ScalarEvolutionWrapperPass>();
|
|
AU.addPreserved<SCEVAAWrapperPass>();
|
|
AU.addPreserved<StackProtector>();
|
|
|
|
FunctionPass::getAnalysisUsage(AU);
|
|
}
|