| //===------------------ 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 <cfloat> |
| #include <cmath> |
| #include <string> |
| |
| #include "types.h" |
| |
| #include "llvm/Target/TargetMachine.h" |
| |
| #include "mvm/MethodInfo.h" |
| #include "mvm/GC/GC.h" |
| |
| namespace llvm { |
| class Constant; |
| class ConstantFP; |
| class ConstantInt; |
| class ExecutionEngine; |
| class Function; |
| class FunctionPassManager; |
| class GCFunctionInfo; |
| class GCStrategy; |
| class Module; |
| class PointerType; |
| class TargetData; |
| class TargetMachine; |
| class Type; |
| } |
| |
| namespace mvm { |
| |
| class LockRecursive; |
| |
| 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; |
| |
| class BaseIntrinsics { |
| |
| public: |
| |
| explicit BaseIntrinsics(llvm::Module*); |
| |
| llvm::Function* exceptionEndCatch; |
| llvm::Function* exceptionBeginCatch; |
| llvm::Function* unwindResume; |
| llvm::Function* exceptionSelector; |
| llvm::Function* personality; |
| llvm::Function* llvmGetException; |
| |
| llvm::Function* printFloatLLVM; |
| llvm::Function* printDoubleLLVM; |
| llvm::Function* printLongLLVM; |
| llvm::Function* printIntLLVM; |
| llvm::Function* printObjectLLVM; |
| |
| llvm::Function* setjmpLLVM; |
| |
| llvm::Function* func_llvm_fabs_f32; |
| llvm::Function* func_llvm_fabs_f64; |
| llvm::Function* func_llvm_sqrt_f64; |
| llvm::Function* func_llvm_sin_f64; |
| llvm::Function* func_llvm_cos_f64; |
| llvm::Function* func_llvm_tan_f64; |
| llvm::Function* func_llvm_asin_f64; |
| llvm::Function* func_llvm_acos_f64; |
| llvm::Function* func_llvm_atan_f64; |
| llvm::Function* func_llvm_atan2_f64; |
| llvm::Function* func_llvm_exp_f64; |
| llvm::Function* func_llvm_log_f64; |
| llvm::Function* func_llvm_pow_f64; |
| llvm::Function* func_llvm_ceil_f64; |
| llvm::Function* func_llvm_floor_f64; |
| llvm::Function* func_llvm_rint_f64; |
| llvm::Function* func_llvm_cbrt_f64; |
| llvm::Function* func_llvm_cosh_f64; |
| llvm::Function* func_llvm_expm1_f64; |
| llvm::Function* func_llvm_hypot_f64; |
| llvm::Function* func_llvm_log10_f64; |
| llvm::Function* func_llvm_log1p_f64; |
| llvm::Function* func_llvm_sinh_f64; |
| llvm::Function* func_llvm_tanh_f64; |
| |
| llvm::Function* llvm_memcpy_i32; |
| llvm::Function* llvm_memset_i32; |
| llvm::Function* llvm_frameaddress; |
| llvm::Function* llvm_atomic_lcs_i8; |
| llvm::Function* llvm_atomic_lcs_i16; |
| llvm::Function* llvm_atomic_lcs_i32; |
| llvm::Function* llvm_atomic_lcs_i64; |
| llvm::Function* llvm_atomic_lcs_ptr; |
| llvm::Function* llvm_gc_gcroot; |
| |
| llvm::Function* conditionalSafePoint; |
| llvm::Function* unconditionalSafePoint; |
| llvm::Function* AllocateFunction; |
| llvm::Function* AllocateUnresolvedFunction; |
| llvm::Function* AddFinalizationCandidate; |
| |
| llvm::Constant* constantInt8Zero; |
| llvm::Constant* constantZero; |
| llvm::Constant* constantOne; |
| llvm::Constant* constantTwo; |
| llvm::Constant* constantThree; |
| llvm::Constant* constantFour; |
| llvm::Constant* constantFive; |
| llvm::Constant* constantSix; |
| llvm::Constant* constantSeven; |
| llvm::Constant* constantEight; |
| llvm::Constant* constantMinusOne; |
| llvm::Constant* constantLongMinusOne; |
| llvm::Constant* constantLongZero; |
| llvm::Constant* constantLongOne; |
| llvm::Constant* constantMinInt; |
| llvm::Constant* constantMaxInt; |
| llvm::Constant* constantMinLong; |
| llvm::Constant* constantMaxLong; |
| llvm::Constant* constantFloatZero; |
| llvm::Constant* constantFloatOne; |
| llvm::Constant* constantFloatTwo; |
| llvm::Constant* constantDoubleZero; |
| llvm::Constant* constantDoubleOne; |
| llvm::Constant* constantMaxIntFloat; |
| llvm::Constant* constantMinIntFloat; |
| llvm::Constant* constantMinLongFloat; |
| llvm::Constant* constantMinLongDouble; |
| llvm::Constant* constantMaxLongFloat; |
| llvm::Constant* constantMaxIntDouble; |
| llvm::Constant* constantMinIntDouble; |
| llvm::Constant* constantMaxLongDouble; |
| llvm::Constant* constantDoubleInfinity; |
| llvm::Constant* constantDoubleMinusInfinity; |
| llvm::Constant* constantFloatInfinity; |
| llvm::Constant* constantFloatMinusInfinity; |
| llvm::Constant* constantFloatMinusZero; |
| llvm::Constant* constantDoubleMinusZero; |
| llvm::Constant* constantPtrNull; |
| llvm::Constant* constantPtrLogSize; |
| llvm::Constant* constantThreadIDMask; |
| llvm::Constant* constantStackOverflowMask; |
| llvm::Constant* constantFatMask; |
| llvm::Constant* constantPtrOne; |
| llvm::Constant* constantPtrZero; |
| |
| const llvm::PointerType* ptrType; |
| const llvm::PointerType* ptr32Type; |
| const llvm::PointerType* ptrPtrType; |
| const llvm::Type* arrayPtrType; |
| const llvm::Type* pointerSizeType; |
| }; |
| |
| |
| class MvmModule { |
| public: |
| static llvm::ExecutionEngine* executionEngine; |
| static llvm::GCStrategy* TheGCStrategy; |
| static mvm::LockRecursive protectEngine; |
| static llvm::Module *globalModule; |
| static const llvm::TargetData* TheTargetData; |
| static mvm::BumpPtrAllocator* Allocator; |
| //static unsigned MetadataTypeKind; |
| |
| static uint64 getTypeSize(const llvm::Type* type); |
| static void runPasses(llvm::Function* func, llvm::FunctionPassManager*); |
| static void initialise(llvm::CodeGenOpt::Level = llvm::CodeGenOpt::Default, |
| llvm::Module* TheModule = 0, |
| llvm::TargetMachine* TheTarget = 0); |
| static void loadBytecodeFile(const std::string& str); |
| |
| static int disassemble(unsigned int* addr); |
| |
| static void protectIR(); |
| static void unprotectIR(); |
| |
| static void addCommandLinePasses(llvm::FunctionPassManager* PM); |
| |
| static const char* getHostTriple(); |
| }; |
| |
| class JITMethodInfo : public MethodInfo { |
| llvm::GCFunctionInfo* GCInfo; |
| public: |
| virtual void scan(void* TL, void* ip, void* addr); |
| JITMethodInfo(llvm::GCFunctionInfo* GFI) : GCInfo(GFI) {} |
| }; |
| |
| |
| } // end namespace mvm |
| |
| #endif // MVM_JIT_H |