<div dir="ltr">Also fixed in r277026.  Hopefully this is all of them, I'm on a slow computer right now so it would take me at least an hour to do an x64 build and confirm there are no other issues.</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 28, 2016 at 12:48 PM Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">There is still a failure:<br>
<br>
C:\Buildbot\Slave\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.src\unittests\DebugInfo\PDB\MappedBlockStreamTest.cpp(66):<br>
error C2397: conversion from 'size_t' to 'uint32_t' requires a<br>
narrowing conversion<br>
<br>
<br>
<br>
On 28 July 2016 at 15:39, Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>> wrote:<br>
> Thanks!<br>
><br>
> On 28 July 2016 at 15:37, Zachary Turner <<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>> wrote:<br>
>> Fixed in r277025<br>
>><br>
>> On Thu, Jul 28, 2016 at 12:33 PM Zachary Turner <<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>> wrote:<br>
>>><br>
>>> Strange, I compiled with clang-cl and it worked fine.  I will take a look<br>
>>><br>
>>> On Thu, Jul 28, 2016 at 12:32 PM Rafael Espíndola<br>
>>> <<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>> wrote:<br>
>>>><br>
>>>> Either this or the next patch broke windows builds:<br>
>>>><br>
>>>><br>
>>>> <a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/9076/steps/build/logs/stdio" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/9076/steps/build/logs/stdio</a><br>
>>>><br>
>>>> 'llvm::msf::StreamWriter::writeInteger': ambiguous call to overloaded<br>
>>>> function<br>
>>>><br>
>>>> C:\Buildbot\Slave\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.src\include\llvm/DebugInfo/Msf/StreamWriter.h(32):<br>
>>>> note: could be 'llvm::Error<br>
>>>> llvm::msf::StreamWriter::writeInteger(uint32_t)'<br>
>>>><br>
>>>> C:\Buildbot\Slave\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.src\include\llvm/DebugInfo/Msf/StreamWriter.h(31):<br>
>>>> note: or       'llvm::Error<br>
>>>> llvm::msf::StreamWriter::writeInteger(uint16_t)'<br>
>>>><br>
>>>> Cheers,<br>
>>>> Rafael<br>
>>>><br>
>>>><br>
>>>><br>
>>>> On 28 July 2016 at 15:12, Zachary Turner via llvm-commits<br>
>>>> <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
>>>> > Author: zturner<br>
>>>> > Date: Thu Jul 28 14:12:28 2016<br>
>>>> > New Revision: 277019<br>
>>>> ><br>
>>>> > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=277019&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=277019&view=rev</a><br>
>>>> > Log:<br>
>>>> > [pdb] Refactor library to more clearly separate reading/writing<br>
>>>> ><br>
>>>> > Reviewed By: amccarth, ruiu<br>
>>>> > Differential Revision: <a href="https://reviews.llvm.org/D22693" rel="noreferrer" target="_blank">https://reviews.llvm.org/D22693</a><br>
>>>> ><br>
>>>> > Removed:<br>
>>>> >     llvm/trunk/lib/DebugInfo/Msf/ByteStream.cpp<br>
>>>> > Modified:<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/ByteStream.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/MappedBlockStream.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/MsfBuilder.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/StreamArray.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/StreamInterface.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/StreamReader.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/StreamRef.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/Msf/StreamWriter.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/PDBTypes.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStream.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStream.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMap.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h<br>
>>>> >     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/RawTypes.h<br>
>>>> >     llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstream.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/Msf/CMakeLists.txt<br>
>>>> >     llvm/trunk/lib/DebugInfo/Msf/MappedBlockStream.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/Msf/MsfBuilder.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/Msf/StreamReader.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/Msf/StreamWriter.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/DbiStream.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/DbiStreamBuilder.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/InfoStream.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/NameMap.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/NameMapBuilder.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFile.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/PDBFileBuilder.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/RawSession.cpp<br>
>>>> >     llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp<br>
>>>> >     llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp<br>
>>>> >     llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp<br>
>>>> >     llvm/trunk/tools/llvm-readobj/COFFDumper.cpp<br>
>>>> >     llvm/trunk/unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp<br>
>>>> >     llvm/trunk/unittests/DebugInfo/PDB/MsfBuilderTest.cpp<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -32,7 +32,7 @@ namespace msf {<br>
>>>> ><br>
>>>> >  template <typename Kind><br>
>>>> >  struct VarStreamArrayExtractor<codeview::CVRecord<Kind>> {<br>
>>>> > -  Error operator()(StreamRef Stream, uint32_t &Len,<br>
>>>> > +  Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br>
>>>> >                     codeview::CVRecord<Kind> &Item) const {<br>
>>>> >      using namespace codeview;<br>
>>>> >      const RecordPrefix *Prefix = nullptr;<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h Thu<br>
>>>> > Jul 28 14:12:28 2016<br>
>>>> > @@ -59,15 +59,15 @@ struct ColumnNumberEntry {<br>
>>>> >  class ModuleSubstream {<br>
>>>> >  public:<br>
>>>> >    ModuleSubstream();<br>
>>>> > -  ModuleSubstream(ModuleSubstreamKind Kind, msf::StreamRef Data);<br>
>>>> > -  static Error initialize(msf::StreamRef Stream, ModuleSubstream<br>
>>>> > &Info);<br>
>>>> > +  ModuleSubstream(ModuleSubstreamKind Kind, msf::ReadableStreamRef<br>
>>>> > Data);<br>
>>>> > +  static Error initialize(msf::ReadableStreamRef Stream,<br>
>>>> > ModuleSubstream &Info);<br>
>>>> >    uint32_t getRecordLength() const;<br>
>>>> >    ModuleSubstreamKind getSubstreamKind() const;<br>
>>>> > -  msf::StreamRef getRecordData() const;<br>
>>>> > +  msf::ReadableStreamRef getRecordData() const;<br>
>>>> ><br>
>>>> >  private:<br>
>>>> >    ModuleSubstreamKind Kind;<br>
>>>> > -  msf::StreamRef Data;<br>
>>>> > +  msf::ReadableStreamRef Data;<br>
>>>> >  };<br>
>>>> ><br>
>>>> >  typedef msf::VarStreamArray<ModuleSubstream> ModuleSubstreamArray;<br>
>>>> > @@ -75,7 +75,7 @@ typedef msf::VarStreamArray<ModuleSubstr<br>
>>>> ><br>
>>>> >  namespace msf {<br>
>>>> >  template <> struct VarStreamArrayExtractor<codeview::ModuleSubstream><br>
>>>> > {<br>
>>>> > -  Error operator()(StreamRef Stream, uint32_t &Length,<br>
>>>> > +  Error operator()(ReadableStreamRef Stream, uint32_t &Length,<br>
>>>> >                     codeview::ModuleSubstream &Info) const {<br>
>>>> >      if (auto EC = codeview::ModuleSubstream::initialize(Stream, Info))<br>
>>>> >        return EC;<br>
>>>> ><br>
>>>> > Modified:<br>
>>>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h<br>
>>>> > Thu Jul 28 14:12:28 2016<br>
>>>> > @@ -38,23 +38,24 @@ class IModuleSubstreamVisitor {<br>
>>>> >  public:<br>
>>>> >    virtual ~IModuleSubstreamVisitor() {}<br>
>>>> ><br>
>>>> > -  virtual Error visitUnknown(ModuleSubstreamKind Kind, msf::StreamRef<br>
>>>> > Data) = 0;<br>
>>>> > -  virtual Error visitSymbols(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitLines(msf::StreamRef Data,<br>
>>>> > +  virtual Error visitUnknown(ModuleSubstreamKind Kind,<br>
>>>> > +                             msf::ReadableStreamRef Data) = 0;<br>
>>>> > +  virtual Error visitSymbols(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitLines(msf::ReadableStreamRef Data,<br>
>>>> >                             const LineSubstreamHeader *Header,<br>
>>>> >                             const LineInfoArray &Lines);<br>
>>>> > -  virtual Error visitStringTable(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitFileChecksums(msf::StreamRef Data,<br>
>>>> > +  virtual Error visitStringTable(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitFileChecksums(msf::ReadableStreamRef Data,<br>
>>>> >                                     const FileChecksumArray<br>
>>>> > &Checksums);<br>
>>>> > -  virtual Error visitFrameData(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitInlineeLines(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitCrossScopeImports(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitCrossScopeExports(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitILLines(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitFuncMDTokenMap(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitTypeMDTokenMap(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitMergedAssemblyInput(msf::StreamRef Data);<br>
>>>> > -  virtual Error visitCoffSymbolRVA(msf::StreamRef Data);<br>
>>>> > +  virtual Error visitFrameData(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitInlineeLines(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitCrossScopeImports(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitCrossScopeExports(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitILLines(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitFuncMDTokenMap(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitTypeMDTokenMap(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitMergedAssemblyInput(msf::ReadableStreamRef Data);<br>
>>>> > +  virtual Error visitCoffSymbolRVA(msf::ReadableStreamRef Data);<br>
>>>> >  };<br>
>>>> ><br>
>>>> >  Error visitModuleSubstream(const ModuleSubstream &R,<br>
>>>> > @@ -67,7 +68,7 @@ public:<br>
>>>> >    VarStreamArrayExtractor(const codeview::LineSubstreamHeader *Header)<br>
>>>> >        : Header(Header) {}<br>
>>>> ><br>
>>>> > -  Error operator()(StreamRef Stream, uint32_t &Len,<br>
>>>> > +  Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br>
>>>> >                     codeview::LineColumnEntry &Item) const {<br>
>>>> >      using namespace codeview;<br>
>>>> >      const LineFileBlockHeader *BlockHeader;<br>
>>>> > @@ -104,7 +105,7 @@ private:<br>
>>>> ><br>
>>>> >  template <> class VarStreamArrayExtractor<codeview::FileChecksumEntry><br>
>>>> > {<br>
>>>> >  public:<br>
>>>> > -  Error operator()(StreamRef Stream, uint32_t &Len,<br>
>>>> > +  Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br>
>>>> >                     codeview::FileChecksumEntry &Item) const {<br>
>>>> >      using namespace codeview;<br>
>>>> >      const FileChecksum *Header;<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/ByteStream.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/ByteStream.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/ByteStream.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/ByteStream.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/ByteStream.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -12,45 +12,147 @@<br>
>>>> ><br>
>>>> >  #include "llvm/ADT/ArrayRef.h"<br>
>>>> >  #include "llvm/ADT/StringRef.h"<br>
>>>> > +#include "llvm/DebugInfo/Msf/MsfError.h"<br>
>>>> >  #include "llvm/DebugInfo/Msf/StreamInterface.h"<br>
>>>> >  #include "llvm/Support/Error.h"<br>
>>>> > +#include "llvm/Support/FileOutputBuffer.h"<br>
>>>> > +#include "llvm/Support/MemoryBuffer.h"<br>
>>>> >  #include <cstdint><br>
>>>> >  #include <memory><br>
>>>> >  #include <type_traits><br>
>>>> ><br>
>>>> >  namespace llvm {<br>
>>>> >  namespace msf {<br>
>>>> > -class StreamReader;<br>
>>>> > -<br>
>>>> > -template <bool Writable = false> class ByteStream : public<br>
>>>> > StreamInterface {<br>
>>>> > -  typedef typename std::conditional<Writable,<br>
>>>> > MutableArrayRef<uint8_t>,<br>
>>>> > -                                    ArrayRef<uint8_t>>::type<br>
>>>> > ArrayType;<br>
>>>> ><br>
>>>> > +class ByteStream : public ReadableStream {<br>
>>>> >  public:<br>
>>>> >    ByteStream() {}<br>
>>>> > -  explicit ByteStream(ArrayType Data) : Data(Data) {}<br>
>>>> > -  ~ByteStream() override {}<br>
>>>> > +  explicit ByteStream(ArrayRef<uint8_t> Data) : Data(Data) {}<br>
>>>> ><br>
>>>> >    Error readBytes(uint32_t Offset, uint32_t Size,<br>
>>>> > -                  ArrayRef<uint8_t> &Buffer) const override;<br>
>>>> > +                  ArrayRef<uint8_t> &Buffer) const override {<br>
>>>> > +    if (Offset > Data.size())<br>
>>>> > +      return<br>
>>>> > make_error<MsfError>(msf_error_code::insufficient_buffer);<br>
>>>> > +    if (Data.size() < Size + Offset)<br>
>>>> > +      return<br>
>>>> > make_error<MsfError>(msf_error_code::insufficient_buffer);<br>
>>>> > +    Buffer = Data.slice(Offset, Size);<br>
>>>> > +    return Error::success();<br>
>>>> > +  }<br>
>>>> >    Error readLongestContiguousChunk(uint32_t Offset,<br>
>>>> > -                                   ArrayRef<uint8_t> &Buffer) const<br>
>>>> > override;<br>
>>>> > +                                   ArrayRef<uint8_t> &Buffer) const<br>
>>>> > override {<br>
>>>> > +    if (Offset >= Data.size())<br>
>>>> > +      return<br>
>>>> > make_error<MsfError>(msf_error_code::insufficient_buffer);<br>
>>>> > +    Buffer = Data.slice(Offset);<br>
>>>> > +    return Error::success();<br>
>>>> > +  }<br>
>>>> ><br>
>>>> > -  Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) const<br>
>>>> > override;<br>
>>>> > +  uint32_t getLength() const override { return Data.size(); }<br>
>>>> ><br>
>>>> > -  uint32_t getLength() const override;<br>
>>>> > +  ArrayRef<uint8_t> data() const { return Data; }<br>
>>>> ><br>
>>>> > -  Error commit() const override;<br>
>>>> > +  StringRef str() const {<br>
>>>> > +    const char *CharData = reinterpret_cast<const char<br>
>>>> > *>(Data.data());<br>
>>>> > +    return StringRef(CharData, Data.size());<br>
>>>> > +  }<br>
>>>> ><br>
>>>> > -  ArrayRef<uint8_t> data() const { return Data; }<br>
>>>> > -  StringRef str() const;<br>
>>>> > +protected:<br>
>>>> > +  ArrayRef<uint8_t> Data;<br>
>>>> > +};<br>
>>>> > +<br>
>>>> > +// MemoryBufferByteStream behaves like a read-only ByteStream, but has<br>
>>>> > its data<br>
>>>> > +// backed by an llvm::MemoryBuffer.  It also owns the underlying<br>
>>>> > MemoryBuffer.<br>
>>>> > +class MemoryBufferByteStream : public ByteStream {<br>
>>>> > +public:<br>
>>>> > +  explicit MemoryBufferByteStream(std::unique_ptr<MemoryBuffer><br>
>>>> > Buffer)<br>
>>>> > +      :<br>
>>>> > ByteStream(ArrayRef<uint8_t>(Buffer->getBuffer().bytes_begin(),<br>
>>>> > +<br>
>>>> > Buffer->getBuffer().bytes_end())),<br>
>>>> > +        MemBuffer(std::move(Buffer)) {}<br>
>>>> > +<br>
>>>> > +  std::unique_ptr<MemoryBuffer> MemBuffer;<br>
>>>> > +};<br>
>>>> > +<br>
>>>> > +class MutableByteStream : public WritableStream {<br>
>>>> > +public:<br>
>>>> > +  MutableByteStream() {}<br>
>>>> > +  explicit MutableByteStream(MutableArrayRef<uint8_t> Data)<br>
>>>> > +      : Data(Data), ImmutableStream(Data) {}<br>
>>>> > +<br>
>>>> > +  Error readBytes(uint32_t Offset, uint32_t Size,<br>
>>>> > +                  ArrayRef<uint8_t> &Buffer) const override {<br>
>>>> > +    return ImmutableStream.readBytes(Offset, Size, Buffer);<br>
>>>> > +  }<br>
>>>> > +  Error readLongestContiguousChunk(uint32_t Offset,<br>
>>>> > +                                   ArrayRef<uint8_t> &Buffer) const<br>
>>>> > override {<br>
>>>> > +    return ImmutableStream.readLongestContiguousChunk(Offset, Buffer);<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +  uint32_t getLength() const override { return<br>
>>>> > ImmutableStream.getLength(); }<br>
>>>> > +<br>
>>>> > +  Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) const<br>
>>>> > override {<br>
>>>> > +    if (Data.size() < Buffer.size())<br>
>>>> > +      return<br>
>>>> > make_error<MsfError>(msf_error_code::insufficient_buffer);<br>
>>>> > +    if (Offset > Buffer.size() - Data.size())<br>
>>>> > +      return<br>
>>>> > make_error<MsfError>(msf_error_code::insufficient_buffer);<br>
>>>> > +<br>
>>>> > +    uint8_t *DataPtr = const_cast<uint8_t *>(Data.data());<br>
>>>> > +    ::memcpy(DataPtr + Offset, Buffer.data(), Buffer.size());<br>
>>>> > +    return Error::success();<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +  Error commit() const override { return Error::success(); }<br>
>>>> > +<br>
>>>> > +  MutableArrayRef<uint8_t> data() const { return Data; }<br>
>>>> > +<br>
>>>> > +private:<br>
>>>> > +  MutableArrayRef<uint8_t> Data;<br>
>>>> > +  ByteStream ImmutableStream;<br>
>>>> > +};<br>
>>>> > +<br>
>>>> > +// A simple adapter that acts like a ByteStream but holds ownership<br>
>>>> > over<br>
>>>> > +// and underlying FileOutputBuffer.<br>
>>>> > +class FileBufferByteStream : public WritableStream {<br>
>>>> > +private:<br>
>>>> > +  class StreamImpl : public MutableByteStream {<br>
>>>> > +  public:<br>
>>>> > +    StreamImpl(std::unique_ptr<FileOutputBuffer> Buffer)<br>
>>>> > +        :<br>
>>>> > MutableByteStream(MutableArrayRef<uint8_t>(Buffer->getBufferStart(),<br>
>>>> > +<br>
>>>> > Buffer->getBufferEnd())),<br>
>>>> > +          FileBuffer(std::move(Buffer)) {}<br>
>>>> > +<br>
>>>> > +    Error commit() const override {<br>
>>>> > +      if (FileBuffer->commit())<br>
>>>> > +        return<br>
>>>> > llvm::make_error<MsfError>(msf_error_code::not_writable);<br>
>>>> > +      return Error::success();<br>
>>>> > +    }<br>
>>>> > +<br>
>>>> > +  private:<br>
>>>> > +    std::unique_ptr<FileOutputBuffer> FileBuffer;<br>
>>>> > +  };<br>
>>>> > +<br>
>>>> > +public:<br>
>>>> > +  explicit FileBufferByteStream(std::unique_ptr<FileOutputBuffer><br>
>>>> > Buffer)<br>
>>>> > +      : Impl(std::move(Buffer)) {}<br>
>>>> > +<br>
>>>> > +  Error readBytes(uint32_t Offset, uint32_t Size,<br>
>>>> > +                  ArrayRef<uint8_t> &Buffer) const override {<br>
>>>> > +    return Impl.readBytes(Offset, Size, Buffer);<br>
>>>> > +  }<br>
>>>> > +  Error readLongestContiguousChunk(uint32_t Offset,<br>
>>>> > +                                   ArrayRef<uint8_t> &Buffer) const<br>
>>>> > override {<br>
>>>> > +    return Impl.readLongestContiguousChunk(Offset, Buffer);<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +  uint32_t getLength() const override { return Impl.getLength(); }<br>
>>>> > +<br>
>>>> > +  Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) const<br>
>>>> > override {<br>
>>>> > +    return Impl.writeBytes(Offset, Data);<br>
>>>> > +  }<br>
>>>> > +  Error commit() const override { return Impl.commit(); }<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  ArrayType Data;<br>
>>>> > +  StreamImpl Impl;<br>
>>>> >  };<br>
>>>> ><br>
>>>> > -extern template class ByteStream<true>;<br>
>>>> > -extern template class ByteStream<false>;<br>
>>>> ><br>
>>>> >  } // end namespace msf<br>
>>>> >  } // end namespace llvm<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/MappedBlockStream.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MappedBlockStream.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MappedBlockStream.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/MappedBlockStream.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/MappedBlockStream.h Thu Jul<br>
>>>> > 28 14:12:28 2016<br>
>>>> > @@ -25,7 +25,7 @@<br>
>>>> >  namespace llvm {<br>
>>>> >  namespace msf {<br>
>>>> ><br>
>>>> > -class IMsfFile;<br>
>>>> > +struct MsfLayout;<br>
>>>> ><br>
>>>> >  /// MappedBlockStream represents data stored in an Msf file into<br>
>>>> > chunks of a<br>
>>>> >  /// particular size (called the Block Size), and whose chunks may not<br>
>>>> > be<br>
>>>> > @@ -37,42 +37,102 @@ class IMsfFile;<br>
>>>> >  /// the Msf.  MappedBlockStream provides methods for reading from and<br>
>>>> > writing<br>
>>>> >  /// to one of these streams transparently, as if it were a contiguous<br>
>>>> > sequence<br>
>>>> >  /// of bytes.<br>
>>>> > -class MappedBlockStream : public StreamInterface {<br>
>>>> > +class MappedBlockStream : public ReadableStream {<br>
>>>> > +  friend class WritableMappedBlockStream;<br>
>>>> > +<br>
>>>> >  public:<br>
>>>> > +  static std::unique_ptr<MappedBlockStream><br>
>>>> > +  createStream(uint32_t BlockSize, uint32_t NumBlocks,<br>
>>>> > +               const MsfStreamLayout &Layout, const ReadableStream<br>
>>>> > &MsfData);<br>
>>>> > +<br>
>>>> > +  static std::unique_ptr<MappedBlockStream><br>
>>>> > +  createIndexedStream(const MsfLayout &Layout, const ReadableStream<br>
>>>> > &MsfData,<br>
>>>> > +                      uint32_t StreamIndex);<br>
>>>> > +<br>
>>>> > +  static std::unique_ptr<MappedBlockStream><br>
>>>> > +  createDirectoryStream(const MsfLayout &Layout, const ReadableStream<br>
>>>> > &MsfData);<br>
>>>> > +<br>
>>>> >    Error readBytes(uint32_t Offset, uint32_t Size,<br>
>>>> >                    ArrayRef<uint8_t> &Buffer) const override;<br>
>>>> >    Error readLongestContiguousChunk(uint32_t Offset,<br>
>>>> >                                     ArrayRef<uint8_t> &Buffer) const<br>
>>>> > override;<br>
>>>> > -  Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) const<br>
>>>> > override;<br>
>>>> ><br>
>>>> >    uint32_t getLength() const override;<br>
>>>> > -  Error commit() const override;<br>
>>>> ><br>
>>>> >    uint32_t getNumBytesCopied() const;<br>
>>>> ><br>
>>>> > -  static Expected<std::unique_ptr<MappedBlockStream>><br>
>>>> > -  createIndexedStream(uint32_t StreamIdx, const IMsfFile &File);<br>
>>>> > -  static Expected<std::unique_ptr<MappedBlockStream>><br>
>>>> > -  createDirectoryStream(uint32_t Length,<br>
>>>> > ArrayRef<support::ulittle32_t> Blocks,<br>
>>>> > -                        const IMsfFile &File);<br>
>>>> > -<br>
>>>> >    llvm::BumpPtrAllocator &getAllocator() { return Pool; }<br>
>>>> ><br>
>>>> > +  void invalidateCache();<br>
>>>> > +<br>
>>>> > +  uint32_t getBlockSize() const { return BlockSize; }<br>
>>>> > +  uint32_t getNumBlocks() const { return NumBlocks; }<br>
>>>> > +  uint32_t getStreamLength() const { return StreamLayout.Length; }<br>
>>>> > +<br>
>>>> >  protected:<br>
>>>> > -  MappedBlockStream(const MsfStreamLayout &Layout, const IMsfFile<br>
>>>> > &File);<br>
>>>> > +  MappedBlockStream(uint32_t BlockSize, uint32_t NumBlocks,<br>
>>>> > +                    const MsfStreamLayout &StreamLayout,<br>
>>>> > +                    const ReadableStream &MsfData);<br>
>>>> > +<br>
>>>> > +private:<br>
>>>> > +  const MsfStreamLayout &getStreamLayout() const { return<br>
>>>> > StreamLayout; }<br>
>>>> > +  void fixCacheAfterWrite(uint32_t Offset, ArrayRef<uint8_t> Data)<br>
>>>> > const;<br>
>>>> ><br>
>>>> >    Error readBytes(uint32_t Offset, MutableArrayRef<uint8_t> Buffer)<br>
>>>> > const;<br>
>>>> >    bool tryReadContiguously(uint32_t Offset, uint32_t Size,<br>
>>>> >                             ArrayRef<uint8_t> &Buffer) const;<br>
>>>> ><br>
>>>> > -  const IMsfFile &Msf;<br>
>>>> > -  const MsfStreamLayout Layout;<br>
>>>> > +  const uint32_t BlockSize;<br>
>>>> > +  const uint32_t NumBlocks;<br>
>>>> > +  const MsfStreamLayout StreamLayout;<br>
>>>> > +  const ReadableStream &MsfData;<br>
>>>> ><br>
>>>> >    typedef MutableArrayRef<uint8_t> CacheEntry;<br>
>>>> >    mutable llvm::BumpPtrAllocator Pool;<br>
>>>> >    mutable DenseMap<uint32_t, std::vector<CacheEntry>> CacheMap;<br>
>>>> >  };<br>
>>>> ><br>
>>>> > +class WritableMappedBlockStream : public WritableStream {<br>
>>>> > +public:<br>
>>>> > +  static std::unique_ptr<WritableMappedBlockStream><br>
>>>> > +  createStream(uint32_t BlockSize, uint32_t NumBlocks,<br>
>>>> > +               const MsfStreamLayout &Layout, const WritableStream<br>
>>>> > &MsfData);<br>
>>>> > +<br>
>>>> > +  static std::unique_ptr<WritableMappedBlockStream><br>
>>>> > +  createIndexedStream(const MsfLayout &Layout, const WritableStream<br>
>>>> > &MsfData,<br>
>>>> > +                      uint32_t StreamIndex);<br>
>>>> > +<br>
>>>> > +  static std::unique_ptr<WritableMappedBlockStream><br>
>>>> > +  createDirectoryStream(const MsfLayout &Layout, const WritableStream<br>
>>>> > &MsfData);<br>
>>>> > +<br>
>>>> > +  Error readBytes(uint32_t Offset, uint32_t Size,<br>
>>>> > +                  ArrayRef<uint8_t> &Buffer) const override;<br>
>>>> > +  Error readLongestContiguousChunk(uint32_t Offset,<br>
>>>> > +                                   ArrayRef<uint8_t> &Buffer) const<br>
>>>> > override;<br>
>>>> > +  uint32_t getLength() const override;<br>
>>>> > +<br>
>>>> > +  Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) const<br>
>>>> > override;<br>
>>>> > +<br>
>>>> > +  Error commit() const override;<br>
>>>> > +<br>
>>>> > +  const MsfStreamLayout &getStreamLayout() const {<br>
>>>> > +    return ReadInterface.getStreamLayout();<br>
>>>> > +  }<br>
>>>> > +  uint32_t getBlockSize() const { return ReadInterface.getBlockSize();<br>
>>>> > }<br>
>>>> > +  uint32_t getNumBlocks() const { return ReadInterface.getNumBlocks();<br>
>>>> > }<br>
>>>> > +  uint32_t getStreamLength() const { return<br>
>>>> > ReadInterface.getStreamLength(); }<br>
>>>> > +<br>
>>>> > +protected:<br>
>>>> > +  WritableMappedBlockStream(uint32_t BlockSize, uint32_t NumBlocks,<br>
>>>> > +                            const MsfStreamLayout &StreamLayout,<br>
>>>> > +                            const WritableStream &MsfData);<br>
>>>> > +<br>
>>>> > +private:<br>
>>>> > +  MappedBlockStream ReadInterface;<br>
>>>> > +<br>
>>>> > +  const WritableStream &WriteInterface;<br>
>>>> > +};<br>
>>>> > +<br>
>>>> >  } // end namespace pdb<br>
>>>> >  } // end namespace llvm<br>
>>>> ><br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/MsfBuilder.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MsfBuilder.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MsfBuilder.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/MsfBuilder.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/MsfBuilder.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -111,7 +111,7 @@ public:<br>
>>>> ><br>
>>>> >    /// Finalize the layout and build the headers and structures that<br>
>>>> > describe the<br>
>>>> >    /// MSF layout and can be written directly to the MSF file.<br>
>>>> > -  Expected<Layout> build();<br>
>>>> > +  Expected<MsfLayout> build();<br>
>>>> ><br>
>>>> >  private:<br>
>>>> >    MsfBuilder(uint32_t BlockSize, uint32_t MinBlockCount, bool CanGrow,<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/MsfCommon.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -48,8 +48,8 @@ struct SuperBlock {<br>
>>>> >    support::ulittle32_t BlockMapAddr;<br>
>>>> >  };<br>
>>>> ><br>
>>>> > -struct Layout {<br>
>>>> > -  Layout() : SB(nullptr) {}<br>
>>>> > +struct MsfLayout {<br>
>>>> > +  MsfLayout() : SB(nullptr) {}<br>
>>>> >    const SuperBlock *SB;<br>
>>>> >    ArrayRef<support::ulittle32_t> DirectoryBlocks;<br>
>>>> >    ArrayRef<support::ulittle32_t> StreamSizes;<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/StreamArray.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamArray.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamArray.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/StreamArray.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/StreamArray.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -34,7 +34,8 @@ namespace msf {<br>
>>>> >  template <typename T> struct VarStreamArrayExtractor {<br>
>>>> >    // Method intentionally deleted.  You must provide an explicit<br>
>>>> > specialization<br>
>>>> >    // with the following method implemented.<br>
>>>> > -  Error operator()(StreamRef Stream, uint32_t &Len, T &Item) const =<br>
>>>> > delete;<br>
>>>> > +  Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br>
>>>> > +                   T &Item) const = delete;<br>
>>>> >  };<br>
>>>> ><br>
>>>> >  /// VarStreamArray represents an array of variable length records<br>
>>>> > backed by a<br>
>>>> > @@ -83,8 +84,9 @@ public:<br>
>>>> >    VarStreamArray() {}<br>
>>>> >    explicit VarStreamArray(const Extractor &E) : E(E) {}<br>
>>>> ><br>
>>>> > -  explicit VarStreamArray(StreamRef Stream) : Stream(Stream) {}<br>
>>>> > -  VarStreamArray(StreamRef Stream, const Extractor &E) :<br>
>>>> > Stream(Stream), E(E) {}<br>
>>>> > +  explicit VarStreamArray(ReadableStreamRef Stream) : Stream(Stream)<br>
>>>> > {}<br>
>>>> > +  VarStreamArray(ReadableStreamRef Stream, const Extractor &E)<br>
>>>> > +      : Stream(Stream), E(E) {}<br>
>>>> ><br>
>>>> >    VarStreamArray(const VarStreamArray<ValueType, Extractor> &Other)<br>
>>>> >        : Stream(Other.Stream), E(Other.E) {}<br>
>>>> > @@ -97,10 +99,10 @@ public:<br>
>>>> ><br>
>>>> >    const Extractor &getExtractor() const { return E; }<br>
>>>> ><br>
>>>> > -  StreamRef getUnderlyingStream() const { return Stream; }<br>
>>>> > +  ReadableStreamRef getUnderlyingStream() const { return Stream; }<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  StreamRef Stream;<br>
>>>> > +  ReadableStreamRef Stream;<br>
>>>> >    Extractor E;<br>
>>>> >  };<br>
>>>> ><br>
>>>> > @@ -189,7 +191,7 @@ private:<br>
>>>> >    }<br>
>>>> ><br>
>>>> >    ValueType ThisValue;<br>
>>>> > -  StreamRef IterRef;<br>
>>>> > +  ReadableStreamRef IterRef;<br>
>>>> >    const ArrayType *Array{nullptr};<br>
>>>> >    uint32_t ThisLen{0};<br>
>>>> >    bool HasError{false};<br>
>>>> > @@ -204,7 +206,7 @@ template <typename T> class FixedStreamA<br>
>>>> ><br>
>>>> >  public:<br>
>>>> >    FixedStreamArray() : Stream() {}<br>
>>>> > -  FixedStreamArray(StreamRef Stream) : Stream(Stream) {<br>
>>>> > +  FixedStreamArray(ReadableStreamRef Stream) : Stream(Stream) {<br>
>>>> >      assert(Stream.getLength() % sizeof(T) == 0);<br>
>>>> >    }<br>
>>>> ><br>
>>>> > @@ -230,10 +232,10 @@ public:<br>
>>>> >      return FixedStreamArrayIterator<T>(*this, size());<br>
>>>> >    }<br>
>>>> ><br>
>>>> > -  StreamRef getUnderlyingStream() const { return Stream; }<br>
>>>> > +  ReadableStreamRef getUnderlyingStream() const { return Stream; }<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  StreamRef Stream;<br>
>>>> > +  ReadableStreamRef Stream;<br>
>>>> >  };<br>
>>>> ><br>
>>>> >  template <typename T> class FixedStreamArrayIterator {<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/StreamInterface.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamInterface.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamInterface.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/StreamInterface.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/StreamInterface.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -17,16 +17,9 @@<br>
>>>> >  namespace llvm {<br>
>>>> >  namespace msf {<br>
>>>> ><br>
>>>> > -/// StreamInterface abstracts the notion of a data stream.  This way,<br>
>>>> > an<br>
>>>> > -/// implementation could implement trivial reading from a contiguous<br>
>>>> > memory<br>
>>>> > -/// buffer or, as in the case of PDB files, reading from a set of<br>
>>>> > possibly<br>
>>>> > -/// discontiguous blocks.  The implementation is required to return<br>
>>>> > references<br>
>>>> > -/// to stable memory, so if this is not possible (for example in the<br>
>>>> > case of<br>
>>>> > -/// a PDB file with discontiguous blocks, it must keep its own pool of<br>
>>>> > temp<br>
>>>> > -/// storage.<br>
>>>> > -class StreamInterface {<br>
>>>> > +class ReadableStream {<br>
>>>> >  public:<br>
>>>> > -  virtual ~StreamInterface() {}<br>
>>>> > +  virtual ~ReadableStream() {}<br>
>>>> ><br>
>>>> >    // Given an offset into the stream and a number of bytes, attempt to<br>
>>>> > read<br>
>>>> >    // the bytes and set the output ArrayRef to point to a reference<br>
>>>> > into the<br>
>>>> > @@ -39,13 +32,18 @@ public:<br>
>>>> >    virtual Error readLongestContiguousChunk(uint32_t Offset,<br>
>>>> >                                             ArrayRef<uint8_t> &Buffer)<br>
>>>> > const = 0;<br>
>>>> ><br>
>>>> > +  virtual uint32_t getLength() const = 0;<br>
>>>> > +};<br>
>>>> > +<br>
>>>> > +class WritableStream : public ReadableStream {<br>
>>>> > +public:<br>
>>>> > +  virtual ~WritableStream() {}<br>
>>>> > +<br>
>>>> >    // Attempt to write the given bytes into the stream at the desired<br>
>>>> > offset.<br>
>>>> >    // This will always necessitate a copy.  Cannot shrink or grow the<br>
>>>> > stream,<br>
>>>> >    // only writes into existing allocated space.<br>
>>>> >    virtual Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data)<br>
>>>> > const = 0;<br>
>>>> ><br>
>>>> > -  virtual uint32_t getLength() const = 0;<br>
>>>> > -<br>
>>>> >    virtual Error commit() const = 0;<br>
>>>> >  };<br>
>>>> ><br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/StreamReader.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamReader.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamReader.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/StreamReader.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/StreamReader.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -14,6 +14,7 @@<br>
>>>> >  #include "llvm/DebugInfo/Msf/MsfError.h"<br>
>>>> >  #include "llvm/DebugInfo/Msf/StreamArray.h"<br>
>>>> >  #include "llvm/DebugInfo/Msf/StreamInterface.h"<br>
>>>> > +#include "llvm/DebugInfo/Msf/StreamRef.h"<br>
>>>> >  #include "llvm/Support/Endian.h"<br>
>>>> >  #include "llvm/Support/Error.h"<br>
>>>> ><br>
>>>> > @@ -22,11 +23,9 @@<br>
>>>> >  namespace llvm {<br>
>>>> >  namespace msf {<br>
>>>> ><br>
>>>> > -class StreamRef;<br>
>>>> > -<br>
>>>> >  class StreamReader {<br>
>>>> >  public:<br>
>>>> > -  StreamReader(StreamRef Stream);<br>
>>>> > +  StreamReader(ReadableStreamRef Stream);<br>
>>>> ><br>
>>>> >    Error readLongestContiguousChunk(ArrayRef<uint8_t> &Buffer);<br>
>>>> >    Error readBytes(ArrayRef<uint8_t> &Buffer, uint32_t Size);<br>
>>>> > @@ -34,8 +33,8 @@ public:<br>
>>>> >    Error readInteger(uint32_t &Dest);<br>
>>>> >    Error readZeroString(StringRef &Dest);<br>
>>>> >    Error readFixedString(StringRef &Dest, uint32_t Length);<br>
>>>> > -  Error readStreamRef(StreamRef &Ref);<br>
>>>> > -  Error readStreamRef(StreamRef &Ref, uint32_t Length);<br>
>>>> > +  Error readStreamRef(ReadableStreamRef &Ref);<br>
>>>> > +  Error readStreamRef(ReadableStreamRef &Ref, uint32_t Length);<br>
>>>> ><br>
>>>> >    template <typename T> Error readEnum(T &Dest) {<br>
>>>> >      typename std::underlying_type<T>::type N;<br>
>>>> > @@ -72,7 +71,7 @@ public:<br>
>>>> ><br>
>>>> >    template <typename T, typename U><br>
>>>> >    Error readArray(VarStreamArray<T, U> &Array, uint32_t Size) {<br>
>>>> > -    StreamRef S;<br>
>>>> > +    ReadableStreamRef S;<br>
>>>> >      if (auto EC = readStreamRef(S, Size))<br>
>>>> >        return EC;<br>
>>>> >      Array = VarStreamArray<T, U>(S, Array.getExtractor());<br>
>>>> > @@ -90,7 +89,7 @@ public:<br>
>>>> >        return make_error<MsfError>(msf_error_code::invalid_format);<br>
>>>> >      if (Offset + Length > Stream.getLength())<br>
>>>> >        return<br>
>>>> > make_error<MsfError>(msf_error_code::insufficient_buffer);<br>
>>>> > -    StreamRef View = Stream.slice(Offset, Length);<br>
>>>> > +    ReadableStreamRef View = Stream.slice(Offset, Length);<br>
>>>> >      Array = FixedStreamArray<T>(View);<br>
>>>> >      Offset += Length;<br>
>>>> >      return Error::success();<br>
>>>> > @@ -102,7 +101,7 @@ public:<br>
>>>> >    uint32_t bytesRemaining() const { return getLength() - getOffset();<br>
>>>> > }<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  StreamRef Stream;<br>
>>>> > +  ReadableStreamRef Stream;<br>
>>>> >    uint32_t Offset;<br>
>>>> >  };<br>
>>>> >  } // namespace msf<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/StreamRef.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamRef.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamRef.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/StreamRef.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/StreamRef.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -15,17 +15,63 @@<br>
>>>> ><br>
>>>> >  namespace llvm {<br>
>>>> >  namespace msf {<br>
>>>> > -<br>
>>>> > -class StreamRef {<br>
>>>> > +template <class StreamType, class RefType> class StreamRefBase {<br>
>>>> >  public:<br>
>>>> > -  StreamRef() : Stream(nullptr), ViewOffset(0), Length(0) {}<br>
>>>> > -  StreamRef(const StreamInterface &Stream)<br>
>>>> > -      : Stream(&Stream), ViewOffset(0), Length(Stream.getLength()) {}<br>
>>>> > -  StreamRef(const StreamInterface &Stream, uint32_t Offset, uint32_t<br>
>>>> > Length)<br>
>>>> > +  StreamRefBase() : Stream(nullptr), Length(0), ViewOffset(0) {}<br>
>>>> > +  StreamRefBase(const StreamType &Stream, uint32_t Offset, uint32_t<br>
>>>> > Length)<br>
>>>> >        : Stream(&Stream), ViewOffset(Offset), Length(Length) {}<br>
>>>> ><br>
>>>> > +  uint32_t getLength() const { return Length; }<br>
>>>> > +  const StreamType *getStream() const { return Stream; }<br>
>>>> > +<br>
>>>> > +  RefType drop_front(uint32_t N) const {<br>
>>>> > +    if (!Stream)<br>
>>>> > +      return RefType();<br>
>>>> > +<br>
>>>> > +    N = std::min(N, Length);<br>
>>>> > +    return RefType(*Stream, ViewOffset + N, Length - N);<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +  RefType keep_front(uint32_t N) const {<br>
>>>> > +    if (!Stream)<br>
>>>> > +      return RefType();<br>
>>>> > +    N = std::min(N, Length);<br>
>>>> > +    return RefType(*Stream, ViewOffset, N);<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +  RefType slice(uint32_t Offset, uint32_t Len) const {<br>
>>>> > +    return drop_front(Offset).keep_front(Len);<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +  bool operator==(const RefType &Other) const {<br>
>>>> > +    if (Stream != Other.Stream)<br>
>>>> > +      return false;<br>
>>>> > +    if (ViewOffset != Other.ViewOffset)<br>
>>>> > +      return false;<br>
>>>> > +    if (Length != Other.Length)<br>
>>>> > +      return false;<br>
>>>> > +    return true;<br>
>>>> > +  }<br>
>>>> > +<br>
>>>> > +protected:<br>
>>>> > +  const StreamType *Stream;<br>
>>>> > +  uint32_t ViewOffset;<br>
>>>> > +  uint32_t Length;<br>
>>>> > +};<br>
>>>> > +<br>
>>>> > +class ReadableStreamRef<br>
>>>> > +    : public StreamRefBase<ReadableStream, ReadableStreamRef> {<br>
>>>> > +public:<br>
>>>> > +  ReadableStreamRef() : StreamRefBase() {}<br>
>>>> > +  ReadableStreamRef(const ReadableStream &Stream)<br>
>>>> > +      : StreamRefBase(Stream, 0, Stream.getLength()) {}<br>
>>>> > +  ReadableStreamRef(const ReadableStream &Stream, uint32_t Offset,<br>
>>>> > +                    uint32_t Length)<br>
>>>> > +      : StreamRefBase(Stream, Offset, Length) {}<br>
>>>> > +<br>
>>>> >    // Use StreamRef.slice() instead.<br>
>>>> > -  StreamRef(const StreamRef &S, uint32_t Offset, uint32_t Length) =<br>
>>>> > delete;<br>
>>>> > +  ReadableStreamRef(const ReadableStreamRef &S, uint32_t Offset,<br>
>>>> > +                    uint32_t Length) = delete;<br>
>>>> ><br>
>>>> >    Error readBytes(uint32_t Offset, uint32_t Size,<br>
>>>> >                    ArrayRef<uint8_t> &Buffer) const {<br>
>>>> > @@ -53,6 +99,21 @@ public:<br>
>>>> >        Buffer = Buffer.slice(0, MaxLength);<br>
>>>> >      return Error::success();<br>
>>>> >    }<br>
>>>> > +};<br>
>>>> > +<br>
>>>> > +class WritableStreamRef<br>
>>>> > +    : public StreamRefBase<WritableStream, WritableStreamRef> {<br>
>>>> > +public:<br>
>>>> > +  WritableStreamRef() : StreamRefBase() {}<br>
>>>> > +  WritableStreamRef(const WritableStream &Stream)<br>
>>>> > +      : StreamRefBase(Stream, 0, Stream.getLength()) {}<br>
>>>> > +  WritableStreamRef(const WritableStream &Stream, uint32_t Offset,<br>
>>>> > +                    uint32_t Length)<br>
>>>> > +      : StreamRefBase(Stream, Offset, Length) {}<br>
>>>> > +<br>
>>>> > +  // Use StreamRef.slice() instead.<br>
>>>> > +  WritableStreamRef(const WritableStreamRef &S, uint32_t Offset,<br>
>>>> > +                    uint32_t Length) = delete;<br>
>>>> ><br>
>>>> >    Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) const {<br>
>>>> >      if (Data.size() + Offset > Length)<br>
>>>> > @@ -60,44 +121,9 @@ public:<br>
>>>> >      return Stream->writeBytes(ViewOffset + Offset, Data);<br>
>>>> >    }<br>
>>>> ><br>
>>>> > -  uint32_t getLength() const { return Length; }<br>
>>>> > -<br>
>>>> >    Error commit() const { return Stream->commit(); }<br>
>>>> > -<br>
>>>> > -  StreamRef drop_front(uint32_t N) const {<br>
>>>> > -    if (!Stream)<br>
>>>> > -      return StreamRef();<br>
>>>> > -<br>
>>>> > -    N = std::min(N, Length);<br>
>>>> > -    return StreamRef(*Stream, ViewOffset + N, Length - N);<br>
>>>> > -  }<br>
>>>> > -<br>
>>>> > -  StreamRef keep_front(uint32_t N) const {<br>
>>>> > -    if (!Stream)<br>
>>>> > -      return StreamRef();<br>
>>>> > -    N = std::min(N, Length);<br>
>>>> > -    return StreamRef(*Stream, ViewOffset, N);<br>
>>>> > -  }<br>
>>>> > -<br>
>>>> > -  StreamRef slice(uint32_t Offset, uint32_t Len) const {<br>
>>>> > -    return drop_front(Offset).keep_front(Len);<br>
>>>> > -  }<br>
>>>> > -<br>
>>>> > -  bool operator==(const StreamRef &Other) const {<br>
>>>> > -    if (Stream != Other.Stream)<br>
>>>> > -      return false;<br>
>>>> > -    if (ViewOffset != Other.ViewOffset)<br>
>>>> > -      return false;<br>
>>>> > -    if (Length != Other.Length)<br>
>>>> > -      return false;<br>
>>>> > -    return true;<br>
>>>> > -  }<br>
>>>> > -<br>
>>>> > -private:<br>
>>>> > -  const StreamInterface *Stream;<br>
>>>> > -  uint32_t ViewOffset;<br>
>>>> > -  uint32_t Length;<br>
>>>> >  };<br>
>>>> > +<br>
>>>> >  } // namespace msf<br>
>>>> >  } // namespace llvm<br>
>>>> ><br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/Msf/StreamWriter.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamWriter.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/Msf/StreamWriter.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/Msf/StreamWriter.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/Msf/StreamWriter.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -14,6 +14,7 @@<br>
>>>> >  #include "llvm/DebugInfo/Msf/MsfError.h"<br>
>>>> >  #include "llvm/DebugInfo/Msf/StreamArray.h"<br>
>>>> >  #include "llvm/DebugInfo/Msf/StreamInterface.h"<br>
>>>> > +#include "llvm/DebugInfo/Msf/StreamRef.h"<br>
>>>> >  #include "llvm/Support/Endian.h"<br>
>>>> >  #include "llvm/Support/Error.h"<br>
>>>> ><br>
>>>> > @@ -22,19 +23,17 @@<br>
>>>> >  namespace llvm {<br>
>>>> >  namespace msf {<br>
>>>> ><br>
>>>> > -class StreamRef;<br>
>>>> > -<br>
>>>> >  class StreamWriter {<br>
>>>> >  public:<br>
>>>> > -  StreamWriter(StreamRef Stream);<br>
>>>> > +  StreamWriter(WritableStreamRef Stream);<br>
>>>> ><br>
>>>> >    Error writeBytes(ArrayRef<uint8_t> Buffer);<br>
>>>> >    Error writeInteger(uint16_t Dest);<br>
>>>> >    Error writeInteger(uint32_t Dest);<br>
>>>> >    Error writeZeroString(StringRef Str);<br>
>>>> >    Error writeFixedString(StringRef Str);<br>
>>>> > -  Error writeStreamRef(StreamRef Ref);<br>
>>>> > -  Error writeStreamRef(StreamRef Ref, uint32_t Size);<br>
>>>> > +  Error writeStreamRef(ReadableStreamRef Ref);<br>
>>>> > +  Error writeStreamRef(ReadableStreamRef Ref, uint32_t Size);<br>
>>>> ><br>
>>>> >    template <typename T> Error writeEnum(T Num) {<br>
>>>> >      return writeInteger(<br>
>>>> > @@ -77,7 +76,7 @@ public:<br>
>>>> >    uint32_t bytesRemaining() const { return getLength() - getOffset();<br>
>>>> > }<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  StreamRef Stream;<br>
>>>> > +  WritableStreamRef Stream;<br>
>>>> >    uint32_t Offset;<br>
>>>> >  };<br>
>>>> >  } // namespace msf<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/PDBTypes.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/PDBTypes.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/PDBTypes.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/PDBTypes.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/PDBTypes.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -12,9 +12,10 @@<br>
>>>> ><br>
>>>> >  #include "llvm/Config/llvm-config.h"<br>
>>>> >  #include "llvm/DebugInfo/CodeView/CodeView.h"<br>
>>>> > -#include <functional><br>
>>>> > +#include "llvm/DebugInfo/PDB/Raw/RawTypes.h"<br>
>>>> >  #include <cstdint><br>
>>>> >  #include <cstring><br>
>>>> > +#include <functional><br>
>>>> ><br>
>>>> >  namespace llvm {<br>
>>>> >  namespace pdb {<br>
>>>> > @@ -73,13 +74,6 @@ enum class PDB_ReaderType {<br>
>>>> >    Raw = 1,<br>
>>>> >  };<br>
>>>> ><br>
>>>> > -/// Defines a 128-bit unique identifier.  This maps to a GUID on<br>
>>>> > Windows, but<br>
>>>> > -/// is abstracted here for the purposes of non-Windows platforms that<br>
>>>> > don't have<br>
>>>> > -/// the GUID structure defined.<br>
>>>> > -struct PDB_UniqueId {<br>
>>>> > -  char Guid[16];<br>
>>>> > -};<br>
>>>> > -<br>
>>>> >  /// An enumeration indicating the type of data contained in this<br>
>>>> > table.<br>
>>>> >  enum class PDB_TableType {<br>
>>>> >    Symbols,<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStream.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStream.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStream.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStream.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStream.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -77,8 +77,6 @@ public:<br>
>>>> >    msf::FixedStreamArray<SecMapEntry> getSectionMap() const;<br>
>>>> >    void visitSectionContributions(ISectionContribVisitor &Visitor)<br>
>>>> > const;<br>
>>>> ><br>
>>>> > -  Error commit();<br>
>>>> > -<br>
>>>> >  private:<br>
>>>> >    Error initializeModInfoArray();<br>
>>>> >    Error initializeSectionContributionData();<br>
>>>> > @@ -93,14 +91,14 @@ private:<br>
>>>> >    std::vector<ModuleInfoEx> ModuleInfos;<br>
>>>> >    NameHashTable ECNames;<br>
>>>> ><br>
>>>> > -  msf::StreamRef ModInfoSubstream;<br>
>>>> > -  msf::StreamRef SecContrSubstream;<br>
>>>> > -  msf::StreamRef SecMapSubstream;<br>
>>>> > -  msf::StreamRef FileInfoSubstream;<br>
>>>> > -  msf::StreamRef TypeServerMapSubstream;<br>
>>>> > -  msf::StreamRef ECSubstream;<br>
>>>> > +  msf::ReadableStreamRef ModInfoSubstream;<br>
>>>> > +  msf::ReadableStreamRef SecContrSubstream;<br>
>>>> > +  msf::ReadableStreamRef SecMapSubstream;<br>
>>>> > +  msf::ReadableStreamRef FileInfoSubstream;<br>
>>>> > +  msf::ReadableStreamRef TypeServerMapSubstream;<br>
>>>> > +  msf::ReadableStreamRef ECSubstream;<br>
>>>> ><br>
>>>> > -  msf::StreamRef NamesBuffer;<br>
>>>> > +  msf::ReadableStreamRef NamesBuffer;<br>
>>>> ><br>
>>>> >    msf::FixedStreamArray<support::ulittle16_t> DbgStreams;<br>
>>>> ><br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h Thu<br>
>>>> > Jul 28 14:12:28 2016<br>
>>>> > @@ -23,6 +23,7 @@<br>
>>>> >  namespace llvm {<br>
>>>> >  namespace pdb {<br>
>>>> >  class DbiStream;<br>
>>>> > +struct DbiStreamHeader;<br>
>>>> >  class PDBFile;<br>
>>>> ><br>
>>>> >  class DbiStreamBuilder {<br>
>>>> > @@ -45,9 +46,13 @@ public:<br>
>>>> >    Error addModuleInfo(StringRef ObjFile, StringRef Module);<br>
>>>> >    Error addModuleSourceFile(StringRef Module, StringRef File);<br>
>>>> ><br>
>>>> > -  Expected<std::unique_ptr<DbiStream>> build(PDBFile &File);<br>
>>>> > +  Expected<std::unique_ptr<DbiStream>> build(PDBFile &File,<br>
>>>> > +                                             const msf::WritableStream<br>
>>>> > &Buffer);<br>
>>>> > +  Error commit(const msf::MsfLayout &Layout,<br>
>>>> > +               const msf::WritableStream &Buffer) const;<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > +  Error finalize();<br>
>>>> >    uint32_t calculateModiSubstreamSize() const;<br>
>>>> >    uint32_t calculateFileInfoSubstreamSize() const;<br>
>>>> >    uint32_t calculateNamesBufferSize() const;<br>
>>>> > @@ -71,14 +76,16 @@ private:<br>
>>>> >    uint16_t Flags;<br>
>>>> >    PDB_Machine MachineType;<br>
>>>> ><br>
>>>> > +  const DbiStreamHeader *Header;<br>
>>>> > +<br>
>>>> >    StringMap<std::unique_ptr<ModuleInfo>> ModuleInfos;<br>
>>>> >    std::vector<ModuleInfo *> ModuleInfoList;<br>
>>>> ><br>
>>>> >    StringMap<uint32_t> SourceFileNames;<br>
>>>> ><br>
>>>> > -  msf::StreamRef NamesBuffer;<br>
>>>> > -  msf::ByteStream<true> ModInfoBuffer;<br>
>>>> > -  msf::ByteStream<true> FileInfoBuffer;<br>
>>>> > +  msf::WritableStreamRef NamesBuffer;<br>
>>>> > +  msf::MutableByteStream ModInfoBuffer;<br>
>>>> > +  msf::MutableByteStream FileInfoBuffer;<br>
>>>> >  };<br>
>>>> >  }<br>
>>>> >  }<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStream.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStream.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStream.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStream.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStream.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -27,18 +27,10 @@ class PDBFile;<br>
>>>> >  class InfoStream {<br>
>>>> >    friend class InfoStreamBuilder;<br>
>>>> ><br>
>>>> > -  struct HeaderInfo {<br>
>>>> > -    support::ulittle32_t Version;<br>
>>>> > -    support::ulittle32_t Signature;<br>
>>>> > -    support::ulittle32_t Age;<br>
>>>> > -    PDB_UniqueId Guid;<br>
>>>> > -  };<br>
>>>> > -<br>
>>>> >  public:<br>
>>>> >    InfoStream(std::unique_ptr<msf::MappedBlockStream> Stream);<br>
>>>> ><br>
>>>> >    Error reload();<br>
>>>> > -  Error commit();<br>
>>>> ><br>
>>>> >    PdbRaw_ImplVer getVersion() const;<br>
>>>> >    uint32_t getSignature() const;<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h Thu<br>
>>>> > Jul 28 14:12:28 2016<br>
>>>> > @@ -19,6 +19,9 @@<br>
>>>> >  #include "llvm/DebugInfo/PDB/Raw/RawConstants.h"<br>
>>>> ><br>
>>>> >  namespace llvm {<br>
>>>> > +namespace msf {<br>
>>>> > +class StreamWriter;<br>
>>>> > +}<br>
>>>> >  namespace pdb {<br>
>>>> >  class PDBFile;<br>
>>>> ><br>
>>>> > @@ -37,13 +40,17 @@ public:<br>
>>>> ><br>
>>>> >    uint32_t calculateSerializedLength() const;<br>
>>>> ><br>
>>>> > -  Expected<std::unique_ptr<InfoStream>> build(PDBFile &File);<br>
>>>> > +  Expected<std::unique_ptr<InfoStream>><br>
>>>> > +  build(PDBFile &File, const msf::WritableStream &Buffer);<br>
>>>> > +<br>
>>>> > +  Error commit(const msf::MsfLayout &Layout,<br>
>>>> > +               const msf::WritableStream &Buffer) const;<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  Optional<PdbRaw_ImplVer> Ver;<br>
>>>> > -  Optional<uint32_t> Sig;<br>
>>>> > -  Optional<uint32_t> Age;<br>
>>>> > -  Optional<PDB_UniqueId> Guid;<br>
>>>> > +  PdbRaw_ImplVer Ver;<br>
>>>> > +  uint32_t Sig;<br>
>>>> > +  uint32_t Age;<br>
>>>> > +  PDB_UniqueId Guid;<br>
>>>> ><br>
>>>> >    NameMapBuilder NamedStreams;<br>
>>>> >  };<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -29,7 +29,7 @@ public:<br>
>>>> >    ModInfo(const ModInfo &Info);<br>
>>>> >    ~ModInfo();<br>
>>>> ><br>
>>>> > -  static Error initialize(msf::StreamRef Stream, ModInfo &Info);<br>
>>>> > +  static Error initialize(msf::ReadableStreamRef Stream, ModInfo<br>
>>>> > &Info);<br>
>>>> ><br>
>>>> >    bool hasECInfo() const;<br>
>>>> >    uint16_t getTypeServerIndex() const;<br>
>>>> > @@ -65,7 +65,7 @@ struct ModuleInfoEx {<br>
>>>> ><br>
>>>> >  namespace msf {<br>
>>>> >  template <> struct VarStreamArrayExtractor<pdb::ModInfo> {<br>
>>>> > -  Error operator()(StreamRef Stream, uint32_t &Length,<br>
>>>> > +  Error operator()(ReadableStreamRef Stream, uint32_t &Length,<br>
>>>> >                     pdb::ModInfo &Info) const {<br>
>>>> >      if (auto EC = pdb::ModInfo::initialize(Stream, Info))<br>
>>>> >        return EC;<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -46,9 +46,9 @@ private:<br>
>>>> >    std::unique_ptr<msf::MappedBlockStream> Stream;<br>
>>>> ><br>
>>>> >    codeview::CVSymbolArray SymbolsSubstream;<br>
>>>> > -  msf::StreamRef LinesSubstream;<br>
>>>> > -  msf::StreamRef C13LinesSubstream;<br>
>>>> > -  msf::StreamRef GlobalRefsSubstream;<br>
>>>> > +  msf::ReadableStreamRef LinesSubstream;<br>
>>>> > +  msf::ReadableStreamRef C13LinesSubstream;<br>
>>>> > +  msf::ReadableStreamRef GlobalRefsSubstream;<br>
>>>> ><br>
>>>> >    codeview::ModuleSubstreamArray LineInfo;<br>
>>>> >  };<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameHashTable.h Thu Jul<br>
>>>> > 28 14:12:28 2016<br>
>>>> > @@ -41,7 +41,7 @@ public:<br>
>>>> >    msf::FixedStreamArray<support::ulittle32_t> name_ids() const;<br>
>>>> ><br>
>>>> >  private:<br>
>>>> > -  msf::StreamRef NamesBuffer;<br>
>>>> > +  msf::ReadableStreamRef NamesBuffer;<br>
>>>> >    msf::FixedStreamArray<support::ulittle32_t> IDs;<br>
>>>> >    uint32_t Signature;<br>
>>>> >    uint32_t HashVersion;<br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMap.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMap.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMap.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMap.h (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMap.h Thu Jul 28<br>
>>>> > 14:12:28 2016<br>
>>>> > @@ -29,7 +29,6 @@ public:<br>
>>>> >    NameMap();<br>
>>>> ><br>
>>>> >    Error load(msf::StreamReader &Stream);<br>
>>>> > -  Error commit(msf::StreamWriter &Writer);<br>
>>>> ><br>
>>>> >    bool tryGetValue(StringRef Name, uint32_t &Value) const;<br>
>>>> ><br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h?rev=277019&r1=277018&r2=277019&view=diff</a><br>
>>>> ><br>
>>>> > ==============================================================================<br>
>>>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h<br>
>>>> > (original)<br>
>>>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/NameMapBuilder.h Thu Jul<br>
>>>> > 28 14:12:28 2016<br>
>>>> > @@ -17,6 +17,9 @@<br>
>>>> >  #include <memory><br>
>>>> ><br>
>>>> >  namespace llvm {<br>
>>>> > +namespace msf {<br>
>>>> > +class StreamWriter;<br>
>>>> > +}<br>
>>>> >  namespace pdb {<br>
>>>> >  class NameMap;<br>
>>>> ><br>
>>>> > @@ -27,6 +30,7 @@ public:<br>
>>>> >    void addMapping(StringRef Name, uint32_t Mapping);<br>
>>>> ><br>
>>>> >    Expected<std::unique_ptr<NameMap>> build();<br>
>>>> > +  Error commit(msf::StreamWriter &Writer) const;<br>
>>>> ><br>
>>>> >    uint32_t calculateSerializedLength() const;<br>
>>>> ><br>
>>>> ><br>
>>>> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h<br>
>>>> > URL:<br>
>>>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PDBFile.h?rev=277019&r1=277018&r2=277019&view=diff" rel="noreferrer" target="_blank"></a></blockquote></div>