retdec
Classes | Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
retdec::llvmir_emul::LlvmIrEmulator Class Reference

#include <llvmir_emul.h>

Inheritance diagram for retdec::llvmir_emul::LlvmIrEmulator:
Inheritance graph
[legend]
Collaboration diagram for retdec::llvmir_emul::LlvmIrEmulator:
Collaboration graph
[legend]

Classes

struct  CallEntry
 

Public Member Functions

 LlvmIrEmulator (llvm::Module *m)
 
 ~LlvmIrEmulator ()
 
llvm::GenericValue runFunction (llvm::Function *f, const llvm::ArrayRef< llvm::GenericValue > argVals={})
 
const std::list< llvm::Instruction * > & getVisitedInstructions () const
 
const std::list< llvm::BasicBlock * > & getVisitedBasicBlocks () const
 
bool wasInstructionVisited (llvm::Instruction *i) const
 
bool wasBasicBlockVisited (llvm::BasicBlock *bb) const
 
llvm::GenericValue getExitValue () const
 
const std::list< CallEntry > & getCallEntries () const
 
std::list< llvm::Value * > getCalledValues () const
 
std::set< llvm::Value * > getCalledValuesSet () const
 
bool wasValueCalled (llvm::Value *v) const
 
const CallEntrygetCallEntry (llvm::Value *v, unsigned n=0) const
 
bool wasGlobalVariableLoaded (llvm::GlobalVariable *gv)
 
bool wasGlobalVariableStored (llvm::GlobalVariable *gv)
 
std::list< llvm::GlobalVariable * > getLoadedGlobalVariables ()
 
std::set< llvm::GlobalVariable * > getLoadedGlobalVariablesSet ()
 
std::list< llvm::GlobalVariable * > getStoredGlobalVariables ()
 
std::set< llvm::GlobalVariable * > getStoredGlobalVariablesSet ()
 
llvm::GenericValue getGlobalVariableValue (llvm::GlobalVariable *gv)
 
void setGlobalVariableValue (llvm::GlobalVariable *gv, llvm::GenericValue val)
 
bool wasMemoryLoaded (uint64_t addr)
 
bool wasMemoryStored (uint64_t addr)
 
std::list< uint64_t > getLoadedMemory ()
 
std::set< uint64_t > getLoadedMemorySet ()
 
std::list< uint64_t > getStoredMemory ()
 
std::set< uint64_t > getStoredMemorySet ()
 
llvm::GenericValue getMemoryValue (uint64_t addr)
 
void setMemoryValue (uint64_t addr, llvm::GenericValue val)
 
llvm::GenericValue getValueValue (llvm::Value *val)
 
void visitReturnInst (llvm::ReturnInst &I)
 
void visitBranchInst (llvm::BranchInst &I)
 
void visitSwitchInst (llvm::SwitchInst &I)
 
void visitIndirectBrInst (llvm::IndirectBrInst &I)
 
void visitBinaryOperator (llvm::BinaryOperator &I)
 
void visitICmpInst (llvm::ICmpInst &I)
 
void visitFCmpInst (llvm::FCmpInst &I)
 
void visitAllocaInst (llvm::AllocaInst &I)
 
void visitLoadInst (llvm::LoadInst &I)
 
void visitStoreInst (llvm::StoreInst &I)
 
void visitGetElementPtrInst (llvm::GetElementPtrInst &I)
 
void visitPHINode (llvm::PHINode &PN)
 
void visitTruncInst (llvm::TruncInst &I)
 
void visitZExtInst (llvm::ZExtInst &I)
 
void visitSExtInst (llvm::SExtInst &I)
 
void visitFPTruncInst (llvm::FPTruncInst &I)
 
void visitFPExtInst (llvm::FPExtInst &I)
 
void visitUIToFPInst (llvm::UIToFPInst &I)
 
void visitSIToFPInst (llvm::SIToFPInst &I)
 
void visitFPToUIInst (llvm::FPToUIInst &I)
 
void visitFPToSIInst (llvm::FPToSIInst &I)
 
void visitPtrToIntInst (llvm::PtrToIntInst &I)
 
void visitIntToPtrInst (llvm::IntToPtrInst &I)
 
void visitBitCastInst (llvm::BitCastInst &I)
 
void visitSelectInst (llvm::SelectInst &I)
 
void visitCallInst (llvm::CallInst &I)
 
void visitInvokeInst (llvm::InvokeInst &I)
 
void visitUnreachableInst (llvm::UnreachableInst &I)
 
void visitShl (llvm::BinaryOperator &I)
 
void visitLShr (llvm::BinaryOperator &I)
 
void visitAShr (llvm::BinaryOperator &I)
 
void visitVAArgInst (llvm::VAArgInst &I)
 
void visitExtractElementInst (llvm::ExtractElementInst &I)
 
void visitInsertElementInst (llvm::InsertElementInst &I)
 
void visitShuffleVectorInst (llvm::ShuffleVectorInst &I)
 
void visitExtractValueInst (llvm::ExtractValueInst &I)
 
void visitInsertValueInst (llvm::InsertValueInst &I)
 
void visitInstruction (llvm::Instruction &I)
 

Public Attributes

std::vector< LocalExecutionContext_ecStackRetired
 

Private Member Functions

void run ()
 
void callFunction (llvm::Function *f, llvm::ArrayRef< llvm::GenericValue > argVals)
 
void logInstruction (llvm::Instruction *i)
 
void popStackAndReturnValueToCaller (llvm::Type *retT, llvm::GenericValue res)
 

Private Attributes

llvm::IntrinsicLowering * IL = nullptr
 
llvm::Module * _module = nullptr
 
llvm::GenericValue _exitValue
 
std::vector< LocalExecutionContext_ecStack
 
GlobalExecutionContext _globalEc
 
std::list< llvm::Instruction * > _visitedInsns
 
std::list< llvm::BasicBlock * > _visitedBbs
 
std::list< CallEntry_calls
 Intrinsic calls are lowered and not logged here. More...
 

Constructor & Destructor Documentation

◆ LlvmIrEmulator()

retdec::llvmir_emul::LlvmIrEmulator::LlvmIrEmulator ( llvm::Module *  m)

◆ ~LlvmIrEmulator()

retdec::llvmir_emul::LlvmIrEmulator::~LlvmIrEmulator ( )

Member Function Documentation

◆ callFunction()

void retdec::llvmir_emul::LlvmIrEmulator::callFunction ( llvm::Function *  f,
llvm::ArrayRef< llvm::GenericValue >  argVals 
)
private

Right now, this can not handle variadic functions. We probably will not need them anyway, but if we did, it is handled in the LLVM interpreter.

◆ getCalledValues()

std::list< llvm::Value * > retdec::llvmir_emul::LlvmIrEmulator::getCalledValues ( ) const

◆ getCalledValuesSet()

std::set< llvm::Value * > retdec::llvmir_emul::LlvmIrEmulator::getCalledValuesSet ( ) const

◆ getCallEntries()

const std::list< LlvmIrEmulator::CallEntry > & retdec::llvmir_emul::LlvmIrEmulator::getCallEntries ( ) const

◆ getCallEntry()

const LlvmIrEmulator::CallEntry * retdec::llvmir_emul::LlvmIrEmulator::getCallEntry ( llvm::Value *  v,
unsigned  n = 0 
) const
Returns
Pointer to n-th call entry calling v value, or nullptr if such entry does not exist.

◆ getExitValue()

llvm::GenericValue retdec::llvmir_emul::LlvmIrEmulator::getExitValue ( ) const

◆ getGlobalVariableValue()

llvm::GenericValue retdec::llvmir_emul::LlvmIrEmulator::getGlobalVariableValue ( llvm::GlobalVariable *  gv)

◆ getLoadedGlobalVariables()

std::list< llvm::GlobalVariable * > retdec::llvmir_emul::LlvmIrEmulator::getLoadedGlobalVariables ( )

◆ getLoadedGlobalVariablesSet()

std::set< llvm::GlobalVariable * > retdec::llvmir_emul::LlvmIrEmulator::getLoadedGlobalVariablesSet ( )

◆ getLoadedMemory()

std::list< uint64_t > retdec::llvmir_emul::LlvmIrEmulator::getLoadedMemory ( )

◆ getLoadedMemorySet()

std::set< uint64_t > retdec::llvmir_emul::LlvmIrEmulator::getLoadedMemorySet ( )

◆ getMemoryValue()

llvm::GenericValue retdec::llvmir_emul::LlvmIrEmulator::getMemoryValue ( uint64_t  addr)

◆ getStoredGlobalVariables()

std::list< llvm::GlobalVariable * > retdec::llvmir_emul::LlvmIrEmulator::getStoredGlobalVariables ( )

◆ getStoredGlobalVariablesSet()

std::set< llvm::GlobalVariable * > retdec::llvmir_emul::LlvmIrEmulator::getStoredGlobalVariablesSet ( )

◆ getStoredMemory()

std::list< uint64_t > retdec::llvmir_emul::LlvmIrEmulator::getStoredMemory ( )

◆ getStoredMemorySet()

std::set< uint64_t > retdec::llvmir_emul::LlvmIrEmulator::getStoredMemorySet ( )

◆ getValueValue()

llvm::GenericValue retdec::llvmir_emul::LlvmIrEmulator::getValueValue ( llvm::Value *  val)

Get generic value for the passed LLVM value val. If val is a global variable, result of getGlobalVariableValue() is returned. Otherwise, LLVM value to generic value map in global context is used.

◆ getVisitedBasicBlocks()

const std::list< llvm::BasicBlock * > & retdec::llvmir_emul::LlvmIrEmulator::getVisitedBasicBlocks ( ) const

◆ getVisitedInstructions()

const std::list< llvm::Instruction * > & retdec::llvmir_emul::LlvmIrEmulator::getVisitedInstructions ( ) const

◆ logInstruction()

void retdec::llvmir_emul::LlvmIrEmulator::logInstruction ( llvm::Instruction *  i)
private

◆ popStackAndReturnValueToCaller()

void retdec::llvmir_emul::LlvmIrEmulator::popStackAndReturnValueToCaller ( llvm::Type *  retT,
llvm::GenericValue  res 
)
private

◆ run()

void retdec::llvmir_emul::LlvmIrEmulator::run ( )
private

◆ runFunction()

llvm::GenericValue retdec::llvmir_emul::LlvmIrEmulator::runFunction ( llvm::Function *  f,
const llvm::ArrayRef< llvm::GenericValue >  argVals = {} 
)

◆ setGlobalVariableValue()

void retdec::llvmir_emul::LlvmIrEmulator::setGlobalVariableValue ( llvm::GlobalVariable *  gv,
llvm::GenericValue  val 
)

◆ setMemoryValue()

void retdec::llvmir_emul::LlvmIrEmulator::setMemoryValue ( uint64_t  addr,
llvm::GenericValue  val 
)

◆ visitAllocaInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitAllocaInst ( llvm::AllocaInst &  I)

Matula: Right now, we do the same thing as LLVM's interpreter – really allocate memory and keed track of it via ExecutionContext::allocas. Maybe this is not needed at all, or it would be better to solve it in a different way without memory allocation.

◆ visitAShr()

void retdec::llvmir_emul::LlvmIrEmulator::visitAShr ( llvm::BinaryOperator &  I)

◆ visitBinaryOperator()

void retdec::llvmir_emul::LlvmIrEmulator::visitBinaryOperator ( llvm::BinaryOperator &  I)

◆ visitBitCastInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitBitCastInst ( llvm::BitCastInst &  I)

◆ visitBranchInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitBranchInst ( llvm::BranchInst &  I)

◆ visitCallInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitCallInst ( llvm::CallInst &  I)

◆ visitExtractElementInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitExtractElementInst ( llvm::ExtractElementInst &  I)

This is not really getting the value. It just sets ExtractValueInst's result to uninitialized GenericValue.

◆ visitExtractValueInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitExtractValueInst ( llvm::ExtractValueInst &  I)

This is not really getting the value. It just sets ExtractValueInst's result to uninitialized GenericValue.

◆ visitFCmpInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitFCmpInst ( llvm::FCmpInst &  I)

◆ visitFPExtInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitFPExtInst ( llvm::FPExtInst &  I)

◆ visitFPToSIInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitFPToSIInst ( llvm::FPToSIInst &  I)

◆ visitFPToUIInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitFPToUIInst ( llvm::FPToUIInst &  I)

◆ visitFPTruncInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitFPTruncInst ( llvm::FPTruncInst &  I)

◆ visitGetElementPtrInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitGetElementPtrInst ( llvm::GetElementPtrInst &  I)

◆ visitICmpInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitICmpInst ( llvm::ICmpInst &  I)

◆ visitIndirectBrInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitIndirectBrInst ( llvm::IndirectBrInst &  I)

◆ visitInsertElementInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitInsertElementInst ( llvm::InsertElementInst &  I)

◆ visitInsertValueInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitInsertValueInst ( llvm::InsertValueInst &  I)

◆ visitInstruction()

void retdec::llvmir_emul::LlvmIrEmulator::visitInstruction ( llvm::Instruction &  I)

When visitor does not find visit method for a particular child class, it uses visit method for the parent class. This is a visit for the super parent class for all LLVM instructions. If visitor gets here, it means the current instruction is not handled – it should have its own specialized visit method, no instruction should be handled by this super visit method.

◆ visitIntToPtrInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitIntToPtrInst ( llvm::IntToPtrInst &  I)

◆ visitInvokeInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitInvokeInst ( llvm::InvokeInst &  I)

◆ visitLoadInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitLoadInst ( llvm::LoadInst &  I)

◆ visitLShr()

void retdec::llvmir_emul::LlvmIrEmulator::visitLShr ( llvm::BinaryOperator &  I)

◆ visitPHINode()

void retdec::llvmir_emul::LlvmIrEmulator::visitPHINode ( llvm::PHINode &  PN)

◆ visitPtrToIntInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitPtrToIntInst ( llvm::PtrToIntInst &  I)

◆ visitReturnInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitReturnInst ( llvm::ReturnInst &  I)

◆ visitSelectInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitSelectInst ( llvm::SelectInst &  I)

◆ visitSExtInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitSExtInst ( llvm::SExtInst &  I)

◆ visitShl()

void retdec::llvmir_emul::LlvmIrEmulator::visitShl ( llvm::BinaryOperator &  I)

◆ visitShuffleVectorInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitShuffleVectorInst ( llvm::ShuffleVectorInst &  I)

◆ visitSIToFPInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitSIToFPInst ( llvm::SIToFPInst &  I)

◆ visitStoreInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitStoreInst ( llvm::StoreInst &  I)

◆ visitSwitchInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitSwitchInst ( llvm::SwitchInst &  I)

◆ visitTruncInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitTruncInst ( llvm::TruncInst &  I)

◆ visitUIToFPInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitUIToFPInst ( llvm::UIToFPInst &  I)

◆ visitUnreachableInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitUnreachableInst ( llvm::UnreachableInst &  I)

◆ visitVAArgInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitVAArgInst ( llvm::VAArgInst &  I)

◆ visitZExtInst()

void retdec::llvmir_emul::LlvmIrEmulator::visitZExtInst ( llvm::ZExtInst &  I)

◆ wasBasicBlockVisited()

bool retdec::llvmir_emul::LlvmIrEmulator::wasBasicBlockVisited ( llvm::BasicBlock *  bb) const

◆ wasGlobalVariableLoaded()

bool retdec::llvmir_emul::LlvmIrEmulator::wasGlobalVariableLoaded ( llvm::GlobalVariable *  gv)

◆ wasGlobalVariableStored()

bool retdec::llvmir_emul::LlvmIrEmulator::wasGlobalVariableStored ( llvm::GlobalVariable *  gv)

◆ wasInstructionVisited()

bool retdec::llvmir_emul::LlvmIrEmulator::wasInstructionVisited ( llvm::Instruction *  i) const

◆ wasMemoryLoaded()

bool retdec::llvmir_emul::LlvmIrEmulator::wasMemoryLoaded ( uint64_t  addr)

◆ wasMemoryStored()

bool retdec::llvmir_emul::LlvmIrEmulator::wasMemoryStored ( uint64_t  addr)

◆ wasValueCalled()

bool retdec::llvmir_emul::LlvmIrEmulator::wasValueCalled ( llvm::Value *  v) const
Returns
True if value v is called at least once.

Member Data Documentation

◆ _calls

std::list<CallEntry> retdec::llvmir_emul::LlvmIrEmulator::_calls
private

Intrinsic calls are lowered and not logged here.

◆ _ecStack

std::vector<LocalExecutionContext> retdec::llvmir_emul::LlvmIrEmulator::_ecStack
private

◆ _ecStackRetired

std::vector<LocalExecutionContext> retdec::llvmir_emul::LlvmIrEmulator::_ecStackRetired

◆ _exitValue

llvm::GenericValue retdec::llvmir_emul::LlvmIrEmulator::_exitValue
private

◆ _globalEc

GlobalExecutionContext retdec::llvmir_emul::LlvmIrEmulator::_globalEc
private

◆ _module

llvm::Module* retdec::llvmir_emul::LlvmIrEmulator::_module = nullptr
private

◆ _visitedBbs

std::list<llvm::BasicBlock*> retdec::llvmir_emul::LlvmIrEmulator::_visitedBbs
private

All visited basic blocks in order of their visitation. No cycling checks are performed at the moment – one basic block might be visited multiple times.

◆ _visitedInsns

std::list<llvm::Instruction*> retdec::llvmir_emul::LlvmIrEmulator::_visitedInsns
private

All visited instruction in order of their visitation. No cycling checks are performed at the moment – one instruction might be visited multiple times.

◆ IL

llvm::IntrinsicLowering* retdec::llvmir_emul::LlvmIrEmulator::IL = nullptr
private

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