diff options
Diffstat (limited to 'llvm/tools/llvm-readobj')
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 29 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/CVLeafTypes.def | 211 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/CVSymbolTypes.def | 237 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/CodeView.h | 228 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/StreamWriter.h | 6 |
5 files changed, 25 insertions, 686 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 13e03bf78dd..94dc9042338 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -24,6 +24,10 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" +#include "llvm/DebugInfo/CodeView/CodeView.h" +#include "llvm/DebugInfo/CodeView/TypeIndex.h" +#include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/CodeView/SymbolRecord.h" #include "llvm/Object/COFF.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/COFF.h" @@ -42,6 +46,7 @@ using namespace llvm; using namespace llvm::object; using namespace llvm::codeview; +using namespace llvm::support; using namespace llvm::Win64EH; namespace { @@ -608,9 +613,9 @@ static const EnumEntry<SimpleTypeKind> SimpleTypeNames[] = { {"__bool64*", SimpleTypeKind::Boolean64}, }; -static const EnumEntry<LeafType> LeafTypeNames[] = { -#define LEAF_TYPE(name, val) LLVM_READOBJ_ENUM_ENT(LeafType, name), -#include "CVLeafTypes.def" +static const EnumEntry<TypeLeafKind> LeafTypeNames[] = { +#define LEAF_TYPE(name, val) LLVM_READOBJ_ENUM_ENT(TypeLeafKind, name), +#include "llvm/DebugInfo/CodeView/CVLeafTypes.def" }; static const EnumEntry<uint8_t> PtrKindNames[] = { @@ -1205,8 +1210,8 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, Data = Data.drop_front(Rec->RecordLength - 2); - SymType Type = static_cast<SymType>(uint16_t(Rec->RecordType)); - switch (Type) { + SymbolRecordKind Kind = Rec->getKind(); + switch (Kind) { case S_LPROC32: case S_GPROC32: case S_GPROC32_ID: @@ -1555,7 +1560,7 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, default: { DictScope S(W, "UnknownSym"); - W.printHex("Type", unsigned(Type)); + W.printHex("Kind", unsigned(Kind)); W.printHex("Size", Rec->RecordLength); W.printBinaryBlock("SymData", SymData); break; @@ -1564,7 +1569,7 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, } } -StringRef getRemainingTypeBytes(const TypeRecord *Rec, const char *Start) { +StringRef getRemainingTypeBytes(const TypeRecordPrefix *Rec, const char *Start) { ptrdiff_t StartOffset = Start - reinterpret_cast<const char *>(Rec); size_t RecSize = Rec->Len + 2; assert(StartOffset >= 0 && "negative start-offset!"); @@ -1573,7 +1578,7 @@ StringRef getRemainingTypeBytes(const TypeRecord *Rec, const char *Start) { return StringRef(Start, RecSize - StartOffset); } -StringRef getRemainingBytesAsString(const TypeRecord *Rec, const char *Start) { +StringRef getRemainingBytesAsString(const TypeRecordPrefix *Rec, const char *Start) { StringRef Remaining = getRemainingTypeBytes(Rec, Start); StringRef Leading, Trailing; std::tie(Leading, Trailing) = Remaining.split('\0'); @@ -1617,7 +1622,7 @@ void COFFDumper::printTypeIndex(StringRef FieldName, TypeIndex TI) { W.printHex(FieldName, TI.getIndex()); } -static StringRef getLeafTypeName(LeafType LT) { +static StringRef getLeafTypeName(TypeLeafKind LT) { switch (LT) { case LF_STRING_ID: return "StringId"; case LF_FIELDLIST: return "FieldList"; @@ -1660,9 +1665,9 @@ void COFFDumper::printCodeViewTypeSection(StringRef SectionName, Data = Data.drop_front(4); while (!Data.empty()) { - const TypeRecord *Rec; + const TypeRecordPrefix *Rec; error(consumeObject(Data, Rec)); - auto Leaf = static_cast<LeafType>(uint16_t(Rec->Leaf)); + auto Leaf = static_cast<TypeLeafKind>(uint16_t(Rec->Leaf)); // This record is 'Len - 2' bytes, and the next one starts immediately // afterwards. @@ -1673,7 +1678,7 @@ void COFFDumper::printCodeViewTypeSection(StringRef SectionName, StringRef LeafName = getLeafTypeName(Leaf); DictScope S(W, LeafName); unsigned NextTypeIndex = 0x1000 + CVUDTNames.size(); - W.printEnum("LeafType", unsigned(Leaf), makeArrayRef(LeafTypeNames)); + W.printEnum("TypeLeafKind", unsigned(Leaf), makeArrayRef(LeafTypeNames)); W.printHex("TypeIndex", NextTypeIndex); // Fill this in inside the switch to get something in CVUDTNames. diff --git a/llvm/tools/llvm-readobj/CVLeafTypes.def b/llvm/tools/llvm-readobj/CVLeafTypes.def deleted file mode 100644 index 164a2df3cd0..00000000000 --- a/llvm/tools/llvm-readobj/CVLeafTypes.def +++ /dev/null @@ -1,211 +0,0 @@ -//===-- CVLeafTypes.def - All CodeView leaf types ---------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// See LEAF_ENUM_e in cvinfo.h. This should match the constants there. -// -//===----------------------------------------------------------------------===// - -#ifndef LEAF_TYPE -#define LEAF_TYPE(ename, value) -#endif - -// 16 bit type records. -LEAF_TYPE(LF_MODIFIER_16t, 0x0001) -LEAF_TYPE(LF_POINTER_16t, 0x0002) -LEAF_TYPE(LF_ARRAY_16t, 0x0003) -LEAF_TYPE(LF_CLASS_16t, 0x0004) -LEAF_TYPE(LF_STRUCTURE_16t, 0x0005) -LEAF_TYPE(LF_UNION_16t, 0x0006) -LEAF_TYPE(LF_ENUM_16t, 0x0007) -LEAF_TYPE(LF_PROCEDURE_16t, 0x0008) -LEAF_TYPE(LF_MFUNCTION_16t, 0x0009) -LEAF_TYPE(LF_VTSHAPE, 0x000a) -LEAF_TYPE(LF_COBOL0_16t, 0x000b) -LEAF_TYPE(LF_COBOL1, 0x000c) -LEAF_TYPE(LF_BARRAY_16t, 0x000d) -LEAF_TYPE(LF_LABEL, 0x000e) -LEAF_TYPE(LF_NULLLEAF, 0x000f) // LF_NULL -LEAF_TYPE(LF_NOTTRAN, 0x0010) -LEAF_TYPE(LF_DIMARRAY_16t, 0x0011) -LEAF_TYPE(LF_VFTPATH_16t, 0x0012) -LEAF_TYPE(LF_PRECOMP_16t, 0x0013) -LEAF_TYPE(LF_ENDPRECOMP, 0x0014) -LEAF_TYPE(LF_OEM_16t, 0x0015) -LEAF_TYPE(LF_TYPESERVER_ST, 0x0016) - -LEAF_TYPE(LF_SKIP_16t, 0x0200) -LEAF_TYPE(LF_ARGLIST_16t, 0x0201) -LEAF_TYPE(LF_DEFARG_16t, 0x0202) -LEAF_TYPE(LF_LIST, 0x0203) -LEAF_TYPE(LF_FIELDLIST_16t, 0x0204) -LEAF_TYPE(LF_DERIVED_16t, 0x0205) -LEAF_TYPE(LF_BITFIELD_16t, 0x0206) -LEAF_TYPE(LF_METHODLIST_16t, 0x0207) -LEAF_TYPE(LF_DIMCONU_16t, 0x0208) -LEAF_TYPE(LF_DIMCONLU_16t, 0x0209) -LEAF_TYPE(LF_DIMVARU_16t, 0x020a) -LEAF_TYPE(LF_DIMVARLU_16t, 0x020b) -LEAF_TYPE(LF_REFSYM, 0x020c) - -// 16 bit member types. Generally not length prefixed. -LEAF_TYPE(LF_BCLASS_16t, 0x0400) -LEAF_TYPE(LF_VBCLASS_16t, 0x0401) -LEAF_TYPE(LF_IVBCLASS_16t, 0x0402) -LEAF_TYPE(LF_ENUMERATE_ST, 0x0403) -LEAF_TYPE(LF_FRIENDFCN_16t, 0x0404) -LEAF_TYPE(LF_INDEX_16t, 0x0405) -LEAF_TYPE(LF_MEMBER_16t, 0x0406) -LEAF_TYPE(LF_STMEMBER_16t, 0x0407) -LEAF_TYPE(LF_METHOD_16t, 0x0408) -LEAF_TYPE(LF_NESTTYPE_16t, 0x0409) -LEAF_TYPE(LF_VFUNCTAB_16t, 0x040a) -LEAF_TYPE(LF_FRIENDCLS_16t, 0x040b) -LEAF_TYPE(LF_ONEMETHOD_16t, 0x040c) -LEAF_TYPE(LF_VFUNCOFF_16t, 0x040d) - -LEAF_TYPE(LF_TI16_MAX, 0x1000) - -LEAF_TYPE(LF_MODIFIER, 0x1001) -LEAF_TYPE(LF_POINTER, 0x1002) -LEAF_TYPE(LF_ARRAY_ST, 0x1003) -LEAF_TYPE(LF_CLASS_ST, 0x1004) -LEAF_TYPE(LF_STRUCTURE_ST, 0x1005) -LEAF_TYPE(LF_UNION_ST, 0x1006) -LEAF_TYPE(LF_ENUM_ST, 0x1007) -LEAF_TYPE(LF_PROCEDURE, 0x1008) -LEAF_TYPE(LF_MFUNCTION, 0x1009) -LEAF_TYPE(LF_COBOL0, 0x100a) -LEAF_TYPE(LF_BARRAY, 0x100b) -LEAF_TYPE(LF_DIMARRAY_ST, 0x100c) -LEAF_TYPE(LF_VFTPATH, 0x100d) -LEAF_TYPE(LF_PRECOMP_ST, 0x100e) -LEAF_TYPE(LF_OEM, 0x100f) -LEAF_TYPE(LF_ALIAS_ST, 0x1010) -LEAF_TYPE(LF_OEM2, 0x1011) - -LEAF_TYPE(LF_SKIP, 0x1200) -LEAF_TYPE(LF_ARGLIST, 0x1201) -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) -LEAF_TYPE(LF_DIMCONU, 0x1207) -LEAF_TYPE(LF_DIMCONLU, 0x1208) -LEAF_TYPE(LF_DIMVARU, 0x1209) -LEAF_TYPE(LF_DIMVARLU, 0x120a) - -// Member type records. These are generally not length prefixed, and appear -// inside of a field list record. -LEAF_TYPE(LF_BCLASS, 0x1400) -LEAF_TYPE(LF_VBCLASS, 0x1401) -LEAF_TYPE(LF_IVBCLASS, 0x1402) -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) -LEAF_TYPE(LF_FRIENDCLS, 0x140a) -LEAF_TYPE(LF_ONEMETHOD_ST, 0x140b) -LEAF_TYPE(LF_VFUNCOFF, 0x140c) -LEAF_TYPE(LF_NESTTYPEEX_ST, 0x140d) -LEAF_TYPE(LF_MEMBERMODIFY_ST, 0x140e) -LEAF_TYPE(LF_MANAGED_ST, 0x140f) - -LEAF_TYPE(LF_ST_MAX, 0x1500) -LEAF_TYPE(LF_TYPESERVER, 0x1501) -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) -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) -LEAF_TYPE(LF_NESTTYPEEX, 0x1512) -LEAF_TYPE(LF_MEMBERMODIFY, 0x1513) -LEAF_TYPE(LF_MANAGED, 0x1514) -LEAF_TYPE(LF_TYPESERVER2, 0x1515) -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) -LEAF_TYPE(LF_VECTOR, 0x151b) -LEAF_TYPE(LF_MATRIX, 0x151c) -LEAF_TYPE(LF_VFTABLE, 0x151d) - -// 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) -LEAF_TYPE(LF_UDT_MOD_SRC_LINE, 0x1607) - -// Numeric leaf types. These are generally contained in other records, and not -// encountered in the main type stream. - -LEAF_TYPE(LF_NUMERIC, 0x8000) -LEAF_TYPE(LF_CHAR, 0x8000) -LEAF_TYPE(LF_SHORT, 0x8001) -LEAF_TYPE(LF_USHORT, 0x8002) -LEAF_TYPE(LF_LONG, 0x8003) -LEAF_TYPE(LF_ULONG, 0x8004) -LEAF_TYPE(LF_REAL32, 0x8005) -LEAF_TYPE(LF_REAL64, 0x8006) -LEAF_TYPE(LF_REAL80, 0x8007) -LEAF_TYPE(LF_REAL128, 0x8008) -LEAF_TYPE(LF_QUADWORD, 0x8009) -LEAF_TYPE(LF_UQUADWORD, 0x800a) -LEAF_TYPE(LF_REAL48, 0x800b) -LEAF_TYPE(LF_COMPLEX32, 0x800c) -LEAF_TYPE(LF_COMPLEX64, 0x800d) -LEAF_TYPE(LF_COMPLEX80, 0x800e) -LEAF_TYPE(LF_COMPLEX128, 0x800f) -LEAF_TYPE(LF_VARSTRING, 0x8010) -LEAF_TYPE(LF_OCTWORD, 0x8017) -LEAF_TYPE(LF_UOCTWORD, 0x8018) -LEAF_TYPE(LF_DECIMAL, 0x8019) -LEAF_TYPE(LF_DATE, 0x801a) -LEAF_TYPE(LF_UTF8STRING, 0x801b) -LEAF_TYPE(LF_REAL16, 0x801c) - -// Padding bytes. These are emitted into alignment bytes in the type stream. - -LEAF_TYPE(LF_PAD0, 0xf0) -LEAF_TYPE(LF_PAD1, 0xf1) -LEAF_TYPE(LF_PAD2, 0xf2) -LEAF_TYPE(LF_PAD3, 0xf3) -LEAF_TYPE(LF_PAD4, 0xf4) -LEAF_TYPE(LF_PAD5, 0xf5) -LEAF_TYPE(LF_PAD6, 0xf6) -LEAF_TYPE(LF_PAD7, 0xf7) -LEAF_TYPE(LF_PAD8, 0xf8) -LEAF_TYPE(LF_PAD9, 0xf9) -LEAF_TYPE(LF_PAD10, 0xfa) -LEAF_TYPE(LF_PAD11, 0xfb) -LEAF_TYPE(LF_PAD12, 0xfc) -LEAF_TYPE(LF_PAD13, 0xfd) -LEAF_TYPE(LF_PAD14, 0xfe) -LEAF_TYPE(LF_PAD15, 0xff) - -#undef LEAF_TYPE diff --git a/llvm/tools/llvm-readobj/CVSymbolTypes.def b/llvm/tools/llvm-readobj/CVSymbolTypes.def deleted file mode 100644 index 3807938ef21..00000000000 --- a/llvm/tools/llvm-readobj/CVSymbolTypes.def +++ /dev/null @@ -1,237 +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 SYMBOL_TYPE -#define SYMBOL_TYPE(ename, value) -#endif - -// 16 bit symbol types. Not very useful, provided only for reference. -SYMBOL_TYPE(S_COMPILE , 0x0001) -SYMBOL_TYPE(S_REGISTER_16t , 0x0002) -SYMBOL_TYPE(S_CONSTANT_16t , 0x0003) -SYMBOL_TYPE(S_UDT_16t , 0x0004) -SYMBOL_TYPE(S_SSEARCH , 0x0005) -SYMBOL_TYPE(S_END , 0x0006) -SYMBOL_TYPE(S_SKIP , 0x0007) -SYMBOL_TYPE(S_CVRESERVE , 0x0008) -SYMBOL_TYPE(S_OBJNAME_ST , 0x0009) -SYMBOL_TYPE(S_ENDARG , 0x000a) -SYMBOL_TYPE(S_COBOLUDT_16t , 0x000b) -SYMBOL_TYPE(S_MANYREG_16t , 0x000c) -SYMBOL_TYPE(S_RETURN , 0x000d) -SYMBOL_TYPE(S_ENTRYTHIS , 0x000e) -SYMBOL_TYPE(S_BPREL16 , 0x0100) -SYMBOL_TYPE(S_LDATA16 , 0x0101) -SYMBOL_TYPE(S_GDATA16 , 0x0102) -SYMBOL_TYPE(S_PUB16 , 0x0103) -SYMBOL_TYPE(S_LPROC16 , 0x0104) -SYMBOL_TYPE(S_GPROC16 , 0x0105) -SYMBOL_TYPE(S_THUNK16 , 0x0106) -SYMBOL_TYPE(S_BLOCK16 , 0x0107) -SYMBOL_TYPE(S_WITH16 , 0x0108) -SYMBOL_TYPE(S_LABEL16 , 0x0109) -SYMBOL_TYPE(S_CEXMODEL16 , 0x010a) -SYMBOL_TYPE(S_VFTABLE16 , 0x010b) -SYMBOL_TYPE(S_REGREL16 , 0x010c) -SYMBOL_TYPE(S_BPREL32_16t , 0x0200) -SYMBOL_TYPE(S_LDATA32_16t , 0x0201) -SYMBOL_TYPE(S_GDATA32_16t , 0x0202) -SYMBOL_TYPE(S_PUB32_16t , 0x0203) -SYMBOL_TYPE(S_LPROC32_16t , 0x0204) -SYMBOL_TYPE(S_GPROC32_16t , 0x0205) -SYMBOL_TYPE(S_THUNK32_ST , 0x0206) -SYMBOL_TYPE(S_BLOCK32_ST , 0x0207) -SYMBOL_TYPE(S_WITH32_ST , 0x0208) -SYMBOL_TYPE(S_LABEL32_ST , 0x0209) -SYMBOL_TYPE(S_CEXMODEL32 , 0x020a) -SYMBOL_TYPE(S_VFTABLE32_16t , 0x020b) -SYMBOL_TYPE(S_REGREL32_16t , 0x020c) -SYMBOL_TYPE(S_LTHREAD32_16t , 0x020d) -SYMBOL_TYPE(S_GTHREAD32_16t , 0x020e) -SYMBOL_TYPE(S_SLINK32 , 0x020f) -SYMBOL_TYPE(S_LPROCMIPS_16t , 0x0300) -SYMBOL_TYPE(S_GPROCMIPS_16t , 0x0301) -SYMBOL_TYPE(S_PROCREF_ST , 0x0400) -SYMBOL_TYPE(S_DATAREF_ST , 0x0401) -SYMBOL_TYPE(S_ALIGN , 0x0402) -SYMBOL_TYPE(S_LPROCREF_ST , 0x0403) -SYMBOL_TYPE(S_OEM , 0x0404) - -// All post 16 bit symbol types have the 0x1000 bit set. -SYMBOL_TYPE(S_TI16_MAX , 0x1000) - -// Mostly unused "start" symbol types. -SYMBOL_TYPE(S_REGISTER_ST , 0x1001) -SYMBOL_TYPE(S_CONSTANT_ST , 0x1002) -SYMBOL_TYPE(S_UDT_ST , 0x1003) -SYMBOL_TYPE(S_COBOLUDT_ST , 0x1004) -SYMBOL_TYPE(S_MANYREG_ST , 0x1005) -SYMBOL_TYPE(S_BPREL32_ST , 0x1006) -SYMBOL_TYPE(S_LDATA32_ST , 0x1007) -SYMBOL_TYPE(S_GDATA32_ST , 0x1008) -SYMBOL_TYPE(S_PUB32_ST , 0x1009) -SYMBOL_TYPE(S_LPROC32_ST , 0x100a) -SYMBOL_TYPE(S_GPROC32_ST , 0x100b) -SYMBOL_TYPE(S_VFTABLE32 , 0x100c) -SYMBOL_TYPE(S_REGREL32_ST , 0x100d) -SYMBOL_TYPE(S_LTHREAD32_ST , 0x100e) -SYMBOL_TYPE(S_GTHREAD32_ST , 0x100f) -SYMBOL_TYPE(S_LPROCMIPS_ST , 0x1010) -SYMBOL_TYPE(S_GPROCMIPS_ST , 0x1011) - -// Information about the frame layout of a procedure. -SYMBOL_TYPE(S_FRAMEPROC , 0x1012) - -SYMBOL_TYPE(S_COMPILE2_ST , 0x1013) -SYMBOL_TYPE(S_MANYREG2_ST , 0x1014) -SYMBOL_TYPE(S_LPROCIA64_ST , 0x1015) -SYMBOL_TYPE(S_GPROCIA64_ST , 0x1016) -SYMBOL_TYPE(S_LOCALSLOT_ST , 0x1017) -SYMBOL_TYPE(S_PARAMSLOT_ST , 0x1018) -SYMBOL_TYPE(S_ANNOTATION , 0x1019) -SYMBOL_TYPE(S_GMANPROC_ST , 0x101a) -SYMBOL_TYPE(S_LMANPROC_ST , 0x101b) -SYMBOL_TYPE(S_RESERVED1 , 0x101c) -SYMBOL_TYPE(S_RESERVED2 , 0x101d) -SYMBOL_TYPE(S_RESERVED3 , 0x101e) -SYMBOL_TYPE(S_RESERVED4 , 0x101f) -SYMBOL_TYPE(S_LMANDATA_ST , 0x1020) -SYMBOL_TYPE(S_GMANDATA_ST , 0x1021) -SYMBOL_TYPE(S_MANFRAMEREL_ST, 0x1022) -SYMBOL_TYPE(S_MANREGISTER_ST, 0x1023) -SYMBOL_TYPE(S_MANSLOT_ST , 0x1024) -SYMBOL_TYPE(S_MANMANYREG_ST , 0x1025) -SYMBOL_TYPE(S_MANREGREL_ST , 0x1026) -SYMBOL_TYPE(S_MANMANYREG2_ST, 0x1027) -SYMBOL_TYPE(S_MANTYPREF , 0x1028) -SYMBOL_TYPE(S_UNAMESPACE_ST , 0x1029) - -// End of S_*_ST symbols, which do not appear to be generated by modern -// compilers. -SYMBOL_TYPE(S_ST_MAX , 0x1100) - -SYMBOL_TYPE(S_OBJNAME , 0x1101) -SYMBOL_TYPE(S_THUNK32 , 0x1102) -SYMBOL_TYPE(S_BLOCK32 , 0x1103) -SYMBOL_TYPE(S_WITH32 , 0x1104) -SYMBOL_TYPE(S_LABEL32 , 0x1105) -SYMBOL_TYPE(S_REGISTER , 0x1106) -SYMBOL_TYPE(S_CONSTANT , 0x1107) -SYMBOL_TYPE(S_UDT , 0x1108) -SYMBOL_TYPE(S_COBOLUDT , 0x1109) -SYMBOL_TYPE(S_MANYREG , 0x110a) -SYMBOL_TYPE(S_BPREL32 , 0x110b) -SYMBOL_TYPE(S_LDATA32 , 0x110c) -SYMBOL_TYPE(S_GDATA32 , 0x110d) -SYMBOL_TYPE(S_PUB32 , 0x110e) -SYMBOL_TYPE(S_LPROC32 , 0x110f) -SYMBOL_TYPE(S_GPROC32 , 0x1110) -SYMBOL_TYPE(S_REGREL32 , 0x1111) -SYMBOL_TYPE(S_LTHREAD32 , 0x1112) -SYMBOL_TYPE(S_GTHREAD32 , 0x1113) -SYMBOL_TYPE(S_LPROCMIPS , 0x1114) -SYMBOL_TYPE(S_GPROCMIPS , 0x1115) -SYMBOL_TYPE(S_COMPILE2 , 0x1116) -SYMBOL_TYPE(S_MANYREG2 , 0x1117) -SYMBOL_TYPE(S_LPROCIA64 , 0x1118) -SYMBOL_TYPE(S_GPROCIA64 , 0x1119) -SYMBOL_TYPE(S_LOCALSLOT , 0x111a) -SYMBOL_TYPE(S_PARAMSLOT , 0x111b) - -// Managed code symbols. -SYMBOL_TYPE(S_LMANDATA , 0x111c) -SYMBOL_TYPE(S_GMANDATA , 0x111d) -SYMBOL_TYPE(S_MANFRAMEREL , 0x111e) -SYMBOL_TYPE(S_MANREGISTER , 0x111f) -SYMBOL_TYPE(S_MANSLOT , 0x1120) -SYMBOL_TYPE(S_MANMANYREG , 0x1121) -SYMBOL_TYPE(S_MANREGREL , 0x1122) -SYMBOL_TYPE(S_MANMANYREG2 , 0x1123) -SYMBOL_TYPE(S_UNAMESPACE , 0x1124) -SYMBOL_TYPE(S_PROCREF , 0x1125) -SYMBOL_TYPE(S_DATAREF , 0x1126) -SYMBOL_TYPE(S_LPROCREF , 0x1127) -SYMBOL_TYPE(S_ANNOTATIONREF , 0x1128) -SYMBOL_TYPE(S_TOKENREF , 0x1129) -SYMBOL_TYPE(S_GMANPROC , 0x112a) -SYMBOL_TYPE(S_LMANPROC , 0x112b) -SYMBOL_TYPE(S_TRAMPOLINE , 0x112c) -SYMBOL_TYPE(S_MANCONSTANT , 0x112d) -SYMBOL_TYPE(S_ATTR_FRAMEREL , 0x112e) -SYMBOL_TYPE(S_ATTR_REGISTER , 0x112f) -SYMBOL_TYPE(S_ATTR_REGREL , 0x1130) -SYMBOL_TYPE(S_ATTR_MANYREG , 0x1131) - - -SYMBOL_TYPE(S_SEPCODE , 0x1132) -SYMBOL_TYPE(S_LOCAL_2005 , 0x1133) -SYMBOL_TYPE(S_DEFRANGE_2005 , 0x1134) -SYMBOL_TYPE(S_DEFRANGE2_2005, 0x1135) -SYMBOL_TYPE(S_SECTION , 0x1136) -SYMBOL_TYPE(S_COFFGROUP , 0x1137) -SYMBOL_TYPE(S_EXPORT , 0x1138) -SYMBOL_TYPE(S_CALLSITEINFO , 0x1139) -SYMBOL_TYPE(S_FRAMECOOKIE , 0x113a) -SYMBOL_TYPE(S_DISCARDED , 0x113b) -SYMBOL_TYPE(S_COMPILE3 , 0x113c) -SYMBOL_TYPE(S_ENVBLOCK , 0x113d) -SYMBOL_TYPE(S_LOCAL , 0x113e) -SYMBOL_TYPE(S_DEFRANGE , 0x113f) -SYMBOL_TYPE(S_DEFRANGE_SUBFIELD, 0x1140) -SYMBOL_TYPE(S_DEFRANGE_REGISTER, 0x1141) -SYMBOL_TYPE(S_DEFRANGE_FRAMEPOINTER_REL, 0x1142) -SYMBOL_TYPE(S_DEFRANGE_SUBFIELD_REGISTER, 0x1143) -SYMBOL_TYPE(S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE, 0x1144) -SYMBOL_TYPE(S_DEFRANGE_REGISTER_REL, 0x1145) - -// Current symbol types for most procedures as of this writing. -SYMBOL_TYPE(S_LPROC32_ID , 0x1146) -SYMBOL_TYPE(S_GPROC32_ID , 0x1147) -SYMBOL_TYPE(S_LPROCMIPS_ID , 0x1148) -SYMBOL_TYPE(S_GPROCMIPS_ID , 0x1149) -SYMBOL_TYPE(S_LPROCIA64_ID , 0x114a) -SYMBOL_TYPE(S_GPROCIA64_ID , 0x114b) - -SYMBOL_TYPE(S_BUILDINFO , 0x114c) - -// Inlined call site delimiters. -SYMBOL_TYPE(S_INLINESITE , 0x114d) -SYMBOL_TYPE(S_INLINESITE_END , 0x114e) - -// Procedure info end delimiter. -SYMBOL_TYPE(S_PROC_ID_END , 0x114f) - -SYMBOL_TYPE(S_DEFRANGE_HLSL , 0x1150) -SYMBOL_TYPE(S_GDATA_HLSL , 0x1151) -SYMBOL_TYPE(S_LDATA_HLSL , 0x1152) -SYMBOL_TYPE(S_FILESTATIC , 0x1153) -SYMBOL_TYPE(S_LOCAL_DPC_GROUPSHARED, 0x1154) -SYMBOL_TYPE(S_LPROC32_DPC , 0x1155) -SYMBOL_TYPE(S_LPROC32_DPC_ID , 0x1156) -SYMBOL_TYPE(S_DEFRANGE_DPC_PTR_TAG, 0x1157) -SYMBOL_TYPE(S_DPC_SYM_TAG_MAP, 0x1158) -SYMBOL_TYPE(S_ARMSWITCHTABLE , 0x1159) -SYMBOL_TYPE(S_CALLEES , 0x115a) -SYMBOL_TYPE(S_CALLERS , 0x115b) -SYMBOL_TYPE(S_POGODATA , 0x115c) -SYMBOL_TYPE(S_INLINESITE2 , 0x115d) -SYMBOL_TYPE(S_HEAPALLOCSITE , 0x115e) -SYMBOL_TYPE(S_MOD_TYPEREF , 0x115f) -SYMBOL_TYPE(S_REF_MINIPDB , 0x1160) -SYMBOL_TYPE(S_PDBMAP , 0x1161) -SYMBOL_TYPE(S_GDATA_HLSL32 , 0x1162) -SYMBOL_TYPE(S_LDATA_HLSL32 , 0x1163) -SYMBOL_TYPE(S_GDATA_HLSL32_EX, 0x1164) -SYMBOL_TYPE(S_LDATA_HLSL32_EX, 0x1165) - -#undef SYMBOL_TYPE diff --git a/llvm/tools/llvm-readobj/CodeView.h b/llvm/tools/llvm-readobj/CodeView.h index 444b2645166..35c91bb4462 100644 --- a/llvm/tools/llvm-readobj/CodeView.h +++ b/llvm/tools/llvm-readobj/CodeView.h @@ -26,220 +26,9 @@ namespace llvm { namespace codeview { -/// A Symbols subsection is a sequence of SymRecords. Advancing by 'len' -/// bytes will find the next SymRecord. These are the possible types of a -/// record. Equivalent to SYM_ENUM_e in cvinfo.h. -enum SymType : uint16_t { -#define SYMBOL_TYPE(ename, value) ename = value, -#include "CVSymbolTypes.def" -}; - -/// Generic record compatible with all symbol records. -struct SymRecord { - ulittle16_t RecordLength; // Record length, starting from the next field - ulittle16_t RecordType; // Record type (SymType) - // Symbol data follows. -}; - -/// Corresponds to the CV_PROCFLAGS bitfield. -enum ProcFlags : uint8_t { - HasFP = 1 << 0, - HasIRET = 1 << 1, - HasFRET = 1 << 2, - IsNoReturn = 1 << 3, - IsUnreachable = 1 << 4, - HasCustomCallingConv = 1 << 5, - IsNoInline = 1 << 6, - HasOptimizedDebugInfo = 1 << 7, -}; - -// S_GPROC32, S_LPROC32, S_GPROC32_ID, S_LPROC32_ID, S_LPROC32_DPC or -// S_LPROC32_DPC_ID -struct ProcSym { - ulittle32_t PtrParent; - ulittle32_t PtrEnd; - ulittle32_t PtrNext; - ulittle32_t CodeSize; - ulittle32_t DbgStart; - ulittle32_t DbgEnd; - TypeIndex FunctionType; - ulittle32_t CodeOffset; - ulittle16_t Segment; - uint8_t Flags; // CV_PROCFLAGS - // Name: The null-terminated name follows. -}; - -// S_INLINESITE -struct InlineSiteSym { - ulittle32_t PtrParent; - ulittle32_t PtrEnd; - TypeIndex Inlinee; - // BinaryAnnotations -}; - -// S_LOCAL -struct LocalSym { - TypeIndex Type; - ulittle16_t Flags; - enum : uint16_t { - IsParameter = 1 << 0, - IsAddressTaken = 1 << 1, - IsCompilerGenerated = 1 << 2, - IsAggregate = 1 << 3, - IsAggregated = 1 << 4, - IsAliased = 1 << 5, - IsAlias = 1 << 6, - IsReturnValue = 1 << 7, - IsOptimizedOut = 1 << 8, - IsEnregisteredGlobal = 1 << 9, - IsEnregisteredStatic = 1 << 10, - }; - // Name: The null-terminated name follows. -}; - -// S_BLOCK32 -struct BlockSym { - ulittle32_t PtrParent; - ulittle32_t PtrEnd; - ulittle32_t CodeSize; - ulittle32_t CodeOffset; - ulittle16_t Segment; - // Name: The null-terminated name follows. -}; - -// S_LABEL32 -struct LabelSym { - ulittle32_t CodeOffset; - ulittle16_t Segment; - uint8_t Flags; // CV_PROCFLAGS - // Name: The null-terminated name follows. -}; - -// S_OBJNAME -struct ObjNameSym { - ulittle32_t Signature; - // Name: The null-terminated name follows. -}; - -// S_COMPILE3 -struct CompileSym3 { - ulittle32_t flags; - uint8_t getLanguage() const { return flags & 0xff; } - enum Flags : uint32_t { - EC = 1 << 8, - NoDbgInfo = 1 << 9, - LTCG = 1 << 10, - NoDataAlign = 1 << 11, - ManagedPresent = 1 << 12, - SecurityChecks = 1 << 13, - HotPatch = 1 << 14, - CVTCIL = 1 << 15, - MSILModule = 1 << 16, - Sdl = 1 << 17, - PGO = 1 << 18, - Exp = 1 << 19, - }; - ulittle16_t Machine; // CPUType - ulittle16_t VersionFrontendMajor; - ulittle16_t VersionFrontendMinor; - ulittle16_t VersionFrontendBuild; - ulittle16_t VersionFrontendQFE; - ulittle16_t VersionBackendMajor; - ulittle16_t VersionBackendMinor; - ulittle16_t VersionBackendBuild; - ulittle16_t VersionBackendQFE; - // VersionString: The null-terminated version string follows. -}; - -// S_FRAMEPROC -struct FrameProcSym { - ulittle32_t TotalFrameBytes; - ulittle32_t PaddingFrameBytes; - ulittle32_t OffsetToPadding; - ulittle32_t BytesOfCalleeSavedRegisters; - ulittle32_t OffsetOfExceptionHandler; - ulittle16_t SectionIdOfExceptionHandler; - ulittle32_t Flags; -}; - -// S_CALLSITEINFO -struct CallSiteInfoSym { - ulittle32_t CodeOffset; - ulittle16_t Segment; - ulittle16_t Reserved; - TypeIndex Type; -}; - -// S_HEAPALLOCSITE -struct HeapAllocationSiteSym { - ulittle32_t CodeOffset; - ulittle16_t Segment; - ulittle16_t CallInstructionSize; - TypeIndex Type; -}; - -// S_FRAMECOOKIE -struct FrameCookieSym { - ulittle32_t CodeOffset; - ulittle16_t Register; - ulittle16_t CookieKind; - - enum : uint16_t { - Copy, - XorStackPointer, - XorFramePointer, - XorR13, - }; -}; - -// S_UDT, S_COBOLUDT -struct UDTSym { - TypeIndex Type; // Type of the UDT - // Name: The null-terminated name follows. -}; - -// S_BUILDINFO -struct BuildInfoSym { - ulittle32_t BuildId; -}; - -// S_BPREL32 -struct BPRelativeSym { - ulittle32_t Offset; // Offset from the base pointer register - TypeIndex Type; // Type of the variable - // Name: The null-terminated name follows. -}; - -// S_REGREL32 -struct RegRelativeSym { - ulittle32_t Offset; // Offset from the register - TypeIndex Type; // Type of the variable - ulittle16_t Register; // Register to which the variable is relative - // Name: The null-terminated name follows. -}; - -// S_CONSTANT, S_MANCONSTANT -struct ConstantSym { - TypeIndex Type; - // Value: The value of the constant. - // Name: The null-terminated name follows. -}; - -// S_LDATA32, S_GDATA32, S_LMANDATA, S_GMANDATA -struct DataSym { - TypeIndex Type; - ulittle32_t DataOffset; - ulittle16_t Segment; - // Name: The null-terminated name follows. -}; - -// S_LTHREAD32, S_GTHREAD32 -struct ThreadLocalDataSym { - TypeIndex Type; - ulittle32_t DataOffset; - ulittle16_t Segment; - // Name: The null-terminated name follows. -}; +using llvm::support::little32_t; +using llvm::support::ulittle16_t; +using llvm::support::ulittle32_t; /// Data in the the SUBSEC_FRAMEDATA subection. struct FrameData { @@ -262,19 +51,12 @@ struct FrameData { //===----------------------------------------------------------------------===// // On-disk representation of type information -/// Indicates the kind of TypeRecord we're dealing with here. The documentation -/// and headers talk about this as the "leaf" type. -enum LeafType : uint16_t { -#define LEAF_TYPE(name, val) name = val, -#include "CVLeafTypes.def" -}; - // A CodeView type stream is a sequence of TypeRecords. Records larger than // 65536 must chain on to a second record. Each TypeRecord is followed by one of // the leaf types described below. -struct TypeRecord { +struct TypeRecordPrefix { ulittle16_t Len; // Type record length, starting from &Leaf. - ulittle16_t Leaf; // Type record kind (LeafType) + ulittle16_t Leaf; // Type record kind (TypeLeafKind) }; // LF_TYPESERVER2 diff --git a/llvm/tools/llvm-readobj/StreamWriter.h b/llvm/tools/llvm-readobj/StreamWriter.h index 08aa519e8ef..a255fe5fa19 100644 --- a/llvm/tools/llvm-readobj/StreamWriter.h +++ b/llvm/tools/llvm-readobj/StreamWriter.h @@ -20,7 +20,6 @@ #include <algorithm> using namespace llvm; -using namespace llvm::support; namespace llvm { @@ -293,8 +292,9 @@ private: }; template <> -inline void StreamWriter::printHex<ulittle16_t>(StringRef Label, - ulittle16_t Value) { +inline void +StreamWriter::printHex<support::ulittle16_t>(StringRef Label, + support::ulittle16_t Value) { startLine() << Label << ": " << hex(Value) << "\n"; } |