1b7bdfd65SChandler Carruth //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
27ef41710SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler 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"
14*384ca190SMehdi Amini #include "llvm/Analysis/ModuleSummaryAnalysis.h"
15ad17679aSTeresa Johnson #include "llvm/Bitcode/BitcodeWriter.h"
16b7bdfd65SChandler Carruth #include "llvm/IR/PassManager.h"
1705da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
187ef41710SChris Lattner #include "llvm/Pass.h"
197ef41710SChris Lattner using namespace llvm;
207ef41710SChris Lattner
run(Module & M,ModuleAnalysisManager & AM)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
WriteBitcodePass()382d5487cfSTeresa Johnson WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
392d5487cfSTeresa Johnson initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
402d5487cfSTeresa Johnson }
412d5487cfSTeresa Johnson
WriteBitcodePass(raw_ostream & o,bool ShouldPreserveUseListOrder,bool EmitSummaryIndex,bool EmitModuleHash)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
getPassName() const50117296c0SMehdi Amini StringRef getPassName() const override { return "Bitcode Writer"; }
517ef41710SChris Lattner
runOnModule(Module & M)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 }
getAnalysisUsage(AnalysisUsage & AU) const612d5487cfSTeresa 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)
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)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
isBitcodeWriterPass(Pass * P)83adbd27a5SVedant Kumar bool llvm::isBitcodeWriterPass(Pass *P) {
84adbd27a5SVedant Kumar return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID;
85adbd27a5SVedant Kumar }
86