retdec
capstone2llvmir_impl.h
Go to the documentation of this file.
1 
8 #ifndef CAPSTONE2LLVMIR_CAPSTONE2LLVMIR_IMPL_H
9 #define CAPSTONE2LLVMIR_CAPSTONE2LLVMIR_IMPL_H
10 
13 
14 namespace retdec {
15 namespace capstone2llvmir {
16 
30 template <typename CInsn, typename CInsnOp>
32 {
33  public:
35  cs_arch a,
36  cs_mode basic,
37  cs_mode extra,
38  llvm::Module* m);
40 //
41 //==============================================================================
42 // Translator configuration methods.
43 //==============================================================================
44 //
45  virtual void setIgnoreUnexpectedOperands(bool f) override;
46  virtual void setIgnoreUnhandledInstructions(bool f) override;
47  virtual void setGeneratePseudoAsmFunctions(bool f) override;
48 
49  virtual bool isIgnoreUnexpectedOperands() const override;
50  virtual bool isIgnoreUnhandledInstructions() const override;
51  virtual bool isGeneratePseudoAsmFunctions() const override;
52 //
53 //==============================================================================
54 // Mode query & modification methods - from Capstone2LlvmIrTranslator.
55 //==============================================================================
56 //
57  virtual void modifyBasicMode(cs_mode m) override;
58  virtual void modifyExtraMode(cs_mode m) override;
59  virtual uint32_t getArchBitSize() override;
60  // Some of these are inherently architecture specific -> implemented
61  // in the concrete translator classes.
62 //
63 //==============================================================================
64 // Translation methods - from Capstone2LlvmIrTranslator.
65 //==============================================================================
66 //
67  public:
69  const uint8_t* bytes,
70  std::size_t size,
72  llvm::IRBuilder<>& irb,
73  std::size_t count = 0,
74  bool stopOnBranch = false) override;
76  const uint8_t*& bytes,
77  std::size_t& size,
79  llvm::IRBuilder<>& irb) override;
80 //
81 //==============================================================================
82 // Capstone related getters - from Capstone2LlvmIrTranslator.
83 //==============================================================================
84 //
85  public:
86  virtual const csh& getCapstoneEngine() const override;
87  virtual cs_arch getArchitecture() const override;
88  virtual cs_mode getBasicMode() const override;
89  virtual cs_mode getExtraMode() const override;
90 
91  virtual bool hasDelaySlot(uint32_t id) const override;
92  virtual bool hasDelaySlotTypical(uint32_t id) const override;
93  virtual bool hasDelaySlotLikely(uint32_t id) const override;
94  virtual std::size_t getDelaySlot(uint32_t id) const override;
95 
96  virtual llvm::GlobalVariable* getRegister(uint32_t r) override;
97  virtual std::string getRegisterName(uint32_t r) const override;
98  virtual uint32_t getRegisterBitSize(uint32_t r) const override;
99  virtual uint32_t getRegisterByteSize(uint32_t r) const override;
100  virtual llvm::Type* getRegisterType(uint32_t r) const override;
101 
102  virtual bool isControlFlowInstruction(cs_insn& i) const override;
103  virtual bool isCallInstruction(cs_insn& i) const override;
104  virtual bool isReturnInstruction(cs_insn& i) const override;
105  virtual bool isBranchInstruction(cs_insn& i) const override;
106  virtual bool isCondBranchInstruction(cs_insn& i) const override;
107 //
108 //==============================================================================
109 // LLVM related getters and query methods - from Capstone2LlvmIrTranslator.
110 //==============================================================================
111 //
112  public:
113  virtual llvm::Module* getModule() const override;
114 
115  virtual bool isSpecialAsm2LlvmMapGlobal(llvm::Value* v) const override;
116  virtual llvm::StoreInst* isSpecialAsm2LlvmInstr(llvm::Value* v) const override;
117  virtual llvm::GlobalVariable* getAsm2LlvmMapGlobalVariable() const override;
118 
119  virtual bool isCallFunction(llvm::Function* f) const override;
120  virtual bool isCallFunctionCall(llvm::CallInst* c) const override;
121  virtual llvm::BranchInst* isInConditionCallFunctionCall(llvm::CallInst* c) const override;
122  virtual llvm::Function* getCallFunction() const override;
123 
124  virtual bool isReturnFunction(llvm::Function* f) const override;
125  virtual bool isReturnFunctionCall(llvm::CallInst* c) const override;
126  virtual llvm::BranchInst* isInConditionReturnFunctionCall(llvm::CallInst* c) const override;
127  virtual llvm::Function* getReturnFunction() const override;
128 
129  virtual bool isBranchFunction(llvm::Function* f) const override;
130  virtual bool isBranchFunctionCall(llvm::CallInst* c) const override;
131  virtual llvm::BranchInst* isInConditionBranchFunctionCall(llvm::CallInst* c) const override;
132  virtual llvm::Function* getBranchFunction() const override;
133 
134  virtual bool isCondBranchFunction(llvm::Function* f) const override;
135  virtual bool isCondBranchFunctionCall(llvm::CallInst* c) const override;
136  virtual llvm::BranchInst* isInConditionCondBranchFunctionCall(llvm::CallInst* c) const override;
137  virtual llvm::Function* getCondBranchFunction() const override;
138 
139  virtual bool isAnyPseudoFunction(llvm::Function* f) const override;
140  virtual bool isAnyPseudoFunctionCall(llvm::CallInst* c) const override;
141 
142  virtual llvm::GlobalVariable* isRegister(llvm::Value* v) const override;
143  virtual uint32_t getCapstoneRegister(llvm::GlobalVariable* gv) const override;
144 
145  virtual bool isPseudoAsmFunction(llvm::Function* f) const override;
146  virtual bool isPseudoAsmFunctionCall(llvm::CallInst* c) const override;
147  virtual const std::set<llvm::Function*>& getPseudoAsmFunctions() const override;
148 //
149 //==============================================================================
150 // Common implementation enums, structures, classes, etc.
151 //==============================================================================
152 //
153  protected:
158  enum class eOpConv
159  {
161  THROW,
163  NOTHING,
180  };
181 
182  llvm::Value* generateTypeConversion(
183  llvm::IRBuilder<>& irb,
184  llvm::Value* from,
185  llvm::Type* to,
186  eOpConv ct);
187 
199  llvm::Type* _checkTypeConversion(
200  llvm::IRBuilder<>& irb,
201  llvm::Type* to,
202  eOpConv ct);
203 //
204 //==============================================================================
205 // New implementation-related pure virtual methods.
206 //==============================================================================
207 //
208  protected:
213  virtual void initializeArchSpecific() = 0;
214 
219  virtual void initializeRegNameMap() = 0;
220 
225  virtual void initializeRegTypeMap() = 0;
226 
241 
247 
252  virtual void generateRegisters() = 0;
253 
258  virtual void generateDataLayout() = 0;
259 
263  virtual uint32_t getCarryRegister() = 0;
264 
268  virtual void translateInstruction(
269  cs_insn* i,
270  llvm::IRBuilder<>& irb) = 0;
271 //
272 //==============================================================================
273 // Virtual translation initialization and environment generation methods.
274 //==============================================================================
275 //
276  protected:
277  virtual void initialize();
278  virtual void openHandle();
279  virtual void configureHandle();
280  virtual void closeHandle();
281  virtual void generateEnvironment();
282 
283  virtual void generateSpecialAsm2LlvmMapGlobal();
284  virtual llvm::StoreInst* generateSpecialAsm2LlvmInstr(
285  llvm::IRBuilder<>& irb,
286  cs_insn* i);
287  virtual void generateCallFunction();
288  virtual llvm::CallInst* generateCallFunctionCall(
289  llvm::IRBuilder<>& irb,
290  llvm::Value* t);
291  virtual llvm::CallInst* generateCondCallFunctionCall(
292  llvm::IRBuilder<>& irb,
293  llvm::Value* cond,
294  llvm::Value* t);
295  virtual void generateReturnFunction();
296  virtual llvm::CallInst* generateReturnFunctionCall(
297  llvm::IRBuilder<>& irb,
298  llvm::Value* t);
299  virtual llvm::CallInst* generateCondReturnFunctionCall(
300  llvm::IRBuilder<>& irb,
301  llvm::Value* cond,
302  llvm::Value* t);
303  virtual void generateBranchFunction();
304  virtual llvm::CallInst* generateBranchFunctionCall(
305  llvm::IRBuilder<>& irb,
306  llvm::Value* t);
307  virtual void generateCondBranchFunction();
308  virtual llvm::CallInst* generateCondBranchFunctionCall(
309  llvm::IRBuilder<>& irb,
310  llvm::Value* cond,
311  llvm::Value* t);
312 
313  virtual llvm::GlobalVariable* createRegister(
314  uint32_t r,
315  llvm::GlobalValue::LinkageTypes lt =
316  llvm::GlobalValue::LinkageTypes::InternalLinkage,
317  llvm::Constant* initializer = nullptr);
318 //
319 //==============================================================================
320 // Load/store methods.
321 //==============================================================================
322 //
329  virtual llvm::Value* loadRegister(
330  uint32_t r,
331  llvm::IRBuilder<>& irb,
332  llvm::Type* dstType = nullptr,
333  eOpConv ct = eOpConv::THROW) = 0;
334  virtual llvm::Value* loadOp(
335  CInsnOp& op,
336  llvm::IRBuilder<>& irb,
337  llvm::Type* ty = nullptr,
338  bool lea = false) = 0;
339 
340  virtual llvm::Instruction* storeRegister(
341  uint32_t r,
342  llvm::Value* val,
343  llvm::IRBuilder<>& irb,
345  virtual llvm::Instruction* storeOp(
346  CInsnOp& op,
347  llvm::Value* val,
348  llvm::IRBuilder<>& irb,
350 
364  llvm::Value* loadOp(
365  CInsn* ci,
366  llvm::IRBuilder<>& irb,
367  std::size_t idx,
368  llvm::Type* loadType = nullptr,
369  llvm::Type* dstType = nullptr,
371 
392  std::vector<llvm::Value*> _loadOps(
393  CInsn* ci,
394  llvm::IRBuilder<>& irb,
395  std::size_t opCnt,
396  bool strictCheck = true,
397  llvm::Type* loadType = nullptr,
398  llvm::Type* dstType = nullptr,
400 
414  std::vector<llvm::Value*> _loadOpsUniversal(
415  CInsn* ci,
416  llvm::IRBuilder<>& irb,
417  std::size_t opCnt,
418  bool strictCheck = true,
421 
422  llvm::Value* loadOpUnary(
423  CInsn* ci,
424  llvm::IRBuilder<>& irb,
425  llvm::Type* dstType = nullptr,
426  llvm::Type* loadType = nullptr,
427  eOpConv ct = eOpConv::THROW);
428 
429  std::pair<llvm::Value*, llvm::Value*> loadOpBinary(
430  CInsn* ci,
431  llvm::IRBuilder<>& irb,
433 
434  std::pair<llvm::Value*, llvm::Value*> loadOpBinary(
435  CInsn* ci,
436  llvm::IRBuilder<>& irb,
437  eOpConv ict,
438  eOpConv fct);
439 
440  std::pair<llvm::Value*, llvm::Value*> loadOpBinary(
441  CInsn* ci,
442  llvm::IRBuilder<>& irb,
443  llvm::Type* loadType,
444  llvm::Type* dstType = nullptr,
446 
447  llvm::Value* loadOpBinaryOp0(
448  CInsn* ci,
449  llvm::IRBuilder<>& irb,
450  llvm::Type* ty = nullptr);
451  llvm::Value* loadOpBinaryOp1(
452  CInsn* ci,
453  llvm::IRBuilder<>& irb,
454  llvm::Type* ty = nullptr);
455 
456  std::tuple<llvm::Value*, llvm::Value*, llvm::Value*> loadOpTernary(
457  CInsn* ci,
458  llvm::IRBuilder<>& irb,
460  std::tuple<llvm::Value*, llvm::Value*, llvm::Value*> loadOpTernary(
461  CInsn* ci,
462  llvm::IRBuilder<>& irb,
463  eOpConv ict,
464  eOpConv fct);
465  std::tuple<llvm::Value*, llvm::Value*, llvm::Value*> loadOpTernary(
466  CInsn* ci,
467  llvm::IRBuilder<>& irb,
468  llvm::Type* loadType,
469  llvm::Type* dstType = nullptr,
471 
472  std::pair<llvm::Value*, llvm::Value*> loadOpBinaryOrTernaryOp1Op2(
473  CInsn* ai,
474  llvm::IRBuilder<>& irb,
476 
477  std::pair<llvm::Value*, llvm::Value*> loadOpBinaryOrTernaryOp1Op2(
478  CInsn* ai,
479  llvm::IRBuilder<>& irb,
480  eOpConv ict,
481  eOpConv fct);
482 
483  std::tuple<llvm::Value*, llvm::Value*, llvm::Value*> loadOpQuaternaryOp1Op2Op3(
484  CInsn* ai,
485  llvm::IRBuilder<>& irb);
486 //
487 //==============================================================================
488 // Carry/overflow/borrow add/sub generation routines.
489 //==============================================================================
490 //
491  protected:
492  llvm::Value* generateCarryAdd(
493  llvm::Value* add,
494  llvm::Value* op0,
495  llvm::IRBuilder<>& irb);
496  llvm::Value* generateCarryAddC(
497  llvm::Value* op0,
498  llvm::Value* op1,
499  llvm::IRBuilder<>& irb,
500  llvm::Value* cf = nullptr);
501  llvm::Value* generateCarryAddInt4(
502  llvm::Value* op0,
503  llvm::Value* op1,
504  llvm::IRBuilder<>& irb);
505  llvm::Value* generateCarryAddCInt4(
506  llvm::Value* op0,
507  llvm::Value* op1,
508  llvm::IRBuilder<>& irb,
509  llvm::Value* cf = nullptr);
510  llvm::Value* generateOverflowAdd(
511  llvm::Value* add,
512  llvm::Value* op0,
513  llvm::Value* op1,
514  llvm::IRBuilder<>& irb);
515  llvm::Value* generateOverflowAddC(
516  llvm::Value* add,
517  llvm::Value* op0,
518  llvm::Value* op1,
519  llvm::IRBuilder<>& irb,
520  llvm::Value* cf = nullptr);
521  llvm::Value* generateOverflowSub(
522  llvm::Value* sub,
523  llvm::Value* op0,
524  llvm::Value* op1,
525  llvm::IRBuilder<>& irb);
526  llvm::Value* generateOverflowSubC(
527  llvm::Value* sub,
528  llvm::Value* op0,
529  llvm::Value* op1,
530  llvm::IRBuilder<>& irb,
531  llvm::Value* cf = nullptr);
532  llvm::Value* generateBorrowSub(
533  llvm::Value* op0,
534  llvm::Value* op1,
535  llvm::IRBuilder<>& irb);
536  llvm::Value* generateBorrowSubC(
537  llvm::Value* sub,
538  llvm::Value* op0,
539  llvm::Value* op1,
540  llvm::IRBuilder<>& irb,
541  llvm::Value* cf = nullptr);
542  llvm::Value* generateBorrowSubInt4(
543  llvm::Value* op0,
544  llvm::Value* op1,
545  llvm::IRBuilder<>& irb);
546  llvm::Value* generateBorrowSubCInt4(
547  llvm::Value* op0,
548  llvm::Value* op1,
549  llvm::IRBuilder<>& irb,
550  llvm::Value* cf = nullptr);
551 //
552 //==============================================================================
553 // Helper methods.
554 //==============================================================================
555 //
556  protected:
557  llvm::IntegerType* getDefaultType();
558  llvm::Value* getThisInsnAddress(cs_insn* i);
559  llvm::Value* getNextInsnAddress(cs_insn* i);
560 
561  protected:
562  llvm::BranchInst* getCondBranchForInsnInIfThen(
563  llvm::Instruction* i) const;
564 
565  protected:
566  std::string getPseudoAsmFunctionName(cs_insn* insn);
567  llvm::Function* getPseudoAsmFunction(
568  cs_insn* insn,
569  llvm::FunctionType* type,
570  const std::string& name = "");
571  llvm::Function* getPseudoAsmFunction(
572  cs_insn* insn,
573  llvm::Type* retType,
574  llvm::ArrayRef<llvm::Type*> params,
575  const std::string& name = "");
576 
577  // Unary.
578  void translatePseudoAsmOp0Fnc(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
579  void translatePseudoAsmFncOp0(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
580  void translatePseudoAsmOp0FncOp0(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
581  // Binary.
582  void translatePseudoAsmFncOp0Op1(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
583  void translatePseudoAsmOp0FncOp1(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
584  void translatePseudoAsmOp0FncOp0Op1(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
585  // Ternary.
586  void translatePseudoAsmFncOp0Op1Op2(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
587  void translatePseudoAsmOp0FncOp1Op2(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
588  void translatePseudoAsmOp0FncOp0Op1Op2(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
589  // Quaternary.
590  void translatePseudoAsmFncOp0Op1Op2Op3(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
591  void translatePseudoAsmOp0FncOp1Op2Op3(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
592  void translatePseudoAsmOp0FncOp0Op1Op2Op3(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
593  void translatePseudoAsmOp0Op1FncOp0Op1Op2Op3(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
594  // Generic.
595  virtual bool isOperandRegister(CInsnOp& op) = 0;
596  virtual uint8_t getOperandAccess(CInsnOp& op);
597  virtual void translatePseudoAsmGeneric(cs_insn* i, CInsn* ci, llvm::IRBuilder<>& irb);
598 
599  void throwUnexpectedOperands(cs_insn* i, const std::string comment = "");
600  void throwUnhandledInstructions(cs_insn* i, const std::string comment = "");
601 
602 //
603 //==============================================================================
604 // Common implementation data.
605 //==============================================================================
606 //
607  protected:
608  csh _handle = 0;
609  cs_arch _arch = CS_ARCH_ALL;
610  cs_mode _basicMode = CS_MODE_LITTLE_ENDIAN;
611  cs_mode _extraMode = CS_MODE_LITTLE_ENDIAN;
612  cs_mode _origBasicMode = CS_MODE_LITTLE_ENDIAN;
613 
614  llvm::Module* _module = nullptr;
615  llvm::GlobalVariable* _asm2llvmGv = nullptr;
616  llvm::Function* _callFunction = nullptr; // void (i<arch_sz>)
617  llvm::Function* _returnFunction = nullptr; // void (i<arch_sz>)
618  llvm::Function* _branchFunction = nullptr; // void (i<arch_sz>)
619  llvm::Function* _condBranchFunction = nullptr; // void (i1, i<arch_sz>)
620  llvm::GlobalValue::LinkageTypes _regLt =
621  llvm::GlobalValue::LinkageTypes::InternalLinkage;
622 
624  std::map<std::pair<std::string, llvm::FunctionType*>, llvm::Function*>
626  // The same functions as in the map above, but meant for fast search.
627  std::set<llvm::Function*> _asmFunctions;
628 
635  std::map<uint32_t, std::string> _reg2name;
639  std::map<uint32_t, llvm::Type*> _reg2type;
640 
643  std::map<llvm::GlobalVariable*, uint32_t> _llvm2CapstoneRegs;
644  std::map<uint32_t, llvm::GlobalVariable*> _capstone2LlvmRegs;
645 
648  llvm::CallInst* _branchGenerated = nullptr;
649 
652  bool _inCondition = false;
653 
654  // These are used to save lines needed to declare locale operands in
655  // each translation function.
656  // In C++17, we could use Structured Bindings:
657  // auto [ op0, op1 ] = loadOpBinary();
658  llvm::Value* op0 = nullptr;
659  llvm::Value* op1 = nullptr;
660  llvm::Value* op2 = nullptr;
661  llvm::Value* op3 = nullptr;
662 
664  cs_insn* _insn = nullptr;
665 
668  std::set<unsigned int> _callInsnIds;
671  std::set<unsigned int> _returnInsnIds;
674  std::set<unsigned int> _branchInsnIds;
677  std::set<unsigned int> _condBranchInsnIds;
683  std::set<unsigned int> _controlFlowInsnIds;
684 
688 };
689 
690 //
691 // Arity checking utility macros.
692 //
693 // Yeah, macros are ugly, but we want them to potentially cause return in
694 // function that uses them so that there does not need to be if condition or
695 // other such construction.
696 //
697 
698 #define EXPECT_IS_NULLARY(i, ci, irb) \
699 { \
700  if (ci->op_count != 0) \
701  { \
702  throwUnexpectedOperands(i); \
703  translatePseudoAsmGeneric(i, ci, irb); \
704  return; \
705  } \
706 }
707 
708 #define EXPECT_IS_UNARY(i, ci, irb) \
709 { \
710  if (ci->op_count != 1) \
711  { \
712  throwUnexpectedOperands(i); \
713  translatePseudoAsmGeneric(i, ci, irb); \
714  return; \
715  } \
716 }
717 
718 #define EXPECT_IS_NULLARY_OR_UNARY(i, ci, irb) \
719 { \
720  if (ci->op_count != 0 &&ci->op_count != 1) \
721  { \
722  throwUnexpectedOperands(i); \
723  translatePseudoAsmGeneric(i, ci, irb); \
724  return; \
725  } \
726 }
727 
728 #define EXPECT_IS_BINARY(i, ci, irb) \
729 { \
730  if (ci->op_count != 2) \
731  { \
732  throwUnexpectedOperands(i); \
733  translatePseudoAsmGeneric(i, ci, irb); \
734  return; \
735  } \
736 }
737 
738 #define EXPECT_IS_UNARY_OR_BINARY(i, ci, irb) \
739 { \
740  if (ci->op_count != 1 &&ci->op_count != 2) \
741  { \
742  throwUnexpectedOperands(i); \
743  translatePseudoAsmGeneric(i, ci, irb); \
744  return; \
745  } \
746 }
747 
748 #define EXPECT_IS_TERNARY(i, ci, irb) \
749 { \
750  if (ci->op_count != 3) \
751  { \
752  throwUnexpectedOperands(i); \
753  translatePseudoAsmGeneric(i, ci, irb); \
754  return; \
755  } \
756 }
757 
758 #define EXPECT_IS_BINARY_OR_TERNARY(i, ci, irb)\
759 { \
760  if (ci->op_count != 2 &&ci->op_count != 3) \
761  { \
762  throwUnexpectedOperands(i); \
763  translatePseudoAsmGeneric(i, ci, irb); \
764  return; \
765  } \
766 }
767 
768 #define EXPECT_IS_QUATERNARY(i, ci, irb) \
769 { \
770  if (ci->op_count != 4) \
771  { \
772  throwUnexpectedOperands(i); \
773  translatePseudoAsmGeneric(i, ci, irb); \
774  return; \
775  } \
776 }
777 
778 #define EXPECT_IS_NARY(i, ci, irb, n) \
779 { \
780  if (ci->op_count != n) \
781  { \
782  throwUnexpectedOperands(i); \
783  translatePseudoAsmGeneric(i, ci, irb); \
784  return; \
785  } \
786 }
787 
788 #define EXPECT_IS_SET(i, ci, irb, ns) \
789 { \
790  if (ns.find(ci->op_count) == ns.end()) \
791  { \
792  throwUnexpectedOperands(i); \
793  translatePseudoAsmGeneric(i, ci, irb); \
794  return; \
795  } \
796 }
797 
798 #define EXPECT_IS_EXPR(i, ci, irb, expr) \
799 { \
800  if (!(expr)) \
801  { \
802  throwUnexpectedOperands(i); \
803  translatePseudoAsmGeneric(i, ci, irb); \
804  return; \
805  } \
806 }
807 
808 } // namespace capstone2llvmir
809 } // namespace retdec
810 
811 #endif
Common public interface for translators converting bytes to LLVM IR.
Definition: capstone2llvmir_impl.h:32
virtual cs_arch getArchitecture() const override
Definition: capstone2llvmir_impl.cpp:291
virtual bool isPseudoAsmFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:669
virtual llvm::CallInst * generateCondBranchFunctionCall(llvm::IRBuilder<> &irb, llvm::Value *cond, llvm::Value *t)
Definition: capstone2llvmir_impl.cpp:922
std::map< uint32_t, std::string > _reg2name
Definition: capstone2llvmir_impl.h:635
virtual void generateEnvironment()
Definition: capstone2llvmir_impl.cpp:748
virtual const csh & getCapstoneEngine() const override
Definition: capstone2llvmir_impl.cpp:285
virtual bool isAnyPseudoFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:636
virtual void setIgnoreUnhandledInstructions(bool f) override
Definition: capstone2llvmir_impl.cpp:50
std::set< unsigned int > _condBranchInsnIds
Definition: capstone2llvmir_impl.h:677
virtual llvm::BranchInst * isInConditionCallFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:537
std::map< std::pair< std::string, llvm::FunctionType * >, llvm::Function * > _insn2asmFunctions
(fnc_name, fnc_type) -> fnc
Definition: capstone2llvmir_impl.h:625
std::pair< llvm::Value *, llvm::Value * > loadOpBinary(CInsn *ci, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::NOTHING)
Definition: capstone2llvmir_impl.cpp:1118
virtual bool isCallFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:531
void translatePseudoAsmOp0FncOp1Op2(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1955
virtual void closeHandle()
Definition: capstone2llvmir_impl.cpp:736
std::set< unsigned int > _returnInsnIds
Definition: capstone2llvmir_impl.h:671
virtual llvm::BranchInst * isInConditionReturnFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:562
virtual llvm::CallInst * generateCallFunctionCall(llvm::IRBuilder<> &irb, llvm::Value *t)
Definition: capstone2llvmir_impl.cpp:814
llvm::Value * loadOpUnary(CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, llvm::Type *loadType=nullptr, eOpConv ct=eOpConv::THROW)
Definition: capstone2llvmir_impl.cpp:1103
virtual llvm::CallInst * generateReturnFunctionCall(llvm::IRBuilder<> &irb, llvm::Value *t)
Definition: capstone2llvmir_impl.cpp:854
virtual const std::set< llvm::Function * > & getPseudoAsmFunctions() const override
Definition: capstone2llvmir_impl.cpp:676
virtual void openHandle()
Definition: capstone2llvmir_impl.cpp:717
virtual void generateCallFunction()
Definition: capstone2llvmir_impl.cpp:800
llvm::Function * _callFunction
Definition: capstone2llvmir_impl.h:616
std::set< unsigned int > _callInsnIds
Definition: capstone2llvmir_impl.h:668
virtual TranslationResult translate(const uint8_t *bytes, std::size_t size, retdec::common::Address a, llvm::IRBuilder<> &irb, std::size_t count=0, bool stopOnBranch=false) override
Definition: capstone2llvmir_impl.cpp:165
llvm::Function * getPseudoAsmFunction(cs_insn *insn, llvm::FunctionType *type, const std::string &name="")
Definition: capstone2llvmir_impl.cpp:1562
bool _generatePseudoAsmFunctions
Definition: capstone2llvmir_impl.h:687
llvm::Value * generateCarryAddCInt4(llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
Definition: capstone2llvmir_impl.cpp:1335
virtual bool hasDelaySlotLikely(uint32_t id) const override
Definition: capstone2llvmir_impl.cpp:321
void throwUnhandledInstructions(cs_insn *i, const std::string comment="")
Definition: capstone2llvmir_impl.cpp:2280
virtual llvm::BranchInst * isInConditionBranchFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:587
cs_arch _arch
Definition: capstone2llvmir_impl.h:609
Capstone2LlvmIrTranslator_impl(cs_arch a, cs_mode basic, cs_mode extra, llvm::Module *m)
Definition: capstone2llvmir_impl.cpp:16
llvm::Value * loadOpBinaryOp0(CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr)
Definition: capstone2llvmir_impl.cpp:1159
virtual bool isControlFlowInstruction(cs_insn &i) const override
Definition: capstone2llvmir_impl.cpp:417
virtual void modifyExtraMode(cs_mode m) override
Definition: capstone2llvmir_impl.cpp:105
void translatePseudoAsmOp0FncOp0(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1837
void translatePseudoAsmOp0Fnc(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1795
virtual bool isBranchFunction(llvm::Function *f) const override
Definition: capstone2llvmir_impl.cpp:574
virtual llvm::Function * getReturnFunction() const override
Definition: capstone2llvmir_impl.cpp:568
virtual bool isIgnoreUnexpectedOperands() const override
Definition: capstone2llvmir_impl.cpp:62
virtual bool hasDelaySlot(uint32_t id) const override
Definition: capstone2llvmir_impl.cpp:309
llvm::Value * generateOverflowSub(llvm::Value *sub, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1403
virtual void translatePseudoAsmGeneric(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:2138
virtual bool isReturnFunction(llvm::Function *f) const override
Definition: capstone2llvmir_impl.cpp:549
virtual bool isCondBranchInstruction(cs_insn &i) const override
Definition: capstone2llvmir_impl.cpp:449
llvm::Value * loadOpBinaryOp1(CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr)
Definition: capstone2llvmir_impl.cpp:1172
llvm::Value * op3
Definition: capstone2llvmir_impl.h:661
virtual void setGeneratePseudoAsmFunctions(bool f) override
Definition: capstone2llvmir_impl.cpp:56
virtual bool hasDelaySlotTypical(uint32_t id) const override
Definition: capstone2llvmir_impl.cpp:315
virtual llvm::Type * getRegisterType(uint32_t r) const override
Definition: capstone2llvmir_impl.cpp:404
virtual llvm::CallInst * generateCondReturnFunctionCall(llvm::IRBuilder<> &irb, llvm::Value *cond, llvm::Value *t)
Definition: capstone2llvmir_impl.cpp:865
std::vector< llvm::Value * > _loadOpsUniversal(CInsn *ci, llvm::IRBuilder<> &irb, std::size_t opCnt, bool strictCheck=true, eOpConv ict=eOpConv::SEXT_TRUNC_OR_BITCAST, eOpConv fct=eOpConv::FPCAST_OR_BITCAST)
Definition: capstone2llvmir_impl.cpp:1068
virtual void generateCondBranchFunction()
Definition: capstone2llvmir_impl.cpp:905
virtual void modifyBasicMode(cs_mode m) override
Definition: capstone2llvmir_impl.cpp:86
virtual bool isCallInstruction(cs_insn &i) const override
Definition: capstone2llvmir_impl.cpp:428
virtual bool isReturnInstruction(cs_insn &i) const override
Definition: capstone2llvmir_impl.cpp:435
virtual llvm::GlobalVariable * getAsm2LlvmMapGlobalVariable() const override
Definition: capstone2llvmir_impl.cpp:519
bool _ignoreUnhandledInstructions
Definition: capstone2llvmir_impl.h:686
virtual llvm::Instruction * storeRegister(uint32_t r, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST)=0
cs_mode _extraMode
Definition: capstone2llvmir_impl.h:611
virtual llvm::Value * loadRegister(uint32_t r, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::THROW)=0
virtual bool isIgnoreUnhandledInstructions() const override
Definition: capstone2llvmir_impl.cpp:68
llvm::Value * op1
Definition: capstone2llvmir_impl.h:659
bool _ignoreUnexpectedOperands
Definition: capstone2llvmir_impl.h:685
virtual llvm::BranchInst * isInConditionCondBranchFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:613
virtual bool isPseudoAsmFunction(llvm::Function *f) const override
Definition: capstone2llvmir_impl.cpp:662
virtual uint32_t getArchBitSize() override
Definition: capstone2llvmir_impl.cpp:124
csh _handle
Definition: capstone2llvmir_impl.h:608
virtual llvm::Value * loadOp(CInsnOp &op, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr, bool lea=false)=0
virtual llvm::Function * getCallFunction() const override
Definition: capstone2llvmir_impl.cpp:543
virtual std::size_t getDelaySlot(uint32_t id) const override
Definition: capstone2llvmir_impl.cpp:327
llvm::Value * generateCarryAdd(llvm::Value *add, llvm::Value *op0, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1278
virtual void setIgnoreUnexpectedOperands(bool f) override
Definition: capstone2llvmir_impl.cpp:44
virtual llvm::CallInst * generateCondCallFunctionCall(llvm::IRBuilder<> &irb, llvm::Value *cond, llvm::Value *t)
Definition: capstone2llvmir_impl.cpp:825
virtual bool isBranchInstruction(cs_insn &i) const override
Definition: capstone2llvmir_impl.cpp:442
virtual llvm::StoreInst * generateSpecialAsm2LlvmInstr(llvm::IRBuilder<> &irb, cs_insn *i)
Definition: capstone2llvmir_impl.cpp:788
void translatePseudoAsmOp0FncOp0Op1Op2(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1981
llvm::GlobalVariable * _asm2llvmGv
Definition: capstone2llvmir_impl.h:615
void translatePseudoAsmOp0FncOp0Op1Op2Op3(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:2065
virtual bool isBranchFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:580
virtual void configureHandle()
Definition: capstone2llvmir_impl.cpp:727
llvm::Value * generateTypeConversion(llvm::IRBuilder<> &irb, llvm::Value *from, llvm::Type *to, eOpConv ct)
Definition: capstone2llvmir_impl.cpp:1605
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > loadOpTernary(CInsn *ci, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::NOTHING)
Definition: capstone2llvmir_impl.cpp:1186
llvm::Value * generateOverflowAdd(llvm::Value *add, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1362
llvm::Function * _condBranchFunction
Definition: capstone2llvmir_impl.h:619
cs_insn * _insn
Capstone instruction being currently translated.
Definition: capstone2llvmir_impl.h:664
llvm::Value * generateBorrowSubInt4(llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1484
virtual ~Capstone2LlvmIrTranslator_impl()
Definition: capstone2llvmir_impl.cpp:32
virtual bool isReturnFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:555
void translatePseudoAsmFncOp0Op1Op2(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1929
cs_mode _basicMode
Definition: capstone2llvmir_impl.h:610
llvm::Value * generateOverflowAddC(llvm::Value *add, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
Definition: capstone2llvmir_impl.cpp:1380
virtual void generateReturnFunction()
Definition: capstone2llvmir_impl.cpp:840
virtual llvm::CallInst * generateBranchFunctionCall(llvm::IRBuilder<> &irb, llvm::Value *t)
Definition: capstone2llvmir_impl.cpp:894
llvm::Value * generateCarryAddInt4(llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1319
virtual void generateSpecialAsm2LlvmMapGlobal()
Definition: capstone2llvmir_impl.cpp:768
std::set< unsigned int > _branchInsnIds
Definition: capstone2llvmir_impl.h:674
virtual bool isAnyPseudoFunction(llvm::Function *f) const override
Definition: capstone2llvmir_impl.cpp:626
void throwUnexpectedOperands(cs_insn *i, const std::string comment="")
Definition: capstone2llvmir_impl.cpp:2269
void translatePseudoAsmFncOp0Op1(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1860
llvm::Function * _returnFunction
Definition: capstone2llvmir_impl.h:617
virtual llvm::Function * getCondBranchFunction() const override
Definition: capstone2llvmir_impl.cpp:620
virtual bool isCallFunction(llvm::Function *f) const override
Definition: capstone2llvmir_impl.cpp:525
llvm::Value * generateBorrowSubC(llvm::Value *sub, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
Definition: capstone2llvmir_impl.cpp:1458
llvm::CallInst * _branchGenerated
Definition: capstone2llvmir_impl.h:648
llvm::Value * getNextInsnAddress(cs_insn *i)
Definition: capstone2llvmir_impl.cpp:1539
llvm::Module * _module
Definition: capstone2llvmir_impl.h:614
llvm::Value * generateCarryAddC(llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
Definition: capstone2llvmir_impl.cpp:1296
std::map< llvm::GlobalVariable *, uint32_t > _llvm2CapstoneRegs
Definition: capstone2llvmir_impl.h:643
virtual TranslationResultOne translateOne(const uint8_t *&bytes, std::size_t &size, retdec::common::Address &a, llvm::IRBuilder<> &irb) override
Definition: capstone2llvmir_impl.cpp:233
eOpConv
Definition: capstone2llvmir_impl.h:159
@ NOTHING
Operand types does not have to be equal.
virtual bool isCondBranchFunctionCall(llvm::CallInst *c) const override
Definition: capstone2llvmir_impl.cpp:606
virtual llvm::GlobalVariable * createRegister(uint32_t r, llvm::GlobalValue::LinkageTypes lt=llvm::GlobalValue::LinkageTypes::InternalLinkage, llvm::Constant *initializer=nullptr)
Definition: capstone2llvmir_impl.cpp:936
virtual uint32_t getRegisterByteSize(uint32_t r) const override
Definition: capstone2llvmir_impl.cpp:397
llvm::Type * _checkTypeConversion(llvm::IRBuilder<> &irb, llvm::Type *to, eOpConv ct)
Definition: capstone2llvmir_impl.cpp:1747
virtual bool isCondBranchFunction(llvm::Function *f) const override
Definition: capstone2llvmir_impl.cpp:599
std::pair< llvm::Value *, llvm::Value * > loadOpBinaryOrTernaryOp1Op2(CInsn *ai, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::NOTHING)
Definition: capstone2llvmir_impl.cpp:1231
bool _inCondition
Definition: capstone2llvmir_impl.h:652
virtual uint32_t getRegisterBitSize(uint32_t r) const override
Definition: capstone2llvmir_impl.cpp:362
llvm::Value * generateBorrowSubCInt4(llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
Definition: capstone2llvmir_impl.cpp:1500
virtual void initialize()
Definition: capstone2llvmir_impl.cpp:688
virtual cs_mode getExtraMode() const override
Definition: capstone2llvmir_impl.cpp:303
virtual llvm::StoreInst * isSpecialAsm2LlvmInstr(llvm::Value *v) const override
Definition: capstone2llvmir_impl.cpp:505
virtual std::string getRegisterName(uint32_t r) const override
Definition: capstone2llvmir_impl.cpp:340
llvm::BranchInst * getCondBranchForInsnInIfThen(llvm::Instruction *i) const
Definition: capstone2llvmir_impl.cpp:463
virtual void generateBranchFunction()
Definition: capstone2llvmir_impl.cpp:880
std::map< uint32_t, llvm::Type * > _reg2type
Definition: capstone2llvmir_impl.h:639
llvm::Value * getThisInsnAddress(cs_insn *i)
Definition: capstone2llvmir_impl.cpp:1532
std::set< unsigned int > _controlFlowInsnIds
Definition: capstone2llvmir_impl.h:683
std::set< llvm::Function * > _asmFunctions
Definition: capstone2llvmir_impl.h:627
llvm::Value * generateOverflowSubC(llvm::Value *sub, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
Definition: capstone2llvmir_impl.cpp:1421
llvm::IntegerType * getDefaultType()
Definition: capstone2llvmir_impl.cpp:1526
std::map< uint32_t, llvm::GlobalVariable * > _capstone2LlvmRegs
Definition: capstone2llvmir_impl.h:644
virtual void translateInstruction(cs_insn *i, llvm::IRBuilder<> &irb)=0
llvm::GlobalValue::LinkageTypes _regLt
Definition: capstone2llvmir_impl.h:620
virtual llvm::Instruction * storeOp(CInsnOp &op, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST)=0
void translatePseudoAsmOp0FncOp1(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1882
std::vector< llvm::Value * > _loadOps(CInsn *ci, llvm::IRBuilder<> &irb, std::size_t opCnt, bool strictCheck=true, llvm::Type *loadType=nullptr, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::NOTHING)
Definition: capstone2llvmir_impl.cpp:1015
void translatePseudoAsmFncOp0Op1Op2Op3(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:2009
llvm::Function * _branchFunction
Definition: capstone2llvmir_impl.h:618
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > loadOpQuaternaryOp1Op2Op3(CInsn *ai, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1260
std::string getPseudoAsmFunctionName(cs_insn *insn)
Definition: capstone2llvmir_impl.cpp:1549
virtual uint8_t getOperandAccess(CInsnOp &op)
Definition: capstone2llvmir_impl.cpp:2129
llvm::Value * op0
Definition: capstone2llvmir_impl.h:658
cs_mode _origBasicMode
Definition: capstone2llvmir_impl.h:612
void translatePseudoAsmOp0FncOp0Op1(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1905
virtual cs_mode getBasicMode() const override
Definition: capstone2llvmir_impl.cpp:297
virtual bool isSpecialAsm2LlvmMapGlobal(llvm::Value *v) const override
Definition: capstone2llvmir_impl.cpp:498
llvm::Value * generateBorrowSub(llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1446
virtual llvm::GlobalVariable * getRegister(uint32_t r) override
Definition: capstone2llvmir_impl.cpp:333
virtual llvm::Function * getBranchFunction() const override
Definition: capstone2llvmir_impl.cpp:593
void translatePseudoAsmOp0Op1FncOp0Op1Op2Op3(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:2095
void translatePseudoAsmOp0FncOp1Op2Op3(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:2037
virtual llvm::GlobalVariable * isRegister(llvm::Value *v) const override
Definition: capstone2llvmir_impl.cpp:646
virtual bool isGeneratePseudoAsmFunctions() const override
Definition: capstone2llvmir_impl.cpp:74
llvm::Value * op2
Definition: capstone2llvmir_impl.h:660
virtual llvm::Module * getModule() const override
Definition: capstone2llvmir_impl.cpp:492
void translatePseudoAsmFncOp0(cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
Definition: capstone2llvmir_impl.cpp:1816
virtual uint32_t getCapstoneRegister(llvm::GlobalVariable *gv) const override
Definition: capstone2llvmir_impl.cpp:654
Definition: address.h:21
LLVM IR utilities.
Definition: archive_wrapper.h:19