retdec
x87_fpu.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_X87_FPU_X87_FPU_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_X87_FPU_X87_FPU_H
9 
10 #include <map>
11 
12 #include <llvm/IR/Module.h>
13 #include <llvm/Pass.h>
14 
18 
19 #define EMPTY_FPU_STACK 8
20 #define RETURN_VALUE_PASSED_THROUGH_ST0 7
21 #define DECREMENT_FPU_STACK -1
22 #define NOP_FPU_STACK 0
23 #define ANALYZE_FAIL false
24 #define ANALYZE_SUCCESS true
25 #define PERFORMANCE_CEIL 1000
26 
27 namespace retdec {
28 namespace bin2llvmir {
29 
30 class FunctionAnalyzeMetadata;
31 
32 class X87FpuAnalysis : public llvm::ModulePass
33 {
34  public:
35  static char ID;
37  virtual bool runOnModule(llvm::Module& m) override;
38  bool runOnModuleCustom(
39  llvm::Module& m,
40  Config* c,
41  Abi* a);
42 
43  private:
44  bool run();
45  bool analyzeBasicBlock(
46  std::list<FunctionAnalyzeMetadata>& analyzedFunctionsMetadata,
48  llvm::BasicBlock* bb,
49  int& outTop);
50  bool analyzeInstruction(
51  std::list<FunctionAnalyzeMetadata>& analyzedFunctionsMetadata,
53  llvm::Instruction* i,
54  int& outTop);
55 
60  std::list<FunctionAnalyzeMetadata>& analyzedFunctionsMetadata);
62  std::list<FunctionAnalyzeMetadata>& analyzedFunctionsMetadata,
63  llvm::Instruction& analyzedInstr);
64  bool checkArchAndCallConvException(llvm::Function* fun);
65  bool isValidRegisterIndex(int index);
66 
67  private:
68 
69  llvm::Module* _module = nullptr;
70  Config* _config = nullptr;
71  Abi* _abi = nullptr;
72  llvm::GlobalVariable* top = nullptr;
73 
74  std::list<FunctionAnalyzeMetadata>::iterator getFunMd(
75  std::list<FunctionAnalyzeMetadata>& analyzedFunctionsMetadata,
76  llvm::Function* fun);
77 };
78 
79 } // namespace bin2llvmir
80 } // namespace retdec
81 
82 #endif
ABI information.
Config DB provider for bin2llvmirl.
Definition: abi.h:27
Definition: config.h:24
Definition: x87_fpu.h:33
virtual bool runOnModule(llvm::Module &m) override
Definition: x87_fpu.cpp:93
bool runOnModuleCustom(llvm::Module &m, Config *c, Abi *a)
Definition: x87_fpu.cpp:101
bool isValidRegisterIndex(int index)
Definition: x87_fpu.cpp:470
bool optimizeAnalyzedFpuInstruction(std::list< FunctionAnalyzeMetadata > &analyzedFunctionsMetadata)
Definition: x87_fpu.cpp:475
std::list< FunctionAnalyzeMetadata >::iterator getFunMd(std::list< FunctionAnalyzeMetadata > &analyzedFunctionsMetadata, llvm::Function *fun)
Definition: x87_fpu.cpp:285
bool run()
Definition: x87_fpu.cpp:205
bool analyzeInstruction(std::list< FunctionAnalyzeMetadata > &analyzedFunctionsMetadata, FunctionAnalyzeMetadata &funMd, llvm::Instruction *i, int &outTop)
Definition: x87_fpu.cpp:302
bool checkArchAndCallConvException(llvm::Function *fun)
Definition: x87_fpu.cpp:173
bool analyzeBasicBlock(std::list< FunctionAnalyzeMetadata > &analyzedFunctionsMetadata, FunctionAnalyzeMetadata &funMd, llvm::BasicBlock *bb, int &outTop)
Definition: x87_fpu.cpp:451
static char ID
Definition: x87_fpu.h:35
Abi * _abi
Definition: x87_fpu.h:71
llvm::GlobalVariable * top
Definition: x87_fpu.h:72
llvm::Module * _module
Definition: x87_fpu.h:69
int expectedTopBasedOnRestOfBlock(std::list< FunctionAnalyzeMetadata > &analyzedFunctionsMetadata, llvm::Instruction &analyzedInstr)
Definition: x87_fpu.cpp:393
Config * _config
Definition: x87_fpu.h:70
X87FpuAnalysis()
Definition: x87_fpu.cpp:87
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19
Construction of symbolic tree from the given node.