[llvm] r304248 - [CodeView] Move CodeView YAML code to ObjectYAML.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Tue May 30 14:53:06 PDT 2017


Author: zturner
Date: Tue May 30 16:53:05 2017
New Revision: 304248

URL: http://llvm.org/viewvc/llvm-project?rev=304248&view=rev
Log:
[CodeView] Move CodeView YAML code to ObjectYAML.

This is the beginning of an effort to move the codeview yaml
reader / writer into ObjectYAML so that it can be shared.
Currently the only consumer / producer of CodeView YAML is
llvm-pdbdump, but CodeView can exist outside of PDB files, and
indeed is put into object files and passed to the linker to
produce PDB files.  Furthermore, there are subtle differences
in the types of records that show up in object file CodeView
vs PDB file CodeView, but they are otherwise 99% the same.

By having this code in ObjectYAML, we can have llvm-pdbdump
reuse this code, while teaching obj2yaml and yaml2obj to use
this syntax for dealing with object files that can contain
CodeView.

This patch only adds support for CodeView type information
to ObjectYAML.  Subsequent patches will add support for
CodeView symbol information.

Added:
    llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewSymbols.def
    llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewTypes.def
    llvm/trunk/include/llvm/ObjectYAML/CodeViewYAML.h
    llvm/trunk/lib/ObjectYAML/CodeViewYAML.cpp
Removed:
    llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolTypes.def
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def
    llvm/trunk/tools/llvm-pdbdump/YamlSerializationContext.h
    llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.cpp
    llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.h
Modified:
    llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumpVisitor.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeTableBuilder.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h
    llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawConstants.h
    llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiHashing.h
    llvm/trunk/include/llvm/Support/YAMLTraits.h
    llvm/trunk/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
    llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
    llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp
    llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp
    llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
    llvm/trunk/lib/MC/MCCodeView.cpp
    llvm/trunk/lib/ObjectYAML/CMakeLists.txt
    llvm/trunk/lib/ObjectYAML/LLVMBuild.txt
    llvm/trunk/tools/llvm-pdbdump/Analyze.cpp
    llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt
    llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp
    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/YamlSymbolDumper.cpp
    llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.h
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp

Removed: llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolTypes.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolTypes.def?rev=304247&view=auto
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolTypes.def (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CVSymbolTypes.def (removed)
@@ -1,258 +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 CV_SYMBOL
-#define CV_SYMBOL(ename, value)
-#endif
-
-#ifndef SYMBOL_RECORD
-#define SYMBOL_RECORD(lf_ename, value, name) CV_SYMBOL(lf_ename, value)
-#endif
-
-#ifndef SYMBOL_RECORD_ALIAS
-#define SYMBOL_RECORD_ALIAS(lf_ename, value, name, alias_name)                   \
-  SYMBOL_RECORD(lf_ename, value, name)
-#endif
-
-// 16 bit symbol types. Not very useful, provided only for reference.
-CV_SYMBOL(S_COMPILE       , 0x0001)
-CV_SYMBOL(S_REGISTER_16t  , 0x0002)
-CV_SYMBOL(S_CONSTANT_16t  , 0x0003)
-CV_SYMBOL(S_UDT_16t       , 0x0004)
-CV_SYMBOL(S_SSEARCH       , 0x0005)
-CV_SYMBOL(S_SKIP          , 0x0007)
-CV_SYMBOL(S_CVRESERVE     , 0x0008)
-CV_SYMBOL(S_OBJNAME_ST    , 0x0009)
-CV_SYMBOL(S_ENDARG        , 0x000a)
-CV_SYMBOL(S_COBOLUDT_16t  , 0x000b)
-CV_SYMBOL(S_MANYREG_16t   , 0x000c)
-CV_SYMBOL(S_RETURN        , 0x000d)
-CV_SYMBOL(S_ENTRYTHIS     , 0x000e)
-CV_SYMBOL(S_BPREL16       , 0x0100)
-CV_SYMBOL(S_LDATA16       , 0x0101)
-CV_SYMBOL(S_GDATA16       , 0x0102)
-CV_SYMBOL(S_PUB16         , 0x0103)
-CV_SYMBOL(S_LPROC16       , 0x0104)
-CV_SYMBOL(S_GPROC16       , 0x0105)
-CV_SYMBOL(S_THUNK16       , 0x0106)
-CV_SYMBOL(S_BLOCK16       , 0x0107)
-CV_SYMBOL(S_WITH16        , 0x0108)
-CV_SYMBOL(S_LABEL16       , 0x0109)
-CV_SYMBOL(S_CEXMODEL16    , 0x010a)
-CV_SYMBOL(S_VFTABLE16     , 0x010b)
-CV_SYMBOL(S_REGREL16      , 0x010c)
-CV_SYMBOL(S_BPREL32_16t   , 0x0200)
-CV_SYMBOL(S_LDATA32_16t   , 0x0201)
-CV_SYMBOL(S_GDATA32_16t   , 0x0202)
-CV_SYMBOL(S_PUB32_16t     , 0x0203)
-CV_SYMBOL(S_LPROC32_16t   , 0x0204)
-CV_SYMBOL(S_GPROC32_16t   , 0x0205)
-CV_SYMBOL(S_THUNK32_ST    , 0x0206)
-CV_SYMBOL(S_BLOCK32_ST    , 0x0207)
-CV_SYMBOL(S_WITH32_ST     , 0x0208)
-CV_SYMBOL(S_LABEL32_ST    , 0x0209)
-CV_SYMBOL(S_CEXMODEL32    , 0x020a)
-CV_SYMBOL(S_VFTABLE32_16t , 0x020b)
-CV_SYMBOL(S_REGREL32_16t  , 0x020c)
-CV_SYMBOL(S_LTHREAD32_16t , 0x020d)
-CV_SYMBOL(S_GTHREAD32_16t , 0x020e)
-CV_SYMBOL(S_SLINK32       , 0x020f)
-CV_SYMBOL(S_LPROCMIPS_16t , 0x0300)
-CV_SYMBOL(S_GPROCMIPS_16t , 0x0301)
-CV_SYMBOL(S_PROCREF_ST    , 0x0400)
-CV_SYMBOL(S_DATAREF_ST    , 0x0401)
-CV_SYMBOL(S_ALIGN         , 0x0402)
-CV_SYMBOL(S_LPROCREF_ST   , 0x0403)
-CV_SYMBOL(S_OEM           , 0x0404)
-
-// All post 16 bit symbol types have the 0x1000 bit set.
-CV_SYMBOL(S_TI16_MAX      , 0x1000)
-
-// Mostly unused "start" symbol types.
-CV_SYMBOL(S_REGISTER_ST   , 0x1001)
-CV_SYMBOL(S_CONSTANT_ST   , 0x1002)
-CV_SYMBOL(S_UDT_ST        , 0x1003)
-CV_SYMBOL(S_COBOLUDT_ST   , 0x1004)
-CV_SYMBOL(S_MANYREG_ST    , 0x1005)
-CV_SYMBOL(S_BPREL32_ST    , 0x1006)
-CV_SYMBOL(S_LDATA32_ST    , 0x1007)
-CV_SYMBOL(S_GDATA32_ST    , 0x1008)
-CV_SYMBOL(S_PUB32_ST      , 0x1009)
-CV_SYMBOL(S_LPROC32_ST    , 0x100a)
-CV_SYMBOL(S_GPROC32_ST    , 0x100b)
-CV_SYMBOL(S_VFTABLE32     , 0x100c)
-CV_SYMBOL(S_REGREL32_ST   , 0x100d)
-CV_SYMBOL(S_LTHREAD32_ST  , 0x100e)
-CV_SYMBOL(S_GTHREAD32_ST  , 0x100f)
-CV_SYMBOL(S_LPROCMIPS_ST  , 0x1010)
-CV_SYMBOL(S_GPROCMIPS_ST  , 0x1011)
-
-CV_SYMBOL(S_COMPILE2_ST   , 0x1013)
-CV_SYMBOL(S_MANYREG2_ST   , 0x1014)
-CV_SYMBOL(S_LPROCIA64_ST  , 0x1015)
-CV_SYMBOL(S_GPROCIA64_ST  , 0x1016)
-CV_SYMBOL(S_LOCALSLOT_ST  , 0x1017)
-CV_SYMBOL(S_PARAMSLOT_ST  , 0x1018)
-CV_SYMBOL(S_ANNOTATION    , 0x1019)
-CV_SYMBOL(S_GMANPROC_ST   , 0x101a)
-CV_SYMBOL(S_LMANPROC_ST   , 0x101b)
-CV_SYMBOL(S_RESERVED1     , 0x101c)
-CV_SYMBOL(S_RESERVED2     , 0x101d)
-CV_SYMBOL(S_RESERVED3     , 0x101e)
-CV_SYMBOL(S_RESERVED4     , 0x101f)
-CV_SYMBOL(S_LMANDATA_ST   , 0x1020)
-CV_SYMBOL(S_GMANDATA_ST   , 0x1021)
-CV_SYMBOL(S_MANFRAMEREL_ST, 0x1022)
-CV_SYMBOL(S_MANREGISTER_ST, 0x1023)
-CV_SYMBOL(S_MANSLOT_ST    , 0x1024)
-CV_SYMBOL(S_MANMANYREG_ST , 0x1025)
-CV_SYMBOL(S_MANREGREL_ST  , 0x1026)
-CV_SYMBOL(S_MANMANYREG2_ST, 0x1027)
-CV_SYMBOL(S_MANTYPREF     , 0x1028)
-CV_SYMBOL(S_UNAMESPACE_ST , 0x1029)
-
-// End of S_*_ST symbols, which do not appear to be generated by modern
-// compilers.
-CV_SYMBOL(S_ST_MAX        , 0x1100)
-
-
-CV_SYMBOL(S_WITH32        , 0x1104)
-CV_SYMBOL(S_MANYREG       , 0x110a)
-CV_SYMBOL(S_LPROCMIPS     , 0x1114)
-CV_SYMBOL(S_GPROCMIPS     , 0x1115)
-CV_SYMBOL(S_MANYREG2      , 0x1117)
-CV_SYMBOL(S_LPROCIA64     , 0x1118)
-CV_SYMBOL(S_GPROCIA64     , 0x1119)
-CV_SYMBOL(S_LOCALSLOT     , 0x111a)
-CV_SYMBOL(S_PARAMSLOT     , 0x111b)
-
-// Managed code symbols.
-CV_SYMBOL(S_MANFRAMEREL   , 0x111e)
-CV_SYMBOL(S_MANREGISTER   , 0x111f)
-CV_SYMBOL(S_MANSLOT       , 0x1120)
-CV_SYMBOL(S_MANMANYREG    , 0x1121)
-CV_SYMBOL(S_MANREGREL     , 0x1122)
-CV_SYMBOL(S_MANMANYREG2   , 0x1123)
-CV_SYMBOL(S_UNAMESPACE    , 0x1124)
-CV_SYMBOL(S_DATAREF       , 0x1126)
-CV_SYMBOL(S_ANNOTATIONREF , 0x1128)
-CV_SYMBOL(S_TOKENREF      , 0x1129)
-CV_SYMBOL(S_GMANPROC      , 0x112a)
-CV_SYMBOL(S_LMANPROC      , 0x112b)
-CV_SYMBOL(S_ATTR_FRAMEREL , 0x112e)
-CV_SYMBOL(S_ATTR_REGISTER , 0x112f)
-CV_SYMBOL(S_ATTR_REGREL   , 0x1130)
-CV_SYMBOL(S_ATTR_MANYREG  , 0x1131)
-
-
-CV_SYMBOL(S_SEPCODE       , 0x1132)
-CV_SYMBOL(S_LOCAL_2005    , 0x1133)
-CV_SYMBOL(S_DEFRANGE_2005 , 0x1134)
-CV_SYMBOL(S_DEFRANGE2_2005, 0x1135)
-CV_SYMBOL(S_DISCARDED     , 0x113b)
-
-// Current symbol types for most procedures as of this writing.
-CV_SYMBOL(S_LPROCMIPS_ID   , 0x1148)
-CV_SYMBOL(S_GPROCMIPS_ID   , 0x1149)
-CV_SYMBOL(S_LPROCIA64_ID   , 0x114a)
-CV_SYMBOL(S_GPROCIA64_ID   , 0x114b)
-
-CV_SYMBOL(S_DEFRANGE_HLSL  , 0x1150)
-CV_SYMBOL(S_GDATA_HLSL     , 0x1151)
-CV_SYMBOL(S_LDATA_HLSL     , 0x1152)
-CV_SYMBOL(S_LOCAL_DPC_GROUPSHARED, 0x1154)
-CV_SYMBOL(S_DEFRANGE_DPC_PTR_TAG, 0x1157)
-CV_SYMBOL(S_DPC_SYM_TAG_MAP, 0x1158)
-CV_SYMBOL(S_ARMSWITCHTABLE , 0x1159)
-CV_SYMBOL(S_POGODATA       , 0x115c)
-CV_SYMBOL(S_INLINESITE2    , 0x115d)
-CV_SYMBOL(S_MOD_TYPEREF    , 0x115f)
-CV_SYMBOL(S_REF_MINIPDB    , 0x1160)
-CV_SYMBOL(S_PDBMAP         , 0x1161)
-CV_SYMBOL(S_GDATA_HLSL32   , 0x1162)
-CV_SYMBOL(S_LDATA_HLSL32   , 0x1163)
-CV_SYMBOL(S_GDATA_HLSL32_EX, 0x1164)
-CV_SYMBOL(S_LDATA_HLSL32_EX, 0x1165)
-
-// Known symbol types
-SYMBOL_RECORD(S_END                  , 0x0006, ScopeEndSym)
-SYMBOL_RECORD_ALIAS(S_INLINESITE_END , 0x114e, InlineSiteEnd, ScopeEndSym)
-SYMBOL_RECORD_ALIAS(S_PROC_ID_END    , 0x114f, ProcEnd, ScopeEndSym)
-
-SYMBOL_RECORD(S_THUNK32       , 0x1102, Thunk32Sym)
-SYMBOL_RECORD(S_TRAMPOLINE    , 0x112c, TrampolineSym)
-SYMBOL_RECORD(S_SECTION       , 0x1136, SectionSym)
-SYMBOL_RECORD(S_COFFGROUP     , 0x1137, CoffGroupSym)
-SYMBOL_RECORD(S_EXPORT        , 0x1138, ExportSym)
-
-SYMBOL_RECORD(S_LPROC32       , 0x110f, ProcSym)
-SYMBOL_RECORD_ALIAS(S_GPROC32       , 0x1110, GlobalProcSym, ProcSym)
-SYMBOL_RECORD_ALIAS(S_LPROC32_ID     , 0x1146, ProcIdSym, ProcSym)
-SYMBOL_RECORD_ALIAS(S_GPROC32_ID     , 0x1147, GlobalProcIdSym, ProcSym)
-SYMBOL_RECORD_ALIAS(S_LPROC32_DPC    , 0x1155, DPCProcSym, ProcSym)
-SYMBOL_RECORD_ALIAS(S_LPROC32_DPC_ID , 0x1156, DPCProcIdSym, ProcSym)
-
-SYMBOL_RECORD(S_REGISTER      , 0x1106, RegisterSym)
-SYMBOL_RECORD(S_PUB32         , 0x110e, PublicSym32)
-
-SYMBOL_RECORD(S_PROCREF       , 0x1125, ProcRefSym)
-SYMBOL_RECORD_ALIAS(S_LPROCREF, 0x1127, LocalProcRef, ProcRefSym)
-
-
-SYMBOL_RECORD(S_ENVBLOCK      , 0x113d, EnvBlockSym)
-
-SYMBOL_RECORD(S_INLINESITE     , 0x114d, InlineSiteSym)
-SYMBOL_RECORD(S_LOCAL         , 0x113e, LocalSym)
-SYMBOL_RECORD(S_DEFRANGE      , 0x113f, DefRangeSym)
-SYMBOL_RECORD(S_DEFRANGE_SUBFIELD, 0x1140, DefRangeSubfieldSym)
-SYMBOL_RECORD(S_DEFRANGE_REGISTER, 0x1141, DefRangeRegisterSym)
-SYMBOL_RECORD(S_DEFRANGE_FRAMEPOINTER_REL, 0x1142, DefRangeFramePointerRelSym)
-SYMBOL_RECORD(S_DEFRANGE_SUBFIELD_REGISTER, 0x1143, DefRangeSubfieldRegisterSym)
-SYMBOL_RECORD(S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE, 0x1144, DefRangeFramePointerRelFullScopeSym)
-SYMBOL_RECORD(S_DEFRANGE_REGISTER_REL, 0x1145, DefRangeRegisterRelSym)
-SYMBOL_RECORD(S_BLOCK32       , 0x1103, BlockSym)
-SYMBOL_RECORD(S_LABEL32       , 0x1105, LabelSym)
-SYMBOL_RECORD(S_OBJNAME       , 0x1101, ObjNameSym)
-SYMBOL_RECORD(S_COMPILE2      , 0x1116, Compile2Sym)
-SYMBOL_RECORD(S_COMPILE3      , 0x113c, Compile3Sym)
-SYMBOL_RECORD(S_FRAMEPROC     , 0x1012, FrameProcSym)
-SYMBOL_RECORD(S_CALLSITEINFO  , 0x1139, CallSiteInfoSym)
-SYMBOL_RECORD(S_FILESTATIC     , 0x1153, FileStaticSym)
-SYMBOL_RECORD(S_HEAPALLOCSITE  , 0x115e, HeapAllocationSiteSym)
-SYMBOL_RECORD(S_FRAMECOOKIE   , 0x113a, FrameCookieSym)
-
-SYMBOL_RECORD(S_CALLEES        , 0x115a, CallerSym)
-SYMBOL_RECORD_ALIAS(S_CALLERS        , 0x115b, CalleeSym, CallerSym)
-
-SYMBOL_RECORD(S_UDT           , 0x1108, UDTSym)
-SYMBOL_RECORD_ALIAS(S_COBOLUDT      , 0x1109, CobolUDT, UDTSym)
-
-SYMBOL_RECORD(S_BUILDINFO      , 0x114c, BuildInfoSym)
-SYMBOL_RECORD(S_BPREL32       , 0x110b, BPRelativeSym)
-SYMBOL_RECORD(S_REGREL32      , 0x1111, RegRelativeSym)
-
-SYMBOL_RECORD(S_CONSTANT      , 0x1107, ConstantSym)
-SYMBOL_RECORD_ALIAS(S_MANCONSTANT   , 0x112d, ManagedConstant, ConstantSym)
-
-SYMBOL_RECORD(S_LDATA32       , 0x110c, DataSym)
-SYMBOL_RECORD_ALIAS(S_GDATA32       , 0x110d, GlobalData, DataSym)
-SYMBOL_RECORD_ALIAS(S_LMANDATA      , 0x111c, ManagedLocalData, DataSym)
-SYMBOL_RECORD_ALIAS(S_GMANDATA      , 0x111d, ManagedGlobalData, DataSym)
-
-SYMBOL_RECORD(S_LTHREAD32     , 0x1112, ThreadLocalDataSym)
-SYMBOL_RECORD_ALIAS(S_GTHREAD32     , 0x1113, GlobalTLS, ThreadLocalDataSym)
-
-
-#undef CV_SYMBOL
-#undef SYMBOL_RECORD
-#undef SYMBOL_RECORD_ALIAS

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=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h Tue May 30 16:53:05 2017
@@ -6,6 +6,10 @@
 // License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
+//
+// Defines constants and basic types describing CodeView debug information.
+//
+//===----------------------------------------------------------------------===//
 
 #ifndef LLVM_DEBUGINFO_CODEVIEW_CODEVIEW_H
 #define LLVM_DEBUGINFO_CODEVIEW_CODEVIEW_H
@@ -22,28 +26,28 @@ namespace codeview {
 /// documentation and headers talk about this as the "leaf" type.
 enum class TypeRecordKind : uint16_t {
 #define TYPE_RECORD(lf_ename, value, name) name = value,
-#include "TypeRecords.def"
+#include "CodeViewTypes.def"
 };
 
 /// Duplicate copy of the above enum, but using the official CV names. Useful
 /// for reference purposes and when dealing with unknown record types.
 enum TypeLeafKind : uint16_t {
 #define CV_TYPE(name, val) name = val,
-#include "TypeRecords.def"
+#include "CodeViewTypes.def"
 };
 
 /// Distinguishes individual records in the Symbols subsection of a .debug$S
 /// section. Equivalent to SYM_ENUM_e in cvinfo.h.
 enum class SymbolRecordKind : uint16_t {
 #define SYMBOL_RECORD(lf_ename, value, name) name = value,
-#include "CVSymbolTypes.def"
+#include "CodeViewSymbols.def"
 };
 
 /// Duplicate copy of the above enum, but using the official CV names. Useful
 /// for reference purposes and when dealing with unknown record types.
 enum SymbolKind : uint16_t {
 #define CV_SYMBOL(name, val) name = val,
-#include "CVSymbolTypes.def"
+#include "CodeViewSymbols.def"
 };
 
 #define CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(Class)                            \
@@ -280,7 +284,7 @@ CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS(Met
 /// Equivalent to CV_LABEL_TYPE_e.
 enum class LabelType : uint16_t {
   Near = 0x0,
-  Far  = 0x4,
+  Far = 0x4,
 };
 
 /// Equivalent to CV_modifier_t.

Added: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewSymbols.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewSymbols.def?rev=304248&view=auto
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewSymbols.def (added)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewSymbols.def Tue May 30 16:53:05 2017
@@ -0,0 +1,258 @@
+//===-- 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 CV_SYMBOL
+#define CV_SYMBOL(ename, value)
+#endif
+
+#ifndef SYMBOL_RECORD
+#define SYMBOL_RECORD(lf_ename, value, name) CV_SYMBOL(lf_ename, value)
+#endif
+
+#ifndef SYMBOL_RECORD_ALIAS
+#define SYMBOL_RECORD_ALIAS(lf_ename, value, name, alias_name)                   \
+  SYMBOL_RECORD(lf_ename, value, name)
+#endif
+
+// 16 bit symbol types. Not very useful, provided only for reference.
+CV_SYMBOL(S_COMPILE       , 0x0001)
+CV_SYMBOL(S_REGISTER_16t  , 0x0002)
+CV_SYMBOL(S_CONSTANT_16t  , 0x0003)
+CV_SYMBOL(S_UDT_16t       , 0x0004)
+CV_SYMBOL(S_SSEARCH       , 0x0005)
+CV_SYMBOL(S_SKIP          , 0x0007)
+CV_SYMBOL(S_CVRESERVE     , 0x0008)
+CV_SYMBOL(S_OBJNAME_ST    , 0x0009)
+CV_SYMBOL(S_ENDARG        , 0x000a)
+CV_SYMBOL(S_COBOLUDT_16t  , 0x000b)
+CV_SYMBOL(S_MANYREG_16t   , 0x000c)
+CV_SYMBOL(S_RETURN        , 0x000d)
+CV_SYMBOL(S_ENTRYTHIS     , 0x000e)
+CV_SYMBOL(S_BPREL16       , 0x0100)
+CV_SYMBOL(S_LDATA16       , 0x0101)
+CV_SYMBOL(S_GDATA16       , 0x0102)
+CV_SYMBOL(S_PUB16         , 0x0103)
+CV_SYMBOL(S_LPROC16       , 0x0104)
+CV_SYMBOL(S_GPROC16       , 0x0105)
+CV_SYMBOL(S_THUNK16       , 0x0106)
+CV_SYMBOL(S_BLOCK16       , 0x0107)
+CV_SYMBOL(S_WITH16        , 0x0108)
+CV_SYMBOL(S_LABEL16       , 0x0109)
+CV_SYMBOL(S_CEXMODEL16    , 0x010a)
+CV_SYMBOL(S_VFTABLE16     , 0x010b)
+CV_SYMBOL(S_REGREL16      , 0x010c)
+CV_SYMBOL(S_BPREL32_16t   , 0x0200)
+CV_SYMBOL(S_LDATA32_16t   , 0x0201)
+CV_SYMBOL(S_GDATA32_16t   , 0x0202)
+CV_SYMBOL(S_PUB32_16t     , 0x0203)
+CV_SYMBOL(S_LPROC32_16t   , 0x0204)
+CV_SYMBOL(S_GPROC32_16t   , 0x0205)
+CV_SYMBOL(S_THUNK32_ST    , 0x0206)
+CV_SYMBOL(S_BLOCK32_ST    , 0x0207)
+CV_SYMBOL(S_WITH32_ST     , 0x0208)
+CV_SYMBOL(S_LABEL32_ST    , 0x0209)
+CV_SYMBOL(S_CEXMODEL32    , 0x020a)
+CV_SYMBOL(S_VFTABLE32_16t , 0x020b)
+CV_SYMBOL(S_REGREL32_16t  , 0x020c)
+CV_SYMBOL(S_LTHREAD32_16t , 0x020d)
+CV_SYMBOL(S_GTHREAD32_16t , 0x020e)
+CV_SYMBOL(S_SLINK32       , 0x020f)
+CV_SYMBOL(S_LPROCMIPS_16t , 0x0300)
+CV_SYMBOL(S_GPROCMIPS_16t , 0x0301)
+CV_SYMBOL(S_PROCREF_ST    , 0x0400)
+CV_SYMBOL(S_DATAREF_ST    , 0x0401)
+CV_SYMBOL(S_ALIGN         , 0x0402)
+CV_SYMBOL(S_LPROCREF_ST   , 0x0403)
+CV_SYMBOL(S_OEM           , 0x0404)
+
+// All post 16 bit symbol types have the 0x1000 bit set.
+CV_SYMBOL(S_TI16_MAX      , 0x1000)
+
+// Mostly unused "start" symbol types.
+CV_SYMBOL(S_REGISTER_ST   , 0x1001)
+CV_SYMBOL(S_CONSTANT_ST   , 0x1002)
+CV_SYMBOL(S_UDT_ST        , 0x1003)
+CV_SYMBOL(S_COBOLUDT_ST   , 0x1004)
+CV_SYMBOL(S_MANYREG_ST    , 0x1005)
+CV_SYMBOL(S_BPREL32_ST    , 0x1006)
+CV_SYMBOL(S_LDATA32_ST    , 0x1007)
+CV_SYMBOL(S_GDATA32_ST    , 0x1008)
+CV_SYMBOL(S_PUB32_ST      , 0x1009)
+CV_SYMBOL(S_LPROC32_ST    , 0x100a)
+CV_SYMBOL(S_GPROC32_ST    , 0x100b)
+CV_SYMBOL(S_VFTABLE32     , 0x100c)
+CV_SYMBOL(S_REGREL32_ST   , 0x100d)
+CV_SYMBOL(S_LTHREAD32_ST  , 0x100e)
+CV_SYMBOL(S_GTHREAD32_ST  , 0x100f)
+CV_SYMBOL(S_LPROCMIPS_ST  , 0x1010)
+CV_SYMBOL(S_GPROCMIPS_ST  , 0x1011)
+
+CV_SYMBOL(S_COMPILE2_ST   , 0x1013)
+CV_SYMBOL(S_MANYREG2_ST   , 0x1014)
+CV_SYMBOL(S_LPROCIA64_ST  , 0x1015)
+CV_SYMBOL(S_GPROCIA64_ST  , 0x1016)
+CV_SYMBOL(S_LOCALSLOT_ST  , 0x1017)
+CV_SYMBOL(S_PARAMSLOT_ST  , 0x1018)
+CV_SYMBOL(S_ANNOTATION    , 0x1019)
+CV_SYMBOL(S_GMANPROC_ST   , 0x101a)
+CV_SYMBOL(S_LMANPROC_ST   , 0x101b)
+CV_SYMBOL(S_RESERVED1     , 0x101c)
+CV_SYMBOL(S_RESERVED2     , 0x101d)
+CV_SYMBOL(S_RESERVED3     , 0x101e)
+CV_SYMBOL(S_RESERVED4     , 0x101f)
+CV_SYMBOL(S_LMANDATA_ST   , 0x1020)
+CV_SYMBOL(S_GMANDATA_ST   , 0x1021)
+CV_SYMBOL(S_MANFRAMEREL_ST, 0x1022)
+CV_SYMBOL(S_MANREGISTER_ST, 0x1023)
+CV_SYMBOL(S_MANSLOT_ST    , 0x1024)
+CV_SYMBOL(S_MANMANYREG_ST , 0x1025)
+CV_SYMBOL(S_MANREGREL_ST  , 0x1026)
+CV_SYMBOL(S_MANMANYREG2_ST, 0x1027)
+CV_SYMBOL(S_MANTYPREF     , 0x1028)
+CV_SYMBOL(S_UNAMESPACE_ST , 0x1029)
+
+// End of S_*_ST symbols, which do not appear to be generated by modern
+// compilers.
+CV_SYMBOL(S_ST_MAX        , 0x1100)
+
+
+CV_SYMBOL(S_WITH32        , 0x1104)
+CV_SYMBOL(S_MANYREG       , 0x110a)
+CV_SYMBOL(S_LPROCMIPS     , 0x1114)
+CV_SYMBOL(S_GPROCMIPS     , 0x1115)
+CV_SYMBOL(S_MANYREG2      , 0x1117)
+CV_SYMBOL(S_LPROCIA64     , 0x1118)
+CV_SYMBOL(S_GPROCIA64     , 0x1119)
+CV_SYMBOL(S_LOCALSLOT     , 0x111a)
+CV_SYMBOL(S_PARAMSLOT     , 0x111b)
+
+// Managed code symbols.
+CV_SYMBOL(S_MANFRAMEREL   , 0x111e)
+CV_SYMBOL(S_MANREGISTER   , 0x111f)
+CV_SYMBOL(S_MANSLOT       , 0x1120)
+CV_SYMBOL(S_MANMANYREG    , 0x1121)
+CV_SYMBOL(S_MANREGREL     , 0x1122)
+CV_SYMBOL(S_MANMANYREG2   , 0x1123)
+CV_SYMBOL(S_UNAMESPACE    , 0x1124)
+CV_SYMBOL(S_DATAREF       , 0x1126)
+CV_SYMBOL(S_ANNOTATIONREF , 0x1128)
+CV_SYMBOL(S_TOKENREF      , 0x1129)
+CV_SYMBOL(S_GMANPROC      , 0x112a)
+CV_SYMBOL(S_LMANPROC      , 0x112b)
+CV_SYMBOL(S_ATTR_FRAMEREL , 0x112e)
+CV_SYMBOL(S_ATTR_REGISTER , 0x112f)
+CV_SYMBOL(S_ATTR_REGREL   , 0x1130)
+CV_SYMBOL(S_ATTR_MANYREG  , 0x1131)
+
+
+CV_SYMBOL(S_SEPCODE       , 0x1132)
+CV_SYMBOL(S_LOCAL_2005    , 0x1133)
+CV_SYMBOL(S_DEFRANGE_2005 , 0x1134)
+CV_SYMBOL(S_DEFRANGE2_2005, 0x1135)
+CV_SYMBOL(S_DISCARDED     , 0x113b)
+
+// Current symbol types for most procedures as of this writing.
+CV_SYMBOL(S_LPROCMIPS_ID   , 0x1148)
+CV_SYMBOL(S_GPROCMIPS_ID   , 0x1149)
+CV_SYMBOL(S_LPROCIA64_ID   , 0x114a)
+CV_SYMBOL(S_GPROCIA64_ID   , 0x114b)
+
+CV_SYMBOL(S_DEFRANGE_HLSL  , 0x1150)
+CV_SYMBOL(S_GDATA_HLSL     , 0x1151)
+CV_SYMBOL(S_LDATA_HLSL     , 0x1152)
+CV_SYMBOL(S_LOCAL_DPC_GROUPSHARED, 0x1154)
+CV_SYMBOL(S_DEFRANGE_DPC_PTR_TAG, 0x1157)
+CV_SYMBOL(S_DPC_SYM_TAG_MAP, 0x1158)
+CV_SYMBOL(S_ARMSWITCHTABLE , 0x1159)
+CV_SYMBOL(S_POGODATA       , 0x115c)
+CV_SYMBOL(S_INLINESITE2    , 0x115d)
+CV_SYMBOL(S_MOD_TYPEREF    , 0x115f)
+CV_SYMBOL(S_REF_MINIPDB    , 0x1160)
+CV_SYMBOL(S_PDBMAP         , 0x1161)
+CV_SYMBOL(S_GDATA_HLSL32   , 0x1162)
+CV_SYMBOL(S_LDATA_HLSL32   , 0x1163)
+CV_SYMBOL(S_GDATA_HLSL32_EX, 0x1164)
+CV_SYMBOL(S_LDATA_HLSL32_EX, 0x1165)
+
+// Known symbol types
+SYMBOL_RECORD(S_END                  , 0x0006, ScopeEndSym)
+SYMBOL_RECORD_ALIAS(S_INLINESITE_END , 0x114e, InlineSiteEnd, ScopeEndSym)
+SYMBOL_RECORD_ALIAS(S_PROC_ID_END    , 0x114f, ProcEnd, ScopeEndSym)
+
+SYMBOL_RECORD(S_THUNK32       , 0x1102, Thunk32Sym)
+SYMBOL_RECORD(S_TRAMPOLINE    , 0x112c, TrampolineSym)
+SYMBOL_RECORD(S_SECTION       , 0x1136, SectionSym)
+SYMBOL_RECORD(S_COFFGROUP     , 0x1137, CoffGroupSym)
+SYMBOL_RECORD(S_EXPORT        , 0x1138, ExportSym)
+
+SYMBOL_RECORD(S_LPROC32       , 0x110f, ProcSym)
+SYMBOL_RECORD_ALIAS(S_GPROC32       , 0x1110, GlobalProcSym, ProcSym)
+SYMBOL_RECORD_ALIAS(S_LPROC32_ID     , 0x1146, ProcIdSym, ProcSym)
+SYMBOL_RECORD_ALIAS(S_GPROC32_ID     , 0x1147, GlobalProcIdSym, ProcSym)
+SYMBOL_RECORD_ALIAS(S_LPROC32_DPC    , 0x1155, DPCProcSym, ProcSym)
+SYMBOL_RECORD_ALIAS(S_LPROC32_DPC_ID , 0x1156, DPCProcIdSym, ProcSym)
+
+SYMBOL_RECORD(S_REGISTER      , 0x1106, RegisterSym)
+SYMBOL_RECORD(S_PUB32         , 0x110e, PublicSym32)
+
+SYMBOL_RECORD(S_PROCREF       , 0x1125, ProcRefSym)
+SYMBOL_RECORD_ALIAS(S_LPROCREF, 0x1127, LocalProcRef, ProcRefSym)
+
+
+SYMBOL_RECORD(S_ENVBLOCK      , 0x113d, EnvBlockSym)
+
+SYMBOL_RECORD(S_INLINESITE     , 0x114d, InlineSiteSym)
+SYMBOL_RECORD(S_LOCAL         , 0x113e, LocalSym)
+SYMBOL_RECORD(S_DEFRANGE      , 0x113f, DefRangeSym)
+SYMBOL_RECORD(S_DEFRANGE_SUBFIELD, 0x1140, DefRangeSubfieldSym)
+SYMBOL_RECORD(S_DEFRANGE_REGISTER, 0x1141, DefRangeRegisterSym)
+SYMBOL_RECORD(S_DEFRANGE_FRAMEPOINTER_REL, 0x1142, DefRangeFramePointerRelSym)
+SYMBOL_RECORD(S_DEFRANGE_SUBFIELD_REGISTER, 0x1143, DefRangeSubfieldRegisterSym)
+SYMBOL_RECORD(S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE, 0x1144, DefRangeFramePointerRelFullScopeSym)
+SYMBOL_RECORD(S_DEFRANGE_REGISTER_REL, 0x1145, DefRangeRegisterRelSym)
+SYMBOL_RECORD(S_BLOCK32       , 0x1103, BlockSym)
+SYMBOL_RECORD(S_LABEL32       , 0x1105, LabelSym)
+SYMBOL_RECORD(S_OBJNAME       , 0x1101, ObjNameSym)
+SYMBOL_RECORD(S_COMPILE2      , 0x1116, Compile2Sym)
+SYMBOL_RECORD(S_COMPILE3      , 0x113c, Compile3Sym)
+SYMBOL_RECORD(S_FRAMEPROC     , 0x1012, FrameProcSym)
+SYMBOL_RECORD(S_CALLSITEINFO  , 0x1139, CallSiteInfoSym)
+SYMBOL_RECORD(S_FILESTATIC     , 0x1153, FileStaticSym)
+SYMBOL_RECORD(S_HEAPALLOCSITE  , 0x115e, HeapAllocationSiteSym)
+SYMBOL_RECORD(S_FRAMECOOKIE   , 0x113a, FrameCookieSym)
+
+SYMBOL_RECORD(S_CALLEES        , 0x115a, CallerSym)
+SYMBOL_RECORD_ALIAS(S_CALLERS        , 0x115b, CalleeSym, CallerSym)
+
+SYMBOL_RECORD(S_UDT           , 0x1108, UDTSym)
+SYMBOL_RECORD_ALIAS(S_COBOLUDT      , 0x1109, CobolUDT, UDTSym)
+
+SYMBOL_RECORD(S_BUILDINFO      , 0x114c, BuildInfoSym)
+SYMBOL_RECORD(S_BPREL32       , 0x110b, BPRelativeSym)
+SYMBOL_RECORD(S_REGREL32      , 0x1111, RegRelativeSym)
+
+SYMBOL_RECORD(S_CONSTANT      , 0x1107, ConstantSym)
+SYMBOL_RECORD_ALIAS(S_MANCONSTANT   , 0x112d, ManagedConstant, ConstantSym)
+
+SYMBOL_RECORD(S_LDATA32       , 0x110c, DataSym)
+SYMBOL_RECORD_ALIAS(S_GDATA32       , 0x110d, GlobalData, DataSym)
+SYMBOL_RECORD_ALIAS(S_LMANDATA      , 0x111c, ManagedLocalData, DataSym)
+SYMBOL_RECORD_ALIAS(S_GMANDATA      , 0x111d, ManagedGlobalData, DataSym)
+
+SYMBOL_RECORD(S_LTHREAD32     , 0x1112, ThreadLocalDataSym)
+SYMBOL_RECORD_ALIAS(S_GTHREAD32     , 0x1113, GlobalTLS, ThreadLocalDataSym)
+
+
+#undef CV_SYMBOL
+#undef SYMBOL_RECORD
+#undef SYMBOL_RECORD_ALIAS

Added: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewTypes.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewTypes.def?rev=304248&view=auto
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewTypes.def (added)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewTypes.def Tue May 30 16:53:05 2017
@@ -0,0 +1,251 @@
+
+//===-- 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.
+//
+//===----------------------------------------------------------------------===//
+
+// If the type is known, then we have a record describing it in TypeRecord.h.
+
+#ifndef CV_TYPE
+#define CV_TYPE(lf_ename, value)
+#endif
+
+// If the type is known, then we have a record describing it in TypeRecord.h.
+#ifndef TYPE_RECORD
+#define TYPE_RECORD(lf_ename, value, name) CV_TYPE(lf_ename, value)
+#endif
+
+#ifndef TYPE_RECORD_ALIAS
+#define TYPE_RECORD_ALIAS(lf_ename, value, name, alias_name)                   \
+  TYPE_RECORD(lf_ename, value, name)
+#endif
+
+#ifndef MEMBER_RECORD
+#define MEMBER_RECORD(lf_ename, value, name) TYPE_RECORD(lf_ename, value, name)
+#endif
+
+#ifndef MEMBER_RECORD_ALIAS
+#define MEMBER_RECORD_ALIAS(lf_ename, value, name, alias_name)                 \
+  MEMBER_RECORD(lf_ename, value, name)
+#endif
+
+TYPE_RECORD(LF_POINTER, 0x1002, Pointer)
+TYPE_RECORD(LF_MODIFIER, 0x1001, Modifier)
+TYPE_RECORD(LF_PROCEDURE, 0x1008, Procedure)
+TYPE_RECORD(LF_MFUNCTION, 0x1009, MemberFunction)
+TYPE_RECORD(LF_LABEL, 0x000e, Label)
+TYPE_RECORD(LF_ARGLIST, 0x1201, ArgList)
+
+TYPE_RECORD(LF_FIELDLIST, 0x1203, FieldList)
+
+TYPE_RECORD(LF_ARRAY, 0x1503, Array)
+TYPE_RECORD(LF_CLASS, 0x1504, Class)
+TYPE_RECORD_ALIAS(LF_STRUCTURE, 0x1505, Struct, Class)
+TYPE_RECORD_ALIAS(LF_INTERFACE, 0x1519, Interface, Class)
+TYPE_RECORD(LF_UNION, 0x1506, Union)
+TYPE_RECORD(LF_ENUM, 0x1507, Enum)
+TYPE_RECORD(LF_TYPESERVER2, 0x1515, TypeServer2)
+TYPE_RECORD(LF_VFTABLE, 0x151d, VFTable)
+TYPE_RECORD(LF_VTSHAPE, 0x000a, VFTableShape)
+
+TYPE_RECORD(LF_BITFIELD, 0x1205, BitField)
+
+// Member type records. These are generally not length prefixed, and appear
+// inside of a field list record.
+MEMBER_RECORD(LF_BCLASS, 0x1400, BaseClass)
+MEMBER_RECORD_ALIAS(LF_BINTERFACE, 0x151a, BaseInterface, BaseClass)
+
+MEMBER_RECORD(LF_VBCLASS, 0x1401, VirtualBaseClass)
+MEMBER_RECORD_ALIAS(LF_IVBCLASS, 0x1402, IndirectVirtualBaseClass,
+                    VirtualBaseClass)
+
+MEMBER_RECORD(LF_VFUNCTAB, 0x1409, VFPtr)
+MEMBER_RECORD(LF_STMEMBER, 0x150e, StaticDataMember)
+MEMBER_RECORD(LF_METHOD, 0x150f, OverloadedMethod)
+MEMBER_RECORD(LF_MEMBER, 0x150d, DataMember)
+MEMBER_RECORD(LF_NESTTYPE, 0x1510, NestedType)
+MEMBER_RECORD(LF_ONEMETHOD, 0x1511, OneMethod)
+MEMBER_RECORD(LF_ENUMERATE, 0x1502, Enumerator)
+MEMBER_RECORD(LF_INDEX, 0x1404, ListContinuation)
+
+// ID leaf records. Subsequent leaf types may be referenced from .debug$S.
+TYPE_RECORD(LF_FUNC_ID, 0x1601, FuncId)
+TYPE_RECORD(LF_MFUNC_ID, 0x1602, MemberFuncId)
+TYPE_RECORD(LF_BUILDINFO, 0x1603, BuildInfo)
+TYPE_RECORD(LF_SUBSTR_LIST, 0x1604, StringList)
+TYPE_RECORD(LF_STRING_ID, 0x1605, StringId)
+TYPE_RECORD(LF_UDT_SRC_LINE, 0x1606, UdtSourceLine)
+TYPE_RECORD(LF_UDT_MOD_SRC_LINE, 0x1607, UdtModSourceLine)
+
+
+TYPE_RECORD(LF_METHODLIST, 0x1206, MethodOverloadList)
+
+
+// 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_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_DERIVED, 0x1204)
+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.
+CV_TYPE(LF_FRIENDFCN_ST, 0x1403)
+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.
+
+// 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
+#undef MEMBER_RECORD_ALIAS

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h Tue May 30 16:53:05 2017
@@ -54,7 +54,7 @@ public:
     return visitKnownRecordImpl(CVR, Record);                                  \
   }
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 
 private:
   template <typename T> Error visitKnownRecordImpl(CVSymbol &CVR, T &Record) {

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolRecordMapping.h Tue May 30 16:53:05 2017
@@ -29,7 +29,7 @@ public:
 #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
   Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 
 private:
   Optional<SymbolKind> Kind;

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolSerializer.h Tue May 30 16:53:05 2017
@@ -55,7 +55,7 @@ public:
     return visitKnownRecordImpl(CVR, Record);                                  \
   }
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 
 private:
   template <typename RecordKind>

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h Tue May 30 16:53:05 2017
@@ -59,7 +59,7 @@ public:
     return Error::success();                                                   \
   }
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 
 private:
   std::vector<SymbolVisitorCallbacks *> Pipeline;

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h Tue May 30 16:53:05 2017
@@ -39,7 +39,7 @@ public:
     return Error::success();                                                   \
   }
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 };
 
 } // end namespace codeview

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h Tue May 30 16:53:05 2017
@@ -39,7 +39,7 @@ public:
   Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override;
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   StringRef getTypeName(TypeIndex Index) const;

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=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDeserializer.h Tue May 30 16:53:05 2017
@@ -41,6 +41,7 @@ public:
   TypeDeserializer() = default;
 
   template <typename T> static Error deserializeAs(CVType &CVT, T &Record) {
+    Record.Kind = static_cast<TypeRecordKind>(CVT.kind());
     MappingInfo I(CVT.content());
     if (auto EC = I.Mapping.visitTypeBegin(CVT))
       return EC;
@@ -75,7 +76,7 @@ public:
 #define MEMBER_RECORD(EnumName, EnumVal, Name)
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   template <typename RecordType>
@@ -127,7 +128,7 @@ public:
   }
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   template <typename RecordType>

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumpVisitor.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumpVisitor.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumpVisitor.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeDumpVisitor.h Tue May 30 16:53:05 2017
@@ -58,7 +58,7 @@ public:
   Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override;
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   void printMemberAttributes(MemberAttributes Attrs);

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=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h Tue May 30 16:53:05 2017
@@ -123,13 +123,13 @@ protected:
 public:
   TypeRecordKind getKind() const { return Kind; }
 
-private:
   TypeRecordKind Kind;
 };
 
 // LF_MODIFIER
 class ModifierRecord : public TypeRecord {
 public:
+  ModifierRecord() = default;
   explicit ModifierRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   ModifierRecord(TypeIndex ModifiedType, ModifierOptions Modifiers)
       : TypeRecord(TypeRecordKind::Modifier), ModifiedType(ModifiedType),
@@ -145,6 +145,7 @@ public:
 // LF_PROCEDURE
 class ProcedureRecord : public TypeRecord {
 public:
+  ProcedureRecord() = default;
   explicit ProcedureRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   ProcedureRecord(TypeIndex ReturnType, CallingConvention CallConv,
                   FunctionOptions Options, uint16_t ParameterCount,
@@ -169,6 +170,7 @@ public:
 // LF_MFUNCTION
 class MemberFunctionRecord : public TypeRecord {
 public:
+  MemberFunctionRecord() = default;
   explicit MemberFunctionRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
 
   MemberFunctionRecord(TypeIndex ReturnType, TypeIndex ClassType,
@@ -203,6 +205,7 @@ public:
 // LF_LABEL
 class LabelRecord : public TypeRecord {
 public:
+  LabelRecord() = default;
   explicit LabelRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
 
   LabelRecord(LabelType Mode) : TypeRecord(TypeRecordKind::Label), Mode(Mode) {}
@@ -213,6 +216,7 @@ public:
 // LF_MFUNC_ID
 class MemberFuncIdRecord : public TypeRecord {
 public:
+  MemberFuncIdRecord() = default;
   explicit MemberFuncIdRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   MemberFuncIdRecord(TypeIndex ClassType, TypeIndex FunctionType,
                          StringRef Name)
@@ -230,6 +234,7 @@ public:
 // LF_ARGLIST
 class ArgListRecord : public TypeRecord {
 public:
+  ArgListRecord() = default;
   explicit ArgListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
 
   ArgListRecord(TypeRecordKind Kind, ArrayRef<TypeIndex> Indices)
@@ -243,6 +248,7 @@ public:
 // LF_SUBSTR_LIST
 class StringListRecord : public TypeRecord {
 public:
+  StringListRecord() = default;
   explicit StringListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
 
   StringListRecord(TypeRecordKind Kind, ArrayRef<TypeIndex> Indices)
@@ -267,6 +273,7 @@ public:
   static const uint32_t PointerSizeShift = 13;
   static const uint32_t PointerSizeMask = 0xFF;
 
+  PointerRecord() = default;
   explicit PointerRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
 
   PointerRecord(TypeIndex ReferentType, uint32_t Attrs)
@@ -341,6 +348,7 @@ private:
 // LF_NESTTYPE
 class NestedTypeRecord : public TypeRecord {
 public:
+  NestedTypeRecord() = default;
   explicit NestedTypeRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   NestedTypeRecord(TypeIndex Type, StringRef Name)
       : TypeRecord(TypeRecordKind::NestedType), Type(Type), Name(Name) {}
@@ -355,6 +363,7 @@ public:
 // LF_FIELDLIST
 class FieldListRecord : public TypeRecord {
 public:
+  FieldListRecord() = default;
   explicit FieldListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   explicit FieldListRecord(ArrayRef<uint8_t> Data)
       : TypeRecord(TypeRecordKind::FieldList), Data(Data) {}
@@ -365,6 +374,7 @@ public:
 // LF_ARRAY
 class ArrayRecord : public TypeRecord {
 public:
+  ArrayRecord() = default;
   explicit ArrayRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   ArrayRecord(TypeIndex ElementType, TypeIndex IndexType, uint64_t Size,
               StringRef Name)
@@ -384,6 +394,7 @@ public:
 
 class TagRecord : public TypeRecord {
 protected:
+  TagRecord() = default;
   explicit TagRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   TagRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options,
             TypeIndex FieldList, StringRef Name, StringRef UniqueName)
@@ -416,6 +427,7 @@ public:
 // LF_CLASS, LF_STRUCTURE, LF_INTERFACE
 class ClassRecord : public TagRecord {
 public:
+  ClassRecord() = default;
   explicit ClassRecord(TypeRecordKind Kind) : TagRecord(Kind) {}
   ClassRecord(TypeRecordKind Kind, uint16_t MemberCount, ClassOptions Options,
               TypeIndex FieldList, TypeIndex DerivationList,
@@ -447,6 +459,7 @@ public:
 
 // LF_UNION
 struct UnionRecord : public TagRecord {
+  UnionRecord() = default;
   explicit UnionRecord(TypeRecordKind Kind) : TagRecord(Kind) {}
   UnionRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList,
               uint64_t Size, StringRef Name, StringRef UniqueName)
@@ -468,6 +481,7 @@ struct UnionRecord : public TagRecord {
 // LF_ENUM
 class EnumRecord : public TagRecord {
 public:
+  EnumRecord() = default;
   explicit EnumRecord(TypeRecordKind Kind) : TagRecord(Kind) {}
   EnumRecord(uint16_t MemberCount, ClassOptions Options, TypeIndex FieldList,
              StringRef Name, StringRef UniqueName, TypeIndex UnderlyingType)
@@ -482,6 +496,7 @@ public:
 // LF_BITFIELD
 class BitFieldRecord : public TypeRecord {
 public:
+  BitFieldRecord() = default;
   explicit BitFieldRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   BitFieldRecord(TypeIndex Type, uint8_t BitSize, uint8_t BitOffset)
       : TypeRecord(TypeRecordKind::BitField), Type(Type), BitSize(BitSize),
@@ -498,6 +513,7 @@ public:
 // LF_VTSHAPE
 class VFTableShapeRecord : public TypeRecord {
 public:
+  VFTableShapeRecord() = default;
   explicit VFTableShapeRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   explicit VFTableShapeRecord(ArrayRef<VFTableSlotKind> Slots)
       : TypeRecord(TypeRecordKind::VFTableShape), SlotsRef(Slots) {}
@@ -518,6 +534,7 @@ public:
 // LF_TYPESERVER2
 class TypeServer2Record : public TypeRecord {
 public:
+  TypeServer2Record() = default;
   explicit TypeServer2Record(TypeRecordKind Kind) : TypeRecord(Kind) {}
   TypeServer2Record(StringRef Guid, uint32_t Age, StringRef Name)
       : TypeRecord(TypeRecordKind::TypeServer2), Guid(Guid), Age(Age),
@@ -537,6 +554,7 @@ public:
 // LF_STRING_ID
 class StringIdRecord : public TypeRecord {
 public:
+  StringIdRecord() = default;
   explicit StringIdRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   StringIdRecord(TypeIndex Id, StringRef String)
       : TypeRecord(TypeRecordKind::StringId), Id(Id), String(String) {}
@@ -551,6 +569,7 @@ public:
 // LF_FUNC_ID
 class FuncIdRecord : public TypeRecord {
 public:
+  FuncIdRecord() = default;
   explicit FuncIdRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   FuncIdRecord(TypeIndex ParentScope, TypeIndex FunctionType, StringRef Name)
       : TypeRecord(TypeRecordKind::FuncId), ParentScope(ParentScope),
@@ -570,6 +589,7 @@ public:
 // LF_UDT_SRC_LINE
 class UdtSourceLineRecord : public TypeRecord {
 public:
+  UdtSourceLineRecord() = default;
   explicit UdtSourceLineRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   UdtSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile, uint32_t LineNumber)
       : TypeRecord(TypeRecordKind::UdtSourceLine), UDT(UDT),
@@ -587,6 +607,7 @@ public:
 // LF_UDT_MOD_SRC_LINE
 class UdtModSourceLineRecord : public TypeRecord {
 public:
+  UdtModSourceLineRecord() = default;
   explicit UdtModSourceLineRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   UdtModSourceLineRecord(TypeIndex UDT, TypeIndex SourceFile,
                          uint32_t LineNumber, uint16_t Module)
@@ -607,6 +628,7 @@ public:
 // LF_BUILDINFO
 class BuildInfoRecord : public TypeRecord {
 public:
+  BuildInfoRecord() = default;
   explicit BuildInfoRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   BuildInfoRecord(ArrayRef<TypeIndex> ArgIndices)
       : TypeRecord(TypeRecordKind::BuildInfo),
@@ -619,6 +641,7 @@ public:
 // LF_VFTABLE
 class VFTableRecord : public TypeRecord {
 public:
+  VFTableRecord() = default;
   explicit VFTableRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   VFTableRecord(TypeIndex CompleteClass, TypeIndex OverriddenVFTable,
                 uint32_t VFPtrOffset, StringRef Name,
@@ -646,7 +669,7 @@ public:
 // LF_ONEMETHOD
 class OneMethodRecord : public TypeRecord {
 public:
-  OneMethodRecord() : TypeRecord(TypeRecordKind::OneMethod) {}
+  OneMethodRecord() = default;
   explicit OneMethodRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   OneMethodRecord(TypeIndex Type, MemberAttributes Attrs, int32_t VFTableOffset,
                   StringRef Name)
@@ -678,6 +701,7 @@ public:
 // LF_METHODLIST
 class MethodOverloadListRecord : public TypeRecord {
 public:
+  MethodOverloadListRecord() = default;
   explicit MethodOverloadListRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   MethodOverloadListRecord(ArrayRef<OneMethodRecord> Methods)
       : TypeRecord(TypeRecordKind::MethodOverloadList), Methods(Methods) {}
@@ -689,6 +713,7 @@ public:
 /// For method overload sets.  LF_METHOD
 class OverloadedMethodRecord : public TypeRecord {
 public:
+  OverloadedMethodRecord() = default;
   explicit OverloadedMethodRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   OverloadedMethodRecord(uint16_t NumOverloads, TypeIndex MethodList,
                          StringRef Name)
@@ -706,6 +731,7 @@ public:
 // LF_MEMBER
 class DataMemberRecord : public TypeRecord {
 public:
+  DataMemberRecord() = default;
   explicit DataMemberRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   DataMemberRecord(MemberAttributes Attrs, TypeIndex Type, uint64_t Offset,
                    StringRef Name)
@@ -730,6 +756,7 @@ public:
 // LF_STMEMBER
 class StaticDataMemberRecord : public TypeRecord {
 public:
+  StaticDataMemberRecord() = default;
   explicit StaticDataMemberRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   StaticDataMemberRecord(MemberAttributes Attrs, TypeIndex Type, StringRef Name)
       : TypeRecord(TypeRecordKind::StaticDataMember), Attrs(Attrs), Type(Type),
@@ -750,6 +777,7 @@ public:
 // LF_ENUMERATE
 class EnumeratorRecord : public TypeRecord {
 public:
+  EnumeratorRecord() = default;
   explicit EnumeratorRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   EnumeratorRecord(MemberAttributes Attrs, APSInt Value, StringRef Name)
       : TypeRecord(TypeRecordKind::Enumerator), Attrs(Attrs),
@@ -770,6 +798,7 @@ public:
 // LF_VFUNCTAB
 class VFPtrRecord : public TypeRecord {
 public:
+  VFPtrRecord() = default;
   explicit VFPtrRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   VFPtrRecord(TypeIndex Type)
       : TypeRecord(TypeRecordKind::VFPtr), Type(Type) {}
@@ -782,6 +811,7 @@ public:
 // LF_BCLASS, LF_BINTERFACE
 class BaseClassRecord : public TypeRecord {
 public:
+  BaseClassRecord() = default;
   explicit BaseClassRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   BaseClassRecord(MemberAttributes Attrs, TypeIndex Type, uint64_t Offset)
       : TypeRecord(TypeRecordKind::BaseClass), Attrs(Attrs), Type(Type),
@@ -802,6 +832,7 @@ public:
 // LF_VBCLASS, LF_IVBCLASS
 class VirtualBaseClassRecord : public TypeRecord {
 public:
+  VirtualBaseClassRecord() = default;
   explicit VirtualBaseClassRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   VirtualBaseClassRecord(TypeRecordKind Kind, MemberAttributes Attrs,
                          TypeIndex BaseType, TypeIndex VBPtrType,
@@ -831,6 +862,7 @@ public:
 /// together. The first will end in an LF_INDEX record that points to the next.
 class ListContinuationRecord : public TypeRecord {
 public:
+  ListContinuationRecord() = default;
   explicit ListContinuationRecord(TypeRecordKind Kind) : TypeRecord(Kind) {}
   ListContinuationRecord(TypeIndex ContinuationIndex)
       : TypeRecord(TypeRecordKind::ListContinuation),

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h Tue May 30 16:53:05 2017
@@ -37,7 +37,7 @@ public:
   Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override;
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   Optional<TypeLeafKind> TypeKind;

Removed: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def?rev=304247&view=auto
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecords.def (removed)
@@ -1,251 +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.
-//
-//===----------------------------------------------------------------------===//
-
-// If the type is known, then we have a record describing it in TypeRecord.h.
-
-#ifndef CV_TYPE
-#define CV_TYPE(lf_ename, value)
-#endif
-
-// If the type is known, then we have a record describing it in TypeRecord.h.
-#ifndef TYPE_RECORD
-#define TYPE_RECORD(lf_ename, value, name) CV_TYPE(lf_ename, value)
-#endif
-
-#ifndef TYPE_RECORD_ALIAS
-#define TYPE_RECORD_ALIAS(lf_ename, value, name, alias_name)                   \
-  TYPE_RECORD(lf_ename, value, name)
-#endif
-
-#ifndef MEMBER_RECORD
-#define MEMBER_RECORD(lf_ename, value, name) TYPE_RECORD(lf_ename, value, name)
-#endif
-
-#ifndef MEMBER_RECORD_ALIAS
-#define MEMBER_RECORD_ALIAS(lf_ename, value, name, alias_name)                 \
-  MEMBER_RECORD(lf_ename, value, name)
-#endif
-
-TYPE_RECORD(LF_POINTER, 0x1002, Pointer)
-TYPE_RECORD(LF_MODIFIER, 0x1001, Modifier)
-TYPE_RECORD(LF_PROCEDURE, 0x1008, Procedure)
-TYPE_RECORD(LF_MFUNCTION, 0x1009, MemberFunction)
-TYPE_RECORD(LF_LABEL, 0x000e, Label)
-TYPE_RECORD(LF_ARGLIST, 0x1201, ArgList)
-
-TYPE_RECORD(LF_FIELDLIST, 0x1203, FieldList)
-
-TYPE_RECORD(LF_ARRAY, 0x1503, Array)
-TYPE_RECORD(LF_CLASS, 0x1504, Class)
-TYPE_RECORD_ALIAS(LF_STRUCTURE, 0x1505, Struct, Class)
-TYPE_RECORD_ALIAS(LF_INTERFACE, 0x1519, Interface, Class)
-TYPE_RECORD(LF_UNION, 0x1506, Union)
-TYPE_RECORD(LF_ENUM, 0x1507, Enum)
-TYPE_RECORD(LF_TYPESERVER2, 0x1515, TypeServer2)
-TYPE_RECORD(LF_VFTABLE, 0x151d, VFTable)
-TYPE_RECORD(LF_VTSHAPE, 0x000a, VFTableShape)
-
-TYPE_RECORD(LF_BITFIELD, 0x1205, BitField)
-
-// Member type records. These are generally not length prefixed, and appear
-// inside of a field list record.
-MEMBER_RECORD(LF_BCLASS, 0x1400, BaseClass)
-MEMBER_RECORD_ALIAS(LF_BINTERFACE, 0x151a, BaseInterface, BaseClass)
-
-MEMBER_RECORD(LF_VBCLASS, 0x1401, VirtualBaseClass)
-MEMBER_RECORD_ALIAS(LF_IVBCLASS, 0x1402, IndirectVirtualBaseClass,
-                    VirtualBaseClass)
-
-MEMBER_RECORD(LF_VFUNCTAB, 0x1409, VFPtr)
-MEMBER_RECORD(LF_STMEMBER, 0x150e, StaticDataMember)
-MEMBER_RECORD(LF_METHOD, 0x150f, OverloadedMethod)
-MEMBER_RECORD(LF_MEMBER, 0x150d, DataMember)
-MEMBER_RECORD(LF_NESTTYPE, 0x1510, NestedType)
-MEMBER_RECORD(LF_ONEMETHOD, 0x1511, OneMethod)
-MEMBER_RECORD(LF_ENUMERATE, 0x1502, Enumerator)
-MEMBER_RECORD(LF_INDEX, 0x1404, ListContinuation)
-
-// ID leaf records. Subsequent leaf types may be referenced from .debug$S.
-TYPE_RECORD(LF_FUNC_ID, 0x1601, FuncId)
-TYPE_RECORD(LF_MFUNC_ID, 0x1602, MemberFuncId)
-TYPE_RECORD(LF_BUILDINFO, 0x1603, BuildInfo)
-TYPE_RECORD(LF_SUBSTR_LIST, 0x1604, StringList)
-TYPE_RECORD(LF_STRING_ID, 0x1605, StringId)
-TYPE_RECORD(LF_UDT_SRC_LINE, 0x1606, UdtSourceLine)
-TYPE_RECORD(LF_UDT_MOD_SRC_LINE, 0x1607, UdtModSourceLine)
-
-
-TYPE_RECORD(LF_METHODLIST, 0x1206, MethodOverloadList)
-
-
-// 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_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_DERIVED, 0x1204)
-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.
-CV_TYPE(LF_FRIENDFCN_ST, 0x1403)
-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.
-
-// 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
-#undef MEMBER_RECORD_ALIAS

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeSerializer.h Tue May 30 16:53:05 2017
@@ -106,7 +106,7 @@ public:
     return visitKnownMemberImpl<Name##Record>(CVR, Record);                    \
   }
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   template <typename RecordKind>

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeTableBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeTableBuilder.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeTableBuilder.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeTableBuilder.h Tue May 30 16:53:05 2017
@@ -13,8 +13,8 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/DebugInfo/CodeView/TypeSerializer.h"
 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/CodeView/TypeSerializer.h"
 #include "llvm/Support/Allocator.h"
 #include "llvm/Support/Error.h"
 #include <algorithm>

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h Tue May 30 16:53:05 2017
@@ -94,7 +94,7 @@ public:
   }
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   template <typename T> Error visitKnownRecordImpl(CVType &CVR, T &Record) {

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h Tue May 30 16:53:05 2017
@@ -58,7 +58,11 @@ public:
 
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+#undef TYPE_RECORD
+#undef TYPE_RECORD_ALIAS
+#undef MEMBER_RECORD
+#undef MEMBER_RECORD_ALIAS
 };
 
 } // end namespace codeview

Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawConstants.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawConstants.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawConstants.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawConstants.h Tue May 30 16:53:05 2017
@@ -12,7 +12,6 @@
 
 #include "llvm/ADT/BitmaskEnum.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
-
 #include <cstdint>
 
 namespace llvm {

Modified: llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiHashing.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiHashing.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiHashing.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/TpiHashing.h Tue May 30 16:53:05 2017
@@ -38,7 +38,7 @@ public:
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD(EnumName, EnumVal, Name)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 
 private:
   template <typename RecordKind>

Added: llvm/trunk/include/llvm/ObjectYAML/CodeViewYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/CodeViewYAML.h?rev=304248&view=auto
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/CodeViewYAML.h (added)
+++ llvm/trunk/include/llvm/ObjectYAML/CodeViewYAML.h Tue May 30 16:53:05 2017
@@ -0,0 +1,141 @@
+//===- CodeViewYAML.cpp - CodeView YAMLIO implementation ------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines classes for handling the YAML representation of CodeView
+// Debug Info.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_OBJECTYAML_CODEVIEWYAML_H
+#define LLVM_OBJECTYAML_CODEVIEWYAML_H
+
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/CodeView/TypeSerializer.h"
+#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
+#include "llvm/ObjectYAML/YAML.h"
+
+namespace llvm {
+namespace CodeViewYAML {
+
+namespace detail {
+struct MemberRecordBase;
+struct LeafRecordBase;
+}
+
+struct SourceLineEntry {
+  uint32_t Offset;
+  uint32_t LineStart;
+  uint32_t EndDelta;
+  bool IsStatement;
+};
+
+struct SourceColumnEntry {
+  uint16_t StartColumn;
+  uint16_t EndColumn;
+};
+
+struct SourceLineBlock {
+  StringRef FileName;
+  std::vector<SourceLineEntry> Lines;
+  std::vector<SourceColumnEntry> Columns;
+};
+
+struct HexFormattedString {
+  std::vector<uint8_t> Bytes;
+};
+
+struct SourceFileChecksumEntry {
+  StringRef FileName;
+  codeview::FileChecksumKind Kind;
+  HexFormattedString ChecksumBytes;
+};
+
+struct SourceLineInfo {
+  uint32_t RelocOffset;
+  uint32_t RelocSegment;
+  codeview::LineFlags Flags;
+  uint32_t CodeSize;
+
+  std::vector<SourceLineBlock> Blocks;
+};
+
+struct InlineeSite {
+  uint32_t Inlinee;
+  StringRef FileName;
+  uint32_t SourceLineNum;
+  std::vector<StringRef> ExtraFiles;
+};
+
+struct InlineeInfo {
+  bool HasExtraFiles;
+  std::vector<InlineeSite> Sites;
+};
+
+struct SourceFileInfo {
+  std::vector<SourceFileChecksumEntry> FileChecksums;
+  std::vector<SourceLineInfo> LineFragments;
+  std::vector<InlineeInfo> Inlinees;
+};
+
+struct MemberRecord {
+  std::shared_ptr<detail::MemberRecordBase> Member;
+};
+
+struct LeafRecord {
+  std::shared_ptr<detail::LeafRecordBase> Leaf;
+
+  codeview::CVType toCodeViewRecord(BumpPtrAllocator &Allocator) const;
+  static Expected<LeafRecord> fromCodeViewRecord(codeview::CVType Type);
+};
+
+} // namespace CodeViewYAML
+} // namespace llvm
+
+LLVM_YAML_DECLARE_SCALAR_TRAITS(codeview::TypeIndex, false)
+LLVM_YAML_DECLARE_SCALAR_TRAITS(CodeViewYAML::HexFormattedString, false)
+LLVM_YAML_DECLARE_SCALAR_TRAITS(APSInt, false)
+
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineEntry)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceColumnEntry)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceFileChecksumEntry)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineInfo)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineBlock)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceFileInfo)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::InlineeInfo)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::InlineeSite)
+
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::LeafRecord)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::MemberRecord)
+
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::TypeLeafKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::PointerToMemberRepresentation)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::VFTableSlotKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::CallingConvention)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::PointerKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::PointerMode)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::HfaKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::MemberAccess)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::MethodKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::WindowsRTClassKind)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::LabelType)
+LLVM_YAML_DECLARE_ENUM_TRAITS(codeview::FileChecksumKind)
+
+LLVM_YAML_DECLARE_BITSET_TRAITS(codeview::PointerOptions)
+LLVM_YAML_DECLARE_BITSET_TRAITS(codeview::LineFlags)
+LLVM_YAML_DECLARE_BITSET_TRAITS(codeview::ModifierOptions)
+LLVM_YAML_DECLARE_BITSET_TRAITS(codeview::FunctionOptions)
+LLVM_YAML_DECLARE_BITSET_TRAITS(codeview::ClassOptions)
+LLVM_YAML_DECLARE_BITSET_TRAITS(codeview::MethodOptions)
+
+LLVM_YAML_IS_SEQUENCE_VECTOR(CodeViewYAML::LeafRecord)
+LLVM_YAML_IS_SEQUENCE_VECTOR(CodeViewYAML::MemberRecord)
+
+#endif

Modified: llvm/trunk/include/llvm/Support/YAMLTraits.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLTraits.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/YAMLTraits.h (original)
+++ llvm/trunk/include/llvm/Support/YAMLTraits.h Tue May 30 16:53:05 2017
@@ -1606,6 +1606,44 @@ template <typename T> struct StdMapStrin
   }                                                                            \
   }
 
+#define LLVM_YAML_DECLARE_MAPPING_TRAITS(Type)                                 \
+  namespace llvm {                                                             \
+  namespace yaml {                                                             \
+  template <> struct MappingTraits<Type> {                                     \
+    static void mapping(IO &IO, Type &Obj);                                    \
+  };                                                                           \
+  }                                                                            \
+  }
+
+#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type)                                    \
+  namespace llvm {                                                             \
+  namespace yaml {                                                             \
+  template <> struct ScalarEnumerationTraits<Type> {                           \
+    static void enumeration(IO &io, Type &Value);                              \
+  };                                                                           \
+  }                                                                            \
+  }
+
+#define LLVM_YAML_DECLARE_BITSET_TRAITS(Type)                                  \
+  namespace llvm {                                                             \
+  namespace yaml {                                                             \
+  template <> struct ScalarBitSetTraits<Type> {                                \
+    static void bitset(IO &IO, Type &Options);                                 \
+  };                                                                           \
+  }                                                                            \
+  }
+
+#define LLVM_YAML_DECLARE_SCALAR_TRAITS(Type, MustQuote)                       \
+  namespace llvm {                                                             \
+  namespace yaml {                                                             \
+  template <> struct ScalarTraits<Type> {                                      \
+    static void output(const Type &Value, void *ctx, llvm::raw_ostream &Out);  \
+    static StringRef input(StringRef Scalar, void *ctxt, Type &Value);         \
+    static bool mustQuote(StringRef) { return MustQuote; }                     \
+  };                                                                           \
+  }                                                                            \
+  }
+
 /// Utility for declaring that a std::vector of a particular type
 /// should be considered a YAML document list.
 #define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type)                               \

Modified: llvm/trunk/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp Tue May 30 16:53:05 2017
@@ -46,7 +46,7 @@ Error CVSymbolVisitor::visitSymbolRecord
   }
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)                \
   SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
-#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
   }
 
   if (auto EC = Callbacks.visitSymbolEnd(Record))

Modified: llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/CVTypeVisitor.cpp Tue May 30 16:53:05 2017
@@ -71,7 +71,7 @@ static Error visitMemberRecord(CVMemberR
   MEMBER_RECORD(EnumVal, EnumVal, AliasName)
 #define TYPE_RECORD(EnumName, EnumVal, Name)
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
   }
 
   if (auto EC = Callbacks.visitMemberEnd(Record))
@@ -155,7 +155,7 @@ Error CVTypeVisitor::finishVisitation(CV
   TYPE_RECORD(EnumVal, EnumVal, AliasName)
 #define MEMBER_RECORD(EnumName, EnumVal, Name)
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
   }
 
   if (auto EC = Callbacks.visitTypeEnd(Record))

Modified: llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/EnumTables.cpp Tue May 30 16:53:05 2017
@@ -20,13 +20,13 @@ using namespace codeview;
 
 static const EnumEntry<SymbolKind> SymbolTypeNames[] = {
 #define CV_SYMBOL(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 #undef CV_SYMBOL
 };
 
 static const EnumEntry<TypeLeafKind> TypeLeafNames[] = {
 #define CV_TYPE(name, val) {#name, name},
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 #undef CV_TYPE
 };
 

Modified: llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/SymbolDumper.cpp Tue May 30 16:53:05 2017
@@ -41,7 +41,7 @@ public:
 #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
   Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 
   Error visitSymbolBegin(CVSymbol &Record) override;
   Error visitSymbolEnd(CVSymbol &Record) override;

Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp Tue May 30 16:53:05 2017
@@ -26,7 +26,7 @@ using namespace llvm::codeview;
 
 static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
 #define CV_TYPE(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 };
 
 #define ENUM_ENTRY(enum_class, enum)                                           \
@@ -155,7 +155,7 @@ static StringRef getLeafTypeName(TypeLea
 #define TYPE_RECORD(ename, value, name)                                        \
   case ename:                                                                  \
     return #name;
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
   default:
     break;
   }

Modified: llvm/trunk/lib/MC/MCCodeView.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCCodeView.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCCodeView.cpp (original)
+++ llvm/trunk/lib/MC/MCCodeView.cpp Tue May 30 16:53:05 2017
@@ -12,11 +12,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/MC/MCCodeView.h"
-#include "llvm/MC/MCAsmLayout.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/DebugInfo/CodeView/Line.h"
 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/MC/MCAsmLayout.h"
 #include "llvm/MC/MCContext.h"
 #include "llvm/MC/MCObjectStreamer.h"
 #include "llvm/MC/MCValue.h"

Modified: llvm/trunk/lib/ObjectYAML/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/CMakeLists.txt?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/CMakeLists.txt (original)
+++ llvm/trunk/lib/ObjectYAML/CMakeLists.txt Tue May 30 16:53:05 2017
@@ -1,4 +1,5 @@
 add_llvm_library(LLVMObjectYAML
+  CodeViewYAML.cpp
   COFFYAML.cpp
   DWARFEmitter.cpp
   DWARFVisitor.cpp

Added: llvm/trunk/lib/ObjectYAML/CodeViewYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/CodeViewYAML.cpp?rev=304248&view=auto
==============================================================================
--- llvm/trunk/lib/ObjectYAML/CodeViewYAML.cpp (added)
+++ llvm/trunk/lib/ObjectYAML/CodeViewYAML.cpp Tue May 30 16:53:05 2017
@@ -0,0 +1,759 @@
+//===- CodeViewYAML.cpp - CodeView YAMLIO implementation ------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines classes for handling the YAML representation of CodeView
+// Debug Info.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjectYAML/CodeViewYAML.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::CodeViewYAML;
+using namespace llvm::CodeViewYAML::detail;
+using namespace llvm::yaml;
+
+LLVM_YAML_IS_SEQUENCE_VECTOR(SourceFileChecksumEntry)
+LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineEntry)
+LLVM_YAML_IS_SEQUENCE_VECTOR(SourceColumnEntry)
+LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineBlock)
+LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineInfo)
+LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeSite)
+LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeInfo)
+LLVM_YAML_IS_SEQUENCE_VECTOR(OneMethodRecord)
+LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
+LLVM_YAML_IS_SEQUENCE_VECTOR(uint32_t)
+LLVM_YAML_IS_SEQUENCE_VECTOR(VFTableSlotKind)
+LLVM_YAML_IS_SEQUENCE_VECTOR(TypeIndex)
+
+LLVM_YAML_DECLARE_MAPPING_TRAITS(llvm::codeview::OneMethodRecord)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(llvm::codeview::MemberPointerInfo)
+
+namespace llvm {
+namespace CodeViewYAML {
+namespace detail {
+
+struct LeafRecordBase {
+  TypeLeafKind Kind;
+  explicit LeafRecordBase(TypeLeafKind K) : Kind(K) {}
+
+  virtual ~LeafRecordBase() {}
+  virtual void map(yaml::IO &io) = 0;
+  virtual CVType toCodeViewRecord(BumpPtrAllocator &Allocator) const = 0;
+  virtual Error fromCodeViewRecord(CVType Type) = 0;
+};
+
+template <typename T> struct LeafRecordImpl : public LeafRecordBase {
+  explicit LeafRecordImpl(TypeLeafKind K)
+      : LeafRecordBase(K), Record(static_cast<TypeRecordKind>(K)) {}
+
+  void map(yaml::IO &io) override;
+
+  Error fromCodeViewRecord(CVType Type) override {
+    return TypeDeserializer::deserializeAs<T>(Type, Record);
+  }
+
+  CVType toCodeViewRecord(BumpPtrAllocator &Allocator) const override {
+    TypeTableBuilder Table(Allocator);
+    Table.writeKnownType(Record);
+    return CVType(Kind, Table.records().front());
+  }
+
+  mutable T Record;
+};
+
+template <> struct LeafRecordImpl<FieldListRecord> : public LeafRecordBase {
+  explicit LeafRecordImpl(TypeLeafKind K) : LeafRecordBase(K) {}
+
+  void map(yaml::IO &io) override;
+  CVType toCodeViewRecord(BumpPtrAllocator &Allocator) const override;
+  Error fromCodeViewRecord(CVType Type) override;
+
+  std::vector<MemberRecord> Members;
+};
+
+struct MemberRecordBase {
+  TypeLeafKind Kind;
+  explicit MemberRecordBase(TypeLeafKind K) : Kind(K) {}
+
+  virtual ~MemberRecordBase() {}
+  virtual void map(yaml::IO &io) = 0;
+  virtual void writeTo(FieldListRecordBuilder &FLRB) = 0;
+};
+
+template <typename T> struct MemberRecordImpl : public MemberRecordBase {
+  explicit MemberRecordImpl(TypeLeafKind K)
+      : MemberRecordBase(K), Record(static_cast<TypeRecordKind>(K)) {}
+  void map(yaml::IO &io) override;
+
+  void writeTo(FieldListRecordBuilder &FLRB) override {
+    FLRB.writeMemberType(Record);
+  }
+
+  mutable T Record;
+};
+}
+}
+}
+
+void ScalarTraits<TypeIndex>::output(const TypeIndex &S, void *,
+                                     llvm::raw_ostream &OS) {
+  OS << S.getIndex();
+}
+
+StringRef ScalarTraits<TypeIndex>::input(StringRef Scalar, void *Ctx,
+                                         TypeIndex &S) {
+  uint32_t I;
+  StringRef Result = ScalarTraits<uint32_t>::input(Scalar, Ctx, I);
+  S.setIndex(I);
+  return Result;
+}
+
+void ScalarTraits<APSInt>::output(const APSInt &S, void *,
+                                  llvm::raw_ostream &OS) {
+  S.print(OS, true);
+}
+
+StringRef ScalarTraits<APSInt>::input(StringRef Scalar, void *Ctx, APSInt &S) {
+  S = APSInt(Scalar);
+  return "";
+}
+
+void ScalarEnumerationTraits<TypeLeafKind>::enumeration(IO &io,
+                                                        TypeLeafKind &Value) {
+#define CV_TYPE(name, val) io.enumCase(Value, #name, name);
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+#undef CV_TYPE
+}
+
+void ScalarEnumerationTraits<PointerToMemberRepresentation>::enumeration(
+    IO &IO, PointerToMemberRepresentation &Value) {
+  IO.enumCase(Value, "Unknown", PointerToMemberRepresentation::Unknown);
+  IO.enumCase(Value, "SingleInheritanceData",
+              PointerToMemberRepresentation::SingleInheritanceData);
+  IO.enumCase(Value, "MultipleInheritanceData",
+              PointerToMemberRepresentation::MultipleInheritanceData);
+  IO.enumCase(Value, "VirtualInheritanceData",
+              PointerToMemberRepresentation::VirtualInheritanceData);
+  IO.enumCase(Value, "GeneralData", PointerToMemberRepresentation::GeneralData);
+  IO.enumCase(Value, "SingleInheritanceFunction",
+              PointerToMemberRepresentation::SingleInheritanceFunction);
+  IO.enumCase(Value, "MultipleInheritanceFunction",
+              PointerToMemberRepresentation::MultipleInheritanceFunction);
+  IO.enumCase(Value, "VirtualInheritanceFunction",
+              PointerToMemberRepresentation::VirtualInheritanceFunction);
+  IO.enumCase(Value, "GeneralFunction",
+              PointerToMemberRepresentation::GeneralFunction);
+}
+
+void ScalarEnumerationTraits<VFTableSlotKind>::enumeration(
+    IO &IO, VFTableSlotKind &Kind) {
+  IO.enumCase(Kind, "Near16", VFTableSlotKind::Near16);
+  IO.enumCase(Kind, "Far16", VFTableSlotKind::Far16);
+  IO.enumCase(Kind, "This", VFTableSlotKind::This);
+  IO.enumCase(Kind, "Outer", VFTableSlotKind::Outer);
+  IO.enumCase(Kind, "Meta", VFTableSlotKind::Meta);
+  IO.enumCase(Kind, "Near", VFTableSlotKind::Near);
+  IO.enumCase(Kind, "Far", VFTableSlotKind::Far);
+}
+
+void ScalarEnumerationTraits<CallingConvention>::enumeration(
+    IO &IO, CallingConvention &Value) {
+  IO.enumCase(Value, "NearC", CallingConvention::NearC);
+  IO.enumCase(Value, "FarC", CallingConvention::FarC);
+  IO.enumCase(Value, "NearPascal", CallingConvention::NearPascal);
+  IO.enumCase(Value, "FarPascal", CallingConvention::FarPascal);
+  IO.enumCase(Value, "NearFast", CallingConvention::NearFast);
+  IO.enumCase(Value, "FarFast", CallingConvention::FarFast);
+  IO.enumCase(Value, "NearStdCall", CallingConvention::NearStdCall);
+  IO.enumCase(Value, "FarStdCall", CallingConvention::FarStdCall);
+  IO.enumCase(Value, "NearSysCall", CallingConvention::NearSysCall);
+  IO.enumCase(Value, "FarSysCall", CallingConvention::FarSysCall);
+  IO.enumCase(Value, "ThisCall", CallingConvention::ThisCall);
+  IO.enumCase(Value, "MipsCall", CallingConvention::MipsCall);
+  IO.enumCase(Value, "Generic", CallingConvention::Generic);
+  IO.enumCase(Value, "AlphaCall", CallingConvention::AlphaCall);
+  IO.enumCase(Value, "PpcCall", CallingConvention::PpcCall);
+  IO.enumCase(Value, "SHCall", CallingConvention::SHCall);
+  IO.enumCase(Value, "ArmCall", CallingConvention::ArmCall);
+  IO.enumCase(Value, "AM33Call", CallingConvention::AM33Call);
+  IO.enumCase(Value, "TriCall", CallingConvention::TriCall);
+  IO.enumCase(Value, "SH5Call", CallingConvention::SH5Call);
+  IO.enumCase(Value, "M32RCall", CallingConvention::M32RCall);
+  IO.enumCase(Value, "ClrCall", CallingConvention::ClrCall);
+  IO.enumCase(Value, "Inline", CallingConvention::Inline);
+  IO.enumCase(Value, "NearVector", CallingConvention::NearVector);
+}
+
+void ScalarEnumerationTraits<PointerKind>::enumeration(IO &IO,
+                                                       PointerKind &Kind) {
+  IO.enumCase(Kind, "Near16", PointerKind::Near16);
+  IO.enumCase(Kind, "Far16", PointerKind::Far16);
+  IO.enumCase(Kind, "Huge16", PointerKind::Huge16);
+  IO.enumCase(Kind, "BasedOnSegment", PointerKind::BasedOnSegment);
+  IO.enumCase(Kind, "BasedOnValue", PointerKind::BasedOnValue);
+  IO.enumCase(Kind, "BasedOnSegmentValue", PointerKind::BasedOnSegmentValue);
+  IO.enumCase(Kind, "BasedOnAddress", PointerKind::BasedOnAddress);
+  IO.enumCase(Kind, "BasedOnSegmentAddress",
+              PointerKind::BasedOnSegmentAddress);
+  IO.enumCase(Kind, "BasedOnType", PointerKind::BasedOnType);
+  IO.enumCase(Kind, "BasedOnSelf", PointerKind::BasedOnSelf);
+  IO.enumCase(Kind, "Near32", PointerKind::Near32);
+  IO.enumCase(Kind, "Far32", PointerKind::Far32);
+  IO.enumCase(Kind, "Near64", PointerKind::Near64);
+}
+
+void ScalarEnumerationTraits<PointerMode>::enumeration(IO &IO,
+                                                       PointerMode &Mode) {
+  IO.enumCase(Mode, "Pointer", PointerMode::Pointer);
+  IO.enumCase(Mode, "LValueReference", PointerMode::LValueReference);
+  IO.enumCase(Mode, "PointerToDataMember", PointerMode::PointerToDataMember);
+  IO.enumCase(Mode, "PointerToMemberFunction",
+              PointerMode::PointerToMemberFunction);
+  IO.enumCase(Mode, "RValueReference", PointerMode::RValueReference);
+}
+
+void ScalarEnumerationTraits<HfaKind>::enumeration(IO &IO, HfaKind &Value) {
+  IO.enumCase(Value, "None", HfaKind::None);
+  IO.enumCase(Value, "Float", HfaKind::Float);
+  IO.enumCase(Value, "Double", HfaKind::Double);
+  IO.enumCase(Value, "Other", HfaKind::Other);
+}
+
+void ScalarEnumerationTraits<MemberAccess>::enumeration(IO &IO,
+                                                        MemberAccess &Access) {
+  IO.enumCase(Access, "None", MemberAccess::None);
+  IO.enumCase(Access, "Private", MemberAccess::Private);
+  IO.enumCase(Access, "Protected", MemberAccess::Protected);
+  IO.enumCase(Access, "Public", MemberAccess::Public);
+}
+
+void ScalarEnumerationTraits<MethodKind>::enumeration(IO &IO,
+                                                      MethodKind &Kind) {
+  IO.enumCase(Kind, "Vanilla", MethodKind::Vanilla);
+  IO.enumCase(Kind, "Virtual", MethodKind::Virtual);
+  IO.enumCase(Kind, "Static", MethodKind::Static);
+  IO.enumCase(Kind, "Friend", MethodKind::Friend);
+  IO.enumCase(Kind, "IntroducingVirtual", MethodKind::IntroducingVirtual);
+  IO.enumCase(Kind, "PureVirtual", MethodKind::PureVirtual);
+  IO.enumCase(Kind, "PureIntroducingVirtual",
+              MethodKind::PureIntroducingVirtual);
+}
+
+void ScalarEnumerationTraits<WindowsRTClassKind>::enumeration(
+    IO &IO, WindowsRTClassKind &Value) {
+  IO.enumCase(Value, "None", WindowsRTClassKind::None);
+  IO.enumCase(Value, "Ref", WindowsRTClassKind::RefClass);
+  IO.enumCase(Value, "Value", WindowsRTClassKind::ValueClass);
+  IO.enumCase(Value, "Interface", WindowsRTClassKind::Interface);
+}
+
+void ScalarEnumerationTraits<LabelType>::enumeration(IO &IO, LabelType &Value) {
+  IO.enumCase(Value, "Near", LabelType::Near);
+  IO.enumCase(Value, "Far", LabelType::Far);
+}
+
+void ScalarBitSetTraits<PointerOptions>::bitset(IO &IO,
+                                                PointerOptions &Options) {
+  IO.bitSetCase(Options, "None", PointerOptions::None);
+  IO.bitSetCase(Options, "Flat32", PointerOptions::Flat32);
+  IO.bitSetCase(Options, "Volatile", PointerOptions::Volatile);
+  IO.bitSetCase(Options, "Const", PointerOptions::Const);
+  IO.bitSetCase(Options, "Unaligned", PointerOptions::Unaligned);
+  IO.bitSetCase(Options, "Restrict", PointerOptions::Restrict);
+  IO.bitSetCase(Options, "WinRTSmartPointer",
+                PointerOptions::WinRTSmartPointer);
+}
+
+void ScalarBitSetTraits<ModifierOptions>::bitset(IO &IO,
+                                                 ModifierOptions &Options) {
+  IO.bitSetCase(Options, "None", ModifierOptions::None);
+  IO.bitSetCase(Options, "Const", ModifierOptions::Const);
+  IO.bitSetCase(Options, "Volatile", ModifierOptions::Volatile);
+  IO.bitSetCase(Options, "Unaligned", ModifierOptions::Unaligned);
+}
+
+void ScalarBitSetTraits<FunctionOptions>::bitset(IO &IO,
+                                                 FunctionOptions &Options) {
+  IO.bitSetCase(Options, "None", FunctionOptions::None);
+  IO.bitSetCase(Options, "CxxReturnUdt", FunctionOptions::CxxReturnUdt);
+  IO.bitSetCase(Options, "Constructor", FunctionOptions::Constructor);
+  IO.bitSetCase(Options, "ConstructorWithVirtualBases",
+                FunctionOptions::ConstructorWithVirtualBases);
+}
+
+void ScalarBitSetTraits<ClassOptions>::bitset(IO &IO, ClassOptions &Options) {
+  IO.bitSetCase(Options, "None", ClassOptions::None);
+  IO.bitSetCase(Options, "HasConstructorOrDestructor",
+                ClassOptions::HasConstructorOrDestructor);
+  IO.bitSetCase(Options, "HasOverloadedOperator",
+                ClassOptions::HasOverloadedOperator);
+  IO.bitSetCase(Options, "Nested", ClassOptions::Nested);
+  IO.bitSetCase(Options, "ContainsNestedClass",
+                ClassOptions::ContainsNestedClass);
+  IO.bitSetCase(Options, "HasOverloadedAssignmentOperator",
+                ClassOptions::HasOverloadedAssignmentOperator);
+  IO.bitSetCase(Options, "HasConversionOperator",
+                ClassOptions::HasConversionOperator);
+  IO.bitSetCase(Options, "ForwardReference", ClassOptions::ForwardReference);
+  IO.bitSetCase(Options, "Scoped", ClassOptions::Scoped);
+  IO.bitSetCase(Options, "HasUniqueName", ClassOptions::HasUniqueName);
+  IO.bitSetCase(Options, "Sealed", ClassOptions::Sealed);
+  IO.bitSetCase(Options, "Intrinsic", ClassOptions::Intrinsic);
+}
+
+void ScalarBitSetTraits<MethodOptions>::bitset(IO &IO, MethodOptions &Options) {
+  IO.bitSetCase(Options, "None", MethodOptions::None);
+  IO.bitSetCase(Options, "Pseudo", MethodOptions::Pseudo);
+  IO.bitSetCase(Options, "NoInherit", MethodOptions::NoInherit);
+  IO.bitSetCase(Options, "NoConstruct", MethodOptions::NoConstruct);
+  IO.bitSetCase(Options, "CompilerGenerated", MethodOptions::CompilerGenerated);
+  IO.bitSetCase(Options, "Sealed", MethodOptions::Sealed);
+}
+
+void ScalarEnumerationTraits<FileChecksumKind>::enumeration(
+    IO &io, FileChecksumKind &Kind) {
+  io.enumCase(Kind, "None", FileChecksumKind::None);
+  io.enumCase(Kind, "MD5", FileChecksumKind::MD5);
+  io.enumCase(Kind, "SHA1", FileChecksumKind::SHA1);
+  io.enumCase(Kind, "SHA256", FileChecksumKind::SHA256);
+}
+
+void ScalarBitSetTraits<LineFlags>::bitset(IO &io, LineFlags &Flags) {
+  io.bitSetCase(Flags, "HasColumnInfo", LF_HaveColumns);
+  io.enumFallback<Hex16>(Flags);
+}
+
+void ScalarTraits<HexFormattedString>::output(const HexFormattedString &Value,
+                                              void *ctx, raw_ostream &Out) {
+  StringRef Bytes(reinterpret_cast<const char *>(Value.Bytes.data()),
+                  Value.Bytes.size());
+  Out << toHex(Bytes);
+}
+
+StringRef ScalarTraits<HexFormattedString>::input(StringRef Scalar, void *ctxt,
+                                                  HexFormattedString &Value) {
+  std::string H = fromHex(Scalar);
+  Value.Bytes.assign(H.begin(), H.end());
+  return StringRef();
+}
+
+void MappingTraits<SourceLineEntry>::mapping(IO &IO, SourceLineEntry &Obj) {
+  IO.mapRequired("Offset", Obj.Offset);
+  IO.mapRequired("LineStart", Obj.LineStart);
+  IO.mapRequired("IsStatement", Obj.IsStatement);
+  IO.mapRequired("EndDelta", Obj.EndDelta);
+}
+
+void MappingTraits<SourceColumnEntry>::mapping(IO &IO, SourceColumnEntry &Obj) {
+  IO.mapRequired("StartColumn", Obj.StartColumn);
+  IO.mapRequired("EndColumn", Obj.EndColumn);
+}
+
+void MappingTraits<SourceLineBlock>::mapping(IO &IO, SourceLineBlock &Obj) {
+  IO.mapRequired("FileName", Obj.FileName);
+  IO.mapRequired("Lines", Obj.Lines);
+  IO.mapRequired("Columns", Obj.Columns);
+}
+
+void MappingTraits<SourceFileChecksumEntry>::mapping(
+    IO &IO, SourceFileChecksumEntry &Obj) {
+  IO.mapRequired("FileName", Obj.FileName);
+  IO.mapRequired("Kind", Obj.Kind);
+  IO.mapRequired("Checksum", Obj.ChecksumBytes);
+}
+
+void MappingTraits<SourceLineInfo>::mapping(IO &IO, SourceLineInfo &Obj) {
+  IO.mapRequired("CodeSize", Obj.CodeSize);
+
+  IO.mapRequired("Flags", Obj.Flags);
+  IO.mapRequired("RelocOffset", Obj.RelocOffset);
+  IO.mapRequired("RelocSegment", Obj.RelocSegment);
+  IO.mapRequired("Blocks", Obj.Blocks);
+}
+
+void MappingTraits<SourceFileInfo>::mapping(IO &IO, SourceFileInfo &Obj) {
+  IO.mapOptional("Checksums", Obj.FileChecksums);
+  IO.mapOptional("Lines", Obj.LineFragments);
+  IO.mapOptional("InlineeLines", Obj.Inlinees);
+}
+
+void MappingTraits<InlineeSite>::mapping(IO &IO, InlineeSite &Obj) {
+  IO.mapRequired("FileName", Obj.FileName);
+  IO.mapRequired("LineNum", Obj.SourceLineNum);
+  IO.mapRequired("Inlinee", Obj.Inlinee);
+  IO.mapOptional("ExtraFiles", Obj.ExtraFiles);
+}
+
+void MappingTraits<InlineeInfo>::mapping(IO &IO, InlineeInfo &Obj) {
+  IO.mapRequired("HasExtraFiles", Obj.HasExtraFiles);
+  IO.mapRequired("Sites", Obj.Sites);
+}
+
+void MappingTraits<MemberPointerInfo>::mapping(IO &IO, MemberPointerInfo &MPI) {
+  IO.mapRequired("ContainingType", MPI.ContainingType);
+  IO.mapRequired("Representation", MPI.Representation);
+}
+
+template <> void LeafRecordImpl<ModifierRecord>::map(IO &IO) {
+  IO.mapRequired("ModifiedType", Record.ModifiedType);
+  IO.mapRequired("Modifiers", Record.Modifiers);
+}
+
+template <> void LeafRecordImpl<ProcedureRecord>::map(IO &IO) {
+  IO.mapRequired("ReturnType", Record.ReturnType);
+  IO.mapRequired("CallConv", Record.CallConv);
+  IO.mapRequired("Options", Record.Options);
+  IO.mapRequired("ParameterCount", Record.ParameterCount);
+  IO.mapRequired("ArgumentList", Record.ArgumentList);
+}
+
+template <> void LeafRecordImpl<MemberFunctionRecord>::map(IO &IO) {
+  IO.mapRequired("ReturnType", Record.ReturnType);
+  IO.mapRequired("ClassType", Record.ClassType);
+  IO.mapRequired("ThisType", Record.ThisType);
+  IO.mapRequired("CallConv", Record.CallConv);
+  IO.mapRequired("Options", Record.Options);
+  IO.mapRequired("ParameterCount", Record.ParameterCount);
+  IO.mapRequired("ArgumentList", Record.ArgumentList);
+  IO.mapRequired("ThisPointerAdjustment", Record.ThisPointerAdjustment);
+}
+
+template <> void LeafRecordImpl<LabelRecord>::map(IO &IO) {
+  IO.mapRequired("Mode", Record.Mode);
+}
+
+template <> void LeafRecordImpl<MemberFuncIdRecord>::map(IO &IO) {
+  IO.mapRequired("ClassType", Record.ClassType);
+  IO.mapRequired("FunctionType", Record.FunctionType);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void LeafRecordImpl<ArgListRecord>::map(IO &IO) {
+  IO.mapRequired("ArgIndices", Record.ArgIndices);
+}
+
+template <> void LeafRecordImpl<StringListRecord>::map(IO &IO) {
+  IO.mapRequired("StringIndices", Record.StringIndices);
+}
+
+template <> void LeafRecordImpl<PointerRecord>::map(IO &IO) {
+  IO.mapRequired("ReferentType", Record.ReferentType);
+  IO.mapRequired("Attrs", Record.Attrs);
+  IO.mapOptional("MemberInfo", Record.MemberInfo);
+}
+
+template <> void LeafRecordImpl<ArrayRecord>::map(IO &IO) {
+  IO.mapRequired("ElementType", Record.ElementType);
+  IO.mapRequired("IndexType", Record.IndexType);
+  IO.mapRequired("Size", Record.Size);
+  IO.mapRequired("Name", Record.Name);
+}
+
+void LeafRecordImpl<FieldListRecord>::map(IO &IO) {
+  IO.mapRequired("FieldList", Members);
+}
+
+namespace {
+class MemberRecordConversionVisitor : public TypeVisitorCallbacks {
+public:
+  explicit MemberRecordConversionVisitor(std::vector<MemberRecord> &Records)
+      : Records(Records) {}
+
+#define TYPE_RECORD(EnumName, EnumVal, Name)
+#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
+  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
+    return visitKnownMemberImpl(Record);                                       \
+  }
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+private:
+  template <typename T> Error visitKnownMemberImpl(T &Record) {
+    TypeLeafKind K = static_cast<TypeLeafKind>(Record.getKind());
+    auto Impl = std::make_shared<MemberRecordImpl<T>>(K);
+    Impl->Record = Record;
+    Records.push_back(MemberRecord{Impl});
+    return Error::success();
+  }
+
+  std::vector<MemberRecord> &Records;
+};
+}
+
+Error LeafRecordImpl<FieldListRecord>::fromCodeViewRecord(CVType Type) {
+  MemberRecordConversionVisitor V(Members);
+  return visitMemberRecordStream(Type.content(), V);
+}
+
+CVType LeafRecordImpl<FieldListRecord>::toCodeViewRecord(
+    BumpPtrAllocator &Allocator) const {
+  TypeTableBuilder TTB(Allocator);
+  FieldListRecordBuilder FLRB(TTB);
+  FLRB.begin();
+  for (const auto &Member : Members) {
+    Member.Member->writeTo(FLRB);
+  }
+  FLRB.end(true);
+  return CVType(Kind, TTB.records().front());
+}
+
+template <> void LeafRecordImpl<ClassRecord>::map(IO &IO) {
+  IO.mapRequired("MemberCount", Record.MemberCount);
+  IO.mapRequired("Options", Record.Options);
+  IO.mapRequired("FieldList", Record.FieldList);
+  IO.mapRequired("Name", Record.Name);
+  IO.mapRequired("UniqueName", Record.UniqueName);
+
+  IO.mapRequired("DerivationList", Record.DerivationList);
+  IO.mapRequired("VTableShape", Record.VTableShape);
+  IO.mapRequired("Size", Record.Size);
+}
+
+template <> void LeafRecordImpl<UnionRecord>::map(IO &IO) {
+  IO.mapRequired("MemberCount", Record.MemberCount);
+  IO.mapRequired("Options", Record.Options);
+  IO.mapRequired("FieldList", Record.FieldList);
+  IO.mapRequired("Name", Record.Name);
+  IO.mapRequired("UniqueName", Record.UniqueName);
+
+  IO.mapRequired("Size", Record.Size);
+}
+
+template <> void LeafRecordImpl<EnumRecord>::map(IO &IO) {
+  IO.mapRequired("NumEnumerators", Record.MemberCount);
+  IO.mapRequired("Options", Record.Options);
+  IO.mapRequired("FieldList", Record.FieldList);
+  IO.mapRequired("Name", Record.Name);
+  IO.mapRequired("UniqueName", Record.UniqueName);
+
+  IO.mapRequired("UnderlyingType", Record.UnderlyingType);
+}
+
+template <> void LeafRecordImpl<BitFieldRecord>::map(IO &IO) {
+  IO.mapRequired("Type", Record.Type);
+  IO.mapRequired("BitSize", Record.BitSize);
+  IO.mapRequired("BitOffset", Record.BitOffset);
+}
+
+template <> void LeafRecordImpl<VFTableShapeRecord>::map(IO &IO) {
+  IO.mapRequired("Slots", Record.Slots);
+}
+
+template <> void LeafRecordImpl<TypeServer2Record>::map(IO &IO) {
+  IO.mapRequired("Guid", Record.Guid);
+  IO.mapRequired("Age", Record.Age);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void LeafRecordImpl<StringIdRecord>::map(IO &IO) {
+  IO.mapRequired("Id", Record.Id);
+  IO.mapRequired("String", Record.String);
+}
+
+template <> void LeafRecordImpl<FuncIdRecord>::map(IO &IO) {
+  IO.mapRequired("ParentScope", Record.ParentScope);
+  IO.mapRequired("FunctionType", Record.FunctionType);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void LeafRecordImpl<UdtSourceLineRecord>::map(IO &IO) {
+  IO.mapRequired("UDT", Record.UDT);
+  IO.mapRequired("SourceFile", Record.SourceFile);
+  IO.mapRequired("LineNumber", Record.LineNumber);
+}
+
+template <> void LeafRecordImpl<UdtModSourceLineRecord>::map(IO &IO) {
+  IO.mapRequired("UDT", Record.UDT);
+  IO.mapRequired("SourceFile", Record.SourceFile);
+  IO.mapRequired("LineNumber", Record.LineNumber);
+  IO.mapRequired("Module", Record.Module);
+}
+
+template <> void LeafRecordImpl<BuildInfoRecord>::map(IO &IO) {
+  IO.mapRequired("ArgIndices", Record.ArgIndices);
+}
+
+template <> void LeafRecordImpl<VFTableRecord>::map(IO &IO) {
+  IO.mapRequired("CompleteClass", Record.CompleteClass);
+  IO.mapRequired("OverriddenVFTable", Record.OverriddenVFTable);
+  IO.mapRequired("VFPtrOffset", Record.VFPtrOffset);
+  IO.mapRequired("MethodNames", Record.MethodNames);
+}
+
+template <> void LeafRecordImpl<MethodOverloadListRecord>::map(IO &IO) {
+  IO.mapRequired("Methods", Record.Methods);
+}
+
+void MappingTraits<OneMethodRecord>::mapping(IO &io, OneMethodRecord &Record) {
+  io.mapRequired("Type", Record.Type);
+  io.mapRequired("Attrs", Record.Attrs.Attrs);
+  io.mapRequired("VFTableOffset", Record.VFTableOffset);
+  io.mapRequired("Name", Record.Name);
+}
+
+template <> void MemberRecordImpl<OneMethodRecord>::map(IO &IO) {
+  MappingTraits<OneMethodRecord>::mapping(IO, Record);
+}
+
+template <> void MemberRecordImpl<OverloadedMethodRecord>::map(IO &IO) {
+  IO.mapRequired("NumOverloads", Record.NumOverloads);
+  IO.mapRequired("MethodList", Record.MethodList);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void MemberRecordImpl<NestedTypeRecord>::map(IO &IO) {
+  IO.mapRequired("Type", Record.Type);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void MemberRecordImpl<DataMemberRecord>::map(IO &IO) {
+  IO.mapRequired("Attrs", Record.Attrs.Attrs);
+  IO.mapRequired("Type", Record.Type);
+  IO.mapRequired("FieldOffset", Record.FieldOffset);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void MemberRecordImpl<StaticDataMemberRecord>::map(IO &IO) {
+  IO.mapRequired("Attrs", Record.Attrs.Attrs);
+  IO.mapRequired("Type", Record.Type);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void MemberRecordImpl<EnumeratorRecord>::map(IO &IO) {
+  IO.mapRequired("Attrs", Record.Attrs.Attrs);
+  IO.mapRequired("Value", Record.Value);
+  IO.mapRequired("Name", Record.Name);
+}
+
+template <> void MemberRecordImpl<VFPtrRecord>::map(IO &IO) {
+  IO.mapRequired("Type", Record.Type);
+}
+
+template <> void MemberRecordImpl<BaseClassRecord>::map(IO &IO) {
+  IO.mapRequired("Attrs", Record.Attrs.Attrs);
+  IO.mapRequired("Type", Record.Type);
+  IO.mapRequired("Offset", Record.Offset);
+}
+
+template <> void MemberRecordImpl<VirtualBaseClassRecord>::map(IO &IO) {
+  IO.mapRequired("Attrs", Record.Attrs.Attrs);
+  IO.mapRequired("BaseType", Record.BaseType);
+  IO.mapRequired("VBPtrType", Record.VBPtrType);
+  IO.mapRequired("VBPtrOffset", Record.VBPtrOffset);
+  IO.mapRequired("VTableIndex", Record.VTableIndex);
+}
+
+template <> void MemberRecordImpl<ListContinuationRecord>::map(IO &IO) {
+  IO.mapRequired("ContinuationIndex", Record.ContinuationIndex);
+}
+
+template <typename T>
+static inline Expected<LeafRecord> fromCodeViewRecordImpl(CVType Type) {
+  LeafRecord Result;
+
+  auto Impl = std::make_shared<LeafRecordImpl<T>>(Type.kind());
+  if (auto EC = Impl->fromCodeViewRecord(Type))
+    return std::move(EC);
+  Result.Leaf = Impl;
+  return Result;
+}
+
+Expected<LeafRecord> LeafRecord::fromCodeViewRecord(CVType Type) {
+#define TYPE_RECORD(EnumName, EnumVal, ClassName)                              \
+  case EnumName:                                                               \
+    return fromCodeViewRecordImpl<ClassName##Record>(Type);
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName)             \
+  TYPE_RECORD(EnumName, EnumVal, ClassName)
+#define MEMBER_RECORD(EnumName, EnumVal, ClassName)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName)
+  switch (Type.kind()) {
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+  default: { llvm_unreachable("Unknown leaf kind!"); }
+  }
+  return make_error<CodeViewError>(cv_error_code::corrupt_record);
+}
+
+CVType LeafRecord::toCodeViewRecord(BumpPtrAllocator &Allocator) const {
+  return Leaf->toCodeViewRecord(Allocator);
+}
+
+template <> struct MappingTraits<LeafRecordBase> {
+  static void mapping(IO &io, LeafRecordBase &Record) { Record.map(io); }
+};
+
+template <typename ConcreteType>
+static void mapLeafRecordImpl(IO &IO, const char *Class, TypeLeafKind Kind,
+                              LeafRecord &Obj) {
+  if (!IO.outputting())
+    Obj.Leaf = std::make_shared<LeafRecordImpl<ConcreteType>>(Kind);
+
+  if (Kind == LF_FIELDLIST)
+    Obj.Leaf->map(IO);
+  else
+    IO.mapRequired(Class, *Obj.Leaf);
+}
+
+void MappingTraits<LeafRecord>::mapping(IO &IO, LeafRecord &Obj) {
+  TypeLeafKind Kind;
+  if (IO.outputting())
+    Kind = Obj.Leaf->Kind;
+  IO.mapRequired("Kind", Kind);
+
+#define TYPE_RECORD(EnumName, EnumVal, ClassName)                              \
+  case EnumName:                                                               \
+    mapLeafRecordImpl<ClassName##Record>(IO, #ClassName, Kind, Obj);           \
+    break;
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName)             \
+  TYPE_RECORD(EnumName, EnumVal, ClassName)
+#define MEMBER_RECORD(EnumName, EnumVal, ClassName)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName)
+  switch (Kind) {
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+  default: { llvm_unreachable("Unknown leaf kind!"); }
+  }
+}
+
+template <> struct MappingTraits<MemberRecordBase> {
+  static void mapping(IO &io, MemberRecordBase &Record) { Record.map(io); }
+};
+
+template <typename ConcreteType>
+static void mapMemberRecordImpl(IO &IO, const char *Class, TypeLeafKind Kind,
+                                MemberRecord &Obj) {
+  if (!IO.outputting())
+    Obj.Member = std::make_shared<MemberRecordImpl<ConcreteType>>(Kind);
+
+  IO.mapRequired(Class, *Obj.Member);
+}
+
+void MappingTraits<MemberRecord>::mapping(IO &IO, MemberRecord &Obj) {
+  TypeLeafKind Kind;
+  if (IO.outputting())
+    Kind = Obj.Member->Kind;
+  IO.mapRequired("Kind", Kind);
+
+#define MEMBER_RECORD(EnumName, EnumVal, ClassName)                            \
+  case EnumName:                                                               \
+    mapMemberRecordImpl<ClassName##Record>(IO, #ClassName, Kind, Obj);         \
+    break;
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName)           \
+  MEMBER_RECORD(EnumName, EnumVal, ClassName)
+#define TYPE_RECORD(EnumName, EnumVal, ClassName)
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName)
+  switch (Kind) {
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+  default: { llvm_unreachable("Unknown member kind!"); }
+  }
+}

Modified: llvm/trunk/lib/ObjectYAML/LLVMBuild.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/LLVMBuild.txt?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/LLVMBuild.txt (original)
+++ llvm/trunk/lib/ObjectYAML/LLVMBuild.txt Tue May 30 16:53:05 2017
@@ -11,4 +11,4 @@
 type = Library
 name = ObjectYAML
 parent = Libraries
-required_libraries = Support
+required_libraries = Support DebugInfoCodeView

Modified: llvm/trunk/tools/llvm-pdbdump/Analyze.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/Analyze.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/Analyze.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/Analyze.cpp Tue May 30 16:53:05 2017
@@ -35,7 +35,7 @@ static StringRef getLeafTypeName(TypeLea
 #define TYPE_RECORD(ename, value, name)                                        \
   case ename:                                                                  \
     return #name;
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
   default:
     break;
   }

Modified: llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt Tue May 30 16:53:05 2017
@@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS
   DebugInfoMSF
   DebugInfoPDB
   Object
+  ObjectYAML
   Support
   )
 
@@ -12,8 +13,6 @@ add_llvm_tool(llvm-pdbdump
   CompactTypeDumpVisitor.cpp
   Diff.cpp
   llvm-pdbdump.cpp
-  YamlSymbolDumper.cpp
-  YamlTypeDumper.cpp
   LinePrinter.cpp
   LLVMOutputStyle.cpp
   PdbYaml.cpp
@@ -29,6 +28,7 @@ add_llvm_tool(llvm-pdbdump
   PrettyVariableDumper.cpp
   StreamUtil.cpp
   YAMLOutputStyle.cpp
+  YamlSymbolDumper.cpp
   )
 
 if(LLVM_USE_SANITIZE_COVERAGE)

Modified: llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp Tue May 30 16:53:05 2017
@@ -18,7 +18,7 @@ using namespace llvm::pdb;
 
 static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
 #define CV_TYPE(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
 };
 
 static StringRef getLeafName(TypeLeafKind K) {

Modified: llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp Tue May 30 16:53:05 2017
@@ -9,9 +9,7 @@
 
 #include "PdbYaml.h"
 
-#include "YamlSerializationContext.h"
 #include "YamlSymbolDumper.h"
-#include "YamlTypeDumper.h"
 
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
@@ -22,6 +20,7 @@
 #include "llvm/DebugInfo/CodeView/TypeSerializer.h"
 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
 #include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
 #include "llvm/DebugInfo/PDB/PDBExtras.h"
 #include "llvm/DebugInfo/PDB/PDBTypes.h"
@@ -35,15 +34,7 @@ LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint32
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceFileChecksumEntry)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineEntry)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceColumnEntry)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineBlock)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineInfo)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbInlineeSite)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbInlineeInfo)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSymbolRecord)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbTpiRecord)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList)
 LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::pdb::PdbRaw_FeatureSig)
 
@@ -152,57 +143,18 @@ template <> struct ScalarEnumerationTrai
     io.enumCase(Features, "VC140", PdbRaw_FeatureSig::VC140);
   }
 };
-
-template <> struct ScalarEnumerationTraits<llvm::codeview::FileChecksumKind> {
-  static void enumeration(IO &io, llvm::codeview::FileChecksumKind &Kind) {
-    io.enumCase(Kind, "None", llvm::codeview::FileChecksumKind::None);
-    io.enumCase(Kind, "MD5", llvm::codeview::FileChecksumKind::MD5);
-    io.enumCase(Kind, "SHA1", llvm::codeview::FileChecksumKind::SHA1);
-    io.enumCase(Kind, "SHA256", llvm::codeview::FileChecksumKind::SHA256);
-  }
-};
-
-template <> struct ScalarBitSetTraits<llvm::codeview::LineFlags> {
-  static void bitset(IO &io, llvm::codeview::LineFlags &Flags) {
-    io.bitSetCase(Flags, "HasColumnInfo", llvm::codeview::LF_HaveColumns);
-    io.enumFallback<Hex16>(Flags);
-  }
-};
-}
 }
-
-void ScalarTraits<HexFormattedString>::output(const HexFormattedString &Value,
-                                              void *ctx, raw_ostream &Out) {
-  StringRef Bytes(reinterpret_cast<const char *>(Value.Bytes.data()),
-                  Value.Bytes.size());
-  Out << toHex(Bytes);
-}
-
-StringRef ScalarTraits<HexFormattedString>::input(StringRef Scalar, void *ctxt,
-                                                  HexFormattedString &Value) {
-  std::string H = fromHex(Scalar);
-  Value.Bytes.assign(H.begin(), H.end());
-  return StringRef();
 }
 
 void MappingTraits<PdbObject>::mapping(IO &IO, PdbObject &Obj) {
-  // Create a single serialization context that will be passed through the
-  // entire process of serializing / deserializing a Tpi Stream.  This is
-  // especially important when we are going from Pdb -> Yaml because we need
-  // to maintain state in a TypeTableBuilder across mappings, and at the end of
-  // the entire process, we need to have one TypeTableBuilder that has every
-  // record.
-  pdb::yaml::SerializationContext Context(IO, Obj.Allocator);
-
-
   IO.mapOptional("MSF", Obj.Headers);
   IO.mapOptional("StreamSizes", Obj.StreamSizes);
   IO.mapOptional("StreamMap", Obj.StreamMap);
   IO.mapOptional("StringTable", Obj.StringTable);
   IO.mapOptional("PdbStream", Obj.PdbStream);
-  IO.mapOptionalWithContext("DbiStream", Obj.DbiStream, Context);
-  IO.mapOptionalWithContext("TpiStream", Obj.TpiStream, Context);
-  IO.mapOptionalWithContext("IpiStream", Obj.IpiStream, Context);
+  IO.mapOptional("DbiStream", Obj.DbiStream);
+  IO.mapOptional("TpiStream", Obj.TpiStream);
+  IO.mapOptional("IpiStream", Obj.IpiStream);
 }
 
 void MappingTraits<MSFHeaders>::mapping(IO &IO, MSFHeaders &Obj) {
@@ -239,7 +191,7 @@ void MappingTraits<PdbInfoStream>::mappi
   IO.mapOptional("Version", Obj.Version, PdbImplVC70);
 }
 
-void MappingContextTraits<PdbDbiStream, pdb::yaml::SerializationContext>::mapping(IO &IO, PdbDbiStream &Obj, pdb::yaml::SerializationContext &Context) {
+void MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) {
   IO.mapOptional("VerHeader", Obj.VerHeader, PdbDbiV70);
   IO.mapOptional("Age", Obj.Age, 1U);
   IO.mapOptional("BuildNumber", Obj.BuildNumber, uint16_t(0U));
@@ -247,13 +199,13 @@ void MappingContextTraits<PdbDbiStream,
   IO.mapOptional("PdbDllRbld", Obj.PdbDllRbld, uint16_t(0U));
   IO.mapOptional("Flags", Obj.Flags, uint16_t(1U));
   IO.mapOptional("MachineType", Obj.MachineType, PDB_Machine::x86);
-  IO.mapOptionalWithContext("Modules", Obj.ModInfos, Context);
+  IO.mapOptional("Modules", Obj.ModInfos);
 }
 
-void MappingContextTraits<PdbTpiStream, pdb::yaml::SerializationContext>::mapping(
-    IO &IO, pdb::yaml::PdbTpiStream &Obj, pdb::yaml::SerializationContext &Context) {
+void MappingTraits<PdbTpiStream>::mapping(IO &IO,
+                                          pdb::yaml::PdbTpiStream &Obj) {
   IO.mapOptional("Version", Obj.Version, PdbTpiV80);
-  IO.mapRequired("Records", Obj.Records, Context);
+  IO.mapRequired("Records", Obj.Records);
 }
 
 void MappingTraits<NamedStreamMapping>::mapping(IO &IO,
@@ -262,9 +214,11 @@ void MappingTraits<NamedStreamMapping>::
   IO.mapRequired("StreamNum", Obj.StreamNumber);
 }
 
-void MappingContextTraits<PdbSymbolRecord, pdb::yaml::SerializationContext>::mapping(IO &IO, PdbSymbolRecord &Obj, pdb::yaml::SerializationContext &Context) {
+void MappingTraits<PdbSymbolRecord>::mapping(IO &IO, PdbSymbolRecord &Obj) {
+  BumpPtrAllocator *Alloc =
+      reinterpret_cast<BumpPtrAllocator *>(IO.getContext());
   codeview::SymbolVisitorCallbackPipeline Pipeline;
-  codeview::SymbolSerializer Serializer(Context.Allocator);
+  codeview::SymbolSerializer Serializer(*Alloc);
   codeview::SymbolDeserializer Deserializer(nullptr);
   codeview::yaml::YamlSymbolDumper Dumper(IO);
 
@@ -283,113 +237,15 @@ void MappingContextTraits<PdbSymbolRecor
   consumeError(Visitor.visitSymbolRecord(Obj.Record));
 }
 
-void MappingContextTraits<PdbModiStream, pdb::yaml::SerializationContext>::mapping(IO &IO, PdbModiStream &Obj, pdb::yaml::SerializationContext &Context) {
+void MappingTraits<PdbModiStream>::mapping(IO &IO, PdbModiStream &Obj) {
   IO.mapOptional("Signature", Obj.Signature, 4U);
-  IO.mapRequired("Records", Obj.Symbols, Context);
+  IO.mapRequired("Records", Obj.Symbols);
 }
 
-void MappingContextTraits<PdbDbiModuleInfo, pdb::yaml::SerializationContext>::mapping(IO &IO, PdbDbiModuleInfo &Obj, pdb::yaml::SerializationContext &Context) {
+void MappingTraits<PdbDbiModuleInfo>::mapping(IO &IO, PdbDbiModuleInfo &Obj) {
   IO.mapRequired("Module", Obj.Mod);
   IO.mapOptional("ObjFile", Obj.Obj, Obj.Mod);
   IO.mapOptional("SourceFiles", Obj.SourceFiles);
-  IO.mapOptionalWithContext("LineInfo", Obj.FileLineInfo, Context);
-  IO.mapOptionalWithContext("Modi", Obj.Modi, Context);
-}
-
-void MappingContextTraits<pdb::yaml::PdbSourceLineEntry,
-                          pdb::yaml::SerializationContext>::
-    mapping(IO &IO, PdbSourceLineEntry &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  IO.mapRequired("Offset", Obj.Offset);
-  IO.mapRequired("LineStart", Obj.LineStart);
-  IO.mapRequired("IsStatement", Obj.IsStatement);
-  IO.mapRequired("EndDelta", Obj.EndDelta);
-}
-
-void MappingContextTraits<pdb::yaml::PdbSourceColumnEntry,
-                          pdb::yaml::SerializationContext>::
-    mapping(IO &IO, PdbSourceColumnEntry &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  IO.mapRequired("StartColumn", Obj.StartColumn);
-  IO.mapRequired("EndColumn", Obj.EndColumn);
-}
-
-void MappingContextTraits<pdb::yaml::PdbSourceLineBlock,
-                          pdb::yaml::SerializationContext>::
-    mapping(IO &IO, PdbSourceLineBlock &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  IO.mapRequired("FileName", Obj.FileName);
-  IO.mapRequired("Lines", Obj.Lines, Context);
-  IO.mapRequired("Columns", Obj.Columns, Context);
-}
-
-void MappingContextTraits<pdb::yaml::PdbSourceFileChecksumEntry,
-                          pdb::yaml::SerializationContext>::
-    mapping(IO &IO, PdbSourceFileChecksumEntry &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  IO.mapRequired("FileName", Obj.FileName);
-  IO.mapRequired("Kind", Obj.Kind);
-  IO.mapRequired("Checksum", Obj.ChecksumBytes);
-}
-
-void MappingContextTraits<pdb::yaml::PdbSourceLineInfo,
-                          pdb::yaml::SerializationContext>::
-    mapping(IO &IO, PdbSourceLineInfo &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  IO.mapRequired("CodeSize", Obj.CodeSize);
-
-  IO.mapRequired("Flags", Obj.Flags);
-  IO.mapRequired("RelocOffset", Obj.RelocOffset);
-  IO.mapRequired("RelocSegment", Obj.RelocSegment);
-  IO.mapRequired("Blocks", Obj.Blocks, Context);
-}
-
-void MappingContextTraits<pdb::yaml::PdbSourceFileInfo,
-                          pdb::yaml::SerializationContext>::
-    mapping(IO &IO, PdbSourceFileInfo &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  IO.mapOptionalWithContext("Checksums", Obj.FileChecksums, Context);
-  IO.mapOptionalWithContext("Lines", Obj.LineFragments, Context);
-  IO.mapOptionalWithContext("InlineeLines", Obj.Inlinees, Context);
-}
-
-void MappingContextTraits<PdbInlineeSite, SerializationContext>::mapping(
-    IO &IO, PdbInlineeSite &Obj, SerializationContext &Context) {
-  IO.mapRequired("FileName", Obj.FileName);
-  IO.mapRequired("LineNum", Obj.SourceLineNum);
-  IO.mapRequired("Inlinee", Obj.Inlinee);
-  IO.mapOptional("ExtraFiles", Obj.ExtraFiles);
-}
-
-void MappingContextTraits<PdbInlineeInfo, SerializationContext>::mapping(
-    IO &IO, PdbInlineeInfo &Obj, SerializationContext &Context) {
-  IO.mapRequired("HasExtraFiles", Obj.HasExtraFiles);
-  IO.mapRequired("Sites", Obj.Sites, Context);
-}
-
-void MappingContextTraits<PdbTpiRecord, pdb::yaml::SerializationContext>::
-    mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj,
-            pdb::yaml::SerializationContext &Context) {
-  if (IO.outputting()) {
-    // For PDB to Yaml, deserialize into a high level record type, then dump it.
-    consumeError(codeview::visitTypeRecord(Obj.Record, Context.Dumper));
-  } else {
-    codeview::TypeVisitorCallbackPipeline Pipeline;
-    codeview::TypeSerializer Serializer(Context.Allocator);
-    pdb::TpiHashUpdater Hasher;
-    // For Yaml to PDB, extract from the high level record type, then write it
-    // to bytes.
-
-    // This might be interpreted as a hack, but serializing FieldList
-    // sub-records requires having access to the same serializer being used by
-    // the FieldList itself.
-    Context.ActiveSerializer = &Serializer;
-    Pipeline.addCallbackToPipeline(Context.Dumper);
-    Pipeline.addCallbackToPipeline(Serializer);
-    Pipeline.addCallbackToPipeline(Hasher);
-    consumeError(codeview::visitTypeRecord(Obj.Record, Pipeline,
-                                           codeview::VDS_BytesExternal));
-  }
-
-  Context.ActiveSerializer = nullptr;
+  IO.mapOptional("LineInfo", Obj.FileLineInfo);
+  IO.mapOptional("Modi", Obj.Modi);
 }

Modified: llvm/trunk/tools/llvm-pdbdump/PdbYaml.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PdbYaml.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/PdbYaml.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/PdbYaml.h Tue May 30 16:53:05 2017
@@ -19,6 +19,7 @@
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
 #include "llvm/DebugInfo/PDB/PDBTypes.h"
+#include "llvm/ObjectYAML/CodeViewYAML.h"
 #include "llvm/Support/Endian.h"
 #include "llvm/Support/YAMLTraits.h"
 
@@ -65,66 +66,11 @@ struct PdbModiStream {
   std::vector<PdbSymbolRecord> Symbols;
 };
 
-struct PdbSourceLineEntry {
-  uint32_t Offset;
-  uint32_t LineStart;
-  uint32_t EndDelta;
-  bool IsStatement;
-};
-
-struct PdbSourceColumnEntry {
-  uint16_t StartColumn;
-  uint16_t EndColumn;
-};
-
-struct PdbSourceLineBlock {
-  StringRef FileName;
-  std::vector<PdbSourceLineEntry> Lines;
-  std::vector<PdbSourceColumnEntry> Columns;
-};
-
-struct HexFormattedString {
-  std::vector<uint8_t> Bytes;
-};
-
-struct PdbSourceFileChecksumEntry {
-  StringRef FileName;
-  codeview::FileChecksumKind Kind;
-  HexFormattedString ChecksumBytes;
-};
-
-struct PdbSourceLineInfo {
-  uint32_t RelocOffset;
-  uint32_t RelocSegment;
-  codeview::LineFlags Flags;
-  uint32_t CodeSize;
-
-  std::vector<PdbSourceLineBlock> Blocks;
-};
-
-struct PdbInlineeSite {
-  codeview::TypeIndex Inlinee;
-  StringRef FileName;
-  uint32_t SourceLineNum;
-  std::vector<StringRef> ExtraFiles;
-};
-
-struct PdbInlineeInfo {
-  bool HasExtraFiles;
-  std::vector<PdbInlineeSite> Sites;
-};
-
-struct PdbSourceFileInfo {
-  std::vector<PdbSourceFileChecksumEntry> FileChecksums;
-  std::vector<PdbSourceLineInfo> LineFragments;
-  std::vector<PdbInlineeInfo> Inlinees;
-};
-
 struct PdbDbiModuleInfo {
   StringRef Obj;
   StringRef Mod;
   std::vector<StringRef> SourceFiles;
-  Optional<PdbSourceFileInfo> FileLineInfo;
+  Optional<CodeViewYAML::SourceFileInfo> FileLineInfo;
   Optional<PdbModiStream> Modi;
 };
 
@@ -140,17 +86,9 @@ struct PdbDbiStream {
   std::vector<PdbDbiModuleInfo> ModInfos;
 };
 
-struct PdbTpiRecord {
-  codeview::CVType Record;
-};
-
-struct PdbTpiFieldListRecord {
-  codeview::CVMemberRecord Record;
-};
-
 struct PdbTpiStream {
   PdbRaw_TpiVer Version = PdbTpiV80;
-  std::vector<PdbTpiRecord> Records;
+  std::vector<CodeViewYAML::LeafRecord> Records;
 };
 
 struct PdbObject {
@@ -172,126 +110,16 @@ struct PdbObject {
 }
 }
 
-namespace llvm {
-namespace yaml {
-
-template <> struct MappingTraits<pdb::yaml::PdbObject> {
-  static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
-};
-
-template <> struct MappingTraits<pdb::yaml::MSFHeaders> {
-  static void mapping(IO &IO, pdb::yaml::MSFHeaders &Obj);
-};
-
-template <> struct MappingTraits<msf::SuperBlock> {
-  static void mapping(IO &IO, msf::SuperBlock &SB);
-};
-
-template <> struct MappingTraits<pdb::yaml::StreamBlockList> {
-  static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB);
-};
-
-template <> struct MappingTraits<pdb::yaml::PdbInfoStream> {
-  static void mapping(IO &IO, pdb::yaml::PdbInfoStream &Obj);
-};
-
-template <> struct MappingContextTraits<pdb::yaml::PdbDbiStream, pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbDbiStream &Obj, pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbTpiStream, pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbTpiStream &Obj,
-    pdb::yaml::SerializationContext &Context);
-};
-
-template <> struct MappingTraits<pdb::yaml::NamedStreamMapping> {
-  static void mapping(IO &IO, pdb::yaml::NamedStreamMapping &Obj);
-};
-
-template <> struct MappingContextTraits<pdb::yaml::PdbSymbolRecord, pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSymbolRecord &Obj, pdb::yaml::SerializationContext &Context);
-};
-
-template <> struct MappingContextTraits<pdb::yaml::PdbModiStream, pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbModiStream &Obj, pdb::yaml::SerializationContext &Context);
-};
-
-template <> struct MappingContextTraits<pdb::yaml::PdbDbiModuleInfo, pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbDbiModuleInfo &Obj, pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbSourceLineEntry,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSourceLineEntry &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbSourceColumnEntry,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSourceColumnEntry &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbSourceLineBlock,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSourceLineBlock &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbSourceFileChecksumEntry,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSourceFileChecksumEntry &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <> struct ScalarTraits<pdb::yaml::HexFormattedString> {
-  static void output(const pdb::yaml::HexFormattedString &Value, void *ctx,
-                     llvm::raw_ostream &Out);
-  static StringRef input(StringRef Scalar, void *ctxt,
-                         pdb::yaml::HexFormattedString &Value);
-  static bool mustQuote(StringRef) { return false; }
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbSourceLineInfo,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSourceLineInfo &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbSourceFileInfo,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbSourceFileInfo &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbInlineeInfo,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbInlineeInfo &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbInlineeSite,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbInlineeSite &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <>
-struct MappingContextTraits<pdb::yaml::PdbTpiRecord,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-}
-}
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbObject)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::MSFHeaders)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(msf::SuperBlock)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::StreamBlockList)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbInfoStream)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiStream)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbTpiStream)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::NamedStreamMapping)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbSymbolRecord)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbModiStream)
+LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiModuleInfo)
 
 #endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H

Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp Tue May 30 16:53:05 2017
@@ -28,6 +28,7 @@
 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
 #include "llvm/DebugInfo/PDB/Native/RawError.h"
 #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
+#include "llvm/ObjectYAML/CodeViewYAML.h"
 
 using namespace llvm;
 using namespace llvm::codeview;
@@ -104,12 +105,12 @@ Error YAMLOutputStyle::dump() {
 namespace {
 class C13YamlVisitor : public C13DebugFragmentVisitor {
 public:
-  C13YamlVisitor(llvm::pdb::yaml::PdbSourceFileInfo &Info, PDBFile &F)
+  C13YamlVisitor(CodeViewYAML::SourceFileInfo &Info, PDBFile &F)
       : C13DebugFragmentVisitor(F), Info(Info) {}
 
   Error handleFileChecksums() override {
     for (const auto &C : *Checksums) {
-      llvm::pdb::yaml::PdbSourceFileChecksumEntry Entry;
+      CodeViewYAML::SourceFileChecksumEntry Entry;
       if (auto Result = getNameFromStringTable(C.FileNameOffset))
         Entry.FileName = *Result;
       else
@@ -143,7 +144,7 @@ public:
           return Result.takeError();
 
         for (const auto &N : L.LineNumbers) {
-          llvm::pdb::yaml::PdbSourceLineEntry Line;
+          CodeViewYAML::SourceLineEntry Line;
           Line.Offset = N.Offset;
           codeview::LineInfo LI(N.Flags);
           Line.LineStart = LI.getStartLine();
@@ -154,7 +155,7 @@ public:
 
         if (LF.hasColumnInfo()) {
           for (const auto &C : L.Columns) {
-            llvm::pdb::yaml::PdbSourceColumnEntry Column;
+            CodeViewYAML::SourceColumnEntry Column;
             Column.StartColumn = C.StartColumn;
             Column.EndColumn = C.EndColumn;
             Block.Columns.push_back(Column);
@@ -179,7 +180,7 @@ public:
         else
           return Result.takeError();
 
-        Site.Inlinee = IL.Header->Inlinee;
+        Site.Inlinee = IL.Header->Inlinee.getIndex();
         Site.SourceLineNum = IL.Header->SourceLineNum;
         if (ILF.hasExtraFiles()) {
           for (const auto &EF : IL.ExtraFiles) {
@@ -195,17 +196,16 @@ public:
   }
 
 private:
-
-  llvm::pdb::yaml::PdbSourceFileInfo &Info;
+  CodeViewYAML::SourceFileInfo &Info;
 };
 }
 
-Expected<Optional<llvm::pdb::yaml::PdbSourceFileInfo>>
+Expected<Optional<CodeViewYAML::SourceFileInfo>>
 YAMLOutputStyle::getFileLineInfo(const pdb::ModuleDebugStreamRef &ModS) {
   if (!ModS.hasLineInfo())
     return None;
 
-  yaml::PdbSourceFileInfo Info;
+  CodeViewYAML::SourceFileInfo Info;
   C13YamlVisitor Visitor(Info, File);
   if (auto EC =
           codeview::visitDebugSubsections(ModS.linesAndChecksums(), Visitor))
@@ -378,13 +378,10 @@ Error YAMLOutputStyle::dumpTpiStream() {
   Obj.TpiStream.emplace();
   Obj.TpiStream->Version = TS.getTpiVersion();
   for (auto &Record : TS.types(nullptr)) {
-    yaml::PdbTpiRecord R;
-    // It's not necessary to set R.RecordData here.  That only exists as a
-    // way to have the `PdbTpiRecord` structure own the memory that `R.Record`
-    // references.  In the case of reading an existing PDB though, that memory
-    // is owned by the backing stream.
-    R.Record = Record;
-    Obj.TpiStream->Records.push_back(R);
+    auto ExpectedRecord = CodeViewYAML::LeafRecord::fromCodeViewRecord(Record);
+    if (!ExpectedRecord)
+      return ExpectedRecord.takeError();
+    Obj.TpiStream->Records.push_back(*ExpectedRecord);
   }
 
   return Error::success();
@@ -402,9 +399,11 @@ Error YAMLOutputStyle::dumpIpiStream() {
   Obj.IpiStream.emplace();
   Obj.IpiStream->Version = IS.getTpiVersion();
   for (auto &Record : IS.types(nullptr)) {
-    yaml::PdbTpiRecord R;
-    R.Record = Record;
-    Obj.IpiStream->Records.push_back(R);
+    auto ExpectedRecord = CodeViewYAML::LeafRecord::fromCodeViewRecord(Record);
+    if (!ExpectedRecord)
+      return ExpectedRecord.takeError();
+
+    Obj.IpiStream->Records.push_back(*ExpectedRecord);
   }
 
   return Error::success();

Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h Tue May 30 16:53:05 2017
@@ -27,7 +27,7 @@ public:
   Error dump() override;
 
 private:
-  Expected<Optional<llvm::pdb::yaml::PdbSourceFileInfo>>
+  Expected<Optional<CodeViewYAML::SourceFileInfo>>
   getFileLineInfo(const pdb::ModuleDebugStreamRef &ModS);
 
   Error dumpStringTable();

Removed: llvm/trunk/tools/llvm-pdbdump/YamlSerializationContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YamlSerializationContext.h?rev=304247&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YamlSerializationContext.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/YamlSerializationContext.h (removed)
@@ -1,39 +0,0 @@
-//===- YamlSerializationContext.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_TOOLS_LLVMPDBDUMP_YAMLSERIALIZATIONCONTEXT_H
-#define LLVM_TOOLS_LLVMPDBDUMP_YAMLSERIALIZATIONCONTEXT_H
-
-#include "PdbYaml.h"
-#include "YamlTypeDumper.h"
-#include "llvm/Support/Allocator.h"
-
-namespace llvm {
-namespace codeview {
-class TypeSerializer;
-}
-namespace yaml {
-class IO;
-}
-
-namespace pdb {
-namespace yaml {
-struct SerializationContext {
-  explicit SerializationContext(llvm::yaml::IO &IO, BumpPtrAllocator &Allocator)
-      : Dumper(IO, *this), Allocator(Allocator) {}
-
-  codeview::yaml::YamlTypeDumperCallbacks Dumper;
-  BumpPtrAllocator &Allocator;
-  codeview::TypeSerializer *ActiveSerializer = nullptr;
-};
-}
-}
-}
-
-#endif
\ No newline at end of file

Modified: llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.cpp?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.cpp Tue May 30 16:53:05 2017
@@ -9,7 +9,6 @@
 
 #include "YamlSymbolDumper.h"
 #include "PdbYaml.h"
-#include "YamlTypeDumper.h"
 
 #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
 #include "llvm/DebugInfo/CodeView/EnumTables.h"
@@ -27,10 +26,10 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(OneMethodRe
 LLVM_YAML_IS_SEQUENCE_VECTOR(VFTableSlotKind)
 LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
 LLVM_YAML_IS_SEQUENCE_VECTOR(CVType)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbTpiFieldListRecord)
 
 namespace llvm {
 namespace yaml {
+
 void ScalarEnumerationTraits<SymbolKind>::enumeration(IO &io,
                                                       SymbolKind &Value) {
   auto SymbolNames = getSymbolTypeNames();

Modified: llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.h?rev=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/YamlSymbolDumper.h Tue May 30 16:53:05 2017
@@ -34,7 +34,7 @@ public:
     return Error::success();                                                   \
   }
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 
 private:
   template <typename T>
@@ -59,7 +59,7 @@ template <> struct ScalarEnumerationTrai
     static void mapping(IO &IO, codeview::Name &Obj);                          \
   };
 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
 }
 }
 

Removed: llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.cpp?rev=304247&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.cpp (removed)
@@ -1,589 +0,0 @@
-//===- YamlTypeDumper.cpp ------------------------------------- *- C++ --*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "YamlTypeDumper.h"
-#include "PdbYaml.h"
-#include "YamlSerializationContext.h"
-
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/EnumTables.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeSerializer.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::codeview::yaml;
-
-LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(TypeIndex)
-LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint64_t)
-LLVM_YAML_IS_SEQUENCE_VECTOR(OneMethodRecord)
-LLVM_YAML_IS_SEQUENCE_VECTOR(VFTableSlotKind)
-LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
-LLVM_YAML_IS_SEQUENCE_VECTOR(CVType)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbTpiFieldListRecord)
-
-namespace {
-struct FieldListRecordSplitter : public TypeVisitorCallbacks {
-public:
-  explicit FieldListRecordSplitter(
-      std::vector<llvm::pdb::yaml::PdbTpiFieldListRecord> &Records)
-      : Records(Records) {}
-
-#define TYPE_RECORD(EnumName, EnumVal, Name)
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
-  Error visitKnownMember(CVMemberRecord &CVT, Name##Record &Record) override { \
-    visitKnownMemberImpl(CVT);                                                 \
-    return Error::success();                                                   \
-  }
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
-
-private:
-  void visitKnownMemberImpl(CVMemberRecord &CVT) {
-    llvm::pdb::yaml::PdbTpiFieldListRecord R;
-    R.Record = CVT;
-    Records.push_back(std::move(R));
-  }
-
-  std::vector<llvm::pdb::yaml::PdbTpiFieldListRecord> &Records;
-};
-}
-
-namespace llvm {
-namespace yaml {
-template <> struct ScalarEnumerationTraits<PointerToMemberRepresentation> {
-  static void enumeration(IO &IO, PointerToMemberRepresentation &Value) {
-    IO.enumCase(Value, "Unknown", PointerToMemberRepresentation::Unknown);
-    IO.enumCase(Value, "SingleInheritanceData",
-                PointerToMemberRepresentation::SingleInheritanceData);
-    IO.enumCase(Value, "MultipleInheritanceData",
-                PointerToMemberRepresentation::MultipleInheritanceData);
-    IO.enumCase(Value, "VirtualInheritanceData",
-                PointerToMemberRepresentation::VirtualInheritanceData);
-    IO.enumCase(Value, "GeneralData",
-                PointerToMemberRepresentation::GeneralData);
-    IO.enumCase(Value, "SingleInheritanceFunction",
-                PointerToMemberRepresentation::SingleInheritanceFunction);
-    IO.enumCase(Value, "MultipleInheritanceFunction",
-                PointerToMemberRepresentation::MultipleInheritanceFunction);
-    IO.enumCase(Value, "VirtualInheritanceFunction",
-                PointerToMemberRepresentation::VirtualInheritanceFunction);
-    IO.enumCase(Value, "GeneralFunction",
-                PointerToMemberRepresentation::GeneralFunction);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<VFTableSlotKind> {
-  static void enumeration(IO &IO, VFTableSlotKind &Kind) {
-    IO.enumCase(Kind, "Near16", VFTableSlotKind::Near16);
-    IO.enumCase(Kind, "Far16", VFTableSlotKind::Far16);
-    IO.enumCase(Kind, "This", VFTableSlotKind::This);
-    IO.enumCase(Kind, "Outer", VFTableSlotKind::Outer);
-    IO.enumCase(Kind, "Meta", VFTableSlotKind::Meta);
-    IO.enumCase(Kind, "Near", VFTableSlotKind::Near);
-    IO.enumCase(Kind, "Far", VFTableSlotKind::Far);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<CallingConvention> {
-  static void enumeration(IO &IO, CallingConvention &Value) {
-    IO.enumCase(Value, "NearC", CallingConvention::NearC);
-    IO.enumCase(Value, "FarC", CallingConvention::FarC);
-    IO.enumCase(Value, "NearPascal", CallingConvention::NearPascal);
-    IO.enumCase(Value, "FarPascal", CallingConvention::FarPascal);
-    IO.enumCase(Value, "NearFast", CallingConvention::NearFast);
-    IO.enumCase(Value, "FarFast", CallingConvention::FarFast);
-    IO.enumCase(Value, "NearStdCall", CallingConvention::NearStdCall);
-    IO.enumCase(Value, "FarStdCall", CallingConvention::FarStdCall);
-    IO.enumCase(Value, "NearSysCall", CallingConvention::NearSysCall);
-    IO.enumCase(Value, "FarSysCall", CallingConvention::FarSysCall);
-    IO.enumCase(Value, "ThisCall", CallingConvention::ThisCall);
-    IO.enumCase(Value, "MipsCall", CallingConvention::MipsCall);
-    IO.enumCase(Value, "Generic", CallingConvention::Generic);
-    IO.enumCase(Value, "AlphaCall", CallingConvention::AlphaCall);
-    IO.enumCase(Value, "PpcCall", CallingConvention::PpcCall);
-    IO.enumCase(Value, "SHCall", CallingConvention::SHCall);
-    IO.enumCase(Value, "ArmCall", CallingConvention::ArmCall);
-    IO.enumCase(Value, "AM33Call", CallingConvention::AM33Call);
-    IO.enumCase(Value, "TriCall", CallingConvention::TriCall);
-    IO.enumCase(Value, "SH5Call", CallingConvention::SH5Call);
-    IO.enumCase(Value, "M32RCall", CallingConvention::M32RCall);
-    IO.enumCase(Value, "ClrCall", CallingConvention::ClrCall);
-    IO.enumCase(Value, "Inline", CallingConvention::Inline);
-    IO.enumCase(Value, "NearVector", CallingConvention::NearVector);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<PointerKind> {
-  static void enumeration(IO &IO, PointerKind &Kind) {
-    IO.enumCase(Kind, "Near16", PointerKind::Near16);
-    IO.enumCase(Kind, "Far16", PointerKind::Far16);
-    IO.enumCase(Kind, "Huge16", PointerKind::Huge16);
-    IO.enumCase(Kind, "BasedOnSegment", PointerKind::BasedOnSegment);
-    IO.enumCase(Kind, "BasedOnValue", PointerKind::BasedOnValue);
-    IO.enumCase(Kind, "BasedOnSegmentValue", PointerKind::BasedOnSegmentValue);
-    IO.enumCase(Kind, "BasedOnAddress", PointerKind::BasedOnAddress);
-    IO.enumCase(Kind, "BasedOnSegmentAddress",
-                PointerKind::BasedOnSegmentAddress);
-    IO.enumCase(Kind, "BasedOnType", PointerKind::BasedOnType);
-    IO.enumCase(Kind, "BasedOnSelf", PointerKind::BasedOnSelf);
-    IO.enumCase(Kind, "Near32", PointerKind::Near32);
-    IO.enumCase(Kind, "Far32", PointerKind::Far32);
-    IO.enumCase(Kind, "Near64", PointerKind::Near64);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<PointerMode> {
-  static void enumeration(IO &IO, PointerMode &Mode) {
-    IO.enumCase(Mode, "Pointer", PointerMode::Pointer);
-    IO.enumCase(Mode, "LValueReference", PointerMode::LValueReference);
-    IO.enumCase(Mode, "PointerToDataMember", PointerMode::PointerToDataMember);
-    IO.enumCase(Mode, "PointerToMemberFunction",
-                PointerMode::PointerToMemberFunction);
-    IO.enumCase(Mode, "RValueReference", PointerMode::RValueReference);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<HfaKind> {
-  static void enumeration(IO &IO, HfaKind &Value) {
-    IO.enumCase(Value, "None", HfaKind::None);
-    IO.enumCase(Value, "Float", HfaKind::Float);
-    IO.enumCase(Value, "Double", HfaKind::Double);
-    IO.enumCase(Value, "Other", HfaKind::Other);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<MemberAccess> {
-  static void enumeration(IO &IO, MemberAccess &Access) {
-    IO.enumCase(Access, "None", MemberAccess::None);
-    IO.enumCase(Access, "Private", MemberAccess::Private);
-    IO.enumCase(Access, "Protected", MemberAccess::Protected);
-    IO.enumCase(Access, "Public", MemberAccess::Public);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<MethodKind> {
-  static void enumeration(IO &IO, MethodKind &Kind) {
-    IO.enumCase(Kind, "Vanilla", MethodKind::Vanilla);
-    IO.enumCase(Kind, "Virtual", MethodKind::Virtual);
-    IO.enumCase(Kind, "Static", MethodKind::Static);
-    IO.enumCase(Kind, "Friend", MethodKind::Friend);
-    IO.enumCase(Kind, "IntroducingVirtual", MethodKind::IntroducingVirtual);
-    IO.enumCase(Kind, "PureVirtual", MethodKind::PureVirtual);
-    IO.enumCase(Kind, "PureIntroducingVirtual",
-                MethodKind::PureIntroducingVirtual);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<WindowsRTClassKind> {
-  static void enumeration(IO &IO, WindowsRTClassKind &Value) {
-    IO.enumCase(Value, "None", WindowsRTClassKind::None);
-    IO.enumCase(Value, "Ref", WindowsRTClassKind::RefClass);
-    IO.enumCase(Value, "Value", WindowsRTClassKind::ValueClass);
-    IO.enumCase(Value, "Interface", WindowsRTClassKind::Interface);
-  }
-};
-
-template <> struct ScalarEnumerationTraits<LabelType> {
-  static void enumeration(IO &IO, LabelType &Value) {
-    IO.enumCase(Value, "Near", LabelType::Near);
-    IO.enumCase(Value, "Far", LabelType::Far);
-  }
-};
-
-template <> struct ScalarBitSetTraits<PointerOptions> {
-  static void bitset(IO &IO, PointerOptions &Options) {
-    IO.bitSetCase(Options, "None", PointerOptions::None);
-    IO.bitSetCase(Options, "Flat32", PointerOptions::Flat32);
-    IO.bitSetCase(Options, "Volatile", PointerOptions::Volatile);
-    IO.bitSetCase(Options, "Const", PointerOptions::Const);
-    IO.bitSetCase(Options, "Unaligned", PointerOptions::Unaligned);
-    IO.bitSetCase(Options, "Restrict", PointerOptions::Restrict);
-    IO.bitSetCase(Options, "WinRTSmartPointer",
-                  PointerOptions::WinRTSmartPointer);
-  }
-};
-
-template <> struct ScalarBitSetTraits<ModifierOptions> {
-  static void bitset(IO &IO, ModifierOptions &Options) {
-    IO.bitSetCase(Options, "None", ModifierOptions::None);
-    IO.bitSetCase(Options, "Const", ModifierOptions::Const);
-    IO.bitSetCase(Options, "Volatile", ModifierOptions::Volatile);
-    IO.bitSetCase(Options, "Unaligned", ModifierOptions::Unaligned);
-  }
-};
-
-template <> struct ScalarBitSetTraits<FunctionOptions> {
-  static void bitset(IO &IO, FunctionOptions &Options) {
-    IO.bitSetCase(Options, "None", FunctionOptions::None);
-    IO.bitSetCase(Options, "CxxReturnUdt", FunctionOptions::CxxReturnUdt);
-    IO.bitSetCase(Options, "Constructor", FunctionOptions::Constructor);
-    IO.bitSetCase(Options, "ConstructorWithVirtualBases",
-                  FunctionOptions::ConstructorWithVirtualBases);
-  }
-};
-
-template <> struct ScalarBitSetTraits<ClassOptions> {
-  static void bitset(IO &IO, ClassOptions &Options) {
-    IO.bitSetCase(Options, "None", ClassOptions::None);
-    IO.bitSetCase(Options, "HasConstructorOrDestructor",
-                  ClassOptions::HasConstructorOrDestructor);
-    IO.bitSetCase(Options, "HasOverloadedOperator",
-                  ClassOptions::HasOverloadedOperator);
-    IO.bitSetCase(Options, "Nested", ClassOptions::Nested);
-    IO.bitSetCase(Options, "ContainsNestedClass",
-                  ClassOptions::ContainsNestedClass);
-    IO.bitSetCase(Options, "HasOverloadedAssignmentOperator",
-                  ClassOptions::HasOverloadedAssignmentOperator);
-    IO.bitSetCase(Options, "HasConversionOperator",
-                  ClassOptions::HasConversionOperator);
-    IO.bitSetCase(Options, "ForwardReference", ClassOptions::ForwardReference);
-    IO.bitSetCase(Options, "Scoped", ClassOptions::Scoped);
-    IO.bitSetCase(Options, "HasUniqueName", ClassOptions::HasUniqueName);
-    IO.bitSetCase(Options, "Sealed", ClassOptions::Sealed);
-    IO.bitSetCase(Options, "Intrinsic", ClassOptions::Intrinsic);
-  }
-};
-
-template <> struct ScalarBitSetTraits<MethodOptions> {
-  static void bitset(IO &IO, MethodOptions &Options) {
-    IO.bitSetCase(Options, "None", MethodOptions::None);
-    IO.bitSetCase(Options, "Pseudo", MethodOptions::Pseudo);
-    IO.bitSetCase(Options, "NoInherit", MethodOptions::NoInherit);
-    IO.bitSetCase(Options, "NoConstruct", MethodOptions::NoConstruct);
-    IO.bitSetCase(Options, "CompilerGenerated",
-                  MethodOptions::CompilerGenerated);
-    IO.bitSetCase(Options, "Sealed", MethodOptions::Sealed);
-  }
-};
-
-void ScalarTraits<APSInt>::output(const APSInt &S, void *,
-                                  llvm::raw_ostream &OS) {
-  S.print(OS, true);
-}
-StringRef ScalarTraits<APSInt>::input(StringRef Scalar, void *Ctx, APSInt &S) {
-  S = APSInt(Scalar);
-  return "";
-}
-
-bool ScalarTraits<APSInt>::mustQuote(StringRef Scalar) { return false; }
-
-void MappingContextTraits<CVType, pdb::yaml::SerializationContext>::mapping(
-    IO &IO, CVType &Record, pdb::yaml::SerializationContext &Context) {
-  if (IO.outputting())
-    consumeError(codeview::visitTypeRecord(Record, Context.Dumper));
-}
-
-void MappingTraits<StringIdRecord>::mapping(IO &IO, StringIdRecord &String) {
-  IO.mapRequired("Id", String.Id);
-  IO.mapRequired("String", String.String);
-}
-
-void MappingTraits<ArgListRecord>::mapping(IO &IO, ArgListRecord &Args) {
-  IO.mapRequired("ArgIndices", Args.ArgIndices);
-}
-
-void MappingTraits<StringListRecord>::mapping(IO &IO, StringListRecord &Strings) {
-  IO.mapRequired("StringIndices", Strings.StringIndices);
-}
-
-void MappingTraits<ClassRecord>::mapping(IO &IO, ClassRecord &Class) {
-  IO.mapRequired("MemberCount", Class.MemberCount);
-  IO.mapRequired("Options", Class.Options);
-  IO.mapRequired("FieldList", Class.FieldList);
-  IO.mapRequired("Name", Class.Name);
-  IO.mapRequired("UniqueName", Class.UniqueName);
-  IO.mapRequired("DerivationList", Class.DerivationList);
-  IO.mapRequired("VTableShape", Class.VTableShape);
-  IO.mapRequired("Size", Class.Size);
-}
-
-void MappingTraits<UnionRecord>::mapping(IO &IO, UnionRecord &Union) {
-  IO.mapRequired("MemberCount", Union.MemberCount);
-  IO.mapRequired("Options", Union.Options);
-  IO.mapRequired("FieldList", Union.FieldList);
-  IO.mapRequired("Name", Union.Name);
-  IO.mapRequired("UniqueName", Union.UniqueName);
-  IO.mapRequired("Size", Union.Size);
-}
-
-void MappingTraits<EnumRecord>::mapping(IO &IO, EnumRecord &Enum) {
-  IO.mapRequired("NumEnumerators", Enum.MemberCount);
-  IO.mapRequired("Options", Enum.Options);
-  IO.mapRequired("FieldList", Enum.FieldList);
-  IO.mapRequired("Name", Enum.Name);
-  IO.mapRequired("UniqueName", Enum.UniqueName);
-  IO.mapRequired("UnderlyingType", Enum.UnderlyingType);
-}
-
-void MappingTraits<ArrayRecord>::mapping(IO &IO, ArrayRecord &AT) {
-  IO.mapRequired("ElementType", AT.ElementType);
-  IO.mapRequired("IndexType", AT.IndexType);
-  IO.mapRequired("Size", AT.Size);
-  IO.mapRequired("Name", AT.Name);
-}
-
-void MappingTraits<VFTableRecord>::mapping(IO &IO, VFTableRecord &VFT) {
-  IO.mapRequired("CompleteClass", VFT.CompleteClass);
-  IO.mapRequired("OverriddenVFTable", VFT.OverriddenVFTable);
-  IO.mapRequired("VFPtrOffset", VFT.VFPtrOffset);
-  IO.mapRequired("MethodNames", VFT.MethodNames);
-}
-
-void MappingTraits<MemberFuncIdRecord>::mapping(IO &IO,
-                                                MemberFuncIdRecord &Id) {
-  IO.mapRequired("ClassType", Id.ClassType);
-  IO.mapRequired("FunctionType", Id.FunctionType);
-  IO.mapRequired("Name", Id.Name);
-}
-
-void MappingTraits<ProcedureRecord>::mapping(IO &IO, ProcedureRecord &Proc) {
-  IO.mapRequired("ReturnType", Proc.ReturnType);
-  IO.mapRequired("CallConv", Proc.CallConv);
-  IO.mapRequired("Options", Proc.Options);
-  IO.mapRequired("ParameterCount", Proc.ParameterCount);
-  IO.mapRequired("ArgumentList", Proc.ArgumentList);
-}
-
-void MappingTraits<MemberFunctionRecord>::mapping(IO &IO,
-                                                  MemberFunctionRecord &MF) {
-  IO.mapRequired("ReturnType", MF.ReturnType);
-  IO.mapRequired("ClassType", MF.ClassType);
-  IO.mapRequired("ThisType", MF.ThisType);
-  IO.mapRequired("CallConv", MF.CallConv);
-  IO.mapRequired("Options", MF.Options);
-  IO.mapRequired("ParameterCount", MF.ParameterCount);
-  IO.mapRequired("ArgumentList", MF.ArgumentList);
-  IO.mapRequired("ThisPointerAdjustment", MF.ThisPointerAdjustment);
-}
-
-void MappingTraits<MethodOverloadListRecord>::mapping(
-    IO &IO, MethodOverloadListRecord &MethodList) {
-  IO.mapRequired("Methods", MethodList.Methods);
-}
-
-void MappingTraits<FuncIdRecord>::mapping(IO &IO, FuncIdRecord &Func) {
-  IO.mapRequired("ParentScope", Func.ParentScope);
-  IO.mapRequired("FunctionType", Func.FunctionType);
-  IO.mapRequired("Name", Func.Name);
-}
-
-void MappingTraits<TypeServer2Record>::mapping(IO &IO, TypeServer2Record &TS) {
-  IO.mapRequired("Guid", TS.Guid);
-  IO.mapRequired("Age", TS.Age);
-  IO.mapRequired("Name", TS.Name);
-}
-
-void MappingTraits<PointerRecord>::mapping(IO &IO, PointerRecord &Ptr) {
-  IO.mapRequired("ReferentType", Ptr.ReferentType);
-  IO.mapRequired("Attrs", Ptr.Attrs);
-  IO.mapOptional("MemberInfo", Ptr.MemberInfo);
-}
-
-void MappingTraits<MemberPointerInfo>::mapping(IO &IO, MemberPointerInfo &MPI) {
-  IO.mapRequired("ContainingType", MPI.ContainingType);
-  IO.mapRequired("Representation", MPI.Representation);
-}
-
-void MappingTraits<ModifierRecord>::mapping(IO &IO, ModifierRecord &Mod) {
-  IO.mapRequired("ModifiedType", Mod.ModifiedType);
-  IO.mapRequired("Modifiers", Mod.Modifiers);
-}
-
-void MappingTraits<BitFieldRecord>::mapping(IO &IO, BitFieldRecord &BitField) {
-  IO.mapRequired("Type", BitField.Type);
-  IO.mapRequired("BitSize", BitField.BitSize);
-  IO.mapRequired("BitOffset", BitField.BitOffset);
-}
-
-void MappingTraits<VFTableShapeRecord>::mapping(IO &IO,
-                                                VFTableShapeRecord &Shape) {
-  IO.mapRequired("Slots", Shape.Slots);
-}
-
-void MappingTraits<UdtSourceLineRecord>::mapping(IO &IO,
-                                                 UdtSourceLineRecord &Line) {
-  IO.mapRequired("UDT", Line.UDT);
-  IO.mapRequired("SourceFile", Line.SourceFile);
-  IO.mapRequired("LineNumber", Line.LineNumber);
-}
-
-void MappingTraits<UdtModSourceLineRecord>::mapping(
-    IO &IO, UdtModSourceLineRecord &Line) {
-  IO.mapRequired("UDT", Line.UDT);
-  IO.mapRequired("SourceFile", Line.SourceFile);
-  IO.mapRequired("LineNumber", Line.LineNumber);
-  IO.mapRequired("Module", Line.Module);
-}
-
-void MappingTraits<BuildInfoRecord>::mapping(IO &IO, BuildInfoRecord &Args) {
-  IO.mapRequired("ArgIndices", Args.ArgIndices);
-}
-
-void MappingTraits<LabelRecord>::mapping(IO &IO, LabelRecord &R) {
-  IO.mapRequired("Mode", R.Mode);
-}
-
-void MappingTraits<NestedTypeRecord>::mapping(IO &IO,
-                                              NestedTypeRecord &Nested) {
-  IO.mapRequired("Type", Nested.Type);
-  IO.mapRequired("Name", Nested.Name);
-}
-
-void MappingTraits<OneMethodRecord>::mapping(IO &IO, OneMethodRecord &Method) {
-  IO.mapRequired("Type", Method.Type);
-  IO.mapRequired("Attrs", Method.Attrs.Attrs);
-  IO.mapRequired("VFTableOffset", Method.VFTableOffset);
-  IO.mapRequired("Name", Method.Name);
-}
-
-void MappingTraits<OverloadedMethodRecord>::mapping(
-    IO &IO, OverloadedMethodRecord &Method) {
-  IO.mapRequired("NumOverloads", Method.NumOverloads);
-  IO.mapRequired("MethodList", Method.MethodList);
-  IO.mapRequired("Name", Method.Name);
-}
-
-void MappingTraits<DataMemberRecord>::mapping(IO &IO, DataMemberRecord &Field) {
-  IO.mapRequired("Attrs", Field.Attrs.Attrs);
-  IO.mapRequired("Type", Field.Type);
-  IO.mapRequired("FieldOffset", Field.FieldOffset);
-  IO.mapRequired("Name", Field.Name);
-}
-
-void MappingTraits<StaticDataMemberRecord>::mapping(
-    IO &IO, StaticDataMemberRecord &Field) {
-  IO.mapRequired("Attrs", Field.Attrs.Attrs);
-  IO.mapRequired("Type", Field.Type);
-  IO.mapRequired("Name", Field.Name);
-}
-
-void MappingTraits<VFPtrRecord>::mapping(IO &IO, VFPtrRecord &VFTable) {
-  IO.mapRequired("Type", VFTable.Type);
-}
-
-void MappingTraits<EnumeratorRecord>::mapping(IO &IO, EnumeratorRecord &Enum) {
-  IO.mapRequired("Attrs", Enum.Attrs.Attrs);
-  IO.mapRequired("Value", Enum.Value);
-  IO.mapRequired("Name", Enum.Name);
-}
-
-void MappingTraits<BaseClassRecord>::mapping(IO &IO, BaseClassRecord &Base) {
-  IO.mapRequired("Attrs", Base.Attrs.Attrs);
-  IO.mapRequired("Type", Base.Type);
-  IO.mapRequired("Offset", Base.Offset);
-}
-
-void MappingTraits<VirtualBaseClassRecord>::mapping(
-    IO &IO, VirtualBaseClassRecord &Base) {
-  IO.mapRequired("Attrs", Base.Attrs.Attrs);
-  IO.mapRequired("BaseType", Base.BaseType);
-  IO.mapRequired("VBPtrType", Base.VBPtrType);
-  IO.mapRequired("VBPtrOffset", Base.VBPtrOffset);
-  IO.mapRequired("VTableIndex", Base.VTableIndex);
-}
-
-void MappingTraits<ListContinuationRecord>::mapping(
-    IO &IO, ListContinuationRecord &Cont) {
-  IO.mapRequired("ContinuationIndex", Cont.ContinuationIndex);
-}
-
-void ScalarTraits<codeview::TypeIndex>::output(const codeview::TypeIndex &S,
-                                               void *, llvm::raw_ostream &OS) {
-  OS << S.getIndex();
-}
-StringRef ScalarTraits<codeview::TypeIndex>::input(StringRef Scalar, void *Ctx,
-                                                   codeview::TypeIndex &S) {
-  uint32_t I;
-  StringRef Result = ScalarTraits<uint32_t>::input(Scalar, Ctx, I);
-  if (!Result.empty())
-    return Result;
-  S = TypeIndex(I);
-  return "";
-}
-bool ScalarTraits<codeview::TypeIndex>::mustQuote(StringRef Scalar) {
-  return false;
-}
-
-void ScalarEnumerationTraits<TypeLeafKind>::enumeration(IO &io,
-                                                        TypeLeafKind &Value) {
-  auto TypeLeafNames = getTypeLeafNames();
-  for (const auto &E : TypeLeafNames)
-    io.enumCase(Value, E.Name.str().c_str(), E.Value);
-}
-}
-}
-
-Error llvm::codeview::yaml::YamlTypeDumperCallbacks::visitTypeBegin(
-    CVType &CVR) {
-  YamlIO.mapRequired("Kind", CVR.Type);
-  return Error::success();
-}
-
-Error llvm::codeview::yaml::YamlTypeDumperCallbacks::visitMemberBegin(
-    CVMemberRecord &Record) {
-  YamlIO.mapRequired("Kind", Record.Kind);
-  return Error::success();
-}
-
-void llvm::codeview::yaml::YamlTypeDumperCallbacks::visitKnownRecordImpl(
-    const char *Name, CVType &CVR, FieldListRecord &FieldList) {
-  std::vector<llvm::pdb::yaml::PdbTpiFieldListRecord> FieldListRecords;
-  if (YamlIO.outputting()) {
-    // If we are outputting, then `FieldList.Data` contains a huge chunk of data
-    // representing the serialized list of members.  We need to split it up into
-    // individual CVType records where each record represents an individual
-    // member.  This way, we can simply map the entire thing as a Yaml sequence,
-    // which will recurse back to the standard handler for top-level fields
-    // (top-level and member fields all have the exact same Yaml syntax so use
-    // the same parser).
-    FieldListRecordSplitter Splitter(FieldListRecords);
-    consumeError(codeview::visitMemberRecordStream(FieldList.Data, Splitter));
-  }
-  // Note that if we're not outputting (i.e. Yaml -> PDB) the result of this
-  // mapping gets lost, as the records are simply stored in this locally scoped
-  // vector.  What's important though is they are all sharing a single
-  // Serializer
-  // instance (in `Context.ActiveSerializer`), and that is building up a list of
-  // all the types.  The fact that we need a throwaway vector here is just to
-  // appease the YAML API to treat this as a sequence and do this mapping once
-  // for each YAML Sequence element in the input Yaml stream.
-  YamlIO.mapRequired("FieldList", FieldListRecords, Context);
-}
-
-namespace llvm {
-namespace yaml {
-template <>
-struct MappingContextTraits<pdb::yaml::PdbTpiFieldListRecord,
-                            pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, pdb::yaml::PdbTpiFieldListRecord &Obj,
-                      pdb::yaml::SerializationContext &Context) {
-    if (IO.outputting())
-      consumeError(codeview::visitMemberRecord(Obj.Record, Context.Dumper));
-    else {
-      // If we are not outputting, then the array contains no data starting out,
-      // and is instead populated from the sequence represented by the yaml --
-      // again, using the same logic that we use for top-level records.
-      assert(Context.ActiveSerializer && "There is no active serializer!");
-      codeview::TypeVisitorCallbackPipeline Pipeline;
-      pdb::TpiHashUpdater Hasher;
-
-      Pipeline.addCallbackToPipeline(Context.Dumper);
-      Pipeline.addCallbackToPipeline(*Context.ActiveSerializer);
-      Pipeline.addCallbackToPipeline(Hasher);
-      consumeError(
-          codeview::visitMemberRecord(Obj.Record, Pipeline, VDS_BytesExternal));
-    }
-  }
-};
-}
-}

Removed: llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.h?rev=304247&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/YamlTypeDumper.h (removed)
@@ -1,116 +0,0 @@
-//===- YamlTypeDumper.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_TOOLS_LLVMPDBDUMP_YAMLTYPEDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_YAMLTYPEDUMPER_H
-
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
-#include "llvm/Support/YAMLTraits.h"
-
-namespace llvm {
-namespace pdb {
-namespace yaml {
-struct SerializationContext;
-}
-}
-namespace codeview {
-namespace yaml {
-class YamlTypeDumperCallbacks : public TypeVisitorCallbacks {
-public:
-  YamlTypeDumperCallbacks(llvm::yaml::IO &IO,
-                          llvm::pdb::yaml::SerializationContext &Context)
-      : YamlIO(IO), Context(Context) {}
-
-  virtual Error visitTypeBegin(CVType &Record) override;
-  virtual Error visitMemberBegin(CVMemberRecord &Record) override;
-
-#define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
-  Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, Name##Record &Record)    \
-      override {                                                               \
-    visitKnownRecordImpl(#Name, CVR, Record);                                  \
-    return Error::success();                                                   \
-  }
-#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
-  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
-    visitKnownMemberImpl(#Name, Record);                                       \
-    return Error::success();                                                   \
-  }
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
-
-private:
-  template <typename T> void visitKnownMemberImpl(const char *Name, T &Record) {
-    YamlIO.mapRequired(Name, Record);
-  }
-
-  template <typename T>
-  void visitKnownRecordImpl(const char *Name, CVType &Type, T &Record) {
-    YamlIO.mapRequired(Name, Record);
-  }
-
-  void visitKnownRecordImpl(const char *Name, CVType &CVR,
-                            FieldListRecord &FieldList);
-
-  llvm::yaml::IO &YamlIO;
-  llvm::pdb::yaml::SerializationContext &Context;
-};
-}
-}
-namespace pdb {
-namespace yaml {
-struct SerializationContext;
-}
-}
-}
-
-namespace llvm {
-namespace yaml {
-
-template <> struct ScalarTraits<APSInt> {
-  static void output(const APSInt &S, void *, llvm::raw_ostream &OS);
-  static StringRef input(StringRef Scalar, void *Ctx, APSInt &S);
-  static bool mustQuote(StringRef Scalar);
-};
-
-template <> struct ScalarTraits<codeview::TypeIndex> {
-  static void output(const codeview::TypeIndex &S, void *,
-                     llvm::raw_ostream &OS);
-  static StringRef input(StringRef Scalar, void *Ctx, codeview::TypeIndex &S);
-  static bool mustQuote(StringRef Scalar);
-};
-
-template <> struct MappingTraits<codeview::MemberPointerInfo> {
-  static void mapping(IO &IO, codeview::MemberPointerInfo &Obj);
-};
-
-template <>
-struct MappingContextTraits<codeview::CVType, pdb::yaml::SerializationContext> {
-  static void mapping(IO &IO, codeview::CVType &Obj,
-                      pdb::yaml::SerializationContext &Context);
-};
-
-template <> struct ScalarEnumerationTraits<codeview::TypeLeafKind> {
-  static void enumeration(IO &io, codeview::TypeLeafKind &Value);
-};
-
-#define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
-  template <> struct MappingTraits<codeview::Name##Record> {                   \
-    static void mapping(IO &IO, codeview::Name##Record &Obj);                  \
-  };
-#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
-  TYPE_RECORD(EnumName, EnumVal, Name)
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/TypeRecords.def"
-}
-}
-
-#endif

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=304248&r1=304247&r2=304248&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Tue May 30 16:53:05 2017
@@ -61,6 +61,7 @@
 #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
 #include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
+#include "llvm/ObjectYAML/CodeViewYAML.h"
 #include "llvm/Support/BinaryByteStream.h"
 #include "llvm/Support/COM.h"
 #include "llvm/Support/CommandLine.h"
@@ -476,6 +477,7 @@ static void yamlToPdb(StringRef Path) {
   std::unique_ptr<MemoryBuffer> &Buffer = ErrorOrBuffer.get();
 
   llvm::yaml::Input In(Buffer->getBuffer());
+  In.setContext(&Allocator);
   pdb::yaml::PdbObject YamlObj(Allocator);
   In >> YamlObj;
 
@@ -584,7 +586,7 @@ static void yamlToPdb(StringRef Path) {
         auto Inlinees = llvm::make_unique<DebugInlineeLinesSubsection>(
             ChecksumRef, Inlinee.HasExtraFiles);
         for (const auto &Site : Inlinee.Sites) {
-          Inlinees->addInlineSite(Site.Inlinee, Site.FileName,
+          Inlinees->addInlineSite(TypeIndex(Site.Inlinee), Site.FileName,
                                   Site.SourceLineNum);
           if (!Inlinee.HasExtraFiles)
             continue;
@@ -601,14 +603,18 @@ static void yamlToPdb(StringRef Path) {
   auto &TpiBuilder = Builder.getTpiBuilder();
   const auto &Tpi = YamlObj.TpiStream.getValueOr(DefaultTpiStream);
   TpiBuilder.setVersionHeader(Tpi.Version);
-  for (const auto &R : Tpi.Records)
-    TpiBuilder.addTypeRecord(R.Record.data(), R.Record.Hash);
+  for (const auto &R : Tpi.Records) {
+    CVType Type = R.toCodeViewRecord(Allocator);
+    TpiBuilder.addTypeRecord(Type.RecordData, None);
+  }
 
   const auto &Ipi = YamlObj.IpiStream.getValueOr(DefaultIpiStream);
   auto &IpiBuilder = Builder.getIpiBuilder();
   IpiBuilder.setVersionHeader(Ipi.Version);
-  for (const auto &R : Ipi.Records)
-    IpiBuilder.addTypeRecord(R.Record.data(), R.Record.Hash);
+  for (const auto &R : Ipi.Records) {
+    CVType Type = R.toCodeViewRecord(Allocator);
+    IpiBuilder.addTypeRecord(Type.RecordData, None);
+  }
 
   ExitOnErr(Builder.commit(opts::yaml2pdb::YamlPdbOutputFile));
 }




More information about the llvm-commits mailing list