[llvm] r271101 - [pdb] Finish conversion to zero copy pdb access.

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 2 08:29:34 PDT 2016


> On May 31, 2016, at 3:26 PM, Zachary Turner <zturner at google.com> wrote:
> 
> That doesn't make much sense to me.  What's uninitialized?  That line initializes Iter by definition, as it invokes the default constructor.

Is the default constructor initializing all the members?
It seems that Coverity thinks that this line:

  VarStreamArrayIterator() : Array(nullptr), IterRef(), HasError(false) {}

will leave these fields:

  uint32_t ThisLen;
  bool *HadError;

uninitialized. And then the value is read when copying to the range.

-- 
Mehdi



> 
> On Tue, May 31, 2016 at 3:20 PM Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
> 
> > On May 27, 2016, at 10:21 PM, Zachary Turner via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
> >
> > Author: zturner
> > Date: Sat May 28 00:21:57 2016
> > New Revision: 271101
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=271101&view=rev <http://llvm.org/viewvc/llvm-project?rev=271101&view=rev>
> > Log:
> > [pdb] Finish conversion to zero copy pdb access.
> >
> > This converts remaining uses of ByteStream, which was still
> > left in the symbol stream and type stream, to using the new
> > StreamInterface zero-copy classes.
> >
> > RecordIterator is finally deleted, so this is the only way left
> > now.  Additionally, more error checking is added when iterating
> > the various streams.
> >
> > With this, the transition to zero copy pdb access is complete.
> >
> > Added:
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h
> > Removed:
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/RecordIterator.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h
> > Modified:
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/ByteStream.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/StreamArray.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/StreamInterface.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/StreamReader.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/StreamRef.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDumper.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
> >    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
> >    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
> >    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h
> >    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h
> >    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h
> >    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h
> >    llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h
> >    llvm/trunk/lib/DebugInfo/CodeView/ByteStream.cpp
> >    llvm/trunk/lib/DebugInfo/CodeView/StreamReader.cpp
> >    llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp
> >    llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
> >    llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
> >    llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp
> >    llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp
> >    llvm/trunk/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
> >    llvm/trunk/lib/DebugInfo/PDB/Raw/SymbolStream.cpp
> >    llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp
> >    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
> >    llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ByteStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ByteStream.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ByteStream.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/ByteStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ByteStream.h Sat May 28 00:21:57 2016
> > @@ -24,16 +24,9 @@ class StreamReader;
> > class ByteStream : public StreamInterface {
> > public:
> >   ByteStream();
> > -  explicit ByteStream(MutableArrayRef<uint8_t> Data);
> > +  explicit ByteStream(ArrayRef<uint8_t> Data);
> >   ~ByteStream() override;
> >
> > -  void reset();
> > -
> > -  void load(uint32_t Length);
> > -  Error load(StreamReader &Reader, uint32_t Length);
> > -
> > -  Error readBytes(uint32_t Offset,
> > -                  MutableArrayRef<uint8_t> Buffer) const override;
> >   Error readBytes(uint32_t Offset, uint32_t Size,
> >                   ArrayRef<uint8_t> &Buffer) const override;
> >
> > @@ -43,8 +36,7 @@ public:
> >   StringRef str() const;
> >
> > private:
> > -  MutableArrayRef<uint8_t> Data;
> > -  std::unique_ptr<uint8_t[]> Ownership;
> > +  ArrayRef<uint8_t> Data;
> > };
> >
> > } // end namespace pdb
> >
> > Added: llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h?rev=271101&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h?rev=271101&view=auto>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h (added)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVRecord.h Sat May 28 00:21:57 2016
> > @@ -0,0 +1,47 @@
> > +//===- RecordIterator.h -----------------------------------------*- C++ -*-===//
> > +//
> > +//                     The LLVM Compiler Infrastructure
> > +//
> > +// This file is distributed under the University of Illinois Open Source
> > +// License. See LICENSE.TXT for details.
> > +//
> > +//===----------------------------------------------------------------------===//
> > +
> > +#ifndef LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H
> > +#define LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H
> > +
> > +#include "llvm/ADT/ArrayRef.h"
> > +#include "llvm/ADT/iterator_range.h"
> > +#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
> > +#include "llvm/DebugInfo/CodeView/StreamInterface.h"
> > +#include "llvm/DebugInfo/CodeView/StreamReader.h"
> > +#include "llvm/Support/Endian.h"
> > +
> > +namespace llvm {
> > +namespace codeview {
> > +
> > +template <typename Kind> struct CVRecord {
> > +  uint32_t Length;
> > +  Kind Type;
> > +  ArrayRef<uint8_t> Data;
> > +};
> > +
> > +template <typename Kind> struct VarStreamArrayExtractor<CVRecord<Kind>> {
> > +  Error operator()(const StreamInterface &Stream, uint32_t &Len,
> > +                   CVRecord<Kind> &Item) const {
> > +    const RecordPrefix *Prefix = nullptr;
> > +    StreamReader Reader(Stream);
> > +    if (auto EC = Reader.readObject(Prefix))
> > +      return EC;
> > +    Item.Length = Prefix->RecordLen;
> > +    Item.Type = static_cast<Kind>(uint16_t(Prefix->RecordKind));
> > +    if (auto EC = Reader.readBytes(Item.Data, Item.Length - 2))
> > +      return EC;
> > +    Len = Prefix->RecordLen + 2;
> > +    return Error::success();
> > +  }
> > +};
> > +}
> > +}
> > +
> > +#endif
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h Sat May 28 00:21:57 2016
> > @@ -10,8 +10,8 @@
> > #ifndef LLVM_DEBUGINFO_CODEVIEW_CVSYMBOLVISITOR_H
> > #define LLVM_DEBUGINFO_CODEVIEW_CVSYMBOLVISITOR_H
> >
> > +#include "llvm/DebugInfo/CodeView/CVRecord.h"
> > #include "llvm/DebugInfo/CodeView/CodeView.h"
> > -#include "llvm/DebugInfo/CodeView/RecordIterator.h"
> > #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
> > #include "llvm/DebugInfo/CodeView/SymbolVisitorDelegate.h"
> > #include "llvm/Support/ErrorOr.h"
> > @@ -72,8 +72,8 @@ public:
> >   }
> >
> >   /// Visits the symbol records in Data. Sets the error flag on parse failures.
> > -  void visitSymbolStream(ArrayRef<uint8_t> Data) {
> > -    for (const auto &I : makeSymbolRange(Data, &HadError)) {
> > +  void visitSymbolStream(const CVSymbolArray &Symbols) {
> > +    for (const auto &I : Symbols) {
> >       visitSymbolRecord(I);
> >       if (hadError())
> >         break;
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h Sat May 28 00:21:57 2016
> > @@ -10,11 +10,10 @@
> > #ifndef LLVM_DEBUGINFO_CODEVIEW_CVTYPEVISITOR_H
> > #define LLVM_DEBUGINFO_CODEVIEW_CVTYPEVISITOR_H
> >
> > +#include "llvm/DebugInfo/CodeView/CVRecord.h"
> > #include "llvm/DebugInfo/CodeView/CodeView.h"
> > -#include "llvm/DebugInfo/CodeView/RecordIterator.h"
> > #include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> > #include "llvm/Support/ErrorOr.h"
> >
> > namespace llvm {
> > @@ -81,8 +80,8 @@ public:
> >   }
> >
> >   /// Visits the type records in Data. Sets the error flag on parse failures.
> > -  void visitTypeStream(ArrayRef<uint8_t> Data) {
> > -    for (const auto &I : makeTypeRange(Data, &HadError)) {
> > +  void visitTypeStream(const CVTypeArray &Types) {
> > +    for (const auto &I : Types) {
> >       visitTypeRecord(I);
> >       if (hadError())
> >         break;
> >
> > Removed: llvm/trunk/include/llvm/DebugInfo/CodeView/RecordIterator.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/RecordIterator.h?rev=271100&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/RecordIterator.h?rev=271100&view=auto>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/RecordIterator.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/RecordIterator.h (removed)
> > @@ -1,143 +0,0 @@
> > -//===- RecordIterator.h -----------------------------------------*- C++ -*-===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> > -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H
> > -#define LLVM_DEBUGINFO_CODEVIEW_RECORDITERATOR_H
> > -
> > -#include "llvm/ADT/ArrayRef.h"
> > -#include "llvm/ADT/iterator_range.h"
> > -#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
> > -#include "llvm/DebugInfo/CodeView/StreamInterface.h"
> > -#include "llvm/DebugInfo/CodeView/StreamReader.h"
> > -#include "llvm/Support/Endian.h"
> > -
> > -namespace llvm {
> > -namespace codeview {
> > -
> > -template <typename Kind> struct CVRecord {
> > -  uint32_t Length;
> > -  Kind Type;
> > -  ArrayRef<uint8_t> Data;
> > -};
> > -
> > -template <typename Kind> struct VarStreamArrayExtractor<CVRecord<Kind>> {
> > -  uint32_t operator()(const StreamInterface &Stream,
> > -                      CVRecord<Kind> &Item) const {
> > -    const RecordPrefix *Prefix = nullptr;
> > -    StreamReader Reader(Stream);
> > -    if (auto EC = Reader.readObject(Prefix)) {
> > -      consumeError(std::move(EC));
> > -      return 0;
> > -    }
> > -    Item.Length = Prefix->RecordLen;
> > -    Item.Type = static_cast<Kind>(uint16_t(Prefix->RecordKind));
> > -    if (auto EC = Reader.readBytes(Item.Length - 2, Item.Data)) {
> > -      consumeError(std::move(EC));
> > -      return 0;
> > -    }
> > -    return Prefix->RecordLen + 2;
> > -  }
> > -};
> > -
> > -// A const input iterator interface to the CodeView record stream.
> > -template <typename Kind> class RecordIterator {
> > -public:
> > -
> > -  explicit RecordIterator(const ArrayRef<uint8_t> &RecordBytes, bool *HadError)
> > -      : HadError(HadError), Data(RecordBytes), AtEnd(false) {
> > -    next(); // Prime the pump
> > -  }
> > -
> > -  RecordIterator() : HadError(nullptr), AtEnd(true) {}
> > -
> > -  // For iterators to compare equal, they must both point at the same record
> > -  // in the same data stream, or they must both be at the end of a stream.
> > -  friend bool operator==(const RecordIterator<Kind> &lhs,
> > -                         const RecordIterator<Kind> &rhs) {
> > -    return (lhs.Data.begin() == rhs.Data.begin()) || (lhs.AtEnd && rhs.AtEnd);
> > -  }
> > -
> > -  friend bool operator!=(const RecordIterator<Kind> &lhs,
> > -                         const RecordIterator<Kind> &rhs) {
> > -    return !(lhs == rhs);
> > -  }
> > -
> > -  const CVRecord<Kind> &operator*() const {
> > -    assert(!AtEnd);
> > -    return Current;
> > -  }
> > -
> > -  const CVRecord<Kind> *operator->() const {
> > -    assert(!AtEnd);
> > -    return &Current;
> > -  }
> > -
> > -  RecordIterator<Kind> &operator++() {
> > -    next();
> > -    return *this;
> > -  }
> > -
> > -  RecordIterator<Kind> operator++(int) {
> > -    RecordIterator<Kind> Original = *this;
> > -    ++*this;
> > -    return Original;
> > -  }
> > -
> > -private:
> > -  void next() {
> > -    assert(!AtEnd && "Attempted to advance more than one past the last rec");
> > -    if (Data.empty()) {
> > -      // We've advanced past the last record.
> > -      AtEnd = true;
> > -      return;
> > -    }
> > -
> > -    // FIXME: Use consumeObject when it deals in ArrayRef<uint8_t>.
> > -    if (Data.size() < sizeof(RecordPrefix))
> > -      return parseError();
> > -    const auto *Rec = reinterpret_cast<const RecordPrefix *>(Data.data());
> > -    Data = Data.drop_front(sizeof(RecordPrefix));
> > -
> > -    Current.Length = Rec->RecordLen;
> > -    Current.Type = static_cast<Kind>(uint16_t(Rec->RecordKind));
> > -    size_t RecLen = Current.Length - 2;
> > -    if (RecLen > Data.size())
> > -      return parseError();
> > -    Current.Data = Data.slice(0, RecLen);
> > -
> > -    // The next record starts immediately after this one.
> > -    Data = Data.drop_front(Current.Data.size());
> > -
> > -    // FIXME: The stream contains LF_PAD bytes that we need to ignore, but those
> > -    // are typically included in LeafData. We may need to call skipPadding() if
> > -    // we ever find a record that doesn't count those bytes.
> > -
> > -    return;
> > -  }
> > -
> > -  void parseError() {
> > -    if (HadError)
> > -      *HadError = true;
> > -  }
> > -
> > -  bool *HadError;
> > -  ArrayRef<uint8_t> Data;
> > -  CVRecord<Kind> Current;
> > -  bool AtEnd;
> > -};
> > -
> > -template <typename Kind>
> > -inline iterator_range<RecordIterator<Kind>>
> > -makeRecordRange(ArrayRef<uint8_t> Data, bool *HadError) {
> > -  return make_range(RecordIterator<Kind>(Data, HadError), RecordIterator<Kind>());
> > -}
> > -}
> > -}
> > -
> > -#endif
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/StreamArray.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamArray.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamArray.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/StreamArray.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/StreamArray.h Sat May 28 00:21:57 2016
> > @@ -11,6 +11,7 @@
> > #define LLVM_DEBUGINFO_CODEVIEW_STREAMARRAY_H
> >
> > #include "llvm/DebugInfo/CodeView/StreamRef.h"
> > +#include "llvm/Support/Error.h"
> >
> > #include <functional>
> > #include <type_traits>
> > @@ -25,8 +26,11 @@ namespace codeview {
> > /// value type.
> > template <typename T> struct VarStreamArrayExtractor {
> >   // Method intentionally deleted.  You must provide an explicit specialization
> > -  // with the following method implemented.
> > -  uint32_t operator()(const StreamInterface &Stream, T &t) const = delete;
> > +  // with the following method implemented.  On output return `Len` should
> > +  // contain the number of bytes to consume from the stream, and `Item` should
> > +  // be initialized with the proper value.
> > +  Error operator()(const StreamInterface &Stream, uint32_t &Len,
> > +                   T &Item) const = delete;
> > };
> >
> > /// VarStreamArray represents an array of variable length records backed by a
> > @@ -52,7 +56,9 @@ public:
> >
> >   VarStreamArray(StreamRef Stream) : Stream(Stream) {}
> >
> > -  Iterator begin() const { return Iterator(*this); }
> > +  Iterator begin(bool *HadError = nullptr) const {
> > +    return Iterator(*this, HadError);
> > +  }
> >
> >   Iterator end() const { return Iterator(); }
> >
> > @@ -65,11 +71,20 @@ template <typename ValueType, typename E
> >   typedef VarStreamArray<ValueType, Extractor> ArrayType;
> >
> > public:
> > -  VarStreamArrayIterator(const ArrayType &Array)
> > -      : Array(&Array), IterRef(Array.Stream) {
> > -    ThisLen = Extract(IterRef, ThisValue);
> > +  VarStreamArrayIterator(const ArrayType &Array, bool *HadError = nullptr)
> > +      : Array(&Array), IterRef(Array.Stream), HasError(false),
> > +        HadError(HadError) {
> > +    auto EC = Extract(IterRef, ThisLen, ThisValue);
> > +    if (EC) {
> > +      consumeError(std::move(EC));
> > +      HasError = true;
> > +      if (HadError)
> > +        *HadError = true;
> > +    }
> >   }
> > -  VarStreamArrayIterator() : Array(nullptr), IterRef() {}
> > +  VarStreamArrayIterator() : Array(nullptr), IterRef(), HasError(false) {}
> > +  ~VarStreamArrayIterator() {}
> > +
> >   bool operator==(const IterType &R) const {
> >     if (Array && R.Array) {
> >       // Both have a valid array, make sure they're same.
> > @@ -87,19 +102,30 @@ public:
> >
> >   bool operator!=(const IterType &R) { return !(*this == R); }
> >
> > -  const ValueType &operator*() const { return ThisValue; }
> > +  const ValueType &operator*() const {
> > +    assert(Array && !HasError);
> > +    return ThisValue;
> > +  }
> >
> >   IterType &operator++() {
> > -    if (!Array || IterRef.getLength() == 0 || ThisLen == 0)
> > +    if (!Array || IterRef.getLength() == 0 || ThisLen == 0 || HasError)
> >       return *this;
> >     IterRef = IterRef.drop_front(ThisLen);
> >     if (IterRef.getLength() == 0)
> >       ThisLen = 0;
> > -    else
> > -      // TODO: We should report an error if Extract fails.
> > -      ThisLen = Extract(IterRef, ThisValue);
> > -    if (ThisLen == 0)
> > +    else {
> > +      auto EC = Extract(IterRef, ThisLen, ThisValue);
> > +      if (EC) {
> > +        consumeError(std::move(EC));
> > +        HasError = true;
> > +        if (HadError)
> > +          *HadError = true;
> > +      }
> > +    }
> > +    if (ThisLen == 0 || HasError) {
> >       Array = nullptr;
> > +      ThisLen = 0;
> > +    }
> >     return *this;
> >   }
> >
> > @@ -114,6 +140,8 @@ private:
> >   uint32_t ThisLen;
> >   ValueType ThisValue;
> >   StreamRef IterRef;
> > +  bool HasError;
> > +  bool *HadError;
> >   Extractor Extract;
> > };
> >
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/StreamInterface.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamInterface.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamInterface.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/StreamInterface.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/StreamInterface.h Sat May 28 00:21:57 2016
> > @@ -28,8 +28,6 @@ class StreamInterface {
> > public:
> >   virtual ~StreamInterface() {}
> >
> > -  virtual Error readBytes(uint32_t Offset,
> > -                          MutableArrayRef<uint8_t> Buffer) const = 0;
> >   virtual Error readBytes(uint32_t Offset, uint32_t Size,
> >                           ArrayRef<uint8_t> &Buffer) const = 0;
> >
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/StreamReader.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamReader.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamReader.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/StreamReader.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/StreamReader.h Sat May 28 00:21:57 2016
> > @@ -28,18 +28,17 @@ class StreamReader {
> > public:
> >   StreamReader(const StreamInterface &S);
> >
> > -  Error readBytes(uint32_t Size, ArrayRef<uint8_t> &Buffer);
> > +  Error readBytes(ArrayRef<uint8_t> &Buffer, uint32_t Size);
> >   Error readInteger(uint16_t &Dest);
> >   Error readInteger(uint32_t &Dest);
> >   Error readZeroString(StringRef &Dest);
> >   Error readFixedString(StringRef &Dest, uint32_t Length);
> >   Error readStreamRef(StreamRef &Ref);
> >   Error readStreamRef(StreamRef &Ref, uint32_t Length);
> > -  Error readBytes(MutableArrayRef<uint8_t> Buffer);
> >
> >   template <typename T> Error readObject(const T *&Dest) {
> >     ArrayRef<uint8_t> Buffer;
> > -    if (auto EC = readBytes(sizeof(T), Buffer))
> > +    if (auto EC = readBytes(Buffer, sizeof(T)))
> >       return EC;
> >     Dest = reinterpret_cast<const T *>(Buffer.data());
> >     return Error::success();
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/StreamRef.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamRef.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/StreamRef.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/StreamRef.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/StreamRef.h Sat May 28 00:21:57 2016
> > @@ -26,11 +26,6 @@ public:
> >       : Stream(Other.Stream), ViewOffset(Other.ViewOffset),
> >         Length(Other.Length) {}
> >
> > -  Error readBytes(uint32_t Offset,
> > -                  MutableArrayRef<uint8_t> Buffer) const override {
> > -    return Stream->readBytes(ViewOffset + Offset, Buffer);
> > -  }
> > -
> >   Error readBytes(uint32_t Offset, uint32_t Size,
> >                   ArrayRef<uint8_t> &Buffer) const override {
> >     return Stream->readBytes(ViewOffset + Offset, Size, Buffer);
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDumper.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDumper.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDumper.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDumper.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDumper.h Sat May 28 00:21:57 2016
> > @@ -39,7 +39,7 @@ public:
> >
> >   /// Dumps the type records in Data. Returns false if there was a type stream
> >   /// parse error, and true otherwise.
> > -  bool dump(ArrayRef<uint8_t> Data);
> > +  bool dump(const CVSymbolArray &Symbols);
> >
> > private:
> >   ScopedPrinter &W;
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecord.h Sat May 28 00:21:57 2016
> > @@ -12,8 +12,8 @@
> >
> > #include "llvm/ADT/APSInt.h"
> > #include "llvm/ADT/Optional.h"
> > +#include "llvm/DebugInfo/CodeView/CVRecord.h"
> > #include "llvm/DebugInfo/CodeView/CodeView.h"
> > -#include "llvm/DebugInfo/CodeView/RecordIterator.h"
> > #include "llvm/DebugInfo/CodeView/RecordSerialization.h"
> > #include "llvm/DebugInfo/CodeView/StreamArray.h"
> > #include "llvm/DebugInfo/CodeView/StreamInterface.h"
> > @@ -1442,15 +1442,9 @@ public:
> >   StringRef Name;
> > };
> >
> > -typedef RecordIterator<SymbolKind> SymbolIterator;
> > typedef CVRecord<SymbolKind> CVSymbol;
> > typedef VarStreamArray<CVSymbol> CVSymbolArray;
> >
> > -inline iterator_range<SymbolIterator> makeSymbolRange(ArrayRef<uint8_t> Data,
> > -                                                      bool *HadError) {
> > -  return make_range(SymbolIterator(Data, HadError), SymbolIterator());
> > -}
> > -
> > } // namespace codeview
> > } // namespace llvm
> >
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h Sat May 28 00:21:57 2016
> > @@ -14,7 +14,6 @@
> > #include "llvm/ADT/StringSet.h"
> > #include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> >
> > namespace llvm {
> > class ScopedPrinter;
> > @@ -38,7 +37,7 @@ public:
> >
> >   /// Dumps the type records in Data. Returns false if there was a type stream
> >   /// parse error, and true otherwise.
> > -  bool dump(ArrayRef<uint8_t> Data);
> > +  bool dump(const CVTypeArray &Types);
> >
> >   /// Gets the type index for the next type record.
> >   unsigned getNextTypeIndex() const {
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h Sat May 28 00:21:57 2016
> > @@ -13,8 +13,10 @@
> > #include "llvm/ADT/APSInt.h"
> > #include "llvm/ADT/ArrayRef.h"
> > #include "llvm/ADT/StringRef.h"
> > +#include "llvm/DebugInfo/CodeView/CVRecord.h"
> > #include "llvm/DebugInfo/CodeView/CodeView.h"
> > #include "llvm/DebugInfo/CodeView/RecordSerialization.h"
> > +#include "llvm/DebugInfo/CodeView/StreamArray.h"
> > #include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/Support/ErrorOr.h"
> > #include <cinttypes>
> > @@ -1398,6 +1400,9 @@ private:
> >   uint64_t VBPtrOffset;
> >   uint64_t VTableIndex;
> > };
> > +
> > +typedef CVRecord<TypeLeafKind> CVType;
> > +typedef VarStreamArray<CVType> CVTypeArray;
> > }
> > }
> >
> >
> > Removed: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h?rev=271100&view=auto <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h?rev=271100&view=auto>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h (removed)
> > @@ -1,37 +0,0 @@
> > -//===- TypeStream.h ---------------------------------------------*- C++ -*-===//
> > -//
> > -//                     The LLVM Compiler Infrastructure
> > -//
> > -// This file is distributed under the University of Illinois Open Source
> > -// License. See LICENSE.TXT for details.
> > -//
> > -//===----------------------------------------------------------------------===//
> > -
> > -#ifndef LLVM_DEBUGINFO_CODEVIEW_TYPESTREAM_H
> > -#define LLVM_DEBUGINFO_CODEVIEW_TYPESTREAM_H
> > -
> > -#include "llvm/ADT/ArrayRef.h"
> > -#include "llvm/ADT/StringRef.h"
> > -#include "llvm/ADT/iterator_range.h"
> > -#include "llvm/DebugInfo/CodeView/RecordIterator.h"
> > -#include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/Support/Endian.h"
> > -#include <cstdint>
> > -#include <system_error>
> > -
> > -namespace llvm {
> > -
> > -class APSInt;
> > -
> > -namespace codeview {
> > -
> > -typedef RecordIterator<TypeLeafKind> TypeIterator;
> > -
> > -inline iterator_range<TypeIterator> makeTypeRange(ArrayRef<uint8_t> Data, bool *HadError) {
> > -  return make_range(TypeIterator(Data, HadError), TypeIterator());
> > -}
> > -
> > -} // end namespace codeview
> > -} // end namespace llvm
> > -
> > -#endif // LLVM_DEBUGINFO_CODEVIEW_TYPESTREAM_H
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h Sat May 28 00:21:57 2016
> > @@ -18,8 +18,7 @@ namespace llvm {
> > namespace codeview {
> >
> > /// Merges one type stream into another. Returns true on success.
> > -bool mergeTypeStreams(TypeTableBuilder &DestStream,
> > -                      ArrayRef<uint8_t> SrcStream);
> > +bool mergeTypeStreams(TypeTableBuilder &DestStream, const CVTypeArray &Types);
> >
> > } // end namespace codeview
> > } // end namespace llvm
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/MappedBlockStream.h Sat May 28 00:21:57 2016
> > @@ -27,14 +27,13 @@ class MappedBlockStream : public codevie
> > public:
> >   MappedBlockStream(uint32_t StreamIdx, const PDBFile &File);
> >
> > -  Error readBytes(uint32_t Offset,
> > -                  MutableArrayRef<uint8_t> Buffer) const override;
> >   Error readBytes(uint32_t Offset, uint32_t Size,
> >                   ArrayRef<uint8_t> &Buffer) const override;
> >
> >   uint32_t getLength() const override { return StreamLength; }
> >
> > private:
> > +  Error readBytes(uint32_t Offset, MutableArrayRef<uint8_t> Buffer) const;
> >   bool tryReadContiguously(uint32_t Offset, uint32_t Size,
> >                            ArrayRef<uint8_t> &Buffer) const;
> >
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModInfo.h Sat May 28 00:21:57 2016
> > @@ -25,10 +25,11 @@ private:
> >
> > public:
> >   ModInfo();
> > -  ModInfo(codeview::StreamRef Stream);
> >   ModInfo(const ModInfo &Info);
> >   ~ModInfo();
> >
> > +  static Error initialize(codeview::StreamRef Stream, ModInfo &Info);
> > +
> >   bool hasECInfo() const;
> >   uint16_t getTypeServerIndex() const;
> >   uint16_t getModuleStreamIndex() const;
> > @@ -51,7 +52,6 @@ private:
> > };
> >
> > struct ModuleInfoEx {
> > -  ModuleInfoEx(codeview::StreamRef Stream) : Info(Stream) {}
> >   ModuleInfoEx(const ModInfo &Info) : Info(Info) {}
> >   ModuleInfoEx(const ModuleInfoEx &Ex)
> >       : Info(Ex.Info), SourceFiles(Ex.SourceFiles) {}
> > @@ -64,9 +64,12 @@ struct ModuleInfoEx {
> >
> > namespace codeview {
> > template <> struct VarStreamArrayExtractor<pdb::ModInfo> {
> > -  uint32_t operator()(const StreamInterface &Stream, pdb::ModInfo &Info) const {
> > -    Info = pdb::ModInfo(Stream);
> > -    return Info.getRecordLength();
> > +  Error operator()(const StreamInterface &Stream, uint32_t &Length,
> > +                   pdb::ModInfo &Info) const {
> > +    if (auto EC = pdb::ModInfo::initialize(Stream, Info))
> > +      return EC;
> > +    Length = Info.getRecordLength();
> > +    return Error::success();
> >   }
> > };
> > }
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/ModStream.h Sat May 28 00:21:57 2016
> > @@ -11,7 +11,7 @@
> > #define LLVM_DEBUGINFO_PDB_RAW_MODSTREAM_H
> >
> > #include "llvm/ADT/iterator_range.h"
> > -#include "llvm/DebugInfo/CodeView/RecordIterator.h"
> > +#include "llvm/DebugInfo/CodeView/CVRecord.h"
> > #include "llvm/DebugInfo/CodeView/StreamRef.h"
> > #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
> > #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
> > @@ -29,7 +29,8 @@ public:
> >
> >   Error reload();
> >
> > -  iterator_range<codeview::CVSymbolArray::Iterator> symbols() const;
> > +  iterator_range<codeview::CVSymbolArray::Iterator>
> > +  symbols(bool *HadError) const;
> >
> > private:
> >   const ModInfo &Mod;
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/PublicsStream.h Sat May 28 00:21:57 2016
> > @@ -12,7 +12,6 @@
> >
> > #include "llvm/DebugInfo/CodeView/StreamArray.h"
> > #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> > #include "llvm/DebugInfo/PDB/PDBTypes.h"
> > #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
> > #include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
> > @@ -37,7 +36,8 @@ public:
> >   uint32_t getSymHash() const;
> >   uint32_t getAddrMap() const;
> >   uint32_t getNumBuckets() const { return NumBuckets; }
> > -  iterator_range<codeview::SymbolIterator> getSymbols() const;
> > +  iterator_range<codeview::CVSymbolArray::Iterator>
> > +  getSymbols(bool *HadError) const;
> >   codeview::FixedStreamArray<support::ulittle32_t> getHashBuckets() const {
> >     return HashBuckets;
> >   }
> > @@ -52,8 +52,6 @@ public:
> >   }
> >
> > private:
> > -  Error readSymbols();
> > -
> >   PDBFile &Pdb;
> >
> >   uint32_t StreamNum;
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/SymbolStream.h Sat May 28 00:21:57 2016
> > @@ -10,7 +10,7 @@
> > #ifndef LLVM_DEBUGINFO_PDB_RAW_PDBSYMBOLSTREAM_H
> > #define LLVM_DEBUGINFO_PDB_RAW_PDBSYMBOLSTREAM_H
> >
> > -#include "llvm/DebugInfo/CodeView/ByteStream.h"
> > +#include "llvm/DebugInfo/CodeView/StreamArray.h"
> > #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
> > #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
> >
> > @@ -26,10 +26,11 @@ public:
> >   ~SymbolStream();
> >   Error reload();
> >
> > -  iterator_range<codeview::SymbolIterator> getSymbols() const;
> > +  iterator_range<codeview::CVSymbolArray::Iterator>
> > +  getSymbols(bool *HadError) const;
> >
> > private:
> > -  codeview::ByteStream Stream;
> > +  codeview::CVSymbolArray SymbolRecords;
> >   MappedBlockStream MappedStream;
> > };
> > }
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h Sat May 28 00:21:57 2016
> > @@ -10,9 +10,9 @@
> > #ifndef LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H
> > #define LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H
> >
> > -#include "llvm/DebugInfo/CodeView/ByteStream.h"
> > +#include "llvm/DebugInfo/CodeView/StreamArray.h"
> > #include "llvm/DebugInfo/CodeView/StreamRef.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> > +#include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > #include "llvm/DebugInfo/PDB/PDBTypes.h"
> > #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
> > #include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
> > @@ -41,14 +41,14 @@ public:
> >   uint16_t getTypeHashStreamIndex() const;
> >   uint16_t getTypeHashStreamAuxIndex() const;
> >
> > -  iterator_range<codeview::TypeIterator> types(bool *HadError) const;
> > +  iterator_range<codeview::CVTypeArray::Iterator> types(bool *HadError) const;
> >
> > private:
> >   PDBFile &Pdb;
> >   MappedBlockStream Stream;
> >   HashFunctionType HashFunction;
> >
> > -  codeview::ByteStream RecordsBuffer;
> > +  codeview::CVTypeArray TypeRecords;
> >   codeview::StreamRef TypeIndexOffsetBuffer;
> >   codeview::StreamRef HashValuesBuffer;
> >   codeview::StreamRef HashAdjBuffer;
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/ByteStream.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ByteStream.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ByteStream.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/ByteStream.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/ByteStream.cpp Sat May 28 00:21:57 2016
> > @@ -17,41 +17,13 @@ using namespace llvm::codeview;
> >
> > ByteStream::ByteStream() {}
> >
> > -ByteStream::ByteStream(MutableArrayRef<uint8_t> Data) : Data(Data) {}
> > +ByteStream::ByteStream(ArrayRef<uint8_t> Data) : Data(Data) {}
> >
> > ByteStream::~ByteStream() {}
> >
> > -void ByteStream::reset() {
> > -  Ownership.reset();
> > -  Data = MutableArrayRef<uint8_t>();
> > -}
> > -
> > -void ByteStream::load(uint32_t Length) {
> > -  reset();
> > -  if (Length > 0)
> > -    Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length);
> > -  Ownership.reset(Data.data());
> > -}
> > -
> > -Error ByteStream::load(StreamReader &Reader, uint32_t Length) {
> > -  load(Length);
> > -  auto EC = Reader.readBytes(Data);
> > -  if (EC)
> > -    reset();
> > -  return EC;
> > -}
> > -
> > -Error ByteStream::readBytes(uint32_t Offset,
> > -                            MutableArrayRef<uint8_t> Buffer) const {
> > -  if (Data.size() < Buffer.size() + Offset)
> > -    return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
> > -  ::memcpy(Buffer.data() + Offset, Data.data(), Buffer.size());
> > -  return Error::success();
> > -}
> > -
> > Error ByteStream::readBytes(uint32_t Offset, uint32_t Size,
> >                             ArrayRef<uint8_t> &Buffer) const {
> > -  if (Data.size() < Buffer.size() + Offset)
> > +  if (Data.size() < Size + Offset)
> >     return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
> >   Buffer = Data.slice(Offset, Size);
> >   return Error::success();
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/StreamReader.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/StreamReader.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/StreamReader.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/StreamReader.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/StreamReader.cpp Sat May 28 00:21:57 2016
> > @@ -17,20 +17,13 @@ using namespace llvm::codeview;
> >
> > StreamReader::StreamReader(const StreamInterface &S) : Stream(S), Offset(0) {}
> >
> > -Error StreamReader::readBytes(uint32_t Size, ArrayRef<uint8_t> &Buffer) {
> > +Error StreamReader::readBytes(ArrayRef<uint8_t> &Buffer, uint32_t Size) {
> >   if (auto EC = Stream.readBytes(Offset, Size, Buffer))
> >     return EC;
> >   Offset += Size;
> >   return Error::success();
> > }
> >
> > -Error StreamReader::readBytes(MutableArrayRef<uint8_t> Buffer) {
> > -  if (auto EC = Stream.readBytes(Offset, Buffer))
> > -    return EC;
> > -  Offset += Buffer.size();
> > -  return Error::success();
> > -}
> > -
> > Error StreamReader::readInteger(uint16_t &Dest) {
> >   const support::ulittle16_t *P;
> >   if (auto EC = readObject(P))
> > @@ -63,7 +56,7 @@ Error StreamReader::readZeroString(Strin
> >   setOffset(OriginalOffset);
> >
> >   ArrayRef<uint8_t> Data;
> > -  if (auto EC = readBytes(Length, Data))
> > +  if (auto EC = readBytes(Data, Length))
> >     return EC;
> >   Dest = StringRef(reinterpret_cast<const char *>(Data.begin()), Data.size());
> >
> > @@ -74,7 +67,7 @@ Error StreamReader::readZeroString(Strin
> >
> > Error StreamReader::readFixedString(StringRef &Dest, uint32_t Length) {
> >   ArrayRef<uint8_t> Bytes;
> > -  if (auto EC = readBytes(Length, Bytes))
> > +  if (auto EC = readBytes(Bytes, Length))
> >     return EC;
> >   Dest = StringRef(reinterpret_cast<const char *>(Bytes.begin()), Bytes.size());
> >   return Error::success();
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp Sat May 28 00:21:57 2016
> > @@ -872,8 +872,8 @@ bool CVSymbolDumper::dump(const CVRecord
> >   return !Dumper.hadError();
> > }
> >
> > -bool CVSymbolDumper::dump(ArrayRef<uint8_t> Data) {
> > +bool CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
> >   CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
> > -  Dumper.visitSymbolStream(Data);
> > +  Dumper.visitSymbolStream(Symbols);
> >   return !Dumper.hadError();
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp Sat May 28 00:21:57 2016
> > @@ -12,7 +12,6 @@
> > #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
> > #include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> > #include "llvm/Support/ScopedPrinter.h"
> >
> > using namespace llvm;
> > @@ -683,10 +682,10 @@ bool CVTypeDumper::dump(const CVRecord<T
> >   return !Dumper.hadError();
> > }
> >
> > -bool CVTypeDumper::dump(ArrayRef<uint8_t> Data) {
> > +bool CVTypeDumper::dump(const CVTypeArray &Types) {
> >   assert(W && "printer should not be null");
> >   CVTypeDumperImpl Dumper(*this, *W, PrintRecordBytes);
> > -  Dumper.visitTypeStream(Data);
> > +  Dumper.visitTypeStream(Types);
> >   return !Dumper.hadError();
> > }
> >
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp Sat May 28 00:21:57 2016
> > @@ -12,9 +12,9 @@
> > #include "llvm/ADT/StringExtras.h"
> > #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
> > #include "llvm/DebugInfo/CodeView/FieldListRecordBuilder.h"
> > +#include "llvm/DebugInfo/CodeView/StreamRef.h"
> > #include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> > #include "llvm/Support/ScopedPrinter.h"
> >
> > using namespace llvm;
> > @@ -71,7 +71,7 @@ public:
> >
> >   void visitFieldList(TypeLeafKind Leaf, ArrayRef<uint8_t> FieldData);
> >
> > -  bool mergeStream(ArrayRef<uint8_t> SrcStream);
> > +  bool mergeStream(const CVTypeArray &Types);
> >
> > private:
> >   bool hadError() { return FoundBadTypeIndex || CVTypeVisitor::hadError(); }
> > @@ -131,14 +131,14 @@ void TypeStreamMerger::visitUnknownMembe
> >   parseError();
> > }
> >
> > -bool TypeStreamMerger::mergeStream(ArrayRef<uint8_t> SrcStream) {
> > +bool TypeStreamMerger::mergeStream(const CVTypeArray &Types) {
> >   assert(IndexMap.empty());
> > -  visitTypeStream(SrcStream);
> > +  visitTypeStream(Types);
> >   IndexMap.clear();
> >   return !hadError();
> > }
> >
> > bool llvm::codeview::mergeTypeStreams(TypeTableBuilder &DestStream,
> > -                                      ArrayRef<uint8_t> SrcStream) {
> > -  return TypeStreamMerger(DestStream).mergeStream(SrcStream);
> > +                                      const CVTypeArray &Types) {
> > +  return TypeStreamMerger(DestStream).mergeStream(Types);
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/ModInfo.cpp Sat May 28 00:21:57 2016
> > @@ -69,28 +69,25 @@ struct ModInfo::FileLayout {
> >
> > ModInfo::ModInfo() : Layout(nullptr) {}
> >
> > -ModInfo::ModInfo(codeview::StreamRef Stream) : Layout(nullptr) {
> > -  codeview::StreamReader Reader(Stream);
> > -  if (auto EC = Reader.readObject(Layout)) {
> > -    consumeError(std::move(EC));
> > -    return;
> > -  }
> > -  if (auto EC = Reader.readZeroString(ModuleName)) {
> > -    consumeError(std::move(EC));
> > -    return;
> > -  }
> > -  if (auto EC = Reader.readZeroString(ObjFileName)) {
> > -    consumeError(std::move(EC));
> > -    return;
> > -  }
> > -}
> > -
> > ModInfo::ModInfo(const ModInfo &Info)
> >     : ModuleName(Info.ModuleName), ObjFileName(Info.ObjFileName),
> >       Layout(Info.Layout) {}
> >
> > ModInfo::~ModInfo() {}
> >
> > +Error ModInfo::initialize(codeview::StreamRef Stream, ModInfo &Info) {
> > +  codeview::StreamReader Reader(Stream);
> > +  if (auto EC = Reader.readObject(Info.Layout))
> > +    return EC;
> > +
> > +  if (auto EC = Reader.readZeroString(Info.ModuleName))
> > +    return EC;
> > +
> > +  if (auto EC = Reader.readZeroString(Info.ObjFileName))
> > +    return EC;
> > +  return Error::success();
> > +}
> > +
> > bool ModInfo::hasECInfo() const { return (Layout->Flags & HasECFlagMask) != 0; }
> >
> > uint16_t ModInfo::getTypeServerIndex() const {
> >
> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/ModStream.cpp Sat May 28 00:21:57 2016
> > @@ -9,7 +9,6 @@
> >
> > #include "llvm/DebugInfo/PDB/Raw/ModStream.h"
> >
> > -#include "llvm/DebugInfo/CodeView/RecordIterator.h"
> > #include "llvm/DebugInfo/CodeView/StreamReader.h"
> > #include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
> > #include "llvm/DebugInfo/PDB/Raw/RawError.h"
> > @@ -58,6 +57,7 @@ Error ModStream::reload() {
> >   return Error::success();
> > }
> >
> > -iterator_range<codeview::CVSymbolArray::Iterator> ModStream::symbols() const {
> > +iterator_range<codeview::CVSymbolArray::Iterator>
> > +ModStream::symbols(bool *HadError) const {
> >   return llvm::make_range(SymbolsSubstream.begin(), SymbolsSubstream.end());
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PublicsStream.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/PublicsStream.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/PublicsStream.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/PublicsStream.cpp Sat May 28 00:21:57 2016
> > @@ -113,7 +113,7 @@ Error PublicsStream::reload() {
> >   // A bitmap of a fixed length follows.
> >   size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32);
> >   uint32_t NumBitmapEntries = BitmapSizeInBits / 8;
> > -  if (auto EC = Reader.readBytes(NumBitmapEntries, Bitmap))
> > +  if (auto EC = Reader.readBytes(Bitmap, NumBitmapEntries))
> >     return joinErrors(std::move(EC),
> >                       make_error<RawError>(raw_error_code::corrupt_file,
> >                                            "Could not read a bitmap."));
> > @@ -156,13 +156,14 @@ Error PublicsStream::reload() {
> >   return Error::success();
> > }
> >
> > -iterator_range<codeview::SymbolIterator> PublicsStream::getSymbols() const {
> > -  using codeview::SymbolIterator;
> > +iterator_range<codeview::CVSymbolArray::Iterator>
> > +PublicsStream::getSymbols(bool *HadError) const {
> >   auto SymbolS = Pdb.getPDBSymbolStream();
> >   if (SymbolS.takeError()) {
> > -    return llvm::make_range<SymbolIterator>(SymbolIterator(), SymbolIterator());
> > +    codeview::CVSymbolArray::Iterator Iter;
> 
> Coverity complains about:
> >>>     CID 1356134:  Memory - illegal accesses  (UNINIT)
> >>>     Declaring variable "Iter".
> 
> --
> Mehdi
> 
> 
> 
> > +    return llvm::make_range(Iter, Iter);
> >   }
> >   SymbolStream &SS = SymbolS.get();
> >
> > -  return SS.getSymbols();
> > +  return SS.getSymbols(HadError);
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/SymbolStream.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/SymbolStream.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/SymbolStream.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/SymbolStream.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/SymbolStream.cpp Sat May 28 00:21:57 2016
> > @@ -30,20 +30,13 @@ SymbolStream::~SymbolStream() {}
> > Error SymbolStream::reload() {
> >   codeview::StreamReader Reader(MappedStream);
> >
> > -  if (Stream.load(Reader, MappedStream.getLength()))
> > -    return make_error<RawError>(raw_error_code::corrupt_file,
> > -                                "Could not load symbol stream.");
> > +  if (auto EC = Reader.readArray(SymbolRecords, MappedStream.getLength()))
> > +    return EC;
> >
> >   return Error::success();
> > }
> >
> > -iterator_range<codeview::SymbolIterator> SymbolStream::getSymbols() const {
> > -  using codeview::SymbolIterator;
> > -  ArrayRef<uint8_t> Data;
> > -  if (auto Error = Stream.readBytes(0, Stream.getLength(), Data)) {
> > -    consumeError(std::move(Error));
> > -    return iterator_range<SymbolIterator>(SymbolIterator(), SymbolIterator());
> > -  }
> > -
> > -  return codeview::makeSymbolRange(Data, nullptr);
> > +iterator_range<codeview::CVSymbolArray::Iterator>
> > +SymbolStream::getSymbols(bool *HadError) const {
> > +  return llvm::make_range(SymbolRecords.begin(HadError), SymbolRecords.end());
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp Sat May 28 00:21:57 2016
> > @@ -92,7 +92,7 @@ Error TpiStream::reload() {
> >   HashFunction = HashBufferV8;
> >
> >   // The actual type records themselves come from this stream
> > -  if (auto EC = RecordsBuffer.load(Reader, Header->TypeRecordBytes))
> > +  if (auto EC = Reader.readArray(TypeRecords, Header->TypeRecordBytes))
> >     return EC;
> >
> >   // Hash indices, hash values, etc come from the hash stream.
> > @@ -136,6 +136,7 @@ uint16_t TpiStream::getTypeHashStreamAux
> >   return Header->HashAuxStreamIndex;
> > }
> >
> > -iterator_range<codeview::TypeIterator> TpiStream::types(bool *HadError) const {
> > -  return codeview::makeTypeRange(RecordsBuffer.data(), /*HadError=*/HadError);
> > +iterator_range<codeview::CVTypeArray::Iterator>
> > +TpiStream::types(bool *HadError) const {
> > +  return llvm::make_range(TypeRecords.begin(HadError), TypeRecords.end());
> > }
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Sat May 28 00:21:57 2016
> > @@ -354,7 +354,7 @@ static Error dumpStreamData(ScopedPrinte
> >     ArrayRef<uint8_t> Data;
> >     uint32_t BytesToReadInBlock = std::min(
> >         R.bytesRemaining(), static_cast<uint32_t>(File.getBlockSize()));
> > -    if (auto EC = R.readBytes(BytesToReadInBlock, Data))
> > +    if (auto EC = R.readBytes(Data, BytesToReadInBlock))
> >       return EC;
> >     P.printBinaryBlock(
> >         "Data",
> > @@ -485,7 +485,8 @@ static Error dumpDbiStream(ScopedPrinter
> >           return EC;
> >
> >         codeview::CVSymbolDumper SD(P, TD, nullptr, false);
> > -        for (auto &S : ModS.symbols()) {
> > +        bool HadError = false;
> > +        for (auto &S : ModS.symbols(&HadError)) {
> >           DictScope DD(P, "");
> >
> >           if (opts::DumpModuleSyms)
> > @@ -493,6 +494,9 @@ static Error dumpDbiStream(ScopedPrinter
> >           if (opts::DumpSymRecordBytes)
> >             P.printBinaryBlock("Bytes", S.Data);
> >         }
> > +        if (HadError)
> > +          return make_error<RawError>(raw_error_code::corrupt_file,
> > +                                      "DBI stream contained corrupt record");
> >       }
> >     }
> >   }
> > @@ -509,7 +513,7 @@ static Error dumpTpiStream(ScopedPrinter
> >   StringRef VerLabel;
> >   if (StreamIdx == StreamTPI) {
> >     DumpRecordBytes = opts::DumpTpiRecordBytes;
> > -    DumpRecords = opts::DumpTpiRecordBytes;
> > +    DumpRecords = opts::DumpTpiRecords;
> >     Label = "Type Info Stream (TPI)";
> >     VerLabel = "TPI Version";
> >   } else if (StreamIdx == StreamIPI) {
> > @@ -595,13 +599,19 @@ static Error dumpPublicsStream(ScopedPri
> >               printSectionOffset);
> >   ListScope L(P, "Symbols");
> >   codeview::CVSymbolDumper SD(P, TD, nullptr, false);
> > -  for (auto S : Publics.getSymbols()) {
> > +  bool HadError = false;
> > +  for (auto S : Publics.getSymbols(&HadError)) {
> >     DictScope DD(P, "");
> >
> >     SD.dump(S);
> >     if (opts::DumpSymRecordBytes)
> >       P.printBinaryBlock("Bytes", S.Data);
> >   }
> > +  if (HadError)
> > +    return make_error<RawError>(
> > +        raw_error_code::corrupt_file,
> > +        "Public symbol stream contained corrupt record");
> > +
> >   return Error::success();
> > }
> >
> >
> > Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=271101&r1=271100&r2=271101&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=271101&r1=271100&r2=271101&view=diff>
> > ==============================================================================
> > --- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
> > +++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Sat May 28 00:21:57 2016
> > @@ -22,6 +22,7 @@
> > #include "llvm/ADT/DenseMap.h"
> > #include "llvm/ADT/SmallString.h"
> > #include "llvm/ADT/StringExtras.h"
> > +#include "llvm/DebugInfo/CodeView/ByteStream.h"
> > #include "llvm/DebugInfo/CodeView/CodeView.h"
> > #include "llvm/DebugInfo/CodeView/Line.h"
> > #include "llvm/DebugInfo/CodeView/MemoryTypeTableBuilder.h"
> > @@ -32,7 +33,6 @@
> > #include "llvm/DebugInfo/CodeView/TypeDumper.h"
> > #include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeStream.h"
> > #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
> > #include "llvm/Object/COFF.h"
> > #include "llvm/Object/ObjectFile.h"
> > @@ -898,8 +898,16 @@ void COFFDumper::printCodeViewSymbolsSub
> >                                                         SectionContents);
> >
> >   CVSymbolDumper CVSD(W, CVTD, std::move(CODD), opts::CodeViewSubsectionBytes);
> > +  ByteStream Stream(BinaryData);
> > +  CVSymbolArray Symbols;
> > +  StreamReader Reader(Stream);
> > +  if (auto EC = Reader.readArray(Symbols, Reader.getLength())) {
> > +    consumeError(std::move(EC));
> > +    W.flush();
> > +    error(object_error::parse_failed);
> > +  }
> >
> > -  if (!CVSD.dump(BinaryData)) {
> > +  if (!CVSD.dump(Symbols)) {
> >     W.flush();
> >     error(object_error::parse_failed);
> >   }
> > @@ -996,7 +1004,16 @@ void COFFDumper::mergeCodeViewTypes(Memo
> >       Data = Data.drop_front(4);
> >       ArrayRef<uint8_t> Bytes(reinterpret_cast<const uint8_t *>(Data.data()),
> >                               Data.size());
> > -      if (!mergeTypeStreams(CVTypes, Bytes))
> > +      ByteStream Stream(Bytes);
> > +      CVTypeArray Types;
> > +      StreamReader Reader(Stream);
> > +      if (auto EC = Reader.readArray(Types, Reader.getLength())) {
> > +        consumeError(std::move(EC));
> > +        W.flush();
> > +        error(object_error::parse_failed);
> > +      }
> > +
> > +      if (!mergeTypeStreams(CVTypes, Types))
> >         return error(object_error::parse_failed);
> >     }
> >   }
> > @@ -1020,7 +1037,16 @@ void COFFDumper::printCodeViewTypeSectio
> >
> >   ArrayRef<uint8_t> BinaryData(reinterpret_cast<const uint8_t *>(Data.data()),
> >                                Data.size());
> > -  if (!CVTD.dump(BinaryData)) {
> > +  ByteStream Stream(BinaryData);
> > +  CVTypeArray Types;
> > +  StreamReader Reader(Stream);
> > +  if (auto EC = Reader.readArray(Types, Reader.getLength())) {
> > +    consumeError(std::move(EC));
> > +    W.flush();
> > +    error(object_error::parse_failed);
> > +  }
> > +
> > +  if (!CVTD.dump(Types)) {
> >     W.flush();
> >     error(object_error::parse_failed);
> >   }
> > @@ -1472,7 +1498,16 @@ void llvm::dumpCodeViewMergedTypes(
> >   CVTypeDumper CVTD(Writer, opts::CodeViewSubsectionBytes);
> >   ArrayRef<uint8_t> BinaryData(reinterpret_cast<const uint8_t *>(Buf.data()),
> >                                Buf.size());
> > -  if (!CVTD.dump(BinaryData)) {
> > +  ByteStream Stream(BinaryData);
> > +  CVTypeArray Types;
> > +  StreamReader Reader(Stream);
> > +  if (auto EC = Reader.readArray(Types, Reader.getLength())) {
> > +    consumeError(std::move(EC));
> > +    Writer.flush();
> > +    error(object_error::parse_failed);
> > +  }
> > +
> > +  if (!CVTD.dump(Types)) {
> >     Writer.flush();
> >     error(object_error::parse_failed);
> >   }
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160602/d126cca4/attachment-0001.html>


More information about the llvm-commits mailing list