[llvm] r271101 - [pdb] Finish conversion to zero copy pdb access.
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Tue May 31 15:20:51 PDT 2016
> On May 27, 2016, at 10:21 PM, Zachary Turner via llvm-commits <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
> 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> ==============================================================================
> --- 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
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list