1b7bdfd65SChandler Carruth //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
27ef41710SChris Lattner //
37ef41710SChris Lattner //                     The LLVM Compiler Infrastructure
47ef41710SChris Lattner //
5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source
6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details.
77ef41710SChris Lattner //
87ef41710SChris Lattner //===----------------------------------------------------------------------===//
97ef41710SChris Lattner //
107ef41710SChris Lattner // BitcodeWriterPass implementation.
117ef41710SChris Lattner //
127ef41710SChris Lattner //===----------------------------------------------------------------------===//
137ef41710SChris Lattner 
14b7bdfd65SChandler Carruth #include "llvm/Bitcode/BitcodeWriterPass.h"
15*2d5487cfSTeresa Johnson #include "llvm/Analysis/ModuleSummaryAnalysis.h"
167ef41710SChris Lattner #include "llvm/Bitcode/ReaderWriter.h"
17b7bdfd65SChandler Carruth #include "llvm/IR/Module.h"
18b7bdfd65SChandler Carruth #include "llvm/IR/PassManager.h"
197ef41710SChris Lattner #include "llvm/Pass.h"
207ef41710SChris Lattner using namespace llvm;
217ef41710SChris Lattner 
22d174ce4aSChandler Carruth PreservedAnalyses BitcodeWriterPass::run(Module &M) {
23*2d5487cfSTeresa Johnson   std::unique_ptr<ModuleSummaryIndex> Index;
24*2d5487cfSTeresa Johnson   if (EmitSummaryIndex)
25*2d5487cfSTeresa Johnson     Index = ModuleSummaryIndexBuilder(&M).takeIndex();
26*2d5487cfSTeresa Johnson   WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index.get(),
27*2d5487cfSTeresa Johnson                      EmitModuleHash);
28b7bdfd65SChandler Carruth   return PreservedAnalyses::all();
29b7bdfd65SChandler Carruth }
30b7bdfd65SChandler Carruth 
317ef41710SChris Lattner namespace {
327ef41710SChris Lattner   class WriteBitcodePass : public ModulePass {
336973395cSChris Lattner     raw_ostream &OS; // raw_ostream to print on
34679db334SDuncan P. N. Exon Smith     bool ShouldPreserveUseListOrder;
3526ab5772STeresa Johnson     bool EmitSummaryIndex;
36f9e4576eSMehdi Amini     bool EmitModuleHash;
37679db334SDuncan P. N. Exon Smith 
387ef41710SChris Lattner   public:
39890d0debSDaniel Dunbar     static char ID; // Pass identification, replacement for typeid
40*2d5487cfSTeresa Johnson     WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
41*2d5487cfSTeresa Johnson       initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
42*2d5487cfSTeresa Johnson     }
43*2d5487cfSTeresa Johnson 
44403a787eSTeresa Johnson     explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
45f9e4576eSMehdi Amini                               bool EmitSummaryIndex, bool EmitModuleHash)
46679db334SDuncan P. N. Exon Smith         : ModulePass(ID), OS(o),
47403a787eSTeresa Johnson           ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
48*2d5487cfSTeresa Johnson           EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
49*2d5487cfSTeresa Johnson       initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
50*2d5487cfSTeresa Johnson     }
5135f398a9SGordon Henriksen 
528548299aSCraig Topper     const char *getPassName() const override { return "Bitcode Writer"; }
537ef41710SChris Lattner 
548548299aSCraig Topper     bool runOnModule(Module &M) override {
55*2d5487cfSTeresa Johnson       const ModuleSummaryIndex *Index =
56*2d5487cfSTeresa Johnson           EmitSummaryIndex
57*2d5487cfSTeresa Johnson               ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
58*2d5487cfSTeresa Johnson               : nullptr;
59*2d5487cfSTeresa Johnson       WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index,
60*2d5487cfSTeresa Johnson                          EmitModuleHash);
617ef41710SChris Lattner       return false;
627ef41710SChris Lattner     }
63*2d5487cfSTeresa Johnson     void getAnalysisUsage(AnalysisUsage &AU) const override {
64*2d5487cfSTeresa Johnson       AU.setPreservesAll();
65*2d5487cfSTeresa Johnson       if (EmitSummaryIndex)
66*2d5487cfSTeresa Johnson         AU.addRequired<ModuleSummaryIndexWrapperPass>();
67*2d5487cfSTeresa Johnson     }
687ef41710SChris Lattner   };
69f00654e3SAlexander Kornienko }
707ef41710SChris Lattner 
717ef41710SChris Lattner char WriteBitcodePass::ID = 0;
72*2d5487cfSTeresa Johnson INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
73*2d5487cfSTeresa Johnson                       true)
74*2d5487cfSTeresa Johnson INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
75*2d5487cfSTeresa Johnson INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
76*2d5487cfSTeresa Johnson                     true)
777ef41710SChris Lattner 
78679db334SDuncan P. N. Exon Smith ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
79403a787eSTeresa Johnson                                           bool ShouldPreserveUseListOrder,
80f9e4576eSMehdi Amini                                           bool EmitSummaryIndex, bool EmitModuleHash) {
81403a787eSTeresa Johnson   return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
82f9e4576eSMehdi Amini                               EmitSummaryIndex, EmitModuleHash);
83890d0debSDaniel Dunbar }
84