diff options
Diffstat (limited to 'lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp')
| -rw-r--r-- | lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp | 32 | 
1 files changed, 19 insertions, 13 deletions
diff --git a/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp b/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp index b97f1e90bcf83..ab93efc839a9a 100644 --- a/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp @@ -19,7 +19,6 @@  #include "llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h"  #include "llvm/DebugInfo/PDB/Native/RawConstants.h"  #include "llvm/DebugInfo/PDB/Native/RawError.h" -#include "llvm/Support/BinaryItemStream.h"  #include "llvm/Support/BinaryStreamWriter.h"  using namespace llvm; @@ -66,12 +65,22 @@ void DbiModuleDescriptorBuilder::setFirstSectionContrib(  }  void DbiModuleDescriptorBuilder::addSymbol(CVSymbol Symbol) { -  Symbols.push_back(Symbol); -  // Symbols written to a PDB file are required to be 4 byte aligned.  The same +  // Defer to the bulk API. It does the same thing. +  addSymbolsInBulk(Symbol.data()); +} + +void DbiModuleDescriptorBuilder::addSymbolsInBulk( +    ArrayRef<uint8_t> BulkSymbols) { +  // Do nothing for empty runs of symbols. +  if (BulkSymbols.empty()) +    return; + +  Symbols.push_back(BulkSymbols); +  // Symbols written to a PDB file are required to be 4 byte aligned. The same    // is not true of object files. -  assert(Symbol.length() % alignOf(CodeViewContainer::Pdb) == 0 && +  assert(BulkSymbols.size() % alignOf(CodeViewContainer::Pdb) == 0 &&           "Invalid Symbol alignment!"); -  SymbolByteSize += Symbol.length(); +  SymbolByteSize += BulkSymbols.size();  }  void DbiModuleDescriptorBuilder::addSourceFile(StringRef Path) { @@ -145,16 +154,13 @@ Error DbiModuleDescriptorBuilder::commit(BinaryStreamWriter &ModiWriter,      if (auto EC =              SymbolWriter.writeInteger<uint32_t>(COFF::DEBUG_SECTION_MAGIC))        return EC; -    BinaryItemStream<CVSymbol> Records(llvm::support::endianness::little); -    Records.setItems(Symbols); -    BinaryStreamRef RecordsRef(Records); -    if (auto EC = SymbolWriter.writeStreamRef(RecordsRef)) -      return EC; -    if (auto EC = SymbolWriter.padToAlignment(4)) -      return EC; -    // TODO: Write C11 Line data +    for (ArrayRef<uint8_t> Syms : Symbols) { +      if (auto EC = SymbolWriter.writeBytes(Syms)) +        return EC; +    }      assert(SymbolWriter.getOffset() % alignOf(CodeViewContainer::Pdb) == 0 &&             "Invalid debug section alignment!"); +    // TODO: Write C11 Line data      for (const auto &Builder : C13Builders) {        assert(Builder && "Empty C13 Fragment Builder!");        if (auto EC = Builder->commit(SymbolWriter))  | 
