1 //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // BitcodeWriterPass implementation. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/Bitcode/BitcodeWriterPass.h" 14 #include "llvm/Analysis/ModuleSummaryAnalysis.h" 15 #include "llvm/Bitcode/BitcodeWriter.h" 16 #include "llvm/IR/PassManager.h" 17 #include "llvm/InitializePasses.h" 18 #include "llvm/Pass.h" 19 using namespace llvm; 20 21 extern bool WriteNewDbgInfoFormatToBitcode; 22 23 PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) { 24 ScopedDbgInfoFormatSetter FormatSetter(M, M.IsNewDbgInfoFormat && 25 WriteNewDbgInfoFormatToBitcode); 26 27 const ModuleSummaryIndex *Index = 28 EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M)) 29 : nullptr; 30 WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash); 31 32 return PreservedAnalyses::all(); 33 } 34 35 namespace { 36 class WriteBitcodePass : public ModulePass { 37 raw_ostream &OS; // raw_ostream to print on 38 bool ShouldPreserveUseListOrder; 39 40 public: 41 static char ID; // Pass identification, replacement for typeid 42 WriteBitcodePass() : ModulePass(ID), OS(dbgs()) { 43 initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry()); 44 } 45 46 explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder) 47 : ModulePass(ID), OS(o), 48 ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) { 49 initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry()); 50 } 51 52 StringRef getPassName() const override { return "Bitcode Writer"; } 53 54 bool runOnModule(Module &M) override { 55 ScopedDbgInfoFormatSetter FormatSetter( 56 M, M.IsNewDbgInfoFormat && WriteNewDbgInfoFormatToBitcode); 57 58 WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, /*Index=*/nullptr, 59 /*EmitModuleHash=*/false); 60 61 return false; 62 } 63 void getAnalysisUsage(AnalysisUsage &AU) const override { 64 AU.setPreservesAll(); 65 } 66 }; 67 } 68 69 char WriteBitcodePass::ID = 0; 70 INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false, 71 true) 72 INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass) 73 INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false, 74 true) 75 76 ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str, 77 bool ShouldPreserveUseListOrder) { 78 return new WriteBitcodePass(Str, ShouldPreserveUseListOrder); 79 } 80 81 bool llvm::isBitcodeWriterPass(Pass *P) { 82 return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID; 83 } 84