retdec
filter.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_FILTER_FILTER_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_FILTER_FILTER_H
9 
10 #include <llvm/IR/Instructions.h>
11 
16 
17 namespace retdec {
18 namespace bin2llvmir {
19 
21 {
22  public:
23  enum class Order {
24  ORD_GPR,
26  ORD_FPR,
28  ORD_DOUBR,
30  ORD_VECR,
32  ORD_STACK,
34  };
35 
36  public:
37  std::vector<uint32_t> gpRegisters;
38  std::vector<uint32_t> fpRegisters;
39  std::vector<uint32_t> doubleRegisters;
40  std::vector<uint32_t> vectorRegisters;
41  std::vector<llvm::Value*> stacks;
42  std::vector<llvm::Type*> knownTypes;
43  std::vector<Order> knownOrder;
44 };
45 
47 
48 class Filter
49 {
50  public:
51  typedef std::unique_ptr<Filter> Ptr;
52 
53  public:
54  Filter(const Abi* _abi, const CallingConvention* _cc);
55  virtual ~Filter() = default;
56 
57  void filterDefinition(DataFlowEntry* de) const;
58  void filterCalls(DataFlowEntry* de) const;
60  DataFlowEntry* de,
61  const Collector* collector) const;
62 
63  void estimateRetValue(DataFlowEntry* de) const;
64 
65  protected:
66  virtual void filterDefinitionArgs(
67  FilterableLayout& args,
68  bool isVoidarg) const;
69 
70  virtual void filterCallArgs(
71  FilterableLayout& args,
72  bool isVoidarg) const;
73 
74  virtual void filterCallArgsByDefLayout(
75  FilterableLayout& args,
76  const FilterableLayout& def) const;
77 
78  virtual void filterRets(
79  FilterableLayout& rets) const;
80 
81  virtual void filterRetsByDefLayout(
82  FilterableLayout& args,
83  const FilterableLayout& def) const;
84 
85  virtual void filterArgsByKnownTypes(FilterableLayout& lay) const;
86  virtual void filterRetsByKnownTypes(FilterableLayout& lay) const;
87 
88  protected:
89  void leaveCommonArgs(
90  std::vector<FilterableLayout>& allArgs) const;
91 
92  void leaveCommonRets(
93  std::vector<FilterableLayout>& allRets) const;
94 
95  void leaveCommon(
96  std::vector<FilterableLayout>& allRets) const;
97 
98  void orderFiterableLayout(FilterableLayout& lay) const;
99 
100  void orderStacks(
101  std::vector<llvm::Value*>& stacks,
102  bool asc = true) const;
103 
104  void orderRegistersBy(
105  std::vector<uint32_t>& regs,
106  const std::vector<uint32_t>& orderedVector) const;
107 
108  protected:
110  const std::vector<llvm::Value*>& group,
111  const std::vector<llvm::Type*>& knownTypes) const;
112 
114  const std::vector<llvm::Value*>& group,
115  llvm::Type* knownType) const;
116 
118  const std::vector<llvm::Value*>& group,
119  const std::vector<llvm::Type*>& knownTypes) const;
120 
122  const std::vector<llvm::Value*>& paramValues) const;
123 
125  const std::vector<llvm::Value*>& paramValues) const;
126 
127  virtual std::vector<llvm::Value*> createGroupedArgValues(
128  const FilterableLayout& lay) const;
129 
130  virtual std::vector<llvm::Value*> createGroupedRetValues(
131  const FilterableLayout& lay) const;
132 
134  const std::vector<llvm::Value*>& paramValues,
135  const std::vector<uint32_t>& gpRegs,
136  const std::vector<uint32_t>& fpRegs,
137  const std::vector<uint32_t>& doubleRegs,
138  const std::vector<uint32_t>& vecRegs) const;
139 
140  std::vector<llvm::Value*> createGroupedValues(
141  const FilterableLayout& lay) const;
142 
143  std::vector<llvm::Type*> expandTypes(
144  const std::vector<llvm::Type*>& types) const;
145 
146  protected:
147  std::size_t fetchGPRegsForType(
148  llvm::Type* type,
149  FilterableLayout& lay) const;
150 
151  std::size_t fetchFPRegsForType(
152  llvm::Type* type,
153  FilterableLayout& lay) const;
154 
155  std::size_t fetchDoubleRegsForType(
156  llvm::Type* type,
157  FilterableLayout& lay) const;
158 
159  std::size_t fetchVecRegsForType(
160  llvm::Type* type,
161  FilterableLayout& lay) const;
162 
163  std::size_t fetchRegsForType(
164  llvm::Type* type,
165  std::vector<uint32_t>& store,
166  const std::vector<uint32_t>& regs,
167  std::size_t maxRegsPerObject) const;
168 
169  protected:
170  std::size_t getNumberOfStacksForType(llvm::Type* type) const;
171 
172  protected:
173  void leaveOnlyPositiveStacks(FilterableLayout& lay) const;
177  void leaveSameStacks(FilterableLayout& lay, const FilterableLayout& fig) const;
178 
180  std::vector<uint32_t>& regs,
181  const std::vector<uint32_t>& templRegs) const;
182 
184 
185  protected:
186  const Abi* _abi;
188 };
189 
191 {
192  public:
193  static Filter::Ptr createFilter(Abi* abi, const CallingConvention::ID& id);
194 };
195 
196 }
197 }
198 
199 #endif
ABI information.
Calling convention information.
Definition: abi.h:27
Definition: calling_convention.h:22
Definition: collector.h:24
Definition: data_entries.h:150
Definition: filter.h:191
static Filter::Ptr createFilter(Abi *abi, const CallingConvention::ID &id)
Definition: filter.cpp:1367
Definition: filter.h:49
void filterCallsVariadic(DataFlowEntry *de, const Collector *collector) const
Definition: filter.cpp:250
FilterableLayout createArgsFilterableLayout(const std::vector< llvm::Value * > &group, const std::vector< llvm::Type * > &knownTypes) const
Definition: filter.cpp:920
virtual std::vector< llvm::Value * > createGroupedArgValues(const FilterableLayout &lay) const
Definition: filter.cpp:1019
std::size_t fetchGPRegsForType(llvm::Type *type, FilterableLayout &lay) const
Definition: filter.cpp:520
virtual void filterArgsByKnownTypes(FilterableLayout &lay) const
Definition: filter.cpp:399
virtual FilterableLayout separateArgValues(const std::vector< llvm::Value * > &paramValues) const
Definition: filter.cpp:952
void orderRegistersBy(std::vector< uint32_t > &regs, const std::vector< uint32_t > &orderedVector) const
Definition: filter.cpp:904
void leaveOnlyContinuousRegisters(std::vector< uint32_t > &regs, const std::vector< uint32_t > &templRegs) const
Definition: filter.cpp:1333
void leaveOnlyPositiveStacks(FilterableLayout &lay) const
Definition: filter.cpp:1158
const CallingConvention * _cc
Definition: filter.h:187
std::size_t fetchDoubleRegsForType(llvm::Type *type, FilterableLayout &lay) const
Definition: filter.cpp:560
void createContinuousArgRegisters(FilterableLayout &lay) const
Definition: filter.cpp:1259
void estimateRetValue(DataFlowEntry *de) const
Definition: filter.cpp:32
std::unique_ptr< Filter > Ptr
Definition: filter.h:51
FilterableLayout createRetsFilterableLayout(const std::vector< llvm::Value * > &group, llvm::Type *knownType) const
Definition: filter.cpp:932
void leaveCommonRets(std::vector< FilterableLayout > &allRets) const
Definition: filter.cpp:804
const Abi * _abi
Definition: filter.h:186
virtual void filterCallArgs(FilterableLayout &args, bool isVoidarg) const
Definition: filter.cpp:337
void leaveCommon(std::vector< FilterableLayout > &allRets) const
Definition: filter.cpp:809
void leaveSameStacks(FilterableLayout &lay, const FilterableLayout &fig) const
Definition: filter.cpp:1356
void filterCalls(DataFlowEntry *de) const
Definition: filter.cpp:136
std::vector< llvm::Type * > expandTypes(const std::vector< llvm::Type * > &types) const
Definition: filter.cpp:481
virtual void filterRets(FilterableLayout &rets) const
Definition: filter.cpp:373
void filterDefinition(DataFlowEntry *de) const
Definition: filter.cpp:98
void leaveCommonArgs(std::vector< FilterableLayout > &allArgs) const
Definition: filter.cpp:799
Filter(const Abi *_abi, const CallingConvention *_cc)
Definition: filter.cpp:24
void leaveOnlyContinuousArgRegisters(FilterableLayout &lay) const
Definition: filter.cpp:1206
void leaveOnlyContinuousStack(FilterableLayout &lay) const
Definition: filter.cpp:1172
virtual void filterDefinitionArgs(FilterableLayout &args, bool isVoidarg) const
Definition: filter.cpp:313
std::size_t fetchFPRegsForType(llvm::Type *type, FilterableLayout &lay) const
Definition: filter.cpp:540
virtual FilterableLayout separateRetValues(const std::vector< llvm::Value * > &paramValues) const
Definition: filter.cpp:962
void orderStacks(std::vector< llvm::Value * > &stacks, bool asc=true) const
Definition: filter.cpp:873
virtual ~Filter()=default
std::size_t fetchVecRegsForType(llvm::Type *type, FilterableLayout &lay) const
Definition: filter.cpp:580
virtual void filterRetsByDefLayout(FilterableLayout &args, const FilterableLayout &def) const
Definition: filter.cpp:385
void orderFiterableLayout(FilterableLayout &lay) const
Definition: filter.cpp:864
virtual void filterRetsByKnownTypes(FilterableLayout &lay) const
Definition: filter.cpp:693
virtual std::vector< llvm::Value * > createGroupedRetValues(const FilterableLayout &lay) const
Definition: filter.cpp:1024
virtual void filterCallArgsByDefLayout(FilterableLayout &args, const FilterableLayout &def) const
Definition: filter.cpp:359
std::size_t fetchRegsForType(llvm::Type *type, std::vector< uint32_t > &store, const std::vector< uint32_t > &regs, std::size_t maxRegsPerObject) const
Definition: filter.cpp:600
void leaveOnlyContinuousRetRegisters(FilterableLayout &lay) const
Definition: filter.cpp:1325
FilterableLayout separateValues(const std::vector< llvm::Value * > &paramValues, const std::vector< uint32_t > &gpRegs, const std::vector< uint32_t > &fpRegs, const std::vector< uint32_t > &doubleRegs, const std::vector< uint32_t > &vecRegs) const
Definition: filter.cpp:975
std::size_t getNumberOfStacksForType(llvm::Type *type) const
Definition: filter.cpp:679
std::vector< llvm::Value * > createGroupedValues(const FilterableLayout &lay) const
Definition: filter.cpp:1029
std::vector< uint32_t > vectorRegisters
Definition: filter.h:40
std::vector< uint32_t > gpRegisters
Definition: filter.h:37
std::vector< llvm::Type * > knownTypes
Definition: filter.h:42
std::vector< llvm::Value * > stacks
Definition: filter.h:41
std::vector< uint32_t > fpRegisters
Definition: filter.h:38
std::vector< uint32_t > doubleRegisters
Definition: filter.h:39
std::vector< Order > knownOrder
Definition: filter.h:43
eCC
Definition: calling_convention.h:24
Collects possible arguments and returns of functions.
Data entries for parameter analysis.
The frontend-end part of the decompiler.
FilterableLayout::Order OrderID
Definition: filter.h:46
Definition: archive_wrapper.h:19