[llvm] r268454 - Move CodeViewTypeStream to DebugInfo/CodeView

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Tue May 3 16:39:53 PDT 2016


Hi, this should have been fixed in r268458.  Can you let me know if you're
still seeing it?

On Tue, May 3, 2016 at 4:35 PM Mike Aizatsky <aizatsky at google.com> wrote:

> This change breaks the build:
>
>
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/12486/steps/check-llvm%20ubsan/logs/stdio
>
> FAILED:
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build0/bin/clang++
>   -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
> -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Itools/llvm-pdbdump
> -I/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump
> -Iinclude
> -I/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include
> -fsanitize=undefined -w -fPIC -fvisibility-inlines-hidden -Wall -W
> -Wno-unused-parameter -Wwrite-strings -Wcast-qual
> -Wmissing-field-initializers -pedantic -Wno-long-long
> -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor
> -std=c++11 -fno-omit-frame-pointer -O1 -fsanitize=undefined
> -fno-sanitize=vptr,function -fno-sanitize-recover=all -fcolor-diagnostics
> -g    -fno-exceptions -fno-rtti -MMD -MT
> tools/llvm-pdbdump/CMakeFiles/llvm-pdbdump.dir/llvm-pdbdump.cpp.o -MF
> tools/llvm-pdbdump/CMakeFiles/llvm-pdbdump.dir/llvm-pdbdump.cpp.o.d -o
> tools/llvm-pdbdump/CMakeFiles/llvm-pdbdump.dir/llvm-pdbdump.cpp.o -c
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp:157:30:
> error: no matching function for call to 'min'
>     uint32_t BytesThisLine = std::min(Bytes.size(), BytesPerRow);
>                              ^~~~~~~~
> /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/algorithmfwd.h:367:5:
> note: candidate template ignored: deduced conflicting types for parameter
> '_Tp' ('unsigned long' vs. 'unsigned int')
>     min(const _Tp&, const _Tp&);
>     ^
> /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algo.h:3444:5:
> note: candidate template ignored: could not match
> 'initializer_list<type-parameter-0-0>' against 'unsigned long'
>     min(initializer_list<_Tp> __l, _Compare __comp)
>     ^
> /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/algorithmfwd.h:371:5:
> note: candidate function template not viable: requires 3 arguments, but 2
> were provided
>     min(const _Tp&, const _Tp&, _Compare);
>     ^
> /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algo.h:3439:5:
> note: candidate function template not viable: requires single argument
> '__l', but 2 arguments were provided
>     min(initializer_list<_Tp> __l)
>     ^
> 1 error generated.
>
>
> On Tue, May 3, 2016 at 3:24 PM Zachary Turner via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: zturner
>> Date: Tue May  3 17:18:17 2016
>> New Revision: 268454
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=268454&view=rev
>> Log:
>> Move CodeViewTypeStream to DebugInfo/CodeView
>>
>> Ability to parse codeview type streams is also needed by
>> DebugInfoPDB for parsing PDBs, so moving this into a library
>> gives us this option.  Since DebugInfoPDB had already hand
>> rolled some code to do this, that code is now convereted over
>> to using this common abstraction.
>>
>> Differential Revision: http://reviews.llvm.org/D19887
>> Reviewed By: dblaikie, amccarth
>>
>> Added:
>>     llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h
>> Modified:
>>     llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h
>>     llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp
>>     llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
>>     llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
>>
>> Added: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h?rev=268454&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h (added)
>> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStream.h Tue May  3
>> 17:18:17 2016
>> @@ -0,0 +1,130 @@
>> +//===- 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/iterator_range.h"
>> +#include "llvm/ADT/StringRef.h"
>> +#include "llvm/DebugInfo/CodeView/CodeView.h"
>> +#include "llvm/DebugInfo/CodeView/TypeRecord.h"
>> +#include "llvm/Object/Error.h"
>> +#include "llvm/Support/Endian.h"
>> +#include "llvm/Support/ErrorOr.h"
>> +
>> +#include <stdint.h>
>> +
>> +namespace llvm {
>> +namespace codeview {
>> +
>> +/// Consumes sizeof(T) bytes from the given byte sequence. Returns an
>> error if
>> +/// there are not enough bytes remaining. Reinterprets the consumed
>> bytes as a
>> +/// T object and points 'Res' at them.
>> +template <typename T>
>> +inline std::error_code consumeObject(StringRef &Data, const T *&Res) {
>> +  if (Data.size() < sizeof(*Res))
>> +    return object::object_error::parse_failed;
>> +  Res = reinterpret_cast<const T *>(Data.data());
>> +  Data = Data.drop_front(sizeof(*Res));
>> +  return std::error_code();
>> +}
>> +
>> +inline std::error_code consumeUInt32(StringRef &Data, uint32_t &Res) {
>> +  const support::ulittle32_t *IntPtr;
>> +  if (auto EC = consumeObject(Data, IntPtr))
>> +    return EC;
>> +  Res = *IntPtr;
>> +  return std::error_code();
>> +}
>> +
>> +// A const input iterator interface to the CodeView type stream.
>> +class TypeIterator {
>> +public:
>> +  struct TypeRecord {
>> +    std::size_t Length;
>> +    TypeLeafKind Leaf;
>> +    StringRef LeafData;
>> +  };
>> +
>> +  explicit TypeIterator(const StringRef &SectionData)
>> +      : Data(SectionData), AtEnd(false) {
>> +    next(); // Prime the pump
>> +  }
>> +
>> +  TypeIterator() : 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 TypeIterator &lhs, const TypeIterator
>> &rhs) {
>> +    return (lhs.Data.begin() == rhs.Data.begin()) || (lhs.AtEnd &&
>> rhs.AtEnd);
>> +  }
>> +
>> +  friend bool operator!=(const TypeIterator &lhs, const TypeIterator
>> &rhs) {
>> +    return !(lhs == rhs);
>> +  }
>> +
>> +  const TypeRecord &operator*() const {
>> +    assert(!AtEnd);
>> +    return Current;
>> +  }
>> +
>> +  const TypeRecord *operator->() const {
>> +    assert(!AtEnd);
>> +    return &Current;
>> +  }
>> +
>> +  TypeIterator operator++() {
>> +    next();
>> +    return *this;
>> +  }
>> +
>> +  TypeIterator operator++(int) {
>> +    TypeIterator 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;
>> +    }
>> +
>> +    const TypeRecordPrefix *Rec;
>> +    if (consumeObject(Data, Rec))
>> +      return;
>> +    Current.Length = Rec->Len;
>> +    Current.Leaf = static_cast<TypeLeafKind>(uint16_t(Rec->Leaf));
>> +    Current.LeafData = Data.substr(0, Current.Length - 2);
>> +
>> +    // The next record starts immediately after this one.
>> +    Data = Data.drop_front(Current.LeafData.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;
>> +  }
>> +
>> +  StringRef Data;
>> +  TypeRecord Current;
>> +  bool AtEnd;
>> +};
>> +
>> +inline iterator_range<TypeIterator> makeTypeRange(StringRef Data) {
>> +  return make_range(TypeIterator(Data), TypeIterator());
>> +}
>> +}
>> +}
>> +
>> +#endif
>>
>> 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=268454&r1=268453&r2=268454&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h (original)
>> +++ llvm/trunk/include/llvm/DebugInfo/PDB/Raw/TpiStream.h Tue May  3
>> 17:18:17 2016
>> @@ -10,6 +10,7 @@
>>  #ifndef LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H
>>  #define LLVM_DEBUGINFO_PDB_RAW_PDBTPISTREAM_H
>>
>> +#include "llvm/DebugInfo/CodeView/TypeStream.h"
>>  #include "llvm/DebugInfo/PDB/PDBTypes.h"
>>  #include "llvm/DebugInfo/PDB/Raw/ByteStream.h"
>>  #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
>> @@ -25,12 +26,6 @@ class TpiStream {
>>    struct HeaderInfo;
>>
>>  public:
>> -  struct HashedTypeRecord {
>> -    uint32_t Hash;
>> -    codeview::TypeLeafKind Kind;
>> -    ArrayRef<uint8_t> Record;
>> -  };
>> -
>>    TpiStream(PDBFile &File);
>>    ~TpiStream();
>>    std::error_code reload();
>> @@ -41,7 +36,7 @@ public:
>>    uint32_t TypeIndexEnd() const;
>>    uint32_t NumTypeRecords() const;
>>
>> -  ArrayRef<HashedTypeRecord> records() const;
>> +  iterator_range<codeview::TypeIterator> types() const;
>>
>>  private:
>>    PDBFile &Pdb;
>> @@ -53,7 +48,6 @@ private:
>>    ByteStream HashValuesBuffer;
>>    ByteStream HashAdjBuffer;
>>
>> -  std::vector<HashedTypeRecord> TypeRecords;
>>    std::unique_ptr<HeaderInfo> Header;
>>  };
>>  }
>>
>> 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=268454&r1=268453&r2=268454&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp (original)
>> +++ llvm/trunk/lib/DebugInfo/PDB/Raw/TpiStream.cpp Tue May  3 17:18:17
>> 2016
>> @@ -88,25 +88,6 @@ std::error_code TpiStream::reload() {
>>
>>    // The actual type records themselves come from this stream
>>    RecordsBuffer.initialize(Reader, Header->TypeRecordBytes);
>> -  TypeRecords.resize(TypeIndexEnd() - ::MinTypeIndex);
>> -  StreamReader RecordsReader(RecordsBuffer);
>> -  for (uint32_t I = TypeIndexBegin(); I < TypeIndexEnd(); ++I) {
>> -    HashedTypeRecord &Record = TypeRecords[I - ::MinTypeIndex];
>> -    codeview::TypeRecordPrefix Prefix;
>> -    if (auto EC = RecordsReader.readObject(&Prefix))
>> -      return EC;
>> -
>> -    Record.Kind =
>> -
>> static_cast<codeview::TypeLeafKind>(static_cast<uint16_t>(Prefix.Leaf));
>> -
>> -    // Since we read this entire buffer into a ByteStream, we are
>> guaranteed
>> -    // that the entire buffer is contiguous (i.e. there's no longer a
>> chance
>> -    // that it splits across a page boundary.  So we can request a
>> reference
>> -    // directly into the stream buffer to avoid unnecessary memory
>> copies.
>> -    uint32_t RecordSize = Prefix.Len - sizeof(Prefix.Leaf);
>> -    if (auto EC = RecordsReader.getArrayRef(Record.Record, RecordSize))
>> -      return EC;
>> -  }
>>
>>    // Hash indices, hash values, etc come from the hash stream.
>>    MappedBlockStream HS(Header->HashStreamIndex, Pdb);
>> @@ -136,8 +117,6 @@ uint32_t TpiStream::NumTypeRecords() con
>>    return TypeIndexEnd() - TypeIndexBegin();
>>  }
>>
>> -ArrayRef<TpiStream::HashedTypeRecord> TpiStream::records() const {
>> -  const HashedTypeRecord *Begin =
>> -      &TypeRecords[TypeIndexBegin() - ::MinTypeIndex];
>> -  return ArrayRef<HashedTypeRecord>(Begin, NumTypeRecords());
>> +iterator_range<codeview::TypeIterator> TpiStream::types() const {
>> +  return codeview::makeTypeRange(RecordsBuffer.str());
>>  }
>>
>> 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=268454&r1=268453&r2=268454&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
>> +++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Tue May  3 17:18:17
>> 2016
>> @@ -149,27 +149,24 @@ cl::opt<bool> NoEnumDefs("no-enum-defini
>>                           cl::cat(FilterCategory));
>>  }
>>
>> -static void dumpBytes(raw_ostream &S, ArrayRef<uint8_t> Bytes,
>> -                      uint32_t BytesPerRow, uint32_t Indent) {
>> +static void dumpBytes(raw_ostream &S, StringRef Bytes, uint32_t
>> BytesPerRow,
>> +                      uint32_t Indent) {
>>    S << "[";
>> -  uint32_t I = 0;
>>
>> -  uint32_t BytesRemaining = Bytes.size();
>> -  while (BytesRemaining > 0) {
>> -    uint32_t BytesThisLine = std::min(BytesRemaining, BytesPerRow);
>> -    for (size_t L = 0; L < BytesThisLine; ++L, ++I) {
>> -      S << format_hex_no_prefix(Bytes[I], 2, true);
>> -      if (L + 1 < BytesThisLine)
>> +  while (!Bytes.empty()) {
>> +    uint32_t BytesThisLine = std::min(Bytes.size(), BytesPerRow);
>> +    while (BytesThisLine > 0) {
>> +      S << format_hex_no_prefix(uint8_t(Bytes.front()), 2, true);
>> +      Bytes = Bytes.drop_front();
>> +      if (--BytesThisLine > 0)
>>          S << ' ';
>>      }
>> -    BytesRemaining -= BytesThisLine;
>> -    if (BytesRemaining > 0) {
>> +    if (!Bytes.empty()) {
>>        S << '\n';
>>        S.indent(Indent);
>>      }
>>    }
>>    S << ']';
>> -  S.flush();
>>  }
>>
>>  static void dumpStructure(RawSession &RS) {
>> @@ -321,10 +318,10 @@ static void dumpStructure(RawSession &RS
>>    TpiStream &Tpi = File.getPDBTpiStream();
>>    outs() << "TPI Version: " << Tpi.getTpiVersion() << '\n';
>>    outs() << "Record count: " << Tpi.NumTypeRecords() << '\n';
>> -  for (auto &Record : Tpi.records()) {
>> -    outs().indent(2) << "Kind: 0x" << Record.Kind;
>> +  for (auto &Type : Tpi.types()) {
>> +    outs().indent(2) << "Kind: 0x" << Type.Leaf;
>>      outs().indent(2) << "Bytes: ";
>> -    dumpBytes(outs(), Record.Record, 16, 24);
>> +    dumpBytes(outs(), Type.LeafData, 16, 24);
>>      outs() << '\n';
>>    }
>>  }
>>
>> Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=268454&r1=268453&r2=268454&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
>> +++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Tue May  3 17:18:17 2016
>> @@ -28,6 +28,7 @@
>>  #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
>>  #include "llvm/DebugInfo/CodeView/TypeIndex.h"
>>  #include "llvm/DebugInfo/CodeView/TypeRecord.h"
>> +#include "llvm/DebugInfo/CodeView/TypeStream.h"
>>  #include "llvm/Object/COFF.h"
>>  #include "llvm/Object/ObjectFile.h"
>>  #include "llvm/Support/COFF.h"
>> @@ -958,26 +959,6 @@ void COFFDumper::printCodeViewDebugInfo(
>>    }
>>  }
>>
>> -/// Consumes sizeof(T) bytes from the given byte sequence. Returns an
>> error if
>> -/// there are not enough bytes remaining. Reinterprets the consumed
>> bytes as a
>> -/// T object and points 'Res' at them.
>> -template <typename T>
>> -static std::error_code consumeObject(StringRef &Data, const T *&Res) {
>> -  if (Data.size() < sizeof(*Res))
>> -    return object_error::parse_failed;
>> -  Res = reinterpret_cast<const T *>(Data.data());
>> -  Data = Data.drop_front(sizeof(*Res));
>> -  return std::error_code();
>> -}
>> -
>> -static std::error_code consumeUInt32(StringRef &Data, uint32_t &Res) {
>> -  const ulittle32_t *IntPtr;
>> -  if (auto EC = consumeObject(Data, IntPtr))
>> -    return EC;
>> -  Res = *IntPtr;
>> -  return std::error_code();
>> -}
>> -
>>  void COFFDumper::initializeFileAndStringTables(StringRef Data) {
>>    while (!Data.empty() && (CVFileChecksumTable.data() == nullptr ||
>>                             CVStringTable.data() == nullptr)) {
>> @@ -1964,113 +1945,6 @@ static StringRef getLeafTypeName(TypeLea
>>    return "UnknownLeaf";
>>  }
>>
>> -// A const input iterator interface to the CodeView type stream.
>> -class CodeViewTypeIterator {
>> -public:
>> -  struct TypeRecord {
>> -    std::size_t Length;
>> -    TypeLeafKind Leaf;
>> -    StringRef LeafData;
>> -  };
>> -
>> -  explicit CodeViewTypeIterator(const StringRef &SectionData)
>> -      : Data(SectionData), AtEnd(false) {
>> -    if (Data.size() >= 4) {
>> -      Magic = *reinterpret_cast<const ulittle32_t *>(Data.data());
>> -      Data = Data.drop_front(4);
>> -    }
>> -    next(); // Prime the pump
>> -  }
>> -
>> -  CodeViewTypeIterator() : 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 CodeViewTypeIterator &lhs,
>> -                         const CodeViewTypeIterator &rhs);
>> -
>> -  friend bool operator!=(const CodeViewTypeIterator &lhs,
>> -                         const CodeViewTypeIterator &rhs);
>> -
>> -  unsigned getMagic() const { return Magic; }
>> -
>> -  const TypeRecord &operator*() const {
>> -    assert(!AtEnd);
>> -    return Current;
>> -  }
>> -
>> -  const TypeRecord *operator->() const {
>> -    assert(!AtEnd);
>> -    return &Current;
>> -  }
>> -
>> -  CodeViewTypeIterator operator++() {
>> -    next();
>> -    return *this;
>> -  }
>> -
>> -  CodeViewTypeIterator operator++(int) {
>> -    CodeViewTypeIterator 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;
>> -    }
>> -
>> -    const TypeRecordPrefix *Rec;
>> -    if (consumeObject(Data, Rec))
>> -      return;
>> -    Current.Length = Rec->Len;
>> -    Current.Leaf = static_cast<TypeLeafKind>(uint16_t(Rec->Leaf));
>> -    Current.LeafData = Data.substr(0, Current.Length - 2);
>> -
>> -    // The next record starts immediately after this one.
>> -    Data = Data.drop_front(Current.LeafData.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;
>> -  }
>> -
>> -  StringRef Data;
>> -  unsigned Magic = 0;
>> -  TypeRecord Current;
>> -  bool AtEnd;
>> -};
>> -
>> -bool operator==(const CodeViewTypeIterator &lhs,
>> -                const CodeViewTypeIterator &rhs) {
>> -  return (lhs.Data.begin() == rhs.Data.begin()) || (lhs.AtEnd &&
>> rhs.AtEnd);
>> -}
>> -
>> -bool operator!=(const CodeViewTypeIterator &lhs,
>> -                const CodeViewTypeIterator &rhs) {
>> -  return !(lhs == rhs);
>> -}
>> -
>> -struct CodeViewTypeStream {
>> -  CodeViewTypeIterator begin;
>> -  CodeViewTypeIterator end;
>> -  unsigned Magic;
>> -};
>> -
>> -CodeViewTypeStream CreateCodeViewTypeIter(const StringRef &Data) {
>> -  CodeViewTypeStream Stream;
>> -  Stream.begin = CodeViewTypeIterator(Data);
>> -  Stream.end   = CodeViewTypeIterator();
>> -  Stream.Magic = Stream.begin.getMagic();
>> -
>> -  return Stream;
>> -}
>>
>>  void COFFDumper::printCodeViewTypeSection(StringRef SectionName,
>>                                            const SectionRef &Section) {
>> @@ -2081,31 +1955,34 @@ void COFFDumper::printCodeViewTypeSectio
>>    error(Section.getContents(Data));
>>    if (opts::CodeViewSubsectionBytes)
>>      W.printBinaryBlock("Data", Data);
>> -
>>    CVTD.dump(Data);
>>  }
>>
>>  void CVTypeDumper::dump(StringRef Data) {
>> -  CodeViewTypeStream Stream = CreateCodeViewTypeIter(Data);
>> -  W.printHex("Magic", Stream.Magic);
>> +  uint32_t Magic;
>> +  if (consumeUInt32(Data, Magic))
>> +    return;
>> +  if (Magic != COFF::DEBUG_SECTION_MAGIC)
>> +    return;
>>
>> -  for (auto Iter = Stream.begin; Iter != Stream.end; ++Iter) {
>> -    StringRef LeafData = Iter->LeafData;
>> +  W.printHex("Magic", Magic);
>> +  for (const auto &Record : makeTypeRange(Data)) {
>> +    StringRef LeafData = Record.LeafData;
>>
>>      // Find the name of this leaf type.
>> -    StringRef LeafName = getLeafTypeName(Iter->Leaf);
>> +    StringRef LeafName = getLeafTypeName(Record.Leaf);
>>      DictScope S(W, LeafName);
>>      unsigned NextTypeIndex = 0x1000 + CVUDTNames.size();
>> -    W.printEnum("TypeLeafKind", unsigned(Iter->Leaf),
>> +    W.printEnum("TypeLeafKind", unsigned(Record.Leaf),
>>                  makeArrayRef(LeafTypeNames));
>>      W.printHex("TypeIndex", NextTypeIndex);
>>
>>      // Fill this in inside the switch to get something in CVUDTNames.
>>      StringRef Name;
>>
>> -    switch (Iter->Leaf) {
>> +    switch (Record.Leaf) {
>>      default: {
>> -      W.printHex("Size", Iter->Length);
>> +      W.printHex("Size", Record.Length);
>>        break;
>>      }
>>
>> @@ -2121,7 +1998,7 @@ void CVTypeDumper::dump(StringRef Data)
>>      }
>>
>>      case LF_FIELDLIST: {
>> -      W.printHex("Size", Iter->Length);
>> +      W.printHex("Size", Record.Length);
>>        // FieldList has no fixed prefix that can be described with a
>> struct. All
>>        // the bytes must be interpreted as more records.
>>        printCodeViewFieldList(LeafData);
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
> --
> Mike
> Sent from phone
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160503/c06fec12/attachment.html>


More information about the llvm-commits mailing list