xref: /aosp_15_r20/external/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // BitcodeWriterPass implementation.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/BitcodeWriterPass.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Analysis/ModuleSummaryAnalysis.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Bitcode/ReaderWriter.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PassManager.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Pass.h"
20*9880d681SAndroid Build Coastguard Worker using namespace llvm;
21*9880d681SAndroid Build Coastguard Worker 
run(Module & M,ModuleAnalysisManager &)22*9880d681SAndroid Build Coastguard Worker PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &) {
23*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<ModuleSummaryIndex> Index;
24*9880d681SAndroid Build Coastguard Worker   if (EmitSummaryIndex)
25*9880d681SAndroid Build Coastguard Worker     Index = ModuleSummaryIndexBuilder(&M).takeIndex();
26*9880d681SAndroid Build Coastguard Worker   WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index.get(),
27*9880d681SAndroid Build Coastguard Worker                      EmitModuleHash);
28*9880d681SAndroid Build Coastguard Worker   return PreservedAnalyses::all();
29*9880d681SAndroid Build Coastguard Worker }
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker namespace {
32*9880d681SAndroid Build Coastguard Worker   class WriteBitcodePass : public ModulePass {
33*9880d681SAndroid Build Coastguard Worker     raw_ostream &OS; // raw_ostream to print on
34*9880d681SAndroid Build Coastguard Worker     bool ShouldPreserveUseListOrder;
35*9880d681SAndroid Build Coastguard Worker     bool EmitSummaryIndex;
36*9880d681SAndroid Build Coastguard Worker     bool EmitModuleHash;
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker   public:
39*9880d681SAndroid Build Coastguard Worker     static char ID; // Pass identification, replacement for typeid
WriteBitcodePass()40*9880d681SAndroid Build Coastguard Worker     WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
41*9880d681SAndroid Build Coastguard Worker       initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
42*9880d681SAndroid Build Coastguard Worker     }
43*9880d681SAndroid Build Coastguard Worker 
WriteBitcodePass(raw_ostream & o,bool ShouldPreserveUseListOrder,bool EmitSummaryIndex,bool EmitModuleHash)44*9880d681SAndroid Build Coastguard Worker     explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
45*9880d681SAndroid Build Coastguard Worker                               bool EmitSummaryIndex, bool EmitModuleHash)
46*9880d681SAndroid Build Coastguard Worker         : ModulePass(ID), OS(o),
47*9880d681SAndroid Build Coastguard Worker           ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
48*9880d681SAndroid Build Coastguard Worker           EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
49*9880d681SAndroid Build Coastguard Worker       initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
50*9880d681SAndroid Build Coastguard Worker     }
51*9880d681SAndroid Build Coastguard Worker 
getPassName() const52*9880d681SAndroid Build Coastguard Worker     const char *getPassName() const override { return "Bitcode Writer"; }
53*9880d681SAndroid Build Coastguard Worker 
runOnModule(Module & M)54*9880d681SAndroid Build Coastguard Worker     bool runOnModule(Module &M) override {
55*9880d681SAndroid Build Coastguard Worker       const ModuleSummaryIndex *Index =
56*9880d681SAndroid Build Coastguard Worker           EmitSummaryIndex
57*9880d681SAndroid Build Coastguard Worker               ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
58*9880d681SAndroid Build Coastguard Worker               : nullptr;
59*9880d681SAndroid Build Coastguard Worker       WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index,
60*9880d681SAndroid Build Coastguard Worker                          EmitModuleHash);
61*9880d681SAndroid Build Coastguard Worker       return false;
62*9880d681SAndroid Build Coastguard Worker     }
getAnalysisUsage(AnalysisUsage & AU) const63*9880d681SAndroid Build Coastguard Worker     void getAnalysisUsage(AnalysisUsage &AU) const override {
64*9880d681SAndroid Build Coastguard Worker       AU.setPreservesAll();
65*9880d681SAndroid Build Coastguard Worker       if (EmitSummaryIndex)
66*9880d681SAndroid Build Coastguard Worker         AU.addRequired<ModuleSummaryIndexWrapperPass>();
67*9880d681SAndroid Build Coastguard Worker     }
68*9880d681SAndroid Build Coastguard Worker   };
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker char WriteBitcodePass::ID = 0;
72*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
73*9880d681SAndroid Build Coastguard Worker                       true)
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)74*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
75*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
76*9880d681SAndroid Build Coastguard Worker                     true)
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
79*9880d681SAndroid Build Coastguard Worker                                           bool ShouldPreserveUseListOrder,
80*9880d681SAndroid Build Coastguard Worker                                           bool EmitSummaryIndex, bool EmitModuleHash) {
81*9880d681SAndroid Build Coastguard Worker   return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
82*9880d681SAndroid Build Coastguard Worker                               EmitSummaryIndex, EmitModuleHash);
83*9880d681SAndroid Build Coastguard Worker }
84