191bc56edSDimitry Andric //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // BitcodeWriterPass implementation.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
1491bc56edSDimitry Andric #include "llvm/Bitcode/BitcodeWriterPass.h"
153ca95b02SDimitry Andric #include "llvm/Analysis/ModuleSummaryAnalysis.h"
16f22ef01cSRoman Divacky #include "llvm/Bitcode/ReaderWriter.h"
1791bc56edSDimitry Andric #include "llvm/IR/Module.h"
1891bc56edSDimitry Andric #include "llvm/IR/PassManager.h"
19f22ef01cSRoman Divacky #include "llvm/Pass.h"
20f22ef01cSRoman Divacky using namespace llvm;
21f22ef01cSRoman Divacky 
223ca95b02SDimitry Andric PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &) {
233ca95b02SDimitry Andric   std::unique_ptr<ModuleSummaryIndex> Index;
243ca95b02SDimitry Andric   if (EmitSummaryIndex)
253ca95b02SDimitry Andric     Index = ModuleSummaryIndexBuilder(&M).takeIndex();
263ca95b02SDimitry Andric   WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index.get(),
273ca95b02SDimitry Andric                      EmitModuleHash);
2891bc56edSDimitry Andric   return PreservedAnalyses::all();
2991bc56edSDimitry Andric }
3091bc56edSDimitry Andric 
31f22ef01cSRoman Divacky namespace {
32f22ef01cSRoman Divacky   class WriteBitcodePass : public ModulePass {
33f22ef01cSRoman Divacky     raw_ostream &OS; // raw_ostream to print on
34ff0cc061SDimitry Andric     bool ShouldPreserveUseListOrder;
353ca95b02SDimitry Andric     bool EmitSummaryIndex;
363ca95b02SDimitry Andric     bool EmitModuleHash;
37ff0cc061SDimitry Andric 
38f22ef01cSRoman Divacky   public:
39f22ef01cSRoman Divacky     static char ID; // Pass identification, replacement for typeid
403ca95b02SDimitry Andric     WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
413ca95b02SDimitry Andric       initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
423ca95b02SDimitry Andric     }
433ca95b02SDimitry Andric 
447d523365SDimitry Andric     explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
453ca95b02SDimitry Andric                               bool EmitSummaryIndex, bool EmitModuleHash)
46ff0cc061SDimitry Andric         : ModulePass(ID), OS(o),
477d523365SDimitry Andric           ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
483ca95b02SDimitry Andric           EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
493ca95b02SDimitry Andric       initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
503ca95b02SDimitry Andric     }
51f22ef01cSRoman Divacky 
5291bc56edSDimitry Andric     const char *getPassName() const override { return "Bitcode Writer"; }
53f22ef01cSRoman Divacky 
5491bc56edSDimitry Andric     bool runOnModule(Module &M) override {
553ca95b02SDimitry Andric       const ModuleSummaryIndex *Index =
563ca95b02SDimitry Andric           EmitSummaryIndex
573ca95b02SDimitry Andric               ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
583ca95b02SDimitry Andric               : nullptr;
593ca95b02SDimitry Andric       WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index,
603ca95b02SDimitry Andric                          EmitModuleHash);
61f22ef01cSRoman Divacky       return false;
62f22ef01cSRoman Divacky     }
633ca95b02SDimitry Andric     void getAnalysisUsage(AnalysisUsage &AU) const override {
643ca95b02SDimitry Andric       AU.setPreservesAll();
653ca95b02SDimitry Andric       if (EmitSummaryIndex)
663ca95b02SDimitry Andric         AU.addRequired<ModuleSummaryIndexWrapperPass>();
673ca95b02SDimitry Andric     }
68f22ef01cSRoman Divacky   };
693dac3a9bSDimitry Andric }
70f22ef01cSRoman Divacky 
71f22ef01cSRoman Divacky char WriteBitcodePass::ID = 0;
723ca95b02SDimitry Andric INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
733ca95b02SDimitry Andric                       true)
743ca95b02SDimitry Andric INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
753ca95b02SDimitry Andric INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
763ca95b02SDimitry Andric                     true)
77f22ef01cSRoman Divacky 
78ff0cc061SDimitry Andric ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
797d523365SDimitry Andric                                           bool ShouldPreserveUseListOrder,
803ca95b02SDimitry Andric                                           bool EmitSummaryIndex, bool EmitModuleHash) {
817d523365SDimitry Andric   return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
823ca95b02SDimitry Andric                               EmitSummaryIndex, EmitModuleHash);
83f22ef01cSRoman Divacky }
84