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" 152d5487cfSTeresa Johnson #include "llvm/Analysis/ModuleSummaryAnalysis.h" 16ad17679aSTeresa Johnson #include "llvm/Bitcode/BitcodeWriter.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 22f93b246fSTeresa Johnson PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { 23f93b246fSTeresa Johnson const ModuleSummaryIndex *Index = 24f93b246fSTeresa Johnson EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M)) 25f93b246fSTeresa Johnson : nullptr; 266a86e25dSRafael Espindola WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash); 27b7bdfd65SChandler Carruth return PreservedAnalyses::all(); 28b7bdfd65SChandler Carruth } 29b7bdfd65SChandler Carruth 307ef41710SChris Lattner namespace { 317ef41710SChris Lattner class WriteBitcodePass : public ModulePass { 326973395cSChris Lattner raw_ostream &OS; // raw_ostream to print on 33679db334SDuncan P. N. Exon Smith bool ShouldPreserveUseListOrder; 3426ab5772STeresa Johnson bool EmitSummaryIndex; 35f9e4576eSMehdi Amini bool EmitModuleHash; 36679db334SDuncan P. N. Exon Smith 377ef41710SChris Lattner public: 38890d0debSDaniel Dunbar static char ID; // Pass identification, replacement for typeid 392d5487cfSTeresa Johnson WriteBitcodePass() : ModulePass(ID), OS(dbgs()) { 402d5487cfSTeresa Johnson initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry()); 412d5487cfSTeresa Johnson } 422d5487cfSTeresa Johnson 43403a787eSTeresa Johnson explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder, 44f9e4576eSMehdi Amini bool EmitSummaryIndex, bool EmitModuleHash) 45679db334SDuncan P. N. Exon Smith : ModulePass(ID), OS(o), 46403a787eSTeresa Johnson ShouldPreserveUseListOrder(ShouldPreserveUseListOrder), 472d5487cfSTeresa Johnson EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) { 482d5487cfSTeresa Johnson initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry()); 492d5487cfSTeresa Johnson } 5035f398a9SGordon Henriksen 51117296c0SMehdi Amini StringRef getPassName() const override { return "Bitcode Writer"; } 527ef41710SChris Lattner 538548299aSCraig Topper bool runOnModule(Module &M) override { 542d5487cfSTeresa Johnson const ModuleSummaryIndex *Index = 552d5487cfSTeresa Johnson EmitSummaryIndex 562d5487cfSTeresa Johnson ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex()) 572d5487cfSTeresa Johnson : nullptr; 586a86e25dSRafael Espindola WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, 592d5487cfSTeresa Johnson EmitModuleHash); 607ef41710SChris Lattner return false; 617ef41710SChris Lattner } 622d5487cfSTeresa Johnson void getAnalysisUsage(AnalysisUsage &AU) const override { 632d5487cfSTeresa Johnson AU.setPreservesAll(); 642d5487cfSTeresa Johnson if (EmitSummaryIndex) 652d5487cfSTeresa Johnson AU.addRequired<ModuleSummaryIndexWrapperPass>(); 662d5487cfSTeresa Johnson } 677ef41710SChris Lattner }; 68f00654e3SAlexander Kornienko } 697ef41710SChris Lattner 707ef41710SChris Lattner char WriteBitcodePass::ID = 0; 712d5487cfSTeresa Johnson INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false, 722d5487cfSTeresa Johnson true) 732d5487cfSTeresa Johnson INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass) 742d5487cfSTeresa Johnson INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false, 752d5487cfSTeresa Johnson true) 767ef41710SChris Lattner 77679db334SDuncan P. N. Exon Smith ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str, 78403a787eSTeresa Johnson bool ShouldPreserveUseListOrder, 79f9e4576eSMehdi Amini bool EmitSummaryIndex, bool EmitModuleHash) { 80403a787eSTeresa Johnson return new WriteBitcodePass(Str, ShouldPreserveUseListOrder, 81f9e4576eSMehdi Amini EmitSummaryIndex, EmitModuleHash); 82890d0debSDaniel Dunbar } 83*adbd27a5SVedant Kumar 84*adbd27a5SVedant Kumar bool llvm::isBitcodeWriterPass(Pass *P) { 85*adbd27a5SVedant Kumar return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID; 86*adbd27a5SVedant Kumar } 87