diff --git a/llvm/include/llvm/DebugInfo/CodeView/CVLeafTypes.def b/llvm/include/llvm/DebugInfo/CodeView/CVLeafTypes.def index 164a2df3cd0a..5e79d29f665b 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/CVLeafTypes.def +++ b/llvm/include/llvm/DebugInfo/CodeView/CVLeafTypes.def @@ -15,6 +15,11 @@ #define LEAF_TYPE(ename, value) #endif +// If the type is known, then we have a record describing it in TypeRecord.h. +#ifndef KNOWN_TYPE +#define KNOWN_TYPE(ename, value, class_name) LEAF_TYPE(ename, value) +#endif + // 16 bit type records. LEAF_TYPE(LF_MODIFIER_16t, 0x0001) LEAF_TYPE(LF_POINTER_16t, 0x0002) @@ -78,8 +83,8 @@ LEAF_TYPE(LF_CLASS_ST, 0x1004) LEAF_TYPE(LF_STRUCTURE_ST, 0x1005) LEAF_TYPE(LF_UNION_ST, 0x1006) LEAF_TYPE(LF_ENUM_ST, 0x1007) -LEAF_TYPE(LF_PROCEDURE, 0x1008) -LEAF_TYPE(LF_MFUNCTION, 0x1009) +KNOWN_TYPE(LF_PROCEDURE, 0x1008, ProcedureType) +KNOWN_TYPE(LF_MFUNCTION, 0x1009, MemberFunctionType) LEAF_TYPE(LF_COBOL0, 0x100a) LEAF_TYPE(LF_BARRAY, 0x100b) LEAF_TYPE(LF_DIMARRAY_ST, 0x100c) @@ -90,12 +95,12 @@ LEAF_TYPE(LF_ALIAS_ST, 0x1010) LEAF_TYPE(LF_OEM2, 0x1011) LEAF_TYPE(LF_SKIP, 0x1200) -LEAF_TYPE(LF_ARGLIST, 0x1201) +KNOWN_TYPE(LF_ARGLIST, 0x1201, ArgList) LEAF_TYPE(LF_DEFARG_ST, 0x1202) LEAF_TYPE(LF_FIELDLIST, 0x1203) LEAF_TYPE(LF_DERIVED, 0x1204) LEAF_TYPE(LF_BITFIELD, 0x1205) -LEAF_TYPE(LF_METHODLIST, 0x1206) +KNOWN_TYPE(LF_METHODLIST, 0x1206, MethodListEntry) LEAF_TYPE(LF_DIMCONU, 0x1207) LEAF_TYPE(LF_DIMCONLU, 0x1208) LEAF_TYPE(LF_DIMVARU, 0x1209) @@ -103,16 +108,16 @@ LEAF_TYPE(LF_DIMVARLU, 0x120a) // Member type records. These are generally not length prefixed, and appear // inside of a field list record. -LEAF_TYPE(LF_BCLASS, 0x1400) -LEAF_TYPE(LF_VBCLASS, 0x1401) -LEAF_TYPE(LF_IVBCLASS, 0x1402) +KNOWN_TYPE(LF_BCLASS, 0x1400, BaseClass) +KNOWN_TYPE(LF_VBCLASS, 0x1401, VirtualBaseClass) +KNOWN_TYPE(LF_IVBCLASS, 0x1402, VirtualBaseClass) LEAF_TYPE(LF_FRIENDFCN_ST, 0x1403) LEAF_TYPE(LF_INDEX, 0x1404) LEAF_TYPE(LF_MEMBER_ST, 0x1405) LEAF_TYPE(LF_STMEMBER_ST, 0x1406) LEAF_TYPE(LF_METHOD_ST, 0x1407) LEAF_TYPE(LF_NESTTYPE_ST, 0x1408) -LEAF_TYPE(LF_VFUNCTAB, 0x1409) +KNOWN_TYPE(LF_VFUNCTAB, 0x1409, VirtualFunctionPointer) LEAF_TYPE(LF_FRIENDCLS, 0x140a) LEAF_TYPE(LF_ONEMETHOD_ST, 0x140b) LEAF_TYPE(LF_VFUNCOFF, 0x140c) @@ -122,43 +127,43 @@ LEAF_TYPE(LF_MANAGED_ST, 0x140f) LEAF_TYPE(LF_ST_MAX, 0x1500) LEAF_TYPE(LF_TYPESERVER, 0x1501) -LEAF_TYPE(LF_ENUMERATE, 0x1502) -LEAF_TYPE(LF_ARRAY, 0x1503) -LEAF_TYPE(LF_CLASS, 0x1504) -LEAF_TYPE(LF_STRUCTURE, 0x1505) -LEAF_TYPE(LF_UNION, 0x1506) -LEAF_TYPE(LF_ENUM, 0x1507) +KNOWN_TYPE(LF_ENUMERATE, 0x1502, Enumerator) +KNOWN_TYPE(LF_ARRAY, 0x1503, ArrayType) +KNOWN_TYPE(LF_CLASS, 0x1504, ClassType) +KNOWN_TYPE(LF_STRUCTURE, 0x1505, ClassType) +KNOWN_TYPE(LF_UNION, 0x1506, UnionType) +KNOWN_TYPE(LF_ENUM, 0x1507, EnumType) LEAF_TYPE(LF_DIMARRAY, 0x1508) LEAF_TYPE(LF_PRECOMP, 0x1509) LEAF_TYPE(LF_ALIAS, 0x150a) LEAF_TYPE(LF_DEFARG, 0x150b) LEAF_TYPE(LF_FRIENDFCN, 0x150c) -LEAF_TYPE(LF_MEMBER, 0x150d) -LEAF_TYPE(LF_STMEMBER, 0x150e) -LEAF_TYPE(LF_METHOD, 0x150f) -LEAF_TYPE(LF_NESTTYPE, 0x1510) -LEAF_TYPE(LF_ONEMETHOD, 0x1511) +KNOWN_TYPE(LF_MEMBER, 0x150d, DataMember) +KNOWN_TYPE(LF_STMEMBER, 0x150e, StaticDataMember) +KNOWN_TYPE(LF_METHOD, 0x150f, OverloadedMethod) +KNOWN_TYPE(LF_NESTTYPE, 0x1510, NestedType) +KNOWN_TYPE(LF_ONEMETHOD, 0x1511, OneMethod) LEAF_TYPE(LF_NESTTYPEEX, 0x1512) LEAF_TYPE(LF_MEMBERMODIFY, 0x1513) LEAF_TYPE(LF_MANAGED, 0x1514) -LEAF_TYPE(LF_TYPESERVER2, 0x1515) +KNOWN_TYPE(LF_TYPESERVER2, 0x1515, TypeServer2) LEAF_TYPE(LF_STRIDED_ARRAY, 0x1516) LEAF_TYPE(LF_HLSL, 0x1517) LEAF_TYPE(LF_MODIFIER_EX, 0x1518) -LEAF_TYPE(LF_INTERFACE, 0x1519) -LEAF_TYPE(LF_BINTERFACE, 0x151a) +KNOWN_TYPE(LF_INTERFACE, 0x1519, ClassType) +KNOWN_TYPE(LF_BINTERFACE, 0x151a, BaseClass) LEAF_TYPE(LF_VECTOR, 0x151b) LEAF_TYPE(LF_MATRIX, 0x151c) -LEAF_TYPE(LF_VFTABLE, 0x151d) +KNOWN_TYPE(LF_VFTABLE, 0x151d, VFTableType) // ID leaf records. Subsequent leaf types may be referenced from .debug$S. -LEAF_TYPE(LF_FUNC_ID, 0x1601) -LEAF_TYPE(LF_MFUNC_ID, 0x1602) -LEAF_TYPE(LF_BUILDINFO, 0x1603) -LEAF_TYPE(LF_SUBSTR_LIST, 0x1604) -LEAF_TYPE(LF_STRING_ID, 0x1605) -LEAF_TYPE(LF_UDT_SRC_LINE, 0x1606) +KNOWN_TYPE(LF_FUNC_ID, 0x1601, FuncId) +KNOWN_TYPE(LF_MFUNC_ID, 0x1602, MemberFuncId) +KNOWN_TYPE(LF_BUILDINFO, 0x1603, BuildInfo) +KNOWN_TYPE(LF_SUBSTR_LIST, 0x1604, ArgList) +KNOWN_TYPE(LF_STRING_ID, 0x1605, StringId) +KNOWN_TYPE(LF_UDT_SRC_LINE, 0x1606, UDTSrcLine) LEAF_TYPE(LF_UDT_MOD_SRC_LINE, 0x1607) // Numeric leaf types. These are generally contained in other records, and not @@ -208,4 +213,5 @@ LEAF_TYPE(LF_PAD13, 0xfd) LEAF_TYPE(LF_PAD14, 0xfe) LEAF_TYPE(LF_PAD15, 0xff) +#undef KNOWN_TYPE #undef LEAF_TYPE diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 48e8178788b7..e8acc1acea72 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -1955,29 +1955,11 @@ void COFFDumper::printFileNameForOffset(StringRef Label, uint32_t FileOffset) { static StringRef getLeafTypeName(TypeLeafKind LT) { switch (LT) { - case LF_STRING_ID: return "StringId"; - case LF_FIELDLIST: return "FieldList"; - case LF_ARGLIST: - case LF_SUBSTR_LIST: return "ArgList"; - case LF_CLASS: - case LF_STRUCTURE: - case LF_INTERFACE: return "ClassType"; - case LF_UNION: return "UnionType"; - case LF_ENUM: return "EnumType"; - case LF_ARRAY: return "ArrayType"; - case LF_VFTABLE: return "VFTableType"; - case LF_MFUNC_ID: return "MemberFuncId"; - case LF_PROCEDURE: return "ProcedureType"; - case LF_MFUNCTION: return "MemberFunctionType"; - case LF_METHODLIST: return "MethodListEntry"; - case LF_FUNC_ID: return "FuncId"; - case LF_TYPESERVER2: return "TypeServer2"; - case LF_POINTER: return "PointerType"; - case LF_MODIFIER: return "TypeModifier"; - case LF_VTSHAPE: return "VTableShape"; - case LF_UDT_SRC_LINE: return "UDTSrcLine"; - case LF_BUILDINFO: return "BuildInfo"; - default: break; +#define KNOWN_TYPE(LeafName, Value, ClassName) \ + case LeafName: return #ClassName; +#include "llvm/DebugInfo/CodeView/CVLeafTypes.def" + default: + break; } return "UnknownLeaf"; }