retdec
Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | List of all members
retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp > Class Template Referenceabstract

#include <capstone2llvmir_impl.h>

Inheritance diagram for retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >:
Inheritance graph
[legend]
Collaboration diagram for retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >:
Collaboration graph
[legend]

Public Member Functions

 Capstone2LlvmIrTranslator_impl (cs_arch a, cs_mode basic, cs_mode extra, llvm::Module *m)
 
virtual ~Capstone2LlvmIrTranslator_impl ()
 
virtual void setIgnoreUnexpectedOperands (bool f) override
 
virtual void setIgnoreUnhandledInstructions (bool f) override
 
virtual void setGeneratePseudoAsmFunctions (bool f) override
 
virtual bool isIgnoreUnexpectedOperands () const override
 
virtual bool isIgnoreUnhandledInstructions () const override
 
virtual bool isGeneratePseudoAsmFunctions () const override
 
virtual void modifyBasicMode (cs_mode m) override
 
virtual void modifyExtraMode (cs_mode m) override
 
virtual uint32_t getArchBitSize () override
 
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
 
virtual TranslationResultOne translateOne (const uint8_t *&bytes, std::size_t &size, retdec::common::Address &a, llvm::IRBuilder<> &irb) override
 
virtual const csh & getCapstoneEngine () const override
 
virtual cs_arch getArchitecture () const override
 
virtual cs_mode getBasicMode () const override
 
virtual cs_mode getExtraMode () const override
 
virtual bool hasDelaySlot (uint32_t id) const override
 
virtual bool hasDelaySlotTypical (uint32_t id) const override
 
virtual bool hasDelaySlotLikely (uint32_t id) const override
 
virtual std::size_t getDelaySlot (uint32_t id) const override
 
virtual llvm::GlobalVariable * getRegister (uint32_t r) override
 
virtual std::string getRegisterName (uint32_t r) const override
 
virtual uint32_t getRegisterBitSize (uint32_t r) const override
 
virtual uint32_t getRegisterByteSize (uint32_t r) const override
 
virtual llvm::Type * getRegisterType (uint32_t r) const override
 
virtual bool isControlFlowInstruction (cs_insn &i) const override
 
virtual bool isCallInstruction (cs_insn &i) const override
 
virtual bool isReturnInstruction (cs_insn &i) const override
 
virtual bool isBranchInstruction (cs_insn &i) const override
 
virtual bool isCondBranchInstruction (cs_insn &i) const override
 
virtual llvm::Module * getModule () const override
 
virtual bool isSpecialAsm2LlvmMapGlobal (llvm::Value *v) const override
 
virtual llvm::StoreInst * isSpecialAsm2LlvmInstr (llvm::Value *v) const override
 
virtual llvm::GlobalVariable * getAsm2LlvmMapGlobalVariable () const override
 
virtual bool isCallFunction (llvm::Function *f) const override
 
virtual bool isCallFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::BranchInst * isInConditionCallFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::Function * getCallFunction () const override
 
virtual bool isReturnFunction (llvm::Function *f) const override
 
virtual bool isReturnFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::BranchInst * isInConditionReturnFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::Function * getReturnFunction () const override
 
virtual bool isBranchFunction (llvm::Function *f) const override
 
virtual bool isBranchFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::BranchInst * isInConditionBranchFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::Function * getBranchFunction () const override
 
virtual bool isCondBranchFunction (llvm::Function *f) const override
 
virtual bool isCondBranchFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::BranchInst * isInConditionCondBranchFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::Function * getCondBranchFunction () const override
 
virtual bool isAnyPseudoFunction (llvm::Function *f) const override
 
virtual bool isAnyPseudoFunctionCall (llvm::CallInst *c) const override
 
virtual llvm::GlobalVariable * isRegister (llvm::Value *v) const override
 
virtual uint32_t getCapstoneRegister (llvm::GlobalVariable *gv) const override
 
virtual bool isPseudoAsmFunction (llvm::Function *f) const override
 
virtual bool isPseudoAsmFunctionCall (llvm::CallInst *c) const override
 
virtual const std::set< llvm::Function * > & getPseudoAsmFunctions () const override
 
- Public Member Functions inherited from retdec::capstone2llvmir::Capstone2LlvmIrTranslator
virtual ~Capstone2LlvmIrTranslator ()=default
 
virtual bool isAllowedBasicMode (cs_mode m)=0
 
virtual bool isAllowedExtraMode (cs_mode m)=0
 
virtual uint32_t getArchByteSize ()=0
 

Protected Types

enum class  eOpConv {
  THROW , NOTHING , ZEXT_TRUNC_OR_BITCAST , SEXT_TRUNC_OR_BITCAST ,
  FPCAST_OR_BITCAST , SITOFP_OR_FPCAST , UITOFP_OR_FPCAST
}
 

Protected Member Functions

llvm::Value * generateTypeConversion (llvm::IRBuilder<> &irb, llvm::Value *from, llvm::Type *to, eOpConv ct)
 
llvm::Type * _checkTypeConversion (llvm::IRBuilder<> &irb, llvm::Type *to, eOpConv ct)
 
virtual void initializeArchSpecific ()=0
 
virtual void initializeRegNameMap ()=0
 
virtual void initializeRegTypeMap ()=0
 
virtual void initializePseudoCallInstructionIDs ()=0
 
virtual void generateEnvironmentArchSpecific ()=0
 
virtual void generateRegisters ()=0
 
virtual void generateDataLayout ()=0
 
virtual uint32_t getCarryRegister ()=0
 
virtual void translateInstruction (cs_insn *i, llvm::IRBuilder<> &irb)=0
 
virtual void initialize ()
 
virtual void openHandle ()
 
virtual void configureHandle ()
 
virtual void closeHandle ()
 
virtual void generateEnvironment ()
 
virtual void generateSpecialAsm2LlvmMapGlobal ()
 
virtual llvm::StoreInst * generateSpecialAsm2LlvmInstr (llvm::IRBuilder<> &irb, cs_insn *i)
 
virtual void generateCallFunction ()
 
virtual llvm::CallInst * generateCallFunctionCall (llvm::IRBuilder<> &irb, llvm::Value *t)
 
virtual llvm::CallInst * generateCondCallFunctionCall (llvm::IRBuilder<> &irb, llvm::Value *cond, llvm::Value *t)
 
virtual void generateReturnFunction ()
 
virtual llvm::CallInst * generateReturnFunctionCall (llvm::IRBuilder<> &irb, llvm::Value *t)
 
virtual llvm::CallInst * generateCondReturnFunctionCall (llvm::IRBuilder<> &irb, llvm::Value *cond, llvm::Value *t)
 
virtual void generateBranchFunction ()
 
virtual llvm::CallInst * generateBranchFunctionCall (llvm::IRBuilder<> &irb, llvm::Value *t)
 
virtual void generateCondBranchFunction ()
 
virtual llvm::CallInst * generateCondBranchFunctionCall (llvm::IRBuilder<> &irb, llvm::Value *cond, llvm::Value *t)
 
virtual llvm::GlobalVariable * createRegister (uint32_t r, llvm::GlobalValue::LinkageTypes lt=llvm::GlobalValue::LinkageTypes::InternalLinkage, llvm::Constant *initializer=nullptr)
 
virtual llvm::Value * loadRegister (uint32_t r, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::THROW)=0
 
virtual llvm::Value * loadOp (CInsnOp &op, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr, bool lea=false)=0
 
virtual llvm::Instruction * storeRegister (uint32_t r, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST)=0
 
virtual llvm::Instruction * storeOp (CInsnOp &op, llvm::Value *val, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::SEXT_TRUNC_OR_BITCAST)=0
 
llvm::Value * loadOp (CInsn *ci, llvm::IRBuilder<> &irb, std::size_t idx, llvm::Type *loadType=nullptr, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::NOTHING)
 
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)
 
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)
 
llvm::Value * loadOpUnary (CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *dstType=nullptr, llvm::Type *loadType=nullptr, eOpConv ct=eOpConv::THROW)
 
std::pair< llvm::Value *, llvm::Value * > loadOpBinary (CInsn *ci, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::NOTHING)
 
std::pair< llvm::Value *, llvm::Value * > loadOpBinary (CInsn *ci, llvm::IRBuilder<> &irb, eOpConv ict, eOpConv fct)
 
std::pair< llvm::Value *, llvm::Value * > loadOpBinary (CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *loadType, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::NOTHING)
 
llvm::Value * loadOpBinaryOp0 (CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr)
 
llvm::Value * loadOpBinaryOp1 (CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *ty=nullptr)
 
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > loadOpTernary (CInsn *ci, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::NOTHING)
 
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > loadOpTernary (CInsn *ci, llvm::IRBuilder<> &irb, eOpConv ict, eOpConv fct)
 
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > loadOpTernary (CInsn *ci, llvm::IRBuilder<> &irb, llvm::Type *loadType, llvm::Type *dstType=nullptr, eOpConv ct=eOpConv::NOTHING)
 
std::pair< llvm::Value *, llvm::Value * > loadOpBinaryOrTernaryOp1Op2 (CInsn *ai, llvm::IRBuilder<> &irb, eOpConv ct=eOpConv::NOTHING)
 
std::pair< llvm::Value *, llvm::Value * > loadOpBinaryOrTernaryOp1Op2 (CInsn *ai, llvm::IRBuilder<> &irb, eOpConv ict, eOpConv fct)
 
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > loadOpQuaternaryOp1Op2Op3 (CInsn *ai, llvm::IRBuilder<> &irb)
 
llvm::Value * generateCarryAdd (llvm::Value *add, llvm::Value *op0, llvm::IRBuilder<> &irb)
 
llvm::Value * generateCarryAddC (llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
 
llvm::Value * generateCarryAddInt4 (llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
 
llvm::Value * generateCarryAddCInt4 (llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
 
llvm::Value * generateOverflowAdd (llvm::Value *add, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
 
llvm::Value * generateOverflowAddC (llvm::Value *add, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
 
llvm::Value * generateOverflowSub (llvm::Value *sub, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
 
llvm::Value * generateOverflowSubC (llvm::Value *sub, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
 
llvm::Value * generateBorrowSub (llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
 
llvm::Value * generateBorrowSubC (llvm::Value *sub, llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
 
llvm::Value * generateBorrowSubInt4 (llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb)
 
llvm::Value * generateBorrowSubCInt4 (llvm::Value *op0, llvm::Value *op1, llvm::IRBuilder<> &irb, llvm::Value *cf=nullptr)
 
llvm::IntegerType * getDefaultType ()
 
llvm::Value * getThisInsnAddress (cs_insn *i)
 
llvm::Value * getNextInsnAddress (cs_insn *i)
 
llvm::BranchInst * getCondBranchForInsnInIfThen (llvm::Instruction *i) const
 
std::string getPseudoAsmFunctionName (cs_insn *insn)
 
llvm::Function * getPseudoAsmFunction (cs_insn *insn, llvm::FunctionType *type, const std::string &name="")
 
llvm::Function * getPseudoAsmFunction (cs_insn *insn, llvm::Type *retType, llvm::ArrayRef< llvm::Type * > params, const std::string &name="")
 
void translatePseudoAsmOp0Fnc (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmFncOp0 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp0 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmFncOp0Op1 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp1 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp0Op1 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmFncOp0Op1Op2 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp1Op2 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp0Op1Op2 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmFncOp0Op1Op2Op3 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp1Op2Op3 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0FncOp0Op1Op2Op3 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void translatePseudoAsmOp0Op1FncOp0Op1Op2Op3 (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
virtual bool isOperandRegister (CInsnOp &op)=0
 
virtual uint8_t getOperandAccess (CInsnOp &op)
 
virtual void translatePseudoAsmGeneric (cs_insn *i, CInsn *ci, llvm::IRBuilder<> &irb)
 
void throwUnexpectedOperands (cs_insn *i, const std::string comment="")
 
void throwUnhandledInstructions (cs_insn *i, const std::string comment="")
 

Protected Attributes

csh _handle = 0
 
cs_arch _arch = CS_ARCH_ALL
 
cs_mode _basicMode = CS_MODE_LITTLE_ENDIAN
 
cs_mode _extraMode = CS_MODE_LITTLE_ENDIAN
 
cs_mode _origBasicMode = CS_MODE_LITTLE_ENDIAN
 
llvm::Module * _module = nullptr
 
llvm::GlobalVariable * _asm2llvmGv = nullptr
 
llvm::Function * _callFunction = nullptr
 
llvm::Function * _returnFunction = nullptr
 
llvm::Function * _branchFunction = nullptr
 
llvm::Function * _condBranchFunction = nullptr
 
llvm::GlobalValue::LinkageTypes _regLt
 
std::map< std::pair< std::string, llvm::FunctionType * >, llvm::Function * > _insn2asmFunctions
 (fnc_name, fnc_type) -> fnc More...
 
std::set< llvm::Function * > _asmFunctions
 
std::map< uint32_t, std::string > _reg2name
 
std::map< uint32_t, llvm::Type * > _reg2type
 
std::map< llvm::GlobalVariable *, uint32_t > _llvm2CapstoneRegs
 
std::map< uint32_t, llvm::GlobalVariable * > _capstone2LlvmRegs
 
llvm::CallInst * _branchGenerated = nullptr
 
bool _inCondition = false
 
llvm::Value * op0 = nullptr
 
llvm::Value * op1 = nullptr
 
llvm::Value * op2 = nullptr
 
llvm::Value * op3 = nullptr
 
cs_insn * _insn = nullptr
 Capstone instruction being currently translated. More...
 
std::set< unsigned int > _callInsnIds
 
std::set< unsigned int > _returnInsnIds
 
std::set< unsigned int > _branchInsnIds
 
std::set< unsigned int > _condBranchInsnIds
 
std::set< unsigned int > _controlFlowInsnIds
 
bool _ignoreUnexpectedOperands = true
 
bool _ignoreUnhandledInstructions = true
 
bool _generatePseudoAsmFunctions = true
 

Additional Inherited Members

- Static Public Member Functions inherited from retdec::capstone2llvmir::Capstone2LlvmIrTranslator
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateArch (cs_arch a, llvm::Module *m, cs_mode basic=CS_MODE_LITTLE_ENDIAN, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateArm (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateThumb (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateArm64 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateMips32 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateMips64 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateMips3 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateMips32R6 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateX86_16 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateX86_32 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateX86_64 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreatePpc32 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreatePpc64 (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreatePpcQpx (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateSparc (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateSysz (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 
static std::unique_ptr< Capstone2LlvmIrTranslatorcreateXcore (llvm::Module *m, cs_mode extra=CS_MODE_LITTLE_ENDIAN)
 

Detailed Description

template<typename CInsn, typename CInsnOp>
class retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >

Private implementation class.

Implements a lot of stuff from Capstone2LlvmIrTranslator public interface that is common for all translators. However:

Member Enumeration Documentation

◆ eOpConv

template<typename CInsn , typename CInsnOp >
enum retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl::eOpConv
strongprotected

What should instruction operand loading method do if types of loaded operands are not the same.

Enumerator
THROW 

Throw exception.

NOTHING 

Operand types does not have to be equal.

ZEXT_TRUNC_OR_BITCAST 

Convert to destination integer type using ZEXT or TRUNC. If source is FP type converts it using bitcast.

SEXT_TRUNC_OR_BITCAST 

Convert to destination integer type using SEXT or TRUNC. If source is FP type converts it using bitcast.

FPCAST_OR_BITCAST 

Convert to destination FP type using FPCast (FPExt, BitCast, or FPTrunc). If source is integer type converts it using bitcast.

SITOFP_OR_FPCAST 

Convert to destination FP type using SIToFP. Source must be integer, destination fp, or LLVM asserts.

UITOFP_OR_FPCAST 

Convert to destination FP type using UIToFP. Source must be integer, destination fp, or LLVM asserts.

Constructor & Destructor Documentation

◆ Capstone2LlvmIrTranslator_impl()

template<typename CInsn , typename CInsnOp >
retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::Capstone2LlvmIrTranslator_impl ( cs_arch  a,
cs_mode  basic,
cs_mode  extra,
llvm::Module *  m 
)

◆ ~Capstone2LlvmIrTranslator_impl()

template<typename CInsn , typename CInsnOp >
retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::~Capstone2LlvmIrTranslator_impl
virtual

Member Function Documentation

◆ _checkTypeConversion()

template<typename CInsn , typename CInsnOp >
llvm::Type * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_checkTypeConversion ( llvm::IRBuilder<> &  irb,
llvm::Type *  to,
eOpConv  ct 
)
protected

Internal method used to correct type used for operands convertion based on specified "convertion type method" - ct.

Parameters
irbLLVM IR Builder required for IR modifications.
toresult type that will be used to convert operands.
ctconvertion method by which will be opeands converted to the resut type.
Returns
If result type for convertion can be used with specified conversion method returns param to. Otherwise will this method try to create suitable type for convertion method ct with size of llvm type of param to.

◆ _loadOps()

template<typename CInsn , typename CInsnOp >
std::vector< llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_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 
)
protected

Create LLVM loads for LLVM values representing last N operands (opCnt) of specified instruction. If strict check is set, this method will check wheater number of operands of the instructions is equal to the "opCnt". If conversion type is set to NOTHING no conversion will happen and each operand may have different size and type.

This method was created to be used in internal load methods. Usage of adequate loadOp(Binary|Ternary|...) is preffered.

Parameters
ciInstruction of which operands will be loaded.
irbLLVM IR Builder required for IR modifications.
opCntNumber of operands that will be loaded.
strictCheckIf set to true opCnt will be equal as number of operands. Otherwise will load N last operands.
loadTypeType of loaded value. (not relevant if nullptr)
dstTypeDesired type of loaded value (not changed if nullptr).
ctUsed conversion. Defaultly NOTHING as "do not convert".

◆ _loadOpsUniversal()

template<typename CInsn , typename CInsnOp >
std::vector< llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_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 
)
protected

Similiar functionality as _loadOps but used conversion is determined by type of first loaded operand. This means that if first operand is of integer type then ict convertion will be used on all other opernads. If first perand is floting point type then used convertion will be fct.

Parameters
ci
irb
opCnt
strictCheck
ictInteger convertion type.
fctFloting point convertion type.

◆ closeHandle()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::closeHandle
protectedvirtual

◆ configureHandle()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::configureHandle
protectedvirtual

◆ createRegister()

template<typename CInsn , typename CInsnOp >
llvm::GlobalVariable * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::createRegister ( uint32_t  r,
llvm::GlobalValue::LinkageTypes  lt = llvm::GlobalValue::LinkageTypes::InternalLinkage,
llvm::Constant *  initializer = nullptr 
)
protectedvirtual

◆ generateBorrowSub()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateBorrowSub ( llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb 
)
protected

borrow_sub()

◆ generateBorrowSubC()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateBorrowSubC ( llvm::Value *  sub,
llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb,
llvm::Value *  cf = nullptr 
)
protected

borrow_sub_c()

◆ generateBorrowSubCInt4()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateBorrowSubCInt4 ( llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb,
llvm::Value *  cf = nullptr 
)
protected

borrow_sub_c_int4()

◆ generateBorrowSubInt4()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateBorrowSubInt4 ( llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb 
)
protected

borrow_sub_int4()

◆ generateBranchFunction()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateBranchFunction
protectedvirtual

◆ generateBranchFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::CallInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateBranchFunctionCall ( llvm::IRBuilder<> &  irb,
llvm::Value *  t 
)
protectedvirtual

◆ generateCallFunction()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCallFunction
protectedvirtual

◆ generateCallFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::CallInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCallFunctionCall ( llvm::IRBuilder<> &  irb,
llvm::Value *  t 
)
protectedvirtual

◆ generateCarryAdd()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCarryAdd ( llvm::Value *  add,
llvm::Value *  op0,
llvm::IRBuilder<> &  irb 
)
protected

carry_add()

◆ generateCarryAddC()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCarryAddC ( llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb,
llvm::Value *  cf = nullptr 
)
protected

carry_add_c()

If cf is not passed, default cf register is used. Why pass it?

  • Pass cf if you want to generate nicer code - prevent second cf load if it is already loaded by caller. This should however be taken care of by after generation optimizations.
  • Use a different value as cf.

◆ generateCarryAddCInt4()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCarryAddCInt4 ( llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb,
llvm::Value *  cf = nullptr 
)
protected

carry_add_c_int4()

◆ generateCarryAddInt4()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCarryAddInt4 ( llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb 
)
protected

carry_add_int4()

◆ generateCondBranchFunction()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCondBranchFunction
protectedvirtual

◆ generateCondBranchFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::CallInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCondBranchFunctionCall ( llvm::IRBuilder<> &  irb,
llvm::Value *  cond,
llvm::Value *  t 
)
protectedvirtual

◆ generateCondCallFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::CallInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCondCallFunctionCall ( llvm::IRBuilder<> &  irb,
llvm::Value *  cond,
llvm::Value *  t 
)
protectedvirtual

◆ generateCondReturnFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::CallInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateCondReturnFunctionCall ( llvm::IRBuilder<> &  irb,
llvm::Value *  cond,
llvm::Value *  t 
)
protectedvirtual

◆ generateDataLayout()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateDataLayout ( )
protectedpure virtual

◆ generateEnvironment()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateEnvironment
protectedvirtual

◆ generateEnvironmentArchSpecific()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateEnvironmentArchSpecific ( )
protectedpure virtual

◆ generateOverflowAdd()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateOverflowAdd ( llvm::Value *  add,
llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb 
)
protected

overflow_add()

◆ generateOverflowAddC()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateOverflowAddC ( llvm::Value *  add,
llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb,
llvm::Value *  cf = nullptr 
)
protected

overflow_add_c()

◆ generateOverflowSub()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateOverflowSub ( llvm::Value *  sub,
llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb 
)
protected

overflow_sub()

◆ generateOverflowSubC()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateOverflowSubC ( llvm::Value *  sub,
llvm::Value *  op0,
llvm::Value *  op1,
llvm::IRBuilder<> &  irb,
llvm::Value *  cf = nullptr 
)
protected

overflow_sub_c()

◆ generateRegisters()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateRegisters ( )
protectedpure virtual

◆ generateReturnFunction()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateReturnFunction
protectedvirtual

◆ generateReturnFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::CallInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateReturnFunctionCall ( llvm::IRBuilder<> &  irb,
llvm::Value *  t 
)
protectedvirtual

◆ generateSpecialAsm2LlvmInstr()

template<typename CInsn , typename CInsnOp >
llvm::StoreInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateSpecialAsm2LlvmInstr ( llvm::IRBuilder<> &  irb,
cs_insn *  i 
)
protectedvirtual

◆ generateSpecialAsm2LlvmMapGlobal()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateSpecialAsm2LlvmMapGlobal
protectedvirtual

The generated global variable is unnamed. capstone2llvmir library does not allow to specify or set its name. Users can however get the variable with getAsm2LlvmMapGlobalVariable() and do whatever they want with it (e.g. rename).

◆ generateTypeConversion()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::generateTypeConversion ( llvm::IRBuilder<> &  irb,
llvm::Value *  from,
llvm::Type *  to,
eOpConv  ct 
)
protected

◆ getArchBitSize()

template<typename CInsn , typename CInsnOp >
uint32_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getArchBitSize ( )
overridevirtual
Returns
Architecture bit size according to the currently set basic mode.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getArchitecture()

template<typename CInsn , typename CInsnOp >
cs_arch retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getArchitecture ( ) const
overridevirtual
Returns
Capstone architecture this translator was initialized with.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getAsm2LlvmMapGlobalVariable()

template<typename CInsn , typename CInsnOp >
llvm::GlobalVariable * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getAsm2LlvmMapGlobalVariable ( ) const
overridevirtual
Returns
LLVM global variable used for LLVM IR <-> Capstone instruction mapping?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getBasicMode()

template<typename CInsn , typename CInsnOp >
cs_mode retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getBasicMode ( ) const
overridevirtual
Returns
Capstone basic mode this translator is currently in.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getBranchFunction()

template<typename CInsn , typename CInsnOp >
llvm::Function * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getBranchFunction ( ) const
overridevirtual
Returns
LLVM function used as special pseudo function whose call represents a branch operation in the translated LLVM IR. Function signature:
void (i<arch_sz>)

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getCallFunction()

template<typename CInsn , typename CInsnOp >
llvm::Function * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getCallFunction ( ) const
overridevirtual
Returns
LLVM function used as special pseudo function whose call represents a call operation in the translated LLVM IR. Function signature:
void (i<arch_sz>)

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getCapstoneEngine()

template<typename CInsn , typename CInsnOp >
const csh & retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getCapstoneEngine ( ) const
overridevirtual
Returns
Handle to the underlying Capstone engine.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getCapstoneRegister()

template<typename CInsn , typename CInsnOp >
uint32_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getCapstoneRegister ( llvm::GlobalVariable *  gv) const
overridevirtual
Returns
Capstone register corresponding to the provided LLVM global variable gv if such register exists, zero otherwise (zero equals to [arch]_REG_INVALID in all Capstone architecture models, e.g. ARM_REG_INVALID, MIPS_REG_INVALID).

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getCarryRegister()

template<typename CInsn , typename CInsnOp >
virtual uint32_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getCarryRegister ( )
protectedpure virtual

◆ getCondBranchForInsnInIfThen()

template<typename CInsn , typename CInsnOp >
llvm::BranchInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getCondBranchForInsnInIfThen ( llvm::Instruction *  i) const
protected

◆ getCondBranchFunction()

template<typename CInsn , typename CInsnOp >
llvm::Function * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getCondBranchFunction ( ) const
overridevirtual
Returns
LLVM function used as special pseudo function whose call represents a conditional branch operation in the translated LLVM IR.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getDefaultType()

template<typename CInsn , typename CInsnOp >
llvm::IntegerType * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getDefaultType
protected

◆ getDelaySlot()

template<typename CInsn , typename CInsnOp >
std::size_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getDelaySlot ( uint32_t  id) const
overridevirtual
Returns
Size (number of instructions) of delay slot for the specified Capstone instruction id.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

Reimplemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorMips_impl.

◆ getExtraMode()

template<typename CInsn , typename CInsnOp >
cs_mode retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getExtraMode ( ) const
overridevirtual
Returns
Capstone extra mode this translator is currently in.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getModule()

template<typename CInsn , typename CInsnOp >
llvm::Module * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getModule ( ) const
overridevirtual
Returns
LLVM module this translator works with.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getNextInsnAddress()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getNextInsnAddress ( cs_insn *  i)
protected

◆ getOperandAccess()

template<typename CInsn , typename CInsnOp >
uint8_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getOperandAccess ( CInsnOp &  op)
protectedvirtual

Some architectures do not have this info in operands. Return default value: CS_AC_INVALID.

◆ getPseudoAsmFunction() [1/2]

template<typename CInsn , typename CInsnOp >
llvm::Function * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getPseudoAsmFunction ( cs_insn *  insn,
llvm::FunctionType *  type,
const std::string &  name = "" 
)
protected

Get already existing asm functions associated with name, or if there is no such function, create it using name and type, add it to asm functions and return it.

Returns
Functions associated with insnId.

◆ getPseudoAsmFunction() [2/2]

template<typename CInsn , typename CInsnOp >
llvm::Function * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getPseudoAsmFunction ( cs_insn *  insn,
llvm::Type *  retType,
llvm::ArrayRef< llvm::Type * >  params,
const std::string &  name = "" 
)
protected

The same as getPseudoAsmFunction(std::size_t,std::string&, llvm::FunctionType*), but function type is created by this variant.

◆ getPseudoAsmFunctionName()

template<typename CInsn , typename CInsnOp >
std::string retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getPseudoAsmFunctionName ( cs_insn *  insn)
protected

Generate pseudo assembly function name from the given instruction insn.

◆ getPseudoAsmFunctions()

template<typename CInsn , typename CInsnOp >
const std::set< llvm::Function * > & retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getPseudoAsmFunctions ( ) const
overridevirtual

Get all pseudo assembly functions for instructions which full semantics is not implemented.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getRegister()

template<typename CInsn , typename CInsnOp >
llvm::GlobalVariable * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getRegister ( uint32_t  r)
overridevirtual
Returns
LLVM global variable corresponding to the specified Capstone register r, or nullptr if such global does not exist.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getRegisterBitSize()

template<typename CInsn , typename CInsnOp >
uint32_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getRegisterBitSize ( uint32_t  r) const
overridevirtual
Returns
Register bit size corresponding to the specified Capstone register r. This function works even for the additional registers defined in translators and missing in Capstone (e.g. individual flag registers). Throws Capstone2LlvmIrError exception if register bit size not found.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getRegisterByteSize()

template<typename CInsn , typename CInsnOp >
uint32_t retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getRegisterByteSize ( uint32_t  r) const
overridevirtual
Returns
Register byte size corresponding to the specified Capstone register r. This function works even for the additional registers defined in translators and missing in Capstone (e.g. individual flag registers). Throws Capstone2LlvmIrError exception if register byte size not found.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getRegisterName()

template<typename CInsn , typename CInsnOp >
std::string retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getRegisterName ( uint32_t  r) const
overridevirtual
Returns
Register name corresponding to the specified Capstone register r. The name may differ from names used by the Capstone library. This function works even for the additional registers defined in translators and missing in Capstone (e.g. individual flag registers). Throws Capstone2LlvmIrError exception if register name not found.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getRegisterType()

template<typename CInsn , typename CInsnOp >
llvm::Type * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getRegisterType ( uint32_t  r) const
overridevirtual
Returns
Register data type corresponding to the specified Capstone register r. This function works even for the additional registers defined in translators and missing in Capstone (e.g. individual flag registers). Throws Capstone2LlvmIrError exception if register data type not found.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getReturnFunction()

template<typename CInsn , typename CInsnOp >
llvm::Function * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getReturnFunction ( ) const
overridevirtual
Returns
LLVM function used as special pseudo function whose call represents a return operation in the translated LLVM IR. Function signature:
void (i<arch_sz>)

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ getThisInsnAddress()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::getThisInsnAddress ( cs_insn *  i)
protected

◆ hasDelaySlot()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::hasDelaySlot ( uint32_t  id) const
overridevirtual

Has the specified Capstone instruction id any kind of delay slot?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

Reimplemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorMips_impl.

◆ hasDelaySlotLikely()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::hasDelaySlotLikely ( uint32_t  id) const
overridevirtual

Has the specified Capstone instruction id likely delay slot?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

Reimplemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorMips_impl.

◆ hasDelaySlotTypical()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::hasDelaySlotTypical ( uint32_t  id) const
overridevirtual

Has the specified Capstone instruction id typical delay slot?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

Reimplemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorMips_impl.

◆ initialize()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::initialize
protectedvirtual

◆ initializeArchSpecific()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::initializeArchSpecific ( )
protectedpure virtual

◆ initializePseudoCallInstructionIDs()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::initializePseudoCallInstructionIDs ( )
protectedpure virtual

If possible, initialize _callInsnIds, _returnInsnIds, _branchInsnIds, _condBranchInsnIds, _condBranchInsnIds sets.

For some architectures, it is not possible to initialize all the instructions that may generate control flow change. E.g. Any kind of ARM instruction that writes to PC is changing control flow.

This is not ideal, because each time some instruction that generates one of these is added, or removed, its ID must also be manualy added, or removed, here. This could be easily forgotten. Right now, I do not know how to solve this better (i.e. automatic update).

Implemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorX86_impl, retdec::capstone2llvmir::Capstone2LlvmIrTranslatorPowerpc_impl, retdec::capstone2llvmir::Capstone2LlvmIrTranslatorMips_impl, retdec::capstone2llvmir::Capstone2LlvmIrTranslatorArm64_impl, and retdec::capstone2llvmir::Capstone2LlvmIrTranslatorArm_impl.

◆ initializeRegNameMap()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::initializeRegNameMap ( )
protectedpure virtual

◆ initializeRegTypeMap()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::initializeRegTypeMap ( )
protectedpure virtual

◆ isAnyPseudoFunction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isAnyPseudoFunction ( llvm::Function *  f) const
overridevirtual

Is the passed LLVM function f any kind of pseudo function generated by capstone2llvmir (e.g. call/return/br/... function).

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

Reimplemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorX86_impl.

◆ isAnyPseudoFunctionCall()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isAnyPseudoFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is the passed LLVM call c any kind of pseudo call generated by capstone2llvmir (e.g. call/return/br/... function call).

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

Reimplemented in retdec::capstone2llvmir::Capstone2LlvmIrTranslatorX86_impl.

◆ isBranchFunction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isBranchFunction ( llvm::Function *  f) const
overridevirtual

Is the passed LLVM function f the special pseudo function whose call represents branch operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isBranchFunctionCall()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isBranchFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is the passed LLVM call instruction c a special pseudo call instruction representing a branch operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isBranchInstruction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isBranchInstruction ( cs_insn &  i) const
overridevirtual
Returns
True if the Capstone instruction i is any kind of branch instruction, translation of which would produce branch pseudo call. False otherwise.
Note
This may not be always known for all architectures. Right now, it only works for x86 and MIPS. See isControlFlowInstruction() for more details.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isCallFunction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isCallFunction ( llvm::Function *  f) const
overridevirtual

Is the passed LLVM function f the special pseudo function whose call represents call operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isCallFunctionCall()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isCallFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is the passed LLVM call instruction c a special pseudo call instruction representing a call operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isCallInstruction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isCallInstruction ( cs_insn &  i) const
overridevirtual
Returns
True if the Capstone instruction i is any kind of call instruction, translation of which would produce call pseudo call. False otherwise.
Note
This may not be always known for all architectures. Right now, it only works for x86 and MIPS. See isControlFlowInstruction() for more details.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isCondBranchFunction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isCondBranchFunction ( llvm::Function *  f) const
overridevirtual

Is the passed LLVM function f the special pseudo function whose call represents conditional branch operation in the translated LLVM IR? Function signature:

void (i1, i<arch_sz>)

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isCondBranchFunctionCall()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isCondBranchFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is the passed LLVM call instruction c a special pseudo call instruction representing a conditional branch operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isCondBranchInstruction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isCondBranchInstruction ( cs_insn &  i) const
overridevirtual
Returns
True if the Capstone instruction i is any kind of conditional branch instruction, translation of which would produce conditional branch pseudo call. False otherwise.
Note
This may not be always known for all architectures. Right now, it only works for x86 and MIPS. See isControlFlowInstruction() for more details.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isControlFlowInstruction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isControlFlowInstruction ( cs_insn &  i) const
overridevirtual

Check if the translation of this instruction will/may produce any kind of control flow changing pseudo call (i.e. call/return/br/condbr pseudo function call).

For ARM, parameter i must include detail member - instruction cannot be disassembled with CS_OP_DETAIL = CS_OPT_OFF, or with CS_OP_SKIPDATA = CS_OPT_OFF.

For x86, MIPS, PowerPC, parameter i may not include detail member - instruction can be disassembled with CS_OP_DETAIL = CS_OPT_ON, or with CS_OP_SKIPDATA = CS_OPT_ON.

It is sometimes tricky to find this information without actually translating the instruction. On the other hand, for some architectures, it would be possible to give more detailed information (e.g. the kind of pseudo function call), sometimes even from instruction ID alone (i.e. cs_insn::id):

  • x86: All kinds of pseudo function calls can be recognized from the instruction ID alone.
  • mips: All kinds of pseudo function calls can be recognized from the instruction ID alone.
  • powerpc: Can determine if the instruction is control flow changing from the instruction ID alone. Hard/impossible to determine the type without detail and replicating the full analysis used in translation.
  • arm: Impossible to determine if the instruction is control flow changing from the instruction ID alone. Instructions may directly write the program counter - instruction details are needed. Instructions may be conditional.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isGeneratePseudoAsmFunctions()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isGeneratePseudoAsmFunctions
overridevirtual

◆ isIgnoreUnexpectedOperands()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isIgnoreUnexpectedOperands
overridevirtual

◆ isIgnoreUnhandledInstructions()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isIgnoreUnhandledInstructions
overridevirtual

◆ isInConditionBranchFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::BranchInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isInConditionBranchFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is isBranchFunctionCall() true for the passed LLVM call instruction c, and execution of the call instruction c is conditional.

Returns
Branch instruction which true branch jumps to the c if c is conditional, nullptr otherwise.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isInConditionCallFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::BranchInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isInConditionCallFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is isCallFunctionCall() true for the passed LLVM call instruction c, and execution of the call instruction c is conditional.

Returns
Branch instruction which true branch jumps to the c if c is conditional, nullptr otherwise.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isInConditionCondBranchFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::BranchInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isInConditionCondBranchFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is isCondBranchFunction() true for the passed LLVM call instruction c, and execution of the call instruction c is conditional.

Returns
Branch instruction which true branch jumps to the c if c is conditional, nullptr otherwise.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isInConditionReturnFunctionCall()

template<typename CInsn , typename CInsnOp >
llvm::BranchInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isInConditionReturnFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is isReturnFunctionCall() true for the passed LLVM call instruction c, and execution of the call instruction c is conditional.

Returns
Branch instruction which true branch jumps to the c if c is conditional, nullptr otherwise.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isOperandRegister()

template<typename CInsn , typename CInsnOp >
virtual bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isOperandRegister ( CInsnOp &  op)
protectedpure virtual

◆ isPseudoAsmFunction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isPseudoAsmFunction ( llvm::Function *  f) const
overridevirtual

Is the passed LLVM function f any pseudo assembly functions for instructions which full semantics is not implemented?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isPseudoAsmFunctionCall()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isPseudoAsmFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is the passed LLVM call c any kind of pseudo assembly call for instructions which full semantics is not implemented?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isRegister()

template<typename CInsn , typename CInsnOp >
llvm::GlobalVariable * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isRegister ( llvm::Value *  v) const
overridevirtual

Is the passed LLVM value v a global variable representing some HW register?

Returns
Value v casted to llvm::GlobalVariable if it is representing some HW register, nullptr otherwise.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isReturnFunction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isReturnFunction ( llvm::Function *  f) const
overridevirtual

Is the passed LLVM function f the special pseudo function whose call represents return operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isReturnFunctionCall()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isReturnFunctionCall ( llvm::CallInst *  c) const
overridevirtual

Is the passed LLVM call instruction c a special pseudo call instruction representing a return operation in the translated LLVM IR?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isReturnInstruction()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isReturnInstruction ( cs_insn &  i) const
overridevirtual
Returns
True if the Capstone instruction i is any kind of return instruction, translation of which would produce return pseudo call. False otherwise.
Note
This may not be always known for all architectures. Right now, it only works for x86 and MIPS. See isControlFlowInstruction() for more details.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isSpecialAsm2LlvmInstr()

template<typename CInsn , typename CInsnOp >
llvm::StoreInst * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isSpecialAsm2LlvmInstr ( llvm::Value *  v) const
overridevirtual

Is the passed LLVM value v a special instruction used for LLVM IR <-> Capstone instruction mapping?

Returns
Value v casted to llvm::StoreInst if it is a special mapping instruction, nullptr otherwise.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ isSpecialAsm2LlvmMapGlobal()

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::isSpecialAsm2LlvmMapGlobal ( llvm::Value *  v) const
overridevirtual

Is the passed LLVM value v the special global variable used for LLVM IR <-> Capstone instruction mapping?

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ loadOp() [1/2]

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOp ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
std::size_t  idx,
llvm::Type *  loadType = nullptr,
llvm::Type *  dstType = nullptr,
eOpConv  ct = eOpConv::NOTHING 
)
protected

Creates LLVM load from LLVM value representing operand of instruction ci on index idx. User of this method may specify type to which will be loaded value converted and method of the conversion.

Parameters
ciInstruction of which operand will be loaded.
irbLLVM IR Builder required for IR modifications.
idxOperand index.
loadTypeType of loaded value. (not relevant if nullptr)
dstTypeDesired type of loaded value (not changed if nullptr).
ctUsed conversion. Defaultly NOTHING as "do not convert".

◆ loadOp() [2/2]

template<typename CInsn , typename CInsnOp >
virtual llvm::Value* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOp ( CInsnOp &  op,
llvm::IRBuilder<> &  irb,
llvm::Type *  ty = nullptr,
bool  lea = false 
)
protectedpure virtual

◆ loadOpBinary() [1/3]

template<typename CInsn , typename CInsnOp >
std::pair< llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
eOpConv  ct = eOpConv::NOTHING 
)
protected

Throws if op_count != 2.

◆ loadOpBinary() [2/3]

template<typename CInsn , typename CInsnOp >
std::pair< llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
eOpConv  ict,
eOpConv  fct 
)
protected

Throws if op_count != 2.

◆ loadOpBinary() [3/3]

template<typename CInsn , typename CInsnOp >
std::pair< llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
llvm::Type *  loadType,
llvm::Type *  dstType = nullptr,
eOpConv  ct = eOpConv::NOTHING 
)
protected

◆ loadOpBinaryOp0()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinaryOp0 ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
llvm::Type *  ty = nullptr 
)
protected

Throws if op_count != 2.

◆ loadOpBinaryOp1()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinaryOp1 ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
llvm::Type *  ty = nullptr 
)
protected

Throws if op_count != 2.

◆ loadOpBinaryOrTernaryOp1Op2() [1/2]

template<typename CInsn , typename CInsnOp >
std::pair< llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinaryOrTernaryOp1Op2 ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
eOpConv  ct = eOpConv::NOTHING 
)
protected

Throws if op_count not in {2, 3}.

◆ loadOpBinaryOrTernaryOp1Op2() [2/2]

template<typename CInsn , typename CInsnOp >
std::pair< llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpBinaryOrTernaryOp1Op2 ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
eOpConv  ict,
eOpConv  fct 
)
protected

Throws if op_count not in {2, 3}.

◆ loadOpQuaternaryOp1Op2Op3()

template<typename CInsn , typename CInsnOp >
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpQuaternaryOp1Op2Op3 ( CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

Throws if op_count != 4.

◆ loadOpTernary() [1/3]

template<typename CInsn , typename CInsnOp >
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpTernary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
eOpConv  ct = eOpConv::NOTHING 
)
protected

Throws if op_count != 3.

◆ loadOpTernary() [2/3]

template<typename CInsn , typename CInsnOp >
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpTernary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
eOpConv  ict,
eOpConv  fct 
)
protected

Throws if op_count != 3.

◆ loadOpTernary() [3/3]

template<typename CInsn , typename CInsnOp >
std::tuple< llvm::Value *, llvm::Value *, llvm::Value * > retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpTernary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
llvm::Type *  loadType,
llvm::Type *  dstType = nullptr,
eOpConv  ct = eOpConv::NOTHING 
)
protected

Throws if op_count != 3.

◆ loadOpUnary()

template<typename CInsn , typename CInsnOp >
llvm::Value * retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadOpUnary ( CInsn *  ci,
llvm::IRBuilder<> &  irb,
llvm::Type *  loadType = nullptr,
llvm::Type *  dstType = nullptr,
eOpConv  ct = eOpConv::THROW 
)
protected

Throws if op_count != 1.

◆ loadRegister()

template<typename CInsn , typename CInsnOp >
virtual llvm::Value* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::loadRegister ( uint32_t  r,
llvm::IRBuilder<> &  irb,
llvm::Type *  dstType = nullptr,
eOpConv  ct = eOpConv::THROW 
)
protectedpure virtual

Load LLVM register corresponding to Capstone register r, using instruction builder irb. Optionally convert the loaded value to type dstType using cast type ct.

Returns
Loaded value.

◆ modifyBasicMode()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::modifyBasicMode ( cs_mode  m)
overridevirtual

Modify basic mode (e.g. CS_MODE_ARM to CS_MODE_THUMB). This must be implemented in concrete classes, so they can check if the requested mode is applicable. Not every basic mode can be used with every architecture. Translators for some architectures (e.g. CS_ARCH_X86) may not even allow switching between modes that is otherwise allowed by Capstone due to internal problems (e.g. different register environments between 16/32/64 x86 architectures).

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ modifyExtraMode()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::modifyExtraMode ( cs_mode  m)
overridevirtual

Modify extra mode (e.g. CS_MODE_LITTLE_ENDIAN to CS_MODE_BIG_ENDIAN). This must be implemented in concrete classes, so they can check if the requested mode is applicable. Not every special mode can be used with every architecture.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ openHandle()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::openHandle
protectedvirtual

◆ setGeneratePseudoAsmFunctions()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::setGeneratePseudoAsmFunctions ( bool  f)
overridevirtual

Should the translator generate pseudo assembly functions for instructions which full semantics is not implemented? True -> generate. False -> don't generate.

Default value: true.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ setIgnoreUnexpectedOperands()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::setIgnoreUnexpectedOperands ( bool  f)
overridevirtual

Should the translator ignore unexpected operands encountered in Capstone instructions? True -> ignore -> try recover or ignore the problem. False -> don't ignore -> throw UnexpectedOperandsError.

Default value: true.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ setIgnoreUnhandledInstructions()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::setIgnoreUnhandledInstructions ( bool  f)
overridevirtual

Should the translator ignore unhandled instructions? True -> ignore. False -> don't ignore -> throw UnhandledInstructionError when instructions without an implemented translation routine is encountered.

Default value: true.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ storeOp()

template<typename CInsn , typename CInsnOp >
virtual llvm::Instruction* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::storeOp ( CInsnOp &  op,
llvm::Value *  val,
llvm::IRBuilder<> &  irb,
eOpConv  ct = eOpConv::SEXT_TRUNC_OR_BITCAST 
)
protectedpure virtual

◆ storeRegister()

template<typename CInsn , typename CInsnOp >
virtual llvm::Instruction* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::storeRegister ( uint32_t  r,
llvm::Value *  val,
llvm::IRBuilder<> &  irb,
eOpConv  ct = eOpConv::SEXT_TRUNC_OR_BITCAST 
)
protectedpure virtual

◆ throwUnexpectedOperands()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::throwUnexpectedOperands ( cs_insn *  i,
const std::string  comment = "" 
)
protected

◆ throwUnhandledInstructions()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::throwUnhandledInstructions ( cs_insn *  i,
const std::string  comment = "" 
)
protected

◆ translate()

template<typename CInsn , typename CInsnOp >
Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::TranslationResult retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translate ( const uint8_t *  bytes,
std::size_t  size,
retdec::common::Address  a,
llvm::IRBuilder<> &  irb,
std::size_t  count = 0,
bool  stopOnBranch = false 
)
overridevirtual

Translate the given bytes.

Parameters
bytesBytes to translate.
sizeSize of the bytes buffer.
aMemory address where bytes are located.
irbLLVM IR builder used to create LLVM IR translation. Translated LLVM IR instructions are created at its current position.
countNumber of assembly instructions to translate, or 0 to translate them all.
stopOnBranchIf set, the translation aborts after any kind of branch is encountered (call, return, branch, conditional branch).
Returns
See TranslationResult structure.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ translateInstruction()

template<typename CInsn , typename CInsnOp >
virtual void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translateInstruction ( cs_insn *  i,
llvm::IRBuilder<> &  irb 
)
protectedpure virtual

◆ translateOne()

template<typename CInsn , typename CInsnOp >
Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::TranslationResultOne retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translateOne ( const uint8_t *&  bytes,
std::size_t &  size,
retdec::common::Address a,
llvm::IRBuilder<> &  irb 
)
overridevirtual

Translate one assembly instruction from the given bytes.

Parameters
bytesBytes to translate. This will be updated to point to the next instruction.
sizeSize of the bytes buffer. This will be updated to reflect bytes update.
aMemory address where bytes are located. This will be updated to point to the next instruction.
irbLLVM IR builder used to create LLVM IR translation. Translated LLVM IR instructions are created at its current position.
Returns
See TranslationResult structure.

Implements retdec::capstone2llvmir::Capstone2LlvmIrTranslator.

◆ translatePseudoAsmFncOp0()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmFncOp0 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

__asm_<mnem>(op0)

◆ translatePseudoAsmFncOp0Op1()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmFncOp0Op1 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

__asm_<mnem>(op0, op1)

◆ translatePseudoAsmFncOp0Op1Op2()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmFncOp0Op1Op2 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

__asm_<mnem>(op0, op1, op2)

◆ translatePseudoAsmFncOp0Op1Op2Op3()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmFncOp0Op1Op2Op3 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

__asm_<mnem>(op0, op1, op2, op3)

◆ translatePseudoAsmGeneric()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmGeneric ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protectedvirtual

Generate pseudo asm call using information provided by Capstone.

◆ translatePseudoAsmOp0Fnc()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0Fnc ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>()

◆ translatePseudoAsmOp0FncOp0()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp0 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op0)

◆ translatePseudoAsmOp0FncOp0Op1()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp0Op1 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op0, op1)

◆ translatePseudoAsmOp0FncOp0Op1Op2()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp0Op1Op2 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op0, op1, op2)

◆ translatePseudoAsmOp0FncOp0Op1Op2Op3()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp0Op1Op2Op3 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op0, op1, op2, op3)

◆ translatePseudoAsmOp0FncOp1()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp1 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op1)

◆ translatePseudoAsmOp0FncOp1Op2()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp1Op2 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op1, op2)

◆ translatePseudoAsmOp0FncOp1Op2Op3()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0FncOp1Op2Op3 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0 = __asm_<mnem>(op1, op2, op3)

◆ translatePseudoAsmOp0Op1FncOp0Op1Op2Op3()

template<typename CInsn , typename CInsnOp >
void retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::translatePseudoAsmOp0Op1FncOp0Op1Op2Op3 ( cs_insn *  i,
CInsn *  ci,
llvm::IRBuilder<> &  irb 
)
protected

op0, op1 = __asm_<mnem>(op0, op1, op2, op3)

Member Data Documentation

◆ _arch

template<typename CInsn , typename CInsnOp >
cs_arch retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_arch = CS_ARCH_ALL
protected

◆ _asm2llvmGv

template<typename CInsn , typename CInsnOp >
llvm::GlobalVariable* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_asm2llvmGv = nullptr
protected

◆ _asmFunctions

template<typename CInsn , typename CInsnOp >
std::set<llvm::Function*> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_asmFunctions
protected

◆ _basicMode

template<typename CInsn , typename CInsnOp >
cs_mode retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_basicMode = CS_MODE_LITTLE_ENDIAN
protected

◆ _branchFunction

template<typename CInsn , typename CInsnOp >
llvm::Function* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_branchFunction = nullptr
protected

◆ _branchGenerated

template<typename CInsn , typename CInsnOp >
llvm::CallInst* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_branchGenerated = nullptr
protected

If the last translated instruction generated branch call, it is stored to this member.

◆ _branchInsnIds

template<typename CInsn , typename CInsnOp >
std::set<unsigned int> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_branchInsnIds
protected

Set of Capstone instruction IDs translation of which would produce branch pseudo call.

◆ _callFunction

template<typename CInsn , typename CInsnOp >
llvm::Function* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_callFunction = nullptr
protected

◆ _callInsnIds

template<typename CInsn , typename CInsnOp >
std::set<unsigned int> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_callInsnIds
protected

Set of Capstone instruction IDs translation of which would produce call pseudo call.

◆ _capstone2LlvmRegs

template<typename CInsn , typename CInsnOp >
std::map<uint32_t, llvm::GlobalVariable*> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_capstone2LlvmRegs
protected

◆ _condBranchFunction

template<typename CInsn , typename CInsnOp >
llvm::Function* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_condBranchFunction = nullptr
protected

◆ _condBranchInsnIds

template<typename CInsn , typename CInsnOp >
std::set<unsigned int> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_condBranchInsnIds
protected

Set of Capstone instruction IDs translation of which would produce conditional branch pseudo call.

◆ _controlFlowInsnIds

template<typename CInsn , typename CInsnOp >
std::set<unsigned int> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_controlFlowInsnIds
protected

Sometimes it is not possible to categorize an instruction ID to one of the sets above without its full analysis. Such instructions can be inserted here. Set of Capstone instruction IDs translation of which may produce any kind of control flow changing pseudo call.

◆ _extraMode

template<typename CInsn , typename CInsnOp >
cs_mode retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_extraMode = CS_MODE_LITTLE_ENDIAN
protected

◆ _generatePseudoAsmFunctions

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_generatePseudoAsmFunctions = true
protected

◆ _handle

template<typename CInsn , typename CInsnOp >
csh retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_handle = 0
protected

◆ _ignoreUnexpectedOperands

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_ignoreUnexpectedOperands = true
protected

◆ _ignoreUnhandledInstructions

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_ignoreUnhandledInstructions = true
protected

◆ _inCondition

template<typename CInsn , typename CInsnOp >
bool retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_inCondition = false
protected

True if generated branch is in conditional code, e.g. uncond branch in if-then.

◆ _insn

template<typename CInsn , typename CInsnOp >
cs_insn* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_insn = nullptr
protected

Capstone instruction being currently translated.

◆ _insn2asmFunctions

template<typename CInsn , typename CInsnOp >
std::map<std::pair<std::string, llvm::FunctionType*>, llvm::Function*> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_insn2asmFunctions
protected

(fnc_name, fnc_type) -> fnc

◆ _llvm2CapstoneRegs

template<typename CInsn , typename CInsnOp >
std::map<llvm::GlobalVariable*, uint32_t> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_llvm2CapstoneRegs
protected

Maps with all LLVM registers created by the translator. Used for bidirectional queries.

◆ _module

template<typename CInsn , typename CInsnOp >
llvm::Module* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_module = nullptr
protected

◆ _origBasicMode

template<typename CInsn , typename CInsnOp >
cs_mode retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_origBasicMode = CS_MODE_LITTLE_ENDIAN
protected

◆ _reg2name

template<typename CInsn , typename CInsnOp >
std::map<uint32_t, std::string> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_reg2name
protected

Register number to register name map. If register number is not mapped here, Capstone's cs_reg_name() function is used to get the name. All registers added by translator (i.e. registers that are not in the original Capstone register enums) must have entries here. Also, it can be used to change default Capstone names.

◆ _reg2type

template<typename CInsn , typename CInsnOp >
std::map<uint32_t, llvm::Type*> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_reg2type
protected

Register number to register LLVM type. It does not look like Capstone provides type information for registers, so all registers need to be manually mapped here.

◆ _regLt

template<typename CInsn , typename CInsnOp >
llvm::GlobalValue::LinkageTypes retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_regLt
protected
Initial value:
=
llvm::GlobalValue::LinkageTypes::InternalLinkage

◆ _returnFunction

template<typename CInsn , typename CInsnOp >
llvm::Function* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_returnFunction = nullptr
protected

◆ _returnInsnIds

template<typename CInsn , typename CInsnOp >
std::set<unsigned int> retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::_returnInsnIds
protected

Set of Capstone instruction IDs translation of which would produce return pseudo call.

◆ op0

template<typename CInsn , typename CInsnOp >
llvm::Value* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::op0 = nullptr
protected

◆ op1

template<typename CInsn , typename CInsnOp >
llvm::Value* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::op1 = nullptr
protected

◆ op2

template<typename CInsn , typename CInsnOp >
llvm::Value* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::op2 = nullptr
protected

◆ op3

template<typename CInsn , typename CInsnOp >
llvm::Value* retdec::capstone2llvmir::Capstone2LlvmIrTranslator_impl< CInsn, CInsnOp >::op3 = nullptr
protected

The documentation for this class was generated from the following files: