[llvm] r268454 - Move CodeViewTypeStream to DebugInfo/CodeView

Mike Aizatsky via llvm-commits llvm-commits at lists.llvm.org
Tue May 3 16:35:36 PDT 2016


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/abadc94c/attachment.html>


More information about the llvm-commits mailing list