diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-06-16 21:03:24 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-06-16 21:03:24 +0000 | 
| commit | 7c7aba6e5fef47a01a136be655b0a92cfd7090f6 (patch) | |
| tree | 99ec531924f6078534b100ab9d7696abce848099 /lib/Bitcode/Writer | |
| parent | 7ab83427af0f77b59941ceba41d509d7d097b065 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode/Writer')
| -rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 52 | 
1 files changed, 39 insertions, 13 deletions
| diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index d5879fec95cb..feeba31908ae 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -77,10 +77,13 @@ protected:    /// The stream created and owned by the client.    BitstreamWriter &Stream; +  StringTableBuilder &StrtabBuilder; +  public:    /// Constructs a BitcodeWriterBase object that writes to the provided    /// \p Stream. -  BitcodeWriterBase(BitstreamWriter &Stream) : Stream(Stream) {} +  BitcodeWriterBase(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder) +      : Stream(Stream), StrtabBuilder(StrtabBuilder) {}  protected:    void writeBitcodeHeader(); @@ -97,8 +100,6 @@ class ModuleBitcodeWriter : public BitcodeWriterBase {    /// Pointer to the buffer allocated by caller for bitcode writing.    const SmallVectorImpl<char> &Buffer; -  StringTableBuilder &StrtabBuilder; -    /// The Module to write to bitcode.    const Module &M; @@ -142,8 +143,8 @@ public:                        BitstreamWriter &Stream, bool ShouldPreserveUseListOrder,                        const ModuleSummaryIndex *Index, bool GenerateHash,                        ModuleHash *ModHash = nullptr) -      : BitcodeWriterBase(Stream), Buffer(Buffer), StrtabBuilder(StrtabBuilder), -        M(*M), VE(*M, ShouldPreserveUseListOrder), Index(Index), +      : BitcodeWriterBase(Stream, StrtabBuilder), Buffer(Buffer), M(*M), +        VE(*M, ShouldPreserveUseListOrder), Index(Index),          GenerateHash(GenerateHash), ModHash(ModHash),          BitcodeStartBit(Stream.GetCurrentBitNo()) {      // Assign ValueIds to any callee values in the index that came from @@ -331,10 +332,11 @@ public:    /// Constructs a IndexBitcodeWriter object for the given combined index,    /// writing to the provided \p Buffer. When writing a subset of the index    /// for a distributed backend, provide a \p ModuleToSummariesForIndex map. -  IndexBitcodeWriter(BitstreamWriter &Stream, const ModuleSummaryIndex &Index, +  IndexBitcodeWriter(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder, +                     const ModuleSummaryIndex &Index,                       const std::map<std::string, GVSummaryMapTy>                           *ModuleToSummariesForIndex = nullptr) -      : BitcodeWriterBase(Stream), Index(Index), +      : BitcodeWriterBase(Stream, StrtabBuilder), Index(Index),          ModuleToSummariesForIndex(ModuleToSummariesForIndex) {      // Assign unique value ids to all summaries to be written, for use      // in writing out the call graph edges. Save the mapping from GUID @@ -1663,7 +1665,7 @@ void ModuleBitcodeWriter::writeDIExpression(const DIExpression *N,                                              SmallVectorImpl<uint64_t> &Record,                                              unsigned Abbrev) {    Record.reserve(N->getElements().size() + 1); -  const uint64_t Version = 2 << 1; +  const uint64_t Version = 3 << 1;    Record.push_back((uint64_t)N->isDistinct() | Version);    Record.append(N->elements_begin(), N->elements_end()); @@ -3595,6 +3597,24 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {      MaybeEmitOriginalName(*AS);    } +  if (!Index.cfiFunctionDefs().empty()) { +    for (auto &S : Index.cfiFunctionDefs()) { +      NameVals.push_back(StrtabBuilder.add(S)); +      NameVals.push_back(S.size()); +    } +    Stream.EmitRecord(bitc::FS_CFI_FUNCTION_DEFS, NameVals); +    NameVals.clear(); +  } + +  if (!Index.cfiFunctionDecls().empty()) { +    for (auto &S : Index.cfiFunctionDecls()) { +      NameVals.push_back(StrtabBuilder.add(S)); +      NameVals.push_back(S.size()); +    } +    Stream.EmitRecord(bitc::FS_CFI_FUNCTION_DECLS, NameVals); +    NameVals.clear(); +  } +    Stream.ExitBlock();  } @@ -3829,6 +3849,14 @@ void BitcodeWriter::writeModule(const Module *M,    ModuleWriter.write();  } +void BitcodeWriter::writeIndex( +    const ModuleSummaryIndex *Index, +    const std::map<std::string, GVSummaryMapTy> *ModuleToSummariesForIndex) { +  IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, +                                 ModuleToSummariesForIndex); +  IndexWriter.write(); +} +  /// WriteBitcodeToFile - Write the specified module to the specified output  /// stream.  void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out, @@ -3880,11 +3908,9 @@ void llvm::WriteIndexToFile(    SmallVector<char, 0> Buffer;    Buffer.reserve(256 * 1024); -  BitstreamWriter Stream(Buffer); -  writeBitcodeHeader(Stream); - -  IndexBitcodeWriter IndexWriter(Stream, Index, ModuleToSummariesForIndex); -  IndexWriter.write(); +  BitcodeWriter Writer(Buffer); +  Writer.writeIndex(&Index, ModuleToSummariesForIndex); +  Writer.writeStrtab();    Out.write((char *)&Buffer.front(), Buffer.size());  } | 
