[llvm] r269316 - Get rid of CVLeafTypes.def and combine with TypeRecords.def

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Thu May 12 10:45:51 PDT 2016


Author: zturner
Date: Thu May 12 12:45:51 2016
New Revision: 269316

URL: http://llvm.org/viewvc/llvm-project?rev=269316&view=rev
Log:
Get rid of CVLeafTypes.def and combine with TypeRecords.def

This merges the functionality of the macros in `CVLeafTypes.def` and the
macros in `TypeRecords.def` into a single set of macros.

Differential Revision: http://reviews.llvm.org/D20190
Reviewed By: rnk, amccarth

Removed:
    llvm/trunk/include/llvm/DebugInfo/CodeView/CVLeafTypes.def
Modified:
    llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def
    llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp

Removed: llvm/trunk/include/llvm/DebugInfo/CodeView/CVLeafTypes.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVLeafTypes.def?rev=269315&view=auto
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CVLeafTypes.def (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVLeafTypes.def (removed)
@@ -1,217 +0,0 @@
-//===-- CVLeafTypes.def - All CodeView leaf types ---------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// See LEAF_ENUM_e in cvinfo.h. This should match the constants there.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LEAF_TYPE
-#define LEAF_TYPE(ename, value)
-#endif
-
-// If the type is known, then we have a record describing it in TypeRecord.h.
-#ifndef KNOWN_TYPE
-#define KNOWN_TYPE(ename, value, class_name) LEAF_TYPE(ename, value)
-#endif
-
-// 16 bit type records.
-LEAF_TYPE(LF_MODIFIER_16t, 0x0001)
-LEAF_TYPE(LF_POINTER_16t, 0x0002)
-LEAF_TYPE(LF_ARRAY_16t, 0x0003)
-LEAF_TYPE(LF_CLASS_16t, 0x0004)
-LEAF_TYPE(LF_STRUCTURE_16t, 0x0005)
-LEAF_TYPE(LF_UNION_16t, 0x0006)
-LEAF_TYPE(LF_ENUM_16t, 0x0007)
-LEAF_TYPE(LF_PROCEDURE_16t, 0x0008)
-LEAF_TYPE(LF_MFUNCTION_16t, 0x0009)
-KNOWN_TYPE(LF_VTSHAPE, 0x000a, VTableShape)
-LEAF_TYPE(LF_COBOL0_16t, 0x000b)
-LEAF_TYPE(LF_COBOL1, 0x000c)
-LEAF_TYPE(LF_BARRAY_16t, 0x000d)
-LEAF_TYPE(LF_LABEL, 0x000e)
-LEAF_TYPE(LF_NULLLEAF, 0x000f) // LF_NULL
-LEAF_TYPE(LF_NOTTRAN, 0x0010)
-LEAF_TYPE(LF_DIMARRAY_16t, 0x0011)
-LEAF_TYPE(LF_VFTPATH_16t, 0x0012)
-LEAF_TYPE(LF_PRECOMP_16t, 0x0013)
-LEAF_TYPE(LF_ENDPRECOMP, 0x0014)
-LEAF_TYPE(LF_OEM_16t, 0x0015)
-LEAF_TYPE(LF_TYPESERVER_ST, 0x0016)
-
-LEAF_TYPE(LF_SKIP_16t, 0x0200)
-LEAF_TYPE(LF_ARGLIST_16t, 0x0201)
-LEAF_TYPE(LF_DEFARG_16t, 0x0202)
-LEAF_TYPE(LF_LIST, 0x0203)
-LEAF_TYPE(LF_FIELDLIST_16t, 0x0204)
-LEAF_TYPE(LF_DERIVED_16t, 0x0205)
-LEAF_TYPE(LF_BITFIELD_16t, 0x0206)
-LEAF_TYPE(LF_METHODLIST_16t, 0x0207)
-LEAF_TYPE(LF_DIMCONU_16t, 0x0208)
-LEAF_TYPE(LF_DIMCONLU_16t, 0x0209)
-LEAF_TYPE(LF_DIMVARU_16t, 0x020a)
-LEAF_TYPE(LF_DIMVARLU_16t, 0x020b)
-LEAF_TYPE(LF_REFSYM, 0x020c)
-
-// 16 bit member types. Generally not length prefixed.
-LEAF_TYPE(LF_BCLASS_16t, 0x0400)
-LEAF_TYPE(LF_VBCLASS_16t, 0x0401)
-LEAF_TYPE(LF_IVBCLASS_16t, 0x0402)
-LEAF_TYPE(LF_ENUMERATE_ST, 0x0403)
-LEAF_TYPE(LF_FRIENDFCN_16t, 0x0404)
-LEAF_TYPE(LF_INDEX_16t, 0x0405)
-LEAF_TYPE(LF_MEMBER_16t, 0x0406)
-LEAF_TYPE(LF_STMEMBER_16t, 0x0407)
-LEAF_TYPE(LF_METHOD_16t, 0x0408)
-LEAF_TYPE(LF_NESTTYPE_16t, 0x0409)
-LEAF_TYPE(LF_VFUNCTAB_16t, 0x040a)
-LEAF_TYPE(LF_FRIENDCLS_16t, 0x040b)
-LEAF_TYPE(LF_ONEMETHOD_16t, 0x040c)
-LEAF_TYPE(LF_VFUNCOFF_16t, 0x040d)
-
-LEAF_TYPE(LF_TI16_MAX, 0x1000)
-
-KNOWN_TYPE(LF_MODIFIER, 0x1001, TypeModifier)
-KNOWN_TYPE(LF_POINTER, 0x1002, PointerType)
-LEAF_TYPE(LF_ARRAY_ST, 0x1003)
-LEAF_TYPE(LF_CLASS_ST, 0x1004)
-LEAF_TYPE(LF_STRUCTURE_ST, 0x1005)
-LEAF_TYPE(LF_UNION_ST, 0x1006)
-LEAF_TYPE(LF_ENUM_ST, 0x1007)
-KNOWN_TYPE(LF_PROCEDURE, 0x1008, ProcedureType)
-KNOWN_TYPE(LF_MFUNCTION, 0x1009, MemberFunctionType)
-LEAF_TYPE(LF_COBOL0, 0x100a)
-LEAF_TYPE(LF_BARRAY, 0x100b)
-LEAF_TYPE(LF_DIMARRAY_ST, 0x100c)
-LEAF_TYPE(LF_VFTPATH, 0x100d)
-LEAF_TYPE(LF_PRECOMP_ST, 0x100e)
-LEAF_TYPE(LF_OEM, 0x100f)
-LEAF_TYPE(LF_ALIAS_ST, 0x1010)
-LEAF_TYPE(LF_OEM2, 0x1011)
-
-LEAF_TYPE(LF_SKIP, 0x1200)
-KNOWN_TYPE(LF_ARGLIST, 0x1201, ArgList)
-LEAF_TYPE(LF_DEFARG_ST, 0x1202)
-LEAF_TYPE(LF_FIELDLIST, 0x1203)
-LEAF_TYPE(LF_DERIVED, 0x1204)
-LEAF_TYPE(LF_BITFIELD, 0x1205)
-KNOWN_TYPE(LF_METHODLIST, 0x1206, MethodListEntry)
-LEAF_TYPE(LF_DIMCONU, 0x1207)
-LEAF_TYPE(LF_DIMCONLU, 0x1208)
-LEAF_TYPE(LF_DIMVARU, 0x1209)
-LEAF_TYPE(LF_DIMVARLU, 0x120a)
-
-// Member type records. These are generally not length prefixed, and appear
-// inside of a field list record.
-KNOWN_TYPE(LF_BCLASS, 0x1400, BaseClass)
-KNOWN_TYPE(LF_VBCLASS, 0x1401, VirtualBaseClass)
-KNOWN_TYPE(LF_IVBCLASS, 0x1402, VirtualBaseClass)
-LEAF_TYPE(LF_FRIENDFCN_ST, 0x1403)
-LEAF_TYPE(LF_INDEX, 0x1404)
-LEAF_TYPE(LF_MEMBER_ST, 0x1405)
-LEAF_TYPE(LF_STMEMBER_ST, 0x1406)
-LEAF_TYPE(LF_METHOD_ST, 0x1407)
-LEAF_TYPE(LF_NESTTYPE_ST, 0x1408)
-KNOWN_TYPE(LF_VFUNCTAB, 0x1409, VirtualFunctionPointer)
-LEAF_TYPE(LF_FRIENDCLS, 0x140a)
-LEAF_TYPE(LF_ONEMETHOD_ST, 0x140b)
-LEAF_TYPE(LF_VFUNCOFF, 0x140c)
-LEAF_TYPE(LF_NESTTYPEEX_ST, 0x140d)
-LEAF_TYPE(LF_MEMBERMODIFY_ST, 0x140e)
-LEAF_TYPE(LF_MANAGED_ST, 0x140f)
-
-LEAF_TYPE(LF_ST_MAX, 0x1500)
-LEAF_TYPE(LF_TYPESERVER, 0x1501)
-KNOWN_TYPE(LF_ENUMERATE, 0x1502, Enumerator)
-KNOWN_TYPE(LF_ARRAY, 0x1503, ArrayType)
-KNOWN_TYPE(LF_CLASS, 0x1504, ClassType)
-KNOWN_TYPE(LF_STRUCTURE, 0x1505, ClassType)
-KNOWN_TYPE(LF_UNION, 0x1506, UnionType)
-KNOWN_TYPE(LF_ENUM, 0x1507, EnumType)
-LEAF_TYPE(LF_DIMARRAY, 0x1508)
-LEAF_TYPE(LF_PRECOMP, 0x1509)
-LEAF_TYPE(LF_ALIAS, 0x150a)
-LEAF_TYPE(LF_DEFARG, 0x150b)
-LEAF_TYPE(LF_FRIENDFCN, 0x150c)
-KNOWN_TYPE(LF_MEMBER, 0x150d, DataMember)
-KNOWN_TYPE(LF_STMEMBER, 0x150e, StaticDataMember)
-KNOWN_TYPE(LF_METHOD, 0x150f, OverloadedMethod)
-KNOWN_TYPE(LF_NESTTYPE, 0x1510, NestedType)
-KNOWN_TYPE(LF_ONEMETHOD, 0x1511, OneMethod)
-LEAF_TYPE(LF_NESTTYPEEX, 0x1512)
-LEAF_TYPE(LF_MEMBERMODIFY, 0x1513)
-LEAF_TYPE(LF_MANAGED, 0x1514)
-KNOWN_TYPE(LF_TYPESERVER2, 0x1515, TypeServer2)
-LEAF_TYPE(LF_STRIDED_ARRAY, 0x1516)
-LEAF_TYPE(LF_HLSL, 0x1517)
-LEAF_TYPE(LF_MODIFIER_EX, 0x1518)
-KNOWN_TYPE(LF_INTERFACE, 0x1519, ClassType)
-KNOWN_TYPE(LF_BINTERFACE, 0x151a, BaseClass)
-LEAF_TYPE(LF_VECTOR, 0x151b)
-LEAF_TYPE(LF_MATRIX, 0x151c)
-KNOWN_TYPE(LF_VFTABLE, 0x151d, VFTableType)
-
-// ID leaf records. Subsequent leaf types may be referenced from .debug$S.
-
-KNOWN_TYPE(LF_FUNC_ID, 0x1601, FuncId)
-KNOWN_TYPE(LF_MFUNC_ID, 0x1602, MemberFuncId)
-KNOWN_TYPE(LF_BUILDINFO, 0x1603, BuildInfo)
-KNOWN_TYPE(LF_SUBSTR_LIST, 0x1604, ArgList)
-KNOWN_TYPE(LF_STRING_ID, 0x1605, StringId)
-KNOWN_TYPE(LF_UDT_SRC_LINE, 0x1606, UDTSrcLine)
-LEAF_TYPE(LF_UDT_MOD_SRC_LINE, 0x1607)
-
-// Numeric leaf types. These are generally contained in other records, and not
-// encountered in the main type stream.
-
-LEAF_TYPE(LF_NUMERIC, 0x8000)
-LEAF_TYPE(LF_CHAR, 0x8000)
-LEAF_TYPE(LF_SHORT, 0x8001)
-LEAF_TYPE(LF_USHORT, 0x8002)
-LEAF_TYPE(LF_LONG, 0x8003)
-LEAF_TYPE(LF_ULONG, 0x8004)
-LEAF_TYPE(LF_REAL32, 0x8005)
-LEAF_TYPE(LF_REAL64, 0x8006)
-LEAF_TYPE(LF_REAL80, 0x8007)
-LEAF_TYPE(LF_REAL128, 0x8008)
-LEAF_TYPE(LF_QUADWORD, 0x8009)
-LEAF_TYPE(LF_UQUADWORD, 0x800a)
-LEAF_TYPE(LF_REAL48, 0x800b)
-LEAF_TYPE(LF_COMPLEX32, 0x800c)
-LEAF_TYPE(LF_COMPLEX64, 0x800d)
-LEAF_TYPE(LF_COMPLEX80, 0x800e)
-LEAF_TYPE(LF_COMPLEX128, 0x800f)
-LEAF_TYPE(LF_VARSTRING, 0x8010)
-LEAF_TYPE(LF_OCTWORD, 0x8017)
-LEAF_TYPE(LF_UOCTWORD, 0x8018)
-LEAF_TYPE(LF_DECIMAL, 0x8019)
-LEAF_TYPE(LF_DATE, 0x801a)
-LEAF_TYPE(LF_UTF8STRING, 0x801b)
-LEAF_TYPE(LF_REAL16, 0x801c)
-
-// Padding bytes. These are emitted into alignment bytes in the type stream.
-
-LEAF_TYPE(LF_PAD0, 0xf0)
-LEAF_TYPE(LF_PAD1, 0xf1)
-LEAF_TYPE(LF_PAD2, 0xf2)
-LEAF_TYPE(LF_PAD3, 0xf3)
-LEAF_TYPE(LF_PAD4, 0xf4)
-LEAF_TYPE(LF_PAD5, 0xf5)
-LEAF_TYPE(LF_PAD6, 0xf6)
-LEAF_TYPE(LF_PAD7, 0xf7)
-LEAF_TYPE(LF_PAD8, 0xf8)
-LEAF_TYPE(LF_PAD9, 0xf9)
-LEAF_TYPE(LF_PAD10, 0xfa)
-LEAF_TYPE(LF_PAD11, 0xfb)
-LEAF_TYPE(LF_PAD12, 0xfc)
-LEAF_TYPE(LF_PAD13, 0xfd)
-LEAF_TYPE(LF_PAD14, 0xfe)
-LEAF_TYPE(LF_PAD15, 0xff)
-
-#undef KNOWN_TYPE
-#undef LEAF_TYPE

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=269316&r1=269315&r2=269316&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h Thu May 12 12:45:51 2016
@@ -42,12 +42,12 @@ public:
   /// expected to consume the trailing bytes used by the field.
   /// FIXME: Make the visitor interpret the trailing bytes so that clients don't
   /// need to.
-#define TYPE_RECORD(ClassName, LeafEnum)                                       \
+#define TYPE_RECORD(EnumName, EnumVal, ClassName, PrintName)                   \
   void visit##ClassName(TypeLeafKind LeafType, ClassName &Record) {}
-#define TYPE_RECORD_ALIAS(ClassName, LeafEnum)
-#define MEMBER_RECORD(ClassName, LeafEnum)                                     \
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, ClassName, PrintName)
+#define MEMBER_RECORD(EnumName, EnumVal, ClassName, PrintName)                 \
   void visit##ClassName(TypeLeafKind LeafType, ClassName &Record) {}
-#define MEMBER_RECORD_ALIAS(ClassName, LeafEnum)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, ClassName, PrintName)
 #include "TypeRecords.def"
 
   void visitTypeRecord(const TypeIterator::Record &Record) {
@@ -62,12 +62,9 @@ public:
     case LF_FIELDLIST:
       DerivedThis->visitFieldList(Record.Type, LeafData);
       break;
-    case LF_METHODLIST:
-      DerivedThis->visitMethodList(Record.Type, LeafData);
-      break;
-#define TYPE_RECORD(ClassName, LeafEnum)                                       \
-  case LeafEnum: {                                                             \
-    TypeRecordKind RK = static_cast<TypeRecordKind>(LeafEnum);                 \
+#define TYPE_RECORD(EnumName, EnumVal, ClassName, PrintName)                   \
+  case EnumName: {                                                             \
+    TypeRecordKind RK = static_cast<TypeRecordKind>(EnumName);                 \
     auto Result = ClassName::deserialize(RK, LeafData);                        \
     if (Result.getError())                                                     \
       return parseError();                                                     \
@@ -118,9 +115,9 @@ public:
         // continue parsing past an unknown member type.
         visitUnknownMember(Leaf);
         return parseError();
-#define MEMBER_RECORD(ClassName, LeafEnum)                                     \
-  case LeafEnum: {                                                             \
-    TypeRecordKind RK = static_cast<TypeRecordKind>(LeafEnum);                 \
+#define MEMBER_RECORD(EnumName, EnumVal, ClassName, PrintName)                 \
+  case EnumName: {                                                             \
+    TypeRecordKind RK = static_cast<TypeRecordKind>(EnumName);                 \
     auto Result = ClassName::deserialize(RK, FieldData);                       \
     if (Result.getError())                                                     \
       return parseError();                                                     \
@@ -133,12 +130,6 @@ public:
     }
   }
 
-  /// Action to take on method overload lists, which do not have a common record
-  /// prefix. The LeafData is composed of MethodListEntry objects, each of which
-  /// may have a trailing 32-bit vftable offset.
-  /// FIXME: Hoist this complexity into the visitor.
-  void visitMethodList(TypeLeafKind Leaf, ArrayRef<uint8_t> LeafData) {}
-
   /// Action to take on unknown members. By default, they are ignored. Member
   /// record parsing cannot recover from an unknown member record, so this
   /// method is only called at most once per field list record.

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h?rev=269316&r1=269315&r2=269316&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h Thu May 12 12:45:51 2016
@@ -384,8 +384,8 @@ enum class PointerToMemberRepresentation
 /// Distinguishes individual records in .debug$T section or PDB type stream. The
 /// documentation and headers talk about this as the "leaf" type.
 enum TypeLeafKind : uint16_t {
-#define LEAF_TYPE(name, val) name = val,
-#include "CVLeafTypes.def"
+#define CV_TYPE(name, val) name = val,
+#include "TypeRecords.def"
 };
 
 enum class TypeRecordKind : uint16_t {

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=269316&r1=269315&r2=269316&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h Thu May 12 12:45:51 2016
@@ -993,32 +993,38 @@ private:
 };
 
 // LF_METHODLIST
-class MethodListRecord : public TypeRecord {
+class MethodOverloadListRecord : public TypeRecord {
 public:
-  MethodListRecord(TypeIndex Type, MethodKind Kind, MethodOptions Options,
-                   MemberAccess Access, int32_t VFTableOffset)
-      : TypeRecord(TypeRecordKind::MethodList), Type(Type), Kind(Kind),
-        Options(Options), Access(Access), VFTableOffset(VFTableOffset) {}
+  MethodOverloadListRecord(ArrayRef<OneMethodRecord> Methods)
+      : TypeRecord(TypeRecordKind::MethodList), MethodsRef(Methods) {}
+  MethodOverloadListRecord(std::vector<OneMethodRecord> &Methods)
+      : TypeRecord(TypeRecordKind::MethodList), Methods(Methods) {}
 
-  static ErrorOr<MethodListRecord> deserialize(TypeRecordKind Kind,
+  static ErrorOr<MethodOverloadListRecord> deserialize(TypeRecordKind Kind,
                                                ArrayRef<uint8_t> &Data) {
-    const Layout *L = nullptr;
-    int32_t VFTableOffset = 0;
-    CV_DESERIALIZE(Data, L, CV_CONDITIONAL_FIELD(
-                                VFTableOffset, L->Attrs.isIntroducedVirtual()));
-
-    MethodOptions Options = L->Attrs.getFlags();
-    MethodKind MethKind = L->Attrs.getMethodKind();
-    MemberAccess Access = L->Attrs.getAccess();
-
-    return MethodListRecord(L->Type, MethKind, Options, Access, VFTableOffset);
+    std::vector<OneMethodRecord> Methods;
+    while (!Data.empty()) {
+      const Layout *L = nullptr;
+      int32_t VFTableOffset = 0;
+      CV_DESERIALIZE(
+          Data, L,
+          CV_CONDITIONAL_FIELD(VFTableOffset, L->Attrs.isIntroducedVirtual()));
+
+      MethodOptions Options = L->Attrs.getFlags();
+      MethodKind MethKind = L->Attrs.getMethodKind();
+      MemberAccess Access = L->Attrs.getAccess();
+
+      Methods.emplace_back(L->Type, MethKind, Options, Access, VFTableOffset,
+                           StringRef());
+    }
+    return MethodOverloadListRecord(Methods);
   }
 
-  TypeIndex getType() const { return Type; }
-  MethodKind getMethodKind() const { return Kind; }
-  MethodOptions getOptions() const { return Options; }
-  MemberAccess getAccess() const { return Access; }
-  int32_t getVFTableOffset() const { return VFTableOffset; }
+  ArrayRef<OneMethodRecord> getMethods() const {
+    if (!MethodsRef.empty())
+      return MethodsRef;
+    return Methods;
+  }
 
 private:
   struct Layout {
@@ -1030,11 +1036,8 @@ private:
     //   VFTableOffset: int32_t offset in vftable
   };
 
-  TypeIndex Type;
-  MethodKind Kind;
-  MethodOptions Options;
-  MemberAccess Access;
-  int32_t VFTableOffset;
+  ArrayRef<OneMethodRecord> MethodsRef;
+  std::vector<OneMethodRecord> Methods;
 };
 
 /// For method overload sets.  LF_METHOD

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def?rev=269316&r1=269315&r2=269316&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def Thu May 12 12:45:51 2016
@@ -13,62 +13,233 @@
 //===----------------------------------------------------------------------===//
 
 // If the type is known, then we have a record describing it in TypeRecord.h.
+
+#ifndef CV_TYPE
+#define CV_TYPE(ename, value)
+#endif
+
+// If the type is known, then we have a record describing it in TypeRecord.h.
 #ifndef TYPE_RECORD
-#define TYPE_RECORD(ClassName, LeafEnum)
+#define TYPE_RECORD(ename, value, class_name, print_name) CV_TYPE(ename, value)
 #endif
 
 #ifndef TYPE_RECORD_ALIAS
-#define TYPE_RECORD_ALIAS(ClassName, LeafEnum) TYPE_RECORD(ClassName, LeafEnum)
+#define TYPE_RECORD_ALIAS(ename, value, class_name, print_name) TYPE_RECORD(ename, value, class_name, print_name)
 #endif
 
 #ifndef MEMBER_RECORD
-#define MEMBER_RECORD(ClassName, LeafEnum) TYPE_RECORD(ClassName, LeafEnum)
+#define MEMBER_RECORD(ename, value, class_name, print_name) TYPE_RECORD(ename, value, class_name, print_name)
 #endif
 
 #ifndef MEMBER_RECORD_ALIAS
-#define MEMBER_RECORD_ALIAS(ClassName, LeafEnum) MEMBER_RECORD(ClassName, LeafEnum)
+#define MEMBER_RECORD_ALIAS(ename, value, class_name, print_name) MEMBER_RECORD(ename, value, class_name, print_name)
 #endif
 
+TYPE_RECORD(LF_POINTER, 0x1002, PointerRecord, PointerType)
+TYPE_RECORD(LF_MODIFIER, 0x1001, ModifierRecord, TypeModifier)
+TYPE_RECORD(LF_PROCEDURE, 0x1008, ProcedureRecord, ProcedureType)
+TYPE_RECORD(LF_MFUNCTION, 0x1009, MemberFunctionRecord, MemberFunctionType)
+TYPE_RECORD(LF_ARGLIST, 0x1201, StringListRecord, ArgList)
+
+TYPE_RECORD(LF_ARRAY, 0x1503, ArrayRecord, ArrayType)
+TYPE_RECORD(LF_CLASS, 0x1504, ClassRecord, ClassType)
+TYPE_RECORD_ALIAS(LF_STRUCTURE, 0x1505, ClassRecord, ClassType)
+TYPE_RECORD_ALIAS(LF_INTERFACE, 0x1519, ClassRecord, ClassType)
+TYPE_RECORD(LF_UNION, 0x1506, UnionRecord, UnionType)
+TYPE_RECORD(LF_ENUM, 0x1507, EnumRecord, EnumType)
+TYPE_RECORD(LF_TYPESERVER2, 0x1515, TypeServer2Record, TypeServer2)
+TYPE_RECORD(LF_VFTABLE, 0x151d, VirtualTableRecord, VFTableType)
+TYPE_RECORD(LF_VTSHAPE, 0x000a, VirtualTableShapeRecord, VTableShape)
+
+// Member type records. These are generally not length prefixed, and appear
+// inside of a field list record.
+MEMBER_RECORD(LF_BCLASS, 0x1400, BaseClassRecord, BaseClass)
+MEMBER_RECORD_ALIAS(LF_BINTERFACE, 0x151a, BaseClassRecord, BaseClass)
+
+MEMBER_RECORD(LF_VBCLASS, 0x1401, VirtualBaseClassRecord, VirtualBaseClass)
+MEMBER_RECORD_ALIAS(LF_IVBCLASS, 0x1402, VirtualBaseClassRecord, VirtualBaseClass)
+
+MEMBER_RECORD(LF_VFUNCTAB, 0x1409, VirtualFunctionPointerRecord, VirtualFunctionPointer)
+MEMBER_RECORD(LF_STMEMBER, 0x150e, StaticDataMemberRecord, StaticDataMember)
+MEMBER_RECORD(LF_METHOD, 0x150f, OverloadedMethodRecord, OverloadedMethod)
+MEMBER_RECORD(LF_MEMBER, 0x150d, DataMemberRecord, DataMember)
+MEMBER_RECORD(LF_NESTTYPE, 0x1510, NestedTypeRecord, NestedType)
+MEMBER_RECORD(LF_ONEMETHOD, 0x1511, OneMethodRecord, OneMethod)
+MEMBER_RECORD(LF_ENUMERATE, 0x1502, EnumeratorRecord, Enumerator)
 
-TYPE_RECORD(PointerRecord, LF_POINTER)
-TYPE_RECORD(ModifierRecord, LF_MODIFIER)
-TYPE_RECORD(ProcedureRecord, LF_PROCEDURE)
-TYPE_RECORD(MemberFunctionRecord, LF_MFUNCTION)
-TYPE_RECORD(StringListRecord, LF_ARGLIST)
-
-TYPE_RECORD(ArrayRecord, LF_ARRAY)
-TYPE_RECORD(ClassRecord, LF_CLASS)
-TYPE_RECORD_ALIAS(ClassRecord, LF_STRUCTURE)
-TYPE_RECORD_ALIAS(ClassRecord, LF_INTERFACE)
-TYPE_RECORD(UnionRecord, LF_UNION)
-TYPE_RECORD(EnumRecord, LF_ENUM)
-TYPE_RECORD(TypeServer2Record, LF_TYPESERVER2)
-TYPE_RECORD(VirtualTableRecord, LF_VFTABLE)
-TYPE_RECORD(VirtualTableShapeRecord, LF_VTSHAPE)
+// ID leaf records. Subsequent leaf types may be referenced from .debug$S.
+TYPE_RECORD(LF_FUNC_ID, 0x1601, FuncIdRecord, FuncId)
+TYPE_RECORD(LF_MFUNC_ID, 0x1602, MemberFunctionIdRecord, MemberFuncId)
+TYPE_RECORD(LF_BUILDINFO, 0x1603, BuildInfoRecord, BuildInfo)
+TYPE_RECORD_ALIAS(LF_SUBSTR_LIST, 0x1604, StringListRecord, ArgList)
+TYPE_RECORD(LF_STRING_ID, 0x1605, StringIdRecord, StringId)
+TYPE_RECORD(LF_UDT_SRC_LINE, 0x1606, UdtSourceLineRecord, UDTSrcLine)
+
+TYPE_RECORD(LF_METHODLIST, 0x1206, MethodOverloadListRecord, MethodListEntry)
+
+
+// 16 bit type records.
+CV_TYPE(LF_MODIFIER_16t, 0x0001)
+CV_TYPE(LF_POINTER_16t, 0x0002)
+CV_TYPE(LF_ARRAY_16t, 0x0003)
+CV_TYPE(LF_CLASS_16t, 0x0004)
+CV_TYPE(LF_STRUCTURE_16t, 0x0005)
+CV_TYPE(LF_UNION_16t, 0x0006)
+CV_TYPE(LF_ENUM_16t, 0x0007)
+CV_TYPE(LF_PROCEDURE_16t, 0x0008)
+CV_TYPE(LF_MFUNCTION_16t, 0x0009)
+CV_TYPE(LF_COBOL0_16t, 0x000b)
+CV_TYPE(LF_COBOL1, 0x000c)
+CV_TYPE(LF_BARRAY_16t, 0x000d)
+CV_TYPE(LF_LABEL, 0x000e)
+CV_TYPE(LF_NULLLEAF, 0x000f) // LF_NULL
+CV_TYPE(LF_NOTTRAN, 0x0010)
+CV_TYPE(LF_DIMARRAY_16t, 0x0011)
+CV_TYPE(LF_VFTPATH_16t, 0x0012)
+CV_TYPE(LF_PRECOMP_16t, 0x0013)
+CV_TYPE(LF_ENDPRECOMP, 0x0014)
+CV_TYPE(LF_OEM_16t, 0x0015)
+CV_TYPE(LF_TYPESERVER_ST, 0x0016)
+
+CV_TYPE(LF_SKIP_16t, 0x0200)
+CV_TYPE(LF_ARGLIST_16t, 0x0201)
+CV_TYPE(LF_DEFARG_16t, 0x0202)
+CV_TYPE(LF_LIST, 0x0203)
+CV_TYPE(LF_FIELDLIST_16t, 0x0204)
+CV_TYPE(LF_DERIVED_16t, 0x0205)
+CV_TYPE(LF_BITFIELD_16t, 0x0206)
+CV_TYPE(LF_METHODLIST_16t, 0x0207)
+CV_TYPE(LF_DIMCONU_16t, 0x0208)
+CV_TYPE(LF_DIMCONLU_16t, 0x0209)
+CV_TYPE(LF_DIMVARU_16t, 0x020a)
+CV_TYPE(LF_DIMVARLU_16t, 0x020b)
+CV_TYPE(LF_REFSYM, 0x020c)
+
+// 16 bit member types. Generally not length prefixed.
+CV_TYPE(LF_BCLASS_16t, 0x0400)
+CV_TYPE(LF_VBCLASS_16t, 0x0401)
+CV_TYPE(LF_IVBCLASS_16t, 0x0402)
+CV_TYPE(LF_ENUMERATE_ST, 0x0403)
+CV_TYPE(LF_FRIENDFCN_16t, 0x0404)
+CV_TYPE(LF_INDEX_16t, 0x0405)
+CV_TYPE(LF_MEMBER_16t, 0x0406)
+CV_TYPE(LF_STMEMBER_16t, 0x0407)
+CV_TYPE(LF_METHOD_16t, 0x0408)
+CV_TYPE(LF_NESTTYPE_16t, 0x0409)
+CV_TYPE(LF_VFUNCTAB_16t, 0x040a)
+CV_TYPE(LF_FRIENDCLS_16t, 0x040b)
+CV_TYPE(LF_ONEMETHOD_16t, 0x040c)
+CV_TYPE(LF_VFUNCOFF_16t, 0x040d)
+
+CV_TYPE(LF_TI16_MAX, 0x1000)
+
+CV_TYPE(LF_ARRAY_ST, 0x1003)
+CV_TYPE(LF_CLASS_ST, 0x1004)
+CV_TYPE(LF_STRUCTURE_ST, 0x1005)
+CV_TYPE(LF_UNION_ST, 0x1006)
+CV_TYPE(LF_ENUM_ST, 0x1007)
+CV_TYPE(LF_COBOL0, 0x100a)
+CV_TYPE(LF_BARRAY, 0x100b)
+CV_TYPE(LF_DIMARRAY_ST, 0x100c)
+CV_TYPE(LF_VFTPATH, 0x100d)
+CV_TYPE(LF_PRECOMP_ST, 0x100e)
+CV_TYPE(LF_OEM, 0x100f)
+CV_TYPE(LF_ALIAS_ST, 0x1010)
+CV_TYPE(LF_OEM2, 0x1011)
+
+CV_TYPE(LF_SKIP, 0x1200)
+CV_TYPE(LF_DEFARG_ST, 0x1202)
+CV_TYPE(LF_FIELDLIST, 0x1203)
+CV_TYPE(LF_DERIVED, 0x1204)
+CV_TYPE(LF_BITFIELD, 0x1205)
+CV_TYPE(LF_DIMCONU, 0x1207)
+CV_TYPE(LF_DIMCONLU, 0x1208)
+CV_TYPE(LF_DIMVARU, 0x1209)
+CV_TYPE(LF_DIMVARLU, 0x120a)
 
 // Member type records. These are generally not length prefixed, and appear
 // inside of a field list record.
-MEMBER_RECORD(BaseClassRecord, LF_BCLASS)
-MEMBER_RECORD_ALIAS(BaseClassRecord, LF_BINTERFACE)
-MEMBER_RECORD(VirtualBaseClassRecord, LF_VBCLASS)
-MEMBER_RECORD_ALIAS(VirtualBaseClassRecord, LF_IVBCLASS)
-MEMBER_RECORD(VirtualFunctionPointerRecord, LF_VFUNCTAB)
-MEMBER_RECORD(StaticDataMemberRecord, LF_STMEMBER)
-MEMBER_RECORD(OverloadedMethodRecord, LF_METHOD)
-MEMBER_RECORD(DataMemberRecord, LF_MEMBER)
-MEMBER_RECORD(NestedTypeRecord, LF_NESTTYPE)
-MEMBER_RECORD(OneMethodRecord, LF_ONEMETHOD)
-MEMBER_RECORD(EnumeratorRecord, LF_ENUMERATE)
+CV_TYPE(LF_FRIENDFCN_ST, 0x1403)
+CV_TYPE(LF_INDEX, 0x1404)
+CV_TYPE(LF_MEMBER_ST, 0x1405)
+CV_TYPE(LF_STMEMBER_ST, 0x1406)
+CV_TYPE(LF_METHOD_ST, 0x1407)
+CV_TYPE(LF_NESTTYPE_ST, 0x1408)
+CV_TYPE(LF_FRIENDCLS, 0x140a)
+CV_TYPE(LF_ONEMETHOD_ST, 0x140b)
+CV_TYPE(LF_VFUNCOFF, 0x140c)
+CV_TYPE(LF_NESTTYPEEX_ST, 0x140d)
+CV_TYPE(LF_MEMBERMODIFY_ST, 0x140e)
+CV_TYPE(LF_MANAGED_ST, 0x140f)
+
+CV_TYPE(LF_ST_MAX, 0x1500)
+CV_TYPE(LF_TYPESERVER, 0x1501)
+CV_TYPE(LF_DIMARRAY, 0x1508)
+CV_TYPE(LF_PRECOMP, 0x1509)
+CV_TYPE(LF_ALIAS, 0x150a)
+CV_TYPE(LF_DEFARG, 0x150b)
+CV_TYPE(LF_FRIENDFCN, 0x150c)
+CV_TYPE(LF_NESTTYPEEX, 0x1512)
+CV_TYPE(LF_MEMBERMODIFY, 0x1513)
+CV_TYPE(LF_MANAGED, 0x1514)
+CV_TYPE(LF_STRIDED_ARRAY, 0x1516)
+CV_TYPE(LF_HLSL, 0x1517)
+CV_TYPE(LF_MODIFIER_EX, 0x1518)
+CV_TYPE(LF_VECTOR, 0x151b)
+CV_TYPE(LF_MATRIX, 0x151c)
 
 // ID leaf records. Subsequent leaf types may be referenced from .debug$S.
 
-TYPE_RECORD(FuncIdRecord, LF_FUNC_ID)
-TYPE_RECORD(MemberFunctionIdRecord, LF_MFUNC_ID)
-TYPE_RECORD(BuildInfoRecord, LF_BUILDINFO)
-TYPE_RECORD_ALIAS(StringListRecord, LF_SUBSTR_LIST)
-TYPE_RECORD(StringIdRecord, LF_STRING_ID)
-TYPE_RECORD(UdtSourceLineRecord, LF_UDT_SRC_LINE)
+CV_TYPE(LF_UDT_MOD_SRC_LINE, 0x1607)
+
+// Numeric leaf types. These are generally contained in other records, and not
+// encountered in the main type stream.
+
+CV_TYPE(LF_NUMERIC, 0x8000)
+CV_TYPE(LF_CHAR, 0x8000)
+CV_TYPE(LF_SHORT, 0x8001)
+CV_TYPE(LF_USHORT, 0x8002)
+CV_TYPE(LF_LONG, 0x8003)
+CV_TYPE(LF_ULONG, 0x8004)
+CV_TYPE(LF_REAL32, 0x8005)
+CV_TYPE(LF_REAL64, 0x8006)
+CV_TYPE(LF_REAL80, 0x8007)
+CV_TYPE(LF_REAL128, 0x8008)
+CV_TYPE(LF_QUADWORD, 0x8009)
+CV_TYPE(LF_UQUADWORD, 0x800a)
+CV_TYPE(LF_REAL48, 0x800b)
+CV_TYPE(LF_COMPLEX32, 0x800c)
+CV_TYPE(LF_COMPLEX64, 0x800d)
+CV_TYPE(LF_COMPLEX80, 0x800e)
+CV_TYPE(LF_COMPLEX128, 0x800f)
+CV_TYPE(LF_VARSTRING, 0x8010)
+CV_TYPE(LF_OCTWORD, 0x8017)
+CV_TYPE(LF_UOCTWORD, 0x8018)
+CV_TYPE(LF_DECIMAL, 0x8019)
+CV_TYPE(LF_DATE, 0x801a)
+CV_TYPE(LF_UTF8STRING, 0x801b)
+CV_TYPE(LF_REAL16, 0x801c)
+
+// Padding bytes. These are emitted into alignment bytes in the type stream.
+
+CV_TYPE(LF_PAD0, 0xf0)
+CV_TYPE(LF_PAD1, 0xf1)
+CV_TYPE(LF_PAD2, 0xf2)
+CV_TYPE(LF_PAD3, 0xf3)
+CV_TYPE(LF_PAD4, 0xf4)
+CV_TYPE(LF_PAD5, 0xf5)
+CV_TYPE(LF_PAD6, 0xf6)
+CV_TYPE(LF_PAD7, 0xf7)
+CV_TYPE(LF_PAD8, 0xf8)
+CV_TYPE(LF_PAD9, 0xf9)
+CV_TYPE(LF_PAD10, 0xfa)
+CV_TYPE(LF_PAD11, 0xfb)
+CV_TYPE(LF_PAD12, 0xfc)
+CV_TYPE(LF_PAD13, 0xfd)
+CV_TYPE(LF_PAD14, 0xfe)
+CV_TYPE(LF_PAD15, 0xff)
 
+#undef CV_TYPE
 #undef TYPE_RECORD
 #undef TYPE_RECORD_ALIAS
 #undef MEMBER_RECORD

Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp?rev=269316&r1=269315&r2=269316&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/TypeDumper.cpp Thu May 12 12:45:51 2016
@@ -65,8 +65,8 @@ static const EnumEntry<SimpleTypeKind> S
 };
 
 static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
-#define LEAF_TYPE(enum, val) { #enum, enum },
-#include "llvm/DebugInfo/CodeView/CVLeafTypes.def"
+#define CV_TYPE(enum, val) {#enum, enum},
+#include "llvm/DebugInfo/CodeView/TypeRecords.def"
 };
 
 #define ENUM_ENTRY(enum_class, enum)                                           \
@@ -200,17 +200,14 @@ public:
       : CVTD(CVTD), W(W), PrintRecordBytes(PrintRecordBytes) {}
 
   /// CVTypeVisitor overrides.
-#define TYPE_RECORD(ClassName, LeafEnum)                                       \
+#define TYPE_RECORD(EnumName, EnumVal, ClassName, PrintName)                   \
   void visit##ClassName(TypeLeafKind LeafType, ClassName &Record);
-#define TYPE_RECORD_ALIAS(ClassName, LeafEnum)
-#define MEMBER_RECORD(ClassName, LeafEnum)                                     \
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, ClassName, PrintName)
+#define MEMBER_RECORD(EnumName, EnumVal, ClassName, PrintName)                 \
   void visit##ClassName(TypeLeafKind LeafType, ClassName &Record);
-#define MEMBER_RECORD_ALIAS(ClassName, LeafEnum)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, ClassName, PrintName)
 #include "llvm/DebugInfo/CodeView/TypeRecords.def"
 
-  /// Method overload lists are a special case.
-  void visitMethodList(TypeLeafKind Leaf, ArrayRef<uint8_t> LeafData);
-
   void visitUnknownMember(TypeLeafKind Leaf);
 
   void visitTypeBegin(TypeLeafKind Leaf, ArrayRef<uint8_t> LeafData);
@@ -242,9 +239,10 @@ private:
 
 static StringRef getLeafTypeName(TypeLeafKind LT) {
   switch (LT) {
-#define KNOWN_TYPE(LeafName, Value, ClassName) \
-  case LeafName: return #ClassName;
-#include "llvm/DebugInfo/CodeView/CVLeafTypes.def"
+#define TYPE_RECORD(ename, value, class_name, print_name)                      \
+  case ename:                                                                  \
+    return #print_name;
+#include "llvm/DebugInfo/CodeView/TypeRecords.def"
   default:
     break;
   }
@@ -405,21 +403,14 @@ void CVTypeDumperImpl::visitMemberFuncti
   Name = CVTD.saveName(TypeName);
 }
 
-void CVTypeDumperImpl::visitMethodList(TypeLeafKind Leaf,
-                                       ArrayRef<uint8_t> LeafData) {
-  while (!LeafData.empty()) {
-    auto Method =
-        MethodListRecord::deserialize(TypeRecordKind::MethodList, LeafData);
-    if (Method)
-      return;
-    const MethodListRecord &M = *Method;
-
+void CVTypeDumperImpl::visitMethodOverloadListRecord(TypeLeafKind Leaf,
+                                             MethodOverloadListRecord &MethodList) {
+  for (auto &M : MethodList.getMethods()) {
     ListScope S(W, "Method");
-    printMemberAttributes(M.getAccess(), M.getMethodKind(), M.getOptions());
-    printTypeIndex("Type", Method->getType());
-    if (Method->getMethodKind() == MethodKind::IntroducingVirtual ||
-        Method->getMethodKind() == MethodKind::PureIntroducingVirtual)
-      W.printHex("VFTableOffset", Method->getVFTableOffset());
+    printMemberAttributes(M.getAccess(), M.getKind(), M.getOptions());
+    printTypeIndex("Type", M.getType());
+    if (M.isIntroducingVirtual())
+      W.printHex("VFTableOffset", M.getVFTableOffset());
   }
 }
 




More information about the llvm-commits mailing list