50 changes: 24 additions & 26 deletions llvm/lib/DebugInfo/PDB/PDBExtras.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,32 +43,30 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_VariantType &Type) {
raw_ostream &llvm::operator<<(raw_ostream &OS, const PDB_CallingConv &Conv) {
OS << "__";
switch (Conv) {
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearCdecl, "cdecl", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarCdecl, "cdecl", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearPascal, "pascal", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarPascal, "pascal", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearFastcall, "fastcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarFastcall, "fastcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Skipped, "skippedcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearStdcall, "stdcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarStdcall, "stdcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearSyscall, "syscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarSyscall, "syscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Thiscall, "thiscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, MipsCall, "mipscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Generic, "genericcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Alphacall, "alphacall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Ppccall, "ppccall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, SuperHCall, "superhcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Armcall, "armcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, AM33call, "am33call", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Tricall, "tricall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Sh5call, "sh5call", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, M32R, "m32rcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Clrcall, "clrcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Inline, "inlinecall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearVectorcall, "vectorcall",
OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearC , "cdecl", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarC , "cdecl", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearPascal , "pascal", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarPascal , "pascal", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearFast , "fastcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarFast , "fastcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearStdCall, "stdcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarStdCall , "stdcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearSysCall, "syscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, FarSysCall , "syscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, ThisCall , "thiscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, MipsCall , "mipscall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Generic , "genericcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, AlphaCall , "alphacall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, PpcCall , "ppccall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, SHCall , "superhcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, ArmCall , "armcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, AM33Call , "am33call", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, TriCall , "tricall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, SH5Call , "sh5call", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, M32RCall , "m32rcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, ClrCall , "clrcall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, Inline , "inlinecall", OS)
CASE_OUTPUT_ENUM_CLASS_STR(PDB_CallingConv, NearVector , "vectorcall", OS)
default:
OS << "unknowncall";
}
Expand Down
22 changes: 11 additions & 11 deletions llvm/test/DebugInfo/COFF/asm.ll
Original file line number Diff line number Diff line change
Expand Up @@ -96,14 +96,14 @@
; OBJ32-NEXT: ]
; OBJ32: CodeViewDebugInfo [
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF1
; OBJ32-NEXT: SubSectionType: Symbols (0xF1)
; OBJ32-NOT: ]
; OBJ32: ProcStart {
; OBJ32-NEXT: DisplayName: f
; OBJ32-NEXT: Section: _f
; OBJ32-NEXT: CodeSize: 0x6
; OBJ32-NEXT: }
; OBJ32-NEXT: ProcEnd
; OBJ32: CodeSize: 0x6
; OBJ32: DisplayName: f
; OBJ32: LinkageName: _f
; OBJ32: }
; OBJ32: ProcEnd
; OBJ32-NEXT: ]
; OBJ32: FunctionLineTable [
; OBJ32-NEXT: Name: _f
Expand Down Expand Up @@ -228,13 +228,13 @@
; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION f
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF1
; OBJ64-NEXT: SubSectionType: Symbols (0xF1)
; OBJ64-NOT: ]
; OBJ64: ProcStart {
; OBJ64-NEXT: DisplayName: f
; OBJ64-NEXT: Section: f
; OBJ64-NEXT: CodeSize: 0xE
; OBJ64-NEXT: }
; OBJ64: CodeSize: 0xE
; OBJ64: DisplayName: f
; OBJ64: LinkageName: f
; OBJ64: }
; OBJ64-NEXT: ProcEnd
; OBJ64-NEXT: ]
; OBJ64: FunctionLineTable [
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/DebugInfo/COFF/cpp-mangling.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

; CHECK: ProcStart {
; FIXME: The display name should in fact be "foo::bar", see PR21528
; CHECK-NEXT: DisplayName: ?bar@foo@@YAHH@Z
; CHECK-NEXT: Section: ?bar@foo@@YAHH@Z
; CHECK: DisplayName: ?bar@foo@@YAHH@Z
; CHECK-NEXT: LinkageName: ?bar@foo@@YAHH@Z

; Function Attrs: nounwind
define i32 @"\01?bar@foo@@YAHH@Z"(i32 %x) #0 {
Expand Down
22 changes: 11 additions & 11 deletions llvm/test/DebugInfo/COFF/multifile.ll
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,13 @@
; OBJ32-NEXT: 0x48 IMAGE_REL_I386_SECTION _f
; OBJ32-NEXT: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF1
; OBJ32-NEXT: SubSectionType: Symbols (0xF1)
; OBJ32-NOT: ]
; OBJ32: ProcStart {
; OBJ32-NEXT: DisplayName: f
; OBJ32-NEXT: Section: _f
; OBJ32-NEXT: CodeSize: 0x10
; OBJ32-NEXT: }
; OBJ32: CodeSize: 0x10
; OBJ32: DisplayName: f
; OBJ32: LinkageName: _f
; OBJ32: }
; OBJ32-NEXT: ProcEnd
; OBJ32-NEXT: ]
; OBJ32: FunctionLineTable [
Expand Down Expand Up @@ -298,14 +298,14 @@
; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION f
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF1
; OBJ64-NEXT: SubSectionType: Symbols (0xF1)
; OBJ64-NOT: ]
; OBJ64: ProcStart {
; OBJ64-NEXT: DisplayName: f
; OBJ64-NEXT: Section: f
; OBJ64-NEXT: CodeSize: 0x18
; OBJ64-NEXT: }
; OBJ64-NEXT: ProcEnd
; OBJ64: CodeSize: 0x18
; OBJ64: DisplayName: f
; OBJ64: LinkageName: f
; OBJ64: }
; OBJ64: ProcEnd
; OBJ64-NEXT: ]
; OBJ64: FunctionLineTable [
; OBJ64-NEXT: Name: f
Expand Down
84 changes: 42 additions & 42 deletions llvm/test/DebugInfo/COFF/multifunction.ll
Original file line number Diff line number Diff line change
Expand Up @@ -221,43 +221,43 @@
; OBJ32-NEXT: 0x128 IMAGE_REL_I386_SECTION _f
; OBJ32-NEXT: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF1
; OBJ32-NEXT: SubSectionType: Symbols (0xF1)
; OBJ32-NOT: ]
; OBJ32: ProcStart {
; OBJ32-NEXT: DisplayName: x
; OBJ32-NEXT: Section: _x
; OBJ32-NEXT: CodeSize: 0x6
; OBJ32-NEXT: }
; OBJ32-NEXT: ProcEnd
; OBJ32: CodeSize: 0x6
; OBJ32: DisplayName: x
; OBJ32: LinkageName: _x
; OBJ32: }
; OBJ32: ProcEnd
; OBJ32-NEXT: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF2
; OBJ32-NEXT: SubSectionType: Lines (0xF2)
; OBJ32: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF1
; OBJ32-NEXT: SubSectionType: Symbols (0xF1)
; OBJ32-NOT: ]
; OBJ32: ProcStart {
; OBJ32-NEXT: DisplayName: y
; OBJ32-NEXT: Section: _y
; OBJ32-NEXT: CodeSize: 0x6
; OBJ32-NEXT: }
; OBJ32-NEXT: ProcEnd
; OBJ32: CodeSize: 0x6
; OBJ32: DisplayName: y
; OBJ32: LinkageName: _y
; OBJ32: }
; OBJ32: ProcEnd
; OBJ32-NEXT: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF2
; OBJ32-NEXT: SubSectionType: Lines (0xF2)
; OBJ32: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF1
; OBJ32-NEXT: SubSectionType: Symbols (0xF1)
; OBJ32-NOT: ]
; OBJ32: ProcStart {
; OBJ32-NEXT: DisplayName: f
; OBJ32-NEXT: Section: _f
; OBJ32-NEXT: CodeSize: 0x10
; OBJ32-NEXT: }
; OBJ32-NEXT: ProcEnd
; OBJ32: CodeSize: 0x10
; OBJ32: DisplayName: f
; OBJ32: LinkageName: _f
; OBJ32: }
; OBJ32: ProcEnd
; OBJ32-NEXT: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF2
; OBJ32-NEXT: SubSectionType: Lines (0xF2)
; OBJ32: ]
; OBJ32: FunctionLineTable [
; OBJ32-NEXT: Name: _x
Expand Down Expand Up @@ -564,43 +564,43 @@
; OBJ64-NEXT: 0x140 IMAGE_REL_AMD64_SECTION f
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF1
; OBJ64-NEXT: SubSectionType: Symbols (0xF1)
; OBJ64-NOT: ]
; OBJ64: ProcStart {
; OBJ64-NEXT: DisplayName: x
; OBJ64-NEXT: Section: x
; OBJ64-NEXT: CodeSize: 0xE
; OBJ64-NEXT: }
; OBJ64-NEXT: ProcEnd
; OBJ64: CodeSize: 0xE
; OBJ64: DisplayName: x
; OBJ64: LinkageName: x
; OBJ64: }
; OBJ64: ProcEnd
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF2
; OBJ64-NEXT: SubSectionType: Lines (0xF2)
; OBJ64: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF1
; OBJ64-NEXT: SubSectionType: Symbols (0xF1)
; OBJ64-NOT: ]
; OBJ64: ProcStart {
; OBJ64-NEXT: DisplayName: y
; OBJ64-NEXT: Section: y
; OBJ64-NEXT: CodeSize: 0xE
; OBJ64-NEXT: }
; OBJ64-NEXT: ProcEnd
; OBJ64: CodeSize: 0xE
; OBJ64: DisplayName: y
; OBJ64: LinkageName: y
; OBJ64: }
; OBJ64: ProcEnd
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF2
; OBJ64-NEXT: SubSectionType: Lines (0xF2)
; OBJ64: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF1
; OBJ64-NEXT: SubSectionType: Symbols (0xF1)
; OBJ64-NOT: ]
; OBJ64: ProcStart {
; OBJ64-NEXT: DisplayName: f
; OBJ64-NEXT: Section: f
; OBJ64-NEXT: CodeSize: 0x18
; OBJ64-NEXT: }
; OBJ64-NEXT: ProcEnd
; OBJ64: CodeSize: 0x18
; OBJ64: DisplayName: f
; OBJ64: LinkageName: f
; OBJ64: }
; OBJ64: ProcEnd
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF2
; OBJ64-NEXT: SubSectionType: Lines (0xF2)
; OBJ64: ]
; OBJ64: FunctionLineTable [
; OBJ64-NEXT: LinkageName: x
Expand Down
20 changes: 10 additions & 10 deletions llvm/test/DebugInfo/COFF/simple.ll
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,13 @@
; OBJ32-NEXT: 0x48 IMAGE_REL_I386_SECTION _f
; OBJ32-NEXT: ]
; OBJ32: Subsection [
; OBJ32-NEXT: Type: 0xF1
; OBJ32-NEXT: SubSectionType: Symbols (0xF1)
; OBJ32-NOT: ]
; OBJ32: ProcStart {
; OBJ32-NEXT: DisplayName: f
; OBJ32-NEXT: Section: _f
; OBJ32-NEXT: CodeSize: 0x6
; OBJ32-NEXT: }
; OBJ32: CodeSize: 0x6
; OBJ32: DisplayName: f
; OBJ32: LinkageName: _f
; OBJ32: }
; OBJ32-NEXT: ProcEnd
; OBJ32-NEXT: ]
; OBJ32: FunctionLineTable [
Expand Down Expand Up @@ -207,13 +207,13 @@
; OBJ64-NEXT: 0x48 IMAGE_REL_AMD64_SECTION f
; OBJ64-NEXT: ]
; OBJ64: Subsection [
; OBJ64-NEXT: Type: 0xF1
; OBJ64-NEXT: SubSectionType: Symbols (0xF1)
; OBJ64-NOT: ]
; OBJ64: ProcStart {
; OBJ64-NEXT: DisplayName: f
; OBJ64-NEXT: Section: f
; OBJ64-NEXT: CodeSize: 0xE
; OBJ64-NEXT: }
; OBJ64: CodeSize: 0xE
; OBJ64: DisplayName: f
; OBJ64: LinkageName: f
; OBJ64: }
; OBJ64-NEXT: ProcEnd
; OBJ64-NEXT: ]
; OBJ64: FunctionLineTable [
Expand Down
263 changes: 132 additions & 131 deletions llvm/test/tools/llvm-readobj/codeview-linetables.test

Large diffs are not rendered by default.

13 changes: 7 additions & 6 deletions llvm/tools/llvm-pdbdump/FunctionDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "llvm/Support/Format.h"

using namespace llvm;
using namespace llvm::codeview;

namespace {
template <class T>
Expand Down Expand Up @@ -57,10 +58,10 @@ void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
Symbol.getSession().getConcreteSymbolById<PDBSymbolTypeUDT>(
ClassParentId);

PDB_CallingConv CC = Symbol.getCallingConvention();
CallingConvention CC = Symbol.getCallingConvention();
bool ShouldDumpCallingConvention = true;
if ((ClassParent && CC == PDB_CallingConv::Thiscall) ||
(!ClassParent && CC == PDB_CallingConv::NearStdcall)) {
if ((ClassParent && CC == CallingConvention::ThisCall) ||
(!ClassParent && CC == CallingConvention::NearStdCall)) {
ShouldDumpCallingConvention = false;
}

Expand Down Expand Up @@ -152,12 +153,12 @@ void FunctionDumper::start(const PDBSymbolFunc &Symbol, PointerType Pointer) {
Printer << " ";

auto ClassParent = Symbol.getClassParent();
PDB_CallingConv CC = Signature->getCallingConvention();
CallingConvention CC = Signature->getCallingConvention();
if (Pointer != FunctionDumper::PointerType::None)
Printer << "(";

if ((ClassParent && CC != PDB_CallingConv::Thiscall) ||
(!ClassParent && CC != PDB_CallingConv::NearStdcall)) {
if ((ClassParent && CC != CallingConvention::ThisCall) ||
(!ClassParent && CC != CallingConvention::NearStdCall)) {
WithColor(Printer, PDB_ColorItem::Keyword).get()
<< Signature->getCallingConvention() << " ";
}
Expand Down
1,708 changes: 1,568 additions & 140 deletions llvm/tools/llvm-readobj/COFFDumper.cpp

Large diffs are not rendered by default.

211 changes: 211 additions & 0 deletions llvm/tools/llvm-readobj/CVLeafTypes.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
//===-- 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
237 changes: 237 additions & 0 deletions llvm/tools/llvm-readobj/CVSymbolTypes.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
//===-- 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
571 changes: 571 additions & 0 deletions llvm/tools/llvm-readobj/CodeView.h

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions llvm/tools/llvm-readobj/StreamWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#ifndef LLVM_TOOLS_LLVM_READOBJ_STREAMWRITER_H
#define LLVM_TOOLS_LLVM_READOBJ_STREAMWRITER_H

#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
Expand Down Expand Up @@ -180,6 +181,10 @@ class StreamWriter {
startLine() << Label << ": " << int(Value) << "\n";
}

void printNumber(StringRef Label, APSInt Value) {
startLine() << Label << ": " << Value << "\n";
}

void printBoolean(StringRef Label, bool Value) {
startLine() << Label << ": " << (Value ? "Yes" : "No") << '\n';
}
Expand Down Expand Up @@ -287,6 +292,12 @@ class StreamWriter {
int IndentLevel;
};

template <>
inline void StreamWriter::printHex<ulittle16_t>(StringRef Label,
ulittle16_t Value) {
startLine() << Label << ": " << hex(Value) << "\n";
}

struct DictScope {
DictScope(StreamWriter& W, StringRef N) : W(W) {
W.startLine() << N << " {\n";
Expand Down
3 changes: 3 additions & 0 deletions llvm/tools/llvm-readobj/llvm-readobj.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,7 @@ namespace opts {
#define LLVM_READOBJ_ENUM_ENT(ns, enum) \
{ #enum, ns::enum }

#define LLVM_READOBJ_ENUM_CLASS_ENT(enum_class, enum) \
{ #enum, std::underlying_type<enum_class>::type(enum_class::enum) }

#endif