Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 10991 invoked from network); 28 Nov 2006 06:21:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Nov 2006 06:21:30 -0000 Received: (qmail 63894 invoked by uid 500); 28 Nov 2006 06:21:39 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 63834 invoked by uid 500); 28 Nov 2006 06:21:39 -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 63825 invoked by uid 99); 28 Nov 2006 06:21:39 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 27 Nov 2006 22:21:39 -0800 X-ASF-Spam-Status: No, hits=-9.4 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; Mon, 27 Nov 2006 22:21:27 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id B55371A9846; Mon, 27 Nov 2006 22:20:49 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r479926 - in /harmony/enhanced/drlvm/trunk: build/make/ build/make/components/vm/ vm/em/src/ vm/gc_cc/javasrc/ vm/gc_cc/javasrc/org/ vm/gc_cc/javasrc/org/apache/ vm/gc_cc/javasrc/org/apache/harmony/ vm/gc_cc/javasrc/org/apache/harmony/drlvm... Date: Tue, 28 Nov 2006 06:20:48 -0000 To: commits@harmony.apache.org From: wjwashburn@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20061128062049.B55371A9846@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: wjwashburn Date: Mon Nov 27 22:20:46 2006 New Revision: 479926 URL: http://svn.apache.org/viewvc?view=rev&rev=479926 Log: Harmony-2008, jit helper inlining infrastructure. Adds a "build update" dependency on downloading mmtk.jar build and build test are OK on windows32 and linux32 Added: harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/gc_cc/ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/gc_cc/GCHelper.java harmony/enhanced/drlvm/trunk/vm/gc_cc/src/gc_jni.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java Modified: harmony/enhanced/drlvm/trunk/build/make/build.xml harmony/enhanced/drlvm/trunk/build/make/components/vm/gc_cc.xml harmony/enhanced/drlvm/trunk/build/make/components/vm/kernel_classes.xml harmony/enhanced/drlvm/trunk/build/make/deploy.xml harmony/enhanced/drlvm/trunk/build/make/lnx.properties harmony/enhanced/drlvm/trunk/build/make/setup.xml harmony/enhanced/drlvm/trunk/build/make/win.properties harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp harmony/enhanced/drlvm/trunk/vm/include/open/vm.h harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/C_Interface.cpp harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm.cpp harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm_init.cpp harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java Modified: harmony/enhanced/drlvm/trunk/build/make/build.xml URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/build.xml?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/build.xml (original) +++ harmony/enhanced/drlvm/trunk/build/make/build.xml Mon Nov 27 22:20:46 2006 @@ -478,15 +478,16 @@ deploy.getting_started, deploy.copy_classlib, deploy.antlr, + deploy.mmtk, deploy.tweakname"> - - - - - - - - + + + + + + + + @@ -507,7 +508,7 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Modified: harmony/enhanced/drlvm/trunk/build/make/components/vm/kernel_classes.xml URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/components/vm/kernel_classes.xml?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/components/vm/kernel_classes.xml (original) +++ harmony/enhanced/drlvm/trunk/build/make/components/vm/kernel_classes.xml Mon Nov 27 22:20:46 2006 @@ -42,12 +42,13 @@ + + location="${build.vm.home}/vmcore/src/kernel_classes/resource/MANIFEST.MF" /> Modified: harmony/enhanced/drlvm/trunk/build/make/deploy.xml URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/deploy.xml?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/deploy.xml (original) +++ harmony/enhanced/drlvm/trunk/build/make/deploy.xml Mon Nov 27 22:20:46 2006 @@ -55,6 +55,7 @@ bin/default:gc_cc + bin/default:gc_cc Modified: harmony/enhanced/drlvm/trunk/build/make/lnx.properties URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/lnx.properties?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/lnx.properties (original) +++ harmony/enhanced/drlvm/trunk/build/make/lnx.properties Mon Nov 27 22:20:46 2006 @@ -75,6 +75,10 @@ remote.ANTLR.archive=http://www.antlr.org/download/antlr-2.7.5.jar remote.ANTLR.archive.type=asis +# org.vmmagic unboxed package. Used to enable address arithmetic in Java +remote.MMTK.archive=http://cs.anu.edu.au/people/Robin.Garner/mmtk-20061012.jar +remote.MMTK.archive.type=asis + # Xalan-Java version 2.7.0 XALAN_HOME=${external.dep.CLASSLIB}/depends/jars/xalan-j_2.7.0 Modified: harmony/enhanced/drlvm/trunk/build/make/setup.xml URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/setup.xml?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/setup.xml (original) +++ harmony/enhanced/drlvm/trunk/build/make/setup.xml Mon Nov 27 22:20:46 2006 @@ -107,6 +107,7 @@ + @@ -181,7 +182,7 @@ - + Modified: harmony/enhanced/drlvm/trunk/build/make/win.properties URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/build/make/win.properties?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/build/make/win.properties (original) +++ harmony/enhanced/drlvm/trunk/build/make/win.properties Mon Nov 27 22:20:46 2006 @@ -74,6 +74,10 @@ remote.ANTLR.archive=http://www.antlr.org/download/antlr-2.7.5.jar remote.ANTLR.archive.type=asis +# org.vmmagic unboxed package. Used to enable address arithmetic in Java +remote.MMTK.archive=http://cs.anu.edu.au/people/Robin.Garner/mmtk-20061012.jar +remote.MMTK.archive.type=asis + # Xalan-Java version 2.7.0 XALAN_HOME=${external.dep.CLASSLIB}/depends/jars/xalan-j_2.7.0 Modified: harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp Mon Nov 27 22:20:46 2006 @@ -179,7 +179,7 @@ std::string fullPath = dll_name + ".dll"; if (!library_path.empty()) { - fullPath = library_path + "\\" + fullPath; + fullPath = library_path + "\\" + fullPath; } #else @@ -187,10 +187,10 @@ // // std::string fullPath = library_path + "/lib" + dll_name + ".so"; - std::string fullPath = "lib" + dll_name + ".so"; - + std::string fullPath = "lib" + dll_name + ".so"; + if (!library_path.empty()) { - fullPath = library_path + "/" + fullPath; + fullPath = library_path + "/" + fullPath; } #endif @@ -214,8 +214,7 @@ std::string path = origPath; if (path.find('/') == path.npos && path.find('\\') == path.npos ) { -// $$$ GMJ std::string dir = vm_get_property_value("vm.boot.library.path"); - std::string dir = vm_get_property_value("org.apache.harmony.vm.vmdir"); + std::string dir = vm_get_property_value(O_A_H_VM_VMDIR); if (libPrefix.length() > 0 && !startsWith(path, libPrefix)) { path = libPrefix + path; } Added: harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/gc_cc/GCHelper.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/gc_cc/GCHelper.java?view=auto&rev=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/gc_cc/GCHelper.java (added) +++ harmony/enhanced/drlvm/trunk/vm/gc_cc/javasrc/org/apache/harmony/drlvm/gc_cc/GCHelper.java Mon Nov 27 22:20:46 2006 @@ -0,0 +1,58 @@ +/* + * 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 Mikhail Y. Fursov + */ + +package org.apache.harmony.drlvm.gc_cc; + +import org.apache.harmony.drlvm.VMHelper; +import org.vmmagic.unboxed.*; + +public class GCHelper { + + static {System.loadLibrary("gc_cc");} + + public static final int TLS_CURRENT_OFFSET = getCurrentOffset(); + public static final int TLS_CLEANED_OFFSET = getCleanedOffset(); + + + + + public static Object alloc(int objSize, int allocationHandle) { + Address tlsAddr = VMHelper.getTlsBaseAddress(); + + Address tlsFreeFieldAddr = tlsAddr.plus(TLS_CURRENT_OFFSET); + Address tlsCleanedFieldAddr = tlsAddr.plus(TLS_CLEANED_OFFSET); + + Address tlsFreeAddr = tlsFreeFieldAddr.loadAddress(); + Address tlsCleanedAddr = tlsCleanedFieldAddr.loadAddress (); + + Address tlsNewFreeAddr = tlsFreeAddr.plus(objSize); + + // the fast path without cleaning + if (tlsNewFreeAddr.LE(tlsCleanedAddr)) { + tlsFreeFieldAddr.store (tlsNewFreeAddr); + tlsFreeAddr.store(allocationHandle); + return tlsFreeAddr; + } + return VMHelper.newResolvedUsingAllocHandleAndSize(objSize, allocationHandle); + } + + private static native int getCurrentOffset(); + private static native int getCleanedOffset(); +} \ No newline at end of file Added: harmony/enhanced/drlvm/trunk/vm/gc_cc/src/gc_jni.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/gc_cc/src/gc_jni.cpp?view=auto&rev=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/gc_cc/src/gc_jni.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/gc_cc/src/gc_jni.cpp Mon Nov 27 22:20:46 2006 @@ -0,0 +1,32 @@ +#include +#include +#include "gc_types.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Class: org_apache_harmony_drlvm_gc_cc_GCHelper + * Method: getGCTlsOffset + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1cc_GCHelper_getCurrentOffset(JNIEnv *e, jclass c) +{ + return (jint)tls_offset_current; +} + +/* + * Class: org_apache_harmony_drlvm_gc_cc_GCHelper + * Method: getGCTlsOffset + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_gc_1cc_GCHelper_getCleanedOffset(JNIEnv *e, jclass c) +{ + return (jint)tls_offset_clean; +} + +#ifdef __cplusplus +} +#endif Modified: harmony/enhanced/drlvm/trunk/vm/include/open/vm.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/vm.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/include/open/vm.h (original) +++ harmony/enhanced/drlvm/trunk/vm/include/open/vm.h Mon Nov 27 22:20:46 2006 @@ -34,6 +34,8 @@ #include "open/types.h" +#define O_A_H_VM_VMDIR "org.apache.harmony.vm.vmdir" + #ifdef __cplusplus extern "C" { #endif @@ -74,7 +76,7 @@ // Loads a class of a given name. If a class cannot be loaded, returns NULL VMEXPORT Class_Handle -class_load_class_by_name_using_system_class_loader(const char *name); +class_load_class_by_name_using_bootstrap_class_loader(const char *name); // The following three functions will be eventually renamed to // class_is_final, class_is_abstract and class_is_interface, Modified: harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h (original) +++ harmony/enhanced/drlvm/trunk/vm/include/open/vm_gc.h Mon Nov 27 22:20:46 2006 @@ -54,6 +54,8 @@ */ VMEXPORT void *vm_get_gc_thread_local(); +VMEXPORT size_t vm_get_gc_thread_local_offset(); + /** * Acquire the lock that guards all GC-related operations in the VM. Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf Mon Nov 27 22:20:46 2006 @@ -56,7 +56,7 @@ -Djit.SD2_OPT.path=opt_init,translator,optimizer,hir2lir,codegen --Djit.SD2_OPT.path.optimizer=ssa,simplify,dce,uce,edge_annotate,devirt,inline,purge,simplify,dce,uce,lazyexc,dessa,statprof,peel,ssa,hvn,simplify,dce,uce,lower,dce,uce,memopt,reassoc,dce,uce,hvn,dce,uce,abcd,dce,uce,gcm,dessa,statprof,markglobals +-Djit.SD2_OPT.path.optimizer=ssa,simplify,dce,uce,edge_annotate,devirt,inline,purge,simplify,dce,uce,lazyexc,inline_helpers,purge,simplify,uce,dce,dessa,statprof,peel,ssa,hvn,simplify,dce,uce,lower,dce,uce,memopt,reassoc,dce,uce,hvn,dce,uce,abcd,dce,uce,gcm,dessa,statprof,markglobals -Djit.SD2_OPT.path.codegen=lock_method,bbp,gcpoints,cafl,dce1,i8l,early_prop,itrace-,native,constraints,dce2,regalloc,spillgen,layout,copy,rce+,stack,break-,iprof-,emitter!,si_insts,gcmap,info,unlock_method -Djit.SD2_OPT.path.dce1=cg_dce -Djit.SD2_OPT.path.dce2=cg_dce @@ -70,6 +70,16 @@ -Djit.SD2_OPT.arg.optimizer.inline.pipeline=SD2_OPT_inliner_pipeline -Djit.SD2_OPT.arg.optimizer.inline.connect_early=false +#helper inliner configuration +-Djit.SD2_OPT.SD2_OPT_helper_inliner_pipeline.filter=- +-Djit.SD2_OPT.SD2_OPT_helper_inliner_pipeline.path=ssa +-Djit.SD2_OPT.arg.optimizer.inline_helpers.pipeline=SD2_OPT_helper_inliner_pipeline + +-Djit.SD2_OPT.arg.optimizer.inline_helpers.newObj=on +-Djit.SD2_OPT.arg.optimizer.inline_helpers.newObj_className=org/apache/harmony/drlvm/gc_cc/GCHelper +-Djit.SD2_OPT.arg.optimizer.inline_helpers.newObj_methodName=alloc +-Djit.SD2_OPT.arg.optimizer.inline_helpers.newObj_hotnessPercent=1 + -Djit.SD2_OPT.arg.codegen.dce1.early=yes -Djit.SD2_OPT.arg.codegen.regalloc.bp_regalloc1.regs=ALL_GP @@ -78,3 +88,7 @@ #system properties -Djava.compiler=server + +#GC properties +-Dvm.components.gc_cc.startupclass=org.apache.harmony.drlvm.gc_cc.GCHelper +-Dvm.components.gc_cc.classpath=gc_cc.jar Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/CodeGenIntfc.h Mon Nov 27 22:20:46 2006 @@ -173,13 +173,6 @@ }; }; -class VMHelperCallOp { -public: - enum Id { - ThrowLazy - }; -}; - class InstructionCallback { public: virtual ~InstructionCallback() {} @@ -290,7 +283,8 @@ virtual CG_OpndHandle* callhelper(uint32 numArgs, CG_OpndHandle** args, Type* retType, JitHelperCallOp::Id callId) = 0; virtual CG_OpndHandle* callvmhelper(uint32 numArgs, CG_OpndHandle** args, Type* retType, - VMHelperCallOp::Id callId, InlineInfo* ii = NULL) = 0; + CompilationInterface::RuntimeHelperId callId, InlineInfo* ii = NULL) = 0; + virtual CG_OpndHandle* ldc_i4(uint32 val) = 0; virtual CG_OpndHandle* ldc_i8(uint64 val) = 0; virtual CG_OpndHandle* ldc_s(float val) = 0; Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp Mon Nov 27 22:20:46 2006 @@ -2819,12 +2819,12 @@ CG_OpndHandle* InstCodeSelector::callvmhelper(uint32 numArgs, CG_OpndHandle** args, Type* retType, - VMHelperCallOp::Id callId, + CompilationInterface::RuntimeHelperId callId, InlineInfo* ii) { Opnd* dstOpnd=NULL; switch(callId) { - case ThrowLazy: + case CompilationInterface::Helper_Throw_Lazy: { Opnd **hlpArgs = new (memManager) Opnd* [numArgs+1]; @@ -2838,6 +2838,31 @@ Opnd::RuntimeInfo::Kind_MethodRuntimeId, md); appendInsts(irManager.newRuntimeHelperCallInst(CompilationInterface::Helper_Throw_Lazy, numArgs+1, (Opnd**)hlpArgs, dstOpnd, ii)); + break; + } + case CompilationInterface::Helper_GetTLSBase: + { + assert(numArgs == 0); + Opnd * tlsBaseReg = irManager.newOpnd(typeManager.getUnmanagedPtrType(typeManager.getInt8Type())); +#ifdef PLATFORM_POSIX + TypeManager& tm =irManager.getTypeManager(); + Opnd * callAddrOpnd =irManager.newImmOpnd(tm.getUnmanagedPtrType(tm.getIntPtrType()), + Opnd::RuntimeInfo::Kind_HelperAddress, (void*)CompilationInterface::Helper_GetTLSBase); + appendInsts(irManager.newCallInst(callAddrOpnd, &CallingConvention_STDCALL, 0, NULL, tlsBaseReg)); +#else + appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, tlsBaseReg, + irManager.newMemOpnd(typeManager.getInt32Type(), MemOpndKind_Any, NULL, 0x14, RegName_FS))); +#endif + dstOpnd = tlsBaseReg; + + break; + } + case CompilationInterface::Helper_NewObj_UsingVtable: + { + assert(numArgs == 2); + dstOpnd = irManager.newOpnd(retType); + CallInst * callInst=irManager.newRuntimeHelperCallInst(CompilationInterface::Helper_NewObj_UsingVtable, 2, (Opnd**)args, dstOpnd); + appendInsts(callInst); break; } default: Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.h Mon Nov 27 22:20:46 2006 @@ -226,7 +226,8 @@ CG_OpndHandle* tau_callintr(uint32 numArgs, CG_OpndHandle** args, Type* retType,IntrinsicCallOp::Id callId, CG_OpndHandle *tauNullsChecked, CG_OpndHandle *tauTypesChecked); CG_OpndHandle* callhelper(uint32 numArgs, CG_OpndHandle** args, Type* retType,JitHelperCallOp::Id callId); CG_OpndHandle* callvmhelper(uint32 numArgs, CG_OpndHandle** args, Type* retType, - VMHelperCallOp::Id callId, InlineInfo* ii = NULL); + CompilationInterface::RuntimeHelperId callId, InlineInfo* ii = NULL); + CG_OpndHandle* box(ObjectType * boxedType, CG_OpndHandle* val); CG_OpndHandle* unbox(Type * dstType, CG_OpndHandle* objHandle); CG_OpndHandle* ldValueObj(Type* objType, CG_OpndHandle *srcAddr); Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Printer.cpp Mon Nov 27 22:20:46 2006 @@ -532,6 +532,9 @@ if (opnd->isPlacedIn(OpndKind_Reg)){ os<<"("; printRegName(opnd->getRegName()); os<<")"; }else if(opnd->isPlacedIn(OpndKind_Mem)){ + if (opnd->getSegReg() != RegName_Null) { + os<<"(";printRegName(opnd->getSegReg());os<<":"; + } os<<"["; uint32 oldOpndFlavor=opndFlavor; opndFlavor&=~OpndFlavor_Type; @@ -551,6 +554,9 @@ } opndFlavor=oldOpndFlavor; os<<"]"; + if (opnd->getSegReg() != RegName_Null) { + os<<")"; + } }else if(opnd->isPlacedIn(OpndKind_Imm)){ os<<"("<getImmValue(); if (opndFlavor & OpndFlavor_RuntimeInfo){ Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp Mon Nov 27 22:20:46 2006 @@ -459,7 +459,7 @@ static const char* deffmask = "log/%jit%/%class%/%method%/%log%.log"; static const char* ct_deffmask = "log/%jit%/%class%/%method%/ct.log"; -static const char* dot_deffmask = "log/%jit%/%class%/%method%/.dot"; +static const char* dot_deffmask = "log/%jit%/%class%/%method%/dot/.dot"; struct KnownStream { Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/CodeGenerator.cpp Mon Nov 27 22:20:46 2006 @@ -446,13 +446,6 @@ assert(0); return JitHelperCallOp::InitializeArray; // to keep compiler quiet } - VMHelperCallOp::Id convertVMHelperId(VMHelperCallId callId) { - switch(callId) { - case ThrowLazy: return VMHelperCallOp::ThrowLazy; - } - assert(0); - return VMHelperCallOp::ThrowLazy; // to keep compiler quiet - } CG_OpndHandle ** genCallArgs(Inst * call, uint32 arg0Pos) { uint32 nSrc = call->getNumSrcOperands(); CG_OpndHandle ** args = new(memManager) CG_OpndHandle*[nSrc - arg0Pos]; @@ -941,12 +934,12 @@ case Op_VMHelperCall: { VMHelperCallInst* call = inst->asVMHelperCallInst(); - VMHelperCallId callId = call->getVMHelperId(); + CompilationInterface::RuntimeHelperId callId = call->getVMHelperId(); cgInst = instructionCallback.callvmhelper(inst->getNumSrcOperands(), genCallArgs(call,0), inst->getDst()->getType(), - convertVMHelperId(callId)); + callId); } break; case Op_Return: Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.cpp Mon Nov 27 22:20:46 2006 @@ -1401,7 +1401,7 @@ } Opnd* -IRBuilder::genVMHelperCall(VMHelperCallId helperId, +IRBuilder::genVMHelperCall(CompilationInterface::RuntimeHelperId helperId, Type* returnType, uint32 numArgs, Opnd* args[]) { @@ -1412,6 +1412,7 @@ appendInst(instFactory->makeVMHelperCall(dst, helperId, numArgs, args)); return dst; } + void IRBuilder::genTauTypeCompare(Opnd *arg0, MethodDesc *methodDesc, LabelInst *target, Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/IRBuilder.h Mon Nov 27 22:20:46 2006 @@ -156,11 +156,12 @@ uint32 numArgs, Opnd* args[]); - Opnd* genVMHelperCall(VMHelperCallId helperId, + Opnd* genVMHelperCall(CompilationInterface::RuntimeHelperId helperId, Type* returnType, uint32 numArgs, Opnd* args[]); + void genReturn(Opnd* src, Type* retType);//TR void genReturn();//TR Opnd* genCatch(Type* exceptionType); // TR Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.cpp Mon Nov 27 22:20:46 2006 @@ -478,15 +478,12 @@ void VMHelperCallInst::handlePrintEscape(::std::ostream& os, char code) const { switch(code) { - case 'd': - switch(vmHelperId) { - case ThrowLazy: - { os << "ThrowLazyException "; - break; - } - default: - assert(0); break; - } + case 'd': + { + CompilationContext* cc = CompilationContext::getCurrentContext(); + const char* name = cc->getVMCompilationInterface()->getRuntimeHelperName(vmHelperId); + os <isNull()? Type::Void : dst->getType()->tag; args = copyOpnds(args, numArgs); return makeVMHelperCallInst(Op_VMHelperCall, Modifier(Exception_Sometimes), returnType, dst, numArgs, args, id, inlInfo); } + // load, store, & move Inst* Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Inst.h Mon Nov 27 22:20:46 2006 @@ -1025,14 +1025,8 @@ public: void visit(InstFormatVisitor& visitor) {visitor.accept(this);} bool isVMHelperCallInst() const { return true; } - VMHelperCallId getVMHelperId() const {return vmHelperId;} - Opnd* getLEConstructor() const { - if (vmHelperId == ThrowLazy) - return args[numSrcs]; - else - return NULL; - } - bool isThrowLazy() const {return vmHelperId == ThrowLazy;} + CompilationInterface::RuntimeHelperId getVMHelperId() const {return vmHelperId;} + bool isThrowLazy() const {return vmHelperId == CompilationInterface::Helper_Throw_Lazy;} InlineInfo* getInlineInfoPtr() { return inlInfo; } private: virtual void handlePrintEscape(::std::ostream&, char code) const; @@ -1043,8 +1037,9 @@ Opnd* dst, uint32 nArgs, Opnd** args_, - VMHelperCallId id) : Inst(op, mod, type, dst, nArgs), - vmHelperId(id), inlInfo(NULL) { + CompilationInterface::RuntimeHelperId id) + : Inst(op, mod, type, dst, nArgs), vmHelperId(id), inlInfo(NULL) + { args = args_; switch (nArgs) { default: @@ -1060,10 +1055,11 @@ args[srcIndex] = src; } Opnd** args; - VMHelperCallId vmHelperId; + CompilationInterface::RuntimeHelperId vmHelperId; InlineInfo* inlInfo; }; + // phi instructions class PhiInst : public MultiSrcInst { public: @@ -1153,8 +1149,10 @@ Opnd* tauNullChecked, Opnd* tauTypesChecked, uint32 numArgs, Opnd** args); Inst* makeJitHelperCall(Opnd* dst, JitHelperCallId id, uint32 numArgs, Opnd** args); - Inst* makeVMHelperCall(Opnd* dst, VMHelperCallId id, uint32 numArgs, + Inst* makeVMHelperCall(Opnd* dst, CompilationInterface::RuntimeHelperId id, uint32 numArgs, Opnd** args, InlineInfo* inlInfo = NULL); + + Inst* makeReturn(Opnd* src); Inst* makeReturn(); // void return type Inst* makeCatch(Opnd* dst); @@ -1538,8 +1536,9 @@ Opnd* dst, uint32 nArgs, Opnd** args_, - VMHelperCallId id, + CompilationInterface::RuntimeHelperId id, InlineInfo* inlInfo = NULL); + PhiInst* makePhiInst(Type::Tag type, Opnd* dst, uint32 nArgs, Opnd** args_); Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/Opcode.h Mon Nov 27 22:20:46 2006 @@ -272,13 +272,9 @@ enum JitHelperCallId { InitializeArray, PseudoCanThrow, - SaveThisState, - ReadThisState, + SaveThisState, //todo: replace with GetTLS + offset sequence + ReadThisState, //todo: replace with GetTLS + offset sequence LockedCompareAndExchange -}; - -enum VMHelperCallId { - ThrowLazy }; enum Opcode { Added: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp?view=auto&rev=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/helper_inliner.cpp Mon Nov 27 22:20:46 2006 @@ -0,0 +1,251 @@ +/* +* 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 +*/ + +#include "PMFAction.h" +#include "optpass.h" +#include "inliner.h" + +namespace Jitrino { + +struct HelperInlinerFlags { + const char* inlinerPipelineName; + + bool insertInitilizers; + bool doInlining; + + bool newObj_doInlining; + int newObj_hotnessPercentToInline; + const char* newObj_className; + const char* newObj_methodName; + const char* newObj_signature; +}; + +class HelperInlinerAction: public Action { +public: + void init(); + HelperInlinerFlags& getFlags() {return flags;} +protected: + HelperInlinerFlags flags; +}; + +DEFINE_SESSION_ACTION_WITH_ACTION(HelperInlinerSession, HelperInlinerAction, inline_helpers, "VM helpers inlining"); + +void HelperInlinerAction::init() { + flags.inlinerPipelineName = getStringArg("pipeline", "inliner_pipeline"); + flags.insertInitilizers = getBoolArg("insertInitilizers", false); + flags.doInlining = true; + + + //new obj inlining params; + flags.newObj_doInlining = getBoolArg("newObj", false); + + flags.newObj_signature = "(II)Ljava/lang/Object;"; + if (flags.newObj_doInlining) { + flags.newObj_className = getStringArg("newObj_className", NULL); + flags.newObj_methodName = getStringArg("newObj_methodName", NULL); + flags.newObj_hotnessPercentToInline = getIntArg("newObj_hotnessPercent", 0); + if (flags.newObj_className == NULL || flags.newObj_methodName == NULL) { + //TODO:? crash("Invalid newObj fast path helper name: %s::%s\n", flags.newObj_className, flags.newObj_methodName); + flags.newObj_doInlining = false; + } + } + + if (!flags.newObj_doInlining){ + flags.newObj_className = NULL; + flags.newObj_methodName = NULL; + } + +} + + +class HelperInliner { +public: + HelperInliner(HelperInlinerSession* _sessionAction, MemoryManager& tmpMM, CompilationContext* _cc, Inst* _inst) + : flags(((HelperInlinerAction*)_sessionAction->getAction())->getFlags()), localMM(tmpMM), + cc(_cc), inst(_inst), action(_sessionAction) + {} + virtual ~HelperInliner(){}; + + virtual void doInline() = 0; +protected: + MethodDesc* ensureClassIsResolvedAndInitialized(const char* className, const char* methodName, const char* signature); + void inlineVMHelper(MethodCallInst* call); + + HelperInlinerFlags& flags; + MemoryManager& localMM; + CompilationContext* cc; + Inst* inst; + HelperInlinerSession* action; +}; + +class NewObjHelperInliner : public HelperInliner { +public: + NewObjHelperInliner(HelperInlinerSession* session, MemoryManager& tmpMM, CompilationContext* cc, Inst* inst) + : HelperInliner(session, tmpMM, cc, inst){} + virtual void doInline(); +}; + + +void HelperInlinerSession::_run(IRManager& irm) { + CompilationContext* cc = getCompilationContext(); + MemoryManager tmpMM(1024, "Inline VM helpers"); + HelperInlinerAction* action = (HelperInlinerAction*)getAction(); + HelperInlinerFlags& flags = action->getFlags(); + if (!flags.doInlining) { + return; + } + //finding all helper calls + ControlFlowGraph& fg = irm.getFlowGraph(); + double entryExecCount = fg.hasEdgeProfile() ? fg.getEntryNode()->getExecCount(): 1; + StlVector helperInliners(tmpMM); + const Nodes& nodes = fg.getNodesPostOrder();//process checking only reachable nodes. + for (Nodes::const_iterator it = nodes.begin(), end = nodes.end(); it!=end; ++it) { + Node* node = *it; + int nodePercent = fg.hasEdgeProfile() ? (int)(node->getExecCount()*100/entryExecCount) : 0; + if (node->isBlockNode()) { //only block nodes can have helper calls today + for (Inst* inst = (Inst*)node->getFirstInst(); inst!=NULL; inst = inst->getNextInst()) { + Opcode opcode = inst->getOpcode(); + switch(opcode) { + case Op_NewObj: + if (flags.newObj_doInlining && nodePercent >= flags.newObj_hotnessPercentToInline) { + helperInliners.push_back(new (tmpMM) NewObjHelperInliner(this, tmpMM, cc, inst)); + } + break; + default: break; + } + } + } + } + + //running all inliners + //TODO: set inline limit! + for (StlVector::const_iterator it = helperInliners.begin(), end = helperInliners.end(); it!=end; ++it) { + HelperInliner* inliner = *it; + inliner->doInline(); + } +} + + +MethodDesc* HelperInliner::ensureClassIsResolvedAndInitialized(const char* className, const char* methodName, const char* signature) +{ + CompilationInterface* ci = cc->getVMCompilationInterface(); + ObjectType* clazz = ci->resolveClassUsingBootstrapClassloader(className); + if (!clazz) { + if (Log::isEnabled()) Log::out()<<"Error: class not found:"< check if initialized + IRManager* irm = cc->getHIRManager(); + InstFactory& instFactory = irm->getInstFactory(); + if (clazz->needsInitialization()) { + if (flags.insertInitilizers) { + instFactory.makeInitType(clazz)->insertBefore(inst); + } + return NULL; + } + //helper class is initialized here -> inline it. + MethodDesc* method = ci->resolveMethod(clazz, methodName, signature); + if (!method) { + if (Log::isEnabled()) Log::out()<<"Error: method not found:"<isStatic()); + return method; + +} + +void HelperInliner::inlineVMHelper(MethodCallInst* call) { + CompilationInterface* ci = cc->getVMCompilationInterface(); + IRManager* irm = cc->getHIRManager(); + + //now inline the call + CompilationContext inlineCC(cc->getCompilationLevelMemoryManager(), ci, cc->getCurrentJITContext()); + inlineCC.setPipeline(cc->getPipeline()); + + Inliner inliner(action, localMM, *irm, false); + InlineNode* regionToInline = inliner.createInlineNode(inlineCC, call); + + inliner.connectRegion(regionToInline); + + // Optimize inlined region before splicing + inlineCC.stageId = cc->stageId; + Inliner::runInlinerPipeline(inlineCC, flags.inlinerPipelineName); + cc->stageId = inlineCC.stageId; + + inliner.inlineRegion(regionToInline, false); +} + +void NewObjHelperInliner::doInline() { +#ifdef _EM64T_ + return; +#else + if (Log::isEnabled()) { + Log::out() << "Processing inst:"; inst->print(Log::out()); Log::out()<getOpcode() == Op_NewObj); + + //find the method + MethodDesc* method = ensureClassIsResolvedAndInitialized(flags.newObj_className, flags.newObj_methodName, flags.newObj_signature); + if (!method) { + return; + } + + TypeInst *typeInst = (TypeInst*)inst; + Type * type = typeInst->getTypeInfo(); + assert(type->isObject()); + ObjectType* objType = type->asObjectType(); + + if (objType->isFinalizable()) { + if (Log::isEnabled()) Log::out()<<"Skipping as finalizable: "<getName()<getAllocationHandle(); + int objSize=objType->getObjectSize(); + + IRManager* irm = cc->getHIRManager(); + InstFactory& instFactory = irm->getInstFactory(); + OpndManager& opndManager = irm->getOpndManager(); + TypeManager& typeManager = irm->getTypeManager(); + + Opnd* tauSafeOpnd = opndManager.createSsaTmpOpnd(typeManager.getTauType()); + instFactory.makeTauSafe(tauSafeOpnd)->insertBefore(inst); + Opnd* res = inst->getDst(); + Opnd* objSizeOpnd = opndManager.createSsaTmpOpnd(typeManager.getInt32Type()); + Opnd* allocationHandleOpnd = opndManager.createSsaTmpOpnd(typeManager.getInt32Type()); + instFactory.makeLdConst(objSizeOpnd, objSize)->insertBefore(inst); + instFactory.makeLdConst(allocationHandleOpnd, allocationHandle)->insertBefore(inst); + Opnd* args[2] = {objSizeOpnd, allocationHandleOpnd}; + MethodCallInst* call = instFactory.makeDirectCall(res, tauSafeOpnd, tauSafeOpnd, 2, args, method)->asMethodCallInst(); + call->insertBefore(inst); + inst->unlink(); + assert(call == call->getNode()->getLastInst()); + + //inline the method + inlineVMHelper(call); +#endif +} + +}//namespace + Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp Mon Nov 27 22:20:46 2006 @@ -731,7 +731,7 @@ } void -Inliner::inlineAndProcessRegion(InlineNode* inlineNode) { +Inliner::inlineRegion(InlineNode* inlineNode, bool updatePriorityQueue) { IRManager &inlinedIRM = inlineNode->getIRManager(); DominatorTree* dtree = inlinedIRM.getDominatorTree(); LoopTree* ltree = inlinedIRM.getLoopTree(); @@ -755,7 +755,9 @@ // // Update priority queue with calls in this region // - processRegion(inlineNode, dtree, ltree); + if (updatePriorityQueue) { + processRegion(inlineNode, dtree, ltree); + } // // If top level flowgraph @@ -919,12 +921,20 @@ _instFactory.setMethodId(((uint64)id)<<32); + InlineNode* inlineNode = createInlineNode(inlineCC, call); + assert(inlineNode!=NULL); + + inlineParentNode->addChild(inlineNode); + + _currentByteSize = newByteSize; + return inlineNode; +} + +InlineNode* Inliner::createInlineNode(CompilationContext& inlineCC, MethodCallInst* call) { + MethodDesc *methodDesc = call->getMethodDesc(); IRManager* inlinedIRM = new (_tmpMM) IRManager(_tmpMM, _toplevelIRM, *methodDesc, NULL); - // Augment inline tree - InlineNode *inlineNode = new (_tmpMM) InlineNode(*inlinedIRM, call, callNode); - - inlineParentNode->addChild(inlineNode); + InlineNode *inlineNode = new (_tmpMM) InlineNode(*inlinedIRM, call, call->getNode()); // Call a translator if (isBCmapRequired) { @@ -937,9 +947,6 @@ inlineCC.setHIRManager(inlinedIRM); runTranslatorSession(inlineCC); - // Save state. - _currentByteSize = newByteSize; - assert(inlineNode); return inlineNode; } @@ -1085,7 +1092,7 @@ return (uint32) sum; } -static void runInlinerPipeline(CompilationContext& inlineCC, const char* pipeName) { +void Inliner::runInlinerPipeline(CompilationContext& inlineCC, const char* pipeName) { PMF::HPipeline p = inlineCC.getCurrentJITContext()->getPMF().getPipeline(pipeName); assert(p!=NULL); PMF::PipelineIterator pit(p); @@ -1117,7 +1124,7 @@ MemoryManager tmpMM(1024, "Inliner::tmp_mm"); Inliner inliner(this, tmpMM, irm, irm.getFlowGraph().hasEdgeProfile()); InlineNode* rootRegionNode = (InlineNode*) inliner.getInlineTree().getRoot(); - inliner.inlineAndProcessRegion(rootRegionNode); + inliner.inlineRegion(rootRegionNode); // Inline calls do { @@ -1138,7 +1145,7 @@ // Optimize inlined region before splicing inlineCC.stageId = cc->stageId; - runInlinerPipeline(inlineCC, pipeName); + Inliner::runInlinerPipeline(inlineCC, pipeName); cc->stageId = inlineCC.stageId; // Splice into flow graph and find next region. @@ -1146,7 +1153,7 @@ inliner.connectRegion(regionNode); } OptPass::computeDominatorsAndLoops(regionManager); - inliner.inlineAndProcessRegion(regionNode); + inliner.inlineRegion(regionNode); } while (true); const OptimizerFlags& optimizerFlags = irm.getOptimizerFlags(); // Print the results to logging / dot file Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h Mon Nov 27 22:20:46 2006 @@ -84,7 +84,7 @@ // Inline this method into the current CFG and process it for further // inline candidates. If the argument is the top level CFG, only processing // occurs. - void inlineAndProcessRegion(InlineNode* inlineNode); + void inlineRegion(InlineNode* inlineNode, bool updatePriorityQueue = true); // Connect input and return operands of the region to the top-level method. Do not yet splice. void connectRegion(InlineNode* inlineNode); @@ -97,7 +97,11 @@ void reset(); + InlineNode* createInlineNode(CompilationContext& inlineCC, MethodCallInst* call); + static double getProfileMethodCount(CompilationInterface& compileIntf, MethodDesc& methodDesc); + + static void runInlinerPipeline(CompilationContext& inlineCC, const char* pipeName); private: class CallSite { Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/lazyexceptionopt.cpp Mon Nov 27 22:20:46 2006 @@ -521,7 +521,7 @@ tinst = *it1; assert(tinst != NULL); tlinst=irManager.getInstFactory().makeVMHelperCall( - OpndManager::getNullOpnd(), ThrowLazy, opcount, + OpndManager::getNullOpnd(), CompilationInterface::Helper_Throw_Lazy, opcount, opnds, constrInlineInfo); #ifdef _DEBUG if (Log::isEnabled()) { Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/memoryopt.cpp Mon Nov 27 22:20:46 2006 @@ -655,18 +655,6 @@ } break; case Op_VMHelperCall: - { - VMHelperCallInst *vmcalli = i->asVMHelperCallInst(); - VMHelperCallId callId = vmcalli->getVMHelperId(); - switch (callId) { - case ThrowLazy: - assert(vmcalli->getNumSrcOperands() > 0); - break; - default: - assert(0); - break; - } - } break; case Op_JitHelperCall: { @@ -1404,10 +1392,7 @@ break; case Op_Conv: //the result of a conversion case Op_TauLdInd: // the result of static field load - { - assert(addr->getType()->isUnmanagedPtr()); - break; - } + break; default: assert(0); break; Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h Mon Nov 27 22:20:46 2006 @@ -91,15 +91,19 @@ unsigned id; }; -#define DEFINE_SESSION_ACTION(classname, tagname, fullname) \ + +#define DEFINE_SESSION_ACTION_WITH_ACTION(classname, actionclass, tagname, fullname) \ class classname : public OptPass { \ protected: \ - void _run(IRManager& irm); \ - const char* getName() { return fullname; } \ - const char* getTagName() { return #tagname; } \ + void _run(IRManager& irm); \ + const char* getName() { return fullname; } \ + const char* getTagName() { return #tagname; } \ }; \ -ActionFactory tagname##_(#tagname); +ActionFactory tagname##_(#tagname); + +#define DEFINE_SESSION_ACTION(classname, tagname, fullname) \ +DEFINE_SESSION_ACTION_WITH_ACTION(classname, Action, tagname, fullname) } //namespace Jitrino Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Mon Nov 27 22:20:46 2006 @@ -38,15 +38,17 @@ namespace Jitrino { - +// magics support static bool isMagicClass(Type* type) { #ifdef _EM64T_ return false;//magics are not tested on EM64T. #else - static const char unboxedName[] = "org/vmmagic/unboxed/"; - static const unsigned nameLen = sizeof(unboxedName)-1; + static const char magicPackage[] = "org/vmmagic/unboxed/"; + static const unsigned magicPackageLen = sizeof(magicPackage)-1; + const char* name = type->getName(); - return !strncmp(name, unboxedName, nameLen); + bool res = !strncmp(name, magicPackage, magicPackageLen); + return res; #endif } @@ -85,6 +87,24 @@ return NULL; } +//vm helpers support + +bool isVMHelperClass(NamedType* type) { +#ifdef _EM64T_ + return false;//natives are not tested on EM64T. +#else + static const char vmhelperPackage[] = "org/apache/harmony/drlvm/VMHelper"; + static const unsigned vmhelperPackageLen = sizeof(vmhelperPackage)-1; + + const char* name = type->getName(); + bool res = !strncmp(name, vmhelperPackage, vmhelperPackageLen); + return res; +#endif +} + +bool isVMHelperMethod(MethodDesc* md) { + return isVMHelperClass(md->getParentType()); +} //----------------------------------------------------------------------------- @@ -1066,12 +1086,37 @@ JavaByteCodeTranslator::getstatic(uint32 constPoolIndex) { FieldDesc* field = resolveStaticField(constPoolIndex, false); if (field && field->isStatic()) { - Type* fieldType = getFieldType(field,constPoolIndex); - assert(fieldType); - if (isMagicClass(fieldType)) { - fieldType = convertMagicType2HIR(typeManager, fieldType); + bool fieldValueInlined = false; + if (field->isInitOnly() && !field->getParentType()->needsInitialization()) { + //the final static field of the initialized class + Type* fieldType = field->getFieldType(); + if (field->getFieldType()->isNumeric()) { + Opnd* constVal = NULL; + void* fieldAddr = field->getAddress(); + switch(fieldType->tag) { + case Type::Int8 : constVal=irBuilder.genLdConstant(*(int8*)fieldAddr);break; + case Type::Int16: constVal=irBuilder.genLdConstant(*(int16*)fieldAddr);break; + case Type::Char : constVal=irBuilder.genLdConstant(*(uint16*)fieldAddr);break; + case Type::Int32: constVal=irBuilder.genLdConstant(*(int32*)fieldAddr);break; + case Type::Int64: constVal=irBuilder.genLdConstant(*(int64*)fieldAddr);break; + case Type::Float: constVal=irBuilder.genLdConstant(*(float*)fieldAddr);break; + case Type::Double: constVal=irBuilder.genLdConstant(*(double*)fieldAddr);break; + default: assert(0); //?? + } + if (constVal != NULL) { + pushOpnd(constVal); + fieldValueInlined = true; + } + } + } + if (!fieldValueInlined){ + Type* fieldType = getFieldType(field,constPoolIndex); + assert(fieldType); + if (isMagicClass(fieldType)) { + fieldType = convertMagicType2HIR(typeManager, fieldType); + } + pushOpnd(irBuilder.genLdStatic(fieldType,field)); } - pushOpnd(irBuilder.genLdStatic(fieldType,field)); return; } // generate helper call for throwing respective exception @@ -2252,6 +2297,9 @@ void JavaByteCodeTranslator::genLdVar(uint32 varIndex,JavaLabelPrepass::JavaVarType javaType) { Opnd *var = getVarOpndLdVar(javaType,varIndex); + if (isMagicClass(var->getType())) { + var->setType(convertMagicType2HIR(typeManager, var->getType())); + } Opnd *opnd; if (var->isVarOpnd()) { opnd = irBuilder.genLdVar(var->getType(),(VarOpnd*)var); @@ -2663,6 +2711,9 @@ if (isMagicMethod(methodDesc)) { genMagic(methodDesc, numArgs, srcOpnds, returnType); return; + } else if (isVMHelperMethod(methodDesc)) { + genVMHelper(methodDesc, numArgs, srcOpnds, returnType); + return; } if (inlineMethod(methodDesc)) { if(Log::isEnabled()) { @@ -3873,6 +3924,28 @@ assert(0); return; +} + + +void JavaByteCodeTranslator::genVMHelper(MethodDesc *md, uint32 numArgs, Opnd **srcOpnds, Type *returnType) { + Type* resType = isMagicClass(returnType) ? convertMagicType2HIR(typeManager, returnType) : returnType; + const char* mname = md->getName(); + + if (!strcmp(mname,"getTlsBaseAddress")) { + assert(numArgs == 0); + Opnd* res = irBuilder.genVMHelperCall(CompilationInterface::Helper_GetTLSBase, resType, numArgs, srcOpnds); + pushOpnd(res); + return; + } + + if (!strcmp(mname,"newResolvedUsingAllocHandleAndSize")) { + assert(numArgs == 2); + Opnd* res = irBuilder.genVMHelperCall(CompilationInterface::Helper_NewObj_UsingVtable, resType, numArgs, srcOpnds); + pushOpnd(res); + return; + } + + assert(0); } } //namespace Jitrino Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.h Mon Nov 27 22:20:46 2006 @@ -316,6 +316,7 @@ bool needsReturnLabel(uint32 off); void genInvokeStatic(MethodDesc * methodDesc,uint32 numArgs,Opnd ** srcOpnds,Type * returnType); void genMagic(MethodDesc * methodDesc,uint32 numArgs,Opnd ** srcOpnds,Type * returnType); + void genVMHelper(MethodDesc * methodDesc,uint32 numArgs,Opnd ** srcOpnds,Type * returnType); bool methodIsArraycopy(MethodDesc * methodDesc); bool arraycopyOptimizable(MethodDesc * methodDesc, uint32 numArgs, Opnd ** srcOpnds); Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/VMInterface.h Mon Nov 27 22:20:46 2006 @@ -289,12 +289,12 @@ * Resolve a system class by its name. * Returns NULL if no such class found. */ - virtual ObjectType * resolveSystemClass( const char * klassName ) = 0; + virtual ObjectType * resolveClassUsingBootstrapClassloader( const char * klassName ) = 0; /** * Recursively looks up for a given method with a given signature in the given class. * Returns NULL if no such method found. */ - virtual MethodPtrType * resolveMethod( ObjectType * klass, const char * methodName, const char * methodSig) = 0; + virtual MethodDesc* resolveMethod(ObjectType * klass, const char * methodName, const char * methodSig) = 0; // Class type is a subclass of ch=mh->getParentType() The function returns // a method description for a method overriding mh in type or in the closest @@ -553,7 +553,7 @@ * @return runtime handle of the corresponding VM object for the method */ virtual void* getRuntimeMethodHandle(MethodDesc *method) = 0; - + virtual CompilationContext* getCompilationContext() const {return compilationContext;} protected: 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=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.cpp Mon Nov 27 22:20:46 2006 @@ -1014,8 +1014,8 @@ } -ObjectType * DrlVMCompilationInterface::resolveSystemClass( const char * klassName ) { - Class_Handle cls = class_load_class_by_name_using_system_class_loader(klassName); +ObjectType * DrlVMCompilationInterface::resolveClassUsingBootstrapClassloader( const char * klassName ) { + Class_Handle cls = class_load_class_by_name_using_bootstrap_class_loader(klassName); if( NULL == cls ) { return NULL; } @@ -1023,20 +1023,21 @@ }; -MethodPtrType * DrlVMCompilationInterface::resolveMethod( ObjectType* klass, const char * methodName, const char * methodSig) { +MethodDesc* DrlVMCompilationInterface::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); if( NULL == mh ) { return NULL; } - return getTypeManager().getMethodPtrType(getMethodDesc(mh)); + return getMethodDesc(mh, NULL); }; JIT_Handle DrlVMCompilationInterface::getJitHandle() const { return getCompilationContext()->getCurrentJITContext()->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=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h (original) +++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlVMInterface.h Mon Nov 27 22:20:46 2006 @@ -460,8 +460,8 @@ const char* methodSignatureString(MethodDesc* enclosingMethodDesc, uint32 methodToken); // resolve-by-name methods - virtual ObjectType * resolveSystemClass( const char * klassName ); - virtual MethodPtrType * resolveMethod( ObjectType * klass, const char * methodName, const char * methodSig); + virtual ObjectType * resolveClassUsingBootstrapClassloader( const char * klassName ); + virtual MethodDesc * resolveMethod( ObjectType * klass, const char * methodName, const char * methodSig); void* loadStringObject(MethodDesc* enclosingMethod, uint32 stringToken); Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h (original) +++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/classloader.h Mon Nov 27 22:20:46 2006 @@ -377,7 +377,7 @@ assert (k <= K_LAST_PRIMITIVE ); // primitive types are limited by K_LAST_PRIMITIVE bound return primitive_types[k]; } - + void SetBCPElement(const char *path, apr_pool_t *tmp_pool); protected: virtual Class* DoLoadClass(Global_Env* env, const String* name); @@ -389,7 +389,6 @@ Class* LoadFromJarFile( JarFile* jar_file, const char* class_name_in_jar, const String* class_name, bool* not_found); void SetClasspathFromProperty(const char* prop_string, apr_pool_t *tmp_pool); - void SetBCPElement(const char *path, apr_pool_t *tmp_pool); void SetClasspathFromJarFile(JarFile *jar, apr_pool_t *tmp_pool); BCPElements m_BCPElements; 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=479926&r1=479925&r2=479926 ============================================================================== --- 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 Mon Nov 27 22:20:46 2006 @@ -924,13 +924,13 @@ Class_Handle -class_load_class_by_name_using_system_class_loader(const char *name) +class_load_class_by_name_using_bootstrap_class_loader(const char *name) { Global_Env *env = VM_Global_State::loader_env; String *n = env->string_pool.lookup(name); - Class *clss = env->bootstrap_class_loader->LoadClass(env, n); + Class *clss = env->bootstrap_class_loader->LoadVerifyAndPrepareClass(env, n); return (Class_Handle)clss; -} //class_load_class_by_name_using_system_class_loader +} Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm.cpp?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm.cpp (original) +++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/init/vm.cpp Mon Nov 27 22:20:46 2006 @@ -129,6 +129,8 @@ {"vm.ee_dlls", "A ';'-delimited list of modular dlls (JIT/Interpreter/etc.) to load at startup."}, {"vm.em_dll", "A ';'-execution manager (EM) dll to load at startup."}, {"vm.other_natives_dlls", "A " EXPAND(PORT_PATH_SEPARATOR) "-delimited list of dlls contained native methods implementations to load at startup."}, + {"vm.components..classpath", "Part of a 's classpath to append to the JDK booclasspath"}, + {"vm.components..startupclass", "A class to be initialized during startup"} }; static const int numStandardProperties = sizeof(standardProperties) / sizeof(standardProperties[0]); @@ -137,6 +139,9 @@ void check_vm_standard_property(const char *propertyName, const char *propertyValue) { + if (!strncmp(propertyName, "vm.components.", strlen("vm.components."))) { + return; + } for (int i=0; ibootstrap_class_loader->SetBCPElement(absPath.c_str(), tmp_pool); + } while(vm_properties_iterator_advance(ph)); + + vm_properties_iterator_destroy(ph); + + apr_pool_destroy(tmp_pool); +} + /** * Loads initial classes. For example j.l.Object, j.l.Class, etc. */ @@ -289,6 +335,8 @@ TRACE("bootstrapping initial java classes"); vm_env->bootstrap_class_loader->Initialize(); + + bootstrap_add_components_classpath(vm_env); /* * Bootstrap java.lang.Class class. This requires also loading the other classes Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java?view=diff&rev=479926&r1=479925&r2=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java (original) +++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMStart.java Mon Nov 27 22:20:46 2006 @@ -26,6 +26,9 @@ import java.lang.reflect.Modifier; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Properties; +import java.util.Enumeration; + /** * This class does the following: @@ -44,7 +47,30 @@ parseSystemProperties(); } + /** + Any component can ask VMStart to initialize it's class + using vm.component..startupclass property + */ + private static final String STARTUP_CLASS_PREFIX="vm.components."; + private static final String STARTUP_CLASS_SUFFUX=".startupclass"; + public static void parseSystemProperties() { + //call class.forName for all startup classes + Properties p = System.getProperties(); + for (Enumeration it=p.propertyNames(); it.hasMoreElements();) { + String key = (String)it.nextElement(); + if (key.startsWith(STARTUP_CLASS_PREFIX) && key.endsWith(STARTUP_CLASS_SUFFUX)) { + String className = p.getProperty(key); + try { + Class.forName(className); + } catch (Exception e) { + e.printStackTrace(); + //TODO: should be call System.exit() here? + } + + } + } + } public static void startHelperThreads() { Added: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java?view=auto&rev=479926 ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (added) +++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java Mon Nov 27 22:20:46 2006 @@ -0,0 +1,40 @@ +/* + * 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 Mikhail Y. Fursov + */ + +package org.apache.harmony.drlvm; + +import org.vmmagic.unboxed.Address; + +public class VMHelper { + + private VMHelper() {} + + + + public static Address getTlsBaseAddress() {fail(); return null;} + + public static Object newResolvedUsingAllocHandleAndSize(int objSize, int allocationHandle) {fail(); return null;} + + + + + protected static void fail() {throw new RuntimeException("Not supported!");} + +}