retdec
context.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_CONTEXT_H
8 #define RETDEC_CONTEXT_H
9 
10 #include <memory>
11 #include <map>
12 
13 namespace retdec {
14 namespace demangler {
15 namespace borland {
16 
17 class Node;
18 class TypeNode;
19 class BuiltInTypeNode;
20 class IntegralTypeNode;
21 class FloatTypeNode;
22 class CharTypeNode;
23 enum class ThreeStateSignedness;
24 class PointerTypeNode;
25 class ReferenceTypeNode;
26 class RReferenceTypeNode;
27 class NamedTypeNode;
28 class Qualifiers;
29 class NameNode;
30 class NestedNameNode;
31 class ArrayNode;
32 
37 class Context
38 {
39 public:
40  Context() = default;
41 
44  std::shared_ptr<BuiltInTypeNode> getBuiltInType(
45  const std::string &name,
46  const Qualifiers &quals
47  ) const;
48 
49  void addBuiltInType(
50  const std::shared_ptr<BuiltInTypeNode> &type
51  );
53 
56  std::shared_ptr<CharTypeNode> getCharType(
57  const ThreeStateSignedness &signedness,
58  const Qualifiers &quals
59  ) const;
60 
61  void addCharType(
62  const std::shared_ptr<CharTypeNode> &type
63  );
65 
68  std::shared_ptr<IntegralTypeNode> getIntegralType(
69  const std::string &name,
70  bool isUnsigned,
71  const Qualifiers &quals
72  ) const;
73 
74  void addIntegralType(
75  const std::shared_ptr<IntegralTypeNode> &type
76  );
78 
81  std::shared_ptr<FloatTypeNode> getFloatType(
82  const std::string &name,
83  const Qualifiers &quals
84  ) const;
85 
86  void addFloatType(
87  const std::shared_ptr<FloatTypeNode> &type
88  );
90 
93  std::shared_ptr<PointerTypeNode> getPointerType(
94  std::shared_ptr<Node> pointee,
95  const Qualifiers &quals
96  ) const;
97 
98  void addPointerType(
99  const std::shared_ptr<PointerTypeNode> &type
100  );
102 
105  std::shared_ptr<ReferenceTypeNode> getReferenceType(
106  std::shared_ptr<Node> pointee
107  ) const;
108 
109  void addReferenceType(
110  const std::shared_ptr<ReferenceTypeNode> &type
111  );
113 
116  std::shared_ptr<RReferenceTypeNode> getRReferenceType(
117  std::shared_ptr<Node> pointee
118  ) const;
119 
120  void addRReferenceType(
121  const std::shared_ptr<RReferenceTypeNode> &type
122  );
124 
127  std::shared_ptr<NamedTypeNode> getNamedType(
128  const std::string &name,
129  const Qualifiers &quals
130  ) const;
131 
132  void addNamedType(
133  const std::string &mangled,
134  const Qualifiers &quals,
135  const std::shared_ptr<NamedTypeNode> &type
136  );
138 
139  std::shared_ptr<Node> getFunction(const std::string &mangled) const; // TODO remove and move to bin2llvm::demangler
140  void addFunction(
141  const std::string &mangled,
142  const std::shared_ptr<Node> &function);
143 
146  std::shared_ptr<NameNode> getName(
147  const std::string &name
148  ) const;
149 
150  void addName(
151  const std::shared_ptr<NameNode> &name
152  );
154 
157  std::shared_ptr<NestedNameNode> getNestedName(
158  std::shared_ptr<Node> super,
159  std::shared_ptr<Node> name
160  );
161 
162  void addNestedName(
163  const std::shared_ptr<NestedNameNode> &name
164  );
166 
169  std::shared_ptr<ArrayNode> getArray(
170  std::shared_ptr<Node> pointee,
171  unsigned size,
172  const Qualifiers &quals
173  );
174 
175  void addArrayType(
176  const std::shared_ptr<ArrayNode> &array
177  );
179 
180 private:
181  using BuiltInTypeNodes = std::map<
182  std::tuple<std::string, bool, bool>,
183  std::shared_ptr<BuiltInTypeNode>
184  >;
186 
187  using CharTypeNodes = std::map<
188  std::tuple<ThreeStateSignedness, bool, bool>,
189  std::shared_ptr<CharTypeNode>
190  >;
192 
193  using IntegralTypeNodes = std::map<
194  std::tuple<std::string, bool, bool, bool>,
195  std::shared_ptr<IntegralTypeNode>
196  >;
198 
199  using PointerTypeNodes = std::map<
200  std::tuple<std::shared_ptr<Node>, bool, bool>,
201  std::shared_ptr<PointerTypeNode>
202  >;
204 
205  using ReferenceTypeNodes = std::map<
206  std::shared_ptr<Node>,
207  std::shared_ptr<ReferenceTypeNode>
208  >;
210 
211  using RReferenceTypeNodes = std::map<
212  std::shared_ptr<Node>,
213  std::shared_ptr<RReferenceTypeNode>
214  >;
216 
217  using NamedTypeNodes = std::map<
218  std::tuple<std::string, bool, bool>,
219  std::shared_ptr<NamedTypeNode>
220  >;
222 
223  using FunctionNodes = std::map<
224  std::string,
225  std::shared_ptr<Node>
226  >;
228 
229  using NameNodes = std::map<
230  std::string,
231  std::shared_ptr<NameNode>
232  >;
234 
235  using NestedNameNodes =std::map<
236  std::tuple<std::shared_ptr<Node>, std::shared_ptr<Node>>,
237  std::shared_ptr<NestedNameNode>
238  >;
240 
241  using ArrayNodes = std::map<
242  std::tuple<std::shared_ptr<Node>, unsigned, bool, bool>,
243  std::shared_ptr<ArrayNode>
244  >;
246 
247 };
248 
249 } // borland
250 } // demangler
251 } // retdec
252 
253 #endif //RETDEC_CONTEXT_H
Storage for functions, types and names. Used for cacheing.
Definition: context.h:38
void addReferenceType(const std::shared_ptr< ReferenceTypeNode > &type)
Definition: context.cpp:135
std::shared_ptr< ReferenceTypeNode > getReferenceType(std::shared_ptr< Node > pointee) const
Definition: context.cpp:130
ReferenceTypeNodes referenceTypes
Definition: context.h:209
void addNamedType(const std::string &mangled, const Qualifiers &quals, const std::shared_ptr< NamedTypeNode > &type)
Definition: context.cpp:164
std::shared_ptr< Node > getFunction(const std::string &mangled) const
Definition: context.cpp:179
ArrayNodes arrayNodes
Definition: context.h:245
std::shared_ptr< IntegralTypeNode > getIntegralType(const std::string &name, bool isUnsigned, const Qualifiers &quals) const
Definition: context.cpp:63
void addRReferenceType(const std::shared_ptr< RReferenceTypeNode > &type)
Definition: context.cpp:147
NestedNameNodes nestedNameNodes
Definition: context.h:239
void addPointerType(const std::shared_ptr< PointerTypeNode > &type)
Definition: context.cpp:118
std::map< std::tuple< std::string, bool, bool >, std::shared_ptr< BuiltInTypeNode > > BuiltInTypeNodes
Definition: context.h:184
void addIntegralType(const std::shared_ptr< IntegralTypeNode > &type)
Definition: context.cpp:74
void addCharType(const std::shared_ptr< CharTypeNode > &type)
Definition: context.cpp:50
std::shared_ptr< BuiltInTypeNode > getBuiltInType(const std::string &name, const Qualifiers &quals) const
Definition: context.cpp:15
IntegralTypeNodes integralTypes
Definition: context.h:197
std::shared_ptr< PointerTypeNode > getPointerType(std::shared_ptr< Node > pointee, const Qualifiers &quals) const
Definition: context.cpp:111
std::map< std::tuple< std::shared_ptr< Node >, unsigned, bool, bool >, std::shared_ptr< ArrayNode > > ArrayNodes
Definition: context.h:244
NameNodes nameNodes
Definition: context.h:233
std::shared_ptr< NestedNameNode > getNestedName(std::shared_ptr< Node > super, std::shared_ptr< Node > name)
Definition: context.cpp:206
FunctionNodes functions
Definition: context.h:227
void addFloatType(const std::shared_ptr< FloatTypeNode > &type)
Definition: context.cpp:98
std::map< std::tuple< std::shared_ptr< Node >, bool, bool >, std::shared_ptr< PointerTypeNode > > PointerTypeNodes
Definition: context.h:202
std::shared_ptr< RReferenceTypeNode > getRReferenceType(std::shared_ptr< Node > pointee) const
Definition: context.cpp:142
std::map< std::shared_ptr< Node >, std::shared_ptr< RReferenceTypeNode > > RReferenceTypeNodes
Definition: context.h:214
std::map< std::shared_ptr< Node >, std::shared_ptr< ReferenceTypeNode > > ReferenceTypeNodes
Definition: context.h:208
std::shared_ptr< NamedTypeNode > getNamedType(const std::string &name, const Qualifiers &quals) const
Definition: context.cpp:154
void addBuiltInType(const std::shared_ptr< BuiltInTypeNode > &type)
Definition: context.cpp:25
void addFunction(const std::string &mangled, const std::shared_ptr< Node > &function)
Definition: context.cpp:184
void addName(const std::shared_ptr< NameNode > &name)
Definition: context.cpp:198
std::map< std::string, std::shared_ptr< NameNode > > NameNodes
Definition: context.h:232
std::shared_ptr< CharTypeNode > getCharType(const ThreeStateSignedness &signedness, const Qualifiers &quals) const
Definition: context.cpp:38
std::map< std::string, std::shared_ptr< Node > > FunctionNodes
Definition: context.h:226
BuiltInTypeNodes builtInTypes
Definition: context.h:185
std::shared_ptr< ArrayNode > getArray(std::shared_ptr< Node > pointee, unsigned size, const Qualifiers &quals)
Definition: context.cpp:222
std::map< std::tuple< std::string, bool, bool >, std::shared_ptr< NamedTypeNode > > NamedTypeNodes
Definition: context.h:220
PointerTypeNodes pointerTypes
Definition: context.h:203
std::map< std::tuple< ThreeStateSignedness, bool, bool >, std::shared_ptr< CharTypeNode > > CharTypeNodes
Definition: context.h:190
std::shared_ptr< NameNode > getName(const std::string &name) const
Definition: context.cpp:193
std::map< std::tuple< std::shared_ptr< Node >, std::shared_ptr< Node > >, std::shared_ptr< NestedNameNode > > NestedNameNodes
Definition: context.h:238
RReferenceTypeNodes rReferenceTypes
Definition: context.h:215
CharTypeNodes charTypes
Definition: context.h:191
void addNestedName(const std::shared_ptr< NestedNameNode > &name)
Definition: context.cpp:214
std::map< std::tuple< std::string, bool, bool, bool >, std::shared_ptr< IntegralTypeNode > > IntegralTypeNodes
Definition: context.h:196
std::shared_ptr< FloatTypeNode > getFloatType(const std::string &name, const Qualifiers &quals) const
Definition: context.cpp:88
NamedTypeNodes namedTypes
Definition: context.h:221
void addArrayType(const std::shared_ptr< ArrayNode > &array)
Definition: context.cpp:231
Definition: qualifiers.h:20
ThreeStateSignedness
Signedness used for chars. Chars can be signed char, unsigned char and char, which are by standard di...
Definition: char_type.h:22
Definition: archive_wrapper.h:19