BitcodeWriterPass.cpp 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. //===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // BitcodeWriterPass implementation.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "llvm/Bitcode/BitcodeWriterPass.h"
  13. #include "llvm/Analysis/ModuleSummaryAnalysis.h"
  14. #include "llvm/Bitcode/BitcodeWriter.h"
  15. #include "llvm/IR/PassManager.h"
  16. #include "llvm/InitializePasses.h"
  17. #include "llvm/Pass.h"
  18. using namespace llvm;
  19. PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) {
  20. const ModuleSummaryIndex *Index =
  21. EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M))
  22. : nullptr;
  23. WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash);
  24. return PreservedAnalyses::all();
  25. }
  26. namespace {
  27. class WriteBitcodePass : public ModulePass {
  28. raw_ostream &OS; // raw_ostream to print on
  29. bool ShouldPreserveUseListOrder;
  30. bool EmitSummaryIndex;
  31. bool EmitModuleHash;
  32. public:
  33. static char ID; // Pass identification, replacement for typeid
  34. WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
  35. initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
  36. }
  37. explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder,
  38. bool EmitSummaryIndex, bool EmitModuleHash)
  39. : ModulePass(ID), OS(o),
  40. ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
  41. EmitSummaryIndex(EmitSummaryIndex), EmitModuleHash(EmitModuleHash) {
  42. initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
  43. }
  44. StringRef getPassName() const override { return "Bitcode Writer"; }
  45. bool runOnModule(Module &M) override {
  46. const ModuleSummaryIndex *Index =
  47. EmitSummaryIndex
  48. ? &(getAnalysis<ModuleSummaryIndexWrapperPass>().getIndex())
  49. : nullptr;
  50. WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index,
  51. EmitModuleHash);
  52. return false;
  53. }
  54. void getAnalysisUsage(AnalysisUsage &AU) const override {
  55. AU.setPreservesAll();
  56. if (EmitSummaryIndex)
  57. AU.addRequired<ModuleSummaryIndexWrapperPass>();
  58. }
  59. };
  60. }
  61. char WriteBitcodePass::ID = 0;
  62. INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
  63. true)
  64. INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
  65. INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
  66. true)
  67. ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
  68. bool ShouldPreserveUseListOrder,
  69. bool EmitSummaryIndex, bool EmitModuleHash) {
  70. return new WriteBitcodePass(Str, ShouldPreserveUseListOrder,
  71. EmitSummaryIndex, EmitModuleHash);
  72. }
  73. bool llvm::isBitcodeWriterPass(Pass *P) {
  74. return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID;
  75. }