blob: 80cab762a68c4023f1855ac97c96ee00341c05fb [file] [log] [blame]
Chandler Carruthb7bdfd62014-01-13 07:38:24 +00001//===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
Chris Lattner7ef41712007-05-06 02:30:12 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner7ef41712007-05-06 02:30:12 +00007//
8//===----------------------------------------------------------------------===//
9//
10// BitcodeWriterPass implementation.
11//
12//===----------------------------------------------------------------------===//
13
Chandler Carruthb7bdfd62014-01-13 07:38:24 +000014#include "llvm/Bitcode/BitcodeWriterPass.h"
Teresa Johnson2d5487c2016-04-11 13:58:45 +000015#include "llvm/Analysis/ModuleSummaryAnalysis.h"
Teresa Johnsonad176792016-11-11 05:34:58 +000016#include "llvm/Bitcode/BitcodeWriter.h"
Chandler Carruthb7bdfd62014-01-13 07:38:24 +000017#include "llvm/IR/Module.h"
18#include "llvm/IR/PassManager.h"
Chris Lattner7ef41712007-05-06 02:30:12 +000019#include "llvm/Pass.h"
20using namespace llvm;
21
Teresa Johnsonf93b2462016-08-12 13:53:02 +000022PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) {
23 const ModuleSummaryIndex *Index =
24 EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M))
25 : nullptr;
26 WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash);
Chandler Carruthb7bdfd62014-01-13 07:38:24 +000027 return PreservedAnalyses::all();
28}
29
Chris Lattner7ef41712007-05-06 02:30:12 +000030namespace {
31 class WriteBitcodePass : public ModulePass {
Chris Lattner69733952009-08-23 07:49:08 +000032 raw_ostream &OS; // raw_ostream to print on
Duncan P. N. Exon Smith679db332015-04-15 00:34:24 +000033 bool ShouldPreserveUseListOrder;
Teresa Johnson26ab5772016-03-15 00:04:37 +000034 bool EmitSummaryIndex;
Mehdi Aminif9e45762016-04-10 21:07:19 +000035 bool EmitModuleHash;
Duncan P. N. Exon Smith679db332015-04-15 00:34:24 +000036
Chris Lattner7ef41712007-05-06 02:30:12 +000037 public:
Daniel Dunbar890d0de2008-10-22 17:39:14 +000038 static char ID; // Pass identification, replacement for typeid
Teresa Johnson2d5487c2016-04-11 13:58:45 +000039 WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
40 initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
41 }
42
Teresa Johnson403a7872015-10-04 14:33:43 +000043 explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
Mehdi Aminif9e45762016-04-10 21:07:19 +000044 bool EmitSummaryIndex, bool EmitModuleHash)
Duncan P. N. Exon Smith679db332015-04-15 00:34:24 +000045 : ModulePass(ID), OS(o),
Teresa Johnson403a7872015-10-04 14:33:43 +000046 ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
Teresa Johnson2d5487c2016-04-11 13:58:45 +000047 EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
48 initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
49 }
Joe Abbey2ad8df22012-11-25 15:23:39 +000050
Mehdi Amini117296c2016-10-01 02:56:57 +000051 StringRef getPassName() const override { return "Bitcode Writer"; }
Joe Abbey2ad8df22012-11-25 15:23:39 +000052
Craig Topper85482992014-03-05 07:52:44 +000053 bool runOnModule(Module &M) override {
Teresa Johnson2d5487c2016-04-11 13:58:45 +000054 const ModuleSummaryIndex *Index =
55 EmitSummaryIndex
56 ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
57 : nullptr;
58 WriteBitcodeToFile(&M, OS, ShouldPreserveUseListOrder, Index,
59 EmitModuleHash);
Chris Lattner7ef41712007-05-06 02:30:12 +000060 return false;
61 }
Teresa Johnson2d5487c2016-04-11 13:58:45 +000062 void getAnalysisUsage(AnalysisUsage &AU) const override {
63 AU.setPreservesAll();
64 if (EmitSummaryIndex)
65 AU.addRequired<ModuleSummaryIndexWrapperPass>();
66 }
Chris Lattner7ef41712007-05-06 02:30:12 +000067 };
Alexander Kornienkof00654e2015-06-23 09:49:53 +000068}
Chris Lattner7ef41712007-05-06 02:30:12 +000069
70char WriteBitcodePass::ID = 0;
Teresa Johnson2d5487c2016-04-11 13:58:45 +000071INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
72 true)
73INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
74INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
75 true)
Chris Lattner7ef41712007-05-06 02:30:12 +000076
Duncan P. N. Exon Smith679db332015-04-15 00:34:24 +000077ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
Teresa Johnson403a7872015-10-04 14:33:43 +000078 bool ShouldPreserveUseListOrder,
Mehdi Aminif9e45762016-04-10 21:07:19 +000079 bool EmitSummaryIndex, bool EmitModuleHash) {
Teresa Johnson403a7872015-10-04 14:33:43 +000080 return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
Mehdi Aminif9e45762016-04-10 21:07:19 +000081 EmitSummaryIndex, EmitModuleHash);
Daniel Dunbar890d0de2008-10-22 17:39:14 +000082}