retdec
data_entries.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_DATA_ENTRIES_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_DATA_ENTRIES_H
9 
10 #include <vector>
11 
13 
14 #include <llvm/IR/Function.h>
15 #include <llvm/IR/Instructions.h>
16 
17 namespace retdec {
18 namespace bin2llvmir {
19 
21 {
22  public:
23  ReturnEntry(llvm::ReturnInst* r);
24 
25  public:
26  void addRetStore(llvm::StoreInst* st);
27 
28  void setRetStores(std::vector<llvm::StoreInst*>&& stores);
29  void setRetStores(const std::vector<llvm::StoreInst*>& stores);
30  void setRetValues(std::vector<llvm::Value*>&& values);
31 
32  void setRetValues(const std::vector<llvm::Value*>& values);
33 
34  public:
35  llvm::ReturnInst* getRetInstruction() const;
36 
37  const std::vector<llvm::StoreInst*>& retStores() const;
38  const std::vector<llvm::Value*>& retValues() const;
39 
40  protected:
41  llvm::ReturnInst* _retInst = nullptr;
42 
43  std::vector<llvm::StoreInst*> _retStores;
44  std::vector<llvm::Value*> _retValues;
45 };
46 
48 {
49  public:
50  bool isVoidarg() const;
51 
52  void addArg(llvm::Value* arg);
53 
54  void setVoidarg(bool voidarg = true);
55  void setArgTypes(
56  std::vector<llvm::Type*>&& types,
57  std::vector<std::string>&& names = {});
58 
59  public:
60  const std::vector<llvm::Value*>& args() const;
61  const std::vector<llvm::Type*>& argTypes() const;
62  const std::vector<std::string>& argNames() const;
63 
64  protected:
65  std::vector<llvm::Value*> _args;
66  std::vector<llvm::Type*> _argTypes;
67  std::vector<std::string> _argNames;
68 
69  protected:
70  bool _voidarg = false;
71 };
72 
74 {
75  public:
76  bool isVariadic() const;
77  bool isWrapper() const;
78 
79  public:
80  void addRetEntry(const ReturnEntry& ret);
81  ReturnEntry* createRetEntry(llvm::ReturnInst* ret);
82 
83  void setArgs(std::vector<llvm::Value*>&& args);
84  void setVariadic(bool variadic = true);
85  void setWrappedCall(llvm::CallInst* wrap);
86  void setRetType(llvm::Type* type);
87  void setRetValue(llvm::Value* val);
89 
90  public:
91  llvm::Value* getRetValue() const;
92  llvm::Type* getRetType() const;
93  llvm::CallInst* getWrappedCall() const;
95 
96  const std::vector<ReturnEntry>& retEntries() const;
97  std::vector<ReturnEntry>& retEntries();
98 
99  private:
100  llvm::CallInst* _wrap = nullptr;
101  llvm::Type* _retType = nullptr;
102  llvm::Value* _retVal = nullptr;
103  bool _variadic = false;
105 
106  std::vector<ReturnEntry> _retEntries;
107 };
108 
109 class CallEntry : public CallableEntry
110 {
111  // Constructor.
112  //
113  public:
114  CallEntry(
115  llvm::CallInst* call,
116  const FunctionEntry* base = nullptr);
117 
118  // Usage data.
119  //
120  public:
121  void addRetLoad(llvm::LoadInst* load);
122 
123  void setFormatString(const std::string& fmt);
124  void setArgStores(std::vector<llvm::StoreInst*>&& stores);
125  void setArgs(std::vector<llvm::Value*>&& args);
126  void setRetLoads(std::vector<llvm::LoadInst*>&& loads);
127  void setRetValues(std::vector<llvm::Value*>&& values);
128 
129  llvm::CallInst* getCallInstruction() const;
130  const FunctionEntry* getBaseFunction() const;
131  std::string getFormatString() const;
132 
133  public:
134  const std::vector<llvm::StoreInst*>& argStores() const;
135  const std::vector<llvm::Value*>& retValues() const;
136  const std::vector<llvm::LoadInst*>& retLoads() const;
137 
138  private:
140 
141  llvm::CallInst* _callInst = nullptr;
142  std::string _fmtStr = "";
143 
144  std::vector<llvm::LoadInst*> _retLoads;
145  std::vector<llvm::Value*> _retValues;
146  std::vector<llvm::StoreInst*> _argStores;
147 };
148 
150 {
151  // Constructor
152  //
153  public:
154  DataFlowEntry(llvm::Value* called);
155 
156  // Type information
157  //
158  public:
159  bool isFunction() const;
160  bool isValue() const;
161  bool hasDefinition() const;
162 
163  llvm::Function* getFunction() const;
164  llvm::Value* getValue() const;
165 
166  void setCalledValue(llvm::Value* called);
167 
168  std::size_t numberOfCalls() const;
169  bool hasBranches() const;
170  bool storesOnRawStack(const Abi& abi) const;
171 
172  void setIsFullyDecoded(bool res = true);
173  bool isFullyDecoded() const;
174 
175  // Usage data.
176  //
177  public:
178  CallEntry* createCallEntry(llvm::CallInst *call);
179  const std::vector<CallEntry>& callEntries() const;
180  std::vector<CallEntry>& callEntries();
181 
182  private:
183  llvm::Value* _calledValue = nullptr;
184 
185  std::vector<CallEntry> _calls;
186  bool _decoded = true;
187 };
188 
189 } // namespace bin2llvmir
190 } // namespace retdec
191 
192 #endif
Calling convention information.
Definition: abi.h:27
Definition: data_entries.h:110
void setArgStores(std::vector< llvm::StoreInst * > &&stores)
Definition: data_entries.cpp:294
void setFormatString(const std::string &fmt)
Definition: data_entries.cpp:289
std::string _fmtStr
Definition: data_entries.h:142
std::vector< llvm::StoreInst * > _argStores
Definition: data_entries.h:146
const FunctionEntry * _baseFunction
Definition: data_entries.h:139
std::vector< llvm::LoadInst * > _retLoads
Definition: data_entries.h:144
const std::vector< llvm::StoreInst * > & argStores() const
Definition: data_entries.cpp:369
const std::vector< llvm::LoadInst * > & retLoads() const
Definition: data_entries.cpp:379
CallEntry(llvm::CallInst *call, const FunctionEntry *base=nullptr)
Definition: data_entries.cpp:275
void setArgs(std::vector< llvm::Value * > &&args)
Definition: data_entries.cpp:307
std::vector< llvm::Value * > _retValues
Definition: data_entries.h:145
void addRetLoad(llvm::LoadInst *load)
Definition: data_entries.cpp:281
std::string getFormatString() const
Definition: data_entries.cpp:364
llvm::CallInst * _callInst
Definition: data_entries.h:141
llvm::CallInst * getCallInstruction() const
Definition: data_entries.cpp:354
const FunctionEntry * getBaseFunction() const
Definition: data_entries.cpp:359
void setRetValues(std::vector< llvm::Value * > &&values)
Definition: data_entries.cpp:337
const std::vector< llvm::Value * > & retValues() const
Definition: data_entries.cpp:374
void setRetLoads(std::vector< llvm::LoadInst * > &&loads)
Definition: data_entries.cpp:325
Definition: data_entries.h:48
const std::vector< llvm::Value * > & args() const
Definition: data_entries.cpp:159
std::vector< std::string > _argNames
Definition: data_entries.h:67
void setVoidarg(bool voidarg=true)
Definition: data_entries.cpp:132
const std::vector< llvm::Type * > & argTypes() const
Definition: data_entries.cpp:164
std::vector< llvm::Value * > _args
Definition: data_entries.h:65
const std::vector< std::string > & argNames() const
Definition: data_entries.cpp:169
void addArg(llvm::Value *arg)
Definition: data_entries.cpp:127
bool isVoidarg() const
Definition: data_entries.cpp:122
std::vector< llvm::Type * > _argTypes
Definition: data_entries.h:66
bool _voidarg
Definition: data_entries.h:70
void setArgTypes(std::vector< llvm::Type * > &&types, std::vector< std::string > &&names={})
Definition: data_entries.cpp:137
Definition: data_entries.h:150
llvm::Function * getFunction() const
Definition: data_entries.cpp:420
llvm::Value * getValue() const
Definition: data_entries.cpp:425
llvm::Value * _calledValue
Definition: data_entries.h:183
CallEntry * createCallEntry(llvm::CallInst *call)
Definition: data_entries.cpp:493
void setIsFullyDecoded(bool res=true)
Definition: data_entries.cpp:405
std::size_t numberOfCalls() const
Definition: data_entries.cpp:435
bool _decoded
Definition: data_entries.h:186
bool isValue() const
Definition: data_entries.cpp:400
DataFlowEntry(llvm::Value *called)
Definition: data_entries.cpp:390
bool hasBranches() const
Definition: data_entries.cpp:453
bool isFullyDecoded() const
Definition: data_entries.cpp:410
void setCalledValue(llvm::Value *called)
Definition: data_entries.cpp:430
bool hasDefinition() const
Definition: data_entries.cpp:415
bool storesOnRawStack(const Abi &abi) const
Definition: data_entries.cpp:467
bool isFunction() const
Definition: data_entries.cpp:395
std::vector< CallEntry > _calls
Definition: data_entries.h:185
const std::vector< CallEntry > & callEntries() const
Definition: data_entries.cpp:499
Definition: data_entries.h:74
ReturnEntry * createRetEntry(llvm::ReturnInst *ret)
Definition: data_entries.cpp:195
void setVariadic(bool variadic=true)
Definition: data_entries.cpp:202
llvm::CallInst * getWrappedCall() const
Definition: data_entries.cpp:249
llvm::Type * _retType
Definition: data_entries.h:101
const std::vector< ReturnEntry > & retEntries() const
Definition: data_entries.cpp:259
llvm::Value * getRetValue() const
Definition: data_entries.cpp:244
void setArgs(std::vector< llvm::Value * > &&args)
Definition: data_entries.cpp:207
CallingConvention::ID _callconv
Definition: data_entries.h:104
std::vector< ReturnEntry > _retEntries
Definition: data_entries.h:106
void setRetType(llvm::Type *type)
Definition: data_entries.cpp:217
bool _variadic
Definition: data_entries.h:103
void setWrappedCall(llvm::CallInst *wrap)
Definition: data_entries.cpp:212
bool isVariadic() const
Definition: data_entries.cpp:180
void setCallingConvention(const CallingConvention::ID &cc)
Definition: data_entries.cpp:227
llvm::Type * getRetType() const
Definition: data_entries.cpp:239
void addRetEntry(const ReturnEntry &ret)
Definition: data_entries.cpp:190
bool isWrapper() const
Definition: data_entries.cpp:185
llvm::Value * _retVal
Definition: data_entries.h:102
CallingConvention::ID getCallingConvention() const
Definition: data_entries.cpp:254
llvm::CallInst * _wrap
Definition: data_entries.h:100
void setRetValue(llvm::Value *val)
Definition: data_entries.cpp:222
Definition: data_entries.h:21
const std::vector< llvm::Value * > & retValues() const
Definition: data_entries.cpp:111
std::vector< llvm::StoreInst * > _retStores
Definition: data_entries.h:43
ReturnEntry(llvm::ReturnInst *r)
Definition: data_entries.cpp:23
const std::vector< llvm::StoreInst * > & retStores() const
Definition: data_entries.cpp:106
std::vector< llvm::Value * > _retValues
Definition: data_entries.h:44
llvm::ReturnInst * getRetInstruction() const
Definition: data_entries.cpp:101
void addRetStore(llvm::StoreInst *st)
Definition: data_entries.cpp:28
llvm::ReturnInst * _retInst
Definition: data_entries.h:41
void setRetValues(std::vector< llvm::Value * > &&values)
Definition: data_entries.cpp:67
void setRetStores(std::vector< llvm::StoreInst * > &&stores)
Definition: data_entries.cpp:41
eCC
Definition: calling_convention.h:24
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19