191bc56edSDimitry Andric //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // BitcodeWriterPass implementation.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
1491bc56edSDimitry Andric #include "llvm/Bitcode/BitcodeWriterPass.h"
15f22ef01cSRoman Divacky #include "llvm/Bitcode/ReaderWriter.h"
1691bc56edSDimitry Andric #include "llvm/IR/Module.h"
1791bc56edSDimitry Andric #include "llvm/IR/PassManager.h"
18f22ef01cSRoman Divacky #include "llvm/Pass.h"
19f22ef01cSRoman Divacky using namespace llvm;
20f22ef01cSRoman Divacky 
2139d628a0SDimitry Andric PreservedAnalyses BitcodeWriterPass::run(Module &M) {
227d523365SDimitry Andric   WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, EmitFunctionSummary);
2391bc56edSDimitry Andric   return PreservedAnalyses::all();
2491bc56edSDimitry Andric }
2591bc56edSDimitry Andric 
26f22ef01cSRoman Divacky namespace {
27f22ef01cSRoman Divacky   class WriteBitcodePass : public ModulePass {
28f22ef01cSRoman Divacky     raw_ostream &OS; // raw_ostream to print on
29ff0cc061SDimitry Andric     bool ShouldPreserveUseListOrder;
307d523365SDimitry Andric     bool EmitFunctionSummary;
31ff0cc061SDimitry Andric 
32f22ef01cSRoman Divacky   public:
33f22ef01cSRoman Divacky     static char ID; // Pass identification, replacement for typeid
347d523365SDimitry Andric     explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
357d523365SDimitry Andric                               bool EmitFunctionSummary)
36ff0cc061SDimitry Andric         : ModulePass(ID), OS(o),
377d523365SDimitry Andric           ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
387d523365SDimitry Andric           EmitFunctionSummary(EmitFunctionSummary) {}
39f22ef01cSRoman Divacky 
4091bc56edSDimitry Andric     const char *getPassName() const override { return "Bitcode Writer"; }
41f22ef01cSRoman Divacky 
4291bc56edSDimitry Andric     bool runOnModule(Module &M) override {
437d523365SDimitry Andric       WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder,
447d523365SDimitry Andric                          EmitFunctionSummary);
45f22ef01cSRoman Divacky       return false;
46f22ef01cSRoman Divacky     }
47f22ef01cSRoman Divacky   };
483dac3a9bSDimitry Andric }
49f22ef01cSRoman Divacky 
50f22ef01cSRoman Divacky char WriteBitcodePass::ID = 0;
51f22ef01cSRoman Divacky 
52ff0cc061SDimitry Andric ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
537d523365SDimitry Andric                                           bool ShouldPreserveUseListOrder,
547d523365SDimitry Andric                                           bool EmitFunctionSummary) {
557d523365SDimitry Andric   return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
567d523365SDimitry Andric                               EmitFunctionSummary);
57f22ef01cSRoman Divacky }
58