[llvm] r278869 - Write the TPI stream from a PDB to Yaml.
Zachary Turner via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 16 16:50:19 PDT 2016
Thanks, I will have to take a look tomorrow as I'm gone for the day. Not
sure how a undeclared identifier passed both MSVC and clang-cl, but I will
check it out tomorrow. Thanks!
On Tue, Aug 16, 2016 at 4:48 PM Justin Bogner <mail at justinbogner.com> wrote:
> Zachary Turner via llvm-commits <llvm-commits at lists.llvm.org> writes:
> > Author: zturner
> > Date: Tue Aug 16 18:28:54 2016
> > New Revision: 278869
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=278869&view=rev
> > Log:
> > Write the TPI stream from a PDB to Yaml.
>
> I reverted this in r278871, because it's hitting an error that I think
> will fire on most of the bots:
>
> .../llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp:36:17: error: use of
> undeclared identifier 'skipPadding'
> if (auto EC = skipPadding(Data))
>
> Less important, but I also got a pessimizing move warning:
>
> .../llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp:120:14: error: moving
> a local object in a return statement prevents copy elision
> [-Werror,-Wpessimizing-move]
> return std::move(EC);
>
> > Reviewed By: ruiu, rnk
> > Differential Revision: https://reviews.llvm.org/D23226
> >
> > Added:
> > llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-types.test
> > llvm/trunk/tools/llvm-pdbdump/CodeViewYaml.cpp
> > llvm/trunk/tools/llvm-pdbdump/CodeViewYaml.h
> > Modified:
> > llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h
> > llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h
> > llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
> > llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h
> > llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
> > llvm/trunk/include/llvm/DebugInfo/MSF/StreamReader.h
> > llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
> > llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp
> > llvm/trunk/lib/DebugInfo/CodeView/TypeDeserializer.cpp
> > llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
> > llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp
> > llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
> > llvm/trunk/test/DebugInfo/COFF/big-type.ll
> > llvm/trunk/test/DebugInfo/COFF/enum.ll
> > llvm/trunk/test/DebugInfo/COFF/inheritance.ll
> > llvm/trunk/test/DebugInfo/COFF/virtual-method-kinds.ll
> > llvm/trunk/test/DebugInfo/COFF/virtual-methods.ll
> > llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
> > llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt
> > llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp
> > llvm/trunk/tools/llvm-pdbdump/PdbYaml.h
> > llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
> > llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h
> > llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
> > llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.h
> >
> > 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=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h Tue Aug
> 16 18:28:54 2016
> > @@ -28,6 +28,8 @@ public:
> > /// Visits the type records in Data. Sets the error flag on parse
> failures.
> > Error visitTypeStream(const CVTypeArray &Types);
> >
> > + Error visitFieldListMemberStream(ArrayRef<uint8_t> FieldList);
> > +
> > private:
> > /// The interface to the class that gets notified of each visitation.
> > TypeVisitorCallbacks &Callbacks;
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/EnumTables.h Tue Aug 16
> 18:28:54 2016
> > @@ -20,6 +20,7 @@
> > namespace llvm {
> > namespace codeview {
> > ArrayRef<EnumEntry<SymbolKind>> getSymbolTypeNames();
> > +ArrayRef<EnumEntry<TypeLeafKind>> getTypeLeafNames();
> > ArrayRef<EnumEntry<uint16_t>> getRegisterNames();
> > ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames();
> > ArrayRef<EnumEntry<uint16_t>> getLocalFlagNames();
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
> (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h Tue
> Aug 16 18:28:54 2016
> > @@ -15,9 +15,9 @@
> >
> > namespace llvm {
> > namespace codeview {
> > -class TypeDeserializerBase : public TypeVisitorCallbacks {
> > +class TypeDeserializer : public TypeVisitorCallbacks {
> > public:
> > - explicit TypeDeserializerBase(TypeVisitorCallbacks &Recipient)
> > + explicit TypeDeserializer(TypeVisitorCallbacks &Recipient)
> > : Recipient(Recipient) {}
> >
> > Error visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override {
> > @@ -62,39 +62,6 @@ private:
> > return Recipient.visitKnownRecord(CVR, Record);
> > }
> > };
> > -
> > -class TypeDeserializer : public TypeDeserializerBase {
> > -public:
> > - explicit TypeDeserializer(TypeVisitorCallbacks &Recipient)
> > - : TypeDeserializerBase(Recipient) {}
> > -
> > - /// FieldList records need special handling. For starters, they do
> not
> > - /// describe their own length, so a different extraction algorithm is
> > - /// necessary. Secondly, a single FieldList record will result in the
> > - /// deserialization of many records. So even though the top level
> visitor
> > - /// calls visitFieldBegin() on a single record, multiple records get
> visited
> > - /// through the callback interface.
> > - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > - FieldListRecord &Record) override;
> > -
> > -private:
> > - template <typename T>
> > - Error visitKnownMember(ArrayRef<uint8_t> &Data, TypeLeafKind Kind,
> > - T &Record) {
> > - ArrayRef<uint8_t> OldData = Data;
> > - if (auto EC = deserializeRecord(Data, Kind, Record))
> > - return EC;
> > - assert(Data.size() < OldData.size());
> > -
> > - CVRecord<TypeLeafKind> CVR;
> > - CVR.Length = OldData.size() - Data.size();
> > - CVR.Data = OldData.slice(0, CVR.Length);
> > - CVR.RawData = CVR.Data;
> > - return Recipient.visitKnownRecord(CVR, Record);
> > - }
> > -
> > - Error skipPadding(ArrayRef<uint8_t> &Data);
> > -};
> > }
> > }
> >
> >
> > 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=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumper.h Tue Aug 16
> 18:28:54 2016
> > @@ -87,6 +87,7 @@ private:
> >
> > ScopedPrinter *W;
> >
> > + bool IsInFieldList = false;
> > bool PrintRecordBytes = false;
> >
> > /// Name of the current type. Only valid before visitTypeEnd.
> >
> > 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=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h Tue Aug 16
> 18:28:54 2016
> > @@ -12,6 +12,7 @@
> >
> > #include "llvm/ADT/APSInt.h"
> > #include "llvm/ADT/ArrayRef.h"
> > +#include "llvm/ADT/Optional.h"
> > #include "llvm/ADT/StringRef.h"
> > #include "llvm/DebugInfo/CodeView/CVRecord.h"
> > #include "llvm/DebugInfo/CodeView/CodeView.h"
> > @@ -27,6 +28,9 @@ using llvm::support::little32_t;
> > using llvm::support::ulittle16_t;
> > using llvm::support::ulittle32_t;
> >
> > +typedef CVRecord<TypeLeafKind> CVType;
> > +typedef msf::VarStreamArray<CVType> CVTypeArray;
> > +
> > /// Equvalent to CV_fldattr_t in cvinfo.h.
> > struct MemberAttributes {
> > ulittle16_t Attrs;
> > @@ -90,18 +94,19 @@ public:
> > return Representation;
> > }
> >
> > + TypeIndex ContainingType;
> > + PointerToMemberRepresentation Representation;
> > +
> > private:
> > struct Layout {
> > TypeIndex ClassType;
> > ulittle16_t Representation; // PointerToMemberRepresentation
> > };
> > -
> > - TypeIndex ContainingType;
> > - PointerToMemberRepresentation Representation;
> > };
> >
> > class TypeRecord {
> > protected:
> > + TypeRecord() {}
> > explicit TypeRecord(TypeRecordKind Kind) : Kind(Kind) {}
> >
> > public:
> > @@ -129,14 +134,14 @@ public:
> > TypeIndex getModifiedType() const { return ModifiedType; }
> > ModifierOptions getModifiers() const { return Modifiers; }
> >
> > + TypeIndex ModifiedType;
> > + ModifierOptions Modifiers;
> > +
> > private:
> > struct Layout {
> > TypeIndex ModifiedType;
> > ulittle16_t Modifiers; // ModifierOptions
> > };
> > -
> > - TypeIndex ModifiedType;
> > - ModifierOptions Modifiers;
> > };
> >
> > // LF_PROCEDURE
> > @@ -165,6 +170,12 @@ public:
> > uint16_t getParameterCount() const { return ParameterCount; }
> > TypeIndex getArgumentList() const { return ArgumentList; }
> >
> > + TypeIndex ReturnType;
> > + CallingConvention CallConv;
> > + FunctionOptions Options;
> > + uint16_t ParameterCount;
> > + TypeIndex ArgumentList;
> > +
> > private:
> > struct Layout {
> > TypeIndex ReturnType;
> > @@ -173,12 +184,6 @@ private:
> > ulittle16_t NumParameters;
> > TypeIndex ArgListType;
> > };
> > -
> > - TypeIndex ReturnType;
> > - CallingConvention CallConv;
> > - FunctionOptions Options;
> > - uint16_t ParameterCount;
> > - TypeIndex ArgumentList;
> > };
> >
> > // LF_MFUNCTION
> > @@ -212,6 +217,15 @@ public:
> > TypeIndex getArgumentList() const { return ArgumentList; }
> > int32_t getThisPointerAdjustment() const { return
> ThisPointerAdjustment; }
> >
> > + TypeIndex ReturnType;
> > + TypeIndex ClassType;
> > + TypeIndex ThisType;
> > + CallingConvention CallConv;
> > + FunctionOptions Options;
> > + uint16_t ParameterCount;
> > + TypeIndex ArgumentList;
> > + int32_t ThisPointerAdjustment;
> > +
> > private:
> > struct Layout {
> > TypeIndex ReturnType;
> > @@ -223,15 +237,6 @@ private:
> > TypeIndex ArgListType;
> > little32_t ThisAdjustment;
> > };
> > -
> > - TypeIndex ReturnType;
> > - TypeIndex ClassType;
> > - TypeIndex ThisType;
> > - CallingConvention CallConv;
> > - FunctionOptions Options;
> > - uint16_t ParameterCount;
> > - TypeIndex ArgumentList;
> > - int32_t ThisPointerAdjustment;
> > };
> >
> > // LF_MFUNC_ID
> > @@ -252,6 +257,9 @@ public:
> > TypeIndex getClassType() const { return ClassType; }
> > TypeIndex getFunctionType() const { return FunctionType; }
> > StringRef getName() const { return Name; }
> > + TypeIndex ClassType;
> > + TypeIndex FunctionType;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -259,9 +267,6 @@ private:
> > TypeIndex FunctionType;
> > // Name: The null-terminated name follows.
> > };
> > - TypeIndex ClassType;
> > - TypeIndex FunctionType;
> > - StringRef Name;
> > };
> >
> > // LF_ARGLIST, LF_SUBSTR_LIST
> > @@ -283,13 +288,13 @@ public:
> >
> > static uint32_t getLayoutSize() { return 2 + sizeof(Layout); }
> >
> > + std::vector<TypeIndex> StringIndices;
> > +
> > private:
> > struct Layout {
> > ulittle32_t NumArgs; // Number of arguments
> > // ArgTypes[]: Type indicies of arguments
> > };
> > -
> > - std::vector<TypeIndex> StringIndices;
> > };
> >
> > // LF_POINTER
> > @@ -308,8 +313,8 @@ public:
> >
> > PointerRecord(TypeIndex ReferentType, PointerKind Kind, PointerMode
> Mode,
> > PointerOptions Options, uint8_t Size)
> > - : PointerRecord(ReferentType, Kind, Mode, Options, Size,
> > - MemberPointerInfo()) {}
> > + : TypeRecord(TypeRecordKind::Pointer), ReferentType(ReferentType),
> > + PtrKind(Kind), Mode(Mode), Options(Options), Size(Size) {}
> >
> > PointerRecord(TypeIndex ReferentType, PointerKind Kind, PointerMode
> Mode,
> > PointerOptions Options, uint8_t Size,
> > @@ -330,7 +335,7 @@ public:
> > PointerMode getMode() const { return Mode; }
> > PointerOptions getOptions() const { return Options; }
> > uint8_t getSize() const { return Size; }
> > - MemberPointerInfo getMemberInfo() const { return MemberInfo; }
> > + MemberPointerInfo getMemberInfo() const { return *MemberInfo; }
> >
> > bool isPointerToMember() const {
> > return Mode == PointerMode::PointerToDataMember ||
> > @@ -349,6 +354,13 @@ public:
> > return !!(uint32_t(Options) & uint32_t(PointerOptions::Unaligned));
> > }
> >
> > + TypeIndex ReferentType;
> > + PointerKind PtrKind;
> > + PointerMode Mode;
> > + PointerOptions Options;
> > + uint8_t Size;
> > + Optional<MemberPointerInfo> MemberInfo;
> > +
> > private:
> > struct Layout {
> > TypeIndex PointeeType;
> > @@ -379,13 +391,6 @@ private:
> > return isPointerToMemberFunction() || isPointerToDataMember();
> > }
> > };
> > -
> > - TypeIndex ReferentType;
> > - PointerKind PtrKind;
> > - PointerMode Mode;
> > - PointerOptions Options;
> > - uint8_t Size;
> > - MemberPointerInfo MemberInfo;
> > };
> >
> > // LF_NESTTYPE
> > @@ -405,23 +410,23 @@ public:
> > TypeIndex getNestedType() const { return Type; }
> > StringRef getName() const { return Name; }
> >
> > + TypeIndex Type;
> > + StringRef Name;
> > +
> > private:
> > struct Layout {
> > ulittle16_t Pad0; // Should be zero
> > TypeIndex Type; // Type index of nested type
> > // Name: Null-terminated string
> > };
> > -
> > - TypeIndex Type;
> > - StringRef Name;
> > };
> >
> > // LF_FIELDLIST
> > class FieldListRecord : public TypeRecord {
> > public:
> > explicit FieldListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
> > - FieldListRecord(ArrayRef<uint8_t> ListData)
> > - : TypeRecord(TypeRecordKind::FieldList), ListData(ListData) {}
> > + explicit FieldListRecord(ArrayRef<uint8_t> Data)
> > + : TypeRecord(TypeRecordKind::FieldList), Data(Data) {}
> >
> > /// Rewrite member type indices with IndexMap. Returns false if a
> type index
> > /// is not in the map.
> > @@ -430,10 +435,7 @@ public:
> > static Expected<FieldListRecord> deserialize(TypeRecordKind Kind,
> > ArrayRef<uint8_t> &Data);
> >
> > - ArrayRef<uint8_t> getFieldListData() const { return ListData; }
> > -
> > -private:
> > - ArrayRef<uint8_t> ListData;
> > + ArrayRef<uint8_t> Data;
> > };
> >
> > // LF_ARRAY
> > @@ -457,6 +459,11 @@ public:
> > uint64_t getSize() const { return Size; }
> > llvm::StringRef getName() const { return Name; }
> >
> > + TypeIndex ElementType;
> > + TypeIndex IndexType;
> > + uint64_t Size;
> > + llvm::StringRef Name;
> > +
> > private:
> > struct Layout {
> > TypeIndex ElementType;
> > @@ -464,11 +471,6 @@ private:
> > // SizeOf: LF_NUMERIC encoded size in bytes. Not element count!
> > // Name: The null-terminated name follows.
> > };
> > -
> > - TypeIndex ElementType;
> > - TypeIndex IndexType;
> > - uint64_t Size;
> > - llvm::StringRef Name;
> > };
> >
> > class TagRecord : public TypeRecord {
> > @@ -495,7 +497,6 @@ public:
> > StringRef getName() const { return Name; }
> > StringRef getUniqueName() const { return UniqueName; }
> >
> > -private:
> > uint16_t MemberCount;
> > ClassOptions Options;
> > TypeIndex FieldList;
> > @@ -528,6 +529,12 @@ public:
> > TypeIndex getVTableShape() const { return VTableShape; }
> > uint64_t getSize() const { return Size; }
> >
> > + HfaKind Hfa;
> > + WindowsRTClassKind WinRTKind;
> > + TypeIndex DerivationList;
> > + TypeIndex VTableShape;
> > + uint64_t Size;
> > +
> > private:
> > struct Layout {
> > ulittle16_t MemberCount; // Number of members in FieldList.
> > @@ -543,12 +550,6 @@ private:
> > return Properties & uint16_t(ClassOptions::HasUniqueName);
> > }
> > };
> > -
> > - HfaKind Hfa;
> > - WindowsRTClassKind WinRTKind;
> > - TypeIndex DerivationList;
> > - TypeIndex VTableShape;
> > - uint64_t Size;
> > };
> >
> > // LF_UNION
> > @@ -567,6 +568,9 @@ struct UnionRecord : public TagRecord {
> > HfaKind getHfa() const { return Hfa; }
> > uint64_t getSize() const { return Size; }
> >
> > + HfaKind Hfa;
> > + uint64_t Size;
> > +
> > private:
> > struct Layout {
> > ulittle16_t MemberCount; // Number of members in FieldList.
> > @@ -580,9 +584,6 @@ private:
> > return Properties & uint16_t(ClassOptions::HasUniqueName);
> > }
> > };
> > -
> > - HfaKind Hfa;
> > - uint64_t Size;
> > };
> >
> > // LF_ENUM
> > @@ -602,6 +603,7 @@ public:
> > ArrayRef<uint8_t> &Data);
> >
> > TypeIndex getUnderlyingType() const { return UnderlyingType; }
> > + TypeIndex UnderlyingType;
> >
> > private:
> > struct Layout {
> > @@ -616,7 +618,6 @@ private:
> > }
> > };
> >
> > - TypeIndex UnderlyingType;
> > };
> >
> > // LF_BITFIELD
> > @@ -637,6 +638,9 @@ public:
> > TypeIndex getType() const { return Type; }
> > uint8_t getBitOffset() const { return BitOffset; }
> > uint8_t getBitSize() const { return BitSize; }
> > + TypeIndex Type;
> > + uint8_t BitSize;
> > + uint8_t BitOffset;
> >
> > private:
> > struct Layout {
> > @@ -645,9 +649,6 @@ private:
> > uint8_t BitOffset;
> > };
> >
> > - TypeIndex Type;
> > - uint8_t BitSize;
> > - uint8_t BitOffset;
> > };
> >
> > // LF_VTSHAPE
> > @@ -672,6 +673,8 @@ public:
> > return Slots;
> > }
> > uint32_t getEntryCount() const { return getSlots().size(); }
> > + ArrayRef<VFTableSlotKind> SlotsRef;
> > + std::vector<VFTableSlotKind> Slots;
> >
> > private:
> > struct Layout {
> > @@ -682,9 +685,6 @@ private:
> > // Descriptors[]: 4-bit virtual method descriptors of type
> CV_VTS_desc_e.
> > };
> >
> > -private:
> > - ArrayRef<VFTableSlotKind> SlotsRef;
> > - std::vector<VFTableSlotKind> Slots;
> > };
> >
> > // LF_TYPESERVER2
> > @@ -707,6 +707,9 @@ public:
> > uint32_t getAge() const { return Age; }
> >
> > StringRef getName() const { return Name; }
> > + StringRef Guid;
> > + uint32_t Age;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -714,10 +717,6 @@ private:
> > ulittle32_t Age;
> > // Name: Name of the PDB as a null-terminated string
> > };
> > -
> > - StringRef Guid;
> > - uint32_t Age;
> > - StringRef Name;
> > };
> >
> > // LF_STRING_ID
> > @@ -737,15 +736,14 @@ public:
> > TypeIndex getId() const { return Id; }
> >
> > StringRef getString() const { return String; }
> > + TypeIndex Id;
> > + StringRef String;
> >
> > private:
> > struct Layout {
> > TypeIndex id;
> > // Name: Name of the PDB as a null-terminated string
> > };
> > -
> > - TypeIndex Id;
> > - StringRef String;
> > };
> >
> > // LF_FUNC_ID
> > @@ -768,6 +766,9 @@ public:
> > TypeIndex getFunctionType() const { return FunctionType; }
> >
> > StringRef getName() const { return Name; }
> > + TypeIndex ParentScope;
> > + TypeIndex FunctionType;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -776,9 +777,6 @@ private:
> > // Name: The null-terminated name follows.
> > };
> >
> > - TypeIndex ParentScope;
> > - TypeIndex FunctionType;
> > - StringRef Name;
> > };
> >
> > // LF_UDT_SRC_LINE
> > @@ -799,6 +797,9 @@ public:
> > TypeIndex getUDT() const { return UDT; }
> > TypeIndex getSourceFile() const { return SourceFile; }
> > uint32_t getLineNumber() const { return LineNumber; }
> > + TypeIndex UDT;
> > + TypeIndex SourceFile;
> > + uint32_t LineNumber;
> >
> > private:
> > struct Layout {
> > @@ -807,9 +808,6 @@ private:
> > ulittle32_t LineNumber;
> > };
> >
> > - TypeIndex UDT;
> > - TypeIndex SourceFile;
> > - uint32_t LineNumber;
> > };
> >
> > // LF_UDT_MOD_SRC_LINE
> > @@ -836,6 +834,10 @@ public:
> > TypeIndex getSourceFile() const { return SourceFile; }
> > uint32_t getLineNumber() const { return LineNumber; }
> > uint16_t getModule() const { return Module; }
> > + TypeIndex UDT;
> > + TypeIndex SourceFile;
> > + uint32_t LineNumber;
> > + uint16_t Module;
> >
> > private:
> > struct Layout {
> > @@ -845,10 +847,6 @@ private:
> > ulittle16_t Module; // Module that contributes this UDT definition
> > };
> >
> > - TypeIndex UDT;
> > - TypeIndex SourceFile;
> > - uint32_t LineNumber;
> > - uint16_t Module;
> > };
> >
> > // LF_BUILDINFO
> > @@ -867,13 +865,13 @@ public:
> > ArrayRef<uint8_t> &Data);
> >
> > ArrayRef<TypeIndex> getArgs() const { return ArgIndices; }
> > + SmallVector<TypeIndex, 4> ArgIndices;
> >
> > private:
> > struct Layout {
> > ulittle16_t NumArgs; // Number of arguments
> > // ArgTypes[]: Type indicies of arguments
> > };
> > - SmallVector<TypeIndex, 4> ArgIndices;
> > };
> >
> > // LF_VFTABLE
> > @@ -909,6 +907,12 @@ public:
> > return MethodNamesRef;
> > return MethodNames;
> > }
> > + TypeIndex CompleteClass;
> > + TypeIndex OverriddenVFTable;
> > + ulittle32_t VFPtrOffset;
> > + StringRef Name;
> > + ArrayRef<StringRef> MethodNamesRef;
> > + std::vector<StringRef> MethodNames;
> >
> > private:
> > struct Layout {
> > @@ -920,17 +924,12 @@ private:
> > // names.
> > };
> >
> > - TypeIndex CompleteClass;
> > - TypeIndex OverriddenVFTable;
> > - ulittle32_t VFPtrOffset;
> > - StringRef Name;
> > - ArrayRef<StringRef> MethodNamesRef;
> > - std::vector<StringRef> MethodNames;
> > };
> >
> > // LF_ONEMETHOD
> > class OneMethodRecord : public TypeRecord {
> > public:
> > + OneMethodRecord() : TypeRecord(TypeRecordKind::OneMethod) {}
> > explicit OneMethodRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
> > OneMethodRecord(TypeIndex Type, MethodKind Kind, MethodOptions
> Options,
> > MemberAccess Access, int32_t VFTableOffset, StringRef
> Name)
> > @@ -956,6 +955,12 @@ public:
> > return Kind == MethodKind::IntroducingVirtual ||
> > Kind == MethodKind::PureIntroducingVirtual;
> > }
> > + TypeIndex Type;
> > + MethodKind Kind;
> > + MethodOptions Options;
> > + MemberAccess Access;
> > + int32_t VFTableOffset;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -966,12 +971,6 @@ private:
> > // Name: Null-terminated string
> > };
> >
> > - TypeIndex Type;
> > - MethodKind Kind;
> > - MethodOptions Options;
> > - MemberAccess Access;
> > - int32_t VFTableOffset;
> > - StringRef Name;
> > };
> >
> > // LF_METHODLIST
> > @@ -989,6 +988,7 @@ public:
> > deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data);
> >
> > ArrayRef<OneMethodRecord> getMethods() const { return Methods; }
> > + std::vector<OneMethodRecord> Methods;
> >
> > private:
> > struct Layout {
> > @@ -1000,7 +1000,6 @@ private:
> > // VFTableOffset: int32_t offset in vftable
> > };
> >
> > - std::vector<OneMethodRecord> Methods;
> > };
> >
> > /// For method overload sets. LF_METHOD
> > @@ -1022,6 +1021,9 @@ public:
> > uint16_t getNumOverloads() const { return NumOverloads; }
> > TypeIndex getMethodList() const { return MethodList; }
> > StringRef getName() const { return Name; }
> > + uint16_t NumOverloads;
> > + TypeIndex MethodList;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -1030,9 +1032,6 @@ private:
> > // Name: Null-terminated string
> > };
> >
> > - uint16_t NumOverloads;
> > - TypeIndex MethodList;
> > - StringRef Name;
> > };
> >
> > // LF_MEMBER
> > @@ -1055,6 +1054,10 @@ public:
> > TypeIndex getType() const { return Type; }
> > uint64_t getFieldOffset() const { return FieldOffset; }
> > StringRef getName() const { return Name; }
> > + MemberAccess Access;
> > + TypeIndex Type;
> > + uint64_t FieldOffset;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -1064,10 +1067,6 @@ private:
> > // Name: Null-terminated string
> > };
> >
> > - MemberAccess Access;
> > - TypeIndex Type;
> > - uint64_t FieldOffset;
> > - StringRef Name;
> > };
> >
> > // LF_STMEMBER
> > @@ -1088,6 +1087,9 @@ public:
> > MemberAccess getAccess() const { return Access; }
> > TypeIndex getType() const { return Type; }
> > StringRef getName() const { return Name; }
> > + MemberAccess Access;
> > + TypeIndex Type;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -1096,9 +1098,6 @@ private:
> > // Name: Null-terminated string
> > };
> >
> > - MemberAccess Access;
> > - TypeIndex Type;
> > - StringRef Name;
> > };
> >
> > // LF_ENUMERATE
> > @@ -1119,6 +1118,9 @@ public:
> > MemberAccess getAccess() const { return Access; }
> > APSInt getValue() const { return Value; }
> > StringRef getName() const { return Name; }
> > + MemberAccess Access;
> > + APSInt Value;
> > + StringRef Name;
> >
> > private:
> > struct Layout {
> > @@ -1127,9 +1129,6 @@ private:
> > // Name: Null-terminated string
> > };
> >
> > - MemberAccess Access;
> > - APSInt Value;
> > - StringRef Name;
> > };
> >
> > // LF_VFUNCTAB
> > @@ -1147,13 +1146,13 @@ public:
> > ArrayRef<uint8_t> &Data);
> >
> > TypeIndex getType() const { return Type; }
> > + TypeIndex Type;
> >
> > private:
> > struct Layout {
> > ulittle16_t Pad0;
> > TypeIndex Type; // Type of vfptr
> > };
> > - TypeIndex Type;
> > };
> >
> > // LF_BCLASS, LF_BINTERFACE
> > @@ -1174,6 +1173,9 @@ public:
> > MemberAccess getAccess() const { return Access; }
> > TypeIndex getBaseType() const { return Type; }
> > uint64_t getBaseOffset() const { return Offset; }
> > + MemberAccess Access;
> > + TypeIndex Type;
> > + uint64_t Offset;
> >
> > private:
> > struct Layout {
> > @@ -1181,9 +1183,6 @@ private:
> > TypeIndex BaseType; // Base class type
> > // BaseOffset: LF_NUMERIC encoded byte offset of base from derived.
> > };
> > - MemberAccess Access;
> > - TypeIndex Type;
> > - uint64_t Offset;
> > };
> >
> > // LF_VBCLASS, LF_IVBCLASS
> > @@ -1208,6 +1207,11 @@ public:
> > TypeIndex getVBPtrType() const { return VBPtrType; }
> > uint64_t getVBPtrOffset() const { return VBPtrOffset; }
> > uint64_t getVTableIndex() const { return VTableIndex; }
> > + MemberAccess Access;
> > + TypeIndex BaseType;
> > + TypeIndex VBPtrType;
> > + uint64_t VBPtrOffset;
> > + uint64_t VTableIndex;
> >
> > private:
> > struct Layout {
> > @@ -1217,11 +1221,6 @@ private:
> > // VBPtrOffset: Offset of vbptr from vfptr encoded as LF_NUMERIC.
> > // VBTableIndex: Index of vbase within vbtable encoded as
> LF_NUMERIC.
> > };
> > - MemberAccess Access;
> > - TypeIndex BaseType;
> > - TypeIndex VBPtrType;
> > - uint64_t VBPtrOffset;
> > - uint64_t VTableIndex;
> > };
> >
> > /// LF_INDEX - Used to chain two large LF_FIELDLIST or LF_METHODLIST
> records
> > @@ -1239,17 +1238,15 @@ public:
> >
> > static Expected<ListContinuationRecord> deserialize(TypeRecordKind
> Kind,
> > ArrayRef<uint8_t>
> &Data);
> > + TypeIndex ContinuationIndex;
> >
> > private:
> > struct Layout {
> > ulittle16_t Pad0;
> > TypeIndex ContinuationIndex;
> > };
> > - TypeIndex ContinuationIndex;
> > };
> >
> > -typedef CVRecord<TypeLeafKind> CVType;
> > -typedef msf::VarStreamArray<CVType> CVTypeArray;
> > }
> > }
> >
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/MSF/StreamReader.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/MSF/StreamReader.h?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/MSF/StreamReader.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/MSF/StreamReader.h Tue Aug 16
> 18:28:54 2016
> > @@ -95,6 +95,7 @@ public:
> > return Error::success();
> > }
> >
> > + bool empty() const { return bytesRemaining() == 0; }
> > void setOffset(uint32_t Off) { Offset = Off; }
> > uint32_t getOffset() const { return Offset; }
> > uint32_t getLength() const { return Stream.getLength(); }
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp Tue Aug 16
> 18:28:54 2016
> > @@ -15,6 +15,52 @@
> > using namespace llvm;
> > using namespace llvm::codeview;
> >
> > +template <typename T>
> > +static Error takeObject(ArrayRef<uint8_t> &Data, const T *&Res) {
> > + if (Data.size() < sizeof(*Res))
> > + return
> llvm::make_error<CodeViewError>(cv_error_code::insufficient_buffer);
> > + Res = reinterpret_cast<const T *>(Data.data());
> > + Data = Data.drop_front(sizeof(*Res));
> > + return Error::success();
> > +}
> > +
> > +template <typename T>
> > +static Expected<CVType> deserializeMemberRecord(ArrayRef<uint8_t> &Data,
> > + TypeLeafKind Kind) {
> > + ArrayRef<uint8_t> OldData = Data;
> > + TypeRecordKind RK = static_cast<TypeRecordKind>(Kind);
> > + auto ExpectedRecord = T::deserialize(RK, Data);
> > + if (!ExpectedRecord)
> > + return ExpectedRecord.takeError();
> > + assert(Data.size() < OldData.size());
> > + if (auto EC = skipPadding(Data))
> > + return std::move(EC);
> > +
> > + CVType CVR;
> > + CVR.Type = Kind;
> > + CVR.Length = OldData.size() - Data.size();
> > + CVR.Data = OldData.slice(0, CVR.Length);
> > + CVR.RawData = CVR.Data;
> > + return CVR;
> > +}
> > +
> > +static Error skipPadding(ArrayRef<uint8_t> &Data) {
> > + if (Data.empty())
> > + return Error::success();
> > + uint8_t Leaf = Data.front();
> > + if (Leaf < LF_PAD0)
> > + return Error::success();
> > + // Leaf is greater than 0xf0. We should advance by the number of
> bytes in
> > + // the low 4 bits.
> > + unsigned BytesToAdvance = Leaf & 0x0F;
> > + if (Data.size() < BytesToAdvance) {
> > + return
> llvm::make_error<CodeViewError>(cv_error_code::corrupt_record,
> > + "Invalid padding bytes!");
> > + }
> > + Data = Data.drop_front(BytesToAdvance);
> > + return Error::success();
> > +}
> > +
> > CVTypeVisitor::CVTypeVisitor(TypeVisitorCallbacks &Callbacks)
> > : Callbacks(Callbacks) {}
> >
> > @@ -45,7 +91,10 @@ Error CVTypeVisitor::visitTypeRecord(con
> > }
> > #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
> \
> > TYPE_RECORD(EnumVal, EnumVal, AliasName)
> > -#define MEMBER_RECORD(EnumName, EnumVal, Name)
> > +#define MEMBER_RECORD(EnumName, EnumVal, Name)
> \
> > + TYPE_RECORD(EnumName, EnumVal, Name)
> > +#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
> \
> > + MEMBER_RECORD(EnumName, EnumVal, AliasName)
> > #include "llvm/DebugInfo/CodeView/TypeRecords.def"
> > }
> >
> > @@ -63,3 +112,39 @@ Error CVTypeVisitor::visitTypeStream(con
> > }
> > return Error::success();
> > }
> > +
> > +Error CVTypeVisitor::visitFieldListMemberStream(ArrayRef<uint8_t> Data)
> {
> > + while (!Data.empty()) {
> > + const support::ulittle16_t *LeafValue;
> > + if (auto EC = takeObject(Data, LeafValue))
> > + return std::move(EC);
> > +
> > + TypeLeafKind Leaf = static_cast<TypeLeafKind>(uint16_t(*LeafValue));
> > + CVType Record;
> > + switch (Leaf) {
> > + default:
> > + // Field list records do not describe their own length, so we
> cannot
> > + // continue parsing past a type that we don't know how to
> deserialize.
> > + return llvm::make_error<CodeViewError>(
> > + cv_error_code::unknown_member_record);
> > +#define MEMBER_RECORD(EnumName, EnumVal, Name)
> \
> > + case EnumName: {
> \
> > + auto ExpectedRecord = deserializeMemberRecord<Name##Record>(Data,
> Leaf); \
> > + if (!ExpectedRecord)
> \
> > + return ExpectedRecord.takeError();
> \
> > + auto &Record = *ExpectedRecord;
> \
> > + if (auto EC = Callbacks.visitTypeBegin(Record))
> \
> > + return EC;
> \
> > + if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks))
> \
> > + return EC;
> \
> > + if (auto EC = Callbacks.visitTypeEnd(Record))
> \
> > + return EC;
> \
> > + break;
> \
> > + }
> > +#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
> \
> > + MEMBER_RECORD(EnumVal, EnumVal, AliasName)
> > +#include "llvm/DebugInfo/CodeView/TypeRecords.def"
> > + }
> > + }
> > + return Error::success();
> > +}
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp Tue Aug 16 18:28:54
> 2016
> > @@ -24,6 +24,12 @@ static const EnumEntry<SymbolKind> Symbo
> > #undef CV_SYMBOL
> > };
> >
> > +static const EnumEntry<TypeLeafKind> TypeLeafNames[] = {
> > +#define CV_TYPE(name, val) {#name, name},
> > +#include "llvm/DebugInfo/CodeView/TypeRecords.def"
> > +#undef CV_TYPE
> > +};
> > +
> > static const EnumEntry<uint16_t> RegisterNames[] = {
> > CV_ENUM_CLASS_ENT(RegisterId, Unknown),
> > CV_ENUM_CLASS_ENT(RegisterId, VFrame),
> > @@ -324,6 +330,10 @@ ArrayRef<EnumEntry<SymbolKind>> getSymbo
> > return makeArrayRef(SymbolTypeNames);
> > }
> >
> > +ArrayRef<EnumEntry<TypeLeafKind>> getTypeLeafNames() {
> > + return makeArrayRef(TypeLeafNames);
> > +}
> > +
> > ArrayRef<EnumEntry<uint16_t>> getRegisterNames() {
> > return makeArrayRef(RegisterNames);
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeDeserializer.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDeserializer.cpp?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/TypeDeserializer.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/TypeDeserializer.cpp Tue Aug 16
> 18:28:54 2016
> > @@ -11,71 +11,3 @@
> >
> > using namespace llvm;
> > using namespace llvm::codeview;
> > -
> > -template <typename T>
> > -static Error takeObject(ArrayRef<uint8_t> &Data, const T *&Res) {
> > - if (Data.size() < sizeof(*Res))
> > - return
> llvm::make_error<CodeViewError>(cv_error_code::insufficient_buffer);
> > - Res = reinterpret_cast<const T *>(Data.data());
> > - Data = Data.drop_front(sizeof(*Res));
> > - return Error::success();
> > -}
> > -
> > -Error TypeDeserializer::visitKnownRecord(const CVRecord<TypeLeafKind>
> &CVR,
> > - FieldListRecord &Record) {
> > - ArrayRef<uint8_t> FieldListRecordData = CVR.Data;
> > - auto ExpectedRecord =
> FieldListRecord::deserialize(TypeRecordKind::FieldList,
> > -
> FieldListRecordData);
> > - if (!ExpectedRecord)
> > - return ExpectedRecord.takeError();
> > -
> > - Record = *ExpectedRecord;
> > - ArrayRef<uint8_t> MemberData = Record.getFieldListData();
> > -
> > - while (!MemberData.empty()) {
> > - const ulittle16_t *LeafPtr;
> > - if (auto EC = takeObject(MemberData, LeafPtr))
> > - return EC;
> > - TypeLeafKind Leaf = TypeLeafKind(unsigned(*LeafPtr));
> > - switch (Leaf) {
> > - default:
> > - // Field list records do not describe their own length, so we
> cannot
> > - // continue parsing past a type that we don't know how to
> deserialize.
> > - if (auto EC = Recipient.visitUnknownMember(CVR))
> > - return EC;
> > - return llvm::make_error<CodeViewError>(
> > - cv_error_code::unknown_member_record);
> > -#define MEMBER_RECORD(EnumName, EnumVal, Name)
> \
> > - case EnumName: {
> \
> > - TypeRecordKind RK = static_cast<TypeRecordKind>(Leaf);
> \
> > - Name##Record Member(RK);
> \
> > - if (auto EC = visitKnownMember(MemberData, Leaf, Member))
> \
> > - return EC;
> \
> > - break;
> \
> > - }
> > -#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
> \
> > - MEMBER_RECORD(EnumVal, EnumVal, AliasName)
> > -#include "llvm/DebugInfo/CodeView/TypeRecords.def"
> > - }
> > - if (auto EC = skipPadding(MemberData))
> > - return EC;
> > - }
> > - return Error::success();
> > -}
> > -
> > -Error TypeDeserializer::skipPadding(ArrayRef<uint8_t> &Data) {
> > - if (Data.empty())
> > - return Error::success();
> > - uint8_t Leaf = Data.front();
> > - if (Leaf < LF_PAD0)
> > - return Error::success();
> > - // Leaf is greater than 0xf0. We should advance by the number of
> bytes in
> > - // the low 4 bits.
> > - unsigned BytesToAdvance = Leaf & 0x0F;
> > - if (Data.size() < BytesToAdvance) {
> > - return
> llvm::make_error<CodeViewError>(cv_error_code::corrupt_record,
> > - "Invalid padding bytes!");
> > - }
> > - Data = Data.drop_front(BytesToAdvance);
> > - return Error::success();
> > -}
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp Tue Aug 16 18:28:54
> 2016
> > @@ -206,21 +206,38 @@ Error CVTypeDumper::visitTypeBegin(const
> > // Reset Name to the empty string. If the visitor sets it, we know it.
> > Name = "";
> >
> > - W->startLine() << getLeafTypeName(Record.Type) << " ("
> > - << HexNumber(getNextTypeIndex()) << ") {\n";
> > + W->startLine() << getLeafTypeName(Record.Type);
> > + if (!IsInFieldList) {
> > + // If this is a field list member, don't record its type index
> because it
> > + // doesn't have one. Only the outer field list has a type index.
> > + W->getOStream() << " (" << HexNumber(getNextTypeIndex()) << ")";
> > + }
> > + W->getOStream() << " {\n";
> > W->indent();
> > W->printEnum("TypeLeafKind", unsigned(Record.Type),
> > makeArrayRef(LeafTypeNames));
> > + if (Record.Type == LF_FIELDLIST) {
> > + // Record that we're in a field list so that members do not get
> assigned
> > + // type indices.
> > + assert(!IsInFieldList);
> > + IsInFieldList = true;
> > + }
> > return Error::success();
> > }
> >
> > Error CVTypeDumper::visitTypeEnd(const CVRecord<TypeLeafKind> &Record) {
> > - if (Record.Type == LF_FIELDLIST)
> > - Name = "<field list>";
> > + if (Record.Type == LF_FIELDLIST) {
> > + assert(IsInFieldList);
> > + IsInFieldList = false;
> > + }
> >
> > - // Always record some name for every type, even if Name is empty.
> CVUDTNames
> > - // is indexed by type index, and must have one entry for every type.
> > - recordType(Name);
> > + if (!IsInFieldList) {
> > + // Record every type that is not a field list member, even if Name
> is empty.
> > + // CVUDTNames is indexed by type index, and must have one entry for
> every
> > + // type. Field list members are not recorded, and are only
> referenced by
> > + // their containing field list record.
> > + recordType(Name);
> > + }
> >
> > if (PrintRecordBytes)
> > W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.Data));
> > @@ -232,6 +249,12 @@ Error CVTypeDumper::visitTypeEnd(const C
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > FieldListRecord &FieldList) {
> > + TypeDeserializer Deserializer(*this);
> > + CVTypeVisitor Visitor(Deserializer);
> > + if (auto EC = Visitor.visitFieldListMemberStream(FieldList.Data))
> > + return EC;
> > +
> > + Name = "<field list>";
> > return Error::success();
> > }
> >
> > @@ -550,7 +573,6 @@ Error CVTypeDumper::visitUnknownMember(c
> > }
> >
> > Error CVTypeDumper::visitUnknownType(const CVRecord<TypeLeafKind>
> &Record) {
> > - DictScope S(*W, "UnknownType");
> > W->printEnum("Kind", uint16_t(Record.Type),
> makeArrayRef(LeafTypeNames));
> > W->printNumber("Length", uint32_t(Record.Data.size()));
> > return Error::success();
> > @@ -558,7 +580,6 @@ Error CVTypeDumper::visitUnknownType(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > NestedTypeRecord &Nested) {
> > - DictScope S(*W, "NestedType");
> > printTypeIndex("Type", Nested.getNestedType());
> > W->printString("Name", Nested.getName());
> > Name = Nested.getName();
> > @@ -567,7 +588,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > OneMethodRecord &Method) {
> > - DictScope S(*W, "OneMethod");
> > MethodKind K = Method.getKind();
> > printMemberAttributes(Method.getAccess(), K, Method.getOptions());
> > printTypeIndex("Type", Method.getType());
> > @@ -581,7 +601,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > OverloadedMethodRecord &Method) {
> > - DictScope S(*W, "OverloadedMethod");
> > W->printHex("MethodCount", Method.getNumOverloads());
> > printTypeIndex("MethodListIndex", Method.getMethodList());
> > W->printString("Name", Method.getName());
> > @@ -591,7 +610,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > DataMemberRecord &Field) {
> > - DictScope S(*W, "DataMember");
> > printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
> > MethodOptions::None);
> > printTypeIndex("Type", Field.getType());
> > @@ -603,7 +621,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > StaticDataMemberRecord &Field) {
> > - DictScope S(*W, "StaticDataMember");
> > printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
> > MethodOptions::None);
> > printTypeIndex("Type", Field.getType());
> > @@ -614,14 +631,12 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > VFPtrRecord &VFTable) {
> > - DictScope S(*W, "VFPtr");
> > printTypeIndex("Type", VFTable.getType());
> > return Error::success();
> > }
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > EnumeratorRecord &Enum) {
> > - DictScope S(*W, "Enumerator");
> > printMemberAttributes(Enum.getAccess(), MethodKind::Vanilla,
> > MethodOptions::None);
> > W->printNumber("EnumValue", Enum.getValue());
> > @@ -632,7 +647,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > BaseClassRecord &Base) {
> > - DictScope S(*W, "BaseClass");
> > printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
> > MethodOptions::None);
> > printTypeIndex("BaseType", Base.getBaseType());
> > @@ -642,7 +656,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > VirtualBaseClassRecord &Base) {
> > - DictScope S(*W, "VirtualBaseClass");
> > printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
> > MethodOptions::None);
> > printTypeIndex("BaseType", Base.getBaseType());
> > @@ -654,7 +667,6 @@ Error CVTypeDumper::visitKnownRecord(con
> >
> > Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR,
> > ListContinuationRecord &Cont) {
> > - DictScope S(*W, "ListContinuation");
> > printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
> > return Error::success();
> > }
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/TypeRecord.cpp Tue Aug 16 18:28:54
> 2016
> > @@ -8,8 +8,9 @@
> >
> //===----------------------------------------------------------------------===//
> >
> > #include "llvm/DebugInfo/CodeView/TypeRecord.h"
> > -#include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > #include "llvm/DebugInfo/CodeView/RecordSerialization.h"
> > +#include "llvm/DebugInfo/CodeView/TypeIndex.h"
> > +#include "llvm/DebugInfo/MSF/ByteStream.h"
> >
> > using namespace llvm;
> > using namespace llvm::codeview;
> > @@ -116,7 +117,9 @@ NestedTypeRecord::deserialize(TypeRecord
> >
> > Expected<FieldListRecord>
> > FieldListRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t>
> &Data) {
> > - return FieldListRecord(Data);
> > + auto FieldListData = Data;
> > + Data = ArrayRef<uint8_t>();
> > + return FieldListRecord(FieldListData);
> > }
> >
> > Expected<ArrayRecord> ArrayRecord::deserialize(TypeRecordKind Kind,
> > @@ -448,7 +451,7 @@ bool PointerRecord::remapTypeIndices(Arr
> > bool Success = true;
> > Success &= remapIndex(IndexMap, ReferentType);
> > if (isPointerToMember())
> > - Success &= MemberInfo.remapTypeIndices(IndexMap);
> > + Success &= MemberInfo->remapTypeIndices(IndexMap);
> > return Success;
> > }
> >
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp Tue Aug 16
> 18:28:54 2016
> > @@ -84,6 +84,11 @@ private:
> >
> > Error visitKnownRecordImpl(FieldListRecord &Record) {
> > // Don't do anything, this will get written in the call to
> visitTypeEnd().
> > + TypeDeserializer Deserializer(*this);
> > + CVTypeVisitor Visitor(Deserializer);
> > +
> > + if (auto EC = Visitor.visitFieldListMemberStream(Record.Data))
> > + return std::move(EC);
> > return Error::success();
> > }
> >
> > @@ -102,6 +107,7 @@ private:
> >
> > TypeTableBuilder &DestStream;
> >
> > + bool IsInFieldList{false};
> > size_t BeginIndexMapSize = 0;
> >
> > /// Map from source type index to destination type index. Indexed by
> source
> > @@ -112,7 +118,10 @@ private:
> > } // end anonymous namespace
> >
> > Error TypeStreamMerger::visitTypeBegin(const CVRecord<TypeLeafKind>
> &Rec) {
> > - if (Rec.Type != TypeLeafKind::LF_FIELDLIST)
> > + if (Rec.Type == TypeLeafKind::LF_FIELDLIST) {
> > + assert(!IsInFieldList);
> > + IsInFieldList = true;
> > + } else
> > BeginIndexMapSize = IndexMap.size();
> > return Error::success();
> > }
> > @@ -121,7 +130,8 @@ Error TypeStreamMerger::visitTypeEnd(con
> > if (Rec.Type == TypeLeafKind::LF_FIELDLIST) {
> > IndexMap.push_back(DestStream.writeFieldList(FieldBuilder));
> > FieldBuilder.reset();
> > - } else {
> > + IsInFieldList = false;
> > + } else if (!IsInFieldList) {
> > assert(IndexMap.size() == BeginIndexMapSize + 1);
> > }
> > return Error::success();
> >
> > Modified: llvm/trunk/test/DebugInfo/COFF/big-type.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/big-type.ll?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/big-type.ll (original)
> > +++ llvm/trunk/test/DebugInfo/COFF/big-type.ll Tue Aug 16 18:28:54 2016
> > @@ -5,6 +5,7 @@
> > ; CHECK-LABEL: FieldList (0x1000)
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: Enumerator {
> > +; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: EnumValue: 5460
> > ; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE5461
> > @@ -14,6 +15,7 @@
> > ; CHECK-LABEL: FieldList (0x1001)
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: Enumerator {
> > +; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: EnumValue: 4095
> > ; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE4096
> > @@ -23,6 +25,7 @@
> > ; CHECK-LABEL: FieldList (0x1002)
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: Enumerator {
> > +; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: EnumValue: 2730
> > ; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE2731
> > @@ -32,6 +35,7 @@
> > ; CHECK-LABEL: FieldList (0x1003)
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: Enumerator {
> > +; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: EnumValue: 1365
> > ; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE1366
> > @@ -41,6 +45,7 @@
> > ; CHECK-LABEL: FieldList (0x1004)
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: Enumerator {
> > +; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: EnumValue: 0
> > ; CHECK-NEXT: Name: EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE1
> >
> > Modified: llvm/trunk/test/DebugInfo/COFF/enum.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/enum.ll?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/enum.ll (original)
> > +++ llvm/trunk/test/DebugInfo/COFF/enum.ll Tue Aug 16 18:28:54 2016
> > @@ -8,6 +8,7 @@
> > ; CHECK: FieldList (0x1000) {
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: Enumerator {
> > +; CHECK-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: EnumValue: 0
> > ; CHECK-NEXT: Name: BLAH
> >
> > Modified: llvm/trunk/test/DebugInfo/COFF/inheritance.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/inheritance.ll?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/inheritance.ll (original)
> > +++ llvm/trunk/test/DebugInfo/COFF/inheritance.ll Tue Aug 16 18:28:54
> 2016
> > @@ -16,11 +16,13 @@
> > ; CHECK: FieldList ({{.*}}) {
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: BaseClass {
> > +; CHECK-NEXT: TypeLeafKind: LF_BCLASS (0x1400)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: BaseType: B ({{.*}})
> > ; CHECK-NEXT: BaseOffset: 0x8
> > ; CHECK-NEXT: }
> > ; CHECK-NEXT: BaseClass {
> > +; CHECK-NEXT: TypeLeafKind: LF_BCLASS (0x1400)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: BaseType: C ({{.*}})
> > ; CHECK-NEXT: BaseOffset: 0x18
> > @@ -31,6 +33,7 @@
> > ; CHECK: FieldList ({{.*}}) {
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: VirtualBaseClass {
> > +; CHECK-NEXT: TypeLeafKind: LF_VBCLASS (0x1401)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: BaseType: A ({{.*}})
> > ; CHECK-NEXT: VBPtrType: const int* ({{.*}})
> > @@ -43,6 +46,7 @@
> > ; CHECK: FieldList ({{.*}}) {
> > ; CHECK-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; CHECK-NEXT: VirtualBaseClass {
> > +; CHECK-NEXT: TypeLeafKind: LF_VBCLASS (0x1401)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: BaseType: A ({{.*}})
> > ; CHECK-NEXT: VBPtrType: const int* ({{.*}})
> >
> > Modified: llvm/trunk/test/DebugInfo/COFF/virtual-method-kinds.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/virtual-method-kinds.ll?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/virtual-method-kinds.ll (original)
> > +++ llvm/trunk/test/DebugInfo/COFF/virtual-method-kinds.ll Tue Aug 16
> 18:28:54 2016
> > @@ -20,12 +20,14 @@
> > ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
> >
> > ; CHECK: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: Virtual (0x1)
> > ; CHECK-NEXT: Type: void C::() ({{.*}})
> > ; CHECK-NEXT: Name: f
> > ; CHECK-NEXT: }
> > ; CHECK-NEXT: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: Virtual (0x1)
> > ; CHECK-NEXT: Type: void C::() ({{.*}})
> > @@ -33,12 +35,14 @@
> > ; CHECK-NEXT: }
> >
> > ; CHECK: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: PureVirtual (0x5)
> > ; CHECK-NEXT: Type: void B::() ({{.*}})
> > ; CHECK-NEXT: Name: f
> > ; CHECK-NEXT: }
> > ; CHECK-NEXT: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: Virtual (0x1)
> > ; CHECK-NEXT: Type: void B::() ({{.*}})
> > @@ -46,6 +50,7 @@
> > ; CHECK-NEXT: }
> >
> > ; CHECK: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: IntroducingVirtual (0x4)
> > ; CHECK-NEXT: Type: void A::() ({{.*}})
> > @@ -53,6 +58,7 @@
> > ; CHECK-NEXT: Name: f
> > ; CHECK-NEXT: }
> > ; CHECK-NEXT: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: PureIntroducingVirtual (0x6)
> > ; CHECK-NEXT: Type: void A::() ({{.*}})
> >
> > Modified: llvm/trunk/test/DebugInfo/COFF/virtual-methods.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/virtual-methods.ll?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/COFF/virtual-methods.ll (original)
> > +++ llvm/trunk/test/DebugInfo/COFF/virtual-methods.ll Tue Aug 16
> 18:28:54 2016
> > @@ -64,6 +64,7 @@
> >
> > ; CHECK: FieldList ({{.*}}) {
> > ; CHECK: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: Virtual (0x1)
> > ; CHECK-NEXT: Type: int C::() ([[C_g]])
> > @@ -87,6 +88,7 @@
> >
> > ; CHECK: FieldList ({{.*}}) {
> > ; CHECK: OneMethod {
> > +; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
> > ; CHECK-NEXT: AccessSpecifier: Public (0x3)
> > ; CHECK-NEXT: MethodKind: Virtual (0x1)
> > ; CHECK-NEXT: Type: int D::() ([[D_g]])
> >
> > Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test?rev=278869&r1=278868&r2=278869&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test (original)
> > +++ llvm/trunk/test/DebugInfo/PDB/pdbdump-headers.test Tue Aug 16
> 18:28:54 2016
> > @@ -111,26 +111,31 @@
> > ; EMPTY-NEXT: FieldList (0x1002) {
> > ; EMPTY-NEXT: TypeLeafKind: LF_FIELDLIST (0x1203)
> > ; EMPTY-NEXT: Enumerator {
> > +; EMPTY-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; EMPTY-NEXT: AccessSpecifier: Public (0x3)
> > ; EMPTY-NEXT: EnumValue: 1
> > ; EMPTY-NEXT: Name: apartment
> > ; EMPTY-NEXT: }
> > ; EMPTY-NEXT: Enumerator {
> > +; EMPTY-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; EMPTY-NEXT: AccessSpecifier: Public (0x3)
> > ; EMPTY-NEXT: EnumValue: 2
> > ; EMPTY-NEXT: Name: single
> > ; EMPTY-NEXT: }
> > ; EMPTY-NEXT: Enumerator {
> > +; EMPTY-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; EMPTY-NEXT: AccessSpecifier: Public (0x3)
> > ; EMPTY-NEXT: EnumValue: 3
> > ; EMPTY-NEXT: Name: free
> > ; EMPTY-NEXT: }
> > ; EMPTY-NEXT: Enumerator {
> > +; EMPTY-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; EMPTY-NEXT: AccessSpecifier: Public (0x3)
> > ; EMPTY-NEXT: EnumValue: 4
> > ; EMPTY-NEXT: Name: neutral
> > ; EMPTY-NEXT: }
> > ; EMPTY-NEXT: Enumerator {
> > +; EMPTY-NEXT: TypeLeafKind: LF_ENUMERATE (0x1502)
> > ; EMPTY-NEXT: AccessSpecifier: Public (0x3)
> > ; EMPTY-NEXT: EnumValue: 5
> > ; EMPTY-NEXT: Name: both
> >
> > Added: llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-types.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-types.test?rev=278869&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-types.test (added)
> > +++ llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-types.test Tue Aug 16
> 18:28:54 2016
> > @@ -0,0 +1,1087 @@
> > +; RUN: llvm-pdbdump pdb2yaml -tpi-stream %p/Inputs/empty.pdb \
> > +; RUN: | FileCheck -check-prefix=YAML %s
> > +
> > +YAML: ---
> > +YAML: MSF:
> > +YAML: SuperBlock:
> > +YAML: BlockSize: 4096
> > +YAML: FreeBlockMap: 2
> > +YAML: NumBlocks: 25
> > +YAML: NumDirectoryBytes: 136
> > +YAML: Unknown1: 0
> > +YAML: BlockMapAddr: 24
> > +YAML: NumDirectoryBlocks: 1
> > +YAML: DirectoryBlocks: [ 23 ]
> > +YAML: NumStreams: 0
> > +YAML: FileSize: 102400
> > +YAML: TpiStream:
> > +YAML: Version: VC80
> > +YAML: Records:
> > +YAML: - Kind: LF_ARGLIST
> > +YAML: ArgList:
> > +YAML: ArgIndices: [ ]
> > +YAML: - Kind: LF_PROCEDURE
> > +YAML: Procedure:
> > +YAML: ReturnType: 116
> > +YAML: CallConv: NearC
> > +YAML: Options: [ None ]
> > +YAML: ParameterCount: 0
> > +YAML: ArgumentList: 4096
> > +YAML: - Kind: LF_FIELDLIST
> > +YAML: FieldList:
> > +YAML: Kind: LF_ENUMERATE
> > +YAML: Enumerator:
> > +YAML: Access: Public
> > +YAML: Value: 1
> > +YAML: Name: apartment
> > +YAML: Kind: LF_ENUMERATE
> > +YAML: Enumerator:
> > +YAML: Access: Public
> > +YAML: Value: 2
> > +YAML: Name: single
> > +YAML: Kind: LF_ENUMERATE
> > +YAML: Enumerator:
> > +YAML: Access: Public
> > +YAML: Value: 3
> > +YAML: Name: free
> > +YAML: Kind: LF_ENUMERATE
> > +YAML: Enumerator:
> > +YAML: Access: Public
> > +YAML: Value: 4
> > +YAML: Name: neutral
> > +YAML: Kind: LF_ENUMERATE
> > +YAML: Enumerator:
> > +YAML: Access: Public
> > +YAML: Value: 5
> > +YAML: Name: both
> > +YAML: - Kind: LF_ENUM
> > +YAML: Enum:
> > +YAML: NumEnumerators: 5
> > +YAML: Options: [ None, Nested, HasUniqueName ]
> > +YAML: FieldList: 4098
> > +YAML: Name:
> '__vc_attributes::threadingAttribute::threading_e'
> > +YAML: UniqueName: '.?AW4threading_e at threadingAttribute
> @__vc_attributes@@'
> > +YAML: UnderlyingType: 116
> > +YAML: - Kind: LF_STRUCTURE
> > +YAML: Class:
> > +YAML: MemberCount: 0
> > +YAML: Options: [ None, ForwardReference, HasUniqueName ]
> > +YAML: FieldList: 0
> > +YAML: Name: '__vc_attributes::threadingAttribute'
> > +YAML: UniqueName: '.?AUthreadingAttribute at __vc_attributes@
> @'
> > +YAML: Hfa: None
> > +YAML: WinRTKind: None
> > +YAML: DerivationList: 0
> > +YAML: VTableShape: 0
> > +YAML: Size: 0
> > +YAML: - Kind: LF_POINTER
> > +YAML: Pointer:
> > +YAML: ReferentType: 410
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160816/b19ffa8e/attachment-0001.html>
More information about the llvm-commits
mailing list