1*9880d681SAndroid Build Coastguard Worker //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // BitcodeWriterPass implementation.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/BitcodeWriterPass.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ModuleSummaryAnalysis.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/ReaderWriter.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PassManager.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Pass.h"
20*9880d681SAndroid Build Coastguard Worker using namespace llvm;
21*9880d681SAndroid Build Coastguard Worker
run(Module & M,ModuleAnalysisManager &)22*9880d681SAndroid Build Coastguard Worker PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &) {
23*9880d681SAndroid Build Coastguard Worker std::unique_ptr<ModuleSummaryIndex> Index;
24*9880d681SAndroid Build Coastguard Worker if (EmitSummaryIndex)
25*9880d681SAndroid Build Coastguard Worker Index = ModuleSummaryIndexBuilder(&M).takeIndex();
26*9880d681SAndroid Build Coastguard Worker WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index.get(),
27*9880d681SAndroid Build Coastguard Worker EmitModuleHash);
28*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
29*9880d681SAndroid Build Coastguard Worker }
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker namespace {
32*9880d681SAndroid Build Coastguard Worker class WriteBitcodePass : public ModulePass {
33*9880d681SAndroid Build Coastguard Worker raw_ostream &OS; // raw_ostream to print on
34*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder;
35*9880d681SAndroid Build Coastguard Worker bool EmitSummaryIndex;
36*9880d681SAndroid Build Coastguard Worker bool EmitModuleHash;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker public:
39*9880d681SAndroid Build Coastguard Worker static char ID; // Pass identification, replacement for typeid
WriteBitcodePass()40*9880d681SAndroid Build Coastguard Worker WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
41*9880d681SAndroid Build Coastguard Worker initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
42*9880d681SAndroid Build Coastguard Worker }
43*9880d681SAndroid Build Coastguard Worker
WriteBitcodePass(raw_ostream & o,bool ShouldPreserveUseListOrder,bool EmitSummaryIndex,bool EmitModuleHash)44*9880d681SAndroid Build Coastguard Worker explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
45*9880d681SAndroid Build Coastguard Worker bool EmitSummaryIndex, bool EmitModuleHash)
46*9880d681SAndroid Build Coastguard Worker : ModulePass(ID), OS(o),
47*9880d681SAndroid Build Coastguard Worker ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
48*9880d681SAndroid Build Coastguard Worker EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
49*9880d681SAndroid Build Coastguard Worker initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker
getPassName() const52*9880d681SAndroid Build Coastguard Worker const char *getPassName() const override { return "Bitcode Writer"; }
53*9880d681SAndroid Build Coastguard Worker
runOnModule(Module & M)54*9880d681SAndroid Build Coastguard Worker bool runOnModule(Module &M) override {
55*9880d681SAndroid Build Coastguard Worker const ModuleSummaryIndex *Index =
56*9880d681SAndroid Build Coastguard Worker EmitSummaryIndex
57*9880d681SAndroid Build Coastguard Worker ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
58*9880d681SAndroid Build Coastguard Worker : nullptr;
59*9880d681SAndroid Build Coastguard Worker WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index,
60*9880d681SAndroid Build Coastguard Worker EmitModuleHash);
61*9880d681SAndroid Build Coastguard Worker return false;
62*9880d681SAndroid Build Coastguard Worker }
getAnalysisUsage(AnalysisUsage & AU) const63*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override {
64*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
65*9880d681SAndroid Build Coastguard Worker if (EmitSummaryIndex)
66*9880d681SAndroid Build Coastguard Worker AU.addRequired<ModuleSummaryIndexWrapperPass>();
67*9880d681SAndroid Build Coastguard Worker }
68*9880d681SAndroid Build Coastguard Worker };
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker char WriteBitcodePass::ID = 0;
72*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
73*9880d681SAndroid Build Coastguard Worker true)
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)74*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
75*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
76*9880d681SAndroid Build Coastguard Worker true)
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
79*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder,
80*9880d681SAndroid Build Coastguard Worker bool EmitSummaryIndex, bool EmitModuleHash) {
81*9880d681SAndroid Build Coastguard Worker return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
82*9880d681SAndroid Build Coastguard Worker EmitSummaryIndex, EmitModuleHash);
83*9880d681SAndroid Build Coastguard Worker }
84