#ifndef RUNTIME_H
#define RUNTIME_H
#include <llvm/IR/InstrTypes.h>
#include <llvm/IR/Module.h>
#if LLVM_VERSION_MAJOR >= 9 && LLVM_VERSION_MAJOR < 11
using SymFnT = llvm::Value *;
#else
using SymFnT = llvm::FunctionCallee;
#endif
struct Runtime {
Runtime(llvm::Module &M);
SymFnT buildInteger{};
SymFnT buildInteger128{};
SymFnT buildFloat{};
SymFnT buildNullPointer{};
SymFnT buildTrue{};
SymFnT buildFalse{};
SymFnT buildBool{};
SymFnT buildSExt{};
SymFnT buildZExt{};
SymFnT buildTrunc{};
SymFnT buildBswap{};
SymFnT buildIntToFloat{};
SymFnT buildFloatToFloat{};
SymFnT buildBitsToFloat{};
SymFnT buildFloatToBits{};
SymFnT buildFloatToSignedInt{};
SymFnT buildFloatToUnsignedInt{};
SymFnT buildFloatAbs{};
SymFnT buildBoolAnd{};
SymFnT buildBoolOr{};
SymFnT buildBoolXor{};
SymFnT buildBoolToBits{};
SymFnT pushPathConstraint{};
SymFnT getParameterExpression{};
SymFnT setParameterExpression{};
SymFnT setReturnExpression{};
SymFnT getReturnExpression{};
SymFnT memcpy{};
SymFnT memset{};
SymFnT memmove{};
SymFnT readMemory{};
SymFnT writeMemory{};
SymFnT buildInsert{};
SymFnT buildExtract{};
SymFnT notifyCall{};
SymFnT notifyRet{};
SymFnT notifyBasicBlock{};
std::array<SymFnT, llvm::CmpInst::BAD_ICMP_PREDICATE>
comparisonHandlers{};
std::array<SymFnT, llvm::Instruction::BinaryOpsEnd>
binaryOperatorHandlers{};
};
bool isInterceptedFunction(const llvm::Function &f);
#endif