LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions | Variables
Execution.cpp File Reference
#include "Interpreter.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/IntrinsicLowering.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <cmath>
Include dependency graph for Execution.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "interpreter"
 
#define IMPLEMENT_BINARY_OPERATOR(OP, TY)
 
#define IMPLEMENT_INTEGER_ICMP(OP, TY)
 
#define IMPLEMENT_VECTOR_INTEGER_ICMP(OP, TY)
 
#define IMPLEMENT_POINTER_ICMP(OP)
 
#define IMPLEMENT_FCMP(OP, TY)
 
#define IMPLEMENT_VECTOR_FCMP_T(OP, TY)
 
#define IMPLEMENT_VECTOR_FCMP(OP)
 
#define IMPLEMENT_SCALAR_NANS(TY, X, Y)
 
#define MASK_VECTOR_NANS_T(X, Y, TZ, FLAG)
 
#define MASK_VECTOR_NANS(TY, X, Y, FLAG)
 
#define IMPLEMENT_UNORDERED(TY, X, Y)
 
#define IMPLEMENT_VECTOR_UNORDERED(TY, X, Y, _FUNC)
 
#define INTEGER_VECTOR_OPERATION(OP)
 
#define INTEGER_VECTOR_FUNCTION(OP)
 
#define FLOAT_VECTOR_FUNCTION(OP, TY)
 
#define FLOAT_VECTOR_OP(OP)
 
#define IMPLEMENT_VAARG(TY)   case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break
 

Functions

 STATISTIC (NumDynamicInsts,"Number of dynamic instructions executed")
 
static void SetValue (Value *V, GenericValue Val, ExecutionContext &SF)
 
static void executeFAddInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
 
static void executeFSubInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
 
static void executeFMulInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
 
static void executeFDivInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
 
static void executeFRemInst (GenericValue &Dest, GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_EQ (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_NE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_ULT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_SLT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_UGT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_SGT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_ULE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_SLE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_UGE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeICMP_SGE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_OEQ (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_ONE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_OLE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_OGE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_OLT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_OGT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_UEQ (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_UNE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_ULE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_UGE (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_ULT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_UGT (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_ORD (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_UNO (GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeFCMP_BOOL (GenericValue Src1, GenericValue Src2, const Type *Ty, const bool val)
 
static GenericValue executeCmpInst (unsigned predicate, GenericValue Src1, GenericValue Src2, Type *Ty)
 
static GenericValue executeSelectInst (GenericValue Src1, GenericValue Src2, GenericValue Src3, const Type *Ty)
 
static unsigned getShiftAmount (uint64_t orgShiftAmount, llvm::APInt valueToShift)
 

Variables

static cl::opt< boolPrintVolatile ("interpreter-print-volatile", cl::Hidden, cl::desc("make the interpreter print every volatile load and store"))
 

Macro Definition Documentation

#define DEBUG_TYPE   "interpreter"

Definition at line 14 of file Execution.cpp.

#define FLOAT_VECTOR_FUNCTION (   OP,
  TY 
)
Value:
for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
R.AggregateVal[i].TY = \
Src1.AggregateVal[i].TY OP Src2.AggregateVal[i].TY;
#define OP(n)
Definition: regex2.h:67
#define FLOAT_VECTOR_OP (   OP)
Value:
{ \
if (dyn_cast<VectorType>(Ty)->getElementType()->isFloatTy()) \
else { \
if (dyn_cast<VectorType>(Ty)->getElementType()->isDoubleTy()) \
else { \
dbgs() << "Unhandled type for OP instruction: " << *Ty << "\n"; \
} \
} \
}
#define FLOAT_VECTOR_FUNCTION(OP, TY)
#define llvm_unreachable(msg)
* if(!EatIfPresent(lltok::kw_thread_local)) return false
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
Definition: Debug.cpp:101
#define OP(n)
Definition: regex2.h:67

Referenced by llvm::Interpreter::visitBinaryOperator().

#define IMPLEMENT_BINARY_OPERATOR (   OP,
  TY 
)
Value:
case Type::TY##TyID: \
Dest.TY##Val = Src1.TY##Val OP Src2.TY##Val; \
break
#define OP(n)
Definition: regex2.h:67

Definition at line 48 of file Execution.cpp.

Referenced by executeFAddInst(), executeFDivInst(), executeFMulInst(), and executeFSubInst().

#define IMPLEMENT_FCMP (   OP,
  TY 
)
Value:
case Type::TY##TyID: \
Dest.IntVal = APInt(1,Src1.TY##Val OP Src2.TY##Val); \
break
Class for arbitrary precision integers.
Definition: APInt.h:75
#define OP(n)
Definition: regex2.h:67

Definition at line 302 of file Execution.cpp.

Referenced by executeFCMP_OEQ(), executeFCMP_OGE(), executeFCMP_OGT(), executeFCMP_OLE(), executeFCMP_OLT(), and executeFCMP_ONE().

#define IMPLEMENT_INTEGER_ICMP (   OP,
  TY 
)
Value:
case Type::IntegerTyID: \
Dest.IntVal = APInt(1,Src1.IntVal.OP(Src2.IntVal)); \
break;
Class for arbitrary precision integers.
Definition: APInt.h:75

Definition at line 112 of file Execution.cpp.

Referenced by executeICMP_EQ(), executeICMP_NE(), executeICMP_SGE(), executeICMP_SGT(), executeICMP_SLE(), executeICMP_SLT(), executeICMP_UGE(), executeICMP_UGT(), executeICMP_ULE(), and executeICMP_ULT().

#define IMPLEMENT_POINTER_ICMP (   OP)
Value:
case Type::PointerTyID: \
Dest.IntVal = APInt(1,(void*)(intptr_t)Src1.PointerVal OP \
(void*)(intptr_t)Src2.PointerVal); \
break;
Class for arbitrary precision integers.
Definition: APInt.h:75
#define OP(n)
Definition: regex2.h:67

Definition at line 130 of file Execution.cpp.

Referenced by executeICMP_EQ(), executeICMP_NE(), executeICMP_SGE(), executeICMP_SGT(), executeICMP_SLE(), executeICMP_SLT(), executeICMP_UGE(), executeICMP_UGT(), executeICMP_ULE(), and executeICMP_ULT().

#define IMPLEMENT_SCALAR_NANS (   TY,
  X,
  Y 
)
Value:
if (TY->isFloatTy()) { \
if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
Dest.IntVal = APInt(1,false); \
return Dest; \
} \
} else { \
if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
Dest.IntVal = APInt(1,false); \
return Dest; \
} \
}
* if(!EatIfPresent(lltok::kw_thread_local)) return false
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
Class for arbitrary precision integers.
Definition: APInt.h:75
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")

Definition at line 337 of file Execution.cpp.

Referenced by executeFCMP_ONE().

#define IMPLEMENT_UNORDERED (   TY,
  X,
  Y 
)
Value:
if (TY->isFloatTy()) { \
if (X.FloatVal != X.FloatVal || Y.FloatVal != Y.FloatVal) { \
Dest.IntVal = APInt(1,true); \
return Dest; \
} \
} else if (X.DoubleVal != X.DoubleVal || Y.DoubleVal != Y.DoubleVal) { \
Dest.IntVal = APInt(1,true); \
return Dest; \
}
* if(!EatIfPresent(lltok::kw_thread_local)) return false
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
Class for arbitrary precision integers.
Definition: APInt.h:75
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")

Definition at line 455 of file Execution.cpp.

Referenced by executeFCMP_UEQ(), executeFCMP_UGE(), executeFCMP_UGT(), executeFCMP_ULE(), executeFCMP_ULT(), and executeFCMP_UNE().

#define IMPLEMENT_VAARG (   TY)    case Type::TY##TyID: Dest.TY##Val = Src.TY##Val; break

Definition at line 1713 of file Execution.cpp.

Referenced by llvm::Interpreter::visitVAArgInst().

#define IMPLEMENT_VECTOR_FCMP (   OP)
Value:
case Type::VectorTyID: \
if(dyn_cast<VectorType>(Ty)->getElementType()->isFloatTy()) { \
} else { \
}
#define IMPLEMENT_VECTOR_FCMP_T(OP, TY)
Definition: Execution.cpp:307
* if(!EatIfPresent(lltok::kw_thread_local)) return false
#define OP(n)
Definition: regex2.h:67

Definition at line 315 of file Execution.cpp.

Referenced by executeFCMP_OEQ(), executeFCMP_OGE(), executeFCMP_OGT(), executeFCMP_OLE(), executeFCMP_OLT(), and executeFCMP_ONE().

#define IMPLEMENT_VECTOR_FCMP_T (   OP,
  TY 
)
Value:
assert(Src1.AggregateVal.size() == Src2.AggregateVal.size()); \
Dest.AggregateVal.resize( Src1.AggregateVal.size() ); \
for( uint32_t _i=0;_i<Src1.AggregateVal.size();_i++) \
Dest.AggregateVal[_i].IntVal = APInt(1, \
Src1.AggregateVal[_i].TY##Val OP Src2.AggregateVal[_i].TY##Val);\
break;
for(unsigned i=0, e=MI->getNumOperands();i!=e;++i)
Class for arbitrary precision integers.
Definition: APInt.h:75
#define OP(n)
Definition: regex2.h:67

Definition at line 307 of file Execution.cpp.

#define IMPLEMENT_VECTOR_INTEGER_ICMP (   OP,
  TY 
)
Value:
case Type::VectorTyID: { \
assert(Src1.AggregateVal.size() == Src2.AggregateVal.size()); \
Dest.AggregateVal.resize( Src1.AggregateVal.size() ); \
for( uint32_t _i=0;_i<Src1.AggregateVal.size();_i++) \
Dest.AggregateVal[_i].IntVal = APInt(1, \
Src1.AggregateVal[_i].IntVal.OP(Src2.AggregateVal[_i].IntVal));\
} break;
for(unsigned i=0, e=MI->getNumOperands();i!=e;++i)
Class for arbitrary precision integers.
Definition: APInt.h:75

Definition at line 117 of file Execution.cpp.

Referenced by executeICMP_EQ(), executeICMP_NE(), executeICMP_SGE(), executeICMP_SGT(), executeICMP_SLE(), executeICMP_SLT(), executeICMP_UGE(), executeICMP_UGT(), executeICMP_ULE(), and executeICMP_ULT().

#define IMPLEMENT_VECTOR_UNORDERED (   TY,
  X,
  Y,
  _FUNC 
)
Value:
if (TY->isVectorTy()) { \
GenericValue DestMask = Dest; \
Dest = _FUNC(Src1, Src2, Ty); \
for( size_t _i=0; _i<Src1.AggregateVal.size(); _i++) \
if (DestMask.AggregateVal[_i].IntVal == true) \
Dest.AggregateVal[_i].IntVal = APInt(1,true); \
return Dest; \
}
for(unsigned i=0, e=MI->getNumOperands();i!=e;++i)
Class for arbitrary precision integers.
Definition: APInt.h:75

Definition at line 466 of file Execution.cpp.

Referenced by executeFCMP_UEQ(), executeFCMP_UGE(), executeFCMP_UGT(), executeFCMP_ULE(), executeFCMP_ULT(), and executeFCMP_UNE().

#define INTEGER_VECTOR_FUNCTION (   OP)
Value:
for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
R.AggregateVal[i].IntVal = \
Src1.AggregateVal[i].IntVal.OP(Src2.AggregateVal[i].IntVal);

Referenced by llvm::Interpreter::visitBinaryOperator().

#define INTEGER_VECTOR_OPERATION (   OP)
Value:
for (unsigned i = 0; i < R.AggregateVal.size(); ++i) \
R.AggregateVal[i].IntVal = \
Src1.AggregateVal[i].IntVal OP Src2.AggregateVal[i].IntVal;
#define OP(n)
Definition: regex2.h:67

Referenced by llvm::Interpreter::visitBinaryOperator().

#define MASK_VECTOR_NANS (   TY,
  X,
  Y,
  FLAG 
)
Value:
if (TY->isVectorTy()) { \
if (dyn_cast<VectorType>(TY)->getElementType()->isFloatTy()) { \
} else { \
MASK_VECTOR_NANS_T(X, Y, Double, FLAG) \
} \
} \
* if(!EatIfPresent(lltok::kw_thread_local)) return false
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")
#define MASK_VECTOR_NANS_T(X, Y, TZ, FLAG)
Definition: Execution.cpp:350

Definition at line 362 of file Execution.cpp.

Referenced by executeFCMP_ONE(), executeFCMP_UEQ(), executeFCMP_UGE(), executeFCMP_UGT(), executeFCMP_ULE(), executeFCMP_ULT(), and executeFCMP_UNE().

#define MASK_VECTOR_NANS_T (   X,
  Y,
  TZ,
  FLAG 
)
Value:
assert(X.AggregateVal.size() == Y.AggregateVal.size()); \
Dest.AggregateVal.resize( X.AggregateVal.size() ); \
for( uint32_t _i=0;_i<X.AggregateVal.size();_i++) { \
if (X.AggregateVal[_i].TZ##Val != X.AggregateVal[_i].TZ##Val || \
Y.AggregateVal[_i].TZ##Val != Y.AggregateVal[_i].TZ##Val) \
Dest.AggregateVal[_i].IntVal = APInt(1,FLAG); \
else { \
Dest.AggregateVal[_i].IntVal = APInt(1,!FLAG); \
} \
}
* if(!EatIfPresent(lltok::kw_thread_local)) return false
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
for(unsigned i=0, e=MI->getNumOperands();i!=e;++i)
Class for arbitrary precision integers.
Definition: APInt.h:75
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")

Definition at line 350 of file Execution.cpp.

Function Documentation

static GenericValue executeCmpInst ( unsigned  predicate,
GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static void executeFAddInst ( GenericValue Dest,
GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_BOOL ( GenericValue  Src1,
GenericValue  Src2,
const Type Ty,
const bool  val 
)
static
static GenericValue executeFCMP_OEQ ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_OGE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_OGT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_OLE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_OLT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_ONE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_ORD ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_UEQ ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_UGE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_UGT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_ULE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_ULT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_UNE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeFCMP_UNO ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static void executeFDivInst ( GenericValue Dest,
GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static void executeFMulInst ( GenericValue Dest,
GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static void executeFRemInst ( GenericValue Dest,
GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static void executeFSubInst ( GenericValue Dest,
GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_EQ ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_NE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_SGE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_SGT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_SLE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_SLT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_UGE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_UGT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_ULE ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeICMP_ULT ( GenericValue  Src1,
GenericValue  Src2,
Type Ty 
)
static
static GenericValue executeSelectInst ( GenericValue  Src1,
GenericValue  Src2,
GenericValue  Src3,
const Type Ty 
)
static
static unsigned getShiftAmount ( uint64_t  orgShiftAmount,
llvm::APInt  valueToShift 
)
static
static void SetValue ( Value V,
GenericValue  Val,
ExecutionContext SF 
)
static
STATISTIC ( NumDynamicInsts  ,
"Number of dynamic instructions executed"   
)

Variable Documentation

cl::opt<bool> PrintVolatile("interpreter-print-volatile", cl::Hidden, cl::desc("make the interpreter print every volatile load and store"))
static