retdec
calling_convention.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_PROVIDERS_CALL_CONV_CALL_CONV_H
8 #define RETDEC_BIN2LLVMIR_PROVIDERS_CALL_CONV_CALL_CONV_H
9 
10 #include <vector>
11 
12 #include <llvm/IR/Module.h>
13 
15 
16 namespace retdec {
17 namespace bin2llvmir {
18 
19 class Abi;
20 
22 {
23  // Typedefs.
24  //
25  public:
26  typedef std::unique_ptr<CallingConvention> Ptr;
28 
29  typedef Ptr (*ConstructorMethod)(const Abi*);
30 
31  // Constants.
32  //
33  public:
34  static const bool RTL;
35  static const bool LTR;
36 
37  // Ctors, dtors.
38  //
39  public:
40  CallingConvention(const Abi* abi);
41  virtual ~CallingConvention() = default;
42 
43  // Registers.
44  //
45  public:
46  const std::vector<uint32_t>& getParamRegisters() const;
47  const std::vector<uint32_t>& getParamFPRegisters() const;
48  const std::vector<uint32_t>& getParamDoubleRegisters() const;
49  const std::vector<uint32_t>& getParamVectorRegisters() const;
50 
51  const std::vector<uint32_t>& getReturnRegisters() const;
52  const std::vector<uint32_t>& getReturnFPRegisters() const;
53  const std::vector<uint32_t>& getReturnDoubleRegisters() const;
54  const std::vector<uint32_t>& getReturnVectorRegisters() const;
55 
56  bool usesFPRegistersForParameters() const;
57 
58  std::size_t getMaxNumOfRegsPerParam() const;
59  std::size_t getMaxNumOfFPRegsPerParam() const;
60  std::size_t getMaxNumOfDoubleRegsPerParam() const;
61  std::size_t getMaxNumOfVectorRegsPerParam() const;
62 
63  std::size_t getMaxNumOfRegsPerReturn() const;
64  std::size_t getMaxNumOfFPRegsPerReturn() const;
65  std::size_t getMaxNumOfDoubleRegsPerReturn() const;
66  std::size_t getMaxNumOfVectorRegsPerReturn() const;
67 
68  // Stacks.
69  public:
70  bool getStackParamOrder() const;
71  bool usesStackForParameters() const;
72  bool passesLargeObjectsByReference() const;
73  bool respectsRegisterCouples() const;
74 
75  virtual std::size_t getMaxBytesPerStackParam() const;
76 
77  // Values.
78  public:
79  virtual bool valueCanBeParameter(const llvm::Value* val) const;
80  virtual bool canHoldReturnValue(const llvm::Value* val) const;
81 
82  // Private data - misc.
83  //
84  protected:
85  const Abi* _abi;
87 
88  // Private data - registers.
89  //
90  protected:
91  std::vector<uint32_t> _paramRegs {};
92  std::vector<uint32_t> _paramFPRegs {};
93  std::vector<uint32_t> _paramDoubleRegs {};
94  std::vector<uint32_t> _paramVectorRegs {};
95 
96  std::vector<uint32_t> _returnRegs {};
97  std::vector<uint32_t> _returnFPRegs {};
98  std::vector<uint32_t> _returnDoubleRegs {};
99  std::vector<uint32_t> _returnVectorRegs {};
100 
101  // Private data - registers informational.
102  //
103  protected:
104  size_t _numOfRegsPerParam = 1;
108 
113 
114  // Private data - stacks informational.
115  //
116  protected:
119  bool _respectsRegCouples = false;
120 };
121 
123 {
124  // Private constructor.
125  //
126  private:
128 
129  // Destructor, singleton method.
130  public:
132  static void clear();
133 
134  // Factory methods.
135  public:
136  void registerCC(
137  const CallingConvention::ID& cc,
139 
141  const CallingConvention::ID& cc,
142  const Abi* a) const;
143 
144  // Private data - constrctor methods.
145  private:
146  std::vector<CallingConvention::ConstructorMethod> _id2cc;
147 
148 };
149 
150 } // namespace bin2llvmir
151 } // namespace retdec
152 
153 #endif
Definition: abi.h:27
Definition: calling_convention.h:123
void registerCC(const CallingConvention::ID &cc, const CallingConvention::ConstructorMethod &con)
Definition: calling_convention.cpp:202
CallingConventionProvider()
Definition: calling_convention.cpp:169
static void clear()
Definition: calling_convention.cpp:195
static CallingConventionProvider * getProvider()
Definition: calling_convention.cpp:188
CallingConvention::Ptr createCallingConvention(const CallingConvention::ID &cc, const Abi *a) const
Definition: calling_convention.cpp:216
std::vector< CallingConvention::ConstructorMethod > _id2cc
Definition: calling_convention.h:146
Definition: calling_convention.h:22
std::vector< uint32_t > _paramVectorRegs
Definition: calling_convention.h:94
std::size_t getMaxNumOfFPRegsPerReturn() const
bool respectsRegisterCouples() const
Definition: calling_convention.cpp:118
std::size_t getMaxNumOfFPRegsPerParam() const
Definition: calling_convention.cpp:93
retdec::common::CallingConventionID ID
Definition: calling_convention.h:27
const Abi * _abi
Definition: calling_convention.h:85
size_t _numOfDoubleRegsPerReturn
Definition: calling_convention.h:111
const std::vector< uint32_t > & getReturnFPRegisters() const
Definition: calling_convention.cpp:68
std::size_t getMaxNumOfRegsPerParam() const
Definition: calling_convention.cpp:88
const std::vector< uint32_t > & getReturnDoubleRegisters() const
Definition: calling_convention.cpp:73
bool usesFPRegistersForParameters() const
Definition: calling_convention.cpp:83
static const bool RTL
Definition: calling_convention.h:34
virtual bool canHoldReturnValue(const llvm::Value *val) const
Definition: calling_convention.cpp:148
const std::vector< uint32_t > & getReturnVectorRegisters() const
Definition: calling_convention.cpp:78
size_t _numOfDoubleRegsPerParam
Definition: calling_convention.h:106
std::vector< uint32_t > _paramRegs
Definition: calling_convention.h:91
std::size_t getMaxNumOfVectorRegsPerParam() const
Definition: calling_convention.cpp:103
std::size_t getMaxNumOfDoubleRegsPerReturn() const
std::vector< uint32_t > _returnDoubleRegs
Definition: calling_convention.h:98
bool passesLargeObjectsByReference() const
Definition: calling_convention.cpp:113
static const bool LTR
Definition: calling_convention.h:35
CallingConvention(const Abi *abi)
Definition: calling_convention.cpp:37
size_t _numOfFPRegsPerParam
Definition: calling_convention.h:105
size_t _numOfRegsPerReturn
Definition: calling_convention.h:109
size_t _numOfVectorRegsPerReturn
Definition: calling_convention.h:112
bool _stackParamOrder
Definition: calling_convention.h:117
size_t _numOfRegsPerParam
Definition: calling_convention.h:104
std::vector< uint32_t > _returnVectorRegs
Definition: calling_convention.h:99
std::vector< uint32_t > _returnRegs
Definition: calling_convention.h:96
virtual std::size_t getMaxBytesPerStackParam() const
Definition: calling_convention.cpp:123
bool _largeObjectsPassedByReference
Definition: calling_convention.h:118
const std::vector< uint32_t > & getParamFPRegisters() const
Definition: calling_convention.cpp:48
virtual bool valueCanBeParameter(const llvm::Value *val) const
Definition: calling_convention.cpp:128
std::vector< uint32_t > _returnFPRegs
Definition: calling_convention.h:97
CallingConvention::ID _ccType
Definition: calling_convention.h:86
size_t _numOfFPRegsPerReturn
Definition: calling_convention.h:110
const std::vector< uint32_t > & getReturnRegisters() const
Definition: calling_convention.cpp:63
std::size_t getMaxNumOfRegsPerReturn() const
std::size_t getMaxNumOfDoubleRegsPerParam() const
Definition: calling_convention.cpp:98
const std::vector< uint32_t > & getParamVectorRegisters() const
Definition: calling_convention.cpp:58
Ptr(* ConstructorMethod)(const Abi *)
Definition: calling_convention.h:29
size_t _numOfVectorRegsPerParam
Definition: calling_convention.h:107
bool _respectsRegCouples
Definition: calling_convention.h:119
bool getStackParamOrder() const
Definition: calling_convention.cpp:108
const std::vector< uint32_t > & getParamRegisters() const
Definition: calling_convention.cpp:43
std::size_t getMaxNumOfVectorRegsPerReturn() const
std::vector< uint32_t > _paramDoubleRegs
Definition: calling_convention.h:93
std::unique_ptr< CallingConvention > Ptr
Definition: calling_convention.h:26
const std::vector< uint32_t > & getParamDoubleRegisters() const
Definition: calling_convention.cpp:53
std::vector< uint32_t > _paramFPRegs
Definition: calling_convention.h:92
eCC
Definition: calling_convention.h:24
Calling convention representation.
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19