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