xref: /netbsd-src/external/apache2/llvm/dist/llvm/lib/Bitcode/Writer/BitcodeWriterPass.cpp (revision 82d56013d7b633d116a93943de88e08335357a7c)
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