17330f729Sjoerg //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg //
97330f729Sjoerg // BitcodeWriterPass implementation.
107330f729Sjoerg //
117330f729Sjoerg //===----------------------------------------------------------------------===//
127330f729Sjoerg
137330f729Sjoerg #include "llvm/Bitcode/BitcodeWriterPass.h"
147330f729Sjoerg #include "llvm/Analysis/ModuleSummaryAnalysis.h"
157330f729Sjoerg #include "llvm/Bitcode/BitcodeWriter.h"
167330f729Sjoerg #include "llvm/IR/Module.h"
177330f729Sjoerg #include "llvm/IR/PassManager.h"
18*82d56013Sjoerg #include "llvm/InitializePasses.h"
197330f729Sjoerg #include "llvm/Pass.h"
207330f729Sjoerg using namespace llvm;
217330f729Sjoerg
run(Module & M,ModuleAnalysisManager & AM)227330f729Sjoerg PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) {
237330f729Sjoerg const ModuleSummaryIndex *Index =
247330f729Sjoerg EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M))
257330f729Sjoerg : nullptr;
267330f729Sjoerg WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash);
277330f729Sjoerg return PreservedAnalyses::all();
287330f729Sjoerg }
297330f729Sjoerg
307330f729Sjoerg namespace {
317330f729Sjoerg class WriteBitcodePass : public ModulePass {
327330f729Sjoerg raw_ostream &OS; // raw_ostream to print on
337330f729Sjoerg bool ShouldPreserveUseListOrder;
347330f729Sjoerg bool EmitSummaryIndex;
357330f729Sjoerg bool EmitModuleHash;
367330f729Sjoerg
377330f729Sjoerg public:
387330f729Sjoerg static char ID; // Pass identification, replacement for typeid
WriteBitcodePass()397330f729Sjoerg WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
407330f729Sjoerg initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
417330f729Sjoerg }
427330f729Sjoerg
WriteBitcodePass(raw_ostream & o,bool ShouldPreserveUseListOrder,bool EmitSummaryIndex,bool EmitModuleHash)437330f729Sjoerg explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
447330f729Sjoerg bool EmitSummaryIndex, bool EmitModuleHash)
457330f729Sjoerg : ModulePass(ID), OS(o),
467330f729Sjoerg ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
477330f729Sjoerg EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
487330f729Sjoerg initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
497330f729Sjoerg }
507330f729Sjoerg
getPassName() const517330f729Sjoerg StringRef getPassName() const override { return "Bitcode Writer"; }
527330f729Sjoerg
runOnModule(Module & M)537330f729Sjoerg bool runOnModule(Module &M) override {
547330f729Sjoerg const ModuleSummaryIndex *Index =
557330f729Sjoerg EmitSummaryIndex
567330f729Sjoerg ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
577330f729Sjoerg : nullptr;
587330f729Sjoerg WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index,
597330f729Sjoerg EmitModuleHash);
607330f729Sjoerg return false;
617330f729Sjoerg }
getAnalysisUsage(AnalysisUsage & AU) const627330f729Sjoerg void getAnalysisUsage(AnalysisUsage &AU) const override {
637330f729Sjoerg AU.setPreservesAll();
647330f729Sjoerg if (EmitSummaryIndex)
657330f729Sjoerg AU.addRequired<ModuleSummaryIndexWrapperPass>();
667330f729Sjoerg }
677330f729Sjoerg };
687330f729Sjoerg }
697330f729Sjoerg
707330f729Sjoerg char WriteBitcodePass::ID = 0;
717330f729Sjoerg INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
727330f729Sjoerg true)
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)737330f729Sjoerg INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
747330f729Sjoerg INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
757330f729Sjoerg true)
767330f729Sjoerg
777330f729Sjoerg ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
787330f729Sjoerg bool ShouldPreserveUseListOrder,
797330f729Sjoerg bool EmitSummaryIndex, bool EmitModuleHash) {
807330f729Sjoerg return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
817330f729Sjoerg EmitSummaryIndex, EmitModuleHash);
827330f729Sjoerg }
837330f729Sjoerg
isBitcodeWriterPass(Pass * P)847330f729Sjoerg bool llvm::isBitcodeWriterPass(Pass *P) {
857330f729Sjoerg return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID;
867330f729Sjoerg }
87