Can you disable this test for now? I can take a look on Monday <br><div class="gmail_quote"><div dir="ltr">On Sat, Feb 25, 2017 at 11:29 PM Vedant Kumar <<a href="mailto:vsk@apple.com">vsk@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Also, I'd appreciate it if you could separate the NFC renaming/doc update changes, test additions, and bug fixes into separate commits to make them easier to follow.<br class="gmail_msg">
<br class="gmail_msg">
thanks,<br class="gmail_msg">
vedant<br class="gmail_msg">
<br class="gmail_msg">
> On Feb 24, 2017, at 4:44 PM, Zachary Turner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
> Author: zturner<br class="gmail_msg">
> Date: Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> New Revision: 296215<br class="gmail_msg">
><br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=296215&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=296215&view=rev</a><br class="gmail_msg">
> Log:<br class="gmail_msg">
> [PDB] General improvements to Stream library.<br class="gmail_msg">
><br class="gmail_msg">
> This adds various new functionality and cleanup surrounding the<br class="gmail_msg">
> use of the Stream library. Major changes include:<br class="gmail_msg">
><br class="gmail_msg">
> * Renaming of all classes for more consistency / meaningfulness<br class="gmail_msg">
> * Addition of some new methods for reading multiple values at once.<br class="gmail_msg">
> * Full suite of unit tests for reader / writer functionality.<br class="gmail_msg">
> * Full set of doxygen comments for all classes.<br class="gmail_msg">
> * Streams now store their own endianness.<br class="gmail_msg">
> * Fixed some bugs in a few of the classes that were discovered<br class="gmail_msg">
> by the unit tests.<br class="gmail_msg">
><br class="gmail_msg">
> Added:<br class="gmail_msg">
> llvm/trunk/unittests/DebugInfo/PDB/BinaryStreamTest.cpp<br class="gmail_msg">
> Modified:<br class="gmail_msg">
> llvm/trunk/include/llvm/ADT/STLExtras.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/RecordSerialization.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryByteStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryItemStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamArray.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamReader.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamRef.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamWriter.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/MSF/MappedBlockStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/GlobalsStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/HashTable.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModInfo.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/NamedStreamMap.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/PDBFile.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/PublicsStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/StringTable.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/StringTableBuilder.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiHashing.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiStream.h<br class="gmail_msg">
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h<br class="gmail_msg">
> llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/CVTypeDumper.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/ModuleSubstreamVisitor.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/RecordSerialization.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/CodeView/TypeSerializer.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/MSF/BinaryStreamReader.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/MSF/BinaryStreamWriter.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/MSF/MappedBlockStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/DbiStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/GSI.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/GSI.h<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/GlobalsStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/HashTable.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/ModInfo.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/ModStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/NamedStreamMap.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/NativeSession.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/PDBFile.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/PublicsStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/StringTable.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/StringTableBuilder.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/SymbolStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/TpiStream.cpp<br class="gmail_msg">
> llvm/trunk/lib/DebugInfo/PDB/Native/TpiStreamBuilder.cpp<br class="gmail_msg">
> llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp<br class="gmail_msg">
> llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.cpp<br class="gmail_msg">
> llvm/trunk/tools/llvm-readobj/COFFDumper.cpp<br class="gmail_msg">
> llvm/trunk/unittests/DebugInfo/PDB/CMakeLists.txt<br class="gmail_msg">
> llvm/trunk/unittests/DebugInfo/PDB/HashTableTest.cpp<br class="gmail_msg">
> llvm/trunk/unittests/DebugInfo/PDB/MappedBlockStreamTest.cpp<br class="gmail_msg">
> llvm/trunk/unittests/DebugInfo/PDB/StringTableBuilderTest.cpp<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/ADT/STLExtras.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/STLExtras.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/ADT/STLExtras.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/ADT/STLExtras.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -640,6 +640,16 @@ detail::concat_range<ValueT, RangeTs...><br class="gmail_msg">
> // Extra additions to <utility><br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
><br class="gmail_msg">
> +/// \brief Template class to compute the sum of sizes of all items in a<br class="gmail_msg">
> +/// parameter pack.<br class="gmail_msg">
> +template <typename T, typename... Ts> struct sizeof_sum {<br class="gmail_msg">
> + static const size_t value = sizeof(T) + sizeof_sum<Ts...>::value;<br class="gmail_msg">
> +};<br class="gmail_msg">
> +<br class="gmail_msg">
> +template <typename T> struct sizeof_sum<T> {<br class="gmail_msg">
> + static const size_t value = sizeof(T);<br class="gmail_msg">
> +};<br class="gmail_msg">
> +<br class="gmail_msg">
> /// \brief Function object to check whether the first component of a std::pair<br class="gmail_msg">
> /// compares less than the first component of another std::pair.<br class="gmail_msg">
> struct less_first {<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -48,15 +48,13 @@ public:<br class="gmail_msg">
><br class="gmail_msg">
> } // end namespace codeview<br class="gmail_msg">
><br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> -<br class="gmail_msg">
> template <typename Kind><br class="gmail_msg">
> struct VarStreamArrayExtractor<codeview::CVRecord<Kind>> {<br class="gmail_msg">
> - Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> + Error operator()(BinaryStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> codeview::CVRecord<Kind> &Item) const {<br class="gmail_msg">
> using namespace codeview;<br class="gmail_msg">
> const RecordPrefix *Prefix = nullptr;<br class="gmail_msg">
> - StreamReader Reader(Stream);<br class="gmail_msg">
> + BinaryStreamReader Reader(Stream);<br class="gmail_msg">
> uint32_t Offset = Reader.getOffset();<br class="gmail_msg">
><br class="gmail_msg">
> if (auto EC = Reader.readObject(Prefix))<br class="gmail_msg">
> @@ -76,8 +74,6 @@ struct VarStreamArrayExtractor<codeview:<br class="gmail_msg">
> }<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> -<br class="gmail_msg">
> } // end namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> #endif // LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -34,7 +34,7 @@ public:<br class="gmail_msg">
> Error visitTypeStream(CVTypeRange Types);<br class="gmail_msg">
><br class="gmail_msg">
> Error visitFieldListMemberStream(ArrayRef<uint8_t> FieldList);<br class="gmail_msg">
> - Error visitFieldListMemberStream(msf::StreamReader Reader);<br class="gmail_msg">
> + Error visitFieldListMemberStream(BinaryStreamReader Reader);<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> /// The interface to the class that gets notified of each visitation.<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -33,8 +33,8 @@ class CodeViewRecordIO {<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit CodeViewRecordIO(msf::StreamReader &Reader) : Reader(&Reader) {}<br class="gmail_msg">
> - explicit CodeViewRecordIO(msf::StreamWriter &Writer) : Writer(&Writer) {}<br class="gmail_msg">
> + explicit CodeViewRecordIO(BinaryStreamReader &Reader) : Reader(&Reader) {}<br class="gmail_msg">
> + explicit CodeViewRecordIO(BinaryStreamWriter &Writer) : Writer(&Writer) {}<br class="gmail_msg">
><br class="gmail_msg">
> Error beginRecord(Optional<uint32_t> MaxLength);<br class="gmail_msg">
> Error endRecord();<br class="gmail_msg">
> @@ -59,9 +59,9 @@ public:<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T> Error mapInteger(T &Value) {<br class="gmail_msg">
> if (isWriting())<br class="gmail_msg">
> - return Writer->writeInteger(Value, llvm::support::little);<br class="gmail_msg">
> + return Writer->writeInteger(Value);<br class="gmail_msg">
><br class="gmail_msg">
> - return Reader->readInteger(Value, llvm::support::little);<br class="gmail_msg">
> + return Reader->readInteger(Value);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T> Error mapEnum(T &Value) {<br class="gmail_msg">
> @@ -93,7 +93,7 @@ public:<br class="gmail_msg">
> SizeType Size;<br class="gmail_msg">
> if (isWriting()) {<br class="gmail_msg">
> Size = static_cast<SizeType>(Items.size());<br class="gmail_msg">
> - if (auto EC = Writer->writeInteger(Size, llvm::support::little))<br class="gmail_msg">
> + if (auto EC = Writer->writeInteger(Size))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
><br class="gmail_msg">
> for (auto &X : Items) {<br class="gmail_msg">
> @@ -101,7 +101,7 @@ public:<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> }<br class="gmail_msg">
> } else {<br class="gmail_msg">
> - if (auto EC = Reader->readInteger(Size, llvm::support::little))<br class="gmail_msg">
> + if (auto EC = Reader->readInteger(Size))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> for (SizeType I = 0; I < Size; ++I) {<br class="gmail_msg">
> typename T::value_type Item;<br class="gmail_msg">
> @@ -160,8 +160,8 @@ private:<br class="gmail_msg">
><br class="gmail_msg">
> SmallVector<RecordLimit, 2> Limits;<br class="gmail_msg">
><br class="gmail_msg">
> - msf::StreamReader *Reader = nullptr;<br class="gmail_msg">
> - msf::StreamWriter *Writer = nullptr;<br class="gmail_msg">
> + BinaryStreamReader *Reader = nullptr;<br class="gmail_msg">
> + BinaryStreamWriter *Writer = nullptr;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> } // end namespace codeview<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstream.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -59,23 +59,22 @@ struct ColumnNumberEntry {<br class="gmail_msg">
> class ModuleSubstream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> ModuleSubstream();<br class="gmail_msg">
> - ModuleSubstream(ModuleSubstreamKind Kind, msf::ReadableStreamRef Data);<br class="gmail_msg">
> - static Error initialize(msf::ReadableStreamRef Stream, ModuleSubstream &Info);<br class="gmail_msg">
> + ModuleSubstream(ModuleSubstreamKind Kind, BinaryStreamRef Data);<br class="gmail_msg">
> + static Error initialize(BinaryStreamRef Stream, ModuleSubstream &Info);<br class="gmail_msg">
> uint32_t getRecordLength() const;<br class="gmail_msg">
> ModuleSubstreamKind getSubstreamKind() const;<br class="gmail_msg">
> - msf::ReadableStreamRef getRecordData() const;<br class="gmail_msg">
> + BinaryStreamRef getRecordData() const;<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> ModuleSubstreamKind Kind;<br class="gmail_msg">
> - msf::ReadableStreamRef Data;<br class="gmail_msg">
> + BinaryStreamRef Data;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -typedef msf::VarStreamArray<ModuleSubstream> ModuleSubstreamArray;<br class="gmail_msg">
> +typedef VarStreamArray<ModuleSubstream> ModuleSubstreamArray;<br class="gmail_msg">
> } // namespace codeview<br class="gmail_msg">
><br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> template <> struct VarStreamArrayExtractor<codeview::ModuleSubstream> {<br class="gmail_msg">
> - Error operator()(ReadableStreamRef Stream, uint32_t &Length,<br class="gmail_msg">
> + Error operator()(BinaryStreamRef Stream, uint32_t &Length,<br class="gmail_msg">
> codeview::ModuleSubstream &Info) const {<br class="gmail_msg">
> if (auto EC = codeview::ModuleSubstream::initialize(Stream, Info))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> @@ -83,7 +82,6 @@ template <> struct VarStreamArrayExtract<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
> };<br class="gmail_msg">
> -} // namespace msf<br class="gmail_msg">
> } // namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> #endif // LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleSubstreamVisitor.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -28,8 +28,8 @@ namespace codeview {<br class="gmail_msg">
><br class="gmail_msg">
> struct LineColumnEntry {<br class="gmail_msg">
> support::ulittle32_t NameIndex;<br class="gmail_msg">
> - msf::FixedStreamArray<LineNumberEntry> LineNumbers;<br class="gmail_msg">
> - msf::FixedStreamArray<ColumnNumberEntry> Columns;<br class="gmail_msg">
> + FixedStreamArray<LineNumberEntry> LineNumbers;<br class="gmail_msg">
> + FixedStreamArray<ColumnNumberEntry> Columns;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> struct FileChecksumEntry {<br class="gmail_msg">
> @@ -38,49 +38,47 @@ struct FileChecksumEntry {<br class="gmail_msg">
> ArrayRef<uint8_t> Checksum; // The bytes of the checksum.<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -typedef msf::VarStreamArray<LineColumnEntry> LineInfoArray;<br class="gmail_msg">
> -typedef msf::VarStreamArray<FileChecksumEntry> FileChecksumArray;<br class="gmail_msg">
> +typedef VarStreamArray<LineColumnEntry> LineInfoArray;<br class="gmail_msg">
> +typedef VarStreamArray<FileChecksumEntry> FileChecksumArray;<br class="gmail_msg">
><br class="gmail_msg">
> class IModuleSubstreamVisitor {<br class="gmail_msg">
> public:<br class="gmail_msg">
> virtual ~IModuleSubstreamVisitor() = default;<br class="gmail_msg">
><br class="gmail_msg">
> virtual Error visitUnknown(ModuleSubstreamKind Kind,<br class="gmail_msg">
> - msf::ReadableStreamRef Data) = 0;<br class="gmail_msg">
> - virtual Error visitSymbols(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitLines(msf::ReadableStreamRef Data,<br class="gmail_msg">
> + BinaryStreamRef Data) = 0;<br class="gmail_msg">
> + virtual Error visitSymbols(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitLines(BinaryStreamRef Data,<br class="gmail_msg">
> const LineSubstreamHeader *Header,<br class="gmail_msg">
> const LineInfoArray &Lines);<br class="gmail_msg">
> - virtual Error visitStringTable(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitFileChecksums(msf::ReadableStreamRef Data,<br class="gmail_msg">
> + virtual Error visitStringTable(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitFileChecksums(BinaryStreamRef Data,<br class="gmail_msg">
> const FileChecksumArray &Checksums);<br class="gmail_msg">
> - virtual Error visitFrameData(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitInlineeLines(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitCrossScopeImports(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitCrossScopeExports(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitILLines(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitFuncMDTokenMap(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitTypeMDTokenMap(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitMergedAssemblyInput(msf::ReadableStreamRef Data);<br class="gmail_msg">
> - virtual Error visitCoffSymbolRVA(msf::ReadableStreamRef Data);<br class="gmail_msg">
> + virtual Error visitFrameData(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitInlineeLines(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitCrossScopeImports(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitCrossScopeExports(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitILLines(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitFuncMDTokenMap(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitTypeMDTokenMap(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitMergedAssemblyInput(BinaryStreamRef Data);<br class="gmail_msg">
> + virtual Error visitCoffSymbolRVA(BinaryStreamRef Data);<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> Error visitModuleSubstream(const ModuleSubstream &R,<br class="gmail_msg">
> IModuleSubstreamVisitor &V);<br class="gmail_msg">
> } // end namespace codeview<br class="gmail_msg">
><br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> -<br class="gmail_msg">
> template <> class VarStreamArrayExtractor<codeview::LineColumnEntry> {<br class="gmail_msg">
> public:<br class="gmail_msg">
> VarStreamArrayExtractor(const codeview::LineSubstreamHeader *Header)<br class="gmail_msg">
> : Header(Header) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> + Error operator()(BinaryStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> codeview::LineColumnEntry &Item) const {<br class="gmail_msg">
> using namespace codeview;<br class="gmail_msg">
> const LineFileBlockHeader *BlockHeader;<br class="gmail_msg">
> - StreamReader Reader(Stream);<br class="gmail_msg">
> + BinaryStreamReader Reader(Stream);<br class="gmail_msg">
> if (auto EC = Reader.readObject(BlockHeader))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> bool HasColumn = Header->Flags & LineFlags::HaveColumns;<br class="gmail_msg">
> @@ -113,11 +111,11 @@ private:<br class="gmail_msg">
><br class="gmail_msg">
> template <> class VarStreamArrayExtractor<codeview::FileChecksumEntry> {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> + Error operator()(BinaryStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> codeview::FileChecksumEntry &Item) const {<br class="gmail_msg">
> using namespace codeview;<br class="gmail_msg">
> const FileChecksum *Header;<br class="gmail_msg">
> - StreamReader Reader(Stream);<br class="gmail_msg">
> + BinaryStreamReader Reader(Stream);<br class="gmail_msg">
> if (auto EC = Reader.readObject(Header))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> Item.FileNameOffset = Header->FileNameOffset;<br class="gmail_msg">
> @@ -129,8 +127,6 @@ public:<br class="gmail_msg">
> }<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> -<br class="gmail_msg">
> } // end namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> #endif // LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/RecordSerialization.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/RecordSerialization.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/RecordSerialization.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/RecordSerialization.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/RecordSerialization.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -41,37 +41,37 @@ struct RecordPrefix {<br class="gmail_msg">
> StringRef getBytesAsCharacters(ArrayRef<uint8_t> LeafData);<br class="gmail_msg">
> StringRef getBytesAsCString(ArrayRef<uint8_t> LeafData);<br class="gmail_msg">
><br class="gmail_msg">
> -inline Error consume(msf::StreamReader &Reader) { return Error::success(); }<br class="gmail_msg">
> +inline Error consume(BinaryStreamReader &Reader) { return Error::success(); }<br class="gmail_msg">
><br class="gmail_msg">
> /// Decodes a numeric "leaf" value. These are integer literals encountered in<br class="gmail_msg">
> /// the type stream. If the value is positive and less than LF_NUMERIC (1 <<<br class="gmail_msg">
> /// 15), it is emitted directly in Data. Otherwise, it has a tag like LF_CHAR<br class="gmail_msg">
> /// that indicates the bitwidth and sign of the numeric data.<br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader, APSInt &Num);<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader, APSInt &Num);<br class="gmail_msg">
><br class="gmail_msg">
> /// Decodes a numeric leaf value that is known to be a particular type.<br class="gmail_msg">
> -Error consume_numeric(msf::StreamReader &Reader, uint64_t &Value);<br class="gmail_msg">
> +Error consume_numeric(BinaryStreamReader &Reader, uint64_t &Value);<br class="gmail_msg">
><br class="gmail_msg">
> /// Decodes signed and unsigned fixed-length integers.<br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader, uint32_t &Item);<br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader, int32_t &Item);<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader, uint32_t &Item);<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader, int32_t &Item);<br class="gmail_msg">
><br class="gmail_msg">
> /// Decodes a null terminated string.<br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader, StringRef &Item);<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader, StringRef &Item);<br class="gmail_msg">
><br class="gmail_msg">
> Error consume(StringRef &Data, APSInt &Num);<br class="gmail_msg">
> Error consume(StringRef &Data, uint32_t &Item);<br class="gmail_msg">
><br class="gmail_msg">
> /// Decodes an arbitrary object whose layout matches that of the underlying<br class="gmail_msg">
> /// byte sequence, and returns a pointer to the object.<br class="gmail_msg">
> -template <typename T> Error consume(msf::StreamReader &Reader, T *&Item) {<br class="gmail_msg">
> +template <typename T> Error consume(BinaryStreamReader &Reader, T *&Item) {<br class="gmail_msg">
> return Reader.readObject(Item);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T, typename U> struct serialize_conditional_impl {<br class="gmail_msg">
> serialize_conditional_impl(T &Item, U Func) : Item(Item), Func(Func) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error deserialize(msf::StreamReader &Reader) const {<br class="gmail_msg">
> + Error deserialize(BinaryStreamReader &Reader) const {<br class="gmail_msg">
> if (!Func())<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> return consume(Reader, Item);<br class="gmail_msg">
> @@ -89,7 +89,7 @@ serialize_conditional_impl<T, U> seriali<br class="gmail_msg">
> template <typename T, typename U> struct serialize_array_impl {<br class="gmail_msg">
> serialize_array_impl(ArrayRef<T> &Item, U Func) : Item(Item), Func(Func) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error deserialize(msf::StreamReader &Reader) const {<br class="gmail_msg">
> + Error deserialize(BinaryStreamReader &Reader) const {<br class="gmail_msg">
> return Reader.readArray(Item, Func());<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> @@ -100,7 +100,7 @@ template <typename T, typename U> struct<br class="gmail_msg">
> template <typename T> struct serialize_vector_tail_impl {<br class="gmail_msg">
> serialize_vector_tail_impl(std::vector<T> &Item) : Item(Item) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error deserialize(msf::StreamReader &Reader) const {<br class="gmail_msg">
> + Error deserialize(BinaryStreamReader &Reader) const {<br class="gmail_msg">
> T Field;<br class="gmail_msg">
> // Stop when we run out of bytes or we hit record padding bytes.<br class="gmail_msg">
> while (!Reader.empty() && Reader.peek() < LF_PAD0) {<br class="gmail_msg">
> @@ -118,14 +118,14 @@ struct serialize_null_term_string_array_<br class="gmail_msg">
> serialize_null_term_string_array_impl(std::vector<StringRef> &Item)<br class="gmail_msg">
> : Item(Item) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error deserialize(msf::StreamReader &Reader) const {<br class="gmail_msg">
> + Error deserialize(BinaryStreamReader &Reader) const {<br class="gmail_msg">
> if (Reader.empty())<br class="gmail_msg">
> return make_error<CodeViewError>(cv_error_code::insufficient_buffer,<br class="gmail_msg">
> "Null terminated string is empty!");<br class="gmail_msg">
><br class="gmail_msg">
> while (Reader.peek() != 0) {<br class="gmail_msg">
> StringRef Field;<br class="gmail_msg">
> - if (auto EC = Reader.readZeroString(Field))<br class="gmail_msg">
> + if (auto EC = Reader.readCString(Field))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> Item.push_back(Field);<br class="gmail_msg">
> }<br class="gmail_msg">
> @@ -138,7 +138,7 @@ struct serialize_null_term_string_array_<br class="gmail_msg">
> template <typename T> struct serialize_arrayref_tail_impl {<br class="gmail_msg">
> serialize_arrayref_tail_impl(ArrayRef<T> &Item) : Item(Item) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error deserialize(msf::StreamReader &Reader) const {<br class="gmail_msg">
> + Error deserialize(BinaryStreamReader &Reader) const {<br class="gmail_msg">
> uint32_t Count = Reader.bytesRemaining() / sizeof(T);<br class="gmail_msg">
> return Reader.readArray(Item, Count);<br class="gmail_msg">
> }<br class="gmail_msg">
> @@ -149,7 +149,7 @@ template <typename T> struct serialize_a<br class="gmail_msg">
> template <typename T> struct serialize_numeric_impl {<br class="gmail_msg">
> serialize_numeric_impl(T &Item) : Item(Item) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error deserialize(msf::StreamReader &Reader) const {<br class="gmail_msg">
> + Error deserialize(BinaryStreamReader &Reader) const {<br class="gmail_msg">
> return consume_numeric(Reader, Item);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> @@ -201,42 +201,42 @@ template <typename T> serialize_numeric_<br class="gmail_msg">
> #define CV_NUMERIC_FIELD(I) serialize_numeric(I)<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T, typename U><br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader,<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader,<br class="gmail_msg">
> const serialize_conditional_impl<T, U> &Item) {<br class="gmail_msg">
> return Item.deserialize(Reader);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T, typename U><br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader,<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader,<br class="gmail_msg">
> const serialize_array_impl<T, U> &Item) {<br class="gmail_msg">
> return Item.deserialize(Reader);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> -inline Error consume(msf::StreamReader &Reader,<br class="gmail_msg">
> +inline Error consume(BinaryStreamReader &Reader,<br class="gmail_msg">
> const serialize_null_term_string_array_impl &Item) {<br class="gmail_msg">
> return Item.deserialize(Reader);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T><br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader,<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader,<br class="gmail_msg">
> const serialize_vector_tail_impl<T> &Item) {<br class="gmail_msg">
> return Item.deserialize(Reader);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T><br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader,<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader,<br class="gmail_msg">
> const serialize_arrayref_tail_impl<T> &Item) {<br class="gmail_msg">
> return Item.deserialize(Reader);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T><br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader,<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader,<br class="gmail_msg">
> const serialize_numeric_impl<T> &Item) {<br class="gmail_msg">
> return Item.deserialize(Reader);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T, typename U, typename... Args><br class="gmail_msg">
> -Error consume(msf::StreamReader &Reader, T &&X, U &&Y, Args &&... Rest) {<br class="gmail_msg">
> +Error consume(BinaryStreamReader &Reader, T &&X, U &&Y, Args &&... Rest) {<br class="gmail_msg">
> if (auto EC = consume(Reader, X))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
> return consume(Reader, Y, std::forward<Args>(Rest)...);<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -25,10 +25,11 @@ class SymbolVisitorDelegate;<br class="gmail_msg">
> class SymbolDeserializer : public SymbolVisitorCallbacks {<br class="gmail_msg">
> struct MappingInfo {<br class="gmail_msg">
> explicit MappingInfo(ArrayRef<uint8_t> RecordData)<br class="gmail_msg">
> - : Stream(RecordData), Reader(Stream), Mapping(Reader) {}<br class="gmail_msg">
> + : Stream(RecordData, llvm::support::little), Reader(Stream),<br class="gmail_msg">
> + Mapping(Reader) {}<br class="gmail_msg">
><br class="gmail_msg">
> - msf::ByteStream Stream;<br class="gmail_msg">
> - msf::StreamReader Reader;<br class="gmail_msg">
> + BinaryByteStream Stream;<br class="gmail_msg">
> + BinaryStreamReader Reader;<br class="gmail_msg">
> SymbolRecordMapping Mapping;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -938,7 +938,7 @@ public:<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> typedef CVRecord<SymbolKind> CVSymbol;<br class="gmail_msg">
> -typedef msf::VarStreamArray<CVSymbol> CVSymbolArray;<br class="gmail_msg">
> +typedef VarStreamArray<CVSymbol> CVSymbolArray;<br class="gmail_msg">
><br class="gmail_msg">
> } // end namespace codeview<br class="gmail_msg">
> } // end namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -14,16 +14,14 @@<br class="gmail_msg">
> #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"<br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> -class StreamReader;<br class="gmail_msg">
> -class StreamWriter;<br class="gmail_msg">
> -}<br class="gmail_msg">
> +class BinaryStreamReader;<br class="gmail_msg">
> +class BinaryStreamWriter;<br class="gmail_msg">
><br class="gmail_msg">
> namespace codeview {<br class="gmail_msg">
> class SymbolRecordMapping : public SymbolVisitorCallbacks {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit SymbolRecordMapping(msf::StreamReader &Reader) : IO(Reader) {}<br class="gmail_msg">
> - explicit SymbolRecordMapping(msf::StreamWriter &Writer) : IO(Writer) {}<br class="gmail_msg">
> + explicit SymbolRecordMapping(BinaryStreamReader &Reader) : IO(Reader) {}<br class="gmail_msg">
> + explicit SymbolRecordMapping(BinaryStreamWriter &Writer) : IO(Writer) {}<br class="gmail_msg">
><br class="gmail_msg">
> Error visitSymbolBegin(CVSymbol &Record) override;<br class="gmail_msg">
> Error visitSymbolEnd(CVSymbol &Record) override;<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -20,6 +20,8 @@<br class="gmail_msg">
> #include "llvm/ADT/StringMap.h"<br class="gmail_msg">
> #include "llvm/ADT/StringRef.h"<br class="gmail_msg">
> #include "llvm/ADT/iterator_range.h"<br class="gmail_msg">
> +#include "llvm/DebugInfo/MSF/BinaryByteStream.h"<br class="gmail_msg">
> +#include "llvm/DebugInfo/MSF/BinaryStreamWriter.h"<br class="gmail_msg">
> #include "llvm/Support/Allocator.h"<br class="gmail_msg">
> #include "llvm/Support/Error.h"<br class="gmail_msg">
><br class="gmail_msg">
> @@ -28,7 +30,7 @@ namespace codeview {<br class="gmail_msg">
><br class="gmail_msg">
> class SymbolSerializer : public SymbolVisitorCallbacks {<br class="gmail_msg">
> uint32_t RecordStart = 0;<br class="gmail_msg">
> - msf::StreamWriter &Writer;<br class="gmail_msg">
> + BinaryStreamWriter &Writer;<br class="gmail_msg">
> SymbolRecordMapping Mapping;<br class="gmail_msg">
> Optional<SymbolKind> CurrentSymbol;<br class="gmail_msg">
><br class="gmail_msg">
> @@ -42,7 +44,7 @@ class SymbolSerializer : public SymbolVi<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit SymbolSerializer(msf::StreamWriter &Writer)<br class="gmail_msg">
> + explicit SymbolSerializer(BinaryStreamWriter &Writer)<br class="gmail_msg">
> : Writer(Writer), Mapping(Writer) {}<br class="gmail_msg">
><br class="gmail_msg">
> virtual Error visitSymbolBegin(CVSymbol &Record) override {<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -15,9 +15,7 @@<br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
><br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> -class StreamReader;<br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> +class BinaryStreamReader;<br class="gmail_msg">
><br class="gmail_msg">
> namespace codeview {<br class="gmail_msg">
><br class="gmail_msg">
> @@ -25,7 +23,7 @@ class SymbolVisitorDelegate {<br class="gmail_msg">
> public:<br class="gmail_msg">
> virtual ~SymbolVisitorDelegate() = default;<br class="gmail_msg">
><br class="gmail_msg">
> - virtual uint32_t getRecordOffset(msf::StreamReader Reader) = 0;<br class="gmail_msg">
> + virtual uint32_t getRecordOffset(BinaryStreamReader Reader) = 0;<br class="gmail_msg">
> virtual StringRef getFileNameForFileOffset(uint32_t FileOffset) = 0;<br class="gmail_msg">
> virtual StringRef getStringTable() = 0;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -29,10 +29,11 @@ namespace codeview {<br class="gmail_msg">
> class TypeDeserializer : public TypeVisitorCallbacks {<br class="gmail_msg">
> struct MappingInfo {<br class="gmail_msg">
> explicit MappingInfo(ArrayRef<uint8_t> RecordData)<br class="gmail_msg">
> - : Stream(RecordData), Reader(Stream), Mapping(Reader) {}<br class="gmail_msg">
> + : Stream(RecordData, llvm::support::little), Reader(Stream),<br class="gmail_msg">
> + Mapping(Reader) {}<br class="gmail_msg">
><br class="gmail_msg">
> - msf::ByteStream Stream;<br class="gmail_msg">
> - msf::StreamReader Reader;<br class="gmail_msg">
> + BinaryByteStream Stream;<br class="gmail_msg">
> + BinaryStreamReader Reader;<br class="gmail_msg">
> TypeRecordMapping Mapping;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> @@ -72,16 +73,16 @@ private:<br class="gmail_msg">
><br class="gmail_msg">
> class FieldListDeserializer : public TypeVisitorCallbacks {<br class="gmail_msg">
> struct MappingInfo {<br class="gmail_msg">
> - explicit MappingInfo(msf::StreamReader &R)<br class="gmail_msg">
> + explicit MappingInfo(BinaryStreamReader &R)<br class="gmail_msg">
> : Reader(R), Mapping(Reader), StartOffset(0) {}<br class="gmail_msg">
><br class="gmail_msg">
> - msf::StreamReader &Reader;<br class="gmail_msg">
> + BinaryStreamReader &Reader;<br class="gmail_msg">
> TypeRecordMapping Mapping;<br class="gmail_msg">
> uint32_t StartOffset;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit FieldListDeserializer(msf::StreamReader &Reader) : Mapping(Reader) {<br class="gmail_msg">
> + explicit FieldListDeserializer(BinaryStreamReader &Reader) : Mapping(Reader) {<br class="gmail_msg">
> CVType FieldList;<br class="gmail_msg">
> FieldList.Type = TypeLeafKind::LF_FIELDLIST;<br class="gmail_msg">
> consumeError(Mapping.Mapping.visitTypeBegin(FieldList));<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -26,9 +26,7 @@<br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
><br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> -class StreamReader;<br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> +class BinaryStreamReader;<br class="gmail_msg">
><br class="gmail_msg">
> namespace codeview {<br class="gmail_msg">
><br class="gmail_msg">
> @@ -42,7 +40,7 @@ struct CVMemberRecord {<br class="gmail_msg">
> TypeLeafKind Kind;<br class="gmail_msg">
> ArrayRef<uint8_t> Data;<br class="gmail_msg">
> };<br class="gmail_msg">
> -typedef msf::VarStreamArray<CVType> CVTypeArray;<br class="gmail_msg">
> +typedef VarStreamArray<CVType> CVTypeArray;<br class="gmail_msg">
> typedef iterator_range<CVTypeArray::Iterator> CVTypeRange;<br class="gmail_msg">
><br class="gmail_msg">
> /// Equvalent to CV_fldattr_t in cvinfo.h.<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -16,15 +16,14 @@<br class="gmail_msg">
> #include "llvm/Support/Error.h"<br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
> -class StreamReader;<br class="gmail_msg">
> -class StreamWriter;<br class="gmail_msg">
> -}<br class="gmail_msg">
> +class BinaryStreamReader;<br class="gmail_msg">
> +class BinaryStreamWriter;<br class="gmail_msg">
> +<br class="gmail_msg">
> namespace codeview {<br class="gmail_msg">
> class TypeRecordMapping : public TypeVisitorCallbacks {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit TypeRecordMapping(msf::StreamReader &Reader) : IO(Reader) {}<br class="gmail_msg">
> - explicit TypeRecordMapping(msf::StreamWriter &Writer) : IO(Writer) {}<br class="gmail_msg">
> + explicit TypeRecordMapping(BinaryStreamReader &Reader) : IO(Reader) {}<br class="gmail_msg">
> + explicit TypeRecordMapping(BinaryStreamWriter &Writer) : IO(Writer) {}<br class="gmail_msg">
><br class="gmail_msg">
> Error visitTypeBegin(CVType &Record) override;<br class="gmail_msg">
> Error visitTypeEnd(CVType &Record) override;<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -56,8 +56,8 @@ class TypeSerializer : public TypeVisito<br class="gmail_msg">
> Optional<TypeLeafKind> TypeKind;<br class="gmail_msg">
> Optional<TypeLeafKind> MemberKind;<br class="gmail_msg">
> std::vector<uint8_t> RecordBuffer;<br class="gmail_msg">
> - msf::MutableByteStream Stream;<br class="gmail_msg">
> - msf::StreamWriter Writer;<br class="gmail_msg">
> + MutableBinaryByteStream Stream;<br class="gmail_msg">
> + BinaryStreamWriter Writer;<br class="gmail_msg">
> TypeRecordMapping Mapping;<br class="gmail_msg">
><br class="gmail_msg">
> RecordList SeenRecords;<br class="gmail_msg">
> @@ -109,7 +109,7 @@ private:<br class="gmail_msg">
> Error visitKnownMemberImpl(CVMemberRecord &CVR, RecordType &Record) {<br class="gmail_msg">
> assert(CVR.Kind == static_cast<TypeLeafKind>(Record.getKind()));<br class="gmail_msg">
><br class="gmail_msg">
> - if (auto EC = Writer.writeEnum(CVR.Kind, llvm::support::little))<br class="gmail_msg">
> + if (auto EC = Writer.writeEnum(CVR.Kind))<br class="gmail_msg">
> return EC;<br class="gmail_msg">
><br class="gmail_msg">
> if (auto EC = Mapping.visitKnownMember(CVR, Record))<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/MSF/BinaryByteStream.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryByteStream.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryByteStream.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/MSF/BinaryByteStream.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/MSF/BinaryByteStream.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -1,19 +1,19 @@<br class="gmail_msg">
> -//===- ByteStream.h - Reads stream data from a byte sequence ----*- C++ -*-===//<br class="gmail_msg">
> +//===- BinaryByteStream.h ---------------------------------------*- C++ -*-===//<br class="gmail_msg">
> //<br class="gmail_msg">
> // The LLVM Compiler Infrastructure<br class="gmail_msg">
> //<br class="gmail_msg">
> // This file is distributed under the University of Illinois Open Source<br class="gmail_msg">
> // License. See LICENSE.TXT for details.<br class="gmail_msg">
> -//<br class="gmail_msg">
> +//===----------------------------------------------------------------------===//<br class="gmail_msg">
> +// A BinaryStream which stores data in a single continguous memory buffer.<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
><br class="gmail_msg">
> -#ifndef LLVM_DEBUGINFO_MSF_BYTESTREAM_H<br class="gmail_msg">
> -#define LLVM_DEBUGINFO_MSF_BYTESTREAM_H<br class="gmail_msg">
> +#ifndef LLVM_SUPPORT_BINARYBYTESTREAM_H<br class="gmail_msg">
> +#define LLVM_SUPPORT_BINARYBYTESTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> #include "llvm/ADT/ArrayRef.h"<br class="gmail_msg">
> #include "llvm/ADT/StringRef.h"<br class="gmail_msg">
> #include "llvm/DebugInfo/MSF/BinaryStream.h"<br class="gmail_msg">
> -#include "llvm/DebugInfo/MSF/MSFError.h"<br class="gmail_msg">
> #include "llvm/Support/Error.h"<br class="gmail_msg">
> #include "llvm/Support/FileOutputBuffer.h"<br class="gmail_msg">
> #include "llvm/Support/MemoryBuffer.h"<br class="gmail_msg">
> @@ -23,34 +23,40 @@<br class="gmail_msg">
> #include <memory><br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
><br class="gmail_msg">
> -class ByteStream : public ReadableStream {<br class="gmail_msg">
> +/// \brief An implementation of BinaryStream which holds its entire data set<br class="gmail_msg">
> +/// in a single contiguous buffer. BinaryByteStream guarantees that no read<br class="gmail_msg">
> +/// operation will ever incur a copy. Note that BinaryByteStream does not<br class="gmail_msg">
> +/// own the underlying buffer.<br class="gmail_msg">
> +class BinaryByteStream : public BinaryStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - ByteStream() = default;<br class="gmail_msg">
> - explicit ByteStream(ArrayRef<uint8_t> Data) : Data(Data) {}<br class="gmail_msg">
> - explicit ByteStream(StringRef Data)<br class="gmail_msg">
> - : Data(Data.bytes_begin(), Data.bytes_end()) {}<br class="gmail_msg">
> + BinaryByteStream() = default;<br class="gmail_msg">
> + BinaryByteStream(ArrayRef<uint8_t> Data, llvm::support::endianness Endian)<br class="gmail_msg">
> + : Endian(Endian), Data(Data) {}<br class="gmail_msg">
> + BinaryByteStream(StringRef Data, llvm::support::endianness Endian)<br class="gmail_msg">
> + : Endian(Endian), Data(Data.bytes_begin(), Data.bytes_end()) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> + llvm::support::endianness getEndian() const override { return Endian; }<br class="gmail_msg">
><br class="gmail_msg">
> Error readBytes(uint32_t Offset, uint32_t Size,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> if (Offset > Data.size())<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> if (Data.size() < Size + Offset)<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> Buffer = Data.slice(Offset, Size);<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> Error readLongestContiguousChunk(uint32_t Offset,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> if (Offset >= Data.size())<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> Buffer = Data.slice(Offset);<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - uint32_t getLength() const override { return Data.size(); }<br class="gmail_msg">
> + uint32_t getLength() override { return Data.size(); }<br class="gmail_msg">
><br class="gmail_msg">
> ArrayRef<uint8_t> data() const { return Data; }<br class="gmail_msg">
><br class="gmail_msg">
> @@ -60,76 +66,91 @@ public:<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> protected:<br class="gmail_msg">
> + llvm::support::endianness Endian;<br class="gmail_msg">
> ArrayRef<uint8_t> Data;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -// MemoryBufferByteStream behaves like a read-only ByteStream, but has its data<br class="gmail_msg">
> -// backed by an llvm::MemoryBuffer. It also owns the underlying MemoryBuffer.<br class="gmail_msg">
> -class MemoryBufferByteStream : public ByteStream {<br class="gmail_msg">
> +/// \brief An implementation of BinaryStream whose data is backed by an llvm<br class="gmail_msg">
> +/// MemoryBuffer object. MemoryBufferByteStream owns the MemoryBuffer in<br class="gmail_msg">
> +/// question. As with BinaryByteStream, reading from a MemoryBufferByteStream<br class="gmail_msg">
> +/// will never cause a copy.<br class="gmail_msg">
> +class MemoryBufferByteStream : public BinaryByteStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit MemoryBufferByteStream(std::unique_ptr<MemoryBuffer> Buffer)<br class="gmail_msg">
> - : ByteStream(ArrayRef<uint8_t>(Buffer->getBuffer().bytes_begin(),<br class="gmail_msg">
> - Buffer->getBuffer().bytes_end())),<br class="gmail_msg">
> + explicit MemoryBufferByteStream(std::unique_ptr<MemoryBuffer> Buffer,<br class="gmail_msg">
> + llvm::support::endianness Endian)<br class="gmail_msg">
> + : BinaryByteStream(Buffer->getBuffer(), Endian),<br class="gmail_msg">
> MemBuffer(std::move(Buffer)) {}<br class="gmail_msg">
><br class="gmail_msg">
> std::unique_ptr<MemoryBuffer> MemBuffer;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -class MutableByteStream : public WritableStream {<br class="gmail_msg">
> +/// \brief An implementation of BinaryStream which holds its entire data set<br class="gmail_msg">
> +/// in a single contiguous buffer. As with BinaryByteStream, the mutable<br class="gmail_msg">
> +/// version also guarantees that no read operation will ever incur a copy,<br class="gmail_msg">
> +/// and similarly it does not own the underlying buffer.<br class="gmail_msg">
> +class MutableBinaryByteStream : public WritableBinaryStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - MutableByteStream() = default;<br class="gmail_msg">
> - explicit MutableByteStream(MutableArrayRef<uint8_t> Data)<br class="gmail_msg">
> - : Data(Data), ImmutableStream(Data) {}<br class="gmail_msg">
> + MutableBinaryByteStream() = default;<br class="gmail_msg">
> + MutableBinaryByteStream(MutableArrayRef<uint8_t> Data,<br class="gmail_msg">
> + llvm::support::endianness Endian)<br class="gmail_msg">
> + : Data(Data), ImmutableStream(Data, Endian) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> + llvm::support::endianness getEndian() const override {<br class="gmail_msg">
> + return ImmutableStream.getEndian();<br class="gmail_msg">
> + }<br class="gmail_msg">
><br class="gmail_msg">
> Error readBytes(uint32_t Offset, uint32_t Size,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> return ImmutableStream.readBytes(Offset, Size, Buffer);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> Error readLongestContiguousChunk(uint32_t Offset,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> return ImmutableStream.readLongestContiguousChunk(Offset, Buffer);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - uint32_t getLength() const override { return ImmutableStream.getLength(); }<br class="gmail_msg">
> + uint32_t getLength() override { return ImmutableStream.getLength(); }<br class="gmail_msg">
><br class="gmail_msg">
> - Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) const override {<br class="gmail_msg">
> + Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Buffer) override {<br class="gmail_msg">
> if (Buffer.empty())<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
><br class="gmail_msg">
> if (Data.size() < Buffer.size())<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> if (Offset > Buffer.size() - Data.size())<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
><br class="gmail_msg">
> uint8_t *DataPtr = const_cast<uint8_t *>(Data.data());<br class="gmail_msg">
> ::memcpy(DataPtr + Offset, Buffer.data(), Buffer.size());<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - Error commit() const override { return Error::success(); }<br class="gmail_msg">
> + Error commit() override { return Error::success(); }<br class="gmail_msg">
><br class="gmail_msg">
> MutableArrayRef<uint8_t> data() const { return Data; }<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> MutableArrayRef<uint8_t> Data;<br class="gmail_msg">
> - ByteStream ImmutableStream;<br class="gmail_msg">
> + BinaryByteStream ImmutableStream;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -// A simple adapter that acts like a ByteStream but holds ownership over<br class="gmail_msg">
> -// and underlying FileOutputBuffer.<br class="gmail_msg">
> -class FileBufferByteStream : public WritableStream {<br class="gmail_msg">
> +/// \brief An implementation of WritableBinaryStream backed by an llvm<br class="gmail_msg">
> +/// FileOutputBuffer.<br class="gmail_msg">
> +class FileBufferByteStream : public WritableBinaryStream {<br class="gmail_msg">
> private:<br class="gmail_msg">
> - class StreamImpl : public MutableByteStream {<br class="gmail_msg">
> + class StreamImpl : public MutableBinaryByteStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - StreamImpl(std::unique_ptr<FileOutputBuffer> Buffer)<br class="gmail_msg">
> - : MutableByteStream(MutableArrayRef<uint8_t>(Buffer->getBufferStart(),<br class="gmail_msg">
> - Buffer->getBufferEnd())),<br class="gmail_msg">
> + StreamImpl(std::unique_ptr<FileOutputBuffer> Buffer,<br class="gmail_msg">
> + llvm::support::endianness Endian)<br class="gmail_msg">
> + : MutableBinaryByteStream(<br class="gmail_msg">
> + MutableArrayRef<uint8_t>(Buffer->getBufferStart(),<br class="gmail_msg">
> + Buffer->getBufferEnd()),<br class="gmail_msg">
> + Endian),<br class="gmail_msg">
> FileBuffer(std::move(Buffer)) {}<br class="gmail_msg">
><br class="gmail_msg">
> - Error commit() const override {<br class="gmail_msg">
> + Error commit() override {<br class="gmail_msg">
> if (FileBuffer->commit())<br class="gmail_msg">
> - return llvm::make_error<MSFError>(msf_error_code::not_writable);<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> @@ -138,32 +159,36 @@ private:<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> public:<br class="gmail_msg">
> - explicit FileBufferByteStream(std::unique_ptr<FileOutputBuffer> Buffer)<br class="gmail_msg">
> - : Impl(std::move(Buffer)) {}<br class="gmail_msg">
> + explicit FileBufferByteStream(std::unique_ptr<FileOutputBuffer> Buffer,<br class="gmail_msg">
> + llvm::support::endianness Endian)<br class="gmail_msg">
> + : Impl(std::move(Buffer), Endian) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> + llvm::support::endianness getEndian() const override {<br class="gmail_msg">
> + return Impl.getEndian();<br class="gmail_msg">
> + }<br class="gmail_msg">
><br class="gmail_msg">
> Error readBytes(uint32_t Offset, uint32_t Size,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> return Impl.readBytes(Offset, Size, Buffer);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> Error readLongestContiguousChunk(uint32_t Offset,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> return Impl.readLongestContiguousChunk(Offset, Buffer);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - uint32_t getLength() const override { return Impl.getLength(); }<br class="gmail_msg">
> + uint32_t getLength() override { return Impl.getLength(); }<br class="gmail_msg">
><br class="gmail_msg">
> - Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) const override {<br class="gmail_msg">
> + Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) override {<br class="gmail_msg">
> return Impl.writeBytes(Offset, Data);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - Error commit() const override { return Impl.commit(); }<br class="gmail_msg">
> + Error commit() override { return Impl.commit(); }<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> StreamImpl Impl;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> } // end namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> -#endif // LLVM_DEBUGINFO_MSF_BYTESTREAM_H<br class="gmail_msg">
> +#endif // LLVM_SUPPORT_BINARYBYTESTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/MSF/BinaryItemStream.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryItemStream.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryItemStream.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/MSF/BinaryItemStream.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/MSF/BinaryItemStream.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -1,4 +1,4 @@<br class="gmail_msg">
> -//===- SequencedItemStream.h ------------------------------------*- C++ -*-===//<br class="gmail_msg">
> +//===- BinaryItemStream.h ---------------------------------------*- C++ -*-===//<br class="gmail_msg">
> //<br class="gmail_msg">
> // The LLVM Compiler Infrastructure<br class="gmail_msg">
> //<br class="gmail_msg">
> @@ -7,87 +7,96 @@<br class="gmail_msg">
> //<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
><br class="gmail_msg">
> -#ifndef LLVM_DEBUGINFO_MSF_SEQUENCEDITEMSTREAM_H<br class="gmail_msg">
> -#define LLVM_DEBUGINFO_MSF_SEQUENCEDITEMSTREAM_H<br class="gmail_msg">
> +#ifndef LLVM_SUPPORT_BINARYITEMSTREAM_H<br class="gmail_msg">
> +#define LLVM_SUPPORT_BINARYITEMSTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> #include "llvm/ADT/ArrayRef.h"<br class="gmail_msg">
> #include "llvm/DebugInfo/MSF/BinaryStream.h"<br class="gmail_msg">
> -#include "llvm/DebugInfo/MSF/MSFError.h"<br class="gmail_msg">
> #include "llvm/Support/Error.h"<br class="gmail_msg">
> #include <cstddef><br class="gmail_msg">
> #include <cstdint><br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
><br class="gmail_msg">
> -template <typename T> struct SequencedItemTraits {<br class="gmail_msg">
> - static size_t length(const T &Item) = delete;<br class="gmail_msg">
> - static ArrayRef<uint8_t> bytes(const T &Item) = delete;<br class="gmail_msg">
> +template <typename T> struct BinaryItemTraits {<br class="gmail_msg">
> + size_t length(const T &Item) = delete;<br class="gmail_msg">
> + ArrayRef<uint8_t> bytes(const T &Item) = delete;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -/// SequencedItemStream represents a sequence of objects stored in a<br class="gmail_msg">
> -/// standard container but for which it is useful to view as a stream of<br class="gmail_msg">
> -/// contiguous bytes. An example of this might be if you have a std::vector<br class="gmail_msg">
> -/// of TPI records, where each record contains a byte sequence that<br class="gmail_msg">
> -/// represents that one record serialized, but where each consecutive item<br class="gmail_msg">
> -/// might not be allocated immediately after the previous item. Using a<br class="gmail_msg">
> -/// SequencedItemStream, we can adapt the VarStreamArray class to trivially<br class="gmail_msg">
> -/// extract one item at a time, allowing the data to be used anywhere a<br class="gmail_msg">
> -/// VarStreamArray could be used.<br class="gmail_msg">
> -template <typename T, typename Traits = SequencedItemTraits<T>><br class="gmail_msg">
> -class SequencedItemStream : public ReadableStream {<br class="gmail_msg">
> +/// BinaryItemStream represents a sequence of objects stored in some kind of<br class="gmail_msg">
> +/// external container but for which it is useful to view as a stream of<br class="gmail_msg">
> +/// contiguous bytes. An example of this might be if you have a collection of<br class="gmail_msg">
> +/// records and you serialize each one into a buffer, and store these serialized<br class="gmail_msg">
> +/// records in a container. The pointers themselves are not laid out<br class="gmail_msg">
> +/// contiguously in memory, but we may wish to read from or write to these<br class="gmail_msg">
> +/// records as if they were.<br class="gmail_msg">
> +template <typename T, typename ItemTraits = BinaryItemTraits<T>><br class="gmail_msg">
> +class BinaryItemStream : public BinaryStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - SequencedItemStream() = default;<br class="gmail_msg">
> + explicit BinaryItemStream(llvm::support::endianness Endian)<br class="gmail_msg">
> + : Endian(Endian) {}<br class="gmail_msg">
> +<br class="gmail_msg">
> + llvm::support::endianness getEndian() const override { return Endian; }<br class="gmail_msg">
><br class="gmail_msg">
> Error readBytes(uint32_t Offset, uint32_t Size,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> - auto ExpectedIndex = translateOffsetIndex(Offset);<br class="gmail_msg">
> - if (!ExpectedIndex)<br class="gmail_msg">
> - return ExpectedIndex.takeError();<br class="gmail_msg">
> - const auto &Item = Items[*ExpectedIndex];<br class="gmail_msg">
> - if (Size > Traits::length(Item))<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> - Buffer = Traits::bytes(Item).take_front(Size);<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> + if (auto EC = readLongestContiguousChunk(Offset, Buffer))<br class="gmail_msg">
> + return EC;<br class="gmail_msg">
> +<br class="gmail_msg">
> + if (Size > Buffer.size())<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> +<br class="gmail_msg">
> + Buffer = Buffer.take_front(Size);<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> Error readLongestContiguousChunk(uint32_t Offset,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const override {<br class="gmail_msg">
> - auto ExpectedIndex = translateOffsetIndex(Offset);<br class="gmail_msg">
> - if (!ExpectedIndex)<br class="gmail_msg">
> - return ExpectedIndex.takeError();<br class="gmail_msg">
> - Buffer = Traits::bytes(Items[*ExpectedIndex]);<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) override {<br class="gmail_msg">
> + uint32_t Index;<br class="gmail_msg">
> + uint32_t ByteOffset;<br class="gmail_msg">
> + if (auto EC = translateOffsetIndex(Offset, Index, ByteOffset))<br class="gmail_msg">
> + return EC;<br class="gmail_msg">
> + const auto &Item = Items[Index];<br class="gmail_msg">
> + Buffer = Traits.bytes(Item).drop_front(ByteOffset);<br class="gmail_msg">
> return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> void setItems(ArrayRef<T> ItemArray) { Items = ItemArray; }<br class="gmail_msg">
><br class="gmail_msg">
> - uint32_t getLength() const override {<br class="gmail_msg">
> + uint32_t getLength() override {<br class="gmail_msg">
> uint32_t Size = 0;<br class="gmail_msg">
> for (const auto &Item : Items)<br class="gmail_msg">
> - Size += Traits::length(Item);<br class="gmail_msg">
> + Size += Traits.length(Item);<br class="gmail_msg">
> return Size;<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> - Expected<uint32_t> translateOffsetIndex(uint32_t Offset) const {<br class="gmail_msg">
> + Error translateOffsetIndex(uint32_t Offset, uint32_t &ItemIndex,<br class="gmail_msg">
> + uint32_t &ByteOffset) {<br class="gmail_msg">
> + ItemIndex = 0;<br class="gmail_msg">
> + ByteOffset = 0;<br class="gmail_msg">
> + uint32_t PrevOffset = 0;<br class="gmail_msg">
> uint32_t CurrentOffset = 0;<br class="gmail_msg">
> - uint32_t CurrentIndex = 0;<br class="gmail_msg">
> - for (const auto &Item : Items) {<br class="gmail_msg">
> - if (CurrentOffset >= Offset)<br class="gmail_msg">
> - break;<br class="gmail_msg">
> - CurrentOffset += Traits::length(Item);<br class="gmail_msg">
> - ++CurrentIndex;<br class="gmail_msg">
> + if (Offset > 0) {<br class="gmail_msg">
> + for (const auto &Item : Items) {<br class="gmail_msg">
> + PrevOffset = CurrentOffset;<br class="gmail_msg">
> + CurrentOffset += Traits.length(Item);<br class="gmail_msg">
> + if (CurrentOffset > Offset)<br class="gmail_msg">
> + break;<br class="gmail_msg">
> + ++ItemIndex;<br class="gmail_msg">
> + }<br class="gmail_msg">
> }<br class="gmail_msg">
> - if (CurrentOffset != Offset)<br class="gmail_msg">
> - return make_error<MSFError>(msf_error_code::insufficient_buffer);<br class="gmail_msg">
> - return CurrentIndex;<br class="gmail_msg">
> + if (CurrentOffset < Offset)<br class="gmail_msg">
> + return errorCodeToError(make_error_code(std::errc::no_buffer_space));<br class="gmail_msg">
> + ByteOffset = Offset - PrevOffset;<br class="gmail_msg">
> + return Error::success();<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> + llvm::support::endianness Endian;<br class="gmail_msg">
> + ItemTraits Traits;<br class="gmail_msg">
> ArrayRef<T> Items;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> } // end namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> -#endif // LLVM_DEBUGINFO_MSF_SEQUENCEDITEMSTREAM_H<br class="gmail_msg">
> +#endif // LLVM_SUPPORT_BINARYITEMSTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStream.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStream.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStream.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStream.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStream.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -1,4 +1,4 @@<br class="gmail_msg">
> -//===- StreamInterface.h - Base interface for a stream of data --*- C++ -*-===//<br class="gmail_msg">
> +//===- BinaryStream.h - Base interface for a stream of data -----*- C++ -*-===//<br class="gmail_msg">
> //<br class="gmail_msg">
> // The LLVM Compiler Infrastructure<br class="gmail_msg">
> //<br class="gmail_msg">
> @@ -7,47 +7,62 @@<br class="gmail_msg">
> //<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
><br class="gmail_msg">
> -#ifndef LLVM_DEBUGINFO_MSF_STREAMINTERFACE_H<br class="gmail_msg">
> -#define LLVM_DEBUGINFO_MSF_STREAMINTERFACE_H<br class="gmail_msg">
> +#ifndef LLVM_SUPPORT_BINARYSTREAM_H<br class="gmail_msg">
> +#define LLVM_SUPPORT_BINARYSTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> #include "llvm/ADT/ArrayRef.h"<br class="gmail_msg">
> +#include "llvm/Support/Endian.h"<br class="gmail_msg">
> #include "llvm/Support/Error.h"<br class="gmail_msg">
> #include <cstdint><br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
><br class="gmail_msg">
> -class ReadableStream {<br class="gmail_msg">
> +/// \brief An interface for accessing data in a stream-like format, but which<br class="gmail_msg">
> +/// discourages copying. Instead of specifying a buffer in which to copy<br class="gmail_msg">
> +/// data on a read, the API returns an ArrayRef to data owned by the stream's<br class="gmail_msg">
> +/// implementation. Since implementations may not necessarily store data in a<br class="gmail_msg">
> +/// single contiguous buffer (or even in memory at all), in such cases a it may<br class="gmail_msg">
> +/// be necessary for an implementation to cache such a buffer so that it can<br class="gmail_msg">
> +/// return it.<br class="gmail_msg">
> +class BinaryStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - virtual ~ReadableStream() = default;<br class="gmail_msg">
> + virtual ~BinaryStream() = default;<br class="gmail_msg">
><br class="gmail_msg">
> - // Given an offset into the stream and a number of bytes, attempt to read<br class="gmail_msg">
> - // the bytes and set the output ArrayRef to point to a reference into the<br class="gmail_msg">
> - // stream, without copying any data.<br class="gmail_msg">
> + virtual llvm::support::endianness getEndian() const = 0;<br class="gmail_msg">
> +<br class="gmail_msg">
> + /// \brief Given an offset into the stream and a number of bytes, attempt to<br class="gmail_msg">
> + /// read the bytes and set the output ArrayRef to point to data owned by the<br class="gmail_msg">
> + /// stream.<br class="gmail_msg">
> virtual Error readBytes(uint32_t Offset, uint32_t Size,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const = 0;<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) = 0;<br class="gmail_msg">
><br class="gmail_msg">
> - // Given an offset into the stream, read as much as possible without copying<br class="gmail_msg">
> - // any data.<br class="gmail_msg">
> + /// \brief Given an offset into the stream, read as much as possible without<br class="gmail_msg">
> + /// copying any data.<br class="gmail_msg">
> virtual Error readLongestContiguousChunk(uint32_t Offset,<br class="gmail_msg">
> - ArrayRef<uint8_t> &Buffer) const = 0;<br class="gmail_msg">
> + ArrayRef<uint8_t> &Buffer) = 0;<br class="gmail_msg">
><br class="gmail_msg">
> - virtual uint32_t getLength() const = 0;<br class="gmail_msg">
> + /// \brief Return the number of bytes of data in this stream.<br class="gmail_msg">
> + virtual uint32_t getLength() = 0;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -class WritableStream : public ReadableStream {<br class="gmail_msg">
> +/// \brief A BinaryStream which can be read from as well as written to. Note<br class="gmail_msg">
> +/// that writing to a BinaryStream always necessitates copying from the input<br class="gmail_msg">
> +/// buffer to the stream's backing store. Streams are assumed to be buffered<br class="gmail_msg">
> +/// so that to be portable it is necessary to call commit() on the stream when<br class="gmail_msg">
> +/// all data has been written.<br class="gmail_msg">
> +class WritableBinaryStream : public BinaryStream {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - ~WritableStream() override = default;<br class="gmail_msg">
> + ~WritableBinaryStream() override = default;<br class="gmail_msg">
><br class="gmail_msg">
> - // Attempt to write the given bytes into the stream at the desired offset.<br class="gmail_msg">
> - // This will always necessitate a copy. Cannot shrink or grow the stream,<br class="gmail_msg">
> - // only writes into existing allocated space.<br class="gmail_msg">
> - virtual Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) const = 0;<br class="gmail_msg">
> + /// \brief Attempt to write the given bytes into the stream at the desired<br class="gmail_msg">
> + /// offset. This will always necessitate a copy. Cannot shrink or grow the<br class="gmail_msg">
> + /// stream, only writes into existing allocated space.<br class="gmail_msg">
> + virtual Error writeBytes(uint32_t Offset, ArrayRef<uint8_t> Data) = 0;<br class="gmail_msg">
><br class="gmail_msg">
> - virtual Error commit() const = 0;<br class="gmail_msg">
> + /// \brief For buffered streams, commits changes to the backing store.<br class="gmail_msg">
> + virtual Error commit() = 0;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -} // end namespace msf<br class="gmail_msg">
> } // end namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> -#endif // LLVM_DEBUGINFO_MSF_STREAMINTERFACE_H<br class="gmail_msg">
> +#endif // LLVM_SUPPORT_BINARYSTREAM_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamArray.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamArray.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamArray.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamArray.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamArray.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -1,4 +1,4 @@<br class="gmail_msg">
> -//===- StreamArray.h - Array backed by an arbitrary stream ------*- C++ -*-===//<br class="gmail_msg">
> +//===- BinaryStreamArray.h - Array backed by an arbitrary stream *- C++ -*-===//<br class="gmail_msg">
> //<br class="gmail_msg">
> // The LLVM Compiler Infrastructure<br class="gmail_msg">
> //<br class="gmail_msg">
> @@ -7,8 +7,8 @@<br class="gmail_msg">
> //<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
><br class="gmail_msg">
> -#ifndef LLVM_DEBUGINFO_MSF_STREAMARRAY_H<br class="gmail_msg">
> -#define LLVM_DEBUGINFO_MSF_STREAMARRAY_H<br class="gmail_msg">
> +#ifndef LLVM_SUPPORT_BINARYSTREAMARRAY_H<br class="gmail_msg">
> +#define LLVM_SUPPORT_BINARYSTREAMARRAY_H<br class="gmail_msg">
><br class="gmail_msg">
> #include "llvm/ADT/ArrayRef.h"<br class="gmail_msg">
> #include "llvm/ADT/iterator.h"<br class="gmail_msg">
> @@ -17,11 +17,20 @@<br class="gmail_msg">
> #include <cassert><br class="gmail_msg">
> #include <cstdint><br class="gmail_msg">
><br class="gmail_msg">
> +/// Lightweight arrays that are backed by an arbitrary BinaryStream. This file<br class="gmail_msg">
> +/// provides two different array implementations.<br class="gmail_msg">
> +///<br class="gmail_msg">
> +/// VarStreamArray - Arrays of variable length records. The user specifies<br class="gmail_msg">
> +/// an Extractor type that can extract a record from a given offset and<br class="gmail_msg">
> +/// return the number of bytes consumed by the record.<br class="gmail_msg">
> +///<br class="gmail_msg">
> +/// FixedStreamArray - Arrays of fixed length records. This is similar in<br class="gmail_msg">
> +/// spirit to ArrayRef<T>, but since it is backed by a BinaryStream, the<br class="gmail_msg">
> +/// elements of the array need not be laid out in contiguous memory.<br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
><br class="gmail_msg">
> /// VarStreamArrayExtractor is intended to be specialized to provide customized<br class="gmail_msg">
> -/// extraction logic. On input it receives a StreamRef pointing to the<br class="gmail_msg">
> +/// extraction logic. On input it receives a BinaryStreamRef pointing to the<br class="gmail_msg">
> /// beginning of the next record, but where the length of the record is not yet<br class="gmail_msg">
> /// known. Upon completion, it should return an appropriate Error instance if<br class="gmail_msg">
> /// a record could not be extracted, or if one could be extracted it should<br class="gmail_msg">
> @@ -35,7 +44,7 @@ namespace msf {<br class="gmail_msg">
> template <typename T> struct VarStreamArrayExtractor {<br class="gmail_msg">
> // Method intentionally deleted. You must provide an explicit specialization<br class="gmail_msg">
> // with the following method implemented.<br class="gmail_msg">
> - Error operator()(ReadableStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> + Error operator()(BinaryStreamRef Stream, uint32_t &Len,<br class="gmail_msg">
> T &Item) const = delete;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> @@ -49,10 +58,10 @@ template <typename T> struct VarStreamAr<br class="gmail_msg">
> /// abstracting this out, we need not duplicate this memory, and we can<br class="gmail_msg">
> /// iterate over arrays in arbitrarily formatted streams. Elements are parsed<br class="gmail_msg">
> /// lazily on iteration, so there is no upfront cost associated with building<br class="gmail_msg">
> -/// a VarStreamArray, no matter how large it may be.<br class="gmail_msg">
> +/// or copying a VarStreamArray, no matter how large it may be.<br class="gmail_msg">
> ///<br class="gmail_msg">
> /// You create a VarStreamArray by specifying a ValueType and an Extractor type.<br class="gmail_msg">
> -/// If you do not specify an Extractor type, it expects you to specialize<br class="gmail_msg">
> +/// If you do not specify an Extractor type, you are expected to specialize<br class="gmail_msg">
> /// VarStreamArrayExtractor<T> for your ValueType.<br class="gmail_msg">
> ///<br class="gmail_msg">
> /// By default an Extractor is default constructed in the class, but in some<br class="gmail_msg">
> @@ -86,8 +95,8 @@ public:<br class="gmail_msg">
> VarStreamArray() = default;<br class="gmail_msg">
> explicit VarStreamArray(const Extractor &E) : E(E) {}<br class="gmail_msg">
><br class="gmail_msg">
> - explicit VarStreamArray(ReadableStreamRef Stream) : Stream(Stream) {}<br class="gmail_msg">
> - VarStreamArray(ReadableStreamRef Stream, const Extractor &E)<br class="gmail_msg">
> + explicit VarStreamArray(BinaryStreamRef Stream) : Stream(Stream) {}<br class="gmail_msg">
> + VarStreamArray(BinaryStreamRef Stream, const Extractor &E)<br class="gmail_msg">
> : Stream(Stream), E(E) {}<br class="gmail_msg">
><br class="gmail_msg">
> VarStreamArray(const VarStreamArray<ValueType, Extractor> &Other)<br class="gmail_msg">
> @@ -101,10 +110,10 @@ public:<br class="gmail_msg">
><br class="gmail_msg">
> const Extractor &getExtractor() const { return E; }<br class="gmail_msg">
><br class="gmail_msg">
> - ReadableStreamRef getUnderlyingStream() const { return Stream; }<br class="gmail_msg">
> + BinaryStreamRef getUnderlyingStream() const { return Stream; }<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> - ReadableStreamRef Stream;<br class="gmail_msg">
> + BinaryStreamRef Stream;<br class="gmail_msg">
> Extractor E;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> @@ -153,23 +162,25 @@ public:<br class="gmail_msg">
> return ThisValue;<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - IterType &operator++() {<br class="gmail_msg">
> - // We are done with the current record, discard it so that we are<br class="gmail_msg">
> - // positioned at the next record.<br class="gmail_msg">
> - IterRef = IterRef.drop_front(ThisLen);<br class="gmail_msg">
> - if (IterRef.getLength() == 0) {<br class="gmail_msg">
> - // There is nothing after the current record, we must make this an end<br class="gmail_msg">
> - // iterator.<br class="gmail_msg">
> - moveToEnd();<br class="gmail_msg">
> - } else {<br class="gmail_msg">
> - // There is some data after the current record.<br class="gmail_msg">
> - auto EC = Extract(IterRef, ThisLen, ThisValue);<br class="gmail_msg">
> - if (EC) {<br class="gmail_msg">
> - consumeError(std::move(EC));<br class="gmail_msg">
> - markError();<br class="gmail_msg">
> - } else if (ThisLen == 0) {<br class="gmail_msg">
> - // An empty record? Make this an end iterator.<br class="gmail_msg">
> + IterType &operator+=(unsigned N) {<br class="gmail_msg">
> + for (unsigned I = 0; I < N; ++I) {<br class="gmail_msg">
> + // We are done with the current record, discard it so that we are<br class="gmail_msg">
> + // positioned at the next record.<br class="gmail_msg">
> + IterRef = IterRef.drop_front(ThisLen);<br class="gmail_msg">
> + if (IterRef.getLength() == 0) {<br class="gmail_msg">
> + // There is nothing after the current record, we must make this an end<br class="gmail_msg">
> + // iterator.<br class="gmail_msg">
> moveToEnd();<br class="gmail_msg">
> + } else {<br class="gmail_msg">
> + // There is some data after the current record.<br class="gmail_msg">
> + auto EC = Extract(IterRef, ThisLen, ThisValue);<br class="gmail_msg">
> + if (EC) {<br class="gmail_msg">
> + consumeError(std::move(EC));<br class="gmail_msg">
> + markError();<br class="gmail_msg">
> + } else if (ThisLen == 0) {<br class="gmail_msg">
> + // An empty record? Make this an end iterator.<br class="gmail_msg">
> + moveToEnd();<br class="gmail_msg">
> + }<br class="gmail_msg">
> }<br class="gmail_msg">
> }<br class="gmail_msg">
> return *this;<br class="gmail_msg">
> @@ -188,7 +199,7 @@ private:<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> ValueType ThisValue;<br class="gmail_msg">
> - ReadableStreamRef IterRef;<br class="gmail_msg">
> + BinaryStreamRef IterRef;<br class="gmail_msg">
> const ArrayType *Array{nullptr};<br class="gmail_msg">
> uint32_t ThisLen{0};<br class="gmail_msg">
> bool HasError{false};<br class="gmail_msg">
> @@ -198,12 +209,17 @@ private:<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T> class FixedStreamArrayIterator;<br class="gmail_msg">
><br class="gmail_msg">
> +/// FixedStreamArray is similar to VarStreamArray, except with each record<br class="gmail_msg">
> +/// having a fixed-length. As with VarStreamArray, there is no upfront<br class="gmail_msg">
> +/// cost associated with building or copying a FixedStreamArray, as the<br class="gmail_msg">
> +/// memory for each element is not read from the backing stream until that<br class="gmail_msg">
> +/// element is iterated.<br class="gmail_msg">
> template <typename T> class FixedStreamArray {<br class="gmail_msg">
> friend class FixedStreamArrayIterator<T>;<br class="gmail_msg">
><br class="gmail_msg">
> public:<br class="gmail_msg">
> FixedStreamArray() = default;<br class="gmail_msg">
> - FixedStreamArray(ReadableStreamRef Stream) : Stream(Stream) {<br class="gmail_msg">
> + explicit FixedStreamArray(BinaryStreamRef Stream) : Stream(Stream) {<br class="gmail_msg">
> assert(Stream.getLength() % sizeof(T) == 0);<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> @@ -242,10 +258,10 @@ public:<br class="gmail_msg">
> return FixedStreamArrayIterator<T>(*this, size());<br class="gmail_msg">
> }<br class="gmail_msg">
><br class="gmail_msg">
> - ReadableStreamRef getUnderlyingStream() const { return Stream; }<br class="gmail_msg">
> + BinaryStreamRef getUnderlyingStream() const { return Stream; }<br class="gmail_msg">
><br class="gmail_msg">
> private:<br class="gmail_msg">
> - ReadableStreamRef Stream;<br class="gmail_msg">
> + BinaryStreamRef Stream;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> template <typename T><br class="gmail_msg">
> @@ -298,7 +314,6 @@ private:<br class="gmail_msg">
> uint32_t Index;<br class="gmail_msg">
> };<br class="gmail_msg">
><br class="gmail_msg">
> -} // namespace msf<br class="gmail_msg">
> } // namespace llvm<br class="gmail_msg">
><br class="gmail_msg">
> -#endif // LLVM_DEBUGINFO_MSF_STREAMARRAY_H<br class="gmail_msg">
> +#endif // LLVM_SUPPORT_BINARYSTREAMARRAY_H<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamReader.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamReader.h?rev=296215&r1=296214&r2=296215&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamReader.h?rev=296215&r1=296214&r2=296215&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamReader.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/DebugInfo/MSF/BinaryStreamReader.h Fri Feb 24 18:44:30 2017<br class="gmail_msg">
> @@ -1,4 +1,4 @@<br class="gmail_msg">
> -//===- StreamReader.h - Reads bytes and objects from a stream ---*- C++ -*-===//<br class="gmail_msg">
> +//===- BinaryStreamReader.h - Reads objects from a binary stream *- C++ -*-===//<br class="gmail_msg">
> //<br class="gmail_msg">
> // The LLVM Compiler Infrastructure<br class="gmail_msg">
> //<br class="gmail_msg">
> @@ -7,71 +7,166 @@<br class="gmail_msg">
> //<br class="gmail_msg">
> //===----------------------------------------------------------------------===//<br class="gmail_msg">
><br class="gmail_msg">
> -#ifndef LLVM_DEBUGINFO_MSF_STREAMREADER_H<br class="gmail_msg">
> -#define LLVM_DEBUGINFO_MSF_STREAMREADER_H<br class="gmail_msg">
> +#ifndef LLVM_SUPPORT_BINARYSTREAMREADER_H<br class="gmail_msg">
> +#define LLVM_SUPPORT_BINARYSTREAMREADER_H<br class="gmail_msg">
><br class="gmail_msg">
> #include "llvm/ADT/ArrayRef.h"<br class="gmail_msg">
> +#include "llvm/ADT/STLExtras.h"<br class="gmail_msg">
> #include "llvm/DebugInfo/MSF/BinaryStream.h"<br class="gmail_msg">
> #include "llvm/DebugInfo/MSF/BinaryStreamArray.h"<br class="gmail_msg">
> #include "llvm/DebugInfo/MSF/BinaryStreamRef.h"<br class="gmail_msg">
> -#include "llvm/DebugInfo/MSF/MSFError.h"<br class="gmail_msg">
> #include "llvm/Support/Endian.h"<br class="gmail_msg">
> #include "llvm/Support/Error.h"<br class="gmail_msg">
> +#include "llvm/Support/MathExtras.h"<br class="gmail_msg">
> #include "llvm/Support/type_traits.h"<br class="gmail_msg">
><br class="gmail_msg">
> #include <string><br class="gmail_msg">
> #include <type_traits><br class="gmail_msg">
><br class="gmail_msg">
> namespace llvm {<br class="gmail_msg">
> -namespace msf {<br class="gmail_msg">
><br class="gmail_msg">
> -class StreamReader {<br class="gmail_msg">
> +/// \brief Provides read only access to a subclass of `BinaryStream`. Provides<br class="gmail_msg">
> +/// bounds checking and helpers for writing certain common data types such as<br class="gmail_msg">
> +/// null-terminated strings, integers in various flavors of endianness, etc.<br class="gmail_msg">
> +/// Can be subclassed to provide reading of custom datatypes, although no<br class="gmail_msg">
> +/// are overridable.<br class="gmail_msg">
> +class BinaryStreamReader {<br class="gmail_msg">
> public:<br class="gmail_msg">
> - StreamReader(ReadableStreamRef Stream);<br class="gmail_msg">
> + explicit BinaryStreamReader(BinaryStreamRef Stream);<br class="gmail_msg">
> + virtual ~BinaryStreamReader() {}<br class="gmail_msg">
><br class="gmail_msg">
> + /// Read as much as possible from the underlying string at the current offset<br class="gmail_msg">
> + /// without invoking a copy, and set \p Buffer to the resulting data slice.<br class="gmail_msg">
> + /// Updates the stream's offset to point after the newly read data.<br class="gmail_msg">
> + ///<br class="gmail_msg">
> + /// \returns a success error code if the data was successfully read, otherwise<br class="gmail_msg">
> + /// returns an appropriate error code.<br class="gmail_msg">
> Error readLongestContiguousChunk(ArrayRef<uint8_t> &Buffer);<br class="gmail_msg">
> +<br class="gmail_msg">
> + /// Read \p Size bytes from the underlying stream at the current offset and<br class="gmail_msg">
> + /// and set \p Buffer to the resulting data slice. Whether a copy occurs<br class="gmail_msg">
> + /// depends on the implementation of the underlying stream. Updates the<br class="gmail_msg">
> + /// stream's offset to point after the newly read data.<br class="gmail_msg">
> + ///<br class="gmail_msg">
> + /// \returns a success error code if the data was successfully read, otherwise<br class="gmail_msg">
> + /// returns an appropriate error code.<br class="gmail_msg">
> Error readBytes(ArrayRef<uint8_t> &Buffer, uint32_t Size);<br class="gmail_msg">
><br class="gmail_msg">
> - template <typename T><br class="gmail_msg">
> - Error readInteger(T &Dest,<br class="gmail_msg">
> - </blockquote></div>