mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-11 18:42:01 +00:00

pass manager passes' `run` methods. This removes a bunch of SFINAE goop from the pass manager and just requires pass authors to accept `AnalysisManager<IRUnitT> &` as a dead argument. This is a small price to pay for the simplicity of the system as a whole, despite the noise that changing it causes at this stage. This will also helpfull allow us to make the signature of the run methods much more flexible for different kinds af passes to support things like intelligently updating the pass's progression over IR units. While this touches many, many, files, the changes are really boring. Mostly made with the help of my trusty perl one liners. Thanks to Sean and Hal for bouncing ideas for this with me in IRC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272978 91177308-0d34-0410-b5e6-96231b3b80d8
84 lines
3.1 KiB
C++
84 lines
3.1 KiB
C++
//===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// BitcodeWriterPass implementation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
|
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
|
|
#include "llvm/Bitcode/ReaderWriter.h"
|
|
#include "llvm/IR/Module.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/Pass.h"
|
|
using namespace llvm;
|
|
|
|
PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &) {
|
|
std::unique_ptr<ModuleSummaryIndex> Index;
|
|
if (EmitSummaryIndex)
|
|
Index = ModuleSummaryIndexBuilder(&M).takeIndex();
|
|
WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index.get(),
|
|
EmitModuleHash);
|
|
return PreservedAnalyses::all();
|
|
}
|
|
|
|
namespace {
|
|
class WriteBitcodePass : public ModulePass {
|
|
raw_ostream &OS; // raw_ostream to print on
|
|
bool ShouldPreserveUseListOrder;
|
|
bool EmitSummaryIndex;
|
|
bool EmitModuleHash;
|
|
|
|
public:
|
|
static char ID; // Pass identification, replacement for typeid
|
|
WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
|
|
initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
|
|
bool EmitSummaryIndex, bool EmitModuleHash)
|
|
: ModulePass(ID), OS(o),
|
|
ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
|
|
EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
|
|
initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
const char *getPassName() const override { return "Bitcode Writer"; }
|
|
|
|
bool runOnModule(Module &M) override {
|
|
const ModuleSummaryIndex *Index =
|
|
EmitSummaryIndex
|
|
? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
|
|
: nullptr;
|
|
WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index,
|
|
EmitModuleHash);
|
|
return false;
|
|
}
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesAll();
|
|
if (EmitSummaryIndex)
|
|
AU.addRequired<ModuleSummaryIndexWrapperPass>();
|
|
}
|
|
};
|
|
}
|
|
|
|
char WriteBitcodePass::ID = 0;
|
|
INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
|
|
true)
|
|
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
|
|
INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
|
|
true)
|
|
|
|
ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
|
|
bool ShouldPreserveUseListOrder,
|
|
bool EmitSummaryIndex, bool EmitModuleHash) {
|
|
return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
|
|
EmitSummaryIndex, EmitModuleHash);
|
|
}
|