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