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