1b7bdfd65SChandler Carruth //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===// 27ef41710SChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67ef41710SChris Lattner // 77ef41710SChris Lattner //===----------------------------------------------------------------------===// 87ef41710SChris Lattner // 97ef41710SChris Lattner // BitcodeWriterPass implementation. 107ef41710SChris Lattner // 117ef41710SChris Lattner //===----------------------------------------------------------------------===// 127ef41710SChris Lattner 13b7bdfd65SChandler Carruth #include "llvm/Bitcode/BitcodeWriterPass.h" 142d5487cfSTeresa Johnson #include "llvm/Analysis/ModuleSummaryAnalysis.h" 15ad17679aSTeresa Johnson #include "llvm/Bitcode/BitcodeWriter.h" 16b7bdfd65SChandler Carruth #include "llvm/IR/Module.h" 17b7bdfd65SChandler Carruth #include "llvm/IR/PassManager.h" 187ef41710SChris Lattner #include "llvm/Pass.h" 197ef41710SChris Lattner using namespace llvm; 207ef41710SChris Lattner 21f93b246fSTeresa Johnson PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { 22f93b246fSTeresa Johnson const ModuleSummaryIndex *Index = 23f93b246fSTeresa Johnson EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M)) 24f93b246fSTeresa Johnson : nullptr; 256a86e25dSRafael Espindola WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash); 26b7bdfd65SChandler Carruth return PreservedAnalyses::all(); 27b7bdfd65SChandler Carruth } 28b7bdfd65SChandler Carruth 297ef41710SChris Lattner namespace { 307ef41710SChris Lattner class WriteBitcodePass : public ModulePass { 316973395cSChris Lattner raw_ostream &OS; // raw_ostream to print on 32679db334SDuncan P. N. Exon Smith bool ShouldPreserveUseListOrder; 3326ab5772STeresa Johnson bool EmitSummaryIndex; 34f9e4576eSMehdi Amini bool EmitModuleHash; 35679db334SDuncan P. N. Exon Smith 367ef41710SChris Lattner public: 37890d0debSDaniel Dunbar static char ID; // Pass identification, replacement for typeid 382d5487cfSTeresa Johnson WriteBitcodePass() : ModulePass(ID), OS(dbgs()) { 392d5487cfSTeresa Johnson initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry()); 402d5487cfSTeresa Johnson } 412d5487cfSTeresa Johnson 42403a787eSTeresa Johnson explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder, 43f9e4576eSMehdi Amini bool EmitSummaryIndex, bool EmitModuleHash) 44679db334SDuncan P. N. Exon Smith : ModulePass(ID), OS(o), 45403a787eSTeresa Johnson ShouldPreserveUseListOrder(ShouldPreserveUseListOrder), 462d5487cfSTeresa Johnson EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) { 472d5487cfSTeresa Johnson initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry()); 482d5487cfSTeresa Johnson } 4935f398a9SGordon Henriksen 50117296c0SMehdi Amini StringRef getPassName() const override { return "Bitcode Writer"; } 517ef41710SChris Lattner 528548299aSCraig Topper bool runOnModule(Module &M) override { 532d5487cfSTeresa Johnson const ModuleSummaryIndex *Index = 542d5487cfSTeresa Johnson EmitSummaryIndex 552d5487cfSTeresa Johnson ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex()) 562d5487cfSTeresa Johnson : nullptr; 576a86e25dSRafael Espindola WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, 582d5487cfSTeresa Johnson EmitModuleHash); 597ef41710SChris Lattner return false; 607ef41710SChris Lattner } 612d5487cfSTeresa Johnson void getAnalysisUsage(AnalysisUsage &AU) const override { 622d5487cfSTeresa Johnson AU.setPreservesAll(); 632d5487cfSTeresa Johnson if (EmitSummaryIndex) 642d5487cfSTeresa Johnson AU.addRequired<ModuleSummaryIndexWrapperPass>(); 652d5487cfSTeresa Johnson } 667ef41710SChris Lattner }; 67f00654e3SAlexander Kornienko } 687ef41710SChris Lattner 697ef41710SChris Lattner char WriteBitcodePass::ID = 0; 702d5487cfSTeresa Johnson INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false, 712d5487cfSTeresa Johnson true) 722d5487cfSTeresa Johnson INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass) 732d5487cfSTeresa Johnson INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false, 742d5487cfSTeresa Johnson true) 757ef41710SChris Lattner 76679db334SDuncan P. N. Exon Smith ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str, 77403a787eSTeresa Johnson bool ShouldPreserveUseListOrder, 78f9e4576eSMehdi Amini bool EmitSummaryIndex, bool EmitModuleHash) { 79403a787eSTeresa Johnson return new WriteBitcodePass(Str, ShouldPreserveUseListOrder, 80f9e4576eSMehdi Amini EmitSummaryIndex, EmitModuleHash); 81890d0debSDaniel Dunbar } 82adbd27a5SVedant Kumar 83adbd27a5SVedant Kumar bool llvm::isBitcodeWriterPass(Pass *P) { 84adbd27a5SVedant Kumar return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID; 85adbd27a5SVedant Kumar } 86