99d37e13c5619a0e431b07b397ab36d138173c3b
[oota-llvm.git] / tools / llvm-pdbdump / DIAExtras.h
1 //===- DIAExtras.h - Helper classes and functions for accessing DIA C++ -*-===//\r
2 //\r
3 //                     The LLVM Compiler Infrastructure\r
4 //\r
5 // This file is distributed under the University of Illinois Open Source\r
6 // License. See LICENSE.TXT for details.\r
7 //\r
8 //===----------------------------------------------------------------------===//\r
9 //\r
10 // Defines helper types, classes, and functions for working with DIA.\r
11 //\r
12 //===----------------------------------------------------------------------===//\r
13 \r
14 #ifndef LLVM_TOOLS_LLVMPDBDUMP_DIAEXTRAS_H\r
15 #define LLVM_TOOLS_LLVMPDBDUMP_DIAEXTRAS_H\r
16 \r
17 #include "llvm/ADT/SmallString.h"\r
18 #include "llvm/Support/raw_ostream.h"\r
19 \r
20 #include "COMExtras.h"\r
21 \r
22 namespace llvm {\r
23 namespace sys {\r
24 namespace windows {\r
25 \r
26 typedef llvm::SmallString<16> DIAString;\r
27 \r
28 template <class T> class DIAResult {\r
29 public:\r
30   DIAResult() : IsValid(false) {}\r
31   DIAResult(const T &ResultValue) : Result(ResultValue), IsValid(true) {}\r
32 \r
33   bool hasValue() const { return IsValid; }\r
34   T value() const { return Result; }\r
35 \r
36   void dump(StringRef Name, unsigned IndentLevel) const {\r
37     if (!hasValue())\r
38       return;\r
39     outs().indent(IndentLevel);\r
40     outs() << Name << ": " << value() << "\n";\r
41   }\r
42 \r
43 private:\r
44   T Result;\r
45   bool IsValid;\r
46 };\r
47 \r
48 template <>\r
49 void DIAResult<BOOL>::dump(StringRef Name, unsigned IndentLevel) const {\r
50   if (!hasValue())\r
51     return;\r
52   outs().indent(IndentLevel);\r
53   outs() << Name << ": " << (value() ? "true" : "false") << "\n";\r
54 }\r
55 \r
56 template <>\r
57 void DIAResult<GUID>::dump(StringRef Name, unsigned IndentLevel) const {\r
58   if (!hasValue())\r
59     return;\r
60   std::string Guid8;\r
61   CComBSTR GuidBSTR(value());\r
62   BSTRToUTF8(GuidBSTR.m_str, Guid8);\r
63 \r
64   outs().indent(IndentLevel);\r
65   outs() << Name << ": " << Guid8 << "\n";\r
66 }\r
67 \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
103 };\r
104 \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
110 \r
111 typedef CComPtr<IDiaSymbol> DiaSymbolPtr;\r
112 \r
113 } // namespace windows\r
114 } // namespace sys\r
115 } // namespace llvm\r
116 \r
117 namespace llvm {\r
118 class raw_ostream;\r
119 \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
125 }\r
126 \r
127 #endif\r