retdec
capstone2llvmir.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_CAPSTONE2LLVMIR_RETDEC_CAPSTONE2LLVMIR_H
8 #define RETDEC_CAPSTONE2LLVMIR_RETDEC_CAPSTONE2LLVMIR_H
9 
10 #include <list>
11 #include <cassert>
12 #include <memory>
13 
14 #include <capstone/capstone.h>
15 #include <llvm/IR/IRBuilder.h>
16 #include <llvm/IR/Instruction.h>
17 #include <llvm/IR/Instructions.h>
18 #include <llvm/IR/Module.h>
19 #include <llvm/Support/raw_ostream.h>
20 
21 #include "retdec/common/address.h"
23 
24 // These are additions to capstone - include them all here.
30 
31 namespace retdec {
32 namespace capstone2llvmir {
33 
42 {
43 //
44 //==============================================================================
45 // Named constructors.
46 //==============================================================================
47 //
48  public:
58  static std::unique_ptr<Capstone2LlvmIrTranslator> createArch(
59  cs_arch a,
60  llvm::Module* m,
61  cs_mode basic = CS_MODE_LITTLE_ENDIAN,
62  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
72  static std::unique_ptr<Capstone2LlvmIrTranslator> createArm(
73  llvm::Module* m,
74  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
84  static std::unique_ptr<Capstone2LlvmIrTranslator> createThumb(
85  llvm::Module* m,
86  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
95  static std::unique_ptr<Capstone2LlvmIrTranslator> createArm64(
96  llvm::Module* m,
97  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
108  static std::unique_ptr<Capstone2LlvmIrTranslator> createMips32(
109  llvm::Module* m,
110  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
121  static std::unique_ptr<Capstone2LlvmIrTranslator> createMips64(
122  llvm::Module* m,
123  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
134  static std::unique_ptr<Capstone2LlvmIrTranslator> createMips3(
135  llvm::Module* m,
136  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
147  static std::unique_ptr<Capstone2LlvmIrTranslator> createMips32R6(
148  llvm::Module* m,
149  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
159  static std::unique_ptr<Capstone2LlvmIrTranslator> createX86_16(
160  llvm::Module* m,
161  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
171  static std::unique_ptr<Capstone2LlvmIrTranslator> createX86_32(
172  llvm::Module* m,
173  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
183  static std::unique_ptr<Capstone2LlvmIrTranslator> createX86_64(
184  llvm::Module* m,
185  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
195  static std::unique_ptr<Capstone2LlvmIrTranslator> createPpc32(
196  llvm::Module* m,
197  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
207  static std::unique_ptr<Capstone2LlvmIrTranslator> createPpc64(
208  llvm::Module* m,
209  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
219  static std::unique_ptr<Capstone2LlvmIrTranslator> createPpcQpx(
220  llvm::Module* m,
221  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
229  static std::unique_ptr<Capstone2LlvmIrTranslator> createSparc(
230  llvm::Module* m,
231  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
239  static std::unique_ptr<Capstone2LlvmIrTranslator> createSysz(
240  llvm::Module* m,
241  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
249  static std::unique_ptr<Capstone2LlvmIrTranslator> createXcore(
250  llvm::Module* m,
251  cs_mode extra = CS_MODE_LITTLE_ENDIAN);
252 
253  virtual ~Capstone2LlvmIrTranslator() = default;
254 //
255 //==============================================================================
256 // Translator configuration methods.
257 //==============================================================================
258 //
267  virtual void setIgnoreUnexpectedOperands(bool f) = 0;
277  virtual void setIgnoreUnhandledInstructions(bool f) = 0;
286  virtual void setGeneratePseudoAsmFunctions(bool f) = 0;
287 
288  virtual bool isIgnoreUnexpectedOperands() const = 0;
289  virtual bool isIgnoreUnhandledInstructions() const = 0;
290  virtual bool isGeneratePseudoAsmFunctions() const = 0;
291 //
292 //==============================================================================
293 // Mode query & modification methods.
294 //==============================================================================
295 //
296  public:
303  virtual bool isAllowedBasicMode(cs_mode m) = 0;
310  virtual bool isAllowedExtraMode(cs_mode m) = 0;
320  virtual void modifyBasicMode(cs_mode m) = 0;
327  virtual void modifyExtraMode(cs_mode m) = 0;
328 
333  virtual uint32_t getArchByteSize() = 0;
338  virtual uint32_t getArchBitSize() = 0;
339 //
340 //==============================================================================
341 // Translation methods.
342 //==============================================================================
343 //
344  public:
346  {
347  bool failed() const { return size == 0; }
348 
358  std::list<std::pair<llvm::StoreInst*, cs_insn*>> insns;
360  std::size_t size = 0;
362  std::size_t count = 0;
366  llvm::CallInst* branchCall = nullptr;
369  bool inCondition = false;
370  };
387  const uint8_t* bytes,
388  std::size_t size,
390  llvm::IRBuilder<>& irb,
391  std::size_t count = 0,
392  bool stopOnBranch = false) = 0;
393 
395  {
396  bool failed() const { return size == 0; }
397 
403  llvm::StoreInst* llvmInsn = nullptr;
407  cs_insn* capstoneInsn = nullptr;
409  std::size_t size = 0;
413  llvm::CallInst* branchCall = nullptr;
416  bool inCondition = false;
417  };
432  const uint8_t*& bytes,
433  std::size_t& size,
435  llvm::IRBuilder<>& irb) = 0;
436 //
437 //==============================================================================
438 // Capstone related getters and query methods.
439 //==============================================================================
440 //
441  public:
445  virtual const csh& getCapstoneEngine() const = 0;
449  virtual cs_arch getArchitecture() const = 0;
453  virtual cs_mode getBasicMode() const = 0;
457  virtual cs_mode getExtraMode() const = 0;
458 
462  virtual bool hasDelaySlot(uint32_t id) const = 0;
466  virtual bool hasDelaySlotTypical(uint32_t id) const = 0;
470  virtual bool hasDelaySlotLikely(uint32_t id) const = 0;
475  virtual std::size_t getDelaySlot(uint32_t id) const = 0;
476 
481  virtual llvm::GlobalVariable* getRegister(uint32_t r) = 0;
490  virtual std::string getRegisterName(uint32_t r) const = 0;
499  virtual uint32_t getRegisterBitSize(uint32_t r) const = 0;
508  virtual uint32_t getRegisterByteSize(uint32_t r) const = 0;
517  virtual llvm::Type* getRegisterType(uint32_t r) const = 0;
518 
550  virtual bool isControlFlowInstruction(cs_insn& i) const = 0;
559  virtual bool isCallInstruction(cs_insn& i) const = 0;
568  virtual bool isReturnInstruction(cs_insn& i) const = 0;
577  virtual bool isBranchInstruction(cs_insn& i) const = 0;
586  virtual bool isCondBranchInstruction(cs_insn& i) const = 0;
587 //
588 //==============================================================================
589 // LLVM related getters and query methods.
590 //==============================================================================
591 //
592  public:
596  virtual llvm::Module* getModule() const = 0;
597 
602  virtual bool isSpecialAsm2LlvmMapGlobal(llvm::Value* v) const = 0;
609  virtual llvm::StoreInst* isSpecialAsm2LlvmInstr(llvm::Value* v) const = 0;
614  virtual llvm::GlobalVariable* getAsm2LlvmMapGlobalVariable() const = 0;
615 
620  virtual bool isCallFunction(llvm::Function* f) const = 0;
625  virtual bool isCallFunctionCall(llvm::CallInst* c) const = 0;
633  virtual llvm::BranchInst* isInConditionCallFunctionCall(llvm::CallInst* c) const = 0;
639  virtual llvm::Function* getCallFunction() const = 0;
644  virtual bool isReturnFunction(llvm::Function* f) const = 0;
650  virtual bool isReturnFunctionCall(llvm::CallInst* c) const = 0;
658  virtual llvm::BranchInst* isInConditionReturnFunctionCall(llvm::CallInst* c) const = 0;
664  virtual llvm::Function* getReturnFunction() const = 0;
669  virtual bool isBranchFunction(llvm::Function* f) const = 0;
675  virtual bool isBranchFunctionCall(llvm::CallInst* c) const = 0;
683  virtual llvm::BranchInst* isInConditionBranchFunctionCall(llvm::CallInst* c) const = 0;
689  virtual llvm::Function* getBranchFunction() const = 0;
696  virtual bool isCondBranchFunction(llvm::Function* f) const = 0;
704  virtual llvm::BranchInst* isInConditionCondBranchFunctionCall(llvm::CallInst* c) const = 0;
710  virtual bool isCondBranchFunctionCall(llvm::CallInst* c) const = 0;
715  virtual llvm::Function* getCondBranchFunction() const = 0;
716 
721  virtual bool isAnyPseudoFunction(llvm::Function* f) const = 0;
726  virtual bool isAnyPseudoFunctionCall(llvm::CallInst* c) const = 0;
727 
734  virtual llvm::GlobalVariable* isRegister(llvm::Value* v) const = 0;
741  virtual uint32_t getCapstoneRegister(llvm::GlobalVariable* gv) const = 0;
742 
747  virtual bool isPseudoAsmFunction(llvm::Function* f) const = 0;
752  virtual bool isPseudoAsmFunctionCall(llvm::CallInst* c) const = 0;
757  virtual const std::set<llvm::Function*>& getPseudoAsmFunctions() const = 0;
758 };
759 
760 } // namespace capstone2llvmir
761 } // namespace retdec
762 
763 #endif
Additional (on top of Capstone) definitions for ARM64 translator.
Additional (on top of Capstone) definitions for ARM translator.
Definitions of exceptions used in capstone2llmvir library.
virtual bool isReturnFunction(llvm::Function *f) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createMips3(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:114
virtual bool isAnyPseudoFunction(llvm::Function *f) const =0
virtual std::size_t getDelaySlot(uint32_t id) const =0
virtual bool isReturnInstruction(cs_insn &i) const =0
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)=0
virtual llvm::BranchInst * isInConditionCallFunctionCall(llvm::CallInst *c) const =0
virtual bool isSpecialAsm2LlvmMapGlobal(llvm::Value *v) const =0
virtual bool isCallFunctionCall(llvm::CallInst *c) const =0
virtual bool hasDelaySlot(uint32_t id) const =0
virtual std::string getRegisterName(uint32_t r) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createSysz(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:178
virtual llvm::GlobalVariable * getRegister(uint32_t r)=0
virtual bool isCondBranchInstruction(cs_insn &i) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createSparc(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:170
static std::unique_ptr< Capstone2LlvmIrTranslator > createX86_32(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:135
virtual bool isCallFunction(llvm::Function *f) const =0
virtual bool isAnyPseudoFunctionCall(llvm::CallInst *c) const =0
virtual bool isCondBranchFunction(llvm::Function *f) const =0
virtual llvm::BranchInst * isInConditionBranchFunctionCall(llvm::CallInst *c) const =0
virtual uint32_t getCapstoneRegister(llvm::GlobalVariable *gv) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createPpc32(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:149
virtual bool isPseudoAsmFunction(llvm::Function *f) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createMips64(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:107
virtual llvm::Function * getCondBranchFunction() const =0
virtual bool isPseudoAsmFunctionCall(llvm::CallInst *c) const =0
virtual bool isCondBranchFunctionCall(llvm::CallInst *c) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createPpcQpx(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:163
virtual const csh & getCapstoneEngine() const =0
virtual const std::set< llvm::Function * > & getPseudoAsmFunctions() const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createMips32(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:100
virtual llvm::GlobalVariable * getAsm2LlvmMapGlobalVariable() const =0
virtual llvm::BranchInst * isInConditionReturnFunctionCall(llvm::CallInst *c) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createX86_64(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:142
static std::unique_ptr< Capstone2LlvmIrTranslator > createXcore(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:186
virtual llvm::BranchInst * isInConditionCondBranchFunctionCall(llvm::CallInst *c) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createPpc64(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:156
virtual llvm::StoreInst * isSpecialAsm2LlvmInstr(llvm::Value *v) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createX86_16(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:128
virtual llvm::Function * getBranchFunction() const =0
virtual uint32_t getRegisterBitSize(uint32_t r) const =0
virtual llvm::Function * getCallFunction() const =0
virtual bool isBranchFunctionCall(llvm::CallInst *c) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createThumb(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:86
static std::unique_ptr< Capstone2LlvmIrTranslator > createMips32R6(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:121
static std::unique_ptr< Capstone2LlvmIrTranslator > createArch(cs_arch a, llvm::Module *m, cs_mode basic=CS_MODE_LITTLE_ENDIAN, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:18
virtual llvm::GlobalVariable * isRegister(llvm::Value *v) const =0
virtual uint32_t getRegisterByteSize(uint32_t r) const =0
virtual bool isCallInstruction(cs_insn &i) const =0
virtual llvm::Type * getRegisterType(uint32_t r) const =0
virtual llvm::Function * getReturnFunction() const =0
virtual bool hasDelaySlotTypical(uint32_t id) const =0
virtual bool isReturnFunctionCall(llvm::CallInst *c) const =0
virtual bool isControlFlowInstruction(cs_insn &i) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createArm(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:79
virtual bool isBranchInstruction(cs_insn &i) const =0
virtual bool isBranchFunction(llvm::Function *f) const =0
static std::unique_ptr< Capstone2LlvmIrTranslator > createArm64(llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
Definition: capstone2llvmir.cpp:93
virtual bool hasDelaySlotLikely(uint32_t id) const =0
virtual llvm::Module * getModule() const =0
virtual TranslationResultOne translateOne(const uint8_t *&bytes, std::size_t &size, retdec::common::Address &a, llvm::IRBuilder<> &irb)=0
Definition: address.h:21
Address, address pair and other derived class representation.
Additional (on top of Capstone) definitions for MIPS translator.
Definition: archive_wrapper.h:19
Additional (on top of Capstone) definitions for PowerPC translator.
std::size_t size
Byte size of the translated binary chunk.
Definition: capstone2llvmir.h:409
llvm::StoreInst * llvmInsn
Definition: capstone2llvmir.h:403
llvm::CallInst * branchCall
Definition: capstone2llvmir.h:413
std::size_t size
Byte size of the translated binary chunk.
Definition: capstone2llvmir.h:360
std::size_t count
Number of translated assembly instructions.
Definition: capstone2llvmir.h:362
std::list< std::pair< llvm::StoreInst *, cs_insn * > > insns
Definition: capstone2llvmir.h:358
bool failed() const
Definition: capstone2llvmir.h:347
llvm::CallInst * branchCall
Definition: capstone2llvmir.h:366
Additional (on top of Capstone) definitions for x86 translator.