1 //===-- llvm/Bitcode/BitcodeWriter.h - Bitcode writers ----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This header defines interfaces to write LLVM bitcode files/streams. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_BITCODE_BITCODEWRITER_H 15 #define LLVM_BITCODE_BITCODEWRITER_H 16 17 #include "llvm/IR/ModuleSummaryIndex.h" 18 #include <string> 19 20 namespace llvm { 21 class BitstreamWriter; 22 class Module; 23 class raw_ostream; 24 25 class BitcodeWriter { 26 SmallVectorImpl<char> &Buffer; 27 std::unique_ptr<BitstreamWriter> Stream; 28 29 public: 30 /// Create a BitcodeWriter that writes to Buffer. 31 BitcodeWriter(SmallVectorImpl<char> &Buffer); 32 33 ~BitcodeWriter(); 34 35 /// Write the specified module to the buffer specified at construction time. 36 /// 37 /// If \c ShouldPreserveUseListOrder, encode the use-list order for each \a 38 /// Value in \c M. These will be reconstructed exactly when \a M is 39 /// deserialized. 40 /// 41 /// If \c Index is supplied, the bitcode will contain the summary index 42 /// (currently for use in ThinLTO optimization). 43 /// 44 /// \p GenerateHash enables hashing the Module and including the hash in the 45 /// bitcode (currently for use in ThinLTO incremental build). 46 /// 47 /// If \p ModHash is non-null, when GenerateHash is true, the resulting 48 /// hash is written into ModHash. When GenerateHash is false, that value 49 /// is used as the hash instead of computing from the generated bitcode. 50 /// Can be used to produce the same module hash for a minimized bitcode 51 /// used just for the thin link as in the regular full bitcode that will 52 /// be used in the backend. 53 void writeModule(const Module *M, bool ShouldPreserveUseListOrder = false, 54 const ModuleSummaryIndex *Index = nullptr, 55 bool GenerateHash = false, ModuleHash *ModHash = nullptr); 56 }; 57 58 /// \brief Write the specified module to the specified raw output stream. 59 /// 60 /// For streams where it matters, the given stream should be in "binary" 61 /// mode. 62 /// 63 /// If \c ShouldPreserveUseListOrder, encode the use-list order for each \a 64 /// Value in \c M. These will be reconstructed exactly when \a M is 65 /// deserialized. 66 /// 67 /// If \c Index is supplied, the bitcode will contain the summary index 68 /// (currently for use in ThinLTO optimization). 69 /// 70 /// \p GenerateHash enables hashing the Module and including the hash in the 71 /// bitcode (currently for use in ThinLTO incremental build). 72 /// 73 /// If \p ModHash is non-null, when GenerateHash is true, the resulting 74 /// hash is written into ModHash. When GenerateHash is false, that value 75 /// is used as the hash instead of computing from the generated bitcode. 76 /// Can be used to produce the same module hash for a minimized bitcode 77 /// used just for the thin link as in the regular full bitcode that will 78 /// be used in the backend. 79 void WriteBitcodeToFile(const Module *M, raw_ostream &Out, 80 bool ShouldPreserveUseListOrder = false, 81 const ModuleSummaryIndex *Index = nullptr, 82 bool GenerateHash = false, 83 ModuleHash *ModHash = nullptr); 84 85 /// Write the specified module summary index to the given raw output stream, 86 /// where it will be written in a new bitcode block. This is used when 87 /// writing the combined index file for ThinLTO. When writing a subset of the 88 /// index for a distributed backend, provide the \p ModuleToSummariesForIndex 89 /// map. 90 void WriteIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, 91 const std::map<std::string, GVSummaryMapTy> 92 *ModuleToSummariesForIndex = nullptr); 93 } // End llvm namespace 94 95 #endif 96