retdec
collector.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_COLLECTOR_COLLECTOR_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_COLLECTOR_COLLECTOR_H
9 
10 #include <map>
11 #include <vector>
12 
13 #include <llvm/IR/Instructions.h>
14 #include <llvm/IR/Module.h>
15 
19 
20 namespace retdec {
21 namespace bin2llvmir {
22 
23 class Collector
24 {
25  public:
26  typedef std::unique_ptr<Collector> Ptr;
27 
28  public:
29  Collector(
30  const Abi* abi,
31  llvm::Module* m,
32  const ReachingDefinitionsAnalysis* rda);
33 
34  virtual ~Collector() = default;
35 
36  public:
37  virtual void collectCallArgs(CallEntry* ce) const;
38  virtual void collectCallRets(CallEntry* ce) const;
39 
40  virtual void collectDefArgs(DataFlowEntry* de) const;
41  virtual void collectDefRets(DataFlowEntry* de) const;
42 
43  virtual void collectCallSpecificTypes(CallEntry* ce) const;
44 
45  protected:
46 
47  void collectRetStores(ReturnEntry* re) const;
48 
50  llvm::Instruction* i,
51  std::vector<llvm::StoreInst*>& stores) const;
52 
54  llvm::Instruction* i,
55  std::vector<llvm::LoadInst*>& loads) const;
56 
58  llvm::Instruction* i,
59  std::vector<llvm::LoadInst*>& loads,
60  std::set<llvm::Value*>& excluded) const;
61 
63  llvm::Instruction* i,
64  std::vector<llvm::StoreInst*>& stores) const;
65 
67  llvm::Instruction* i,
68  std::vector<llvm::StoreInst*>& stores,
69  std::map<llvm::BasicBlock*,
70  std::set<llvm::Value*>>& seen) const;
71 
73  llvm::Instruction* i,
74  std::set<llvm::Value*>& values,
75  std::vector<llvm::StoreInst*>& stores) const;
76 
77  protected:
78  bool extractFormatString(CallEntry* ce) const;
79 
80  bool storesString(llvm::StoreInst* si, std::string& str) const;
81  llvm::Value* getRoot(llvm::Value* i) const;
82  llvm::Value* _getRoot(llvm::Value* i, std::set<llvm::Value*>& seen) const;
83 
84  protected:
85  const Abi* _abi;
86  llvm::Module* _module;
88 };
89 
91 {
92  public:
94  const Abi* abi,
95  llvm::Module* m,
96  const ReachingDefinitionsAnalysis* rda);
97 };
98 
99 } // namespace bin2llvmir
100 } // namespace retdec
101 
102 #endif
ABI information.
Definition: abi.h:27
Definition: data_entries.h:110
Definition: collector.h:91
static Collector::Ptr createCollector(const Abi *abi, llvm::Module *m, const ReachingDefinitionsAnalysis *rda)
Definition: collector.cpp:606
Definition: collector.h:24
void collectStoresBeforeInstruction(llvm::Instruction *i, std::vector< llvm::StoreInst * > &stores) const
Definition: collector.cpp:133
virtual ~Collector()=default
virtual void collectCallArgs(CallEntry *ce) const
Definition: collector.cpp:30
virtual void collectCallSpecificTypes(CallEntry *ce) const
Definition: collector.cpp:466
bool storesString(llvm::StoreInst *si, std::string &str) const
Definition: collector.cpp:516
void collectStoresInSinglePredecessors(llvm::Instruction *i, std::vector< llvm::StoreInst * > &stores) const
Definition: collector.cpp:177
const ReachingDefinitionsAnalysis * _rda
Definition: collector.h:87
bool collectStoresInInstructionBlock(llvm::Instruction *i, std::set< llvm::Value * > &values, std::vector< llvm::StoreInst * > &stores) const
Definition: collector.cpp:304
bool extractFormatString(CallEntry *ce) const
Definition: collector.cpp:490
void collectRetStores(ReturnEntry *re) const
Definition: collector.cpp:107
llvm::Module * _module
Definition: collector.h:86
virtual void collectDefArgs(DataFlowEntry *de) const
Definition: collector.cpp:52
std::unique_ptr< Collector > Ptr
Definition: collector.h:26
void collectStoresRecursively(llvm::Instruction *i, std::vector< llvm::StoreInst * > &stores, std::map< llvm::BasicBlock *, std::set< llvm::Value * >> &seen) const
Definition: collector.cpp:242
virtual void collectCallRets(CallEntry *ce) const
Definition: collector.cpp:41
void collectLoadsAfterInstruction(llvm::Instruction *i, std::vector< llvm::LoadInst * > &loads) const
Definition: collector.cpp:370
Collector(const Abi *abi, llvm::Module *m, const ReachingDefinitionsAnalysis *rda)
Definition: collector.cpp:20
llvm::Value * _getRoot(llvm::Value *i, std::set< llvm::Value * > &seen) const
Definition: collector.cpp:553
llvm::Value * getRoot(llvm::Value *i) const
Definition: collector.cpp:547
virtual void collectDefRets(DataFlowEntry *de) const
Definition: collector.cpp:88
const Abi * _abi
Definition: collector.h:85
Definition: data_entries.h:150
Definition: reaching_definitions.h:121
Definition: data_entries.h:21
Data entries for parameter analysis.
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19
Reaching definitions analysis (RDA) builds UD and DU chains.