Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 91482 invoked from network); 3 Apr 2007 09:31:11 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 3 Apr 2007 09:31:11 -0000 Received: (qmail 17991 invoked by uid 500); 3 Apr 2007 09:31:17 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 17879 invoked by uid 500); 3 Apr 2007 09:31:17 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 17835 invoked by uid 99); 3 Apr 2007 09:31:16 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 03 Apr 2007 02:31:15 -0700 X-ASF-Spam-Status: No, hits=-99.5 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 03 Apr 2007 02:31:00 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id 3330D1A984A; Tue, 3 Apr 2007 02:30:40 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r525110 [4/4] - in /harmony/enhanced/drlvm/trunk/vm: include/ include/open/ jitrino/src/codegenerator/ jitrino/src/codegenerator/ia32/ jitrino/src/codegenerator/ipf/ jitrino/src/codegenerator/ipf/include/ jitrino/src/dynopt/ jitrino/src/jet... Date: Tue, 03 Apr 2007 09:30:36 -0000 To: commits@harmony.apache.org From: varlax@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070403093040.3330D1A984A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp?view=diff&rev=525110&r1=525109&r2=525110 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp Tue Apr 3 02:30:33 2007 @@ -25,36 +25,25 @@ #include #include -#include "DrlVMInterface.h" +#include "open/hythread_ext.h" + +#include "Type.h" +#include "VMInterface.h" #include "CompilationContext.h" #include "Log.h" #include "JITInstanceContext.h" -#include "jit_intf.h" -#include "open/hythread_ext.h" +#include "PlatformDependant.h" +#include "mkernel.h" +/** +* @brief A lock used to protect method's data in multi-threaded compilation. +*/ +Jitrino::Mutex g_compileLock; namespace Jitrino { -Mutex g_compileLock; -////////////////////////////////////////////////////////////////////////////// -// Utilities -////////////////////////////////////////////////////////////////////////////// -Boolean mtd_vars_is_managed_pointer(Method_Handle mh, unsigned idx) -{ - return false; -}; - -Boolean mtd_ret_type_is_managed_pointer(Method_Signature_Handle msh) -{ - return false; -}; - -Boolean mtd_args_is_managed_pointer(Method_Signature_Handle msh, unsigned idx) -{ - return false; -}; // The JIT info block is laid out as: // header @@ -77,15 +66,20 @@ return (size - sizeof(void *)); // skip the header } -// TODO: move both methods below to the base VMInterface level +void* +VMInterface::getTypeHandleFromVTable(void* vtHandle){ + return vtable_get_class((VTable_Handle)vtHandle); +} + + // TODO: free TLS key on JIT deinitilization uint32 -flagTLSSuspendRequestOffset(){ +VMInterface::flagTLSSuspendRequestOffset(){ return hythread_tls_get_request_offset(); } uint32 -flagTLSThreadStateOffset() { +VMInterface::flagTLSThreadStateOffset() { static hythread_tls_key_t key = 0; static size_t offset = 0; if (key == 0) { @@ -97,13 +91,13 @@ } ////////////////////////////////////////////////////////////////////////////// -///////////////////////// DrlVMTypeManager ///////////////////////////////////// +///////////////////////// VMTypeManager ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // // VM specific type manager // void* -DrlVMTypeManager::getBuiltinValueTypeVMTypeHandle(Type::Tag type) { +TypeManager::getBuiltinValueTypeVMTypeHandle(Type::Tag type) { switch (type) { case Type::Void: return class_get_class_of_primitive_type(VM_DATA_TYPE_VOID); case Type::Boolean: return class_get_class_of_primitive_type(VM_DATA_TYPE_BOOLEAN); @@ -127,144 +121,96 @@ return NULL; } +void +VMInterface::rewriteCodeBlock(Byte* codeBlock, Byte* newCode, size_t size) { + vm_patch_code_block(codeBlock, newCode, size); +} + void* -DrlVMTypeManager::getSystemObjectVMTypeHandle() { +VMInterface::getSystemObjectVMTypeHandle() { return get_system_object_class(); } void* -DrlVMTypeManager::getSystemClassVMTypeHandle() { +VMInterface::getSystemClassVMTypeHandle() { return get_system_class_class(); } void* -DrlVMTypeManager::getSystemStringVMTypeHandle() { +VMInterface::getSystemStringVMTypeHandle() { return get_system_string_class(); } void* -DrlVMTypeManager::getArrayVMTypeHandle(void* elemVMTypeHandle,bool isUnboxed) { +VMInterface::getArrayVMTypeHandle(void* elemVMTypeHandle,bool isUnboxed) { if (isUnboxed) return class_get_array_of_unboxed((Class_Handle) elemVMTypeHandle); return class_get_array_of_class((Class_Handle) elemVMTypeHandle); } const char* -DrlVMTypeManager::getTypeNameQualifier(void* vmTypeHandle) { +VMInterface::getTypeNameQualifier(void* vmTypeHandle) { return class_get_package_name((Class_Handle) vmTypeHandle); } void* -DrlVMTypeManager::getArrayElemVMTypeHandle(void* vmTypeHandle) { +VMInterface::getArrayElemVMTypeHandle(void* vmTypeHandle) { return class_get_array_element_class((Class_Handle) vmTypeHandle); } -const char* DrlVMTypeManager::getTypeName(void* vmTypeHandle) { +const char* VMInterface::getTypeName(void* vmTypeHandle) { return class_get_name((Class_Handle) vmTypeHandle); } bool -DrlVMTypeManager::isArrayOfPrimitiveElements(void* vmClassHandle) { +VMInterface::isArrayOfPrimitiveElements(void* vmClassHandle) { return type_info_is_primitive(class_get_element_type_info((Class_Handle) vmClassHandle))?true:false; } bool -DrlVMTypeManager::isEnumType(void* vmTypeHandle) { - return false; +VMInterface::isEnumType(void* vmTypeHandle) { + return class_is_enum((Class_Handle) vmTypeHandle); } bool -DrlVMTypeManager::isValueType(void* vmTypeHandle) { +VMInterface::isValueType(void* vmTypeHandle) { return class_is_primitive((Class_Handle) vmTypeHandle); } bool -DrlVMTypeManager::isLikelyExceptionType(void* vmTypeHandle) { +VMInterface::isLikelyExceptionType(void* vmTypeHandle) { return class_hint_is_exceptiontype((Class_Handle) vmTypeHandle)?true:false; } bool -DrlVMTypeManager::isVariableSizeType(void* vmTypeHandle) { - return isArrayType(vmTypeHandle); -} - -const char* -DrlVMTypeManager::getMethodName(MethodDesc* methodDesc) { - return methodDesc->getName(); -} - - -bool -DrlVMTypeManager::isSystemStringType(void* vmTypeHandle) { - // We should also be looking at namespace - if (vmTypeHandle == systemStringVMTypeHandle) - return true; - const char* name = getTypeName(vmTypeHandle); - if (systemStringVMTypeHandle == NULL && strcmp(name,"String") == 0) { - // Built-in System.String type - systemStringVMTypeHandle = vmTypeHandle; - return true; - } - return false; -} - -bool -DrlVMTypeManager::isSystemObjectType(void* vmTypeHandle) { - // We should also be looking at namespace - if (vmTypeHandle == systemObjectVMTypeHandle) - return true; - const char* name = getTypeName(vmTypeHandle); - if (systemObjectVMTypeHandle == NULL && strcmp(name,"Object") == 0) { - // Built-in System.Object type - systemObjectVMTypeHandle = vmTypeHandle; - return true; - } - return false; -} - -bool -DrlVMTypeManager::isSystemClassType(void* vmTypeHandle) { - // We should also be looking at namespace - if (vmTypeHandle == systemClassVMTypeHandle) - return true; - const char* name = getTypeName(vmTypeHandle); - if (systemClassVMTypeHandle == NULL && strcmp(name,"Class") == 0) { - // Built-in System.Class type - systemClassVMTypeHandle = vmTypeHandle; - return true; - } - return false; -} - -bool -DrlVMTypeManager::isBeforeFieldInit(void* vmTypeHandle) { +VMInterface::isBeforeFieldInit(void* vmTypeHandle) { return class_is_before_field_init((Class_Handle) vmTypeHandle)?true:false; } bool -DrlVMTypeManager::getClassFastInstanceOfFlag(void* vmTypeHandle) { +VMInterface::getClassFastInstanceOfFlag(void* vmTypeHandle) { return class_get_fast_instanceof_flag((Class_Handle) vmTypeHandle)?true:false; } int -DrlVMTypeManager::getClassDepth(void* vmTypeHandle) { +VMInterface::getClassDepth(void* vmTypeHandle) { return class_get_depth((Class_Handle) vmTypeHandle); } uint32 -DrlVMTypeManager::getArrayLengthOffset() { +VMInterface::getArrayLengthOffset() { return vector_length_offset(); } uint32 -DrlVMTypeManager::getArrayElemOffset(void* vmElemTypeHandle,bool isUnboxed) { +VMInterface::getArrayElemOffset(void* vmElemTypeHandle,bool isUnboxed) { if (isUnboxed) return vector_first_element_offset_unboxed((Class_Handle) vmElemTypeHandle); return vector_first_element_offset_class_handle((Class_Handle) vmElemTypeHandle); } bool -DrlVMTypeManager::isSubClassOf(void* vmTypeHandle1,void* vmTypeHandle2) { +VMInterface::isSubClassOf(void* vmTypeHandle1,void* vmTypeHandle2) { if (vmTypeHandle1 == (void*)(POINTER_SIZE_INT)0xdeadbeef || vmTypeHandle2 == (void*)(POINTER_SIZE_INT)0xdeadbeef ) { return false; @@ -273,262 +219,233 @@ } uint32 -DrlVMTypeManager::getUnboxedOffset(void* vmTypeHandle) { - assert(false); return 0; -} - -uint32 -DrlVMTypeManager::getBoxedSize(void * vmTypeHandle) { +VMInterface::getObjectSize(void * vmTypeHandle) { return class_get_boxed_data_size((Class_Handle) vmTypeHandle); } -uint32 -DrlVMTypeManager::getUnboxedSize(void* vmTypeHandle) { - assert(false); return 0; +void* VMInterface::getSuperTypeVMTypeHandle(void* vmTypeHandle) { + return class_get_super_class((Class_Handle)vmTypeHandle); } - -uint32 -DrlVMTypeManager::getUnboxedAlignment(void* vmTypeHandle) { - return class_get_alignment((Class_Handle) vmTypeHandle); +bool VMInterface::isArrayType(void* vmTypeHandle) { + return class_is_array((Class_Handle)vmTypeHandle)?true:false; } - -uint32 -DrlVMTypeManager::getUnboxedNumFields(void* vmTypeHandle) { - assert(0); - return 0; -} - -FieldDesc* -DrlVMTypeManager::getUnboxedFieldDesc(void* vmTypeHandle,uint32 index) { - assert(0); - return NULL; +bool VMInterface::isFinalType(void* vmTypeHandle) { + return class_property_is_final((Class_Handle)vmTypeHandle)?true:false; } - -Type* -DrlVMTypeManager::getUnderlyingType(void* enumVMTypeHandle) { - assert(false); return 0; +bool VMInterface::isInterfaceType(void* vmTypeHandle) { + return class_property_is_interface2((Class_Handle)vmTypeHandle)?true:false; } - -////////////////////////////////////////////////////////////////////////////// -///////////////////////// DrlVMMethodSignatureDesc ///////////////////////////// -////////////////////////////////////////////////////////////////////////////// -Type** -DrlVMMethodSignatureDesc::getParamTypes() { - if (paramTypes != NULL) - return paramTypes; - uint32 numParams = getNumParams(); - paramTypes = new (compilationInterface->getMemManager()) Type* [numParams]; - for (uint32 i=0; igetTypeFromDrlVMTypeHandle(typeHandle,isManagedPointer); +uint32 VMInterface::getVTableOffset() +{ + return object_get_vtable_offset(); } -Type* -DrlVMMethodSignatureDesc::getReturnType() { - bool isManagedPointer = - mtd_ret_type_is_managed_pointer(drlSigHandle)?true:false; - Type_Info_Handle typeHandle = method_ret_type_get_type_info(drlSigHandle); - return compilationInterface->getTypeFromDrlVMTypeHandle(typeHandle,isManagedPointer); +void* VMInterface::getTypeHandleFromAllocationHandle(void* vmAllocationHandle) +{ + return allocation_handle_get_class((Allocation_Handle)vmAllocationHandle); } + + ////////////////////////////////////////////////////////////////////////////// -///////////////////////// DrlVMMethodDesc ////////////////////////////////////// +///////////////////////// MethodDesc ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -bool -DrlVMMethodDesc::isVarPinned(uint32 varIndex) { - return false; +uint32 +MethodDesc::getNumParams() const { + return method_args_get_number(methodSig); } -Type* -DrlVMMethodDesc::getVarType(uint32 varIndex) { - bool isManagedPointer = - mtd_vars_is_managed_pointer(drlMethod,varIndex)?true:false; - Type_Info_Handle typeHandle = method_vars_get_type_info(drlMethod,varIndex); - return compilationInterface->getTypeFromDrlVMTypeHandle(typeHandle,isManagedPointer); +Type* +MethodDesc::getParamType(uint32 paramIndex) const { + Type_Info_Handle typeHandle = method_args_get_type_info(methodSig,paramIndex); + return compilationInterface->getTypeFromDrlVMTypeHandle(typeHandle); } -NamedType* -DrlVMMethodDesc::getParentType() { - TypeManager& typeManager = compilationInterface->getTypeManager(); - Class_Handle parentClassHandle = method_get_class(drlMethod); - if (class_is_primitive(parentClassHandle)) - return typeManager.getValueType(parentClassHandle); - return typeManager.getObjectType(parentClassHandle); +Type* +MethodDesc::getReturnType() const { + Type_Info_Handle typeHandle = method_ret_type_get_type_info(methodSig); + return compilationInterface->getTypeFromDrlVMTypeHandle(typeHandle); } -unsigned -DrlVMMethodDesc::parseJavaHandlers(ExceptionCallback& callback) { - uint32 numHandlers = getNumHandlers(); - for (uint32 i=0; igetParentHandle(); + return class_get_cp_entry_signature(enclosingDrlVMClass, (unsigned short)methodToken); +} + +Method_Side_Effects +MethodDesc::getSideEffect() const { + return method_get_side_effects(drlMethod); +} + +void +MethodDesc::setSideEffect(Method_Side_Effects mse) { + method_set_side_effects(drlMethod, mse); +} + +void +MethodDesc::setNumExceptionHandler(uint32 numHandlers) { + method_set_num_target_handlers(drlMethod,getJitHandle(),numHandlers); } +void +MethodDesc::setExceptionHandlerInfo(uint32 exceptionHandlerNumber, + Byte* startAddr, + Byte* endAddr, + Byte* handlerAddr, + NamedType* exceptionType, + bool exceptionObjIsDead) { + void* exn_handle; + assert(exceptionType); + if (exceptionType->isSystemObject()) + exn_handle = NULL; + else + exn_handle = exceptionType->getRuntimeIdentifier(); + method_set_target_handler_info(drlMethod, + getJitHandle(), + exceptionHandlerNumber, + startAddr, + endAddr, + handlerAddr, + (Class_Handle) exn_handle, + exceptionObjIsDead ? TRUE : FALSE); + } + + ////////////////////////////////////////////////////////////////////////////// -///////////////////////// DrlVMFieldDesc /////////////////////////////////////// +///////////////////////// FieldDesc /////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// bool -DrlVMFieldDesc::isLiteral() { +FieldDesc::isLiteral() const { return field_is_literal(drlField)?true:false; } -bool -DrlVMFieldDesc::isUnmanagedStatic() { - return false; +Class_Handle FieldDesc::getParentHandle() const { + return field_get_class(drlField); } NamedType* -DrlVMFieldDesc::getParentType() { +TypeMemberDesc::getParentType() { TypeManager& typeManager = compilationInterface->getTypeManager(); - Class_Handle parentClassHandle = field_get_class(drlField); - if (class_is_primitive(parentClassHandle)) + Class_Handle parentClassHandle = getParentHandle(); + if (class_is_primitive(parentClassHandle)) { + assert(0); return typeManager.getValueType(parentClassHandle); + } return typeManager.getObjectType(parentClassHandle); } Type* -DrlVMFieldDesc::getFieldType() { +FieldDesc::getFieldType() { Type_Info_Handle typeHandle = field_get_type_info_of_field_value(drlField); - return compilationInterface->getTypeFromDrlVMTypeHandle(typeHandle,false); + return compilationInterface->getTypeFromDrlVMTypeHandle(typeHandle); } uint32 -DrlVMFieldDesc::getOffset() { - if(getParentType()->isObject()) { - return field_get_offset(drlField); - } - else { - assert(false); return 0; - } +FieldDesc::getOffset() const { + return field_get_offset(drlField); } ////////////////////////////////////////////////////////////////////////////// -//////////////////////////// DrlVMClassHierachyMethodIterator ////////////////// +//////////////////////////// ClassHierachyMethodIterator ////////////////// ////////////////////////////////////////////////////////////////////////////// + +ClassHierarchyMethodIterator::ClassHierarchyMethodIterator( + CompilationInterface& compilationInterface, ObjectType* objType, MethodDesc* methodDesc) + : compilationInterface(compilationInterface) +{ + valid = method_iterator_initialize(&iterator, methodDesc->getMethodHandle(), + (Class_Handle) objType->getVMTypeHandle()); +} + +bool ClassHierarchyMethodIterator::hasNext() const { + Method_Handle handle = method_iterator_get_current(&iterator); + return handle != NULL; +} + MethodDesc* -DrlVMClassHierarchyMethodIterator::getNext() { +ClassHierarchyMethodIterator::getNext() { MethodDesc* desc = compilationInterface.getMethodDesc(method_iterator_get_current(&iterator)); method_iterator_advance(&iterator); return desc; } - ////////////////////////////////////////////////////////////////////////////// -//////////////////////////// DrlVMCompilationInterface ///////////////////////// +//////////////////////////// CompilationInterface ///////////////////////// ////////////////////////////////////////////////////////////////////////////// -void -DrlVMCompilationInterface::hardAssert(const char *message, int line, const char *file) -{ - ::std::cerr << message << " at line " << line << " of file " << file << ::std::endl; - exit(1); -} - -Type* -DrlVMCompilationInterface::getTypeFromDrlVMTypeHandle(Type_Info_Handle typeHandle) { - return getTypeFromDrlVMTypeHandle(typeHandle, false); -} - Type* -DrlVMCompilationInterface::getTypeFromDrlVMTypeHandle(Type_Info_Handle typeHandle, - bool isManagedPointer) { +CompilationInterface::getTypeFromDrlVMTypeHandle(Type_Info_Handle typeHandle) { Type* type = NULL; - if (isManagedPointer) { - Type_Info_Handle pointedToTypeHandle = type_info_get_type_info(typeHandle); - Type* pointedToType = getTypeFromDrlVMTypeHandle(pointedToTypeHandle); - if (!pointedToType) - return NULL; - type = typeManager.getManagedPtrType(pointedToType); - } else if (type_info_is_void(typeHandle)) { + if (type_info_is_void(typeHandle)) { // void return type type = typeManager.getVoidType(); } else if (type_info_is_reference(typeHandle)) { @@ -549,8 +466,6 @@ if (!elemType) return NULL; type = typeManager.getArrayType(elemType); - } else if (type_info_is_general_array(typeHandle)) { - assert(0); } else { // should not get here assert(0); @@ -558,7 +473,7 @@ return type; } -VM_RT_SUPPORT DrlVMCompilationInterface::translateHelperId(RuntimeHelperId runtimeHelperId) { +VM_RT_SUPPORT CompilationInterface::translateHelperId(RuntimeHelperId runtimeHelperId) { VM_RT_SUPPORT vmHelperId = (VM_RT_SUPPORT)-1; switch (runtimeHelperId) { case Helper_NewObj_UsingVtable: vmHelperId = VM_RT_NEW_RESOLVED_USING_VTABLE_AND_SIZE; break; @@ -616,13 +531,13 @@ } void* -DrlVMCompilationInterface::getRuntimeHelperAddress(RuntimeHelperId runtimeHelperId) { +CompilationInterface::getRuntimeHelperAddress(RuntimeHelperId runtimeHelperId) { VM_RT_SUPPORT drlHelperId = translateHelperId(runtimeHelperId); return vm_get_rt_support_addr(drlHelperId); } void* -DrlVMCompilationInterface::getRuntimeHelperAddressForType(RuntimeHelperId runtimeHelperId, Type* type) { +CompilationInterface::getRuntimeHelperAddressForType(RuntimeHelperId runtimeHelperId, Type* type) { VM_RT_SUPPORT drlHelperId = translateHelperId(runtimeHelperId); Class_Handle handle = NULL; if (type != NULL && type->isNamedType()) @@ -632,45 +547,8 @@ return addr; } -CompilationInterface::MethodSideEffect -DrlVMCompilationInterface::getMethodHasSideEffect(MethodDesc *m) { - Method_Side_Effects mse = method_get_side_effects(((DrlVMMethodDesc*)m)->getDrlVMMethod()); - - switch (mse) { - case MSE_True: return CompilationInterface::MSE_YES; - case MSE_False: return CompilationInterface::MSE_NO; - case MSE_Unknown: return CompilationInterface::MSE_UNKNOWN; - case MSE_True_Null_Param: return CompilationInterface::MSE_NULL_PARAM; - default: - assert(0); - return CompilationInterface::MSE_UNKNOWN; - } -} - -void -DrlVMCompilationInterface::setMethodHasSideEffect(MethodDesc *m, MethodSideEffect mse) { - Method_Handle handle = ((DrlVMMethodDesc*)m)->getDrlVMMethod(); - - switch (mse) { - case CompilationInterface::MSE_YES: - method_set_side_effects(handle, MSE_True); - break; - case CompilationInterface::MSE_NO: - method_set_side_effects(handle, MSE_False); - break; - case CompilationInterface::MSE_UNKNOWN: - method_set_side_effects(handle, MSE_Unknown); - break; - case CompilationInterface::MSE_NULL_PARAM: - method_set_side_effects(handle, MSE_True_Null_Param); - break; - default: - assert(0); - } -} - CompilationInterface::VmCallingConvention -DrlVMCompilationInterface::getRuntimeHelperCallingConvention(RuntimeHelperId id) { +CompilationInterface::getRuntimeHelperCallingConvention(RuntimeHelperId id) { switch(id) { case Helper_NewMultiArray: case Helper_WriteBarrier: @@ -687,63 +565,21 @@ } bool -DrlVMCompilationInterface::compileMethod(MethodDesc *method) { +CompilationInterface::compileMethod(MethodDesc *method) { if (Log::isEnabled()) { Log::out() << "Jitrino requested compilation of " << method->getParentType()->getName() << "::" << method->getName() << method->getSignatureString() << ::std::endl; } - JIT_Result res = vm_compile_method(getJitHandle(), ((DrlVMMethodDesc*)method)->getDrlVMMethod()); + JIT_Result res = vm_compile_method(getJitHandle(), method->getMethodHandle()); return res == JIT_SUCCESS ? true : false; } -void -DrlVMCompilationInterface::setNumExceptionHandler(uint32 numHandlers) { - method_set_num_target_handlers(methodToCompile->getDrlVMMethod(),getJitHandle(), - numHandlers); -} - -void -DrlVMCompilationInterface::setExceptionHandlerInfo(uint32 exceptionHandlerNumber, - Byte* startAddr, - Byte* endAddr, - Byte* handlerAddr, - NamedType* exceptionType, - bool exceptionObjIsDead) { - void* exn_handle; - assert(exceptionType); - if (exceptionType->isSystemObject()) - exn_handle = NULL; - else - exn_handle = exceptionType->getRuntimeIdentifier(); - method_set_target_handler_info(methodToCompile->getDrlVMMethod(), - getJitHandle(), - exceptionHandlerNumber, - startAddr, - endAddr, - handlerAddr, - (Class_Handle) exn_handle, - exceptionObjIsDead ? TRUE : FALSE); -} - -// token resolution methods -MethodSignatureDesc* -DrlVMCompilationInterface::resolveSignature(MethodDesc* enclosingMethodDesc, - uint32 sigToken) { - assert(0); - return NULL; -} - -Class_Handle -DrlVMCompilationInterface::methodGetClass(MethodDesc* method) { - return method_get_class(((DrlVMMethodDesc*)method)->getDrlVMMethod()); -} - FieldDesc* -DrlVMCompilationInterface::resolveField(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveField(MethodDesc* enclosingMethodDesc, uint32 fieldToken, bool putfield) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Field_Handle resolvedField = resolve_nonstatic_field(compileHandle,enclosingDrlVMClass,fieldToken,putfield); @@ -752,7 +588,7 @@ } FieldDesc* -DrlVMCompilationInterface::resolveFieldByIndex(NamedType* klass, int index, NamedType **fieldType) { +CompilationInterface::resolveFieldByIndex(NamedType* klass, int index, NamedType **fieldType) { Class_Handle ch = (Class_Handle) klass->getVMTypeHandle(); Field_Handle fh; @@ -764,9 +600,9 @@ } FieldDesc* -DrlVMCompilationInterface::resolveStaticField(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveStaticField(MethodDesc* enclosingMethodDesc, uint32 fieldToken, bool putfield) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Field_Handle resolvedField = resolve_static_field(compileHandle,enclosingDrlVMClass,fieldToken,putfield); @@ -775,15 +611,9 @@ } MethodDesc* -DrlVMCompilationInterface::resolveMethod(MethodDesc* enclosingMethodDesc, - uint32 methodToken) { - assert(false); return 0; -} - -MethodDesc* -DrlVMCompilationInterface::resolveVirtualMethod(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveVirtualMethod(MethodDesc* enclosingMethodDesc, uint32 methodToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Method_Handle resolvedMethod = resolve_virtual_method(compileHandle,enclosingDrlVMClass,methodToken); @@ -792,9 +622,9 @@ } MethodDesc* -DrlVMCompilationInterface::resolveSpecialMethod(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveSpecialMethod(MethodDesc* enclosingMethodDesc, uint32 methodToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Method_Handle resolvedMethod = resolve_special_method(compileHandle,enclosingDrlVMClass,methodToken); @@ -803,9 +633,9 @@ } MethodDesc* -DrlVMCompilationInterface::resolveStaticMethod(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveStaticMethod(MethodDesc* enclosingMethodDesc, uint32 methodToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Method_Handle resolvedMethod = resolve_static_method(compileHandle,enclosingDrlVMClass,methodToken); @@ -814,9 +644,9 @@ } MethodDesc* -DrlVMCompilationInterface::resolveInterfaceMethod(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveInterfaceMethod(MethodDesc* enclosingMethodDesc, uint32 methodToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Method_Handle resolvedMethod = resolve_interface_method(compileHandle,enclosingDrlVMClass,methodToken); @@ -825,9 +655,9 @@ } NamedType* -DrlVMCompilationInterface::resolveNamedType(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveNamedType(MethodDesc* enclosingMethodDesc, uint32 typeToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Class_Handle ch = resolve_class(compileHandle,enclosingDrlVMClass,typeToken); @@ -838,9 +668,9 @@ } NamedType* -DrlVMCompilationInterface::resolveNamedTypeNew(MethodDesc* enclosingMethodDesc, +CompilationInterface::resolveNamedTypeNew(MethodDesc* enclosingMethodDesc, uint32 typeToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Class_Handle ch = resolve_class_new(compileHandle,enclosingDrlVMClass,typeToken); @@ -851,9 +681,9 @@ } Type* -DrlVMCompilationInterface::getFieldType(MethodDesc* enclosingMethodDesc, +CompilationInterface::getFieldType(MethodDesc* enclosingMethodDesc, uint32 entryCPIndex) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Java_Type drlType = (Java_Type)class_get_cp_field_type(enclosingDrlVMClass, (unsigned short)entryCPIndex); switch (drlType) { case JAVA_TYPE_BOOLEAN: return typeManager.getBooleanType(); @@ -874,32 +704,18 @@ assert(0); return NULL; } -const char* -DrlVMCompilationInterface::methodSignatureString(MethodDesc* enclosingMethodDesc, - uint32 methodToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); - return class_get_cp_entry_signature(enclosingDrlVMClass, (unsigned short)methodToken); -} void* -DrlVMCompilationInterface::loadStringObject(MethodDesc* enclosingMethodDesc, +CompilationInterface::loadStringObject(MethodDesc* enclosingMethodDesc, uint32 stringToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); return class_get_const_string_intern_addr(enclosingDrlVMClass,stringToken); } -// -// Note: This is CLI only but temporarily here for Java also -// -void* -DrlVMCompilationInterface::loadToken(MethodDesc* enclosingMethodDesc,uint32 token) { - assert(false); return 0; -} - Type* -DrlVMCompilationInterface::getConstantType(MethodDesc* enclosingMethodDesc, +CompilationInterface::getConstantType(MethodDesc* enclosingMethodDesc, uint32 constantToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); Java_Type drlType = (Java_Type)class_get_const_type(enclosingDrlVMClass,constantToken); switch (drlType) { case JAVA_TYPE_STRING: return typeManager.getSystemStringType(); @@ -915,118 +731,63 @@ } const void* -DrlVMCompilationInterface::getConstantValue(MethodDesc* enclosingMethodDesc, +CompilationInterface::getConstantValue(MethodDesc* enclosingMethodDesc, uint32 constantToken) { - Class_Handle enclosingDrlVMClass = methodGetClass(enclosingMethodDesc); + Class_Handle enclosingDrlVMClass = enclosingMethodDesc->getParentHandle(); return class_get_const_addr(enclosingDrlVMClass,constantToken); } MethodDesc* -DrlVMCompilationInterface::getOverriddenMethod(NamedType* type, MethodDesc *methodDesc) { +CompilationInterface::getOverriddenMethod(NamedType* type, MethodDesc *methodDesc) { Method_Handle m = method_find_overridden_method((Class_Handle) type->getVMTypeHandle(), - ((DrlVMMethodDesc*)methodDesc)->getDrlVMMethod()); + methodDesc->getMethodHandle()); if (!m) return NULL; return getMethodDesc(m); } -ClassHierarchyIterator* -DrlVMCompilationInterface::getClassHierarchyIterator(ObjectType* baseType) { - DrlVMClassHierarchyIterator* iterator = new (getMemManager()) DrlVMClassHierarchyIterator(getTypeManager(), baseType); - return iterator->isValid() ? iterator : NULL; -} - ClassHierarchyMethodIterator* -DrlVMCompilationInterface::getClassHierarchyMethodIterator(ObjectType* baseType, MethodDesc* methodDesc) { - DrlVMClassHierarchyMethodIterator* iterator = new (getMemManager()) DrlVMClassHierarchyMethodIterator(*this, baseType, methodDesc); - return iterator->isValid() ? iterator : NULL; -} - -// accessors for method info, code and data -Byte* DrlVMCompilationInterface::getInfoBlock(MethodDesc* methodDesc) { - Method_Handle drlMethod = ((DrlVMMethodDesc*)methodDesc)->getDrlVMMethod(); - return methodGetStacknGCInfoBlock(drlMethod, getJitHandle()); +CompilationInterface::getClassHierarchyMethodIterator(ObjectType* baseType, MethodDesc* methodDesc) { + return new (getMemManager()) ClassHierarchyMethodIterator(*this, baseType, methodDesc); } -uint32 DrlVMCompilationInterface::getInfoBlockSize(MethodDesc* methodDesc) { - Method_Handle drlMethod = ((DrlVMMethodDesc*)methodDesc)->getDrlVMMethod(); - return methodGetStacknGCInfoBlockSize(drlMethod,getJitHandle()); -} - -Byte* DrlVMCompilationInterface::getCodeBlockAddress(MethodDesc* methodDesc, int32 id) { - Method_Handle drlMethod = ((DrlVMMethodDesc*)methodDesc)->getDrlVMMethod(); - return method_get_code_block_addr_jit_new(drlMethod,getJitHandle(),id); -} - -uint32 DrlVMCompilationInterface::getCodeBlockSize(MethodDesc* methodDesc, int32 id) { - Method_Handle drlMethod = ((DrlVMMethodDesc*)methodDesc)->getDrlVMMethod(); - return method_get_code_block_size_jit_new(drlMethod,getJitHandle(),id); -} - -void DrlVMCompilationInterface::setNotifyWhenClassIsExtended(ObjectType * type, +void CompilationInterface::setNotifyWhenClassIsExtended(ObjectType * type, void * callbackData) { void * typeHandle = type->getVMTypeHandle(); vm_register_jit_extended_class_callback(getJitHandle(), (Class_Handle) typeHandle,callbackData); } -void DrlVMCompilationInterface::setNotifyWhenMethodIsOverridden(MethodDesc * methodDesc, +void CompilationInterface::setNotifyWhenMethodIsOverridden(MethodDesc * methodDesc, void * callbackData) { - Method_Handle drlMethod = ((DrlVMMethodDesc *)methodDesc)->getDrlVMMethod(); + Method_Handle drlMethod = methodDesc->getMethodHandle(); vm_register_jit_overridden_method_callback(getJitHandle(), drlMethod, callbackData); } -void DrlVMCompilationInterface::setNotifyWhenMethodIsRecompiled(MethodDesc * methodDesc, +void CompilationInterface::setNotifyWhenMethodIsRecompiled(MethodDesc * methodDesc, void * callbackData) { - Method_Handle drlMethod = ((DrlVMMethodDesc *)methodDesc)->getDrlVMMethod(); + Method_Handle drlMethod = methodDesc->getMethodHandle(); vm_register_jit_recompiled_method_callback(getJitHandle(),drlMethod,callbackData); } - -bool DrlVMCompilationInterface::mayInlineObjectSynchronization(ObjectSynchronizationInfo & syncInfo) { - unsigned threadIdReg, syncHeaderOffset, syncHeaderWidth, lockOwnerOffset, lockOwnerWidth; - Boolean jitClearsCcv; - Boolean mayInline = - jit_may_inline_object_synchronization(&threadIdReg, &syncHeaderOffset, &syncHeaderWidth, - &lockOwnerOffset, &lockOwnerWidth, &jitClearsCcv); - if (mayInline == TRUE) { - syncInfo.threadIdReg = threadIdReg; - syncInfo.syncHeaderOffset = syncHeaderOffset; - syncInfo.syncHeaderWidth = syncHeaderWidth; - syncInfo.lockOwnerOffset = lockOwnerOffset; - syncInfo.lockOwnerWidth = lockOwnerWidth; - syncInfo.jitClearsCcv = (jitClearsCcv == TRUE); - } - return mayInline == TRUE; -} - -void DrlVMCompilationInterface::sendCompiledMethodLoadEvent(MethodDesc* methodDesc, MethodDesc* outerDesc, +void CompilationInterface::sendCompiledMethodLoadEvent(MethodDesc* methodDesc, MethodDesc* outerDesc, uint32 codeSize, void* codeAddr, uint32 mapLength, AddrLocation* addrLocationMap, void* compileInfo) { - Method_Handle method = (Method_Handle)getRuntimeMethodHandle(methodDesc); - Method_Handle outer = (Method_Handle)getRuntimeMethodHandle(outerDesc); + Method_Handle method = methodDesc->getMethodHandle(); + Method_Handle outer = outerDesc->getMethodHandle(); compiled_method_load(method, codeSize, codeAddr, mapLength, addrLocationMap, compileInfo, outer); } -bool DrlVMDataInterface::areReferencesCompressed() { - return (vm_references_are_compressed() != 0); -} - -void * DrlVMDataInterface::getHeapBase() { +void * VMInterface::getHeapBase() { return vm_heap_base_address(); } -void * DrlVMDataInterface::getHeapCeiling() { +void * VMInterface::getHeapCeiling() { return vm_heap_ceiling_address(); } -void DrlVMBinaryRewritingInterface::rewriteCodeBlock(Byte* codeBlock, Byte* newCode, size_t size) { - vm_patch_code_block(codeBlock, newCode, size); -} - - -ObjectType * DrlVMCompilationInterface::resolveClassUsingBootstrapClassloader( const char * klassName ) { +ObjectType * CompilationInterface::resolveClassUsingBootstrapClassloader( const char * klassName ) { Class_Handle cls = class_load_class_by_name_using_bootstrap_class_loader(klassName); if( NULL == cls ) { return NULL; @@ -1035,7 +796,7 @@ }; -MethodDesc* DrlVMCompilationInterface::resolveMethod( ObjectType* klass, const char * methodName, const char * methodSig) { +MethodDesc* CompilationInterface::resolveMethod( ObjectType* klass, const char * methodName, const char * methodSig) { Class_Handle cls = (Class_Handle)klass->getVMTypeHandle(); assert( NULL != cls ); Method_Handle mh = class_lookup_method_recursively( cls, methodName, methodSig); @@ -1046,14 +807,14 @@ }; JIT_Handle -DrlVMCompilationInterface::getJitHandle() const { +CompilationInterface::getJitHandle() const { return getCompilationContext()->getCurrentJITContext()->getJitHandle(); } -NamedType* DrlVMMethodDesc::getThrowType(uint32 i) { +NamedType* MethodDesc::getThrowType(uint32 i) { assert(i<=method_number_throws(drlMethod)); Class_Handle ch = method_get_throws(drlMethod, i); assert(ch); @@ -1061,8 +822,76 @@ return res; } -bool DrlVMMethodDesc::hasAnnotation(NamedType* type) { +bool MethodDesc::hasAnnotation(NamedType* type) const { return method_has_annotation(drlMethod, (Class_Handle)type->getVMTypeHandle()); +} + +void FieldDesc::printFullName(::std::ostream &os) { + os<getName()<<"::"<getName()<<"::"<lookup(field); +if (fieldDesc == NULL) { +fieldDesc = new (memManager) +FieldDesc(field,this,nextMemberId++); +fieldDescs->insert(field,fieldDesc); +} +return fieldDesc; +} + +MethodDesc* CompilationInterface:: getMethodDesc(Method_Handle method, JIT_Handle jit) { +assert(method); +MethodDesc* methodDesc = methodDescs->lookup(method); +if (methodDesc == NULL) { +methodDesc = new (memManager) +MethodDesc(method, jit, this, nextMemberId++); +methodDescs->insert(method,methodDesc); +} +return methodDesc; +} + +CompilationInterface::CompilationInterface(Compile_Handle c, + Method_Handle m, JIT_Handle jit, + MemoryManager& mm, OpenMethodExecutionParams& comp_params, + CompilationContext* cc, TypeManager& tpm) : +compilationContext(cc), memManager(mm), +typeManager(tpm), compilation_params(comp_params) +{ + fieldDescs = new (mm) PtrHashTable(mm,32); + methodDescs = new (mm) PtrHashTable(mm,32); + compileHandle = c; + nextMemberId = 0; + methodToCompile = NULL; + methodToCompile = getMethodDesc(m, jit); + flushToZeroAllowed = false; +} + +void CompilationInterface::lockMethodData(void) { g_compileLock.lock(); } + +void CompilationInterface::unlockMethodData(void) { g_compileLock.unlock(); } + +Byte* CompilationInterface::allocateCodeBlock(size_t size, size_t alignment, CodeBlockHeat heat, int32 id, +bool simulate) { + return method_allocate_code_block(methodToCompile->getMethodHandle(), getJitHandle(), + size, alignment, heat, id, simulate ? CAA_Simulate : CAA_Allocate); +} +Byte* CompilationInterface::allocateDataBlock(size_t size, size_t alignment) { + return method_allocate_data_block(methodToCompile->getMethodHandle(),getJitHandle(),size, alignment); +} +Byte* CompilationInterface::allocateInfoBlock(size_t size) { + size += sizeof(void *); + Byte *addr = method_allocate_info_block(methodToCompile->getMethodHandle(),getJitHandle(),size); + return (addr + sizeof(void *)); +} +Byte* CompilationInterface::allocateJITDataBlock(size_t size, size_t alignment) { + return method_allocate_jit_data_block(methodToCompile->getMethodHandle(),getJitHandle(),size, alignment); +} +MethodDesc* CompilationInterface::getMethodDesc(Method_Handle method) { + return getMethodDesc(method, getJitHandle()); } } //namespace Jitrino Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h?view=diff&rev=525110&r1=525109&r2=525110 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h Tue Apr 3 02:30:33 2007 @@ -1,690 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author Intel, Mikhail Y. Fursov - * @version $Revision: 1.30.12.3.4.4 $ - */ - -#ifndef _DRLVMINTERFACEIMPL_H_ -#define _DRLVMINTERFACEIMPL_H_ - -#include "Type.h" -#include "VMInterface.h" -#include "jit_export.h" -#include "jit_import.h" -#include "jit_runtime_support.h" -#include "jit_intf.h" -#include "mkernel.h" - -#include -#include - -namespace Jitrino { - -/** - * @brief A lock used to protect method's data in multi-threaded compilation. - */ -extern Mutex g_compileLock; - -// -// forward class definitions -// -class DrlVMCompilationInterface; - -uint32 flagTLSSuspendRequestOffset(); -uint32 flagTLSThreadStateOffset(); - -class DrlVMTypeManager : public TypeManager { -public: - DrlVMTypeManager(MemoryManager& mm) : TypeManager(mm) { - systemObjectVMTypeHandle = systemStringVMTypeHandle = NULL; - } - // - // VM specific methods for TypeDesc - // - void* getBuiltinValueTypeVMTypeHandle(Type::Tag); - void* getSystemObjectVMTypeHandle(); - void* getSystemClassVMTypeHandle(); - void* getSystemStringVMTypeHandle(); - void* getArrayVMTypeHandle(void* elemVMTypeHandle,bool isUnboxed); - const char* getTypeName(void* vmTypeHandle); - const char* getTypeNameQualifier(void* vmTypeHandle); - void* getSuperTypeVMTypeHandle(void* vmTypeHandle) { - return class_get_super_class((Class_Handle)vmTypeHandle); - } - const char* getMethodName(MethodDesc*); - void* getArrayElemVMTypeHandle(void* vmTypeHandle); - bool isArrayType(void* vmTypeHandle) { - return class_is_array((Class_Handle)vmTypeHandle)?true:false; - } - bool isArrayOfPrimitiveElements(void* vmTypeHandle); - bool isEnumType(void* vmTypeHandle); - bool isValueType(void* vmTypeHandle); - bool isLikelyExceptionType(void* vmTypeHandle); - bool isVariableSizeType(void* vmTypeHandle); - bool isFinalType(void* vmTypeHandle) { - return class_property_is_final((Class_Handle)vmTypeHandle)?true:false; - } - bool isInterfaceType(void* vmTypeHandle) { - return class_property_is_interface2((Class_Handle)vmTypeHandle)?true:false; - } - bool isAbstractType(void* vmTypeHandle) { - return class_property_is_abstract((Class_Handle)vmTypeHandle)?true:false; - } - bool isSystemStringType(void* vmTypeHandle); - bool isSystemObjectType(void* vmTypeHandle); - bool isSystemClassType(void* vmTypeHandle); - bool isBeforeFieldInit(void* vmTypeHandle); - bool getClassFastInstanceOfFlag(void* vmTypeHandle); - int getClassDepth(void* vmTypeHandle); - bool needsInitialization(void* vmTypeHandle) { - return class_needs_initialization((Class_Handle)vmTypeHandle)?true:false; - } - bool isFinalizable(void* vmTypeHandle) { - return class_is_finalizable((Class_Handle)vmTypeHandle)?true:false; - } - bool isInitialized(void* vmTypeHandle) { - return class_is_initialized((Class_Handle)vmTypeHandle)?true:false; - } - void* getVTable(void* vmTypeHandle) { - return (void *) class_get_vtable((Class_Handle)vmTypeHandle); - } - - // - // In DRL, these are the same. - // - void* getRuntimeClassHandle(void* vmTypeHandle) { - return vmTypeHandle; - } - - // - // Allocation handle to be used with calls to runtime support functions for - // object allocation - // - void* getAllocationHandle(void* vmTypeHandle) { - return (void *) class_get_allocation_handle((Class_Handle) vmTypeHandle); - } - - uint32 getVTableOffset() - { - return object_get_vtable_offset(); - } - - void* getTypeHandleFromAllocationHandle(void* vmAllocationHandle) - { - return allocation_handle_get_class((Allocation_Handle)vmAllocationHandle); - } - - - bool isSubClassOf(void* vmTypeHandle1,void* vmTypeHandle2); - uint32 getUnboxedOffset(void* vmTypeHandle); - uint32 getArrayElemOffset(void* vmElemTypeHandle,bool isUnboxed); - uint32 getBoxedSize(void * vmTypeHandle); - uint32 getUnboxedSize(void* vmTypeHandle); - uint32 getUnboxedAlignment(void* vmTypeHandle); - uint32 getUnboxedNumFields(void* vmTypeHandle); - FieldDesc* getUnboxedFieldDesc(void* vmTypeHandle,uint32 index); - uint32 getArrayLengthOffset(); - Type* getUnderlyingType(void* enumVMTypeHandle); - - Type* getTypeFromPrimitiveDrlVMDataType(VM_Data_Type drlDataType) { - switch (drlDataType) { - case VM_DATA_TYPE_INT8: return getInt8Type(); - case VM_DATA_TYPE_UINT8: return getUInt8Type(); - case VM_DATA_TYPE_INT16: return getInt16Type(); - case VM_DATA_TYPE_UINT16: return getUInt16Type(); - case VM_DATA_TYPE_INT32: return getInt32Type(); - case VM_DATA_TYPE_UINT32: return getUInt32Type(); - case VM_DATA_TYPE_INT64: return getInt64Type(); - case VM_DATA_TYPE_UINT64: return getUInt64Type(); - case VM_DATA_TYPE_INTPTR: return getIntPtrType(); - case VM_DATA_TYPE_UINTPTR: return getUIntPtrType(); - case VM_DATA_TYPE_F8: return getDoubleType(); - case VM_DATA_TYPE_F4: return getSingleType(); - case VM_DATA_TYPE_BOOLEAN: return getBooleanType(); - case VM_DATA_TYPE_CHAR: return getCharType(); - default: assert(0); - } - return NULL; - } - -private: - void* systemObjectVMTypeHandle; - void* systemClassVMTypeHandle; - void* systemStringVMTypeHandle; -}; - -class DrlVMMethodSignatureDesc : public MethodSignatureDesc { -public: - DrlVMMethodSignatureDesc(Method_Signature_Handle ms,DrlVMCompilationInterface* ci) - : drlSigHandle(ms), compilationInterface(ci), paramTypes(NULL) {} - uint32 getNumParams(); - Type* getParamType(uint32 paramIndex); - Type** getParamTypes(); - Type* getReturnType(); -private: - Method_Signature_Handle drlSigHandle; - DrlVMCompilationInterface* compilationInterface; - Type** paramTypes; -}; - -//////////////////////////////////////////// -///////// DrlVMFieldDesc////////////////////// -//////////////////////////////////////////// - -class DrlVMFieldDesc : public FieldDesc { -public: - DrlVMFieldDesc(Field_Handle field, - DrlVMCompilationInterface* ci, - uint32 i) - : drlField(field), compilationInterface(ci), id(i) {} - - uint32 getId() {return id;} - const char* getName() {return field_get_name(drlField);} - const char* getSignatureString() { return field_get_descriptor(drlField); } - void printFullName(::std::ostream &os) { os<getName()<<"::"<getName()<<"::"<") == 0; } - bool isInstanceInitializer() {return strcmp(getName(), "") == 0; } - bool isMethodClassIsLikelyExceptionType(); - // - // Method info - // - - bool isJavaByteCodes() {return true;} - const Byte* getByteCodes() {return method_get_byte_code_addr(drlMethod);} - uint32 getByteCodeSize() {return (uint32) method_get_byte_code_size(drlMethod);} - uint16 getMaxStack() {return (uint16) method_get_max_stack(drlMethod);} - uint32 getNumHandlers() {return method_get_num_handlers(drlMethod);} - uint32 getNumThrows() {return method_number_throws(drlMethod);} - NamedType* getThrowType(uint32 i); - bool hasAnnotation(NamedType* type); - - // - // accessors for method info, code and data - // - virtual Byte* getInfoBlock(); - virtual uint32 getInfoBlockSize(); - virtual Byte* getCodeBlockAddress(int32 id); - virtual uint32 getCodeBlockSize(int32 id); - virtual POINTER_SIZE_INT getUniqueId(); - - // - // DRL kernel - // - bool isOverridden() {return method_is_overridden(drlMethod)?true:false;} - uint32 getOffset() {return method_get_offset(drlMethod);} - void* getIndirectAddress(){return method_get_indirect_address(drlMethod);} - bool isAddressFinal(); - // - // Signature and handler parsing - // - unsigned parseJavaHandlers(ExceptionCallback&); - void parseCliHandlers(ExceptionCallback&); - - uint32 getNumVars() {return method_vars_get_number(drlMethod);} - bool isVarPinned(uint32 varIndex); - Type* getVarType(uint32 varIndex); - - MethodSignatureDesc* getMethodSig() {return &methodSig;} - - // - // DRL specific methods - // - Method_Handle getDrlVMMethod() const {return drlMethod;} - JIT_Handle getJitHandle() const {return jitHandle;} - // - // handleMap method are used to register/unregister main map for all Container handlers - virtual void* getHandleMap() {return handleMap;} - virtual void setHandleMap(void* hndMap) {handleMap = hndMap;} - -private: - Method_Handle drlMethod; - uint32 id; - DrlVMCompilationInterface* compilationInterface; - DrlVMMethodSignatureDesc methodSig; - void* handleMap; - JIT_Handle jitHandle; -}; - - -class DrlVMDataInterface : public DataInterface { -public: - DrlVMDataInterface() {} - virtual bool areReferencesCompressed(); - virtual void* getHeapBase(); - virtual void* getHeapCeiling(); -}; - - -class DrlVMClassHierarchyIterator : public ClassHierarchyIterator { -public: - DrlVMClassHierarchyIterator(TypeManager& typeManager, ObjectType* objType) - : typeManager(typeManager) { - valid = (class_iterator_initialize(&iterator, (Class_Handle) objType->getVMTypeHandle()) != 0); - } - bool isValid() { return valid; } - bool hasNext() { Class_Handle handle = class_iterator_get_current(&iterator); return handle != NULL; } - ObjectType* getNext() { ObjectType* type = typeManager.getObjectType(class_iterator_get_current(&iterator)); class_iterator_advance(&iterator); return type; } - -private: - TypeManager& typeManager; - bool valid; - ChaClassIterator iterator; -}; - -class DrlVMClassHierarchyMethodIterator : public ClassHierarchyMethodIterator { -public: - DrlVMClassHierarchyMethodIterator(DrlVMCompilationInterface& compilationInterface, ObjectType* objType, MethodDesc* methodDesc) - : compilationInterface(compilationInterface) { - valid = (method_iterator_initialize(&iterator, ((DrlVMMethodDesc*) methodDesc)->getDrlVMMethod(), (Class_Handle) objType->getVMTypeHandle()) != 0); - } - bool isValid() { return valid; } - bool hasNext() { Method_Handle handle = method_iterator_get_current(&iterator); return handle != NULL; } - MethodDesc* getNext(); - -private: - DrlVMCompilationInterface& compilationInterface; - bool valid; - ChaMethodIterator iterator; -}; - -///////////////////////////////// -// DRL Compilation Interface // -///////////////////////////////// - -class DrlVMCompilationInterface : public CompilationInterface { -public: - DrlVMCompilationInterface(Compile_Handle c, - Method_Handle m, - JIT_Handle jit, - MemoryManager& mm, - OpenMethodExecutionParams& comp_params, - CompilationContext* cc) - : CompilationInterface(cc), memManager(mm), fieldDescs(mm,32), methodDescs(mm,32), - dataInterface(), typeManager(mm), compilation_params(comp_params) - { - compileHandle = c; - nextMemberId = 0; - typeManager.init(*this); - methodToCompile = NULL; - methodToCompile = getMethodDesc(m, jit); - flushToZeroAllowed = !methodToCompile->isJavaByteCodes(); - } - - void setCompilationContext(CompilationContext* cc) { - compilationContext = cc; - } - - // returns the method to compile - MethodDesc* getMethodToCompile() {return methodToCompile;} - - void* getRuntimeHelperAddress(RuntimeHelperId); - void* getRuntimeHelperAddressForType(RuntimeHelperId, Type*); - - // sets and gets MethodSideEffect property for the compiled method - CompilationInterface::MethodSideEffect getMethodHasSideEffect(MethodDesc *m); - void setMethodHasSideEffect(MethodDesc *m, CompilationInterface::MethodSideEffect mse); - - // - // Exception registration API. - // All functions a for the method being compiled - // - void setNumExceptionHandler(uint32 numHandlers); - void setExceptionHandlerInfo(uint32 exceptionHandlerNumber, - Byte* startAddr, - Byte* endAddr, - Byte* handlerAddr, - NamedType* exceptionType, - bool exceptionObjIsDead); - bool areReferencesCompressed() { - return dataInterface.areReferencesCompressed(); - } - void* getHeapBase() { - return dataInterface.getHeapBase(); - } - uint32 getVTableOffset() { - return object_get_vtable_offset(); - } - bool areVTablePtrsCompressed() { - return (vm_vtable_pointers_are_compressed() != 0); - } - uint32 getVTablePtrSize() { - return vm_get_vtable_ptr_size(); - } - uint64 getVTableBase() { - return vm_get_vtable_base(); - } - - // to get the owner of a method - Class_Handle methodGetClass(MethodDesc* method); - // token resolution methods - MethodSignatureDesc* resolveSignature(MethodDesc* enclosingMethodDesc, - uint32 sigToken); - FieldDesc* resolveField(MethodDesc* enclosingMethod, - uint32 fieldToken, - bool putfield); - FieldDesc* resolveFieldByIndex(NamedType *klass, int index, NamedType **fieldType); - FieldDesc* resolveStaticField(MethodDesc* enclosingMethod, - uint32 fieldToken, - bool putfield); - MethodDesc* resolveVirtualMethod(MethodDesc* enclosingMethod, - uint32 methodToken); - MethodDesc* resolveSpecialMethod(MethodDesc* enclosingMethod, - uint32 methodToken); - MethodDesc* resolveMethod(MethodDesc* enclosingMethod, - uint32 methodToken); - MethodDesc* resolveStaticMethod(MethodDesc* enclosingMethod, - uint32 methodToken); - MethodDesc* resolveInterfaceMethod(MethodDesc* enclosingMethod, - uint32 methodToken); - NamedType* resolveNamedType(MethodDesc* enclosingMethod, - uint32 typeToken); - NamedType* resolveNamedTypeNew(MethodDesc* enclosingMethod, - uint32 typeToken); - Type* getFieldType(MethodDesc* enclosingMethodDesc, uint32 entryCPIndex); - const char* methodSignatureString(MethodDesc* enclosingMethodDesc, uint32 methodToken); - - // resolve-by-name methods - virtual ObjectType * resolveClassUsingBootstrapClassloader( const char * klassName ); - virtual MethodDesc * resolveMethod( ObjectType * klass, const char * methodName, const char * methodSig); - - void* loadStringObject(MethodDesc* enclosingMethod, - uint32 stringToken); - void* loadToken(MethodDesc* enclosingMethod,uint32 token); - Type* getConstantType(MethodDesc* enclosingMethod, - uint32 constantToken); - const void* getConstantValue(MethodDesc* enclosingMethod, - uint32 constantToken); - MethodDesc* getOverriddenMethod(NamedType *type, MethodDesc * methodDesc); - - ClassHierarchyIterator* getClassHierarchyIterator(ObjectType* baseType); - - ClassHierarchyMethodIterator* getClassHierarchyMethodIterator(ObjectType* baseType, MethodDesc* methodDesc); - - void hardAssert(const char *message, int line, const char *file); - - // accessors for method info, code and data - Byte* getInfoBlock(MethodDesc*); - uint32 getInfoBlockSize(MethodDesc*); - Byte* getCodeBlockAddress(MethodDesc*, int32 id); - uint32 getCodeBlockSize(MethodDesc*, int32 id); - - // Memory allocation API - // all of these are for the method being compiled - Byte* allocateCodeBlock(size_t size, size_t alignment, CodeBlockHeat heat, int32 id, - bool simulate) { - uint32 drlHeat; - if (heat == CodeBlockHeatMin) - drlHeat = CODE_BLOCK_HEAT_COLD; - else if (heat == CodeBlockHeatMax) - drlHeat = CODE_BLOCK_HEAT_MAX/2; - else { - assert (heat == CodeBlockHeatDefault); - drlHeat = CODE_BLOCK_HEAT_DEFAULT; - } - return method_allocate_code_block(methodToCompile->getDrlVMMethod(), getJitHandle(), - size, alignment, drlHeat, id, simulate ? CAA_Simulate : CAA_Allocate); - } - Byte* allocateDataBlock(size_t size, size_t alignment) { - return method_allocate_data_block(methodToCompile->getDrlVMMethod(),getJitHandle(),size, alignment); - } - Byte* allocateInfoBlock(size_t size) { - size += sizeof(void *); - Byte *addr = method_allocate_info_block(methodToCompile->getDrlVMMethod(),getJitHandle(),size); - return (addr + sizeof(void *)); - } - Byte* allocateJITDataBlock(size_t size, size_t alignment) { - return method_allocate_jit_data_block(methodToCompile->getDrlVMMethod(),getJitHandle(),size, alignment); - } - // allocate memory block with no purpose specified - Byte* allocateMemoryBlock(size_t size) { - return (Byte *)malloc(size); - } - - void lockMethodData(void) { g_compileLock.lock(); } - void unlockMethodData(void) { g_compileLock.unlock(); } - - // methods that register JIT to be notified of various events - void setNotifyWhenClassIsExtended(ObjectType * type, void * callbackData); - void setNotifyWhenMethodIsOverridden(MethodDesc * methodDesc, void * callbackData); - void setNotifyWhenMethodIsRecompiled(MethodDesc * methodDesc, void * callbackData); - - - - // write barriers stuff - bool insertWriteBarriers() { - return compilation_params.exe_insert_write_barriers; - } - - bool isBCMapInfoRequired() { - bool res = compilation_params.exe_do_code_mapping; - // exe_do_code_mapping should be used for different ti related byte code - // mapping calculations - // full byte code mapping could be enabled by IRBuilder flag now - // this method used to access to byte code low level maps and - // enables byte codes for stack traces only -// res = true; - return res; - } - void setBCMapInfoRequired(bool is_supported) { - compilation_params.exe_do_code_mapping = is_supported; - } - - bool isCompileLoadEventRequired() { - return compilation_params.exe_notify_compiled_method_load; - } - - virtual void sendCompiledMethodLoadEvent(MethodDesc* methodDesc, MethodDesc* outerDesc, - uint32 codeSize, void* codeAddr, uint32 mapLength, - AddrLocation* addrLocationMap, void* compileInfo); - - virtual OpenMethodExecutionParams& getCompilationParams() { - return compilation_params; - } - - // should flush to zero be allowed for floating-point operations ? - bool isFlushToZeroAllowed() { - return flushToZeroAllowed; - } - // - // Returns true if jit may inline VM functionality for monitorenter and monitorexit - // If true is returned 'syncInfo' is filled in with the synchronization parameters. - // - bool mayInlineObjectSynchronization(ObjectSynchronizationInfo & syncInfo); - - // - // Returns the calling convention for managed code. - // - VmCallingConvention getManagedCallingConvention() { - switch (vm_managed_calling_convention()) { - case CC_Vm: - return CallingConvention_Drl; - default: - assert(0); - return (VmCallingConvention) -1; - }; - } - VmCallingConvention getRuntimeHelperCallingConvention(RuntimeHelperId id); - - bool compileMethod(MethodDesc *method); - - void* getRuntimeMethodHandle(MethodDesc *method) { - return ((DrlVMMethodDesc*)method)->getDrlVMMethod(); - } - - // - // for internal use - // - TypeManager& getTypeManager() {return typeManager;} - MemoryManager& getMemManager() {return memManager;} - Type* getTypeFromDrlVMTypeHandle(Type_Info_Handle, - bool isManagedPointer); - DrlVMFieldDesc* getFieldDesc(Field_Handle field) { - DrlVMFieldDesc* fieldDesc = fieldDescs.lookup(field); - if (fieldDesc == NULL) { - fieldDesc = new (memManager) - DrlVMFieldDesc(field,this,nextMemberId++); - fieldDescs.insert(field,fieldDesc); - } - return fieldDesc; - } - DrlVMMethodDesc* getMethodDesc(Method_Handle method) { - return getMethodDesc(method, getJitHandle()); - } - - DrlVMMethodDesc* getMethodDesc(Method_Handle method, JIT_Handle jit) { - assert(method); - DrlVMMethodDesc* methodDesc = methodDescs.lookup(method); - if (methodDesc == NULL) { - methodDesc = new (memManager) - DrlVMMethodDesc(method,this,nextMemberId++, jit); - methodDescs.insert(method,methodDesc); - } - return methodDesc; - } - -private: - Type* getTypeFromDrlVMTypeHandle(Type_Info_Handle); - VM_RT_SUPPORT translateHelperId(RuntimeHelperId runtimeHelperId); - JIT_Handle getJitHandle() const; - - MemoryManager& memManager; - PtrHashTable fieldDescs; - PtrHashTable methodDescs; - DrlVMDataInterface dataInterface; - DrlVMTypeManager typeManager; - DrlVMMethodDesc* methodToCompile; - Compile_Handle compileHandle; - bool flushToZeroAllowed; - uint32 nextMemberId; - OpenMethodExecutionParams& compilation_params; -}; - -class DrlVMGCInterface : public GCInterface { -public: - DrlVMGCInterface(GC_Enumeration_Handle gcHandle) : gcHandle(gcHandle) {} - - virtual void enumerateRootReference(void** reference) { - vm_enumerate_root_reference(reference, FALSE); - } - - virtual void enumerateCompressedRootReference(uint32* reference) { - vm_enumerate_compressed_root_reference(reference, FALSE); - } - - virtual void enumerateRootManagedReference(void** slotReference, int slotOffset) { - vm_enumerate_root_interior_pointer(slotReference, slotOffset, FALSE); - } - -private: - GC_Enumeration_Handle gcHandle; -}; - - -class DrlVMThreadDumpEnumerator : public GCInterface { -public: - DrlVMThreadDumpEnumerator() {} - - virtual void enumerateRootReference(void** reference) { - vm_check_if_monitor(reference, 0, 0, 0, FALSE, 1); - } - - virtual void enumerateCompressedRootReference(uint32* reference) { - vm_check_if_monitor(0, 0, reference, 0, FALSE, 2); - } - - virtual void enumerateRootManagedReference(void** slotReference, int slotOffset) { - vm_check_if_monitor(slotReference, 0, 0, slotOffset, FALSE, 3); - } -}; - -class DrlVMBinaryRewritingInterface : public BinaryRewritingInterface { -public: - DrlVMBinaryRewritingInterface() {} - virtual void rewriteCodeBlock(Byte* codeBlock, Byte* newCode, size_t size); -}; - -} //namespace Jitrino - -#endif // _DRLVMINTERFACEIMPL_H_ Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp?view=diff&rev=525110&r1=525109&r2=525110 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp Tue Apr 3 02:30:33 2007 @@ -288,22 +288,28 @@ JIT_Handle j, size_t size, size_t alignment, - unsigned heat, + CodeBlockHeat heat, int id, Code_Allocation_Action action) { Method *method = (Method *)m; assert(method); - Class_Handle UNUSED clss = method_get_class(method); - assert(clss); - JIT *jit = (JIT *)j; assert(jit); - Byte *code_block = NULL; + uint32 drlHeat; + if (heat == CodeBlockHeatMin) + drlHeat = CODE_BLOCK_HEAT_COLD; + else if (heat == CodeBlockHeatMax) + drlHeat = CODE_BLOCK_HEAT_MAX/2; + else { + assert (heat == CodeBlockHeatDefault); + drlHeat = CODE_BLOCK_HEAT_DEFAULT; + } + // the following method is safe to call from multiple threads - code_block = (Byte *) method->allocate_code_block_mt(size, alignment, jit, heat, id, action); + Byte *code_block = (Byte *) method->allocate_code_block_mt(size, alignment, jit, drlHeat, id, action); return code_block; } // method_allocate_code_block @@ -2570,7 +2576,7 @@ } // method_iterator_initialize -Method_Handle method_iterator_get_current(ChaMethodIterator *chaClassIterator) +Method_Handle method_iterator_get_current(const ChaMethodIterator *chaClassIterator) { return (chaClassIterator->_class_iter._is_valid ? chaClassIterator->_current : NULL); } // method_iterator_get_current