| //===------------- J3Intrinsics.cpp - Intrinsics for J3 -------------------===// |
| // |
| // The VMKit project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/IR/Constants.h" |
| #include "llvm/IR/DerivedTypes.h" |
| #include "llvm/IR/LLVMContext.h" |
| #include "llvm/IR/Module.h" |
| |
| #include "vmkit/JIT.h" |
| |
| #include "JavaAccess.h" |
| #include "JavaArray.h" |
| #include "JavaClass.h" |
| #include "JavaTypes.h" |
| |
| #include "j3/J3Intrinsics.h" |
| #include "j3/LLVMInfo.h" |
| |
| using namespace j3; |
| using namespace llvm; |
| |
| namespace j3 { |
| namespace llvm_runtime { |
| #include "LLVMRuntime.inc" |
| } |
| } |
| |
| void J3Intrinsics::init(llvm::Module* module) { |
| BaseIntrinsics::init(module); |
| |
| // Overloading allocation function to use VTgcmalloc |
| VTAllocateUnresolvedFunction = module->getFunction("VTgcmallocUnresolved"); |
| assert(VTAllocateUnresolvedFunction && "No allocateUnresolved function"); |
| VTAllocateFunction = module->getFunction("VTgcmalloc"); |
| |
| j3::llvm_runtime::makeLLVMModuleContents(module); |
| |
| LLVMContext& Context = module->getContext(); |
| VTType = PointerType::getUnqual(ArrayType::get( |
| PointerType::getUnqual(FunctionType::get(Type::getInt32Ty(Context), true)), 0)); |
| |
| ResolvedConstantPoolType = ptrPtrType; |
| |
| |
| ObjectHeaderType = PointerType::getUnqual(module->getPointerSize() == Module::Pointer32 ? |
| Type::getInt32Ty(Context) : Type::getInt64Ty(Context)); |
| |
| JavaObjectType = |
| PointerType::getUnqual(module->getTypeByName("JavaObject")); |
| |
| JavaArrayType = |
| PointerType::getUnqual(module->getTypeByName("JavaArray")); |
| |
| JavaCommonClassType = |
| PointerType::getUnqual(module->getTypeByName("JavaCommonClass")); |
| JavaClassPrimitiveType = |
| PointerType::getUnqual(module->getTypeByName("JavaClassPrimitive")); |
| JavaClassArrayType = |
| PointerType::getUnqual(module->getTypeByName("JavaClassArray")); |
| JavaClassType = |
| PointerType::getUnqual(module->getTypeByName("JavaClass")); |
| ClassBytesType = |
| PointerType::getUnqual(module->getTypeByName("ClassBytes")); |
| JavaConstantPoolType = |
| PointerType::getUnqual(module->getTypeByName("JavaConstantPool")); |
| |
| JavaArrayUInt8Type = |
| PointerType::getUnqual(module->getTypeByName("ArrayUInt8")); |
| JavaArraySInt8Type = |
| PointerType::getUnqual(module->getTypeByName("ArraySInt8")); |
| JavaArrayUInt16Type = |
| PointerType::getUnqual(module->getTypeByName("ArrayUInt16")); |
| JavaArraySInt16Type = |
| PointerType::getUnqual(module->getTypeByName("ArraySInt16")); |
| JavaArrayUInt32Type = |
| PointerType::getUnqual(module->getTypeByName("ArrayUInt32")); |
| JavaArraySInt32Type = |
| PointerType::getUnqual(module->getTypeByName("ArraySInt32")); |
| JavaArrayLongType = |
| PointerType::getUnqual(module->getTypeByName("ArrayLong")); |
| JavaArrayFloatType = |
| PointerType::getUnqual(module->getTypeByName("ArrayFloat")); |
| JavaArrayDoubleType = |
| PointerType::getUnqual(module->getTypeByName("ArrayDouble")); |
| JavaArrayObjectType = |
| PointerType::getUnqual(module->getTypeByName("ArrayObject")); |
| |
| JavaFieldType = |
| PointerType::getUnqual(module->getTypeByName("JavaField")); |
| JavaMethodType = |
| PointerType::getUnqual(module->getTypeByName("JavaMethod")); |
| UTF8Type = |
| PointerType::getUnqual(module->getTypeByName("UTF8")); |
| AttributeType = |
| PointerType::getUnqual(module->getTypeByName("Attribute")); |
| JavaThreadType = |
| PointerType::getUnqual(module->getTypeByName("JavaThread")); |
| MutatorThreadType = |
| PointerType::getUnqual(module->getTypeByName("MutatorThread")); |
| |
| J3DenseMapType = |
| PointerType::getUnqual(module->getTypeByName("J3DenseMap")); |
| |
| |
| JavaObjectNullConstant = |
| Constant::getNullValue(J3Intrinsics::JavaObjectType); |
| MaxArraySizeConstant = ConstantInt::get(Type::getInt32Ty(Context), |
| JavaArray::MaxArraySize); |
| JavaArraySizeConstant = ConstantInt::get(Type::getInt32Ty(Context), |
| sizeof(JavaObject) + sizeof(ssize_t)); |
| |
| |
| |
| JavaArrayElementsOffsetConstant = constantTwo; |
| JavaArraySizeOffsetConstant = constantOne; |
| |
| // JavaObjectLockOffsetConstant = constantOne; |
| HeaderObjectLockOffsetConstant = constantZero; |
| |
| JavaObjectVTOffsetConstant = constantZero; |
| |
| |
| OffsetClassInVTConstant = |
| ConstantInt::get(Type::getInt32Ty(Context), |
| JavaVirtualTable::getClassIndex()); |
| OffsetDepthInVTConstant = |
| ConstantInt::get(Type::getInt32Ty(Context), |
| JavaVirtualTable::getDepthIndex()); |
| OffsetDisplayInVTConstant = |
| ConstantInt::get(Type::getInt32Ty(Context), |
| JavaVirtualTable::getDisplayIndex()); |
| OffsetBaseClassVTInVTConstant = |
| ConstantInt::get(Type::getInt32Ty(Context), |
| JavaVirtualTable::getBaseClassIndex()); |
| OffsetIMTInVTConstant = |
| ConstantInt::get(Type::getInt32Ty(Context), |
| JavaVirtualTable::getIMTIndex()); |
| |
| OffsetAccessInCommonClassConstant = constantOne; |
| IsArrayConstant = ConstantInt::get(Type::getInt16Ty(Context), |
| JNJVM_ARRAY); |
| |
| IsPrimitiveConstant = ConstantInt::get(Type::getInt16Ty(Context), |
| JNJVM_PRIMITIVE); |
| |
| OffsetBaseClassInArrayClassConstant = constantOne; |
| OffsetLogSizeInPrimitiveClassConstant = constantOne; |
| |
| OffsetObjectSizeInClassConstant = constantOne; |
| OffsetVTInClassConstant = ConstantInt::get(Type::getInt32Ty(Context), 7); |
| OffsetTaskClassMirrorInClassConstant = constantThree; |
| OffsetStaticInstanceInTaskClassMirrorConstant = constantTwo; |
| OffsetStatusInTaskClassMirrorConstant = constantZero; |
| OffsetInitializedInTaskClassMirrorConstant = constantOne; |
| |
| OffsetIsolateIDInThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 1); |
| OffsetVMInThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 2); |
| OffsetDoYieldInThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 4); |
| OffsetThreadInMutatorThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 0); |
| OffsetJNIInJavaThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 1); |
| OffsetJavaExceptionInJavaThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 2); |
| |
| ClassReadyConstant = ConstantInt::get(Type::getInt8Ty(Context), ready); |
| |
| InterfaceLookupFunction = module->getFunction("j3InterfaceLookup"); |
| MultiCallNewFunction = module->getFunction("j3MultiCallNew"); |
| ForceLoadedCheckFunction = module->getFunction("forceLoadedCheck"); |
| InitialisationCheckFunction = module->getFunction("initialisationCheck"); |
| ForceInitialisationCheckFunction = |
| module->getFunction("forceInitialisationCheck"); |
| InitialiseClassFunction = module->getFunction("j3RuntimeInitialiseClass"); |
| |
| GetConstantPoolAtFunction = module->getFunction("getConstantPoolAt"); |
| ArrayLengthFunction = module->getFunction("arrayLength"); |
| GetVTFunction = module->getFunction("getVT"); |
| GetIMTFunction = module->getFunction("getIMT"); |
| GetClassFunction = module->getFunction("getClass"); |
| ClassLookupFunction = module->getFunction("j3ClassLookup"); |
| GetVTFromClassFunction = module->getFunction("getVTFromClass"); |
| GetVTFromClassArrayFunction = module->getFunction("getVTFromClassArray"); |
| GetVTFromCommonClassFunction = module->getFunction("getVTFromCommonClass"); |
| GetBaseClassVTFromVTFunction = module->getFunction("getBaseClassVTFromVT"); |
| GetObjectSizeFromClassFunction = |
| module->getFunction("getObjectSizeFromClass"); |
| |
| GetClassDelegateeFunction = module->getFunction("getClassDelegatee"); |
| RuntimeDelegateeFunction = module->getFunction("j3RuntimeDelegatee"); |
| IsSubclassOfFunction = module->getFunction("isSubclassOf"); |
| IsSubclassOfFunctionInner = module->getFunction("isSubclassOf_Inner"); |
| CheckIfAssignable = module->getFunction("checkIfObjectIsAssignableToArrayPosition"); |
| IsSecondaryClassFunction = module->getFunction("isSecondaryClass"); |
| IsSecondaryClassFunctionInner = module->getFunction("isSecondaryClass_Inner"); |
| GetDepthFunction = module->getFunction("getDepth"); |
| GetStaticInstanceFunction = module->getFunction("getStaticInstance"); |
| GetDisplayFunction = module->getFunction("getDisplay"); |
| GetVTInDisplayFunction = module->getFunction("getVTInDisplay"); |
| AquireObjectFunction = module->getFunction("j3JavaObjectAquire"); |
| ReleaseObjectFunction = module->getFunction("j3JavaObjectRelease"); |
| |
| VirtualFieldLookupFunction = module->getFunction("j3VirtualFieldLookup"); |
| StaticFieldLookupFunction = module->getFunction("j3StaticFieldLookup"); |
| StringLookupFunction = module->getFunction("j3StringLookup"); |
| StartJNIFunction = module->getFunction("j3StartJNI"); |
| EndJNIFunction = module->getFunction("j3EndJNI"); |
| |
| ResolveVirtualStubFunction = module->getFunction("j3ResolveVirtualStub"); |
| ResolveStaticStubFunction = module->getFunction("j3ResolveStaticStub"); |
| ResolveSpecialStubFunction = module->getFunction("j3ResolveSpecialStub"); |
| ResolveInterfaceFunction = module->getFunction("j3ResolveInterface"); |
| |
| NullPointerExceptionFunction = |
| module->getFunction("j3NullPointerException"); |
| ClassCastExceptionFunction = module->getFunction("j3ClassCastException"); |
| IndexOutOfBoundsExceptionFunction = |
| module->getFunction("j3IndexOutOfBoundsException"); |
| NegativeArraySizeExceptionFunction = |
| module->getFunction("j3NegativeArraySizeException"); |
| OutOfMemoryErrorFunction = module->getFunction("j3OutOfMemoryError"); |
| StackOverflowErrorFunction = module->getFunction("j3StackOverflowError"); |
| ArrayStoreExceptionFunction = module->getFunction("j3ArrayStoreException"); |
| ArithmeticExceptionFunction = module->getFunction("j3ArithmeticException"); |
| |
| PrintExecutionFunction = module->getFunction("j3PrintExecution"); |
| PrintMethodStartFunction = module->getFunction("j3PrintMethodStart"); |
| PrintMethodEndFunction = module->getFunction("j3PrintMethodEnd"); |
| |
| ThrowExceptionFunction = module->getFunction("j3ThrowException"); |
| |
| GetArrayClassFunction = module->getFunction("j3GetArrayClass"); |
| |
| GetFinalInt8FieldFunction = module->getFunction("getFinalInt8Field"); |
| GetFinalInt16FieldFunction = module->getFunction("getFinalInt16Field"); |
| GetFinalInt32FieldFunction = module->getFunction("getFinalInt32Field"); |
| GetFinalLongFieldFunction = module->getFunction("getFinalLongField"); |
| GetFinalFloatFieldFunction = module->getFunction("getFinalFloatField"); |
| GetFinalDoubleFieldFunction = module->getFunction("getFinalDoubleField"); |
| |
| VirtualLookupFunction = module->getFunction("j3VirtualTableLookup"); |
| |
| GetLockFunction = module->getFunction("getLock"); |
| ThrowExceptionFromJITFunction = |
| module->getFunction("j3ThrowExceptionFromJIT"); |
| } |
| |