blob: 049d664f9155fa5a570e610fbdafcd6820d0f094 [file] [log] [blame]
//===------------------ JIT.h - JIT facilities ----------------------------===//
//
// The Micro Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MVM_JIT_H
#define MVM_JIT_H
#include <float.h>
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Function.h"
#include "llvm/Module.h"
#include "llvm/ModuleProvider.h"
#include "llvm/PassManager.h"
#include "llvm/Type.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/Target/TargetData.h"
#include "types.h"
#include "mvm/Threads/Locks.h"
namespace mvm {
namespace jit {
const double MaxDouble = +INFINITY; //1.0 / 0.0;
const double MinDouble = -INFINITY;//-1.0 / 0.0;
const double MaxLongDouble = 9223372036854775807.0;
const double MinLongDouble = -9223372036854775808.0;
const double MaxIntDouble = 2147483647.0;
const double MinIntDouble = -2147483648.0;
const uint64 MaxLong = 9223372036854775807LL;
const uint64 MinLong = -9223372036854775808ULL;
const uint32 MaxInt = 2147483647;
const uint32 MinInt = -2147483648U;
const float MaxFloat = +INFINITY; //(float)(((float)1.0) / (float)0.0);
const float MinFloat = -INFINITY; //(float)(((float)-1.0) / (float)0.0);
const float MaxLongFloat = (float)9223372036854775807.0;
const float MinLongFloat = (float)-9223372036854775808.0;
const float MaxIntFloat = (float)2147483647.0;
const float MinIntFloat = (float)-2147483648.0;
const float NaNFloat = NAN; //(float)(((float)0.0) / (float)0.0);
const double NaNDouble = NAN; //0.0 / 0.0;
extern llvm::Function* exceptionEndCatch;
extern llvm::Function* exceptionBeginCatch;
extern llvm::Function* unwindResume;
extern llvm::Function* exceptionSelector;
extern llvm::Function* personality;
extern llvm::Function* llvmGetException;
extern llvm::Function* printFloatLLVM;
extern llvm::Function* printDoubleLLVM;
extern llvm::Function* printLongLLVM;
extern llvm::Function* printIntLLVM;
extern llvm::Function* printObjectLLVM;
extern llvm::Function* setjmpLLVM;
extern llvm::Function* func_llvm_fabs_f32;
extern llvm::Function* func_llvm_fabs_f64;
extern llvm::Function* func_llvm_sqrt_f64;
extern llvm::Function* func_llvm_sin_f64;
extern llvm::Function* func_llvm_cos_f64;
extern llvm::Function* func_llvm_tan_f64;
extern llvm::Function* func_llvm_asin_f64;
extern llvm::Function* func_llvm_acos_f64;
extern llvm::Function* func_llvm_atan_f64;
extern llvm::Function* func_llvm_atan2_f64;
extern llvm::Function* func_llvm_exp_f64;
extern llvm::Function* func_llvm_log_f64;
extern llvm::Function* func_llvm_pow_f64;
extern llvm::Function* func_llvm_ceil_f64;
extern llvm::Function* func_llvm_floor_f64;
extern llvm::Function* func_llvm_rint_f64;
extern llvm::Function* func_llvm_cbrt_f64;
extern llvm::Function* func_llvm_cosh_f64;
extern llvm::Function* func_llvm_expm1_f64;
extern llvm::Function* func_llvm_hypot_f64;
extern llvm::Function* func_llvm_log10_f64;
extern llvm::Function* func_llvm_log1p_f64;
extern llvm::Function* func_llvm_sinh_f64;
extern llvm::Function* func_llvm_tanh_f64;
extern llvm::Function* llvm_memcpy_i32;
extern llvm::Function* llvm_memset_i32;
extern llvm::ExecutionEngine* executionEngine;
extern uint64 getTypeSize(const llvm::Type* type);
extern void AddStandardCompilePasses(llvm::FunctionPassManager*);
extern void runPasses(llvm::Function* func, llvm::FunctionPassManager*);
extern void* runCompilation(llvm::Function*);
//extern mvm::Lock* protectTypes;
//extern mvm::Lock* protectConstants;
extern mvm::Lock* protectEngine;
extern llvm::ConstantInt* constantInt8Zero;
extern llvm::ConstantInt* constantZero;
extern llvm::ConstantInt* constantOne;
extern llvm::ConstantInt* constantTwo;
extern llvm::ConstantInt* constantThree;
extern llvm::ConstantInt* constantFour;
extern llvm::ConstantInt* constantFive;
extern llvm::ConstantInt* constantSix;
extern llvm::ConstantInt* constantSeven;
extern llvm::ConstantInt* constantEight;
extern llvm::ConstantInt* constantMinusOne;
extern llvm::ConstantInt* constantLongMinusOne;
extern llvm::ConstantInt* constantLongZero;
extern llvm::ConstantInt* constantLongOne;
extern llvm::ConstantInt* constantMinInt;
extern llvm::ConstantInt* constantMaxInt;
extern llvm::ConstantInt* constantMinLong;
extern llvm::ConstantInt* constantMaxLong;
extern llvm::ConstantFP* constantFloatZero;
extern llvm::ConstantFP* constantFloatOne;
extern llvm::ConstantFP* constantFloatTwo;
extern llvm::ConstantFP* constantDoubleZero;
extern llvm::ConstantFP* constantDoubleOne;
extern llvm::ConstantFP* constantMaxIntFloat;
extern llvm::ConstantFP* constantMinIntFloat;
extern llvm::ConstantFP* constantMinLongFloat;
extern llvm::ConstantFP* constantMinLongDouble;
extern llvm::ConstantFP* constantMaxLongFloat;
extern llvm::ConstantFP* constantMaxIntDouble;
extern llvm::ConstantFP* constantMinIntDouble;
extern llvm::ConstantFP* constantMaxLongDouble;
extern llvm::ConstantFP* constantDoubleInfinity;
extern llvm::ConstantFP* constantDoubleMinusInfinity;
extern llvm::ConstantFP* constantFloatInfinity;
extern llvm::ConstantFP* constantFloatMinusInfinity;
extern llvm::ConstantFP* constantFloatMinusZero;
extern llvm::ConstantFP* constantDoubleMinusZero;
extern llvm::Constant* constantPtrNull;
extern const llvm::PointerType* ptrType;
extern const llvm::Type* arrayPtrType;
extern llvm::Module *globalModule;
extern llvm::ExistingModuleProvider *globalModuleProvider;
extern llvm::JITMemoryManager *memoryManager;
extern void protectTypes();
extern void unprotectTypes();
extern void protectConstants();
extern void unprotectConstants();
extern int disassemble(unsigned int* addr);
} // end namespace jit
} // end namespace mvm
#endif // MVM_JIT_H