retdec
param_return.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_PARAM_RETURN_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_PARAM_RETURN_PARAM_RETURN_H
9 
10 #include <map>
11 #include <vector>
12 
13 #include <llvm/IR/Function.h>
14 #include <llvm/IR/Instructions.h>
15 #include <llvm/IR/Module.h>
16 #include <llvm/Pass.h>
17 
27 
28 namespace retdec {
29 namespace bin2llvmir {
30 
31 class ParamReturn : public llvm::ModulePass
32 {
33  public:
34  static char ID;
35  ParamReturn();
36  bool runOnModuleCustom(
37  llvm::Module& m,
38  Config* c,
39  Abi* abi,
40  Demangler* demangler,
41  FileImage* img = nullptr,
42  DebugFormat* dbgf = nullptr,
43  Lti* lti = nullptr);
44  virtual bool runOnModule(llvm::Module& m) override;
45 
46  private:
47  bool run();
48  void dumpInfo() const;
49  void dumpInfo(const DataFlowEntry& de) const;
50  void dumpInfo(const CallEntry& ce) const;
51  void dumpInfo(const ReturnEntry& de) const;
52 
53  // Collection of functions.
54  //
55  private:
56  void collectAllCalls();
57 
58  DataFlowEntry createDataFlowEntry(llvm::Value* calledValue) const;
59 
60  private:
61  void collectExtraData(DataFlowEntry* de) const;
62  void collectExtraData(CallEntry* ce) const;
63 
65  common::CallingConventionID toCallConv(const std::string &cc) const;
66 
67  // Collection of functions usage data.
68  //
69  private:
70  void addDataFromCall(DataFlowEntry *dataflow, llvm::CallInst *call) const;
71 
72  // Optimizations.
73  //
74  private:
75  llvm::CallInst* getWrapper(llvm::Function* fnc) const;
76  llvm::Type* extractType(llvm::Value* from) const;
77 
78  // Filtration of collected functions arguments.
79  //
80  private:
81  void filterCalls();
82  void modifyType(DataFlowEntry& de) const;
83 
84  // Demangling informations.
85  //
86  private:
87  void analyzeWithDemangler(DataFlowEntry& de) const;
89 
90  // Modification of functions in IR.
91  //
92  private:
93  void applyToIr();
94  void applyToIr(DataFlowEntry& de);
95  void connectWrappers(const DataFlowEntry& de);
96 
97  std::map<llvm::CallInst*, std::vector<llvm::Value*>> fetchLoadsOfCalls(
98  const std::vector<CallEntry>& calls) const;
99 
100  private:
101  llvm::Module* _module = nullptr;
102  Config* _config = nullptr;
103  Abi* _abi = nullptr;
104  FileImage* _image = nullptr;
105  DebugFormat* _dbgf = nullptr;
106  Lti* _lti = nullptr;
107  Demangler* _demangler = nullptr;
108 
109  std::map<llvm::Value*, DataFlowEntry> _fnc2calls;
112 };
113 
114 } // namespace bin2llvmir
115 } // namespace retdec
116 
117 #endif
ABI information.
Config DB provider for bin2llvmirl.
Debug format provider for bin2llvmirl.
Demangler provider for bin2llvmirl.
Definition: abi.h:27
Definition: data_entries.h:110
std::unique_ptr< Collector > Ptr
Definition: collector.h:26
Definition: config.h:24
Definition: data_entries.h:150
Definition: debugformat.h:20
Definition: demangler.h:34
std::pair< llvm::Function *, std::shared_ptr< retdec::ctypes::Function > > FunctionPair
Definition: demangler.h:38
Definition: fileimage.h:27
Definition: lti.h:21
Definition: param_return.h:32
std::map< llvm::Value *, DataFlowEntry > _fnc2calls
Definition: param_return.h:109
void modifyWithDemangledData(DataFlowEntry &de, Demangler::FunctionPair &funcPair) const
Definition: param_return.cpp:738
bool runOnModuleCustom(llvm::Module &m, Config *c, Abi *abi, Demangler *demangler, FileImage *img=nullptr, DebugFormat *dbgf=nullptr, Lti *lti=nullptr)
Definition: param_return.cpp:67
void collectCallSpecificTypes(CallEntry *ce) const
ReachingDefinitionsAnalysis _RDA
Definition: param_return.h:110
llvm::Module * _module
Definition: param_return.h:101
void collectAllCalls()
Definition: param_return.cpp:114
void dumpInfo() const
Definition: param_return.cpp:561
void filterCalls()
Definition: param_return.cpp:682
void analyzeWithDemangler(DataFlowEntry &de) const
Definition: param_return.cpp:725
void modifyType(DataFlowEntry &de) const
Definition: param_return.cpp:831
void addDataFromCall(DataFlowEntry *dataflow, llvm::CallInst *call) const
Definition: param_return.cpp:538
Collector::Ptr _collector
Definition: param_return.h:111
void collectExtraData(DataFlowEntry *de) const
Definition: param_return.cpp:185
DebugFormat * _dbgf
Definition: param_return.h:105
void applyToIr()
Definition: param_return.cpp:924
llvm::Type * extractType(llvm::Value *from) const
Definition: param_return.cpp:806
std::map< llvm::CallInst *, std::vector< llvm::Value * > > fetchLoadsOfCalls(const std::vector< CallEntry > &calls) const
Definition: param_return.cpp:1139
DataFlowEntry createDataFlowEntry(llvm::Value *calledValue) const
Definition: param_return.cpp:159
common::CallingConventionID toCallConv(const std::string &cc) const
Definition: param_return.cpp:171
llvm::CallInst * getWrapper(llvm::Function *fnc) const
Definition: param_return.cpp:428
Abi * _abi
Definition: param_return.h:103
bool run()
Definition: param_return.cpp:88
static char ID
Definition: param_return.h:34
Lti * _lti
Definition: param_return.h:106
Demangler * _demangler
Definition: param_return.h:107
Config * _config
Definition: param_return.h:102
virtual bool runOnModule(llvm::Module &m) override
Definition: param_return.cpp:53
void connectWrappers(const DataFlowEntry &de)
Definition: param_return.cpp:1024
FileImage * _image
Definition: param_return.h:104
ParamReturn()
Definition: param_return.cpp:47
Definition: reaching_definitions.h:121
Definition: data_entries.h:21
eCC
Definition: calling_convention.h:24
Collects possible arguments and returns of functions.
Data entries for parameter analysis.
File image provider for bin2llvmirl.
Library type information provider for bin2llvmirl.
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19
Reaching definitions analysis (RDA) builds UD and DU chains.