retdec
config.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_PROVIDERS_CONFIG_H
8 #define RETDEC_BIN2LLVMIR_PROVIDERS_CONFIG_H
9 
10 #include <optional>
11 
12 #include "retdec/config/config.h"
13 
14 #include <llvm/IR/Instructions.h>
15 #include <llvm/IR/Module.h>
16 
17 #include "retdec/common/address.h"
19 
20 namespace retdec {
21 namespace bin2llvmir {
22 
23 class Config
24 {
25  public:
26  static Config empty(llvm::Module* m);
27  static Config fromConfig(llvm::Module* m, retdec::config::Config& c);
28 
29  void doFinalization();
31 
32  public:
34  const retdec::config::Config& getConfig() const;
35 
36  // Function
37  //
39  const llvm::Function* fnc);
41  retdec::common::Address startAddr);
42 
43  llvm::Function* getLlvmFunction(
44  retdec::common::Address startAddr);
45 
47  const llvm::Function* fnc);
48 
49  // Intrinsic functions.
50  //
51  using IntrinsicFunctionCreatorPtr = llvm::Function* (*)(llvm::Module*);
53 
54  // Register
55  //
57  const llvm::Value* val);
58  std::optional<unsigned> getConfigRegisterNumber(
59  const llvm::Value* val);
60 
61  // Global
62  //
64  const llvm::GlobalVariable* gv);
66  retdec::common::Address address);
67 
68  llvm::GlobalVariable* getLlvmGlobalVariable(
69  retdec::common::Address address);
70  llvm::GlobalVariable* getLlvmGlobalVariable(
71  const std::string& name,
72  retdec::common::Address address);
73 
75  const llvm::GlobalVariable* gv);
76 
77  bool isGlobalVariable(const llvm::Value* val);
78 
79  // Local + Stack
80  //
82  const llvm::Value* val);
84  const llvm::Value* val);
85 
86  llvm::AllocaInst* getLlvmStackVariable(
87  llvm::Function* fnc,
88  int offset);
89 
90  llvm::AllocaInst* getLlvmStackVariable(
91  llvm::Function* fnc,
92  const std::string& realName);
93 
94  bool isStackVariable(const llvm::Value* val);
95  std::optional<int> getStackVariableOffset(
96  const llvm::Value* val);
97 
98  // Insert
99  //
101  const llvm::GlobalVariable* gv,
102  retdec::common::Address address,
103  bool fromDebug = false,
104  const std::string& realName = "",
105  const std::string& cryptoDesc = "");
106 
108  const llvm::AllocaInst* sv,
109  int offset,
110  bool fromDebug = false,
111  const std::string& realName = std::string());
112 
114  const llvm::Function* fnc,
117  bool fromDebug = false);
118 
121  const std::string& name);
122 
123  // Pseudo-functions.
124  //
125  void setLlvmCallPseudoFunction(llvm::Function* f);
126  llvm::Function* getLlvmCallPseudoFunction() const;
127  bool isLlvmCallPseudoFunction(llvm::Value* f);
128  llvm::CallInst* isLlvmCallPseudoFunctionCall(llvm::Value* c);
129 
130  void setLlvmReturnPseudoFunction(llvm::Function* f);
131  llvm::Function* getLlvmReturnPseudoFunction() const;
132  bool isLlvmReturnPseudoFunction(llvm::Value* f);
133  llvm::CallInst* isLlvmReturnPseudoFunctionCall(llvm::Value* c);
134 
135  void setLlvmBranchPseudoFunction(llvm::Function* f);
136  llvm::Function* getLlvmBranchPseudoFunction() const;
137  bool isLlvmBranchPseudoFunction(llvm::Value* f);
138  llvm::CallInst* isLlvmBranchPseudoFunctionCall(llvm::Value* c);
139 
140  void setLlvmCondBranchPseudoFunction(llvm::Function* f);
141  llvm::Function* getLlvmCondBranchPseudoFunction() const;
142  bool isLlvmCondBranchPseudoFunction(llvm::Value* f);
143  llvm::CallInst* isLlvmCondBranchPseudoFunctionCall(llvm::Value* c);
144 
145  llvm::CallInst* isLlvmAnyBranchPseudoFunctionCall(llvm::Value* c);
146  llvm::CallInst* isLlvmAnyUncondBranchPseudoFunctionCall(llvm::Value* c);
147 
148  // x86-specific pseudo-functions.
149  //
150  void setLlvmX87DataStorePseudoFunction(llvm::Function* f);
151  llvm::Function* getLlvmX87DataStorePseudoFunction() const;
152  bool isLlvmX87DataStorePseudoFunction(llvm::Value* f);
153  llvm::CallInst* isLlvmX87DataStorePseudoFunctionCall(llvm::Value* c);
154 
155  void setLlvmX87DataLoadPseudoFunction(llvm::Function* f);
156  llvm::Function* getLlvmX87DataLoadPseudoFunction() const;
157  bool isLlvmX87DataLoadPseudoFunction(llvm::Value* f);
158  llvm::CallInst* isLlvmX87DataLoadPseudoFunctionCall(llvm::Value* c);
159 
160  llvm::CallInst* isLlvmX87StorePseudoFunctionCall(llvm::Value* c);
161  llvm::CallInst* isLlvmX87LoadPseudoFunctionCall(llvm::Value* c);
162 
163  // Assembly pseudo-functions.
164  //
165  void addPseudoAsmFunction(llvm::Function* f);
166  bool isPseudoAsmFunction(llvm::Function* f);
167  llvm::CallInst* isPseudoAsmFunctionCall(llvm::Value* c);
168 
169  // Other
170  //
171  llvm::GlobalVariable* getGlobalDummy();
172  fs::path getOutputDirectory();
173  bool getCryptoPattern(
175  std::string& name,
176  std::string& description,
177  llvm::Type*& type) const;
178 
179  private:
181 
182  public:
183  llvm::Module* _module = nullptr;
184 
185  private:
187  llvm::GlobalVariable* _globalDummy = nullptr;
188 
189  llvm::Function* _callFunction = nullptr;
190  llvm::Function* _returnFunction = nullptr;
191  llvm::Function* _branchFunction = nullptr;
192  llvm::Function* _condBranchFunction = nullptr;
193 
194  llvm::Function* _x87DataStoreFunction = nullptr; // void (i3, fp80)
195  llvm::Function* _x87DataLoadFunction = nullptr; // fp80 (i3)
196 
197  std::map<IntrinsicFunctionCreatorPtr, llvm::Function*> _intrinsicFunctions;
198  std::set<llvm::Function*> _pseudoAsmFunctions;
199 };
200 
202 {
203  public:
204  static Config* addConfig(llvm::Module* m, retdec::config::Config& c);
205  static Config* getConfig(llvm::Module* m);
206  static bool getConfig(llvm::Module* m, Config*& c);
207  static void doFinalization(llvm::Module* m);
208  static void clear();
209 
210  private:
211  static std::map<llvm::Module*, Config> _module2config;
212 };
213 
214 } // namespace bin2llvmir
215 } // namespace retdec
216 
217 #endif
Definition: config.h:202
static Config * getConfig(llvm::Module *m)
Definition: config.cpp:743
static void clear()
Definition: config.cpp:767
static std::map< llvm::Module *, Config > _module2config
Definition: config.h:211
static Config * addConfig(llvm::Module *m, retdec::config::Config &c)
Definition: config.cpp:737
static void doFinalization(llvm::Module *m)
Definition: config.cpp:755
Definition: config.h:24
static Config fromConfig(llvm::Module *m, retdec::config::Config &c)
Definition: config.cpp:44
retdec::common::Object * getConfigStackVariable(const llvm::Value *val)
Definition: config.cpp:207
llvm::GlobalVariable * getGlobalDummy()
Definition: config.cpp:449
bool getCryptoPattern(retdec::common::Address addr, std::string &name, std::string &description, llvm::Type *&type) const
Definition: config.cpp:628
llvm::Function * _branchFunction
Definition: config.h:191
retdec::common::Address getFunctionAddress(const llvm::Function *fnc)
Definition: config.cpp:95
retdec::common::Function * getConfigFunction(const llvm::Function *fnc)
Definition: config.cpp:102
llvm::Function * getLlvmReturnPseudoFunction() const
Definition: config.cpp:492
std::optional< unsigned > getConfigRegisterNumber(const llvm::Value *val)
Definition: config.cpp:438
bool isPseudoAsmFunction(llvm::Function *f)
Definition: config.cpp:612
llvm::CallInst * isLlvmReturnPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:500
std::map< IntrinsicFunctionCreatorPtr, llvm::Function * > _intrinsicFunctions
Definition: config.h:197
llvm::Function * _callFunction
Definition: config.h:189
llvm::CallInst * isLlvmBranchPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:518
void setLlvmReturnPseudoFunction(llvm::Function *f)
Definition: config.cpp:488
const retdec::common::Object * getConfigGlobalVariable(const llvm::GlobalVariable *gv)
Definition: config.cpp:135
llvm::CallInst * isLlvmX87LoadPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:584
llvm::CallInst * isLlvmX87DataLoadPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:572
llvm::Function * _x87DataStoreFunction
Definition: config.h:194
llvm::CallInst * isLlvmX87StorePseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:578
void setLlvmBranchPseudoFunction(llvm::Function *f)
Definition: config.cpp:506
llvm::CallInst * isLlvmX87DataStorePseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:554
llvm::Function * getLlvmBranchPseudoFunction() const
Definition: config.cpp:510
void setLlvmX87DataStorePseudoFunction(llvm::Function *f)
Definition: config.cpp:542
llvm::Function * getLlvmX87DataStorePseudoFunction() const
Definition: config.cpp:546
bool isLlvmCallPseudoFunction(llvm::Value *f)
Definition: config.cpp:478
llvm::CallInst * isLlvmAnyBranchPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:590
llvm::Function * _returnFunction
Definition: config.h:190
llvm::Function * getIntrinsicFunction(IntrinsicFunctionCreatorPtr f)
Definition: config.cpp:120
llvm::CallInst * isLlvmCallPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:482
llvm::AllocaInst * getLlvmStackVariable(llvm::Function *fnc, int offset)
Definition: config.cpp:229
static Config empty(llvm::Module *m)
Definition: config.cpp:36
bool isLlvmBranchPseudoFunction(llvm::Value *f)
Definition: config.cpp:514
bool isGlobalVariable(const llvm::Value *val)
Definition: config.cpp:184
bool isLlvmCondBranchPseudoFunction(llvm::Value *f)
Definition: config.cpp:532
void tagFunctionsWithUsedCryptoGlobals()
Definition: config.cpp:694
retdec::config::Config & getConfig()
Definition: config.cpp:79
bool isLlvmReturnPseudoFunction(llvm::Value *f)
Definition: config.cpp:496
llvm::Function * getLlvmFunction(retdec::common::Address startAddr)
Definition: config.cpp:89
llvm::Module * _module
Definition: config.h:183
llvm::Function * getLlvmX87DataLoadPseudoFunction() const
Definition: config.cpp:564
Config(retdec::config::Config &c)
Definition: config.cpp:30
llvm::Function * getLlvmCondBranchPseudoFunction() const
Definition: config.cpp:528
retdec::common::Function * renameFunction(retdec::common::Function *fnc, const std::string &name)
Definition: config.cpp:404
bool isStackVariable(const llvm::Value *val)
Definition: config.cpp:296
const retdec::common::Object * insertStackVariable(const llvm::AllocaInst *sv, int offset, bool fromDebug=false, const std::string &realName=std::string())
Definition: config.cpp:333
retdec::common::Address getGlobalAddress(const llvm::GlobalVariable *gv)
Definition: config.cpp:176
const retdec::common::Object * getConfigRegister(const llvm::Value *val)
Definition: config.cpp:431
llvm::Function * getLlvmCallPseudoFunction() const
Definition: config.cpp:474
llvm::Function *(*)(llvm::Module *) IntrinsicFunctionCreatorPtr
Definition: config.h:51
bool isLlvmX87DataStorePseudoFunction(llvm::Value *f)
Definition: config.cpp:550
llvm::GlobalVariable * _globalDummy
Definition: config.h:187
std::set< llvm::Function * > _pseudoAsmFunctions
Definition: config.h:198
void doFinalization()
Definition: config.cpp:69
std::optional< int > getStackVariableOffset(const llvm::Value *val)
Definition: config.cpp:301
const retdec::common::Function * insertFunction(const llvm::Function *fnc, retdec::common::Address start=retdec::common::Address::Undefined, retdec::common::Address end=retdec::common::Address::Undefined, bool fromDebug=false)
Definition: config.cpp:370
llvm::GlobalVariable * getLlvmGlobalVariable(retdec::common::Address address)
Definition: config.cpp:147
llvm::CallInst * isLlvmCondBranchPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:536
void setLlvmX87DataLoadPseudoFunction(llvm::Function *f)
Definition: config.cpp:560
llvm::CallInst * isLlvmAnyUncondBranchPseudoFunctionCall(llvm::Value *c)
Definition: config.cpp:599
retdec::config::Config & _configDB
Definition: config.h:186
void setLlvmCallPseudoFunction(llvm::Function *f)
Definition: config.cpp:470
fs::path getOutputDirectory()
Definition: config.cpp:464
const retdec::common::Object * insertGlobalVariable(const llvm::GlobalVariable *gv, retdec::common::Address address, bool fromDebug=false, const std::string &realName="", const std::string &cryptoDesc="")
Definition: config.cpp:310
llvm::Function * _condBranchFunction
Definition: config.h:192
llvm::CallInst * isPseudoAsmFunctionCall(llvm::Value *c)
Definition: config.cpp:617
void addPseudoAsmFunction(llvm::Function *f)
Definition: config.cpp:607
llvm::Function * _x87DataLoadFunction
Definition: config.h:195
bool isLlvmX87DataLoadPseudoFunction(llvm::Value *f)
Definition: config.cpp:568
const retdec::common::Object * getConfigLocalVariable(const llvm::Value *val)
Definition: config.cpp:190
void setLlvmCondBranchPseudoFunction(llvm::Function *f)
Definition: config.cpp:524
Definition: address.h:21
static const uint64_t Undefined
Definition: address.h:47
Definition: function.h:36
Definition: object.h:34
Definition: config.h:30
Address, address pair and other derived class representation.
Decompilation configuration manipulation.
Wrapper for conditional include of C++17 filesystem feature.
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19