retdec
x86_impl.h
Go to the documentation of this file.
1 
7 #ifndef CAPSTONE2LLVMIR_X86_X86_IMPL_H
8 #define CAPSTONE2LLVMIR_X86_X86_IMPL_H
9 
12 
13 namespace retdec {
14 namespace capstone2llvmir {
15 
17  public Capstone2LlvmIrTranslator_impl<cs_x86, cs_x86_op>,
19 {
20  public:
22  llvm::Module* m,
23  cs_mode basic = CS_MODE_32,
24  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
25 //
26 //==============================================================================
27 // Mode query & modification methods - from Capstone2LlvmIrTranslator.
28 //==============================================================================
29 //
30  public:
31  virtual bool isAllowedBasicMode(cs_mode m) override;
32  virtual bool isAllowedExtraMode(cs_mode m) override;
33  virtual uint32_t getArchByteSize() override;
34 //
35 //==============================================================================
36 // LLVM related getters and query methods - from Capstone2LlvmIrTranslator.
37 //==============================================================================
38 //
39  public:
40  virtual bool isAnyPseudoFunction(llvm::Function* f) const override;
41  virtual bool isAnyPseudoFunctionCall(llvm::CallInst* c) const override;
42 //
43 //==============================================================================
44 // x86 specialization methods - from Capstone2LlvmIrTranslatorX86
45 //==============================================================================
46 //
47  public:
48  virtual bool isX87DataStoreFunction(llvm::Function* f) const override;
49  virtual bool isX87DataStoreFunctionCall(llvm::CallInst* c) const override;
50  virtual llvm::Function* getX87DataStoreFunction() const override;
51  virtual bool isX87DataLoadFunction(llvm::Function* f) const override;
52  virtual bool isX87DataLoadFunctionCall(llvm::CallInst* c) const override;
53  virtual llvm::Function* getX87DataLoadFunction() const override;
54 
55  virtual uint32_t getParentRegister(uint32_t r) const override;
56 //
57 //==============================================================================
58 // Pure virtual methods from Capstone2LlvmIrTranslator_impl
59 //==============================================================================
60 //
61  protected:
62  virtual void initializeArchSpecific() override;
63  virtual void initializeRegNameMap() override;
64  virtual void initializeRegTypeMap() override;
65  virtual void initializePseudoCallInstructionIDs() override;
66  virtual void generateEnvironmentArchSpecific() override;
67  virtual void generateDataLayout() override;
68  virtual void generateRegisters() override;
69  virtual uint32_t getCarryRegister() override;
70 
71  virtual void translateInstruction(
72  cs_insn* i,
73  llvm::IRBuilder<>& irb) override;
74 //
75 //==============================================================================
76 // x86-specific methods.
77 //==============================================================================
78 //
79  protected:
81  void generateRegisters16();
82  void generateRegisters32();
83  void generateRegisters64();
84 
86 
92  const std::vector<x86_reg>& rs,
93  x86_reg other);
94  uint32_t getAccumulatorRegister(std::size_t size);
95  uint32_t getStackPointerRegister();
96  uint32_t getBasePointerRegister();
97 
98  virtual llvm::Value* getCurrentPc(cs_insn* i);
99 
100  protected:
101  virtual llvm::Value* loadRegister(
102  uint32_t r,
103  llvm::IRBuilder<>& irb,
104  llvm::Type* dstType = nullptr,
105  eOpConv ct = eOpConv::THROW) override;
106  virtual llvm::Value* loadOp(
107  cs_x86_op& op,
108  llvm::IRBuilder<>& irb,
109  llvm::Type* ty = nullptr,
110  bool lea = false) override;
111 
112  virtual llvm::StoreInst* storeRegister(
113  uint32_t r,
114  llvm::Value* val,
115  llvm::IRBuilder<>& irb,
116  eOpConv ct = eOpConv::ZEXT_TRUNC_OR_BITCAST) override;
117  virtual llvm::Instruction* storeOp(
118  cs_x86_op& op,
119  llvm::Value* val,
120  llvm::IRBuilder<>& irb,
121  eOpConv ct = eOpConv::ZEXT_TRUNC_OR_BITCAST) override;
122 
123  void storeRegisters(
124  llvm::IRBuilder<>& irb,
125  const std::vector<std::pair<uint32_t, llvm::Value*>>& regs);
127  llvm::IRBuilder<>& irb,
128  llvm::Value* sflagsVal,
129  const std::vector<std::pair<uint32_t, llvm::Value*>>& regs);
130 
131  unsigned getAddrSpace(x86_reg segment);
132 
133  bool isX87DataRegister(uint32_t r);
134 
135  llvm::Value* loadX87Top(llvm::IRBuilder<>& irb);
136  llvm::Value* loadX87TopDec(llvm::IRBuilder<>& irb);
137  llvm::Value* loadX87TopInc(llvm::IRBuilder<>& irb);
138  llvm::Value* loadX87TopDecStore(llvm::IRBuilder<>& irb);
139  llvm::Value* loadX87TopIncStore(llvm::IRBuilder<>& irb);
140  llvm::Value* x87IncTop(llvm::IRBuilder<>& irb, llvm::Value* top = nullptr);
141  llvm::Value* x87DecTop(llvm::IRBuilder<>& irb, llvm::Value* top = nullptr);
142 
143  llvm::CallInst* storeX87DataReg(
144  llvm::IRBuilder<>& irb,
145  llvm::Value* rNum,
146  llvm::Value* val);
147  llvm::CallInst* loadX87DataReg(
148  llvm::IRBuilder<>& irb,
149  llvm::Value* rNum);
150 
151  std::tuple<llvm::Value*, llvm::Value*> loadOpFloatingNullaryOrUnaryTop(
152  cs_insn* i,
153  cs_x86* xi,
154  llvm::IRBuilder<>& irb);
155 
156  std::tuple<llvm::Value*, llvm::Value*, llvm::Value*, llvm::Value*> loadOpFloatingBinaryTop(
157  cs_insn* i,
158  cs_x86* xi,
159  llvm::IRBuilder<>& irb);
160 
161  llvm::Value* generateZeroFlag(llvm::Value* val, llvm::IRBuilder<>& irb);
162  llvm::Value* generateSignFlag(llvm::Value* val, llvm::IRBuilder<>& irb);
163  llvm::Value* generateParityFlag(llvm::Value* val, llvm::IRBuilder<>& irb);
164  void generateSetSflags(
165  llvm::Value* val,
166  llvm::IRBuilder<>& irb);
167 
168  llvm::Value* generateCcAE(llvm::IRBuilder<>& irb);
169  llvm::Value* generateCcA(llvm::IRBuilder<>& irb);
170  llvm::Value* generateCcBE(llvm::IRBuilder<>& irb);
171  llvm::Value* generateCcB(llvm::IRBuilder<>& irb);
172  llvm::Value* generateCcE(llvm::IRBuilder<>& irb);
173  llvm::Value* generateCcGE(llvm::IRBuilder<>& irb);
174  llvm::Value* generateCcG(llvm::IRBuilder<>& irb);
175  llvm::Value* generateCcLE(llvm::IRBuilder<>& irb);
176  llvm::Value* generateCcL(llvm::IRBuilder<>& irb);
177  llvm::Value* generateCcNE(llvm::IRBuilder<>& irb);
178  llvm::Value* generateCcNO(llvm::IRBuilder<>& irb);
179  llvm::Value* generateCcNP(llvm::IRBuilder<>& irb);
180  llvm::Value* generateCcNS(llvm::IRBuilder<>& irb);
181  llvm::Value* generateCcO(llvm::IRBuilder<>& irb);
182  llvm::Value* generateCcP(llvm::IRBuilder<>& irb);
183  llvm::Value* generateCcS(llvm::IRBuilder<>& irb);
184 //
185 //==============================================================================
186 // Helper methods.
187 //==============================================================================
188 //
189  protected:
190  virtual bool isOperandRegister(cs_x86_op& op) override;
191  virtual uint8_t getOperandAccess(cs_x86_op& op) override;
192 //
193 //==============================================================================
194 // x86 implementation data.
195 //==============================================================================
196 //
197  protected:
209  std::vector<uint32_t> _reg2parentMap;
210 
212  static std::map<
213  std::size_t,
215  cs_insn* i,
216  cs_x86*,
217  llvm::IRBuilder<>&)> _i2fm;
218 
219  llvm::Value* top = nullptr;
220  llvm::Value* idx = nullptr;
221 
222  llvm::Function* _x87DataStoreFunction = nullptr; // void (i3, fp80)
223  llvm::Function* _x87DataLoadFunction = nullptr; // fp80 (i3)
224 //
225 //==============================================================================
226 // x86 instruction translation methods.
227 //==============================================================================
228 //
229  protected:
230  void translateAaa(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
231  void translateAad(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
232  void translateAam(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
233  void translateAdc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
234  void translateAdd(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
235  void translateAnd(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
236  void translateBsf(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
237  void translateBswap(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
238  void translateBt(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
239  void translateBtc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
240  void translateBtr(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
241  void translateBts(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
242  void translateCall(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
243  void translateCbw(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
244  void translateCdq(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
245  void translateCdqe(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
246  void translateClc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
247  void translateCld(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
248  void translateCli(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
249  void translateCmc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
250  void translateCMovCc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
251  void translateCmpxchg(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
252  void translateCmpxchg8b(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
253  void translateCmpxchg16b(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
254  void translateCompareString(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
255  void translateCpuid(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
256  void translateCqo(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
257  void translateCwd(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
258  void translateCwde(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
259  void translateDaaDas(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
260  void translateDec(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
261  void translateDiv(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
262  void translateEnter(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
263  void translateFabs(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
264  void translateFadd(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
265  void translateFchs(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
266  void translateFcos(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
267  void translateFdecstp(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
268  void translateFdiv(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
269  void translateFdivr(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
270  void translateFprem(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb);
271  void translateFincstp(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
272  void translateFist(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
273  void translateFld(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
274  void translateFbld(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
275  void translateFbstp(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
276  void translateFCMovCc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb);
277  void translateFloadConstant(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
278  void translateFmul(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
279  void translateFninit(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
280  void translateFrndint(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
281  void translateFsin(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
282  void translateFsincos(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
283  void translateFtan(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
284  void translateFatan(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
285  void translateFsqrt(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
286  void translateFscale(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
287  void translateFst(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
288  void translateFsub(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
289  void translateFsubr(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
290  void translateFucomPop(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
291  void translateFxam(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
292  void translateFxtract(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
293  void translateFxch(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
294  void translateF2xm1(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
295  void translateFyl2x(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
296  void translateFfree(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
297  void translateFnstsw(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
298  void translateFnclex(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
299  void translateFrstor(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
300  void translateFnsave(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
301  void translateFnstenv(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
302  void translateFxsave(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
303  void translateFxstor(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
304  void translateImul(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
305  void translateInc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
306  void translateIns(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
307  void translateJCc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
308  void translateJecxz(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
309  void translateJmp(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
310  void translateLahf(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
311  void translateLea(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
312  void translateLeave(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
313  void translateLcall(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
314  void translateLjmp(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
315  void translateLoadFarPtr(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
316  void translateLoadString(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
317  void translateLoop(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
318  void translateMov(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
319  void translateMoveString(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
320  void translateMul(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
321  void translateNeg(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
322  void translateNop(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
323  void translateNot(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
324  void translateOr(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
325  void translateOuts(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
326  void translatePop(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
327  void translatePopa(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
328  void translatePopEflags(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
329  void translatePush(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
330  void translatePusha(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
331  void translatePushEflags(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
332  void translateRcr(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
333  void translateRcl(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
334  void translateRdtsc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
335  void translateRdtscp(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
336  void translateRol(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
337  void translateRor(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
338  void translateRet(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
339  void translateSahf(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
340  void translateSalc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
341  void translateSbb(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
342  void translateScanString(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
343  void translateSetCc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
344  void translateShiftLeft(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
345  void translateShiftRight(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
346  void translateShld(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
347  void translateShrd(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
348  void translateStc(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
349  void translateStd(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
350  void translateStoreString(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
351  void translateSub(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
352  void translateXchg(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
353  void translateXlatb(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
354  void translateXor(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb);
355 };
356 
357 } // namespace capstone2llvmir
358 } // namespace retdec
359 
360 #endif
x86 specialization of translator's abstract public interface.
Common private implementation for translators converting bytes to LLVM IR.
void storeRegisters(llvm::IRBuilder<> &irb, const std::vector< std::pair< uint32_t, llvm::Value * >> &regs)
Definition: x86.cpp:819
void translateFadd(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4400
unsigned getAddrSpace(x86_reg segment)
Definition: x86.cpp:840
void translateCld(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1967
void translatePopEflags(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2811
void translateShiftLeft(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3136
void translateLjmp(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2280
void translateDaaDas(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1581
virtual llvm::Instruction * storeOp(cs_x86_op &op, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::ZEXT_TRUNC_OR_BITCAST) override
Definition: x86.cpp:1039
llvm::Value * generateCcL(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1449
void translateMov(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2506
void translateAam(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1659
void translateFcos(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4658
void translateFxtract(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5155
bool isX87DataRegister(uint32_t r)
Definition: x86.cpp:863
llvm::Value * generateCcNP(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1482
void translateFucomPop(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5065
llvm::CallInst * loadX87DataReg(llvm::IRBuilder<> &irb, llvm::Value *rNum)
Definition: x86.cpp:939
void initializeRegistersParentMap16()
Definition: x86_init.cpp:518
void translateFabs(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4544
void translateFchs(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4559
void translateSahf(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3076
std::tuple< llvm::Value *, llvm::Value *, llvm::Value *, llvm::Value * > loadOpFloatingBinaryTop(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1183
void translateRet(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3016
void translateLoadFarPtr(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2470
llvm::Value * loadX87Top(llvm::IRBuilder<> &irb)
Definition: x86.cpp:868
static std::map< std::size_t, void(Capstone2LlvmIrTranslatorX86_impl::*)(cs_insn *i, cs_x86 *, llvm::IRBuilder<> &)> _i2fm
Mapping of Capstone instruction IDs to their translation functions.
Definition: x86_impl.h:217
virtual void generateDataLayout() override
Definition: x86.cpp:171
void initializeRegistersParentMapToOther(const std::vector< x86_reg > &rs, x86_reg other)
Definition: x86_init.cpp:488
llvm::Value * loadX87TopDecStore(llvm::IRBuilder<> &irb)
Definition: x86.cpp:885
void translateOr(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2714
virtual bool isX87DataStoreFunction(llvm::Function *f) const override
Definition: x86.cpp:118
void translateSbb(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3116
void translateFsub(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4492
void translateCli(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1977
llvm::Value * generateParityFlag(llvm::Value *val, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1321
llvm::Value * generateCcB(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1388
void translateLea(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2405
void translateRcl(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3368
void translatePusha(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2896
void translateCwd(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1921
void translateAdc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1687
void translateBsf(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1758
virtual bool isX87DataStoreFunctionCall(llvm::CallInst *c) const override
Definition: x86.cpp:123
llvm::Value * generateCcNS(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1492
void initializeRegistersParentMap32()
Definition: x86_init.cpp:540
llvm::Value * generateCcGE(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1408
llvm::Value * generateCcS(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1521
virtual bool isAnyPseudoFunctionCall(llvm::CallInst *c) const override
Definition: x86.cpp:104
void translateFrndint(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5206
void translateRdtsc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5347
llvm::Value * loadX87TopInc(llvm::IRBuilder<> &irb)
Definition: x86.cpp:879
virtual bool isOperandRegister(cs_x86_op &op) override
Definition: x86.cpp:1526
void translatePush(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2877
llvm::Value * generateSignFlag(llvm::Value *val, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1306
virtual void initializeRegTypeMap() override
Definition: x86_init.cpp:92
void translateFbstp(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4253
virtual llvm::Value * getCurrentPc(cs_insn *i)
Definition: x86.cpp:316
void translateJCc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4084
llvm::Value * generateZeroFlag(llvm::Value *val, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1298
llvm::Value * generateCcBE(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1375
void translateFnclex(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4837
virtual void initializeArchSpecific() override
Definition: x86_init.cpp:18
llvm::Value * loadX87TopIncStore(llvm::IRBuilder<> &irb)
Definition: x86.cpp:896
void translateFtan(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4738
void translateStc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3484
void translateShrd(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3277
void translateCmpxchg(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2001
void translateInc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2161
void translateCmc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1987
void translateImul(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2111
std::vector< uint32_t > _reg2parentMap
Definition: x86_impl.h:209
void translateFsqrt(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4573
void translateFprem(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4478
void translateFxam(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5137
void translateCwde(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1897
void translateBt(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1805
void translateAaa(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1545
void generateX87RegLoadStoreFunctions()
Definition: x86.cpp:248
llvm::Function * _x87DataStoreFunction
Definition: x86_impl.h:222
void translateIns(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5295
void translateFxstor(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4995
void translateJecxz(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4008
void translateSetCc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4120
void translateCall(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2320
void translatePop(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2732
void translateFxch(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4645
void translateMoveString(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3741
void translateSalc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3101
virtual void initializeRegNameMap() override
Definition: x86_init.cpp:23
void translateAad(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1631
void translateFnstsw(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4826
virtual void generateRegisters() override
Definition: x86.cpp:198
void translateFbld(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4233
void translateFfree(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4818
void translateFninit(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2657
uint32_t getStackPointerRegister()
Definition: x86.cpp:286
virtual void generateEnvironmentArchSpecific() override
Definition: x86.cpp:166
void translateFyl2x(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4622
void translateBts(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1866
void translateFrstor(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4854
void translateXlatb(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3552
void translateScanString(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3838
virtual uint32_t getCarryRegister() override
Definition: x86.cpp:215
void translateLcall(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2341
llvm::Value * generateCcG(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1420
void translateCMovCc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4160
void translateNop(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2641
virtual llvm::Function * getX87DataLoadFunction() const override
Definition: x86.cpp:143
void translateCmpxchg8b(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2030
virtual llvm::Value * loadRegister(uint32_t r, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::THROW) override
Definition: x86.cpp:655
llvm::Value * generateCcNE(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1461
void translateCbw(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1885
llvm::Value * generateCcP(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1512
void translateRdtscp(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5366
llvm::Value * loadX87TopDec(llvm::IRBuilder<> &irb)
Definition: x86.cpp:873
void translateCdqe(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1909
virtual bool isX87DataLoadFunctionCall(llvm::CallInst *c) const override
Definition: x86.cpp:138
void translateLoop(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4029
void translateRol(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3414
void translateCompareString(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3917
void translatePushEflags(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2955
void translateFxsave(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4928
virtual void translateInstruction(cs_insn *i, llvm::IRBuilder<> &irb) override
Definition: x86.cpp:220
llvm::Value * generateCcO(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1502
llvm::Value * idx
Definition: x86_impl.h:220
void translateFsin(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4713
void translateRor(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3449
void translateLahf(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2379
llvm::Value * generateCcNO(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1471
void translateLoadString(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3598
void translateCqo(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1945
void translateBtc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1821
virtual bool isX87DataLoadFunction(llvm::Function *f) const override
Definition: x86.cpp:133
void translateFCMovCc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4194
void translateFdecstp(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4804
void translateEnter(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2419
Capstone2LlvmIrTranslatorX86_impl(llvm::Module *m, cs_mode basic=CS_MODE_32, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: x86.cpp:14
void translatePopa(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2752
llvm::Value * x87IncTop(llvm::IRBuilder<> &irb, llvm::Value *top=nullptr)
Definition: x86.cpp:905
llvm::Value * generateCcE(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1398
void translateAdd(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1715
void translateStd(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3494
void translateStoreString(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3649
void translateFscale(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4588
void initializeRegistersParentMap()
Definition: x86_init.cpp:502
void translateSub(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3504
llvm::Value * x87DecTop(llvm::IRBuilder<> &irb, llvm::Value *top=nullptr)
Definition: x86.cpp:915
llvm::Value * generateCcA(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1362
virtual bool isAnyPseudoFunction(llvm::Function *f) const override
Definition: x86.cpp:97
void translateDiv(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2180
virtual llvm::Value * loadOp(cs_x86_op &op, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr, bool lea=false) override
Definition: x86.cpp:952
void translateFdiv(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4426
void translateJmp(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2269
void translateFist(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5186
void translateFnstenv(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4903
void translateFdivr(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4452
void translateFnsave(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4878
void translateShiftRight(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3186
virtual llvm::StoreInst * storeRegister(uint32_t r, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::ZEXT_TRUNC_OR_BITCAST) override
Definition: x86.cpp:707
void translateOuts(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5242
std::tuple< llvm::Value *, llvm::Value * > loadOpFloatingNullaryOrUnaryTop(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1120
void generateSetSflags(llvm::Value *val, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1336
void translateCpuid(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:5220
void initializeRegistersParentMap64()
Definition: x86_init.cpp:563
void storeRegistersPlusSflags(llvm::IRBuilder<> &irb, llvm::Value *sflagsVal, const std::vector< std::pair< uint32_t, llvm::Value * >> &regs)
Definition: x86.cpp:829
void translateNeg(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2610
uint32_t getBasePointerRegister()
Definition: x86.cpp:301
llvm::Value * generateCcAE(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1351
void translateFatan(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4770
void translateFld(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4220
void translateNot(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2699
virtual bool isAllowedExtraMode(cs_mode m) override
Definition: x86.cpp:71
virtual uint32_t getArchByteSize() override
Definition: x86.cpp:76
void translateFsincos(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4683
void translateBtr(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1846
void translateAnd(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1737
virtual bool isAllowedBasicMode(cs_mode m) override
Definition: x86.cpp:47
void translateMul(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2532
void translateCdq(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1933
virtual uint32_t getParentRegister(uint32_t r) const override
Definition: x86.cpp:153
void translateCmpxchg16b(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2061
void translateF2xm1(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4605
void translateRcr(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3321
llvm::CallInst * storeX87DataReg(llvm::IRBuilder<> &irb, llvm::Value *rNum, llvm::Value *val)
Definition: x86.cpp:925
void translateXor(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3578
void translateLeave(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2451
void translateFincstp(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4790
llvm::Function * _x87DataLoadFunction
Definition: x86_impl.h:223
void translateXchg(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3525
void translateFst(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4338
void translateBswap(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1787
void translateFmul(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4374
void translateFsubr(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4518
uint32_t getAccumulatorRegister(std::size_t size)
Definition: x86.cpp:274
llvm::Value * top
Definition: x86_impl.h:219
void translateDec(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:2092
virtual llvm::Function * getX87DataStoreFunction() const override
Definition: x86.cpp:128
llvm::Value * generateCcLE(llvm::IRBuilder<> &irb)
Definition: x86.cpp:1435
void translateClc(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:1957
virtual uint8_t getOperandAccess(cs_x86_op &op) override
Definition: x86.cpp:1531
virtual void initializePseudoCallInstructionIDs() override
Definition: x86_init.cpp:426
void translateFloadConstant(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:4275
void translateShld(cs_insn *i, cs_x86 *xi, llvm::IRBuilder<> &irb)
Definition: x86.cpp:3234
Definition: capstone2llvmir_impl.h:32
Definition: archive_wrapper.h:19