retdec
function.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_COMMON_FUNCTION_H
8 #define RETDEC_COMMON_FUNCTION_H
9 
10 #include <set>
11 #include <string>
12 
15 #include "retdec/common/object.h"
16 #include "retdec/common/storage.h"
17 #include "retdec/common/type.h"
18 
19 namespace retdec {
20 namespace common {
21 
23 
36 {
37  public:
51  enum eLinkType
52  {
58  IDIOM
59  };
60 
61  public:
62  Function(const std::string& name = std::string());
63  Function(
66  const std::string& name = std::string());
67 
70  bool isDecompilerDefined() const;
71  bool isUserDefined() const;
72  bool isStaticallyLinked() const;
73  bool isDynamicallyLinked() const;
74  bool isSyscall() const;
75  bool isIdiom() const;
76  bool isFromDebug() const;
77  bool isWrapper() const;
78  bool isConstructor() const;
79  bool isDestructor() const;
80  bool isVirtual() const;
81  bool isExported() const;
82  bool isVariadic() const;
83  bool isThumb() const;
85 
88  void setName(const std::string& n);
89  void setRealName(const std::string& n);
90  void setDemangledName(const std::string& n);
91  void setComment(const std::string& c);
92  void addComment(const std::string& c);
93  void setDeclarationString(const std::string& s);
94  void setSourceFileName(const std::string& n);
95  void setWrappedFunctionName(const std::string& n);
97  void setEndLine(const retdec::common::Address& l);
99  void setIsUserDefined();
100  void setIsStaticallyLinked() const;
101  void setIsDynamicallyLinked() const;
102  void setIsSyscall();
103  void setIsIdiom();
104  void setIsFromDebug(bool d);
105  void setIsConstructor(bool f);
106  void setIsDestructor(bool f);
107  void setIsVirtual(bool f);
108  void setIsExported(bool f);
109  void setIsVariadic(bool f);
110  void setIsThumb(bool f);
111  void setLinkType(eLinkType lt);
113 
116  const std::string& getId() const;
117  const std::string& getName() const;
118  const std::string& getRealName() const;
119  std::string getDemangledName() const;
120  std::string getComment() const;
121  std::string getDeclarationString() const;
122  std::string getSourceFileName() const;
123  std::string getWrappedFunctionName() const;
124  LineNumber getStartLine() const;
125  LineNumber getEndLine() const;
126  eLinkType getLinkType() const;
128 
129  bool operator<(const Function& o) const;
130  bool operator==(const Function& o) const;
131  bool operator!=(const Function& o) const;
132 
133  public:
140  std::set<std::string> usedCryptoConstants;
141  std::set<common::BasicBlock> basicBlocks;
143  std::set<common::Address> codeReferences;
144 
145  private:
146  std::string _name;
147  std::string _realName;
148  std::string _demangledName;
149  std::string _comment;
150  std::string _declarationString;
151  std::string _sourceFileName;
156  bool _fromDebug = false;
157  bool _constructor = false;
158  bool _destructor = false;
159  bool _virtualFunction = false;
160  bool _exported = false;
161  bool _variadic = false;
162  bool _thumb = false;
163 };
164 
166 {
167  using is_transparent = void;
168 
169  bool operator()(const Function& f1, const Function& f2) const
170  {
171  return f1 < f2;
172  }
173  bool operator()(const std::string& id, Function const& f) const
174  {
175  return id < f.getName();
176  }
177  bool operator()(const Function& f, const std::string& id) const
178  {
179  return f.getName() < id;
180  }
181 };
182 
184 {
185  using is_transparent = void;
186 
187  bool operator()(const Function& f1, const Function& f2) const
188  {
189  return f1.getStart() < f2.getStart();
190  }
191  bool operator()(const retdec::common::Address& id, Function const& f) const
192  {
193  return id < f.getStart();
194  }
195  bool operator()(const Function& f, const retdec::common::Address& id) const
196  {
197  return f.getStart() < id;
198  }
199 };
200 
205 class FunctionContainer : public std::set<Function, FunctionNameCompare>
206 {
207  public:
208  bool hasFunction(const std::string& name);
209  const Function* getFunctionByName(const std::string& name) const;
211  const retdec::common::Address& addr) const;
212  const Function* getFunctionByRealName(const std::string& name) const;
213 };
214 
215 // TODO:
216 // Maybe we could use common::RangeContainer for this.
217 // It contains this functionality, but also some other mechanisms with
218 // potentially unwanted side effects.
219 // Also, because it does not take range as template argument, it is not ready
220 // to be used with common::Function.
221 class FunctionSet : public std::set<
222  retdec::common::Function,
223  retdec::common::FunctionAddressCompare>
224 {
225  public:
227  const retdec::common::Address& a) const;
228 };
229 
230 } // namespace common
231 } // namespace retdec
232 
233 #endif
Definition: address.h:21
Definition: calling_convention.h:21
Definition: function.h:206
const Function * getFunctionByName(const std::string &name) const
Definition: function.cpp:138
const Function * getFunctionByRealName(const std::string &name) const
Definition: function.cpp:162
const Function * getFunctionByStartAddress(const retdec::common::Address &addr) const
Definition: function.cpp:148
bool hasFunction(const std::string &name)
Definition: function.cpp:133
Definition: function.h:224
const retdec::common::Function * getRange(const retdec::common::Address &a) const
Definition: function.cpp:185
Definition: function.h:36
bool isIdiom() const
Definition: function.cpp:42
bool isUserDefined() const
Definition: function.cpp:38
bool isFromDebug() const
Definition: function.cpp:43
void setIsThumb(bool f)
Definition: function.cpp:81
void setIsVariadic(bool f)
Definition: function.cpp:80
void setIsVirtual(bool f)
Definition: function.cpp:78
LineNumber _endLine
Definition: function.h:155
void addComment(const std::string &c)
Definition: function.cpp:63
bool _destructor
Definition: function.h:158
eLinkType _linkType
Definition: function.h:153
std::string getDemangledName() const
Definition: function.cpp:87
std::string getWrappedFunctionName() const
Definition: function.cpp:91
void setStartLine(const retdec::common::Address &l)
Definition: function.cpp:67
bool isSyscall() const
Definition: function.cpp:41
void setName(const std::string &n)
Definition: function.cpp:59
void setIsDestructor(bool f)
Definition: function.cpp:77
std::set< common::Address > codeReferences
Addresses of instructions which reference (use) this function.
Definition: function.h:143
bool _variadic
Definition: function.h:161
eLinkType getLinkType() const
Definition: function.cpp:94
bool _thumb
Definition: function.h:162
bool isDecompilerDefined() const
Definition: function.cpp:37
LineNumber getEndLine() const
Definition: function.cpp:93
common::Storage frameBaseStorage
Definition: function.h:136
eLinkType
Definition: function.h:52
@ SYSCALL
Definition: function.h:57
@ USER_DEFINED
Definition: function.h:54
@ DECOMPILER_DEFINED
Definition: function.h:53
@ IDIOM
Definition: function.h:58
@ DYNAMICALLY_LINKED
Definition: function.h:56
@ STATICALLY_LINKED
Definition: function.h:55
void setIsConstructor(bool f)
Definition: function.cpp:76
bool _virtualFunction
Definition: function.h:159
bool operator==(const Function &o) const
Definition: function.cpp:110
bool isVariadic() const
Definition: function.cpp:48
void setIsFromDebug(bool d)
Definition: function.cpp:75
void setEndLine(const retdec::common::Address &l)
Definition: function.cpp:68
bool _exported
Definition: function.h:160
Function(const std::string &name=std::string())
Definition: function.cpp:20
void setIsUserDefined()
Definition: function.cpp:70
bool isDynamicallyLinked() const
Definition: function.cpp:40
bool isDestructor() const
Definition: function.cpp:45
const std::string & getName() const
Definition: function.cpp:85
void setComment(const std::string &c)
Definition: function.cpp:62
common::Storage returnStorage
Definition: function.h:135
void setDeclarationString(const std::string &s)
Definition: function.cpp:64
bool _constructor
Definition: function.h:157
bool isWrapper() const
Definition: function.cpp:57
std::string _realName
Definition: function.h:147
common::ObjectSetContainer locals
Definition: function.h:139
common::CallingConvention callingConvention
Definition: function.h:134
std::string _declarationString
Definition: function.h:150
void setLinkType(eLinkType lt)
Definition: function.cpp:82
const std::string & getId() const
Definition: function.cpp:84
void setRealName(const std::string &n)
Definition: function.cpp:60
void setWrappedFunctionName(const std::string &n)
Definition: function.cpp:66
bool isVirtual() const
Definition: function.cpp:46
std::string _wrapperdFunctionName
Definition: function.h:152
void setIsStaticallyLinked() const
Definition: function.cpp:71
void setIsDynamicallyLinked() const
Definition: function.cpp:72
common::Type returnType
Definition: function.h:137
void setSourceFileName(const std::string &n)
Definition: function.cpp:65
common::ObjectSequentialContainer parameters
Definition: function.h:138
std::string getComment() const
Definition: function.cpp:88
void setIsSyscall()
Definition: function.cpp:73
bool operator!=(const Function &o) const
Definition: function.cpp:119
std::string getSourceFileName() const
Definition: function.cpp:90
std::string _demangledName
Definition: function.h:148
bool _fromDebug
Definition: function.h:156
std::string _name
This is objects unique ID.
Definition: function.h:146
void setIsIdiom()
Definition: function.cpp:74
LineNumber _startLine
Definition: function.h:154
bool isStaticallyLinked() const
Definition: function.cpp:39
std::set< std::string > usedCryptoConstants
Definition: function.h:140
void setIsExported(bool f)
Definition: function.cpp:79
std::string _comment
Definition: function.h:149
bool isThumb() const
Definition: function.cpp:49
bool operator<(const Function &o) const
Definition: function.cpp:101
void setIsDecompilerDefined()
Definition: function.cpp:69
void setDemangledName(const std::string &n)
Definition: function.cpp:61
std::string _sourceFileName
Definition: function.h:151
std::string getDeclarationString() const
Definition: function.cpp:89
LineNumber getStartLine() const
Definition: function.cpp:92
const std::string & getRealName() const
Definition: function.cpp:86
bool isExported() const
Definition: function.cpp:47
bool isConstructor() const
Definition: function.cpp:44
std::set< common::BasicBlock > basicBlocks
Definition: function.h:141
Definition: object.h:113
Definition: range.h:45
const RangeType & getStart() const
Definition: range.h:119
Definition: storage.h:22
Definition: type.h:22
Common basic block representation.
Calling convention representation.
Common object representation.
Common object storage representation.
Common data type representation.
retdec::common::Address Address
Address.
Definition: types.h:36
T & id(T &object)
Returns object.
Definition: debug.h:208
Definition: archive_wrapper.h:19
Definition: function.h:184
bool operator()(const Function &f1, const Function &f2) const
Definition: function.h:187
bool operator()(const retdec::common::Address &id, Function const &f) const
Definition: function.h:191
bool operator()(const Function &f, const retdec::common::Address &id) const
Definition: function.h:195
void is_transparent
Definition: function.h:185
Definition: function.h:166
bool operator()(const Function &f1, const Function &f2) const
Definition: function.h:169
void is_transparent
Definition: function.h:167
bool operator()(const std::string &id, Function const &f) const
Definition: function.h:173
bool operator()(const Function &f, const std::string &id) const
Definition: function.h:177