1 //===- DIAExtras.h - Helper classes and functions for accessing DIA C++ -*-===//
\r
3 // The LLVM Compiler Infrastructure
\r
5 // This file is distributed under the University of Illinois Open Source
\r
6 // License. See LICENSE.TXT for details.
\r
8 //===----------------------------------------------------------------------===//
\r
10 // Defines helper types, classes, and functions for working with DIA.
\r
12 //===----------------------------------------------------------------------===//
\r
14 #ifndef LLVM_TOOLS_LLVMPDBDUMP_DIAEXTRAS_H
\r
15 #define LLVM_TOOLS_LLVMPDBDUMP_DIAEXTRAS_H
\r
17 #include "llvm/ADT/SmallString.h"
\r
18 #include "llvm/Support/raw_ostream.h"
\r
20 #include "COMExtras.h"
\r
26 typedef llvm::SmallString<16> DIAString;
\r
28 template <class T> class DIAResult {
\r
30 DIAResult() : IsValid(false) {}
\r
31 DIAResult(const T &ResultValue) : Result(ResultValue), IsValid(true) {}
\r
33 bool hasValue() const { return IsValid; }
\r
34 T value() const { return Result; }
\r
36 void dump(StringRef Name, unsigned IndentLevel) const {
\r
39 outs().indent(IndentLevel);
\r
40 outs() << Name << ": " << value() << "\n";
\r
49 void DIAResult<BOOL>::dump(StringRef Name, unsigned IndentLevel) const {
\r
52 outs().indent(IndentLevel);
\r
53 outs() << Name << ": " << (value() ? "true" : "false") << "\n";
\r
57 void DIAResult<GUID>::dump(StringRef Name, unsigned IndentLevel) const {
\r
61 CComBSTR GuidBSTR(value());
\r
62 BSTRToUTF8(GuidBSTR.m_str, Guid8);
\r
64 outs().indent(IndentLevel);
\r
65 outs() << Name << ": " << Guid8 << "\n";
\r
68 // MSDN documents the IDiaSymbol::get_machineType method as returning a value
\r
69 // from the CV_CPU_TYPE_e enumeration. This documentation is wrong, however,
\r
70 // and this method actually returns a value from the IMAGE_FILE_xxx set of
\r
71 // defines from winnt.h. These correspond to the platform magic number in
\r
72 // the COFF file. This enumeration is built from the set of values in winnt.h
\r
73 enum MachineTypeEnum {
\r
74 MachineTypeUnknown = IMAGE_FILE_MACHINE_UNKNOWN,
\r
75 MachineTypeX86 = IMAGE_FILE_MACHINE_I386,
\r
76 MachineTypeR3000 = IMAGE_FILE_MACHINE_R3000,
\r
77 MachineTypeR4000 = IMAGE_FILE_MACHINE_R4000,
\r
78 MachineTypeR10000 = IMAGE_FILE_MACHINE_R10000,
\r
79 MachineTypeWCEMIPSv2 = IMAGE_FILE_MACHINE_WCEMIPSV2,
\r
80 MachineTypeAlpha = IMAGE_FILE_MACHINE_ALPHA,
\r
81 MachineTypeSH3 = IMAGE_FILE_MACHINE_SH3,
\r
82 MachineTypeSH3DSP = IMAGE_FILE_MACHINE_SH3DSP,
\r
83 MachineTypeSH3E = IMAGE_FILE_MACHINE_SH3E,
\r
84 MachineTypeSH4 = IMAGE_FILE_MACHINE_SH4,
\r
85 MachineTypeSH5 = IMAGE_FILE_MACHINE_SH5,
\r
86 MachineTypeArm = IMAGE_FILE_MACHINE_ARM,
\r
87 MachineTypeThumb = IMAGE_FILE_MACHINE_THUMB,
\r
88 MachineTypeArmNT = IMAGE_FILE_MACHINE_ARMNT,
\r
89 MachineTypeAM33 = IMAGE_FILE_MACHINE_AM33,
\r
90 MachineTypePowerPC = IMAGE_FILE_MACHINE_POWERPC,
\r
91 MachineTypePowerPCFP = IMAGE_FILE_MACHINE_POWERPCFP,
\r
92 MachineTypeIa64 = IMAGE_FILE_MACHINE_IA64,
\r
93 MachineTypeMips16 = IMAGE_FILE_MACHINE_MIPS16,
\r
94 MachineTypeAlpha64 = IMAGE_FILE_MACHINE_ALPHA64,
\r
95 MachineTypeMipsFpu = IMAGE_FILE_MACHINE_MIPSFPU,
\r
96 MachineTypeMipsFpu16 = IMAGE_FILE_MACHINE_MIPSFPU16,
\r
97 MachineTypeTriCore = IMAGE_FILE_MACHINE_TRICORE,
\r
98 MachineTypeCEF = IMAGE_FILE_MACHINE_CEF,
\r
99 MachineTypeEBC = IMAGE_FILE_MACHINE_EBC,
\r
100 MachineTypeAmd64 = IMAGE_FILE_MACHINE_AMD64,
\r
101 MachineTypeM32R = IMAGE_FILE_MACHINE_M32R,
\r
102 MachineTypeCEE = IMAGE_FILE_MACHINE_CEE,
\r
105 // SymTagEnum has the unfortunate property that it is not only the name of
\r
106 // the enum, but also the name of one of the values of the enum. So that we
\r
107 // don't have to always type "enum SymTagEnum", we typedef this to a different
\r
108 // name so that we can refer to it more easily.
\r
109 typedef enum SymTagEnum DiaSymTagEnum;
\r
111 typedef CComPtr<IDiaSymbol> DiaSymbolPtr;
\r
113 } // namespace windows
\r
115 } // namespace llvm
\r
120 raw_ostream &operator<<(raw_ostream &Stream,
\r
121 llvm::sys::windows::DiaSymTagEnum SymTag);
\r
122 raw_ostream &operator<<(raw_ostream &Stream, CV_CPU_TYPE_e CpuType);
\r
123 raw_ostream &operator<<(raw_ostream &Stream,
\r
124 llvm::sys::windows::MachineTypeEnum CpuType);
\r