Mercurial > hg > CbC > CbC_llvm
comparison lib/DebugInfo/PDB/PDBSymbol.cpp @ 83:60c9769439b8 LLVM3.7
LLVM 3.7
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 18 Feb 2015 14:55:36 +0900 |
parents | |
children | afa8332a0e37 |
comparison
equal
deleted
inserted
replaced
78:af83660cff7b | 83:60c9769439b8 |
---|---|
1 //===- PDBSymbol.cpp - base class for user-facing symbol types --*- C++ -*-===// | |
2 // | |
3 // The LLVM Compiler Infrastructure | |
4 // | |
5 // This file is distributed under the University of Illinois Open Source | |
6 // License. See LICENSE.TXT for details. | |
7 // | |
8 //===----------------------------------------------------------------------===// | |
9 | |
10 #include "llvm/DebugInfo/PDB/PDBSymbol.h" | |
11 | |
12 #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h" | |
13 #include "llvm/DebugInfo/PDB/IPDBRawSymbol.h" | |
14 #include "llvm/DebugInfo/PDB/PDBSymbolAnnotation.h" | |
15 #include "llvm/DebugInfo/PDB/PDBSymbolBlock.h" | |
16 #include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h" | |
17 #include "llvm/DebugInfo/PDB/PDBSymbolCompilandDetails.h" | |
18 #include "llvm/DebugInfo/PDB/PDBSymbolCompilandEnv.h" | |
19 #include "llvm/DebugInfo/PDB/PDBSymbolCustom.h" | |
20 #include "llvm/DebugInfo/PDB/PDBSymbolData.h" | |
21 #include "llvm/DebugInfo/PDB/PDBSymbolExe.h" | |
22 #include "llvm/DebugInfo/PDB/PDBSymbolFunc.h" | |
23 #include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h" | |
24 #include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h" | |
25 #include "llvm/DebugInfo/PDB/PDBSymbolLabel.h" | |
26 #include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h" | |
27 #include "llvm/DebugInfo/PDB/PDBSymbolThunk.h" | |
28 #include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h" | |
29 #include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h" | |
30 #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h" | |
31 #include "llvm/DebugInfo/PDB/PDBSymbolTypeCustom.h" | |
32 #include "llvm/DebugInfo/PDB/PDBSymbolTypeDimension.h" | |
33 #include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h" | |
34 #include "llvm/DebugInfo/PDB/PDBSymbolTypeFriend.h" | |
35 #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h" | |
36 #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h" | |
37 #include "llvm/DebugInfo/PDB/PDBSymbolTypeManaged.h" | |
38 #include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h" | |
39 #include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h" | |
40 #include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h" | |
41 #include "llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h" | |
42 #include "llvm/DebugInfo/PDB/PDBSymbolTypeVTableShape.h" | |
43 #include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h" | |
44 #include "llvm/DebugInfo/PDB/PDBSymbolUsingNamespace.h" | |
45 #include <memory> | |
46 #include <utility> | |
47 | |
48 #include <memory> | |
49 #include <utility> | |
50 | |
51 using namespace llvm; | |
52 | |
53 PDBSymbol::PDBSymbol(const IPDBSession &PDBSession, | |
54 std::unique_ptr<IPDBRawSymbol> Symbol) | |
55 : Session(PDBSession), RawSymbol(std::move(Symbol)) {} | |
56 | |
57 PDBSymbol::~PDBSymbol() {} | |
58 | |
59 #define FACTORY_SYMTAG_CASE(Tag, Type) \ | |
60 case PDB_SymType::Tag: \ | |
61 return std::unique_ptr<PDBSymbol>(new Type(PDBSession, std::move(Symbol))); | |
62 | |
63 std::unique_ptr<PDBSymbol> | |
64 PDBSymbol::create(const IPDBSession &PDBSession, | |
65 std::unique_ptr<IPDBRawSymbol> Symbol) { | |
66 switch (Symbol->getSymTag()) { | |
67 FACTORY_SYMTAG_CASE(Exe, PDBSymbolExe) | |
68 FACTORY_SYMTAG_CASE(Compiland, PDBSymbolCompiland) | |
69 FACTORY_SYMTAG_CASE(CompilandDetails, PDBSymbolCompilandDetails) | |
70 FACTORY_SYMTAG_CASE(CompilandEnv, PDBSymbolCompilandEnv) | |
71 FACTORY_SYMTAG_CASE(Function, PDBSymbolFunc) | |
72 FACTORY_SYMTAG_CASE(Block, PDBSymbolBlock) | |
73 FACTORY_SYMTAG_CASE(Data, PDBSymbolData) | |
74 FACTORY_SYMTAG_CASE(Annotation, PDBSymbolAnnotation) | |
75 FACTORY_SYMTAG_CASE(Label, PDBSymbolLabel) | |
76 FACTORY_SYMTAG_CASE(PublicSymbol, PDBSymbolPublicSymbol) | |
77 FACTORY_SYMTAG_CASE(UDT, PDBSymbolTypeUDT) | |
78 FACTORY_SYMTAG_CASE(Enum, PDBSymbolTypeEnum) | |
79 FACTORY_SYMTAG_CASE(FunctionSig, PDBSymbolTypeFunctionSig) | |
80 FACTORY_SYMTAG_CASE(PointerType, PDBSymbolTypePointer) | |
81 FACTORY_SYMTAG_CASE(ArrayType, PDBSymbolTypeArray) | |
82 FACTORY_SYMTAG_CASE(BuiltinType, PDBSymbolTypeBuiltin) | |
83 FACTORY_SYMTAG_CASE(Typedef, PDBSymbolTypeTypedef) | |
84 FACTORY_SYMTAG_CASE(BaseClass, PDBSymbolTypeBaseClass) | |
85 FACTORY_SYMTAG_CASE(Friend, PDBSymbolTypeFriend) | |
86 FACTORY_SYMTAG_CASE(FunctionArg, PDBSymbolTypeFunctionArg) | |
87 FACTORY_SYMTAG_CASE(FuncDebugStart, PDBSymbolFuncDebugStart) | |
88 FACTORY_SYMTAG_CASE(FuncDebugEnd, PDBSymbolFuncDebugEnd) | |
89 FACTORY_SYMTAG_CASE(UsingNamespace, PDBSymbolUsingNamespace) | |
90 FACTORY_SYMTAG_CASE(VTableShape, PDBSymbolTypeVTableShape) | |
91 FACTORY_SYMTAG_CASE(VTable, PDBSymbolTypeVTable) | |
92 FACTORY_SYMTAG_CASE(Custom, PDBSymbolCustom) | |
93 FACTORY_SYMTAG_CASE(Thunk, PDBSymbolThunk) | |
94 FACTORY_SYMTAG_CASE(CustomType, PDBSymbolTypeCustom) | |
95 FACTORY_SYMTAG_CASE(ManagedType, PDBSymbolTypeManaged) | |
96 FACTORY_SYMTAG_CASE(Dimension, PDBSymbolTypeDimension) | |
97 default: | |
98 return std::unique_ptr<PDBSymbol>( | |
99 new PDBSymbolUnknown(PDBSession, std::move(Symbol))); | |
100 } | |
101 } | |
102 | |
103 void PDBSymbol::defaultDump(raw_ostream &OS, int Indent, | |
104 PDB_DumpLevel Level) const { | |
105 RawSymbol->dump(OS, Indent, Level); | |
106 } | |
107 | |
108 PDB_SymType PDBSymbol::getSymTag() const { return RawSymbol->getSymTag(); } | |
109 | |
110 std::unique_ptr<IPDBEnumSymbols> PDBSymbol::findAllChildren() const { | |
111 return findAllChildren(PDB_SymType::None); | |
112 } | |
113 | |
114 std::unique_ptr<IPDBEnumSymbols> | |
115 PDBSymbol::findAllChildren(PDB_SymType Type) const { | |
116 return RawSymbol->findChildren(Type); | |
117 } | |
118 | |
119 std::unique_ptr<IPDBEnumSymbols> | |
120 PDBSymbol::findChildren(PDB_SymType Type, StringRef Name, | |
121 PDB_NameSearchFlags Flags) const { | |
122 return RawSymbol->findChildren(Type, Name, Flags); | |
123 } | |
124 | |
125 std::unique_ptr<IPDBEnumSymbols> | |
126 PDBSymbol::findChildrenByRVA(PDB_SymType Type, StringRef Name, | |
127 PDB_NameSearchFlags Flags, uint32_t RVA) const { | |
128 return RawSymbol->findChildrenByRVA(Type, Name, Flags, RVA); | |
129 } | |
130 | |
131 std::unique_ptr<IPDBEnumSymbols> | |
132 PDBSymbol::findInlineFramesByRVA(uint32_t RVA) const { | |
133 return RawSymbol->findInlineFramesByRVA(RVA); | |
134 } | |
135 | |
136 std::unique_ptr<IPDBEnumSymbols> | |
137 PDBSymbol::getChildStats(TagStats &Stats) const { | |
138 std::unique_ptr<IPDBEnumSymbols> Result(findAllChildren()); | |
139 Stats.clear(); | |
140 while (auto Child = Result->getNext()) { | |
141 ++Stats[Child->getSymTag()]; | |
142 } | |
143 Result->reset(); | |
144 return Result; | |
145 } |