[vmkit-commits] [vmkit] r180279 - Working on stale references and isolate termination.

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 09:48:43 PDT 2013


Author: peter.senna
Date: Thu Apr 25 11:46:36 2013
New Revision: 180279

URL: http://llvm.org/viewvc/llvm-project?rev=180279&view=rev
Log:
Working on stale references and isolate termination.
(cherry picked from commit 8b33b069777ced12f4883ae362d296ebb122c84c)

Added:
    vmkit/trunk/.autotools
    vmkit/trunk/.cproject
    vmkit/trunk/.project
    vmkit/trunk/README.TXT
    vmkit/trunk/lib/j3/LLVMRuntime/runtime-isolate.ll
      - copied, changed from r180278, vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll
    vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.h
    vmkit/trunk/lib/j3/VMCore/JnjvmIsolateRef.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmIsolateTerm.cpp
    vmkit/trunk/tests/debug.txt
    vmkit/trunk/tests/i-jvm-log.txt
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/.classpath
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/.project
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/META-INF/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/build.properties
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerActivator.java
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerImpl.java
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/isolatemanager/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/isolatemanager/IsolateManager.java
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/util/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/util/IsolateLogger.java
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/vm/
    vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/vm/IJVM.java
    vmkit/trunk/tests/ijvm.tests.StaticClient/
    vmkit/trunk/tests/ijvm.tests.StaticClient/.classpath
    vmkit/trunk/tests/ijvm.tests.StaticClient/.project
    vmkit/trunk/tests/ijvm.tests.StaticClient/META-INF/
    vmkit/trunk/tests/ijvm.tests.StaticClient/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.StaticClient/build.properties
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/logging/
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/logging/InlineFormatter.java
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/staticclient/
    vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/staticclient/Activator.java
    vmkit/trunk/tests/ijvm.tests.StaticExposer/
    vmkit/trunk/tests/ijvm.tests.StaticExposer/.classpath
    vmkit/trunk/tests/ijvm.tests.StaticExposer/.project
    vmkit/trunk/tests/ijvm.tests.StaticExposer/META-INF/
    vmkit/trunk/tests/ijvm.tests.StaticExposer/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.StaticExposer/build.properties
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/Activator.java
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposer.java
    vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposerImpl.java
    vmkit/trunk/tests/ijvm.tests.loopClient/
    vmkit/trunk/tests/ijvm.tests.loopClient/.classpath
    vmkit/trunk/tests/ijvm.tests.loopClient/.project
    vmkit/trunk/tests/ijvm.tests.loopClient/META-INF/
    vmkit/trunk/tests/ijvm.tests.loopClient/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.loopClient/build.properties
    vmkit/trunk/tests/ijvm.tests.loopClient/src/
    vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/logging/
    vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/logging/InlineFormatter.java
    vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/loopclient/
    vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/loopclient/Activator.java
    vmkit/trunk/tests/ijvm.tests.looper/
    vmkit/trunk/tests/ijvm.tests.looper/.classpath
    vmkit/trunk/tests/ijvm.tests.looper/.project
    vmkit/trunk/tests/ijvm.tests.looper/META-INF/
    vmkit/trunk/tests/ijvm.tests.looper/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.looper/build.properties
    vmkit/trunk/tests/ijvm.tests.looper/src/
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/logging/
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/logging/InlineFormatter.java
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/Activator.java
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/CallBack.java
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopController.java
    vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopControllerImpl.java
    vmkit/trunk/tests/ijvm.tests.tier/
    vmkit/trunk/tests/ijvm.tests.tier/.classpath
    vmkit/trunk/tests/ijvm.tests.tier/.project
    vmkit/trunk/tests/ijvm.tests.tier/META-INF/
    vmkit/trunk/tests/ijvm.tests.tier/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.tier/build.properties
    vmkit/trunk/tests/ijvm.tests.tier/src/
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/logging/
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/logging/InlineFormatter.java
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Activator.java
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/TierService.java
    vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Utility.java
    vmkit/trunk/tests/ijvm.tests.tierImpl/
    vmkit/trunk/tests/ijvm.tests.tierImpl/.classpath
    vmkit/trunk/tests/ijvm.tests.tierImpl/.project
    vmkit/trunk/tests/ijvm.tests.tierImpl/META-INF/
    vmkit/trunk/tests/ijvm.tests.tierImpl/META-INF/MANIFEST.MF
    vmkit/trunk/tests/ijvm.tests.tierImpl/build.properties
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/logging/
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/logging/InlineFormatter.java
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/Activator.java
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/TierServiceImpl.java
    vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/UtilityImpl.java
    vmkit/trunk/tests/minimal.xargs
    vmkit/trunk/tests/sun-jvm-log.txt
Modified:
    vmkit/trunk/CREDITS.TXT
    vmkit/trunk/Makefile.common.in
    vmkit/trunk/Makefile.rules
    vmkit/trunk/include/j3/J3Intrinsics.h
    vmkit/trunk/include/j3/JavaAOTCompiler.h
    vmkit/trunk/include/j3/JavaCompiler.h
    vmkit/trunk/include/j3/JavaJITCompiler.h
    vmkit/trunk/include/j3/JavaLLVMCompiler.h
    vmkit/trunk/include/j3/LLVMInfo.h
    vmkit/trunk/include/vmkit/CollectionRV.h
    vmkit/trunk/include/vmkit/JIT.h
    vmkit/trunk/include/vmkit/Locks.h
    vmkit/trunk/include/vmkit/MethodInfo.h
    vmkit/trunk/include/vmkit/ObjectLocks.h
    vmkit/trunk/include/vmkit/System.h
    vmkit/trunk/include/vmkit/Thread.h
    vmkit/trunk/include/vmkit/UTF8.h
    vmkit/trunk/include/vmkit/VirtualMachine.h
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMObject.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc
    vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThrowable.inc
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h
    vmkit/trunk/lib/j3/Compiler/J3Intrinsics.cpp
    vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/j3/Compiler/JavaJIT.h
    vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/j3/Compiler/JavaLLVMCompiler.cpp
    vmkit/trunk/lib/j3/Compiler/LowerConstantCalls.cpp
    vmkit/trunk/lib/j3/LLVMRuntime/Makefile
    vmkit/trunk/lib/j3/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll
    vmkit/trunk/lib/j3/VMCore/JavaArray.h
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.h
    vmkit/trunk/lib/j3/VMCore/JavaConstantPool.cpp
    vmkit/trunk/lib/j3/VMCore/JavaConstantPool.h
    vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp
    vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
    vmkit/trunk/lib/j3/VMCore/JavaObject.h
    vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
    vmkit/trunk/lib/j3/VMCore/JavaThread.h
    vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/j3/VMCore/Jnjvm.h
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/j3/VMCore/JnjvmConfig.h
    vmkit/trunk/lib/j3/VMCore/LinkJavaRuntime.h
    vmkit/trunk/lib/j3/VMCore/Reader.h
    vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
    vmkit/trunk/lib/vmkit/CommonThread/CollectionRV.cpp
    vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
    vmkit/trunk/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc
    vmkit/trunk/lib/vmkit/CommonThread/Sigsegv.cpp
    vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp
    vmkit/trunk/lib/vmkit/Compiler/JIT.cpp
    vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll
    vmkit/trunk/lib/vmkit/Runtime/MethodInfo.cpp
    vmkit/trunk/lib/vmkit/Runtime/Object.cpp
    vmkit/trunk/lib/vmkit/Runtime/UTF8.cpp
    vmkit/trunk/mmtk/java/build.xml.in
    vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
    vmkit/trunk/mmtk/mmtk-j3/Collection.cpp
    vmkit/trunk/tools/precompiler/trainer/Makefile
    vmkit/trunk/tools/vmjc/vmjc.cpp

Added: vmkit/trunk/.autotools
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/.autotools?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/.autotools (added)
+++ vmkit/trunk/.autotools Thu Apr 25 11:46:36 2013
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configurations>
+<configuration id="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986">
+<option id="configure" value="configure"/>
+<option id="configdir" value=""/>
+<option id="cache-file" value=""/>
+<option id="help" value="false"/>
+<option id="no-create" value="false"/>
+<option id="quiet" value="false"/>
+<option id="version" value="false"/>
+<option id="host" value=""/>
+<option id="build" value=""/>
+<option id="target" value=""/>
+<option id="prefix" value=""/>
+<option id="exec-prefix" value=""/>
+<option id="libdir" value=""/>
+<option id="bindir" value=""/>
+<option id="sbindir" value=""/>
+<option id="includedir" value=""/>
+<option id="datadir" value=""/>
+<option id="sysconfdir" value=""/>
+<option id="infodir" value=""/>
+<option id="mandir" value=""/>
+<option id="srcdir" value=""/>
+<option id="localstatedir" value=""/>
+<option id="sharedstatedir" value=""/>
+<option id="libexecdir" value=""/>
+<option id="oldincludedir" value=""/>
+<option id="program-prefix" value=""/>
+<option id="program-suffix" value=""/>
+<option id="program-transform-name" value=""/>
+<option id="enable-maintainer-mode" value="false"/>
+<flag id="CFLAGS">
+<flagvalue id="cflags-debug" value="false"/>
+<flagvalue id="cflags-gprof" value="false"/>
+<flagvalue id="cflags-gcov" value="false"/>
+</flag>
+<option id="user" value="--with-llvmsrc=/home/koutheir/PhD/VMKit/llvm --with-llvmobj=/home/koutheir/PhD/VMKit/llvm --with-gnu-classpath-libs=/home/koutheir/PhD/VMKit/classpath/lib --with-gnu-classpath-glibj=/usr/local/classpath/share/classpath/glibj.zip"/>
+<option id="autogen" value="autogen.sh"/>
+<option id="autogenOpts" value=""/>
+</configuration>
+</configurations>

Added: vmkit/trunk/.cproject
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/.cproject?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/.cproject (added)
+++ vmkit/trunk/.cproject Thu Apr 25 11:46:36 2013
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986" moduleId="org.eclipse.cdt.core.settings" name="Build (GNU)">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.linuxtools.cdt.autotools.core.buildArtefactType.autotools" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.linuxtools.cdt.autotools.core.buildArtefactType.autotools" cleanCommand="rm -rf" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser" id="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986" name="Build (GNU)" parent="org.eclipse.linuxtools.cdt.autotools.core.configuration.build">
+					<folderInfo id="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986." name="/" resourcePath="">
+						<toolChain id="org.eclipse.linuxtools.cdt.autotools.core.toolChain.584677636" name="GNU Autotools Toolchain" superClass="org.eclipse.linuxtools.cdt.autotools.core.toolChain">
+							<targetPlatform id="org.eclipse.linuxtools.cdt.autotools.core.toolchain.targetPlatform.1925251472" isAbstract="false" name="GNU Autotools Target Platform" superClass="org.eclipse.linuxtools.cdt.autotools.core.toolchain.targetPlatform"/>
+							<builder arguments="-j12 ENABLE_OPTIMIZED=0 REQUIRES_FRAME_POINTER=1 KEEP_SYMBOLS=1 DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1" command="make" id="org.eclipse.linuxtools.cdt.autotools.core.toolchain.builder.801093873" keepEnvironmentInBuildfile="false" managedBuildOn="true" superClass="org.eclipse.linuxtools.cdt.autotools.core.toolchain.builder"/>
+							<tool id="org.eclipse.linuxtools.cdt.autotools.core.gnu.toolchain.tool.configure.618411967" name="configure" superClass="org.eclipse.linuxtools.cdt.autotools.core.gnu.toolchain.tool.configure">
+								<option id="org.eclipse.linuxtools.cdt.autotools.core.option.configure.name.182416725" name="Name" superClass="org.eclipse.linuxtools.cdt.autotools.core.option.configure.name" value="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986" valueType="string"/>
+							</tool>
+							<tool id="org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.autogen.783487933" name="autogen.sh" superClass="org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.autogen"/>
+							<tool id="org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gcc.1530203096" name="GCC C Compiler" superClass="org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gcc">
+								<option id="gnu.c.compiler.option.include.paths.1985077212" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="/home/koutheir/PhD/VMKit/llvm/include"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1841932293" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gpp.1306149644" name="GCC C++ Compiler" superClass="org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gpp">
+								<option id="gnu.cpp.compiler.option.include.paths.195411303" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="/home/koutheir/PhD/VMKit/llvm/include"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.773493973" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="ijvm.org.eclipse.linuxtools.cdt.autotools.core.projectType.1537789838" name="GNU Autotools" projectType="org.eclipse.linuxtools.cdt.autotools.core.projectType"/>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+	<storageModule moduleId="scannerConfiguration">
+		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986;org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986.;org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gcc.1530203096;cdt.managedbuild.tool.gnu.c.compiler.input.1841932293">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986;org.eclipse.linuxtools.cdt.autotools.core.configuration.build.1218053986.;org.eclipse.linuxtools.cdt.autotools.core.toolchain.tool.gpp.1306149644;cdt.managedbuild.tool.gnu.cpp.compiler.input.773493973">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+		</scannerConfigBuildInfo>
+	</storageModule>
+	<storageModule moduleId="refreshScope" versionNumber="1">
+		<resource resourceType="PROJECT" workspacePath="/ijvm"/>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings">
+		<doc-comment-owner id="org.eclipse.cdt.ui.doxygen">
+			<path value=""/>
+		</doc-comment-owner>
+	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
+		<buildTargets/>
+	</storageModule>
+</cproject>

Added: vmkit/trunk/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/.project (added)
+++ vmkit/trunk/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.autotools.core.genmakebuilderV2</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>?name?</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.append_environment</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildArguments</key>
+					<value>-j12 ENABLE_OPTIMIZED=0 REQUIRES_FRAME_POINTER=1 KEEP_SYMBOLS=1 DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.contents</key>
+					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+		<nature>org.eclipse.cdt.autotools.core.autotoolsNatureV2</nature>
+	</natures>
+</projectDescription>

Modified: vmkit/trunk/CREDITS.TXT
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/CREDITS.TXT?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/CREDITS.TXT (original)
+++ vmkit/trunk/CREDITS.TXT Thu Apr 25 11:46:36 2013
@@ -35,3 +35,6 @@ N: Gael Thomas
 E: gael.thomas at lip6.fr
 W: http://lip6.fr/Gael.Thomas/
 D: Primary architect of JnJVM
+
+N: Koutheir Attouchi
+E: koutheir at gmail.com

Modified: vmkit/trunk/Makefile.common.in
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/Makefile.common.in (original)
+++ vmkit/trunk/Makefile.common.in Thu Apr 25 11:46:36 2013
@@ -16,6 +16,47 @@ ifeq ($(BUILD_FRAMETABLE), 1)
   BUILT_SOURCES = FrametablesSymbols.inc FrametablesExterns.inc
 endif
   
+ENABLE_OPTIMIZED	:= 0
+REQUIRES_FRAME_POINTER	:= 1
+
+ifeq ($(ENABLE_OPTIMIZED), 0)
+	CFLAGS			+= -O0
+	CXXFLAGS		+= -O0
+
+	LLC_CPP_FLAGS		:= -O=0
+	LLC_ASM_FLAGS		:= -O=0 -asm-verbose
+	LLC_GLIBJ_FLAGS		:=
+	
+	OPT_BC_WITH_GC_FLAGS	:= -inline
+	OPT_MMTK_FLAGS		:=
+	OPT_VMJC_FLAGS		:= -std-compile-opts
+	
+	VMJC_MMTK_FLAGS		:=
+	VMJC_GLIBJ_FLAGS	:= -jit-emit-debug -std-compile-opts
+	
+	PRECOMPILER_FLAGS	:=
+	
+	KEEP_SYMBOLS		:= 1
+	DEBUG_RUNTIME		:= 1
+	DEBUG_SYMBOLS		:= 1
+else
+	CFLAGS			+= -O2 -g0
+	CXXFLAGS		+= -O2 -g0
+	
+	LLC_CPP_FLAGS		:=
+	LLC_ASM_FLAGS		:= -O=2 -disable-debug-info-print
+	LLC_GLIBJ_FLAGS		:= -disable-debug-info-print
+	
+	OPT_BC_WITH_GC_FLAGS	:= -std-compile-opts -strip-debug
+	OPT_MMTK_FLAGS		:= -std-compile-opts -strip-debug
+	OPT_VMJC_FLAGS		:= -std-compile-opts -strip-debug
+	
+	PRECOMPILER_FLAGS	:= -O3
+	
+	VMJC_MMTK_FLAGS		:= -std-compile-opts
+	VMJC_GLIBJ_FLAGS	:= -std-compile-opts
+endif
+
 # Include LLVM's Master Makefile.
 include $(LLVM_OBJ_ROOT)/Makefile.common
 

Modified: vmkit/trunk/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/Makefile.rules (original)
+++ vmkit/trunk/Makefile.rules Thu Apr 25 11:46:36 2013
@@ -15,7 +15,7 @@ ifdef VMKIT_RUNTIME
 
 LLVMRuntime.inc : $(LLVMAS) $(LLC) $(VMKIT_RUNTIME)
 	$(Echo) "Building LLVM runtime with $(VMKIT_RUNTIME)"
-	$(Verb) cat $(VMKIT_RUNTIME) | $(LLVMAS) -o - | $(LLC) -march=cpp -cppgen=contents -o $@
+	$(Verb) cat $(VMKIT_RUNTIME) | $(LLVMAS) -o - | $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=contents -o $@
 
 all-local:: LLVMRuntime.inc
 
@@ -37,18 +37,18 @@ glibj.zip.s : $(LOPT) $(LLC) $(VMJC)
 glibj.zip.bc :
 	$(Echo) "Compiling glibj.zip to llvm"
 	$(Verb) if test -d $(GLIBJ); then \
-	  $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zip -o glibj.zip.bc; \
+	  $(VMJC) -f $(VMJC_GLIBJ_FLAGS) $(GLIBJ)/glibj.zip -o glibj.zip.bc; \
 	else \
-	  $(VMJC) -f -std-compile-opts $(GLIBJ) -o glibj.zip.bc; \
+	  $(VMJC) -f $(VMJC_GLIBJ_FLAGS) $(GLIBJ) -o glibj.zip.bc; \
 	fi
 	
 glibj-optimized.zip.bc : glibj.zip.bc
 	$(Echo) "Optimizing glibj.zip"
-	$(Verb) $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc
+	$(Verb) $(LOPT) $(OPT_VMJC_FLAGS) -f glibj.zip.bc -o glibj-optimized.zip.bc
 
 glibj.zip.s : glibj-optimized.zip.bc
 	$(Echo) "Compiling glibj.zip.bc to native"
-	$(Verb) $(LLC) -disable-cfi -relocation-model=pic -disable-fp-elim glibj-optimized.zip.bc -o glibj.zip.s
+	$(Verb) $(LLC) $(LLC_GLIBJ_FLAGS) -disable-cfi -relocation-model=pic -disable-fp-elim glibj-optimized.zip.bc -o glibj.zip.s
 
 $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES)
 	$(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG)
@@ -74,20 +74,22 @@ ifeq ($(COMPILE_MMTK), 1)
   all::
 	$(Verb) $(ANT) -buildfile $(PROJ_OBJ_ROOT)/mmtk/java/build.xml
 	$(Echo) Building $(BuildMode) $(JARNAME).jar $(notdir $@)
-	$(Verb) $(LOPT) -load=$(LibDir)/JITGCPass$(SHLIBEXT) -std-compile-opts -JITGCPass -f $(LibDir)/MMTKAlloc.bc -o $(LibDir)/MMTKAlloc.bc
-	$(Verb) $(VMJC) -std-compile-opts -load=$(LibDir)/MMTKRuntime$(SHLIBEXT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled
-	$(Verb) $(LOPT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -std-compile-opts -LowerJavaRT -f $(JARNAME).bc -o $(JARNAME)-optimized.bc
+	$(Verb) $(LOPT) -load=$(LibDir)/JITGCPass$(SHLIBEXT) $(OPT_MMTK_FLAGS) -JITGCPass -f $(LibDir)/MMTKAlloc.bc -o $(LibDir)/MMTKAlloc.bc
+	$(Verb) $(VMJC) $(VMJC_MMTK_FLAGS) -load=$(LibDir)/MMTKRuntime$(SHLIBEXT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled
+	$(Verb) $(LOPT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) $(OPT_MMTK_FLAGS) -LowerJavaRT -f $(JARNAME).bc -o $(JARNAME)-optimized.bc
 	$(Verb) $(LLVMLINK) -o $(LibDir)/FinalMMTk.bc $(LibDir)/MMTKAlloc.bc $(JARNAME)-optimized.bc $(LibDir)/MMTKRuntime.bc
-	$(Verb) $(LOPT) $(LibDir)/FinalMMTk.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) -std-compile-opts -StaticGCPass -o $(LibDir)/FinalMMTk.bc
+	$(Verb) $(LOPT) $(LibDir)/FinalMMTk.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) $(OPT_MMTK_FLAGS) -StaticGCPass -o $(LibDir)/FinalMMTk.bc
 	$(Verb) $(MKDIR) $(ObjDir)
-	$(Verb) $(LLC) -disable-fp-elim -disable-cfi -disable-debug-info-print -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) $(LibDir)/FinalMMTk.bc -o $(ObjDir)/FinalMMTk.s
+	$(Verb) $(LLC) $(LLC_ASM_FLAGS) -disable-fp-elim -disable-cfi -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) $(LibDir)/FinalMMTk.bc -o $(ObjDir)/FinalMMTk.s
+	$(Verb) $(GREP) -v '\.loc[^0-9]\+[0-9]\+ 0' $(ObjDir)/FinalMMTk.s > $(ObjDir)/FinalMMTk.s.remove_invalid_dot_loc
+	$(Verb) $(MV) -f $(ObjDir)/FinalMMTk.s.remove_invalid_dot_loc $(ObjDir)/FinalMMTk.s
 	$(Verb) $(LLVMCC) -c $(ObjDir)/FinalMMTk.s -o $(ObjDir)/FinalMMTk.o
 	$(Verb) $(Archive) $(LibDir)/libFinalMMTk.a $(ObjDir)/FinalMMTk.o
 	$(Verb) $(Ranlib) $(LibDir)/libFinalMMTk.a
-	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=gcmalloc $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkMallocInline.inc
-	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=fieldWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkFieldWriteInline.inc
-	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=arrayWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkArrayWriteInline.inc
-	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=nonHeapWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkNonHeapWriteInline.inc
+	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=gcmalloc $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkMallocInline.inc
+	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=fieldWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkFieldWriteInline.inc
+	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=arrayWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkArrayWriteInline.inc
+	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=nonHeapWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkNonHeapWriteInline.inc
 endif
 
 clean-local::
@@ -108,11 +110,11 @@ AModule           := $(LibDir)/lib$(MODU
 
 $(ObjectsBCWithGC): $(ObjDir)/%_gc.bc: $(ObjDir)/%.ll $(LOPT)
 	$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
-	$(Verb) $(LOPT) $< -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPass$(SHLIBEXT) -std-compile-opts -StaticGCPass -o $@
+	$(Verb) $(LOPT) $< -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPass$(SHLIBEXT) $(OPT_BC_WITH_GC_FLAGS) -StaticGCPass -o $@
 
 $(ObjectsSWithGC): $(ObjDir)/%_gc.s: $(ObjDir)/%_gc.bc $(LLC)
 	$(Echo) "Compiling $*.bc to $*.s for $(BuildMode) build"
-	$(Verb) $(LLC) -disable-cfi -disable-fp-elim -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPrinter$(SHLIBEXT) $< -o $@
+	$(Verb) $(LLC) $(LLC_ASM_FLAGS) -disable-cfi -disable-fp-elim -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPrinter$(SHLIBEXT) $< -o $@
 
 $(ObjectsWithGC): $(ObjDir)/%_gc.o: $(ObjDir)/%_gc.s $(ObjDir)/.dir
 	$(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG)

Added: vmkit/trunk/README.TXT
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/README.TXT?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/README.TXT (added)
+++ vmkit/trunk/README.TXT Thu Apr 25 11:46:36 2013
@@ -0,0 +1,102 @@
+http://llvm.org/docs/GettingStarted.html#checkout
+
+===================
+Prepare the system:
+===================
+apt-get install libgconf2-dev libgtk2.0-dev
+
+# To use OpenJDK:
+# apt-get install default-jre default-jdk
+
+==============
+GNU Classpath:
+==============
+wget http://ftp.gnu.org/gnu/classpath/classpath-0.97.2.tar.gz
+tar zxvf classpath-0.97.2.tar.gz
+ln -s classpath-0.97.2 classpath
+cd classpath
+./configure --disable-plugin --disable-examples --disable-Werror
+make -j12
+cd lib
+ln -sf ../native/jni/gtk-peer/.libs/libgtkpeer.so
+ln -sf ../native/jni/gconf-peer/.libs/libgconfpeer.so
+ln -sf ../native/jni/java-io/.libs/libjavaio.so
+ln -sf ../native/jni/java-lang/.libs/libjavalangreflect.so
+ln -sf ../native/jni/java-lang/.libs/libjavalang.so
+ln -sf ../native/jni/java-net/.libs/libjavanet.so
+ln -sf ../native/jni/java-nio/.libs/libjavanio.so
+ln -sf ../native/jni/java-util/.libs/libjavautil.so
+
+# Go root
+# make install
+
+=====
+LLVM:
+=====
+
+Notice:
+
+LLVM revision 158308 is known to work.
+
+Get it (git):
+
+git clone http://llvm.org/git/llvm.git
+cd llvm/tools
+git clone http://llvm.org/git/clang.git
+cd clang
+git config branch.master.rebase true
+cd ../..
+git config branch.master.rebase true
+
+Get it (svn):
+
+svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
+cd llvm/tools
+svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
+cd ../projects
+svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
+cd ..
+
+Patch it:
+
+cd llvm
+patch -p0 < ../llvm.patch
+
+Make it (release mode):
+
+./configure --enable-optimized --enable-assertions --enable-jit --enable-threads --enable-pthreads --enable-pic --enable-targets=x86,cpp --disable-docs --disable-doxygen
+make -j12 ENABLE_OPTIMIZED=1 BUILD_EXAMPLES=0 ENABLE_DOCS=0
+ln -s Release+Asserts Debug+Asserts
+
+Enable debug compilation:
+
+nano Makefile.config
+# Comment out:
+# ENABLE_OPTIMIZED=1
+# Uncomment:
+# DEBUG_RUNTIME = 1
+# DEBUG_SYMBOLS = 1
+# Insert:
+# KEEP_SYMBOLS=1
+
+Make it (debug mode):
+
+./configure --disable-optimized --enable-assertions --enable-debug-runtime --enable-debug-symbols --enable-keep-symbols --enable-jit --enable-threads --enable-pthreads --enable-pic --enable-targets=x86,cpp --disable-docs --disable-doxygen
+make -j12 ENABLE_OPTIMIZED=0 BUILD_EXAMPLES=0 ENABLE_DOCS=0
+
+======
+VMKit:
+======
+
+Get it (svn):
+
+svn co http://llvm.org/svn/llvm-project/vmkit/trunk vmkit
+
+Get it (git):
+
+git clone git+ssh://koutheir@scm.gforge.inria.fr//gitroot/vmkit2/vmkit2.git
+
+Make it (debug mode):
+
+./configure --with-llvmsrc=/home/koutheir/PhD/VMKit/llvm --with-llvmobj=/home/koutheir/PhD/VMKit/llvm --with-gnu-classpath-libs=/home/koutheir/PhD/VMKit/classpath/lib --with-gnu-classpath-glibj=/usr/local/classpath/share/classpath/glibj.zip
+make -j12 ENABLE_OPTIMIZED=0 REQUIRES_FRAME_POINTER=1 KEEP_SYMBOLS=1 DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1

Modified: vmkit/trunk/include/j3/J3Intrinsics.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/J3Intrinsics.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/j3/J3Intrinsics.h (original)
+++ vmkit/trunk/include/j3/J3Intrinsics.h Thu Apr 25 11:46:36 2013
@@ -30,7 +30,9 @@ public:
   llvm::Type* JavaArrayDoubleType;
   llvm::Type* JavaArrayObjectType;
   
+  llvm::Type* ExceptionBufferType;
   llvm::Type* VTType;
+  llvm::Type* JavaVTType;
   llvm::Type* JavaObjectType;
   llvm::Type* JavaArrayType;
   llvm::Type* JavaCommonClassType;
@@ -43,7 +45,7 @@ public:
   llvm::Type* UTF8Type;
   llvm::Type* JavaMethodType;
   llvm::Type* JavaFieldType;
-  llvm::Type* AttributType;
+  llvm::Type* AttributeType;
   llvm::Type* JavaThreadType;
   llvm::Type* MutatorThreadType;
   llvm::Type* J3DenseMapType;
@@ -58,6 +60,7 @@ public:
   llvm::Function* PrintMethodEndFunction;
   llvm::Function* InitialiseClassFunction;
   llvm::Function* InitialisationCheckFunction;
+  llvm::Function* InitialisationCheckForJavaObjectFunction;
   llvm::Function* ForceInitialisationCheckFunction;
   llvm::Function* ForceLoadedCheckFunction;
   llvm::Function* ClassLookupFunction;
@@ -81,6 +84,10 @@ public:
   llvm::Function* MultiCallNewFunction;
   llvm::Function* GetArrayClassFunction;
 
+//  llvm::Function *CodeMarker1Function, *CodeMarker2Function;
+  llvm::Function* SetIsolateFunction;
+  llvm::Function* GetCachedValueFunction;
+  llvm::Function* GetClassDelegateePtrFunction;
   llvm::Function* GetClassDelegateeFunction;
   llvm::Function* RuntimeDelegateeFunction;
   llvm::Function* ArrayLengthFunction;
@@ -116,6 +123,8 @@ public:
   llvm::Constant* OffsetStaticInstanceInTaskClassMirrorConstant;
   llvm::Constant* OffsetInitializedInTaskClassMirrorConstant;
   llvm::Constant* OffsetStatusInTaskClassMirrorConstant;
+  llvm::Constant* OffsetCommonClassInClassConstant;
+  llvm::Constant* OffsetCommonClassInJavaVirtualTableConstant;
   
   llvm::Constant* OffsetDoYieldInThreadConstant;
   llvm::Constant* OffsetIsolateIDInThreadConstant;
@@ -149,6 +158,11 @@ public:
   llvm::Function* ArrayStoreExceptionFunction;
   llvm::Function* ArithmeticExceptionFunction;
   llvm::Function* ThrowExceptionFromJITFunction;
+
+  llvm::Constant* CurrentIsolateID;
+  llvm::Constant* OffsetHandlerMethodInExceptionBufferConstant;
+  llvm::Constant* OffsetHandlerIsolateIDInExceptionBufferConstant;
+  llvm::Constant* OffsetSetJmpBufferInExceptionBufferConstant;
 };
 
 }

Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Thu Apr 25 11:46:36 2013
@@ -17,7 +17,7 @@
 namespace j3 {
 
 class ArrayObject;
-class Attribut;
+class JavaAttribute;
 class ClassBytes;
 class JnjvmBootstrapLoader;
 
@@ -26,7 +26,7 @@ using vmkit::UTF8;
 class JavaAOTCompiler : public JavaLLVMCompiler {
 
 public:
-  JavaAOTCompiler(const std::string &ModuleID);
+  JavaAOTCompiler(const std::string &ModuleID, bool compilingMMTk=false);
   
   virtual bool isStaticCompiling() {
     return true;
@@ -36,8 +36,8 @@ public:
     return true;
   }
   
-  virtual JavaCompiler* Create(const std::string& ModuleID) {
-    return new JavaAOTCompiler(ModuleID);
+  virtual JavaCompiler* Create(const std::string& ModuleID, bool compilingMMTk=false) {
+    return new JavaAOTCompiler(ModuleID, compilingMMTk);
   }
   
   virtual void* materializeFunction(JavaMethod* meth, Class* customizeFor) {
@@ -64,7 +64,7 @@ public:
   virtual llvm::Constant* getClassBytes(const UTF8* name, ClassBytes* bytes);
   virtual llvm::Constant* getJavaClass(CommonClass* cl);
   virtual llvm::Constant* getJavaClassPtr(CommonClass* cl);
-  virtual llvm::Constant* getStaticInstance(Class* cl);
+  virtual llvm::Constant* getStaticInstance(Class* cl, isolate_id_t isolateID = CURRENT_ISOLATE);
   virtual llvm::Constant* getVirtualTable(JavaVirtualTable*);
   virtual llvm::Constant* getMethodInClass(JavaMethod* meth);
   
@@ -83,16 +83,17 @@ public:
 private:
 
   //--------------- Static compiler specific functions -----------------------//
+  llvm::Constant* CreateConstantFromTaskClassMirrorArray(Class* cl);
   llvm::Constant* CreateConstantFromVT(JavaVirtualTable* VT);
   llvm::Constant* CreateConstantFromUTF8(const UTF8* val);
   llvm::Constant* CreateConstantFromCommonClass(CommonClass* cl);
   llvm::Constant* CreateConstantFromClass(Class* cl);
   llvm::Constant* CreateConstantFromClassPrimitive(ClassPrimitive* cl);
   llvm::Constant* CreateConstantFromClassArray(ClassArray* cl);
-  llvm::Constant* CreateConstantFromAttribut(Attribut& attribut);
+  llvm::Constant* CreateConstantFromAttribute(JavaAttribute& attribute);
   llvm::Constant* CreateConstantFromJavaField(JavaField& field);
   llvm::Constant* CreateConstantFromJavaMethod(JavaMethod& method);
-  llvm::Constant* CreateConstantFromStaticInstance(Class* cl);
+  llvm::Constant* CreateConstantFromStaticInstance(Class* cl, isolate_id_t isolateID = CURRENT_ISOLATE);
   llvm::Constant* CreateConstantFromJavaString(JavaString* str);
   llvm::Constant* CreateConstantForBaseObject(CommonClass* cl);
   llvm::Constant* CreateConstantFromJavaObject(JavaObject* obj);
@@ -116,7 +117,7 @@ private:
   std::map<const ClassArray*, llvm::GlobalVariable*> arrayClasses;
   std::map<const CommonClass*, llvm::Constant*> javaClasses;
   std::map<const JavaVirtualTable*, llvm::Constant*> virtualTables;
-  std::map<const Class*, llvm::Constant*> staticInstances;
+  std::map<const Class*, llvm::Constant*> taskClassMirrors;
   std::map<const JavaConstantPool*, llvm::Constant*> resolvedConstantPools;
   std::map<const JavaString*, llvm::Constant*> strings;
   std::map<const JavaMethod*, llvm::Constant*> nativeFunctions;
@@ -151,7 +152,7 @@ private:
     virtual_table_iterator;
   
   typedef std::map<const Class*, llvm::Constant*>::iterator
-    static_instance_iterator;
+    task_class_mirror_iterator;
   
   typedef std::map<const JavaConstantPool*, llvm::Constant*>::iterator
     resolved_constant_pool_iterator;

Modified: vmkit/trunk/include/j3/JavaCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaCompiler.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaCompiler.h Thu Apr 25 11:46:36 2013
@@ -36,7 +36,7 @@ public:
   
   vmkit::BumpPtrAllocator allocator;
 
-  virtual JavaCompiler* Create(const std::string&) {
+  virtual JavaCompiler* Create(const std::string&, bool compilingMMTk=false) {
     return this;
   }
   

Modified: vmkit/trunk/include/j3/JavaJITCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaJITCompiler.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaJITCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaJITCompiler.h Thu Apr 25 11:46:36 2013
@@ -41,7 +41,7 @@ public:
   llvm::ExecutionEngine* executionEngine;
   llvm::GCModuleInfo* GCInfo;
 
-  JavaJITCompiler(const std::string &ModuleID);
+  JavaJITCompiler(const std::string &ModuleID, bool compilingMMTk=false);
   ~JavaJITCompiler();
   
   virtual bool isStaticCompiling() {
@@ -64,7 +64,7 @@ public:
   virtual llvm::Constant* getNativeClass(CommonClass* cl);
   virtual llvm::Constant* getJavaClass(CommonClass* cl);
   virtual llvm::Constant* getJavaClassPtr(CommonClass* cl);
-  virtual llvm::Constant* getStaticInstance(Class* cl);
+  virtual llvm::Constant* getStaticInstance(Class* cl, isolate_id_t isolateID = CURRENT_ISOLATE);
   virtual llvm::Constant* getVirtualTable(JavaVirtualTable*);
   virtual llvm::Constant* getMethodInClass(JavaMethod* meth);
   
@@ -79,7 +79,7 @@ public:
                                    bool stat, llvm::BasicBlock* insert) = 0;
   virtual word_t getPointerOrStub(JavaMethod& meth, int type) = 0;
 
-  static JavaJITCompiler* CreateCompiler(const std::string& ModuleID);
+  static JavaJITCompiler* CreateCompiler(const std::string& ModuleID, bool compilingMMTk=false);
 };
 
 class JavaJ3LazyJITCompiler : public JavaJITCompiler {
@@ -89,11 +89,11 @@ public:
                                    bool stat, llvm::BasicBlock* insert);
   virtual word_t getPointerOrStub(JavaMethod& meth, int side);
   
-  virtual JavaCompiler* Create(const std::string& ModuleID) {
-    return new JavaJ3LazyJITCompiler(ModuleID);
+  virtual JavaCompiler* Create(const std::string& ModuleID, bool compilingMMTk=false) {
+    return new JavaJ3LazyJITCompiler(ModuleID, compilingMMTk);
   }
 
-  JavaJ3LazyJITCompiler(const std::string& ModuleID);
+  JavaJ3LazyJITCompiler(const std::string& ModuleID, bool compilingMMTk=false);
 };
 
 } // end namespace j3

Modified: vmkit/trunk/include/j3/JavaLLVMCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaLLVMCompiler.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaLLVMCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaLLVMCompiler.h Thu Apr 25 11:46:36 2013
@@ -52,6 +52,7 @@ protected:
   llvm::DIBuilder* DebugFactory;  
   J3Intrinsics JavaIntrinsics;
   const llvm::TargetData* TheTargetData;
+  bool compilingMMTk;
 
 private:  
   bool enabledException;
@@ -84,8 +85,9 @@ private:
   llvm::DenseMap<llvm::FunctionType*, llvm::Function*> staticAPs;
 
 public:
-  JavaLLVMCompiler(const std::string &ModuleID);
-  
+  JavaLLVMCompiler(const std::string &ModuleID, bool compilingMMTk=false);
+
+  bool isCompilingMMTk() {return compilingMMTk;}
   virtual bool isStaticCompiling() = 0;
   virtual bool emitFunctionName() = 0;
   virtual void* GenerateStub(llvm::Function* F) = 0;
@@ -123,7 +125,7 @@ public:
     cooperativeGC = false;
   }
  
-  virtual JavaCompiler* Create(const std::string& ModuleID) = 0;
+  virtual JavaCompiler* Create(const std::string& ModuleID, bool compilingMMTk=false) = 0;
   
   virtual ~JavaLLVMCompiler();
 
@@ -194,7 +196,7 @@ public:
   virtual llvm::Constant* getNativeClass(CommonClass* cl) = 0;
   virtual llvm::Constant* getJavaClass(CommonClass* cl) = 0;
   virtual llvm::Constant* getJavaClassPtr(CommonClass* cl) = 0;
-  virtual llvm::Constant* getStaticInstance(Class* cl) = 0;
+  virtual llvm::Constant* getStaticInstance(Class* cl, isolate_id_t isolateID = CURRENT_ISOLATE) = 0;
   virtual llvm::Constant* getVirtualTable(JavaVirtualTable*) = 0;
   virtual llvm::Constant* getMethodInClass(JavaMethod* meth) = 0;
   

Modified: vmkit/trunk/include/j3/LLVMInfo.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/LLVMInfo.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/j3/LLVMInfo.h (original)
+++ vmkit/trunk/include/j3/LLVMInfo.h Thu Apr 25 11:46:36 2013
@@ -86,7 +86,7 @@ private:
   llvm::Constant* offsetConstant;
   llvm::FunctionType* functionType;
   std::map<Class*, llvm::Function*> customizedVersions;
-  
+
 public:
   llvm::Function* getMethod(Class* customizeFor);
   llvm::Constant* getOffset();
@@ -107,6 +107,10 @@ public:
 
   void setCustomizedVersion(Class* customizeFor, llvm::Function* F);
 
+  typedef std::map<Class*, llvm::Function*>	customizedVersionsType;
+  typedef customizedVersionsType::iterator	customizedVersionsIterator;
+  customizedVersionsType* getCustomizedVersions() {return &customizedVersions;}
+
   friend class JavaAOTCompiler;
 };
 

Modified: vmkit/trunk/include/vmkit/CollectionRV.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/CollectionRV.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/CollectionRV.h (original)
+++ vmkit/trunk/include/vmkit/CollectionRV.h Thu Apr 25 11:46:36 2013
@@ -62,7 +62,7 @@ public:
   virtual void synchronize() = 0;
 
   virtual void join() = 0;
-  virtual void joinAfterUncooperative(word_t SP) = 0;
+  virtual void joinAfterUncooperative(void* SP) = 0;
   virtual void joinBeforeUncooperative() = 0;
 
   virtual void addThread(Thread* th) = 0;
@@ -74,7 +74,7 @@ public:
   void synchronize();
 
   void join();
-  void joinAfterUncooperative(word_t SP);
+  void joinAfterUncooperative(void* SP);
   void joinBeforeUncooperative();
   void addThread(Thread* th);
 

Modified: vmkit/trunk/include/vmkit/JIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/JIT.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/JIT.h (original)
+++ vmkit/trunk/include/vmkit/JIT.h Thu Apr 25 11:46:36 2013
@@ -154,6 +154,7 @@ public:
   llvm::Constant* constantFloatMinusZero;
   llvm::Constant* constantDoubleMinusZero;
   llvm::Constant* constantPtrNull;
+  llvm::Constant* constantPtr32Null;
   llvm::Constant* constantPtrLogSize;
   llvm::Constant* constantThreadIDMask;
   llvm::Constant* constantStackOverflowMask;

Modified: vmkit/trunk/include/vmkit/Locks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/Locks.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/Locks.h (original)
+++ vmkit/trunk/include/vmkit/Locks.h Thu Apr 25 11:46:36 2013
@@ -175,6 +175,19 @@ public:
   void unlock() { release(); }
 };
 
+class LockGuard
+{
+protected:
+	Lock& lock;
+
+private:	//Disable these consructors
+	LockGuard();
+	LockGuard(const LockGuard&);
+
+public:
+	inline LockGuard(Lock& l) : lock(l) {lock.lock();}
+	virtual ~LockGuard() {lock.unlock();}
+};
 
 } // end namespace vmkit
 

Modified: vmkit/trunk/include/vmkit/MethodInfo.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/MethodInfo.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/MethodInfo.h (original)
+++ vmkit/trunk/include/vmkit/MethodInfo.h Thu Apr 25 11:46:36 2013
@@ -19,7 +19,7 @@ namespace vmkit {
 class FrameInfo {
 public:
   void* Metadata;
-  word_t ReturnAddress;
+  void* ReturnAddress;
   uint16_t SourceIndex;
   uint16_t FrameSize;
   uint16_t NumLiveOffsets;
@@ -28,9 +28,9 @@ public:
  
 class MethodInfoHelper {
 public:
-  static void print(word_t ip, word_t addr);
+  static void print(void* ip, void* callFrame);
 
-  static void scan(word_t closure, FrameInfo* FI, word_t ip, word_t addr);
+  static void scan(word_t closure, FrameInfo* FI, void* ip, void* callFrame);
   
   static uint32_t FrameInfoSize(uint32_t NumOffsets) {
     uint32_t FrameInfoSize = sizeof(FrameInfo) + (NumOffsets - 1) * sizeof(int16_t);

Modified: vmkit/trunk/include/vmkit/ObjectLocks.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/ObjectLocks.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/ObjectLocks.h (original)
+++ vmkit/trunk/include/vmkit/ObjectLocks.h Thu Apr 25 11:46:36 2013
@@ -59,7 +59,7 @@ public:
     state = StateRunning;
   }
 
-  bool wait(gc* object, LockSystem& table, struct timeval* info, bool timed);
+  bool wait(gc* object, LockSystem& table, struct timeval* info, bool& timed);
   void notify(gc* object, LockSystem& table);
   void notifyAll(gc* object, LockSystem& table);
 };

Modified: vmkit/trunk/include/vmkit/System.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/System.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/System.h (original)
+++ vmkit/trunk/include/vmkit/System.h Thu Apr 25 11:46:36 2013
@@ -95,7 +95,7 @@ const word_t kVmkitThreadMask = 0xF00000
 
 const word_t kGCMemorySize = 0x30000000;  
 
-#define TRY { vmkit::ExceptionBuffer __buffer__; if (!SETJMP(__buffer__.buffer))
+#define TRY { vmkit::ExceptionBuffer __buffer__; if (!SETJMP(__buffer__.getSetJmpBuffer()))
 #define CATCH else
 #define IGNORE else { vmkit::Thread::get()->clearException(); }}
 #define END_CATCH }
@@ -124,8 +124,8 @@ public:
     return ptr;
   }
 
-  static word_t GetAlternativeStackSize() {
-    static word_t size = PageAlignUp(SIGSTKSZ);
+  static size_t GetAlternativeStackSize() {
+    static size_t size = PageAlignUp(SIGSTKSZ);
     return size;
   }
 
@@ -144,31 +144,11 @@ public:
     return kThreadStart;
   }
 
-  static uint32_t GetPageSize() {
-    static uint32_t pagesize = getpagesize();
+  static size_t GetPageSize() {
+    static size_t pagesize = getpagesize();
     return pagesize;
   }
 
-  static word_t GetCallerAddress() {
-#if defined(ARCH_X86) || defined(ARCH_X64)
-    return (word_t)__builtin_frame_address(0);
-#else
-    return ((word_t*)__builtin_frame_address(0))[0];
-#endif
-  }
-
-  static word_t GetCallerOfAddress(word_t addr) {
-    return ((word_t*)addr)[0];
-  }
-
-  static word_t GetIPFromCallerAddress(word_t addr) {
-#if defined(MACOS_OS) && defined(ARCH_PPC)
-    return ((word_t*)addr)[2];
-#else
-    return ((word_t*)addr)[1];
-#endif
-  }
-
   static int SetJmp(jmp_buf buffer) {
 #if defined(MACOS_OS)
     return _setjmp(buffer);

Modified: vmkit/trunk/include/vmkit/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/Thread.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/Thread.h (original)
+++ vmkit/trunk/include/vmkit/Thread.h Thu Apr 25 11:46:36 2013
@@ -19,11 +19,114 @@
 
 #include "vmkit/System.h"
 
+typedef uint32_t				isolate_id_t;
+#define CURRENT_ISOLATE			((isolate_id_t)(-1))
+#define IsValidIsolateID(iid)	((iid) != CURRENT_ISOLATE)
 
 namespace vmkit {
 
 class FrameInfo;
 class VirtualMachine;
+class Thread;
+
+
+class KnownFrame {
+public:
+  void* currentFP;
+  void* currentIP;
+  KnownFrame* previousFrame;
+};
+
+
+enum StackWalkerState {
+	StackWalkerInvalid = 0,
+	StackWalkerValid,
+	StackWalkerValidMetadata
+};
+
+/// StackWalker - This class walks the stack of threads, returning a FrameInfo
+/// object at each iteration.
+///
+class StackWalker
+{
+protected:
+  void* callFrame;
+  KnownFrame* frame;
+  vmkit::Thread* thread;
+  bool onlyReportMetadataEnabledFrames;
+
+public:
+  StackWalker(vmkit::Thread* th, bool only_report_metadata_enabled_frames = false);
+  StackWalker(const StackWalker& obj, bool reset = false);
+
+  StackWalker& operator = (const StackWalker& obj);
+  bool operator == (const StackWalker& obj) const {return (thread == obj.thread) && (callFrame == obj.callFrame);}
+  bool operator != (const StackWalker& obj) const {return !((*this) == obj);}
+  void operator++();
+  void operator--();
+  void* operator*();
+  FrameInfo* get();
+  const FrameInfo* get() const {return const_cast<StackWalker*>(this)->get();}
+  void reset() __attribute__ ((noinline));
+
+  void* getCallFrame() const				{return callFrame;}
+  void* getCallerCallFrame() const;
+  void* getReturnAddress() const			{return getReturnAddressFromCallFrame(callFrame);}
+  KnownFrame* getKnownFrame()				{return frame;}
+  vmkit::Thread* getScannedThread() const	{return thread;}
+  StackWalkerState getState() const;
+  bool isValid() const						{return getState() >= StackWalkerValid;}
+  bool hasMetaData() const					{return getState() == StackWalkerValidMetadata;}
+
+  void* updateReturnAddress(void* newAddr);
+  void* updateCallerFrameAddress(void* newAddr);
+
+  bool isReportingOnlyMetadataEnabledFrames() const {return onlyReportMetadataEnabledFrames;}
+  void reportOnlyMetadataEnabledFrames(bool only_report_metadata_enabled_frames) {onlyReportMetadataEnabledFrames = only_report_metadata_enabled_frames;}
+
+  void dump() const;
+
+  static void* getCallerCallFrameAddress(void* callFrame);
+  static void** getReturnAddressPtrFromCallFrame(void* callFrame);
+  static void* getReturnAddressFromCallFrame(void* callFrame);
+
+#if defined(ARCH_X86) || defined(ARCH_X64)
+#define StackWalker_getCallFrameAddress()	((void*)(__builtin_frame_address(0)))
+#else
+#define StackWalker_getCallFrameAddress()	(*(void**)__builtin_frame_address(0))
+#endif
+
+};
+
+
+class ExceptionBuffer {
+protected:
+	/*
+		WARNING:
+		- Do not change the fields order or type, unless you update LLVM data types.
+		- Do not declare anything as virtual (to avoid generating a Virtual Table).
+	*/
+	void* handlerMethod;
+	uint32_t handlerIsolateID;
+	ExceptionBuffer* previousBuffer;
+	jmp_buf buffer;
+
+public:
+  ExceptionBuffer();
+  ~ExceptionBuffer() {removeFromThreadExceptionList();}
+
+  void addToThreadExceptionList(void* returnAddr);
+  void removeFromThreadExceptionList();
+
+  void* getHandlerMethod() const {return handlerMethod;}
+  isolate_id_t getHandlerIsolateID() const {return handlerIsolateID;}
+
+  ExceptionBuffer* getPrevious() {return previousBuffer;}
+  void setPrevious(ExceptionBuffer* newValue) {previousBuffer = newValue;}
+
+  jmp_buf& getSetJmpBuffer() {return buffer;}
+};
+
 
 /// CircularBase - This class represents a circular list. Classes that extend
 /// this class automatically place their instances in a circular list.
@@ -99,14 +202,6 @@ public:
 };
 
 
-class KnownFrame {
-public:
-  word_t currentFP;
-  word_t currentIP;
-  KnownFrame* previousFrame;
-};
-
-
 class ExceptionBuffer;
 
 /// Thread - This class is the base of custom virtual machines' Thread classes.
@@ -117,6 +212,7 @@ public:
   Thread() {
     lastExceptionBuffer = 0;
     lastKnownFrame = 0;
+    runningDeadIsolate = false;
   }
 
   /// yield - Yield the processor to another thread.
@@ -143,17 +239,18 @@ public:
     return (uint64_t)this;
   }
  
-public:
+protected:
 
   /// IsolateID - The Isolate ID of the thread's VM.
-  size_t IsolateID;
+  isolate_id_t isolateID;
 
+public:
   /// MyVM - The VM attached to this Thread.
   VirtualMachine* MyVM;
 
   /// baseSP - The base stack pointer.
   ///
-  word_t baseSP;
+  void* baseSP;
  
   /// doYield - Flag to tell the thread to yield for GC reasons.
   ///
@@ -170,7 +267,7 @@ public:
   /// get - Get the thread specific data of the current thread.
   ///
   static Thread* get() {
-    return (Thread*)(System::GetCallerAddress() & System::GetThreadIDMask());
+    return (Thread*)((word_t)StackWalker_getCallFrameAddress() & System::GetThreadIDMask());
   }
   
 private:
@@ -179,13 +276,13 @@ private:
   /// interrupted, lastSP is not null and contains the value of the
   /// stack pointer before entering native.
   ///
-  word_t lastSP;
+  void* lastSP;
  
   /// internalThreadID - The implementation specific thread id.
   ///
   void* internalThreadID;
   
-  /// internalThreadStart - The implementation sepcific thread starter
+  /// internalThreadStart - The implementation specific thread starter
   /// function.
   ///
   static void internalThreadStart(vmkit::Thread* th);
@@ -196,22 +293,32 @@ private:
 
 public:
  
+  isolate_id_t getIsolateID() const;
+  void setIsolateID(isolate_id_t newIsolateID);
+  static isolate_id_t getValidIsolateID(isolate_id_t isolateID);
+
+  bool runsDeadIsolate() const;
+  void markRunningDeadIsolate();
+  void setDeadIsolateID();
+
+  bool isCurrentThread();
+
   /// tracer - Does nothing. Used for child classes which may defined
   /// a tracer.
   ///
   virtual void tracer(word_t closure) {}
   void scanStack(word_t closure);
   
-  word_t getLastSP() { return lastSP; }
-  void  setLastSP(word_t V) { lastSP = V; }
+  void* getLastSP() { return lastSP; }
+  void  setLastSP(void* V) { lastSP = V; }
   
   void joinRVBeforeEnter();
-  void joinRVAfterLeave(word_t savedSP);
+  void joinRVAfterLeave(void* savedSP);
 
   void enterUncooperativeCode(uint16_t level = 0) __attribute__ ((noinline));
-  void enterUncooperativeCode(word_t SP);
+  void enterUncooperativeCode(void* SP);
   void leaveUncooperativeCode();
-  word_t waitOnSP();
+  void* waitOnSP();
 
 
   /// clearException - Clear any pending exception of the current thread.
@@ -219,7 +326,7 @@ public:
     internalClearException();
   }
 
-  bool isVmkitThread() {
+  bool isVmkitThread() const {
     if (!baseAddr) return false;
     else return (((word_t)this) & System::GetVmkitThreadMask()) == baseAddr;
   }
@@ -236,7 +343,7 @@ public:
   /// stackOverflow - Returns if there is a stack overflow in Java land.
   ///
   bool stackOverflow() {
-    return (System::GetCallerAddress() & StackOverflowMask) == 0;
+    return ((word_t)StackWalker_getCallFrameAddress() & StackOverflowMask) == 0;
   }
 
   /// operator new - Allocate the Thread object as well as the stack for this
@@ -259,7 +366,7 @@ public:
  
   /// getFrameContext - Fill the buffer with frames currently on the stack.
   ///
-  void getFrameContext(word_t* buffer);
+  void getFrameContext(void** buffer);
   
   /// getFrameContextLength - Get the length of the frame context.
   ///
@@ -280,62 +387,27 @@ public:
   void startUnknownFrame(KnownFrame& F) __attribute__ ((noinline));
   void endUnknownFrame();
 
-  word_t GetAlternativeStackEnd() {
-    return (word_t)this + System::GetPageSize();
-  }
-
-  word_t GetAlternativeStackStart() {
-    return GetAlternativeStackEnd() + System::GetAlternativeStackSize();
-  }
-
-  bool IsStackOverflowAddr(word_t addr) {
-    word_t stackOverflowCheck = GetAlternativeStackStart();
-    return addr > stackOverflowCheck &&
-      addr <= stackOverflowCheck + System::GetPageSize();
-  }
-};
-
-class ExceptionBuffer {
-public:
-  ExceptionBuffer() {
-    init();
-  }
-
-  void init() {
-    Thread* th = Thread::get();
-    previousBuffer = th->lastExceptionBuffer;
-    th->lastExceptionBuffer = this;
+  void* GetAlternativeStackEnd() {
+    return (void*)((intptr_t)this + System::GetPageSize());
   }
 
-  ~ExceptionBuffer() {
-    remove();
+  void* GetAlternativeStackStart() {
+    return (void*)((intptr_t)GetAlternativeStackEnd() + System::GetAlternativeStackSize());
   }
 
-  void remove() {
-    Thread* th = Thread::get();
-    assert(th->lastExceptionBuffer == this && "Wrong exception buffer");
-    th->lastExceptionBuffer = previousBuffer;
+  bool IsStackOverflowAddr(void* addr) {
+    void* stackOverflowCheck = GetAlternativeStackStart();
+    return (addr > stackOverflowCheck) &&
+      addr <= (void*)((intptr_t)stackOverflowCheck + System::GetPageSize());
   }
 
-  jmp_buf buffer;
-  ExceptionBuffer* previousBuffer;
-};
-
-/// StackWalker - This class walks the stack of threads, returning a FrameInfo
-/// object at each iteration.
-///
-class StackWalker {
-public:
-  word_t addr;
-  word_t ip;
-  KnownFrame* frame;
-  vmkit::Thread* thread;
+  virtual void throwNullPointerException(void* methodIP) const;
+  virtual void throwDeadIsolateException() const {}
 
-  StackWalker(vmkit::Thread* th) __attribute__ ((noinline));
-  void operator++();
-  word_t operator*();
-  FrameInfo* get();
+  virtual void runAfterLeavingGarbageCollectorRendezVous() {}
 
+protected:
+  bool runningDeadIsolate;
 };
 
 

Modified: vmkit/trunk/include/vmkit/UTF8.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/UTF8.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/UTF8.h (original)
+++ vmkit/trunk/include/vmkit/UTF8.h Thu Apr 25 11:46:36 2013
@@ -2,6 +2,8 @@
 #define _UTF8_INTERNAL_H_
 
 #include <map>
+#include <iostream>
+#include <string>
 #include "vmkit/Allocator.h"
 #include "vmkit/VmkitDenseMap.h"
 #include "vmkit/VmkitDenseSet.h"
@@ -22,7 +24,7 @@ private:
   
 public:
   /// size - The (constant) size of the UTF8.
-  ssize_t size;
+  int32_t size;
 
   /// elements - Elements of this UTF8.
   /// The size should be set to zero, but this is invalid C99.
@@ -61,6 +63,11 @@ public:
   UTF8(sint32 n) {
     size = n;
   }
+
+  std::string toString() const;
+  friend std::ostream& operator << (std::ostream& out, const UTF8& utf8) {return out << utf8.toString();}
+  void dump() const __attribute__((noinline));
+  int compare(const char *) const;
 };
 
 extern "C" const UTF8 TombstoneKey;

Modified: vmkit/trunk/include/vmkit/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/vmkit/VirtualMachine.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/include/vmkit/VirtualMachine.h (original)
+++ vmkit/trunk/include/vmkit/VirtualMachine.h Thu Apr 25 11:46:36 2013
@@ -32,7 +32,7 @@ public:
   /// used when walking the stack so that VMKit knows which applicative method
   /// is executing on the stack.
   ///
-  llvm::DenseMap<word_t, FrameInfo*> Functions;
+  llvm::DenseMap<void*, FrameInfo*> Functions;
 
   /// FunctionMapLock - Spin lock to protect the Functions map.
   ///
@@ -40,12 +40,12 @@ public:
 
   /// IPToFrameInfo - Map a code start instruction instruction to the FrameInfo.
   ///
-  FrameInfo* IPToFrameInfo(word_t ip);
+  FrameInfo* IPToFrameInfo(void* ip);
 
   /// addFrameInfo - A new instruction pointer in the function map.
   ///
-  void addFrameInfo(word_t ip, FrameInfo* meth);
-  void addFrameInfoNoLock(word_t ip, FrameInfo* meth) {
+  void addFrameInfo(void* ip, FrameInfo* meth);
+  void addFrameInfoNoLock(void* ip, FrameInfo* meth) {
     Functions[ip] = meth;
   }
   /// removeFrameInfos - Remove all FrameInfo owned by the given owner.
@@ -160,6 +160,7 @@ public:
   /// endCollection - Code after running a GC.
   ///
   virtual void endCollection() {}
+  virtual void endCollectionBeforeUnblockingThreads() {}
   
   /// scanWeakReferencesQueue - Scan all weak references. Called by the GC
   /// before scanning the finalization queue.
@@ -199,6 +200,8 @@ public:
   ///
   virtual const char* getObjectTypeName(gc* object) { return "An object"; }
 
+  virtual bool resetDeadIsolateReference(void* source, void** objectRef) {return false;}
+
   /// rendezvous - The rendezvous implementation for garbage collection.
   ///
   CooperativeCollectionRV rendezvous;
@@ -208,14 +211,15 @@ public:
 //===----------------------------------------------------------------------===//
 
   FunctionMap FunctionsCache;
-  FrameInfo* IPToFrameInfo(word_t ip) {
+  FrameInfo* IPToFrameInfo(void* ip) {
     return FunctionsCache.IPToFrameInfo(ip);
   }
   void removeFrameInfos(void* owner) {
     FunctionsCache.removeFrameInfos(owner);
   }
 
-  virtual void printMethod(FrameInfo* FI, word_t ip, word_t addr) = 0;
+  virtual void printMethod(FrameInfo* FI, void* ip, void* callFrame) = 0;
+  virtual void printCallStack(const StackWalker& walker) = 0;
   
 //===----------------------------------------------------------------------===//
 // (4) Launch-related methods.
@@ -231,6 +235,7 @@ public:
 
   virtual void nullPointerException() = 0;
   virtual void stackOverflowError() = 0;
+  virtual void deadIsolateException(void* methodIP, bool immediate = true) = 0;
 };
 
 } // end namespace vmkit

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.cpp Thu Apr 25 11:46:36 2013
@@ -76,4 +76,12 @@ JavaObjectField* JavaObjectField::create
 
   return ret;
 }
+
+UserClass* JavaObjectConstructor::getClass(JavaObjectConstructor* self)
+{
+  llvm_gcroot(self, 0);
+  UserCommonClass* cls = JavaObjectClass::getClass(self->declaringClass);
+  return cls->asClass();
+}
+
 }

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathReflect.h Thu Apr 25 11:46:36 2013
@@ -138,11 +138,7 @@ public:
   
   static JavaMethod* getInternalMethod(JavaObjectConstructor* self);
   
-  static UserClass* getClass(JavaObjectConstructor* self) {
-    llvm_gcroot(self, 0);
-    UserCommonClass* cls = JavaObjectClass::getClass(self->declaringClass); 
-    return cls->asClass();
-  }
+  static UserClass* getClass(JavaObjectConstructor* self);
 
   static JavaObjectConstructor* createFromInternalConstructor(JavaMethod* cons, int i);
 };
@@ -161,9 +157,18 @@ public:
   static void setVmdata(JavaObjectVMThread* vmthread,
                         JavaThread* internal_thread) {
     llvm_gcroot(vmthread, 0);
+    assert(internal_thread && "Invalid internal thread");
     vmthread->vmdata = internal_thread;
   }
 
+  friend std::ostream& operator << (std::ostream& os, JavaObjectVMThread& threadObj)
+  {
+	  for (int retries = 10; (!threadObj.vmdata) && (retries >= 0); --retries)
+		  usleep(100);
+	  if (!threadObj.vmdata)
+		  return os;
+	  return os << *threadObj.vmdata;
+  }
 };
 
 

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMObject.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMObject.inc?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMObject.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMObject.inc Thu Apr 25 11:46:36 2013
@@ -12,6 +12,8 @@
 #include "Classpath.h"
 #include "Jnjvm.h"
 
+#include <sstream>
+
 using namespace j3;
 
 extern "C" {
@@ -57,6 +59,31 @@ JavaObject* obj) {
   return res;
 }
 
+void printStackTrace(JavaObject *obj, const char *methName, int skip = 3, int level_deep = 1)
+{
+	j3::JavaThread *thread = j3::JavaThread::get();
+
+	std::ostringstream log;
+	log << '[' << *thread << "] " << methName << " obj=" << obj << " class=" << *JavaObject::getClass(obj)->name;
+
+	const UTF8* clName = JavaObject::getClass(obj)->name;
+	if (!clName->compare("java/lang/VMThread") || !clName->compare("java/lang/Thread"))
+		log << '(' << *static_cast<JavaObjectVMThread*>(obj) << ')';
+
+	log << std::endl;
+	std::cerr << log.str();
+
+	j3::Jnjvm *vm = thread->getJVM();
+	vmkit::StackWalker Walker(thread);
+	for (vmkit::FrameInfo* FI = NULL; (level_deep > 0) && ((FI = Walker.get()) != NULL); ++Walker) {
+		if (!FI->Metadata) continue;
+		if (skip > 0) {--skip; continue;}
+
+		vm->printMethod(FI, Walker.getReturnAddress(), Walker.getCallFrame());
+		--level_deep;
+	}
+}
+
 JNIEXPORT void JNICALL Java_java_lang_VMObject_notifyAll(
 #ifdef NATIVE_JNI
 JNIEnv *env,
@@ -68,6 +95,7 @@ JavaObject* obj) {
 
   BEGIN_NATIVE_EXCEPTION(0)
 
+//  printStackTrace(obj, "notifyAll", 3, 0);
   JavaObject::notifyAll(obj);
 
   END_NATIVE_EXCEPTION
@@ -84,9 +112,13 @@ JavaObject* obj, jlong ms, jint ns) {
   llvm_gcroot(obj, 0);
 
   BEGIN_NATIVE_EXCEPTION(0)
-
+/*
+  printStackTrace(obj, "wait", 3, 1);
+  bool notified = JavaObject::wait(obj, ms, ns);
+  if (notified)
+    printStackTrace(obj, "wait_notified", 3, 1);
+*/
   JavaObject::wait(obj, ms, ns);
-
   END_NATIVE_EXCEPTION
 }
 
@@ -101,6 +133,7 @@ JavaObject* obj) {
 
   BEGIN_NATIVE_EXCEPTION(0)
 
+//  printStackTrace(obj, "notify", 3, 0);
   JavaObject::notify(obj);
 
   END_NATIVE_EXCEPTION

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThread.inc Thu Apr 25 11:46:36 2013
@@ -95,9 +95,9 @@ JavaObject* vmThread, sint64 stackSize)
  
   JavaThread* th = new JavaThread(vm);
   if (!th) vm->outOfMemoryError();
-  th->start((void (*)(vmkit::Thread*))start);
   // Now that the thread has been created, initialise its object fields.
   th->initialise(javaThread, vmThread);
+  th->start((void (*)(vmkit::Thread*))start);
 
   END_NATIVE_EXCEPTION
 }

Modified: vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThrowable.inc?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/GNUClasspath/ClasspathVMThrowable.inc Thu Apr 25 11:46:36 2013
@@ -50,7 +50,7 @@ JavaObject* internalFillInStackTrace(Jav
   vmkit::StackWalker Walker(th);
   uint32_t i = 0;
 
-  while (intptr_t ip = *Walker) {
+  while (void* ip = *Walker) {
     ArrayPtr::setElement(result, ip, i);
     ++i;
     ++Walker;
@@ -83,7 +83,7 @@ JavaObject* throwable) {
 }
 
 
-JavaObject* consStackElement(vmkit::FrameInfo* FI, intptr_t ip) {
+JavaObject* consStackElement(vmkit::FrameInfo* FI, void* ip) {
 
   JavaString* methodName = 0;
   JavaString* className = 0;
@@ -100,7 +100,7 @@ JavaObject* consStackElement(vmkit::Fram
   Class* cl = meth->classDef;
   className = JavaString::internalToJava(cl->name, vm);
   
-  Attribut* sourceAtt = cl->lookupAttribut(Attribut::sourceFileAttribut);
+  JavaAttribute* sourceAtt = cl->lookupAttribute(JavaAttribute::sourceFileAttribute);
   
   // We don't have the bytes if the class was vmjc'ed.
   if (sourceAtt && cl->getBytes()) {

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/ClasspathReflect.cpp Thu Apr 25 11:46:36 2013
@@ -219,7 +219,7 @@ JavaObjectField* JavaObjectField::create
   return ret;
 }
 
-static inline JavaString** getSignatureString(Attribut* sigAtt, Class* cl) {
+static inline JavaString** getSignatureString(JavaAttribute* sigAtt, Class* cl) {
   if (!sigAtt) return 0;
 
   Reader reader(sigAtt, cl->bytes);
@@ -230,26 +230,26 @@ static inline JavaString** getSignatureS
 }
 
 JavaString** JavaObjectClass::getSignature(Class *cl) {
-  Attribut* sigAtt = cl->lookupAttribut(Attribut::signatureAttribut);
+  JavaAttribute* sigAtt = cl->lookupAttribute(JavaAttribute::signatureAttribute);
   return getSignatureString(sigAtt, cl);
 }
 
 JavaString** JavaObjectField::getSignature(JavaField* field) {
-  Attribut* sigAtt = field->lookupAttribut(Attribut::signatureAttribut);
+  JavaAttribute* sigAtt = field->lookupAttribute(JavaAttribute::signatureAttribute);
   return getSignatureString(sigAtt, field->classDef);
 }
 
 JavaString** JavaObjectMethod::getSignature(JavaMethod* meth) {
-  Attribut* sigAtt = meth->lookupAttribut(Attribut::signatureAttribut);
+  JavaAttribute* sigAtt = meth->lookupAttribute(JavaAttribute::signatureAttribute);
   return getSignatureString(sigAtt, meth->classDef);
 }
 
 JavaString** JavaObjectConstructor::getSignature(JavaMethod* cons) {
-  Attribut* sigAtt = cons->lookupAttribut(Attribut::signatureAttribut);
+  JavaAttribute* sigAtt = cons->lookupAttribute(JavaAttribute::signatureAttribute);
   return getSignatureString(sigAtt, cons->classDef);
 }
 
-static inline ArraySInt8* getAttrBytes(Attribut* annotationsAtt, Class* cl) {
+static inline ArraySInt8* getAttrBytes(JavaAttribute* annotationsAtt, Class* cl) {
   ArraySInt8* ret = 0;
   llvm_gcroot(ret, 0);
 
@@ -270,47 +270,47 @@ static inline ArraySInt8* getAttrBytes(A
 }
 
 ArraySInt8* JavaObjectClass::getAnnotations(Class *cl) {
-  Attribut* attr =
-    cl->lookupAttribut(Attribut::annotationsAttribut);
+  JavaAttribute* attr =
+    cl->lookupAttribute(JavaAttribute::annotationsAttribute);
 
   return getAttrBytes(attr, cl);
 }
 
 ArraySInt8* JavaObjectField::getAnnotations(JavaField *field) {
-  Attribut* attr =
-    field->lookupAttribut(Attribut::annotationsAttribut);
+  JavaAttribute* attr =
+    field->lookupAttribute(JavaAttribute::annotationsAttribute);
 
   return getAttrBytes(attr, field->classDef);
 }
 
 ArraySInt8* JavaObjectMethod::getAnnotations(JavaMethod *meth) {
-  Attribut* attr =
-    meth->lookupAttribut(Attribut::annotationsAttribut);
+  JavaAttribute* attr =
+    meth->lookupAttribute(JavaAttribute::annotationsAttribute);
 
   return getAttrBytes(attr, meth->classDef);
 }
 ArraySInt8* JavaObjectMethod::getParamAnnotations(JavaMethod *meth) {
-  Attribut* attr =
-    meth->lookupAttribut(Attribut::paramAnnotationsAttribut);
+  JavaAttribute* attr =
+    meth->lookupAttribute(JavaAttribute::paramAnnotationsAttribute);
 
   return getAttrBytes(attr, meth->classDef);
 }
 ArraySInt8* JavaObjectMethod::getAnnotationDefault(JavaMethod *meth) {
-  Attribut* attr =
-    meth->lookupAttribut(Attribut::annotationDefaultAttribut);
+  JavaAttribute* attr =
+    meth->lookupAttribute(JavaAttribute::annotationDefaultAttribute);
 
   return getAttrBytes(attr, meth->classDef);
 }
 
 ArraySInt8* JavaObjectConstructor::getAnnotations(JavaMethod *cons) {
-  Attribut* attr =
-    cons->lookupAttribut(Attribut::annotationsAttribut);
+  JavaAttribute* attr =
+    cons->lookupAttribute(JavaAttribute::annotationsAttribute);
 
   return getAttrBytes(attr, cons->classDef);
 }
 ArraySInt8* JavaObjectConstructor::getParamAnnotations(JavaMethod *cons) {
-  Attribut* attr =
-    cons->lookupAttribut(Attribut::paramAnnotationsAttribut);
+  JavaAttribute* attr =
+    cons->lookupAttribute(JavaAttribute::paramAnnotationsAttribute);
 
   return getAttrBytes(attr, cons->classDef);
 }

Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Thu Apr 25 11:46:36 2013
@@ -86,7 +86,7 @@ JavaObject* consStackElement(vmkit::Fram
   Class* cl = meth->classDef;
   className = JavaString::internalToJava(cl->name, vm);
 
-  Attribut* sourceAtt = cl->lookupAttribut(Attribut::sourceFileAttribut);
+  Attribute* sourceAtt = cl->lookupAttribut(Attribute::sourceFileAttribut);
 
   if (sourceAtt) {
     Reader reader(sourceAtt, cl->bytes);
@@ -2910,7 +2910,7 @@ JVM_GetEnclosingMethodInfo(JNIEnv* env,
   // Primitives arrays, interfaces...
   if (!cl) RETURN_FROM_JNI(0);
 
-  Attribut* emAtt = cl->lookupAttribut(Attribut::enclosingMethodAttribut);
+  Attribute* emAtt = cl->lookupAttribut(Attribute::enclosingMethodAttribut);
 
   if (emAtt) {
     Reader reader(emAtt, cl->bytes);

Modified: vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h Thu Apr 25 11:46:36 2013
@@ -74,6 +74,7 @@ public:
     return OwningClass->getStaticInstance();
   }
 
+  Class* getOwningClass() {return OwningClass;}
 };
 
 }

Modified: vmkit/trunk/lib/j3/Compiler/J3Intrinsics.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/J3Intrinsics.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/J3Intrinsics.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/J3Intrinsics.cpp Thu Apr 25 11:46:36 2013
@@ -40,6 +40,10 @@ void J3Intrinsics::init(llvm::Module* mo
   VTType = PointerType::getUnqual(ArrayType::get(
         PointerType::getUnqual(FunctionType::get(Type::getInt32Ty(Context), true)), 0));
 
+  JavaVTType = PointerType::getUnqual(module->getTypeByName("JavaVT"));
+
+  ExceptionBufferType = PointerType::getUnqual(module->getTypeByName("ExceptionBuffer"));
+
   ResolvedConstantPoolType = ptrPtrType;
  
   JavaObjectType = 
@@ -88,8 +92,8 @@ void J3Intrinsics::init(llvm::Module* mo
     PointerType::getUnqual(module->getTypeByName("JavaMethod"));
   UTF8Type =
     PointerType::getUnqual(module->getTypeByName("UTF8"));
-  AttributType =
-    PointerType::getUnqual(module->getTypeByName("Attribut"));
+  AttributeType =
+    PointerType::getUnqual(module->getTypeByName("Attribute"));
   JavaThreadType =
     PointerType::getUnqual(module->getTypeByName("JavaThread"));
   MutatorThreadType =
@@ -141,9 +145,11 @@ void J3Intrinsics::init(llvm::Module* mo
   OffsetObjectSizeInClassConstant = constantOne;
   OffsetVTInClassConstant = ConstantInt::get(Type::getInt32Ty(Context), 7);
   OffsetTaskClassMirrorInClassConstant = constantThree;
-  OffsetStaticInstanceInTaskClassMirrorConstant = constantThree;
+  OffsetStaticInstanceInTaskClassMirrorConstant = constantTwo;
   OffsetStatusInTaskClassMirrorConstant = constantZero;
   OffsetInitializedInTaskClassMirrorConstant = constantOne;
+  OffsetCommonClassInClassConstant = constantZero;
+  OffsetCommonClassInJavaVirtualTableConstant = constantFour;
   
   OffsetIsolateIDInThreadConstant =         ConstantInt::get(Type::getInt32Ty(Context), 1);
   OffsetVMInThreadConstant =                ConstantInt::get(Type::getInt32Ty(Context), 2);
@@ -157,7 +163,8 @@ void J3Intrinsics::init(llvm::Module* mo
   InterfaceLookupFunction = module->getFunction("j3InterfaceLookup");
   MultiCallNewFunction = module->getFunction("j3MultiCallNew");
   ForceLoadedCheckFunction = module->getFunction("forceLoadedCheck");
-  InitialisationCheckFunction = module->getFunction("initialisationCheck");
+  InitialisationCheckFunction = module->getFunction("j3InitialisationCheck");
+  InitialisationCheckForJavaObjectFunction = module->getFunction("j3InitialisationCheckForJavaObject");
   ForceInitialisationCheckFunction = 
     module->getFunction("forceInitialisationCheck");
   InitialiseClassFunction = module->getFunction("j3RuntimeInitialiseClass");
@@ -175,12 +182,15 @@ void J3Intrinsics::init(llvm::Module* mo
   GetObjectSizeFromClassFunction = 
     module->getFunction("getObjectSizeFromClass");
  
-  GetClassDelegateeFunction = module->getFunction("getClassDelegatee");
+  SetIsolateFunction = module->getFunction("j3SetIsolate");
+  GetCachedValueFunction = module->getFunction("j3GetCachedValue");
+  GetClassDelegateePtrFunction = module->getFunction("j3GetClassDelegateePtr");
+  GetClassDelegateeFunction = module->getFunction("j3GetClassDelegatee");
   RuntimeDelegateeFunction = module->getFunction("j3RuntimeDelegatee");
   IsSubclassOfFunction = module->getFunction("isSubclassOf");
   IsSecondaryClassFunction = module->getFunction("isSecondaryClass");
   GetDepthFunction = module->getFunction("getDepth");
-  GetStaticInstanceFunction = module->getFunction("getStaticInstance");
+  GetStaticInstanceFunction = module->getFunction("j3GetStaticInstance");
   GetDisplayFunction = module->getFunction("getDisplay");
   GetVTInDisplayFunction = module->getFunction("getVTInDisplay");
   AquireObjectFunction = module->getFunction("j3JavaObjectAquire");
@@ -229,4 +239,10 @@ void J3Intrinsics::init(llvm::Module* mo
   GetLockFunction = module->getFunction("getLock");
   ThrowExceptionFromJITFunction =
     module->getFunction("j3ThrowExceptionFromJIT"); 
+
+  CurrentIsolateID = ConstantInt::get(Type::getInt32Ty(Context), CURRENT_ISOLATE);
+
+  OffsetHandlerMethodInExceptionBufferConstant = constantZero;
+  OffsetHandlerIsolateIDInExceptionBufferConstant = constantOne;
+  OffsetSetJmpBufferInExceptionBufferConstant = constantThree;
 }

Modified: vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaAOTCompiler.cpp Thu Apr 25 11:46:36 2013
@@ -36,6 +36,8 @@
 #include "Zip.h"
 
 #include <cstdio>
+#include <string>
+#include <sstream>
 
 using namespace j3;
 using namespace llvm;
@@ -181,24 +183,41 @@ Constant* JavaAOTCompiler::getResolvedCo
   if (I == End) {
     Module& Mod = *getLLVMModule();
 
+    std::string pool_name(UTF8Buffer(ctp->classDef->name).toCompileName("_ResolvedConstantPool_")->cString());
+
     ArrayType* ATy = ArrayType::get(JavaIntrinsics.ptrType, ctp->ctpSize);
-    std::vector<Constant*> Vals;
+    ArrayType* AStringTy = ArrayType::get(JavaIntrinsics.ptrType, NR_ISOLATES);
+    std::vector<Constant*> Vals(ctp->ctpSize, JavaIntrinsics.constantPtrNull);
     for (uint32 i = 0; i < ctp->ctpSize; ++i) {
       if (ctp->typeAt(i) == JavaConstantPool::ConstantUTF8) {
-        Vals.push_back(ConstantExpr::getBitCast(getUTF8(ctp->UTF8At(i)), JavaIntrinsics.ptrType));
+        Vals[i] = ConstantExpr::getBitCast(getUTF8(ctp->UTF8At(i)), JavaIntrinsics.ptrType);
       } else if (ctp->typeAt(i) == JavaConstantPool::ConstantClass
                   && (ctp->isClassLoaded(i) != NULL)) {
-        Vals.push_back(ConstantExpr::getBitCast(
-            getNativeClass(ctp->isClassLoaded(i)), JavaIntrinsics.ptrType));
-      } else {
-        Vals.push_back(Constant::getNullValue(JavaIntrinsics.ptrType));
+        Vals[i] = ConstantExpr::getBitCast(
+            getNativeClass(ctp->isClassLoaded(i)), JavaIntrinsics.ptrType);
+      } else if (ctp->typeAt(i) == JavaConstantPool::ConstantString) {
+        std::stringstream array_name;
+        array_name << pool_name << "String_" << i << '_';
+
+        std::vector<Constant*> Strings(NR_ISOLATES, JavaIntrinsics.constantPtrNull);
+        /*
+        for (isolate_id_t isolateID = 0; isolateID < NR_ISOLATES; ++isolateID)
+          if (void *p = ctp->getCachedValue(i, isolateID))
+            Strings[isolateID] = CreateConstantFromJavaString(*reinterpret_cast<JavaString **>(p));
+        */
+
+        GlobalVariable* stringArray = new GlobalVariable(
+          Mod, AStringTy, false, GlobalValue::InternalLinkage,
+          ConstantArray::get(AStringTy, Strings), array_name.str());
+
+        Vals[i] = ConstantExpr::getBitCast(stringArray, JavaIntrinsics.ptrType);
       }
     }
 
     Constant* Array = ConstantArray::get(ATy, Vals);
     GlobalVariable* varGV = new GlobalVariable(Mod, Array->getType(), false,
                                                GlobalValue::InternalLinkage,
-                                               Array, "");
+                                               Array, pool_name);
  
     Array = ConstantExpr::getBitCast(varGV, JavaIntrinsics.ResolvedConstantPoolType);
     
@@ -445,7 +464,7 @@ Constant* JavaAOTCompiler::getFinalObjec
   }
 }
 
-Constant* JavaAOTCompiler::CreateConstantFromStaticInstance(Class* cl) {
+Constant* JavaAOTCompiler::CreateConstantFromStaticInstance(Class* cl, isolate_id_t isolateID) {
   LLVMClassInfo* LCI = getClassInfo(cl);
   Type* Ty = LCI->getStaticType();
   StructType* STy = dyn_cast<StructType>(Ty->getContainedType(0));
@@ -458,47 +477,47 @@ Constant* JavaAOTCompiler::CreateConstan
     LLVMAssessorInfo& LAI = getTypedefInfo(type);
     Type* Ty = LAI.llvmType;
 
-    Attribut* attribut = field.lookupAttribut(Attribut::constantAttribut);
+    JavaAttribute* attribute = field.lookupAttribute(JavaAttribute::constantAttribute);
 
-    if (attribut == NULL) {
-      if ((cl->getStaticInstance() != NULL) && !useCooperativeGC()) {
+    if (attribute == NULL) {
+      if ((cl->getStaticInstance(isolateID) != NULL) && !useCooperativeGC()) {
         if (type->isPrimitive()) {
           const PrimitiveTypedef* prim = (const PrimitiveTypedef*)type;
           if (prim->isBool() || prim->isByte()) {
             ConstantInt* CI = ConstantInt::get(
                 Type::getInt8Ty(getLLVMContext()),
-                field.getStaticInt8Field());
+                field.getStaticInt8Field(isolateID));
             Elts.push_back(CI);
           } else if (prim->isShort() || prim->isChar()) {
             ConstantInt* CI = ConstantInt::get(
                 Type::getInt16Ty(getLLVMContext()),
-                field.getStaticInt16Field());
+                field.getStaticInt16Field(isolateID));
             Elts.push_back(CI);
           } else if (prim->isInt()) {
             ConstantInt* CI = ConstantInt::get(
                 Type::getInt32Ty(getLLVMContext()),
-                field.getStaticInt32Field());
+                field.getStaticInt32Field(isolateID));
             Elts.push_back(CI);
           } else if (prim->isLong()) {
             ConstantInt* CI = ConstantInt::get(
                 Type::getInt64Ty(getLLVMContext()),
-                field.getStaticLongField());
+                field.getStaticLongField(isolateID));
             Elts.push_back(CI);
           } else if (prim->isFloat()) {
             Constant* CF = ConstantFP::get(
                 Type::getFloatTy(getLLVMContext()),
-                field.getStaticFloatField());
+                field.getStaticFloatField(isolateID));
             Elts.push_back(CF);
           } else if (prim->isDouble()) {
             Constant* CF = ConstantFP::get(
                 Type::getDoubleTy(getLLVMContext()),
-                field.getStaticDoubleField());
+                field.getStaticDoubleField(isolateID));
             Elts.push_back(CF);
           } else {
             abort();
           }
         } else {
-          JavaObject* val = field.getStaticObjectField();
+          JavaObject* val = field.getStaticObjectField(isolateID);
           if (val) {
             JnjvmClassLoader* JCL = cl->classLoader;
             CommonClass* FieldCl = field.getSignature()->assocClass(JCL);
@@ -512,7 +531,7 @@ Constant* JavaAOTCompiler::CreateConstan
         Elts.push_back(Constant::getNullValue(Ty));
       }
     } else {
-      Reader reader(attribut, cl->bytes);
+      Reader reader(attribute, cl->bytes);
       JavaConstantPool * ctpInfo = cl->ctpInfo;
       uint16 idx = reader.readU2();
       if (type->isPrimitive()) {
@@ -545,34 +564,20 @@ Constant* JavaAOTCompiler::CreateConstan
   return ConstantStruct::get(STy, Elts);
 }
 
-Constant* JavaAOTCompiler::getStaticInstance(Class* classDef) {
-  static_instance_iterator End = staticInstances.end();
-  static_instance_iterator I = staticInstances.find(classDef);
-  if (I == End) {
-    
-    LLVMClassInfo* LCI = getClassInfo(classDef);
-    Type* Ty = LCI->getStaticType();
-    Ty = Ty->getContainedType(0);
-    std::string name(UTF8Buffer(classDef->name).toCompileName()->cString());
-    name += "_static";
-    Module& Mod = *getLLVMModule();
-    GlobalVariable* varGV = 
-      new GlobalVariable(Mod, Ty, false, GlobalValue::ExternalLinkage,
-                         0, name);
-
-    Constant* res = ConstantExpr::getCast(Instruction::BitCast, varGV,
-                                          JavaIntrinsics.ptrType);
-    staticInstances.insert(std::make_pair(classDef, res));
-    
-    if (isCompiling(classDef)) { 
-      Constant* C = CreateConstantFromStaticInstance(classDef);
-      varGV->setInitializer(C);
-    }
-
-    return res;
-  } else {
-    return I->second;
-  }
+Constant* JavaAOTCompiler::getStaticInstance(Class* classDef, isolate_id_t isolateID) {
+	ConstantArray *TCMArray = dyn_cast<ConstantArray>(CreateConstantFromTaskClassMirrorArray(classDef));
+	if (!compilingMMTk) {
+		// Thanks for calling me, but you should call j3GetStaticInstance() to get the static instance
+		// pointer at runtime.
+		return NULL;
+	}
+
+	isolateID = JavaThread::getValidIsolateID(isolateID);
+	ConstantStruct *TCM = dyn_cast<ConstantStruct>(TCMArray->getAggregateElement(isolateID));
+
+	Constant *isolateStaticInstance = TCM->getAggregateElement(
+		JavaIntrinsics.OffsetStaticInstanceInTaskClassMirrorConstant);
+	return isolateStaticInstance;
 }
 
 Constant* JavaAOTCompiler::getVirtualTable(JavaVirtualTable* VT) {
@@ -809,21 +814,21 @@ Constant* JavaAOTCompiler::CreateConstan
 }
 
 
-Constant* JavaAOTCompiler::CreateConstantFromAttribut(Attribut& attribut) {
+Constant* JavaAOTCompiler::CreateConstantFromAttribute(JavaAttribute& attribute) {
   StructType* STy = 
-    dyn_cast<StructType>(JavaIntrinsics.AttributType->getContainedType(0));
+    dyn_cast<StructType>(JavaIntrinsics.AttributeType->getContainedType(0));
 
 
   std::vector<Constant*> Elmts;
 
   // name
-  Elmts.push_back(getUTF8(attribut.name));
+  Elmts.push_back(getUTF8(attribute.name));
 
   // start
-  Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), attribut.start));
+  Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), attribute.start));
 
   // nbb
-  Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), attribut.nbb));
+  Elmts.push_back(ConstantInt::get(Type::getInt32Ty(getLLVMContext()), attribute.nbb));
   
   return ConstantStruct::get(STy, Elmts);
 }
@@ -913,29 +918,29 @@ Constant* JavaAOTCompiler::CreateConstan
   // type
   FieldElts.push_back(getUTF8(field.type));
   
-  // attributs 
-  if (field.nbAttributs) {
-    llvm::Type* AttrTy = JavaIntrinsics.AttributType->getContainedType(0);
-    ArrayType* ATy = ArrayType::get(AttrTy, field.nbAttributs);
-    for (uint32 i = 0; i < field.nbAttributs; ++i) {
-      TempElts.push_back(CreateConstantFromAttribut(field.attributs[i]));
+  // attributes
+  if (field.nbAttributes) {
+    llvm::Type* AttrTy = JavaIntrinsics.AttributeType->getContainedType(0);
+    ArrayType* ATy = ArrayType::get(AttrTy, field.nbAttributes);
+    for (uint32 i = 0; i < field.nbAttributes; ++i) {
+      TempElts.push_back(CreateConstantFromAttribute(field.attributes[i]));
     }
 
-    Constant* attributs = ConstantArray::get(ATy, TempElts);
+    Constant* attributes = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
-    attributs = new GlobalVariable(*getLLVMModule(), ATy, true,
+    attributes = new GlobalVariable(*getLLVMModule(), ATy, true,
                                    GlobalValue::InternalLinkage,
-                                   attributs, "");
-    attributs = ConstantExpr::getCast(Instruction::BitCast, attributs,
-                                      JavaIntrinsics.AttributType);
+                                   attributes, "");
+    attributes = ConstantExpr::getCast(Instruction::BitCast, attributes,
+                                      JavaIntrinsics.AttributeType);
   
-    FieldElts.push_back(attributs);
+    FieldElts.push_back(attributes);
   } else {
-    FieldElts.push_back(Constant::getNullValue(JavaIntrinsics.AttributType));
+    FieldElts.push_back(Constant::getNullValue(JavaIntrinsics.AttributeType));
   }
   
-  // nbAttributs
-  FieldElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), field.nbAttributs));
+  // nbAttributes
+  FieldElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), field.nbAttributes));
 
   // classDef
   FieldElts.push_back(getNativeClass(field.classDef));
@@ -963,29 +968,29 @@ Constant* JavaAOTCompiler::CreateConstan
   // access
   MethodElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), method.access));
  
-  // attributs
-  if (method.nbAttributs) {
-    llvm::Type* AttrTy = JavaIntrinsics.AttributType->getContainedType(0);
-    ArrayType* ATy = ArrayType::get(AttrTy, method.nbAttributs);
-    for (uint32 i = 0; i < method.nbAttributs; ++i) {
-      TempElts.push_back(CreateConstantFromAttribut(method.attributs[i]));
+  // attributes
+  if (method.nbAttributes) {
+    llvm::Type* AttrTy = JavaIntrinsics.AttributeType->getContainedType(0);
+    ArrayType* ATy = ArrayType::get(AttrTy, method.nbAttributes);
+    for (uint32 i = 0; i < method.nbAttributes; ++i) {
+      TempElts.push_back(CreateConstantFromAttribute(method.attributes[i]));
     }
 
-    Constant* attributs = ConstantArray::get(ATy, TempElts);
+    Constant* attributes = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
-    attributs = new GlobalVariable(Mod, ATy, true,
+    attributes = new GlobalVariable(Mod, ATy, true,
                                    GlobalValue::InternalLinkage,
-                                   attributs, "");
-    attributs = ConstantExpr::getCast(Instruction::BitCast, attributs,
-                                      JavaIntrinsics.AttributType);
+                                   attributes, "");
+    attributes = ConstantExpr::getCast(Instruction::BitCast, attributes,
+                                      JavaIntrinsics.AttributeType);
 
-    MethodElts.push_back(attributs);
+    MethodElts.push_back(attributes);
   } else {
-    MethodElts.push_back(Constant::getNullValue(JavaIntrinsics.AttributType));
+    MethodElts.push_back(Constant::getNullValue(JavaIntrinsics.AttributeType));
   }
   
-  // nbAttributs
-  MethodElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), method.nbAttributs));
+  // nbAttributes
+  MethodElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), method.nbAttributes));
   
   // classDef
   MethodElts.push_back(getNativeClass(method.classDef));
@@ -1139,13 +1144,61 @@ Constant* JavaAOTCompiler::CreateConstan
                             ConstantStruct::get(STy, elements), "UTF8Map");
 }
 
+Constant* JavaAOTCompiler::CreateConstantFromTaskClassMirrorArray(Class* cl)
+{
+	task_class_mirror_iterator I = taskClassMirrors.find(cl);
+	if (I != taskClassMirrors.end())
+		return I->second;	// TCM Constant already created
+
+	StructType* STy = dyn_cast<StructType>(JavaIntrinsics.JavaClassType->getContainedType(0));
+	ArrayType* ATy = dyn_cast<ArrayType>(STy->getContainedType(3));
+	StructType* TCMTy = dyn_cast<StructType>(ATy->getContainedType(0));
+	assert(TCMTy && "Malformed type");
+
+	Module& Mod = *getLLVMModule();
+	LLVMClassInfo* LCI = getClassInfo(cl);
+	StructType* StaticInstanceTy = dyn_cast<StructType>(LCI->getStaticType()->getContainedType(0));
+	assert(StaticInstanceTy && "Malformed type");
+
+	std::string var_name(UTF8Buffer(cl->name).toCompileName("_StaticInstance_")->cString());
+	size_t var_name_len = var_name.size();
+	char var_name_ext[32];
+
+	Constant** TCMEntries = new Constant*[NR_ISOLATES];
+	memset(TCMEntries, 0, NR_ISOLATES * sizeof(Constant*));
+
+	for (isolate_id_t isolateID = 0; isolateID < NR_ISOLATES; ++isolateID) {
+		var_name.resize(var_name_len);
+		snprintf(var_name_ext, sizeof(var_name_ext)/sizeof(*var_name_ext), "%d", isolateID);
+		var_name += var_name_ext;
+
+		GlobalVariable* staticInstance = new GlobalVariable(Mod, StaticInstanceTy, false, GlobalValue::ExternalLinkage, 0, var_name);
+		if (isCompiling(cl)) {
+			Constant* staticInstanceInit = CreateConstantFromStaticInstance(cl, isolateID);
+			staticInstance->setInitializer(staticInstanceInit);
+		}
+
+		Constant *TCMEntry[] = {
+			ConstantInt::get(Type::getInt8Ty(getLLVMContext()), cl->getInitializationState(isolateID)),
+			ConstantInt::get(Type::getInt1Ty(getLLVMContext()), cl->isReady(isolateID) ? 1 : 0),
+			ConstantExpr::getBitCast(staticInstance, JavaIntrinsics.ptrType)
+		};
+		TCMEntries[isolateID] = ConstantStruct::get(TCMTy, TCMEntry);
+	}
+
+	Constant* tcm = ConstantArray::get(ATy, ArrayRef<Constant*>(TCMEntries, NR_ISOLATES));
+	taskClassMirrors.insert(std::make_pair(cl, tcm));
+
+	delete [] TCMEntries;
+	return tcm;
+}
+
 Constant* JavaAOTCompiler::CreateConstantFromClass(Class* cl) {
   StructType* STy = 
     dyn_cast<StructType>(JavaIntrinsics.JavaClassType->getContainedType(0));
   Module& Mod = *getLLVMModule();
   
-  std::vector<Constant*> ClassElts;
-  std::vector<Constant*> TempElts;
+  std::vector<Constant*> ClassElts, TempElts;
 
   // common class
   ClassElts.push_back(CreateConstantFromCommonClass(cl));
@@ -1159,21 +1212,11 @@ Constant* JavaAOTCompiler::CreateConstan
                                        cl->alignment));
 
   // IsolateInfo
+  ClassElts.push_back(CreateConstantFromTaskClassMirrorArray(cl));
+
   ArrayType* ATy = dyn_cast<ArrayType>(STy->getContainedType(3));
   assert(ATy && "Malformed type");
   
-  StructType* TCMTy = dyn_cast<StructType>(ATy->getContainedType(0));
-  assert(TCMTy && "Malformed type");
-
-  TempElts.push_back(ConstantInt::get(Type::getInt8Ty(getLLVMContext()),
-                                      cl->getInitializationState()));
-  TempElts.push_back(ConstantInt::get(Type::getInt1Ty(getLLVMContext()),
-                                      cl->isReady() ? 1 : 0));
-  TempElts.push_back(getStaticInstance(cl));
-  Constant* CStr[1] = { ConstantStruct::get(TCMTy, TempElts) };
-  TempElts.clear();
-  ClassElts.push_back(ConstantArray::get(ATy, CStr));
-
   if (cl->nbVirtualFields + cl->nbStaticFields) {
     ATy = ArrayType::get(JavaIntrinsics.JavaFieldType->getContainedType(0),
                          cl->nbVirtualFields + cl->nbStaticFields);
@@ -1293,29 +1336,29 @@ Constant* JavaAOTCompiler::CreateConstan
                                        ctpInfo, "");
   ClassElts.push_back(varGV);
 
-  // attributs
-  if (cl->nbAttributs) {
-    ATy = ArrayType::get(JavaIntrinsics.AttributType->getContainedType(0),
-                         cl->nbAttributs);
+  // attributes
+  if (cl->nbAttributes) {
+    ATy = ArrayType::get(JavaIntrinsics.AttributeType->getContainedType(0),
+                         cl->nbAttributes);
 
-    for (uint32 i = 0; i < cl->nbAttributs; ++i) {
-      TempElts.push_back(CreateConstantFromAttribut(cl->attributs[i]));
+    for (uint32 i = 0; i < cl->nbAttributes; ++i) {
+      TempElts.push_back(CreateConstantFromAttribute(cl->attributes[i]));
     }
 
-    Constant* attributs = ConstantArray::get(ATy, TempElts);
+    Constant* attributes = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
-    attributs = new GlobalVariable(*getLLVMModule(), ATy, true,
+    attributes = new GlobalVariable(*getLLVMModule(), ATy, true,
                                    GlobalValue::InternalLinkage,
-                                   attributs, "");
-    attributs = ConstantExpr::getCast(Instruction::BitCast, attributs,
-                                      JavaIntrinsics.AttributType);
-    ClassElts.push_back(attributs);
+                                   attributes, "");
+    attributes = ConstantExpr::getCast(Instruction::BitCast, attributes,
+                                      JavaIntrinsics.AttributeType);
+    ClassElts.push_back(attributes);
   } else {
-    ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.AttributType));
+    ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.AttributeType));
   }
   
-  // nbAttributs
-  ClassElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), cl->nbAttributs));
+  // nbAttributes
+  ClassElts.push_back(ConstantInt::get(Type::getInt16Ty(getLLVMContext()), cl->nbAttributes));
   
   // innerClasses
   if (cl->nbInnerClasses) {
@@ -1798,8 +1841,8 @@ Constant* JavaAOTCompiler::CreateConstan
   return Array;
 }
 
-JavaAOTCompiler::JavaAOTCompiler(const std::string& ModuleID) :
-  JavaLLVMCompiler(ModuleID) {
+JavaAOTCompiler::JavaAOTCompiler(const std::string& ModuleID, bool compilingMMTk) :
+  JavaLLVMCompiler(ModuleID, compilingMMTk) {
 
   std::string Error;
   const Target* TheTarget(TargetRegistry::lookupTarget(
@@ -1883,8 +1926,8 @@ void JavaAOTCompiler::printStats() {
           (unsigned long long int) arrayClasses.size());
   fprintf(stdout, "Number of virtual tables            : %llu\n", 
           (unsigned long long int) virtualTables.size());
-  fprintf(stdout, "Number of static instances          : %llu\n", 
-          (unsigned long long int) staticInstances.size());
+  fprintf(stdout, "Number of Task Class Mirrors        : %llu\n",
+          (unsigned long long int) taskClassMirrors.size());
   fprintf(stdout, "Number of constant pools            : %llu\n", 
           (unsigned long long int) resolvedConstantPools.size());
   fprintf(stdout, "Number of strings                   : %llu\n", 
@@ -2108,7 +2151,7 @@ void mainCompilerStart(JavaThread* th) {
 
   JavaJITCompiler* Comp = NULL;
   if (!M->clinits->empty()) {
-    Comp = JavaJITCompiler::CreateCompiler("JIT");
+    Comp = JavaJITCompiler::CreateCompiler("JIT", M->isCompilingMMTk());
     Comp->EmitFunctionName = true;
     if (!M->useCooperativeGC()) {
       Comp->disableCooperativeGC();

Modified: vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp Thu Apr 25 11:46:36 2013
@@ -60,6 +60,7 @@ void JavaJIT::updateStackInfo(Opinfo& in
 }
 
 bool JavaJIT::needsInitialisationCheck(Class* cl) {
+/*
   if (cl->isReadyForCompilation() || 
       (!cl->isInterface() && compilingClass->isSubclassOf(cl))) {
     return false;
@@ -73,6 +74,13 @@ bool JavaJIT::needsInitialisationCheck(C
   }
 
   return true;
+*/
+	bool needs_check = cl->needsInitialisationCheck();
+
+	if (needs_check && TheCompiler->isCompilingMMTk() && cl->isReadyForCompilation(0))
+		needs_check = false;
+
+	return needs_check;
 }
 
 void JavaJIT::checkYieldPoint() {
@@ -97,7 +105,7 @@ bool JavaJIT::canBeInlined(JavaMethod* m
   if (isSynchro(meth->access)) return false;
   if (isNative(meth->access)) return false;
 
-  Attribut* codeAtt = meth->lookupAttribut(Attribut::codeAttribut);
+  JavaAttribute* codeAtt = meth->lookupAttribute(JavaAttribute::codeAttribute);
   if (codeAtt == NULL) return false;
 
   Reader reader(codeAtt, meth->classDef->bytes);
@@ -110,7 +118,7 @@ bool JavaJIT::canBeInlined(JavaMethod* m
   if (handlers != 0) return false;
   reader.cursor = start;
 
-  JavaJIT jit(TheCompiler, meth, llvmFunction, customizing ? customizeFor : NULL);
+  JavaJIT jit(TheCompiler, meth, llvmFunction, customizing ? customizeFor : NULL, compilingMMTk);
   jit.inlineMethods = inlineMethods;
   jit.inlineMethods[meth] = true;
   if (!jit.analyzeForInlining(reader, codeLen)) return false;
@@ -209,14 +217,18 @@ void JavaJIT::invokeVirtual(uint16 index
     PHINode* node = 0;
     Value* indexes2[2];
     indexes2[0] = intrinsics->constantZero;
-    bool nullChecked = false;
+
+    Value* targetObject = getTarget(signature);
+    targetObject = new LoadInst(targetObject, "", false, currentBlock);
+    if (!thisReference) JITVerifyNull(targetObject);
+    if (!TheCompiler->isCompilingMMTk())
+    	CallInst::Create(intrinsics->InitialisationCheckForJavaObjectFunction, targetObject, "", currentBlock);
 
     if (meth) {
       LLVMMethodInfo* LMI = TheCompiler->getMethodInfo(meth);
       Constant* Offset = LMI->getOffset();
       indexes2[1] = Offset;
     } else {
-      nullChecked = true;
       GlobalVariable* GV = new GlobalVariable(*llvmFunction->getParent(),
                                               Type::getInt32Ty(*llvmContext),
                                               false,
@@ -238,9 +250,6 @@ void JavaJIT::invokeVirtual(uint16 index
       Args.push_back(TheCompiler->getNativeClass(compilingClass));
       Args.push_back(ConstantInt::get(Type::getInt32Ty(*llvmContext), index));
       Args.push_back(GV);
-      Value* targetObject = getTarget(signature);
-      targetObject = new LoadInst(targetObject, "", false, currentBlock);
-      if (!thisReference) JITVerifyNull(targetObject);
       Args.push_back(targetObject);
       load = invoke(intrinsics->VirtualLookupFunction, Args, "", currentBlock);
       node->addIncoming(load, currentBlock);
@@ -251,7 +260,7 @@ void JavaJIT::invokeVirtual(uint16 index
     }
 
     makeArgs(it, index, args, signature->nbArguments + 1);
-    if (!nullChecked && !thisReference) JITVerifyNull(args[0]);
+
     Value* VT = CallInst::Create(intrinsics->GetVTFunction, args[0], "",
                                  currentBlock);
  
@@ -301,14 +310,6 @@ llvm::Value* JavaJIT::getJavaThreadPtr(l
   return new BitCastInst(mutatorThreadPtr, intrinsics->JavaThreadType, "", currentBlock);
 }
 
-llvm::Value* JavaJIT::getIsolateIDPtr(llvm::Value* mutatorThreadPtr) { 
-	Value* GEP[3] = { intrinsics->constantZero,
-										intrinsics->OffsetThreadInMutatorThreadConstant,
-										intrinsics->OffsetIsolateIDInThreadConstant };
-    
-	return GetElementPtrInst::Create(mutatorThreadPtr, GEP, "", currentBlock);
-}
-
 llvm::Value* JavaJIT::getVMPtr(llvm::Value* mutatorThreadPtr) { 
 	Value* GEP[3] = { intrinsics->constantZero,
 										intrinsics->OffsetThreadInMutatorThreadConstant,
@@ -370,6 +371,80 @@ static llvm::Function* GetNativeCallee(J
   return callee;
 }
 
+/*
+Value* JavaJIT::getCommonClass(Value* ClassOrObject)
+{
+	Type *Ty = ClassOrObject->getType();
+
+	if (Ty == intrinsics->JavaObjectType) {
+		// This is equivalent to "JavaObject::getClass(targetObject)"
+
+		ClassOrObject = new BitCastInst(ClassOrObject, intrinsics->ptrPtrType, "", currentBlock);
+		ClassOrObject = new LoadInst(ClassOrObject, "", currentBlock);
+		ClassOrObject = new BitCastInst(ClassOrObject, intrinsics->JavaVTType, "objectVT", currentBlock);
+
+		Value* GEP[] = {intrinsics->constantZero, intrinsics->OffsetCommonClassInJavaVirtualTableConstant};
+		ClassOrObject = GetElementPtrInst::Create(ClassOrObject, GEP, "", currentBlock);
+		ClassOrObject = new LoadInst(ClassOrObject, "commonClass", currentBlock);
+	} else if (Ty == intrinsics->JavaClassType) {
+		Value* GEP[] = {intrinsics->constantZero, intrinsics->OffsetCommonClassInClassConstant};
+		ClassOrObject = GetElementPtrInst::Create(ClassOrObject, GEP, "targetCommonClass", currentBlock);
+	}
+
+	assert((ClassOrObject->getType() == intrinsics->JavaCommonClassType) && "Invalid target class or object.");
+	return ClassOrObject;
+}
+*/
+
+Value* JavaJIT::getClassDelegateePtr(CommonClass* cl)
+{
+	Value* obj = TheCompiler->getNativeClass(cl);
+	obj = new BitCastInst(obj, intrinsics->JavaCommonClassType, "", currentBlock);
+	return CallInst::Create(intrinsics->GetClassDelegateePtrFunction, obj, "", currentBlock);
+}
+
+bool JavaJIT::shouldMethodChangeCurrentIsolate()
+{
+	JnjvmClassLoader* loader = compilingClass->classLoader;
+
+	// We are compiling the Java runtime:
+	// This code must run in the isolate ID of its caller, so as to account consumed resources
+	// to the caller.
+	if (loader == loader->bootstrapLoader) return false;
+
+	// We are compiling the <clinit> method:
+	// This code must run in the isolate ID of its caller, so as to enable initializing
+	// the class (not the object) in any desired isolate ID.
+	if (compilingMethod->name->equals(loader->bootstrapLoader->clinitName)) return false;
+
+	return true;
+}
+
+Value* JavaJIT::setCurrentIsolateForCompilingMethod(Value* currentIsolateID, bool alwaysSet)
+{
+	Constant *isolateID;
+	if (this->shouldMethodChangeCurrentIsolate())
+		isolateID = ConstantInt::get(Type::getInt32Ty(TheCompiler->getLLVMContext()), compilingClass->classLoader->getIsolateID());
+	else if (alwaysSet)
+		isolateID = intrinsics->CurrentIsolateID;
+	else
+		return NULL;
+
+	if (!currentIsolateID) currentIsolateID = intrinsics->constantPtr32Null;
+
+	Value *Args[] = {isolateID, currentIsolateID};
+	// Return the old isolate value, whether it was set or not
+	return CallInst::Create(intrinsics->SetIsolateFunction, Args, "oldIsolateID", currentBlock);
+}
+
+void JavaJIT::restoreCurrentIsolateForCompilingMethod(Value* oldIsolateID, bool alwaysRestore)
+{
+	if (!oldIsolateID || (!alwaysRestore && !this->shouldMethodChangeCurrentIsolate())) return;
+
+	Value *Args[] = {oldIsolateID, intrinsics->constantPtr32Null};
+	CallInst::Create(intrinsics->SetIsolateFunction, Args, "", currentBlock);
+}
+
 llvm::Function* JavaJIT::nativeCompile(word_t natPtr) {
   
   PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "native compile %s.%s\n",
@@ -472,7 +547,7 @@ llvm::Function* JavaJIT::nativeCompile(w
 
   uint32 index = 0;
   if (stat) {
-    Value* cl = TheCompiler->getJavaClassPtr(compilingClass);
+    Value* cl = getClassDelegateePtr(compilingClass);
     nativeArgs.push_back(cl);
     index = 2;
   } else {
@@ -573,6 +648,8 @@ llvm::Function* JavaJIT::nativeCompile(w
   }
   nativeArgs[0] = nativeFunc;
 
+  Value *oldIsolateID = this->setCurrentIsolateForCompilingMethod(NULL, false);
+
   // Synchronize before saying we're entering native
   if (isSynchro(compilingMethod->access)) {
     nbHandlers = 1;
@@ -618,6 +695,8 @@ llvm::Function* JavaJIT::nativeCompile(w
   if (isSynchro(compilingMethod->access))
     endSynchronize();
 
+  this->restoreCurrentIsolateForCompilingMethod(oldIsolateID, false);
+
   BasicBlock* ifNormal = createBasicBlock("");
   BasicBlock* ifException = createBasicBlock("");
   Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
@@ -743,7 +822,7 @@ void JavaJIT::beginSynchronize() {
     obj = new LoadInst(
         thisObject, "", false, currentBlock);
   } else {
-    obj = TheCompiler->getJavaClassPtr(compilingClass);
+    obj = getClassDelegateePtr(compilingClass);
     obj = new LoadInst(obj, "", false, currentBlock);
   }
   monitorEnter(obj);
@@ -756,7 +835,7 @@ void JavaJIT::endSynchronize() {
     obj = new LoadInst(
         thisObject, "", false, currentBlock);
   } else {
-    obj = TheCompiler->getJavaClassPtr(compilingClass);
+    obj = getClassDelegateePtr(compilingClass);
     obj = new LoadInst(obj, "", false, currentBlock);
   }
   monitorExit(obj);
@@ -803,7 +882,7 @@ static void removeUnusedObjects(std::vec
 Instruction* JavaJIT::inlineCompile(BasicBlock*& curBB,
                                     BasicBlock* endExBlock,
                                     std::vector<Value*>& args) {
-  Attribut* codeAtt = compilingMethod->lookupAttribut(Attribut::codeAttribut);
+  JavaAttribute* codeAtt = compilingMethod->lookupAttribute(JavaAttribute::codeAttribute);
   Reader reader(codeAtt, compilingClass->bytes);
   uint16 maxStack = reader.readU2();
   uint16 maxLocals = reader.readU2();
@@ -977,7 +1056,7 @@ llvm::Function* JavaJIT::javaCompile() {
   DbgSubprogram = TheCompiler->getDebugFactory()->createFunction(
       DIDescriptor(), "", "", DIFile(), 0, DIType(), false, false, 0);
 
-  Attribut* codeAtt = compilingMethod->lookupAttribut(Attribut::codeAttribut);
+  JavaAttribute* codeAtt = compilingMethod->lookupAttribute(JavaAttribute::codeAttribute);
   
   if (!codeAtt) {
     fprintf(stderr, "I haven't verified your class file and it's malformed:"
@@ -1095,20 +1174,26 @@ llvm::Function* JavaJIT::javaCompile() {
 
   // Now that arguments have been setup, we can proceed with runtime calls.
 #if JNJVM_EXECUTE > 0
-    {
-    Value* arg = TheCompiler->getMethodInClass(compilingMethod);
+    if (!TheCompiler->isCompilingMMTk() && compilingClass->name->elements[0] == 'i') {
+      Value* arg = TheCompiler->getMethodInClass(compilingMethod);
 
-    llvm::CallInst::Create(intrinsics->PrintMethodStartFunction, arg, "",
+      llvm::CallInst::Create(intrinsics->PrintMethodStartFunction, arg, "",
                            currentBlock);
     }
 #endif
 
+  Value *currentIsolateID = NULL;
   nbHandlers = readExceptionTable(reader, codeLen);
   if (nbHandlers != 0) {
-    jmpBuffer = new AllocaInst(ArrayType::get(Type::getInt8Ty(*llvmContext), sizeof(vmkit::ExceptionBuffer)), "", currentBlock);
-    jmpBuffer = new BitCastInst(jmpBuffer, intrinsics->ptrType, "", currentBlock);
+    jmpBuffer = new AllocaInst(ArrayType::get(Type::getInt8Ty(*llvmContext), sizeof(vmkit::ExceptionBuffer)), "ExceptionBufferBytes", currentBlock);
+    jmpBuffer = new BitCastInst(jmpBuffer, intrinsics->ExceptionBufferType, "ExceptionBuffer", currentBlock);
+
+    Value *GEP[] = {intrinsics->constantZero, intrinsics->OffsetHandlerIsolateIDInExceptionBufferConstant};
+    currentIsolateID = GetElementPtrInst::Create(jmpBuffer, GEP, "handlerIsolateID", currentBlock);
   }
   
+  Value *oldIsolateID = this->setCurrentIsolateForCompilingMethod(currentIsolateID, nbHandlers != 0);
+
   reader.cursor = start;
   exploreOpcodes(reader, codeLen);
  
@@ -1186,11 +1271,13 @@ llvm::Function* JavaJIT::javaCompile() {
     endSynchronize();
   }
 
+  this->restoreCurrentIsolateForCompilingMethod(oldIsolateID, false);
+
 #if JNJVM_EXECUTE > 0
-    {
+  if (!TheCompiler->isCompilingMMTk() && compilingClass->name->elements[0] == 'i') {
     Value* arg = TheCompiler->getMethodInClass(compilingMethod); 
     CallInst::Create(intrinsics->PrintMethodEndFunction, arg, "", currentBlock);
-    }
+  }
 #endif
 
   finishExceptions();
@@ -1249,8 +1336,8 @@ llvm::Function* JavaJIT::javaCompile() {
               UTF8Buffer(compilingClass->name).cString(),
               UTF8Buffer(compilingMethod->name).cString());
    
-  Attribut* annotationsAtt =
-    compilingMethod->lookupAttribut(Attribut::annotationsAttribut);
+  JavaAttribute* annotationsAtt =
+    compilingMethod->lookupAttribute(JavaAttribute::annotationsAttribute);
   
   if (annotationsAtt) {
     Reader reader(annotationsAtt, compilingClass->bytes);
@@ -1261,10 +1348,10 @@ llvm::Function* JavaJIT::javaCompile() {
       const UTF8* name =
         compilingClass->ctpInfo->UTF8At(AR.AnnotationNameIndex);
       if (name->equals(TheCompiler->InlinePragma)) {
-        llvmFunction->removeFnAttr(Attribute::NoInline);
-        llvmFunction->addFnAttr(Attribute::AlwaysInline);
+        llvmFunction->removeFnAttr(llvm::Attribute::NoInline);
+        llvmFunction->addFnAttr(llvm::Attribute::AlwaysInline);
       } else if (name->equals(TheCompiler->NoInlinePragma)) {
-        llvmFunction->addFnAttr(Attribute::NoInline);
+        llvmFunction->addFnAttr(llvm::Attribute::NoInline);
       }
     }
   }
@@ -1299,7 +1386,7 @@ void JavaJIT::loadConstant(uint16 index)
       Value* val = TheCompiler->getString(str);
       push(val, false, upcalls->newString);
     } else {
-      JavaString** str = (JavaString**)ctpInfo->ctpRes[index];
+      JavaString** str = (JavaString**)ctpInfo->getCachedValue(index);
       if ((str != NULL) && !TheCompiler->isStaticCompiling()) {
         Value* val = TheCompiler->getStringPtr(str);
         val = new LoadInst(val, "", currentBlock);
@@ -1574,7 +1661,7 @@ Instruction* JavaJIT::lowerDoubleOps(con
 Instruction* JavaJIT::invokeInline(JavaMethod* meth, 
                                    std::vector<Value*>& args,
                                    bool customized) {
-  JavaJIT jit(TheCompiler, meth, llvmFunction, customized ? customizeFor : NULL);
+  JavaJIT jit(TheCompiler, meth, llvmFunction, customized ? customizeFor : NULL, compilingMMTk);
   jit.unifiedUnreachable = unifiedUnreachable;
   jit.inlineMethods = inlineMethods;
   jit.inlineMethods[meth] = true;
@@ -1739,13 +1826,11 @@ Value* JavaJIT::getConstantPoolAt(uint32
 
 // This makes unswitch loop very unhappy time-wise, but makes GVN happy
 // number-wise. IMO, it's better to have this than Unswitch.
-  JavaConstantPool* ctp = compilingClass->ctpInfo;
-  Value* CTP = TheCompiler->getResolvedConstantPool(ctp);
   Value* Cl = TheCompiler->getNativeClass(compilingClass);
 
   std::vector<Value*> Args;
   Args.push_back(resolver);
-  Args.push_back(CTP);
+  Args.push_back(compilingMMTk ? intrinsics->constantZero : intrinsics->CurrentIsolateID);
   Args.push_back(Cl);
   Args.push_back(ConstantInt::get(Type::getInt32Ty(*llvmContext), index));
   if (additionalArg) Args.push_back(additionalArg);
@@ -1889,6 +1974,8 @@ Value* JavaJIT::ldResolved(uint16 index,
       }
 
       object = TheCompiler->getStaticInstance(field->classDef);
+      if (!object)
+        object = CallInst::Create(intrinsics->GetStaticInstanceFunction, Cl, "", currentBlock);
     } else {
       object = new LoadInst(
           object, "", false, currentBlock);
@@ -2321,7 +2408,11 @@ Instruction* JavaJIT::invoke(Value *F, s
   if (jmpBuffer != NULL) {
     BasicBlock* doCall = createBasicBlock("");
     ifException = createBasicBlock("");
-    Instruction* check = CallInst::Create(intrinsics->SetjmpFunction, jmpBuffer, "", currentBlock);
+
+    Value* GEP[] = {intrinsics->constantZero, intrinsics->OffsetSetJmpBufferInExceptionBufferConstant, intrinsics->constantZero};
+    Value *setjmpBuffer = GetElementPtrInst::Create(jmpBuffer, GEP, "setjmpBuffer", currentBlock);
+    Instruction* check = CallInst::Create(intrinsics->SetjmpFunction, setjmpBuffer, "", currentBlock);
+
     check = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, check, intrinsics->constantZero, "");
     BranchInst::Create(doCall, ifException, check, currentBlock);
     currentBlock = doCall;
@@ -2338,6 +2429,14 @@ Instruction* JavaJIT::invoke(Value *F, s
     BranchInst::Create(ifNormal, currentBlock);
 
     currentBlock = ifException;
+
+    // Restore the isolate ID of the current method.
+    // The called method had an exception and might not have restored the isolate ID as necessary.
+    Value* GEP[] = {intrinsics->constantZero, intrinsics->OffsetHandlerIsolateIDInExceptionBufferConstant};
+    Value *handlerIsolateID = GetElementPtrInst::Create(jmpBuffer, GEP, "", currentBlock);
+    handlerIsolateID = new LoadInst(handlerIsolateID, "handlerIsolateID", currentBlock);
+    this->restoreCurrentIsolateForCompilingMethod(handlerIsolateID, true);
+
     CallInst::Create(intrinsics->UnregisterSetjmpFunction, jmpBuffer, "", currentBlock);
     BranchInst::Create(currentExceptionBlock, currentBlock);
     currentBlock = ifNormal; 

Modified: vmkit/trunk/lib/j3/Compiler/JavaJIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJIT.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJIT.h (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJIT.h Thu Apr 25 11:46:36 2013
@@ -79,7 +79,8 @@ public:
   JavaJIT(JavaLLVMCompiler* C,
           JavaMethod* meth,
           llvm::Function* func,
-          Class* customized) {
+          Class* customized,
+          bool CompilingMMTk = false) {
     compilingMethod = meth;
     compilingClass = meth->classDef;
     upcalls = compilingClass->classLoader->bootstrapLoader->upcalls;
@@ -99,6 +100,7 @@ public:
     overridesThis = false;
     nbHandlers = 0;
     jmpBuffer = NULL;
+    compilingMMTk = CompilingMMTk;
   }
 
   /// javaCompile - Compile the Java method.
@@ -114,6 +116,8 @@ public:
   uint32_t nbHandlers;
 
 private:
+  bool compilingMMTk;
+
   /// Whether the method overrides 'this'.
   bool overridesThis;
   
@@ -173,9 +177,6 @@ private:
   /// getMutatorThreadPtr - Emit code to get a pointer to the current MutatorThread.
 	llvm::Value* getMutatorThreadPtr();
 
-  /// getIsolateIDPtr - Emit code to get a pointer to IsolateID.
-	llvm::Value* getIsolateIDPtr(llvm::Value* mutatorThreadPtr);
-
   /// getVMPtr - Emit code to get a pointer to MyVM.
 	llvm::Value* getVMPtr(llvm::Value* mutatorThreadPtr);
 
@@ -547,6 +548,11 @@ private:
   llvm::Instruction* invoke(llvm::Value *F, const char* Name,
                             llvm::BasicBlock *InsertAtEnd);
   
+  llvm::Value* getClassDelegateePtr(CommonClass* cl);
+  llvm::Value* setCurrentIsolateForCompilingMethod(llvm::Value* currentIsolateID, bool alwaysSet);
+  void restoreCurrentIsolateForCompilingMethod(llvm::Value* oldIsolateID, bool alwaysRestore);
+  bool shouldMethodChangeCurrentIsolate();
+
 //===--------------------- Yield point support  ---------------------------===//
 
   void checkYieldPoint();

Modified: vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp Thu Apr 25 11:46:36 2013
@@ -24,6 +24,7 @@
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Target/TargetData.h"
 #include <../lib/ExecutionEngine/JIT/JIT.h>
+#include <../lib/ExecutionEngine/RuntimeDyld/JITRegistrar.h>
 
 #include "VmkitGC.h"
 #include "vmkit/VirtualMachine.h"
@@ -62,7 +63,9 @@ Constant* JavaJITCompiler::getNativeClas
 }
 
 Constant* JavaJITCompiler::getResolvedConstantPool(JavaConstantPool* ctp) {
-  void* ptr = ctp->ctpRes;
+  assert(false && "Must not be here.");
+
+  void* ptr = NULL;	// = ctp->ctpRes;
   assert(ptr && "No constant pool found");
   ConstantInt* CI = ConstantInt::get(Type::getInt64Ty(getLLVMContext()),
                                      uint64_t(ptr));
@@ -114,11 +117,17 @@ Constant* JavaJITCompiler::getFinalObjec
   return NULL;
 }
 
-Constant* JavaJITCompiler::getStaticInstance(Class* classDef) {
-  void* obj = classDef->getStaticInstance();
+Constant* JavaJITCompiler::getStaticInstance(Class* classDef, isolate_id_t isolateID) {
+  if (!compilingMMTk) {
+    // Thanks for calling me, but you should call j3GetStaticInstance() to get the static instance
+    // pointer at runtime.
+    return NULL;
+  }
+
+  void* obj = classDef->getStaticInstance(isolateID);
   if (!obj) {
     classDef->acquire();
-    obj = classDef->getStaticInstance();
+    obj = classDef->getStaticInstance(isolateID);
     if (!obj) {
       // Allocate now so that compiled code can reference it.
       obj = classDef->allocateStaticInstance(JavaThread::get()->getJVM());
@@ -152,8 +161,8 @@ Constant* JavaJITCompiler::getNativeFunc
   return ConstantExpr::getIntToPtr(CI, valPtrType);
 }
 
-JavaJITCompiler::JavaJITCompiler(const std::string &ModuleID) :
-  JavaLLVMCompiler(ModuleID), listener(this) {
+JavaJITCompiler::JavaJITCompiler(const std::string &ModuleID, bool compilingMMTk) :
+  JavaLLVMCompiler(ModuleID, compilingMMTk), listener(this) {
 
   EmitFunctionName = false;
   GCInfo = NULL;
@@ -161,6 +170,8 @@ JavaJITCompiler::JavaJITCompiler(const s
   EngineBuilder engine(TheModule);
   TargetOptions options;
   options.NoFramePointerElim = true;
+  options.JITEmitDebugInfo = true;
+//  engine.setUseMCJIT(true);
   engine.setTargetOptions(options);
   engine.setEngineKind(EngineKind::JIT);
   executionEngine = engine.create();
@@ -400,11 +411,11 @@ Value* JavaJ3LazyJITCompiler::addCallbac
   // Set the stub in the constant pool.
   JavaConstantPool* ctpInfo = cl->ctpInfo;
   word_t stub = stat ? sign->getStaticCallStub() : sign->getSpecialCallStub();
-  if (!ctpInfo->ctpRes[index]) {
-    // Do a compare and swap, so that we do not overwrtie what a stub might
+  if (!ctpInfo->getCachedValue(index)) {
+    // Do a compare and swap, so that we do not overwrite what a stub might
     // have just updated.
     word_t val = (word_t)
-      __sync_val_compare_and_swap(&(ctpInfo->ctpRes[index]), NULL, (void*)stub);
+      ctpInfo->updateCachedValueSynchronized(index, (void*)stub, NULL);
     // If there is something in the the constant pool that is not NULL nor
     // the stub, then it's the method.
     if (val != 0 && val != stub) {
@@ -414,11 +425,12 @@ Value* JavaJ3LazyJITCompiler::addCallbac
     }
   }
   // Load the constant pool.
-  Value* CTP = getResolvedConstantPool(ctpInfo);
-  Value* Index = ConstantInt::get(Type::getInt32Ty(insert->getContext()),
-                                  index);
-  Value* func = GetElementPtrInst::Create(CTP, Index, "", insert);
-  func = new LoadInst(func, "", false, insert);
+  Value* Args[] = {
+    getNativeClass(cl),
+    ConstantInt::get(Type::getInt32Ty(insert->getContext()), index),
+    compilingMMTk ? JavaIntrinsics.constantZero : JavaIntrinsics.CurrentIsolateID
+  };
+  Value* func = CallInst::Create(JavaIntrinsics.GetCachedValueFunction, Args, "", insert);
   // Bitcast it to the LLVM function.
   func = new BitCastInst(func, stat ? LSI->getStaticPtrType() :
                                       LSI->getVirtualPtrType(),
@@ -434,10 +446,10 @@ bool JavaJ3LazyJITCompiler::needsCallbac
           getMethod(meth, customizeFor)->hasExternalWeakLinkage());
 }
 
-JavaJ3LazyJITCompiler::JavaJ3LazyJITCompiler(const std::string& ModuleID)
-    : JavaJITCompiler(ModuleID) {}
+JavaJ3LazyJITCompiler::JavaJ3LazyJITCompiler(const std::string& ModuleID, bool compilingMMTk)
+    : JavaJITCompiler(ModuleID, compilingMMTk) {}
 
 
-JavaJITCompiler* JavaJITCompiler::CreateCompiler(const std::string& ModuleID) {
-  return new JavaJ3LazyJITCompiler(ModuleID);
+JavaJITCompiler* JavaJITCompiler::CreateCompiler(const std::string& ModuleID, bool compilingMMTk) {
+  return new JavaJ3LazyJITCompiler(ModuleID, compilingMMTk);
 }

Modified: vmkit/trunk/lib/j3/Compiler/JavaLLVMCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaLLVMCompiler.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaLLVMCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaLLVMCompiler.cpp Thu Apr 25 11:46:36 2013
@@ -25,9 +25,9 @@ using namespace llvm;
 
 namespace j3 {
 
-JavaLLVMCompiler::JavaLLVMCompiler(const std::string& str) :
+JavaLLVMCompiler::JavaLLVMCompiler(const std::string& str, bool CompilingMMTk) :
   TheModule(new llvm::Module(str, *(new LLVMContext()))),
-  DebugFactory(new DIBuilder(*TheModule)) {
+  DebugFactory(new DIBuilder(*TheModule)), compilingMMTk(CompilingMMTk) {
 
   enabledException = true;
   cooperativeGC = true;
@@ -61,7 +61,7 @@ Function* JavaLLVMCompiler::parseFunctio
   // We are jitting. Take the lock.
   vmkit::VmkitModule::protectIR();
   if (func->getLinkage() == GlobalValue::ExternalWeakLinkage) {
-    JavaJIT jit(this, meth, func, customizeFor);
+    JavaJIT jit(this, meth, func, customizeFor, compilingMMTk);
     if (isNative(meth->access)) {
       jit.nativeCompile();
       vmkit::VmkitModule::runPasses(func, JavaNativeFunctionPasses);

Modified: vmkit/trunk/lib/j3/Compiler/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/LowerConstantCalls.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/LowerConstantCalls.cpp Thu Apr 25 11:46:36 2013
@@ -38,30 +38,6 @@ private:
 };
 char LowerConstantCalls::ID = 0;
 
-static Value* getTCM(J3Intrinsics* intrinsics, Value* Arg, Instruction* CI) {
-  Value* GEP[2] = { intrinsics->constantZero,
-                    intrinsics->OffsetTaskClassMirrorInClassConstant };
-  Value* TCMArray = GetElementPtrInst::Create(Arg, GEP, "", CI);
-  
-  Value* GEP2[2] = { intrinsics->constantZero, intrinsics->constantZero };
-
-  Value* TCM = GetElementPtrInst::Create(TCMArray, GEP2, "", CI);
-  return TCM;
-
-}
-
-static Value* getDelegatee(J3Intrinsics* intrinsics, Value* Arg, Instruction* CI) {
-  Value* GEP[2] = { intrinsics->constantZero,
-                    intrinsics->constantZero };
-  Value* TCMArray = GetElementPtrInst::Create(Arg, GEP, "", CI);
-  
-  Value* GEP2[2] = { intrinsics->constantZero, intrinsics->constantZero };
-
-  Value* TCM = GetElementPtrInst::Create(TCMArray, GEP2, "", CI);
-  return new LoadInst(TCM, "", CI);
-
-}
-
 bool LowerConstantCalls::runOnFunction(Function& F) {
   LLVMContext* Context = &F.getContext();
   bool Changed = false;
@@ -279,107 +255,12 @@ bool LowerConstantCalls::runOnFunction(F
           Value* Class = new LoadInst(ClassPtr, "", CI);
           CI->replaceAllUsesWith(Class);
           CI->eraseFromParent();
-        } else if (V == intrinsics->GetClassDelegateeFunction) {
-          Changed = true;
-          BasicBlock* NBB = II->getParent()->splitBasicBlock(II);
-          I->getParent()->getTerminator()->eraseFromParent();
-          Value* Del = getDelegatee(intrinsics, Call.getArgument(0), CI);
-          Value* cmp = new ICmpInst(CI, ICmpInst::ICMP_EQ, Del, 
-                                    intrinsics->JavaObjectNullConstant, "");
-          
-          BasicBlock* NoDelegatee = BasicBlock::Create(*Context, "No delegatee", &F);
-          BasicBlock* DelegateeOK = BasicBlock::Create(*Context, "Delegatee OK", &F);
-          BranchInst::Create(NoDelegatee, DelegateeOK, cmp, CI);
-          PHINode* phi = PHINode::Create(intrinsics->JavaObjectType, 2, "", DelegateeOK);
-          phi->addIncoming(Del, CI->getParent());
-          
-          Instruction* Res = CallInst::Create(intrinsics->RuntimeDelegateeFunction,
-                                              Call.getArgument(0), "", NoDelegatee);
-          Res->setDebugLoc(CI->getDebugLoc());
-          BranchInst::Create(DelegateeOK, NoDelegatee);
-          phi->addIncoming(Res, NoDelegatee);
-
-          CI->replaceAllUsesWith(phi);
-          CI->eraseFromParent();
-          BranchInst::Create(NBB, DelegateeOK);
-          break;
-         
-        } else if (V == intrinsics->InitialisationCheckFunction) {
-          Changed = true;
-          
-          BasicBlock* NBB = 0;
-          if (CI->getParent()->getTerminator() != CI) {
-            NBB = II->getParent()->splitBasicBlock(II);
-            CI->getParent()->getTerminator()->eraseFromParent();
-          } else {
-            InvokeInst* Invoke = dyn_cast<InvokeInst>(CI);
-            assert(Invoke && "Last instruction is not an invoke");
-            NBB = Invoke->getNormalDest();
-          }
-         
-          Value* Cl = Call.getArgument(0); 
-          Value* TCM = getTCM(intrinsics, Call.getArgument(0), CI);
-          Value* GEP[2] = 
-            { intrinsics->constantZero,
-              intrinsics->OffsetInitializedInTaskClassMirrorConstant };
-          Value* StatusPtr = GetElementPtrInst::Create(TCM, GEP, "", CI);
-          
-          Value* test = new LoadInst(StatusPtr, "", CI);
-          
-          BasicBlock* trueCl = BasicBlock::Create(*Context, "Initialized", &F);
-          BasicBlock* falseCl = BasicBlock::Create(*Context, "Uninitialized", &F);
-          PHINode* node = llvm::PHINode::Create(intrinsics->JavaClassType, 2, "", trueCl);
-          node->addIncoming(Cl, CI->getParent());
-          BranchInst::Create(trueCl, falseCl, test, CI);
-  
-          
-          Instruction* res = 0;
-          if (InvokeInst* Invoke = dyn_cast<InvokeInst>(CI)) {
-            Value* Args[1] = { Cl };
-            BasicBlock* UI = Invoke->getUnwindDest();
-
-            res = InvokeInst::Create(intrinsics->InitialiseClassFunction,
-                                     trueCl, UI, Args, "", falseCl);
-
-            // For some reason, an LLVM pass may add PHI nodes to the
-            // exception destination.
-            BasicBlock::iterator Temp = UI->getInstList().begin();
-            while (PHINode* PHI = dyn_cast<PHINode>(Temp)) {
-              Value* Val = PHI->getIncomingValueForBlock(CI->getParent());
-              PHI->removeIncomingValue(CI->getParent(), false);
-              PHI->addIncoming(Val, falseCl);
-              Temp++;
-            }
-            
-            // And here we set the phi nodes of the normal dest of the Invoke
-            // instruction. The phi nodes have now the trueCl as basic block.
-            Temp = NBB->getInstList().begin();
-            while (PHINode* PHI = dyn_cast<PHINode>(Temp)) {
-              Value* Val = PHI->getIncomingValueForBlock(CI->getParent());
-              PHI->removeIncomingValue(CI->getParent(), false);
-              PHI->addIncoming(Val, trueCl);
-              Temp++;
-            }
-
-          } else {
-            res = CallInst::Create(intrinsics->InitialiseClassFunction,
-                                   Cl, "", falseCl);
-            BranchInst::Create(trueCl, falseCl);
-          }
-          res->setDebugLoc(CI->getDebugLoc());
-          
-          node->addIncoming(res, falseCl);
-
-
-          CI->replaceAllUsesWith(node);
-          CI->eraseFromParent();
-          BranchInst::Create(NBB, trueCl);
-          break;
         } else if (V == intrinsics->GetConstantPoolAtFunction) {
           Function* resolver = dyn_cast<Function>(Call.getArgument(0));
           assert(resolver && "Wrong use of GetConstantPoolAt");
           Type* returnType = resolver->getReturnType();
-          Value* CTP = Call.getArgument(1);
+          Value* isolateID = Call.getArgument(1);
+          Value* cl = Call.getArgument(2);
           Value* Index = Call.getArgument(3);
           Changed = true;
           BasicBlock* NBB = 0;
@@ -392,9 +273,8 @@ bool LowerConstantCalls::runOnFunction(F
             NBB = Invoke->getNormalDest();
           }
           
-          Value* indexes = Index;
-          Value* arg1 = GetElementPtrInst::Create(CTP, indexes, "", CI);
-          arg1 = new LoadInst(arg1, "", false, CI);
+          Value* GCVArgs[] = {cl, Index, isolateID};
+          Value* arg1 = CallInst::Create(intrinsics->GetCachedValueFunction, GCVArgs, "", CI);
           Value* test = new ICmpInst(CI, ICmpInst::ICMP_EQ, arg1,
                                      intrinsics->constantPtrNull, "");
  

Modified: vmkit/trunk/lib/j3/LLVMRuntime/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/LLVMRuntime/Makefile?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/LLVMRuntime/Makefile (original)
+++ vmkit/trunk/lib/j3/LLVMRuntime/Makefile Thu Apr 25 11:46:36 2013
@@ -12,7 +12,8 @@ include $(LEVEL)/Makefile.config
 
 VMKIT_RUNTIME = $(PROJ_SRC_DIR)/runtime-default.ll
 VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-mmtk-thread.ll
-VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-single.ll
+#VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-single.ll
+VMKIT_RUNTIME += $(PROJ_SRC_DIR)/runtime-isolate.ll
 
 BUILT_SOURCES = LLVMRuntime.inc
 

Modified: vmkit/trunk/lib/j3/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/LLVMRuntime/runtime-default.ll?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/j3/LLVMRuntime/runtime-default.ll Thu Apr 25 11:46:36 2013
@@ -5,6 +5,9 @@
 ;;; A virtual table is an array of function pointers.
 %VT = type [0 x i32 (...)*]
 
+;;; Java VT (partial definition, only needed fields)
+%JavaVT = type { i8*, i8*, i8*, [ 1 x i8* ], %JavaCommonClass* }
+
 ;;; The root of all Java Objects: a VT and a lock.
 %JavaObject = type { %VT*, i8* }
 
@@ -22,15 +25,15 @@
 %ArrayUInt8 = type { %JavaObject, i8*, [0 x i8] }
 
 ;;; The task class mirror.
-;;; Field 1: The class state
-;;; Field 2: The initialization state
-;;; Field 3: The static instance
+;;; Field 0: The class state
+;;; Field 1: The initialization state
+;;; Field 2: The static instance
 %TaskClassMirror = type { i8, i1, i8* }
 
 %CircularBase = type { %VT*, %CircularBase*, %CircularBase* }
 
 ;;; Field 0:  the parent (circular base)
-;;; Field 1:  size_t IsolateID
+;;; Field 1:  isolate_id_t IsolateID
 ;;; Field 2:  void*  MyVM
 ;;; Field 3:  void*  baseSP
 ;;; Field 4:  bool   doYield
@@ -41,21 +44,21 @@
 ;;; field 9:  void*  routine
 ;;; field 10: void*  lastKnownFrame
 ;;; field 11: void*  lastExceptionBuffer
-%Thread = type { %CircularBase, i8*, i8*, i8*, i1, i1, i1, i8*, i8*, i8*, i8*, i8* }
+%Thread = type { %CircularBase, i32, i8*, i8*, i1, i1, i1, i8*, i8*, i8*, i8*, i8*, i1 }
 
 %JavaThread = type { %MutatorThread, i8*, %JavaObject* }
 
 %JavaConstantPool = type { %JavaClass*, i32, i8*, i32*, i8** }
 
-%Attribut = type { %UTF8*, i32, i32 }
+%Attribute = type { %UTF8*, i32, i32 }
 
-%UTF8 = type { i8*, [0 x i16] }
+%UTF8 = type { i32, [0 x i16] }
 
 
-%JavaField = type { i8*, i16, %UTF8*, %UTF8*, %Attribut*, i16, %JavaClass*, i32,
+%JavaField = type { i8*, i16, %UTF8*, %UTF8*, %Attribute*, i16, %JavaClass*, i32,
                     i16 }
 
-%JavaMethod = type { i8*, i16, %Attribut*, i16, %JavaClass*,
+%JavaMethod = type { i8*, i16, %Attribute*, i16, %JavaClass*,
                      %UTF8*, %UTF8*, i8, i8*, i32 }
 
 %JavaClassPrimitive = type { %JavaCommonClass, i32 }
@@ -88,10 +91,11 @@ declare void @listAllTypes(%JavaObject,
                            %JavaField,
                            %JavaMethod,
                            %UTF8,
-                           %Attribut,
+                           %Attribute,
                            %JavaThread,
                            %MutatorThread,
-                           %J3DenseMap);
+                           %J3DenseMap,
+                           %JavaVT);
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;; Constant calls for J3 runtime internal objects field accesses ;;;;;;;;;
@@ -144,7 +148,7 @@ declare %VT* @getVTInDisplay(%VT**, i32)
 declare i32 @getDepth(%VT*) readnone 
 
 ;;; getStaticInstance - Get the static instance of this class.
-declare i8* @getStaticInstance(%JavaClass*) readnone 
+declare i8* @j3GetStaticInstance(%JavaClass*) readnone 
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -161,7 +165,8 @@ declare %JavaObject* @j3MultiCallNew(%Ja
 ;;; initialisationCheck - Checks if the class has been initialized and 
 ;;; initializes if not. This is used for initialization barriers in an isolate
 ;;; environment, and in some specific scenario in a single environment.
-declare %JavaClass* @initialisationCheck(%JavaClass*) readnone 
+declare %JavaClass* @j3InitialisationCheck(%JavaClass*)
+declare %JavaClass* @j3InitialisationCheckForJavaObject(%JavaObject*)
 
 ;;; forceInitialisationCheck - Force to check initialization. The difference
 ;;; between this function and the initialisationCheck function is that the
@@ -179,8 +184,9 @@ declare void @forceLoadedCheck(%JavaComm
 ;;; getConstantPoolAt - Get the value in the constant pool of this class.
 ;;; This function is removed by J3's LLVM pass, therefore it does
 ;;; not have an actual implementation.
-declare i8* @getConstantPoolAt(i8* (%JavaClass*, i32, ...)*, i8**,
+declare i8* @getConstantPoolAt(i8* (%JavaClass*, i32, ...)*, i32,
                                %JavaClass*, i32, ...)
+declare i8* @j3GetCachedValue(%JavaClass*, i32, i32)
 
 ;;; j3VirtualTableLookup - Look up the offset in a virtual table of a
 ;;; specific function.
@@ -218,11 +224,13 @@ declare i1 @isSecondaryClass(%VT*, %VT*)
 ;;; getClassDelegatee - Returns the java/lang/Class representation of the
 ;;; class. This method is lowered to the GEP to the class delegatee in
 ;;; the common class.
-declare %JavaObject* @getClassDelegatee(%JavaCommonClass*)
+declare %JavaObject** @j3GetClassDelegateePtr(%JavaCommonClass*)
+declare %JavaObject* @j3GetClassDelegatee(%JavaCommonClass*)
 
 ;;; j3RuntimeDelegatee - Returns the java/lang/Class representation of the
 ;;; class. This method is called if the class delegatee has not been created
 ;;; yet.
+declare %JavaObject** @j3RuntimeDelegateePtr(%JavaCommonClass*)
 declare %JavaObject* @j3RuntimeDelegatee(%JavaCommonClass*)
 
 ;;; j3GetArrayClass - Get the array user class of the user class.

Copied: vmkit/trunk/lib/j3/LLVMRuntime/runtime-isolate.ll (from r180278, vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll)
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/LLVMRuntime/runtime-isolate.ll?p2=vmkit/trunk/lib/j3/LLVMRuntime/runtime-isolate.ll&p1=vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll&r1=180278&r2=180279&rev=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll (original)
+++ vmkit/trunk/lib/j3/LLVMRuntime/runtime-isolate.ll Thu Apr 25 11:46:36 2013
@@ -2,12 +2,14 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;; Isolate specific types ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-%JavaCommonClass = type { [1 x %JavaObject*], i32,
+%JavaCommonClass = type { [256 x %JavaObject*], i32,
                           %JavaClass**, i16, %UTF8*, %JavaClass*, i8*, %VT* }
 
 %ClassBytes = type { i32, i8* }
 
-%JavaClass = type { %JavaCommonClass, i32, i32, [1 x %TaskClassMirror],
+%JavaClass = type { %JavaCommonClass, i32, i32, [256 x %TaskClassMirror],
                     %JavaField*, i16, %JavaField*, i16, %JavaMethod*, i16,
-                    %JavaMethod*, i16, i8*, %ClassBytes*, %JavaConstantPool*, %Attribut*,
+                    %JavaMethod*, i16, i8*, %ClassBytes*, %JavaConstantPool*, %Attribute*,
                     i16, %JavaClass**, i16, %JavaClass*, i16, i8, i8, i32, i32 }
+
+declare i32 @j3SetIsolate(i32, i32*)

Modified: vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll (original)
+++ vmkit/trunk/lib/j3/LLVMRuntime/runtime-single.ll Thu Apr 25 11:46:36 2013
@@ -9,5 +9,5 @@
 
 %JavaClass = type { %JavaCommonClass, i32, i32, [1 x %TaskClassMirror],
                     %JavaField*, i16, %JavaField*, i16, %JavaMethod*, i16,
-                    %JavaMethod*, i16, i8*, %ClassBytes*, %JavaConstantPool*, %Attribut*,
+                    %JavaMethod*, i16, i8*, %ClassBytes*, %JavaConstantPool*, %Attribute*,
                     i16, %JavaClass**, i16, %JavaClass*, i16, i8, i8, i32, i32 }

Modified: vmkit/trunk/lib/j3/VMCore/JavaArray.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaArray.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaArray.h Thu Apr 25 11:46:36 2013
@@ -120,7 +120,7 @@ ARRAYCLASS(ArraySInt32, sint32);
 ARRAYCLASS(ArrayLong,   sint64);
 ARRAYCLASS(ArrayFloat,  float);
 ARRAYCLASS(ArrayDouble, double);
-ARRAYCLASS(ArrayPtr, word_t);
+ARRAYCLASS(ArrayPtr, void*);
 
 #undef ARRAYCLASS
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 11:46:36 2013
@@ -29,17 +29,17 @@
 
 using namespace j3;
 
-const UTF8* Attribut::annotationsAttribut = 0;
-const UTF8* Attribut::codeAttribut = 0;
-const UTF8* Attribut::exceptionsAttribut = 0;
-const UTF8* Attribut::constantAttribut = 0;
-const UTF8* Attribut::lineNumberTableAttribut = 0;
-const UTF8* Attribut::innerClassesAttribut = 0;
-const UTF8* Attribut::sourceFileAttribut = 0;
-const UTF8* Attribut::signatureAttribut = 0;
-const UTF8* Attribut::enclosingMethodAttribut = 0;
-const UTF8* Attribut::paramAnnotationsAttribut = 0;
-const UTF8* Attribut::annotationDefaultAttribut = 0;
+const UTF8* JavaAttribute::annotationsAttribute = 0;
+const UTF8* JavaAttribute::codeAttribute = 0;
+const UTF8* JavaAttribute::exceptionsAttribute = 0;
+const UTF8* JavaAttribute::constantAttribute = 0;
+const UTF8* JavaAttribute::lineNumberTableAttribute = 0;
+const UTF8* JavaAttribute::innerClassesAttribute = 0;
+const UTF8* JavaAttribute::sourceFileAttribute = 0;
+const UTF8* JavaAttribute::signatureAttribute = 0;
+const UTF8* JavaAttribute::enclosingMethodAttribute = 0;
+const UTF8* JavaAttribute::paramAnnotationsAttribute = 0;
+const UTF8* JavaAttribute::annotationDefaultAttribute = 0;
 
 Class* ClassArray::SuperArray;
 Class** ClassArray::InterfacesArray;
@@ -49,7 +49,7 @@ extern "C" void ArrayObjectTracer(JavaOb
 extern "C" void RegularObjectTracer(JavaObject*);
 extern "C" void ReferenceObjectTracer(JavaObject*);
 
-Attribut::Attribut(const UTF8* name, uint32 length,
+JavaAttribute::JavaAttribute(const UTF8* name, uint32 length,
                    uint32 offset) {
   
   this->start    = offset;
@@ -57,27 +57,27 @@ Attribut::Attribut(const UTF8* name, uin
   this->name     = name;
 }
 
-Attribut* Class::lookupAttribut(const UTF8* key) {
-  for (uint32 i = 0; i < nbAttributs; ++i) {
-    Attribut* cur = &(attributs[i]);
+JavaAttribute* Class::lookupAttribute(const UTF8* key) {
+  for (uint32 i = 0; i < nbAttributes; ++i) {
+    JavaAttribute* cur = &(attributes[i]);
     if (cur->name->equals(key)) return cur;
   }
 
   return 0;
 }
 
-Attribut* JavaField::lookupAttribut(const UTF8* key) {
-  for (uint32 i = 0; i < nbAttributs; ++i) {
-    Attribut* cur = &(attributs[i]);
+JavaAttribute* JavaField::lookupAttribute(const UTF8* key) {
+  for (uint32 i = 0; i < nbAttributes; ++i) {
+    JavaAttribute* cur = &(attributes[i]);
     if (cur->name->equals(key)) return cur;
   }
 
   return 0;
 }
 
-Attribut* JavaMethod::lookupAttribut(const UTF8* key) {
-  for (uint32 i = 0; i < nbAttributs; ++i) {
-    Attribut* cur = &(attributs[i]);
+JavaAttribute* JavaMethod::lookupAttribute(const UTF8* key) {
+  for (uint32 i = 0; i < nbAttributes; ++i) {
+    JavaAttribute* cur = &(attributes[i]);
     if (cur->name->equals(key)) return cur;
   }
 
@@ -88,9 +88,9 @@ CommonClass::~CommonClass() {
 }
 
 Class::~Class() {
-  for (uint32 i = 0; i < nbAttributs; ++i) {
-    Attribut* cur = &(attributs[i]);
-    cur->~Attribut();
+  for (uint32 i = 0; i < nbAttributes; ++i) {
+    JavaAttribute* cur = &(attributes[i]);
+    cur->~JavaAttribute();
     classLoader->allocator.Deallocate(cur);
   }
   
@@ -132,17 +132,17 @@ Class::~Class() {
 }
 
 JavaField::~JavaField() {
-  for (uint32 i = 0; i < nbAttributs; ++i) {
-    Attribut* cur = &(attributs[i]);
-    cur->~Attribut();
+  for (uint32 i = 0; i < nbAttributes; ++i) {
+    JavaAttribute* cur = &(attributes[i]);
+    cur->~JavaAttribute();
     classDef->classLoader->allocator.Deallocate(cur);
   }
 }
 
 JavaMethod::~JavaMethod() { 
-  for (uint32 i = 0; i < nbAttributs; ++i) {
-    Attribut* cur = &(attributs[i]);
-    cur->~Attribut();
+  for (uint32 i = 0; i < nbAttributes; ++i) {
+    JavaAttribute* cur = &(attributes[i]);
+    cur->~JavaAttribute();
     classDef->classLoader->allocator.Deallocate(cur);
   }
 }
@@ -441,11 +441,11 @@ JavaField* Class::lookupField(const UTF8
   return res;
 }
 
-JavaObject* UserClass::doNew(Jnjvm* vm) {
+JavaObject* UserClass::doNew(Jnjvm* vm, isolate_id_t isolateID) {
   JavaObject* res = NULL;
   llvm_gcroot(res, 0);
   assert(this && "No class when allocating.");
-  assert((this->isInitializing() || 
+  assert((this->isInitializing(isolateID) ||
           classLoader->getCompiler()->isStaticCompiling() ||
           this == classLoader->bootstrapLoader->upcalls->newClass)
          && "Uninitialized class when allocating.");
@@ -517,10 +517,10 @@ bool JavaVirtualTable::isSubtypeOf(JavaV
   return false;
 }
 
-void JavaField::InitNullStaticField() {
+void JavaField::InitNullStaticField(isolate_id_t isolateID) {
   
   Typedef* type = getSignature();
-  void* obj = classDef->getStaticInstance();
+  void* obj = classDef->getStaticInstance(isolateID);
   if (!type->isPrimitive()) {
     ((JavaObject**)((uint64)obj + ptrOffset))[0] = NULL;
     return;
@@ -548,9 +548,9 @@ void JavaField::InitNullStaticField() {
   }
 }
 
-void JavaField::InitStaticField(uint64 val) { 
+void JavaField::InitStaticField(uint64 val, isolate_id_t isolateID) {
   Typedef* type = getSignature();
-  void* obj = classDef->getStaticInstance();
+  void* obj = classDef->getStaticInstance(isolateID);
   assert(type->isPrimitive() && "Non primitive field");
   PrimitiveTypedef* prim = (PrimitiveTypedef*)type;
   if (prim->isLong()) {
@@ -571,30 +571,31 @@ void JavaField::InitStaticField(uint64 v
   }
 }
 
-void JavaField::InitStaticField(JavaObject* val) {
+void JavaField::InitStaticField(JavaObject* val, isolate_id_t isolateID) {
   llvm_gcroot(val, 0);
-  void* obj = classDef->getStaticInstance();
+  void* obj = classDef->getStaticInstance(isolateID);
   assert(isReference());
   JavaObject** ptr = (JavaObject**)((uint64)obj + ptrOffset);
   vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)ptr, (gc*)val);
 }
 
-void JavaField::InitStaticField(double val) {
-  void* obj = classDef->getStaticInstance();
+void JavaField::InitStaticField(double val, isolate_id_t isolateID) {
+  void* obj = classDef->getStaticInstance(isolateID);
   ((double*)((uint64)obj + ptrOffset))[0] = val;
 }
 
-void JavaField::InitStaticField(float val) {
-  void* obj = classDef->getStaticInstance();
+void JavaField::InitStaticField(float val, isolate_id_t isolateID) {
+  void* obj = classDef->getStaticInstance(isolateID);
   ((float*)((uint64)obj + ptrOffset))[0] = val;
 }
 
 void JavaField::InitStaticField(Jnjvm* vm) {
   const Typedef* type = getSignature();
-  Attribut* attribut = lookupAttribut(Attribut::constantAttribut);
+  JavaAttribute* attribut = lookupAttribute(JavaAttribute::constantAttribute);
+  isolate_id_t isolateID = JavaThread::getValidIsolateID(CURRENT_ISOLATE);
 
   if (!attribut) {
-    InitNullStaticField();
+    InitNullStaticField(isolateID);
   } else {
     Reader reader(attribut, classDef->bytes);
     JavaConstantPool * ctpInfo = classDef->ctpInfo;
@@ -602,17 +603,17 @@ void JavaField::InitStaticField(Jnjvm* v
     if (type->isPrimitive()) {
       UserCommonClass* cl = type->assocClass(vm->bootstrapLoader);
       if (cl == vm->upcalls->OfLong) {
-        InitStaticField((uint64)ctpInfo->LongAt(idx));
+        InitStaticField((uint64)ctpInfo->LongAt(idx), isolateID);
       } else if (cl == vm->upcalls->OfDouble) {
-        InitStaticField(ctpInfo->DoubleAt(idx));
+        InitStaticField(ctpInfo->DoubleAt(idx), isolateID);
       } else if (cl == vm->upcalls->OfFloat) {
-        InitStaticField(ctpInfo->FloatAt(idx));
+        InitStaticField(ctpInfo->FloatAt(idx), isolateID);
       } else {
-        InitStaticField((uint64)ctpInfo->IntegerAt(idx));
+        InitStaticField((uint64)ctpInfo->IntegerAt(idx), isolateID);
       }
     } else if (type->isReference()) {
       const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[idx]);
-      InitStaticField((JavaObject*)ctpInfo->resolveString(utf8, idx));
+      InitStaticField((JavaObject*)ctpInfo->resolveString(utf8, idx), isolateID);
     } else {
       fprintf(stderr, "I haven't verified your class file and it's malformed:"
                       " unknown constant %s!\n",
@@ -674,7 +675,7 @@ void Class::readParents(Reader& reader)
 
 void internalLoadExceptions(JavaMethod& meth) {
   
-  Attribut* codeAtt = meth.lookupAttribut(Attribut::codeAttribut);
+  JavaAttribute* codeAtt = meth.lookupAttribute(JavaAttribute::codeAttribute);
    
   if (codeAtt) {
     Reader reader(codeAtt, meth.classDef->bytes);
@@ -709,15 +710,15 @@ void UserClass::loadExceptions() {
     internalLoadExceptions(staticMethods[i]);
 }
 
-Attribut* Class::readAttributs(Reader& reader, uint16& size) {
+JavaAttribute* Class::readAttributes(Reader& reader, uint16& size) {
   uint16 nba = reader.readU2();
  
-  Attribut* attributs = new(classLoader->allocator, "Attributs") Attribut[nba];
+  JavaAttribute* attributs = new(classLoader->allocator, "Attributs") JavaAttribute[nba];
 
   for (int i = 0; i < nba; i++) {
     const UTF8* attName = ctpInfo->UTF8At(reader.readU2());
     uint32 attLen = reader.readU4();
-    Attribut& att = attributs[i];
+    JavaAttribute& att = attributs[i];
     att.start = reader.cursor;
     att.nbb = attLen;
     att.name = attName;
@@ -747,7 +748,7 @@ void Class::readFields(Reader& reader) {
       field->initialise(this, name, type, access);
       ++nbVirtualFields;
     }
-    field->attributs = readAttributs(reader, field->nbAttributs);
+    field->attributes = readAttributes(reader, field->nbAttributes);
   }
 }
 
@@ -846,7 +847,7 @@ void Class::readMethods(Reader& reader)
       meth->initialise(this, name, type, access);
       ++nbVirtualMethods;
     }
-    meth->attributs = readAttributs(reader, meth->nbAttributs);
+    meth->attributes = readAttributes(reader, meth->nbAttributes);
   }
 
   if (isAbstract(access)) {
@@ -904,7 +905,7 @@ void Class::readClass() {
   readParents(reader);
   readFields(reader);
   readMethods(reader);
-  attributs = readAttributs(reader, nbAttributs);
+  attributes = readAttributes(reader, nbAttributes);
 }
 
 void UserClass::resolveParents() {
@@ -921,14 +922,13 @@ void Class::resolveClass() {
   resolveParents();
   loadExceptions();
   // Do a compare and swap in case another thread initialized the class.
-  __sync_val_compare_and_swap(
-      &(getCurrentTaskClassMirror().status), loaded, resolved);
+  setResolvedSynchronized(loaded);
   assert(isResolved() || isErroneous());
 }
 
 void UserClass::resolveInnerOuterClasses() {
   if (!innerOuterResolved) {
-    Attribut* attribut = lookupAttribut(Attribut::innerClassesAttribut);
+    JavaAttribute* attribut = lookupAttribute(JavaAttribute::innerClassesAttribute);
     if (attribut != 0) {
       Reader reader(attribut, bytes);
       uint16 nbi = reader.readU2();
@@ -1001,7 +1001,7 @@ ArrayObject* JavaMethod::getExceptionTyp
   llvm_gcroot(res, 0);
   llvm_gcroot(delegatee, 0);
   
-  Attribut* exceptionAtt = lookupAttribut(Attribut::exceptionsAttribut);
+  JavaAttribute* exceptionAtt = lookupAttribute(JavaAttribute::exceptionsAttribute);
   Jnjvm* vm = JavaThread::get()->getJVM();
   if (exceptionAtt == 0) {
     return (ArrayObject*)vm->upcalls->classArrayClass->doNew(0, vm);
@@ -1024,15 +1024,15 @@ ArrayObject* JavaMethod::getExceptionTyp
 }
 
 
-JavaObject* CommonClass::setDelegatee(JavaObject* val) {
+JavaObject* CommonClass::setDelegatee(JavaObject* val, isolate_id_t isolateID) {
   llvm_gcroot(val, 0);
-  JavaObject** obj = &(delegatee[0]);
+  JavaObject** obj = getDelegateePtr(isolateID);
   classLoader->lock.lock();
   if (*obj == NULL) {
     vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)obj, (gc*)val);
   }
   classLoader->lock.unlock();
-  return getDelegatee();
+  return getDelegatee(isolateID);
 }
 
 
@@ -1287,14 +1287,14 @@ ArrayUInt16* JavaMethod::toString() cons
 }
 
 
-bool UserClass::needsInitialisationCheck() {
+bool UserClass::needsInitialisationCheck(isolate_id_t isolateID) {
   
-  if (isReady()) return false;
+//  if (isReady(isolateID)) return false;
 
-  if (super && super->needsInitialisationCheck())
+  if (super && super->needsInitialisationCheck(isolateID))
     return true;
 
-  if (nbStaticFields) return true;
+  if (nbStaticFields > 0) return true;
 
   JavaMethod* meth = 
     lookupMethodDontThrow(classLoader->bootstrapLoader->clinitName,
@@ -1303,7 +1303,8 @@ bool UserClass::needsInitialisationCheck
   
   if (meth) return true;
 
-  setInitializationState(ready);
+  setResolved();
+  setInitializationState(ready, isolateID);
   return false;
 }
 
@@ -1698,7 +1699,7 @@ void AnnotationReader::readElementValue(
 }
 
 uint16 JavaMethod::lookupLineNumber(vmkit::FrameInfo* info) {
-  Attribut* codeAtt = lookupAttribut(Attribut::codeAttribut);      
+  JavaAttribute* codeAtt = lookupAttribute(JavaAttribute::codeAttribute);      
   if (codeAtt == NULL) return 0;
   Reader reader(codeAtt, classDef->bytes);
   reader.readU2(); // max_stack
@@ -1711,7 +1712,7 @@ uint16 JavaMethod::lookupLineNumber(vmki
   for (uint16 att = 0; att < nba; ++att) {
     const UTF8* attName = classDef->ctpInfo->UTF8At(reader.readU2());
     uint32 attLen = reader.readU4();
-    if (attName->equals(Attribut::lineNumberTableAttribut)) {
+    if (attName->equals(JavaAttribute::lineNumberTableAttribute)) {
       uint16_t lineLength = reader.readU2();
       uint16_t currentLine = 0;
       for (uint16 j = 0; j < lineLength; ++j) {
@@ -1728,7 +1729,7 @@ uint16 JavaMethod::lookupLineNumber(vmki
 }
 
 uint16 JavaMethod::lookupCtpIndex(vmkit::FrameInfo* FI) {
-  Attribut* codeAtt = lookupAttribut(Attribut::codeAttribut);
+  JavaAttribute* codeAtt = lookupAttribute(JavaAttribute::codeAttribute);
   Reader reader(codeAtt, classDef->bytes);
   reader.cursor = reader.cursor + 2 + 2 + 4 + FI->SourceIndex + 1;
   return reader.readU2();
@@ -1763,19 +1764,20 @@ void Class::broadcastClass() {
   JavaObject::notifyAll(delegatee);
 }
 
-void JavaField::setInstanceObjectField(JavaObject* obj, JavaObject* val) {
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(val, 0);
-  if (val != NULL) assert(val->getVirtualTable());
-  assert(classDef->isResolved());
-  JavaObject** ptr = (JavaObject**)((uint64)obj + ptrOffset);
-  vmkit::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr, (gc*)val);
-}
-
-void JavaField::setStaticObjectField(JavaObject* val) {
-  llvm_gcroot(val, 0);
-  if (val != NULL) assert(val->getVirtualTable());
-  assert(classDef->isResolved());
-  JavaObject** ptr = (JavaObject**)((uint64)classDef->getStaticInstance() + ptrOffset);
-  vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)ptr, (gc*)val);
-}
+bool Class::isInitializing(isolate_id_t isolateID)
+{
+  TaskClassMirror& TCM = getTaskClassMirror(isolateID);
+  if (TCM.status >= inClinit) return true;
+  if (!isResolved(isolateID)) return false;
+
+  needsInitialisationCheck(isolateID);
+  return (TCM.status >= inClinit);
+}
+
+JavaField_IMPL_ASSESSORS(float, Float)
+JavaField_IMPL_ASSESSORS(double, Double)
+JavaField_IMPL_ASSESSORS(uint8, Int8)
+JavaField_IMPL_ASSESSORS(uint16, Int16)
+JavaField_IMPL_ASSESSORS(uint32, Int32)
+JavaField_IMPL_ASSESSORS(sint64, Long)
+JavaField_IMPL_ASSESSORS(JavaObject*, Object)

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 11:46:36 2013
@@ -22,6 +22,9 @@
 #include "JavaObject.h"
 #include "JnjvmClassLoader.h"
 #include "JnjvmConfig.h"
+#include "Jnjvm.h"
+#include "JavaTypes.h"
+#include "JavaThread.h"
 
 #include <cassert>
 #include <set>
@@ -70,84 +73,84 @@ public:
   void readElementValue();
 };
 
-/// Attribut - This class represents JVM attributes to Java class, methods and
+/// Attribute - This class represents JVM attributes to Java class, methods and
 /// fields located in the .class file.
 ///
-class Attribut : public vmkit::PermanentObject {
+class JavaAttribute : public vmkit::PermanentObject {
 public:
   
-  /// name - The name of the attribut. These are specified in the JVM book.
+  /// name - The name of the attribute. These are specified in the JVM book.
   /// Experimental attributes exist, but the JnJVM does nor parse them.
   ///
   const UTF8* name;
 
-  /// start - The offset in the class of this attribut.
+  /// start - The offset in the class of this attribute.
   ///
   uint32 start;
 
-  /// nbb - The size of the attribut.
+  /// nbb - The size of the attribute.
   ///
   uint32 nbb;
 
-  /// Attribut - Create an attribut at the given length and offset.
+  /// Attribute - Create an attribute at the given length and offset.
   ///
-  Attribut(const UTF8* name, uint32 length, uint32 offset);
-  Attribut() {}
+  JavaAttribute(const UTF8* name, uint32 length, uint32 offset);
+  JavaAttribute() {}
 
-  /// codeAttribut - The "Code" JVM attribut. This is a method attribut for
+  /// codeAttribute - The "Code" JVM attribute. This is a method attribute for
   /// finding the bytecode of a method in the .class file.
   //
-  static const UTF8* codeAttribut;
+  static const UTF8* codeAttribute;
   
-  /// annotationsAttribut - The "RuntimeVisibleAnnotations" JVM attribut.
-  /// This is a method attribut for getting the runtime annotations.
+  /// annotationsAttribute - The "RuntimeVisibleAnnotations" JVM attribute.
+  /// This is a method attribute for getting the runtime annotations.
   //
-  static const UTF8* annotationsAttribut;
+  static const UTF8* annotationsAttribute;
 
-  /// exceptionsAttribut - The "Exceptions" attribut. This is a method
-  /// attribut for finding the exception table of a method in the .class
+  /// exceptionsAttribute - The "Exceptions" attribute. This is a method
+  /// attribute for finding the exception table of a method in the .class
   /// file.
   ///
-  static const UTF8* exceptionsAttribut;
+  static const UTF8* exceptionsAttribute;
 
-  /// constantAttribut - The "ConstantValue" attribut. This is a field attribut
+  /// constantAttribute - The "ConstantValue" attribute. This is a field attribute
   /// when the field has a static constant value.
   ///
-  static const UTF8* constantAttribut;
+  static const UTF8* constantAttribute;
 
-  /// lineNumberTableAttribut - The "LineNumberTable" attribut. This is used
+  /// lineNumberTableAttribute - The "LineNumberTable" attribute. This is used
   /// for corresponding JVM bytecode to source line in the .java file.
   ///
-  static const UTF8* lineNumberTableAttribut;
+  static const UTF8* lineNumberTableAttribute;
 
-  /// innerClassAttribut - The "InnerClasses" attribut. This is a class attribut
+  /// innerClassAttribute - The "InnerClasses" attribute. This is a class attribute
   /// for knowing the inner/outer informations of a Java class.
   ///
-  static const UTF8* innerClassesAttribut;
+  static const UTF8* innerClassesAttribute;
 
-  /// sourceFileAttribut - The "SourceFile" attribut. This is a class attribut
-  /// and gives the correspondance between a class and the name of its Java
+  /// sourceFileAttribute - The "SourceFile" attribute. This is a class attribute
+  /// and gives the correspondence between a class and the name of its Java
   /// file.
   ///
-  static const UTF8* sourceFileAttribut;
+  static const UTF8* sourceFileAttribute;
 
-  /// signatureAttribut - The "Signature" attribut.  This is used to record
+  /// signatureAttribute - The "Signature" attribute.  This is used to record
   /// generics information about a class or method.
   ///
-  static const UTF8* signatureAttribut;
+  static const UTF8* signatureAttribute;
 
-  /// enclosingMEthodAttribut - The "EnclosingMethod" attribut.  This is a class
-  /// attribut that identifies the method definining a local or anonymous class
+  /// enclosingMEthodAttribute - The "EnclosingMethod" attribute.  This is a class
+  /// attribute that identifies the method defining a local or anonymous class
   ///
-  static const UTF8* enclosingMethodAttribut;
+  static const UTF8* enclosingMethodAttribute;
 
-  /// paramAnnotationsAttribut - Annotations for parameters attribut
+  /// paramAnnotationsAttribute - Annotations for parameters attribute
   ///
-  static const UTF8* paramAnnotationsAttribut;
+  static const UTF8* paramAnnotationsAttribute;
 
-  /// annotationDefaultAttribut - The "AnnotationDefault" attribut
+  /// annotationDefaultAttribute - The "AnnotationDefault" attribute
   ///
-  static const UTF8* annotationDefaultAttribut;
+  static const UTF8* annotationDefaultAttribute;
 };
 
 /// TaskClassMirror - The isolate specific class information: the initialization
@@ -175,7 +178,7 @@ public:
 ///
 class CommonClass : public vmkit::PermanentObject {
 
-public:
+private:
   
 //===----------------------------------------------------------------------===//
 //
@@ -189,6 +192,7 @@ public:
   ///
   JavaObject* delegatee[NR_ISOLATES];
 
+public:
   /// access - {public, private, protected}.
   ///
   uint32 access;
@@ -318,7 +322,7 @@ public:
   /// getClassDelegatee - Return the java/lang/Class representation of this
   /// class.
   ///
-  JavaObject* getClassDelegatee(Jnjvm* vm, JavaObject* pd = NULL);
+  JavaObject* getClassDelegatee(Jnjvm* vm, JavaObject* pd = NULL, isolate_id_t isolateID = CURRENT_ISOLATE);
   
   /// getClassDelegateePtr - Return a pointer on the java/lang/Class
   /// representation of this class. Used for JNI.
@@ -353,19 +357,22 @@ public:
  
   /// setDelegatee - Set the java/lang/Class object of this class.
   ///
-  JavaObject* setDelegatee(JavaObject* val);
+  JavaObject* setDelegatee(JavaObject* val, isolate_id_t isolateID = CURRENT_ISOLATE);
 
   /// getDelegatee - Get the java/lang/Class object representing this class.
   ///
-  JavaObject* getDelegatee() const {
-    return delegatee[0];
+  JavaObject* getDelegatee(isolate_id_t isolateID = CURRENT_ISOLATE) const {
+    return *getDelegateePtr(isolateID);
   }
   
   /// getDelegatee - Get a pointer on the java/lang/Class object
   /// representing this class.
   ///
-  JavaObject* const* getDelegateePtr() const {
-    return delegatee;
+  JavaObject* const* getDelegateePtr(isolate_id_t isolateID = CURRENT_ISOLATE) const {
+    return const_cast<CommonClass *>(this)->getDelegateePtr(isolateID);
+  }
+  JavaObject** getDelegateePtr(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return delegatee + JavaThread::getValidIsolateID(isolateID);
   }
 
   /// resolvedImplClass - Return the internal representation of the
@@ -463,13 +470,13 @@ public:
   ///
   JavaConstantPool* ctpInfo;
 
-  /// attributs - JVM attributes of this class.
+  /// attributes - JVM attributes of this class.
   ///
-  Attribut* attributs;
+  JavaAttribute* attributes;
 
-  /// nbAttributs - The number of attributes.
+  /// nbAttributes - The number of attributes.
   ///
-  uint16 nbAttributs;
+  uint16 nbAttributes;
   
   /// innerClasses - The inner classes of this class.
   ///
@@ -600,7 +607,7 @@ public:
   
   /// doNew - Allocates a Java object whose class is this class.
   ///
-  JavaObject* doNew(Jnjvm* vm);
+  JavaObject* doNew(Jnjvm* vm, isolate_id_t isolateID = CURRENT_ISOLATE);
   
   /// tracer - Tracer function of instances of Class.
   ///
@@ -609,9 +616,9 @@ public:
   ~Class();
   Class();
   
-  /// lookupAttribut - Look up a JVM attribut of this class.
+  /// lookupAttribute - Look up a JVM attribute of this class.
   ///
-  Attribut* lookupAttribut(const UTF8* key);
+  JavaAttribute* lookupAttribute(const UTF8* key);
   
   /// allocateStaticInstance - Allocate the static instance of this class.
   ///
@@ -630,9 +637,9 @@ public:
   ///
   void loadExceptions();
 
-  /// readAttributs - Reads the attributs of the class.
+  /// readAttributes - Reads the attributes of the class.
   ///
-  Attribut* readAttributs(Reader& reader, uint16& size);
+  JavaAttribute* readAttributes(Reader& reader, uint16& size);
 
   /// readFields - Reads the fields of the class.
   ///
@@ -693,89 +700,85 @@ public:
   /// isolate.
   ///
   TaskClassMirror& getCurrentTaskClassMirror() {
-    return IsolateInfo[0];
+    return getTaskClassMirror();
   }
-  
+
+  TaskClassMirror& getTaskClassMirror(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return IsolateInfo[JavaThread::getValidIsolateID(isolateID)];
+  }
+
   /// isReadyForCompilation - Can this class be inlined when JITing?
   ///
-  bool isReadyForCompilation() {
-    return isReady();
+  bool isReadyForCompilation(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return isReady(isolateID);
   }
   
   /// setResolved - Set the status of the class as resolved.
-  ///
+  /// Resolved state is common to all isolates
   void setResolved() {
-    getCurrentTaskClassMirror().status = resolved;
+    getTaskClassMirror(0).status = resolved;
   }
   
+  void setResolvedSynchronized(uint8 oldStatus, isolate_id_t isolateID = CURRENT_ISOLATE) {
+    TaskClassMirror& TCM = getTaskClassMirror(0);
+    __sync_val_compare_and_swap(&TCM.status, oldStatus, resolved);
+  }
+
   /// setErroneous - Set the class as erroneous.
   ///
   void setErroneous() {
     getCurrentTaskClassMirror().status = erroneous;
   }
   
-  /// setIsResolving - The class file is being resolved.
-  ///
-  void setIsResolving() {
-    getCurrentTaskClassMirror().status = resolving;
-  }
-  
   /// getStaticInstance - Get the memory that holds static variables.
   ///
-  void* getStaticInstance() {
-    return getCurrentTaskClassMirror().staticInstance;
+  void* getStaticInstance(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return getTaskClassMirror(isolateID).staticInstance;
   }
   
   /// setStaticInstance - Set the memory that holds static variables.
   ///
-  void setStaticInstance(void* val) {
-    assert(getCurrentTaskClassMirror().staticInstance == NULL);
-    getCurrentTaskClassMirror().staticInstance = val;
+  void setStaticInstance(void* val, isolate_id_t isolateID = CURRENT_ISOLATE) {
+    TaskClassMirror& TCM = getTaskClassMirror(isolateID);
+    assert((val != NULL) && (TCM.staticInstance == NULL));
+    TCM.staticInstance = val;
   }
   
   /// getInitializationState - Get the state of the class.
   ///
-  uint8 getInitializationState() {
-    return getCurrentTaskClassMirror().status;
+  uint8 getInitializationState(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return getTaskClassMirror(isolateID).status;
   }
 
   /// setInitializationState - Set the state of the class.
   ///
-  void setInitializationState(uint8 st) {
-    TaskClassMirror& TCM = getCurrentTaskClassMirror();
+  void setInitializationState(uint8 st, isolate_id_t isolateID = CURRENT_ISOLATE) {
+    TaskClassMirror& TCM = getTaskClassMirror(isolateID);
     TCM.status = st;
     if (st == ready) TCM.initialized = true;
   }
   
   /// isReady - Has this class been initialized?
   ///
-  bool isReady() {
-    return getCurrentTaskClassMirror().status == ready;
+  bool isReady(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return getTaskClassMirror(isolateID).status == ready;
   }
   
   /// isInitializing - Is the class currently being initialized?
   ///
-  bool isInitializing() {
-    return getCurrentTaskClassMirror().status >= inClinit;
-  }
+  bool isInitializing(isolate_id_t isolateID = CURRENT_ISOLATE);
   
   /// isResolved - Has this class been resolved?
   ///
-  bool isResolved() {
-    uint8 stat = getCurrentTaskClassMirror().status;
-    return (stat >= resolved && stat != erroneous);
+  bool isResolved(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return (getTaskClassMirror(0).status >= resolved &&
+    		getTaskClassMirror(isolateID).status != erroneous);
   }
   
   /// isErroneous - Is the class in an erroneous state.
   ///
-  bool isErroneous() {
-    return getCurrentTaskClassMirror().status == erroneous;
-  }
-
-  /// isResolving - Is the class currently being resolved?
-  ///
-  bool isResolving() {
-    return getCurrentTaskClassMirror().status == resolving;
+  bool isErroneous(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    return getTaskClassMirror(isolateID).status == erroneous;
   }
 
   /// isNativeOverloaded - Is the method overloaded with a native function?
@@ -784,7 +787,7 @@ public:
 
   /// needsInitialisationCheck - Does the method need an initialisation check?
   ///
-  bool needsInitialisationCheck();
+  bool needsInitialisationCheck(isolate_id_t isolateID = CURRENT_ISOLATE);
 
   /// fillIMT - Fill the vector with vectors of methods with the same IMT
   /// index.
@@ -877,13 +880,13 @@ public:
   ///
   uint16 access;
 
-  /// attributs - List of Java attributs of this method.
+  /// attributes - List of Java attributes of this method.
   ///
-  Attribut* attributs;
+  JavaAttribute* attributes;
   
-  /// nbAttributs - The number of attributes.
+  /// nbAttributes - The number of attributes.
   ///
-  uint16 nbAttributs;
+  uint16 nbAttributes;
 
   /// classDef - The Java class where the method is defined.
   ///
@@ -909,10 +912,10 @@ public:
   ///
   uint32 offset;
 
-  /// lookupAttribut - Look up an attribut in the method's attributs. Returns
-  /// null if the attribut is not found.
+  /// lookupAttribute - Look up an attribute in the method's attributes. Returns
+  /// null if the attribute is not found.
   ///
-  Attribut* lookupAttribut(const UTF8* key);
+  JavaAttribute* lookupAttribute(const UTF8* key);
 
   /// lookupLineNumber - Find the line number based on the given frame info.
   ///
@@ -923,7 +926,7 @@ public:
   ///
   uint16 lookupCtpIndex(vmkit::FrameInfo* FI);
   
-  /// getSignature - Get the signature of thes method, resolving it if
+  /// getSignature - Get the signature of the method, resolving it if
   /// necessary.
   ///
   Signdef* getSignature() {
@@ -986,108 +989,123 @@ public:
 //
 //===----------------------------------------------------------------------===//
   
-  /// This class of methods takes a variable argument list.
-  uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap)
-    __attribute__ ((noinline));
-  float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap)
-    __attribute__ ((noinline));
-  double invokeDoubleSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                               va_list ap) __attribute__ ((noinline));
-  sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                        va_list ap) __attribute__ ((noinline));
-  
-  uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap)
-    __attribute__ ((noinline));
-  float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap)
-    __attribute__ ((noinline));
-  double invokeDoubleVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                               va_list ap) __attribute__ ((noinline));
-  sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                        va_list ap) __attribute__ ((noinline));
-  
-  uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap)
-    __attribute__ ((noinline));
-  float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap)
-    __attribute__ ((noinline));
-  double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap)
-    __attribute__ ((noinline));
-  sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap)
-    __attribute__ ((noinline));
-
-  /// This class of methods takes a buffer which contain the arguments of the
-  /// call.
-  uint32 invokeIntSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf)
-    __attribute__ ((noinline));
-  float invokeFloatSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf)
-    __attribute__ ((noinline));
-  double invokeDoubleSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                void* buf) __attribute__ ((noinline));
-  sint64 invokeLongSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                         void* buf) __attribute__ ((noinline));
-  
-  uint32 invokeIntVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf)
-    __attribute__ ((noinline));
-  float invokeFloatVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf)
-    __attribute__ ((noinline));
-  double invokeDoubleVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                void* buf) __attribute__ ((noinline));
-  sint64 invokeLongVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                         void* buf) __attribute__ ((noinline));
-  
-  uint32 invokeIntStaticBuf(Jnjvm* vm, UserClass*, void* buf)
-    __attribute__ ((noinline));
-  float invokeFloatStaticBuf(Jnjvm* vm, UserClass*, void* buf)
-    __attribute__ ((noinline));
-  double invokeDoubleStaticBuf(Jnjvm* vm, UserClass*, void* buf)
-    __attribute__ ((noinline));
-  sint64 invokeLongStaticBuf(Jnjvm* vm, UserClass*, void* buf)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, UserClass*, void* buf)
-    __attribute__ ((noinline));
-
-  /// This class of methods is variadic.
-  uint32 invokeIntSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  float invokeFloatSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  double invokeDoubleSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  sint64 invokeLongSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                      ...) __attribute__ ((noinline));
-  
-  uint32 invokeIntVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  float invokeFloatVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  double invokeDoubleVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  sint64 invokeLongVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, UserClass*, JavaObject* obj,
-                                      ...) __attribute__ ((noinline));
-  
-  uint32 invokeIntStatic(Jnjvm* vm, UserClass*, ...)
-    __attribute__ ((noinline));
-  float invokeFloatStatic(Jnjvm* vm, UserClass*, ...)
-    __attribute__ ((noinline));
-  double invokeDoubleStatic(Jnjvm* vm, UserClass*, ...)
-    __attribute__ ((noinline));
-  sint64 invokeLongStatic(Jnjvm* vm, UserClass*, ...)
-    __attribute__ ((noinline));
-  JavaObject* invokeJavaObjectStatic(Jnjvm* vm, UserClass*, ...)
-    __attribute__ ((noinline));
+#define DO_TRY
+#define DO_CATCH if (th->pendingException) { th->throwFromJava(); }
+
+private:
+	jvalue* marshalArguments(vmkit::ThreadAllocator& allocator, va_list& ap);
+
+	template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
+	TYPE invokeSpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {
+		llvm_gcroot(obj, 0);
+		verifyNull(obj);
+
+		void* func = this->compiledPtr();
+		FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)getSignature()->getVirtualCallBuf();
+
+		JavaThread* th = JavaThread::get();
+		th->startJava();
+		TYPE res;
+
+		DO_TRY
+			res = call(cl->getConstantPool(), func, obj, buf);
+		DO_CATCH
+
+		th->endJava();
+		return res;
+	}
+
+	template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
+	TYPE invokeVirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {
+		UserCommonClass* theClass = JavaObject::getClass(obj);
+		UserClass* objCl = theClass->isArray() ? theClass->super : theClass->asClass();
+
+		JavaMethod* meth = this;
+		if ((objCl != classDef) && !isFinal(access)) {
+			meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl);
+			assert(meth && "No method found");
+		}
+
+		assert(objCl->isSubclassOf(meth->classDef) && "Wrong type");
+
+		return meth->invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf);
+	}
+
+	template<class TYPE, class FUNC_TYPE_STATIC_BUF>
+	TYPE invokeStaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {
+		if (!cl->isReady()) {
+			cl->resolveClass();
+			cl->initialiseClass(vm);
+		}
+
+		void* func = this->compiledPtr();
+		FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)getSignature()->getStaticCallBuf();
+
+		JavaThread* th = JavaThread::get();
+		th->startJava();
+		TYPE res;
+
+		DO_TRY
+			res = call(cl->getConstantPool(), func, buf);
+		DO_CATCH
+
+		th->endJava();
+		return res;
+	}
+
+	template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
+	TYPE invokeVirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list& ap) {
+		llvm_gcroot(obj, 0);
+		verifyNull(obj);
+
+		vmkit::ThreadAllocator allocator;
+		jvalue* buffer = marshalArguments(allocator, ap);
+		return invokeVirtualBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buffer);
+	}
+
+	template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
+	TYPE invokeSpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list& ap) {
+		llvm_gcroot(obj, 0);
+		verifyNull(obj);
+
+		vmkit::ThreadAllocator allocator;
+		jvalue* buffer = marshalArguments(allocator, ap);
+		return invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buffer);
+	}
+
+	template<class TYPE, class FUNC_TYPE_STATIC_BUF>
+	TYPE invokeStaticAP(Jnjvm* vm, UserClass* cl, va_list& ap) {
+		vmkit::ThreadAllocator allocator;
+		jvalue* buffer = marshalArguments(allocator, ap);
+		return invokeStaticBuf<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, buffer);
+	}
+
+#define JavaMethod_DECL_INVOKE_VA(TYPE, TYPE_NAME) \
+	TYPE invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) __attribute__ ((noinline));	\
+	TYPE invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) __attribute__ ((noinline));	\
+	TYPE invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) __attribute__ ((noinline));
+
+#define JavaMethod_DECL_INVOKE_AP(TYPE, TYPE_NAME)	\
+	TYPE invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list& ap) __attribute__ ((noinline));	\
+	TYPE invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list& ap) __attribute__ ((noinline));	\
+	TYPE invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list& ap) __attribute__ ((noinline));
+
+#define JavaMethod_DECL_INVOKE_BUF(TYPE, TYPE_NAME)	\
+	TYPE invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__ ((noinline));	\
+	TYPE invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__ ((noinline));	\
+ 	TYPE invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) __attribute__ ((noinline));
+
+#define JavaMethod_DECL_INVOKE(TYPE, TYPE_NAME) \
+	JavaMethod_DECL_INVOKE_BUF(TYPE, TYPE_NAME)	\
+	JavaMethod_DECL_INVOKE_AP(TYPE, TYPE_NAME)	\
+	JavaMethod_DECL_INVOKE_VA(TYPE, TYPE_NAME)
+
+public:
+	JavaMethod_DECL_INVOKE(uint32_t, Int)
+	JavaMethod_DECL_INVOKE(int64_t, Long)
+	JavaMethod_DECL_INVOKE(float,  Float)
+	JavaMethod_DECL_INVOKE(double, Double)
+	JavaMethod_DECL_INVOKE(JavaObject*, JavaObject)
   
   #define JNI_NAME_PRE "Java_"
   #define JNI_NAME_PRE_LEN 5
@@ -1104,11 +1122,11 @@ private:
   
   /// InitField - Set an initial value to the field.
   ///
-  void InitStaticField(uint64 val);
-  void InitStaticField(JavaObject* val);
-  void InitStaticField(double val);
-  void InitStaticField(float val);
-  void InitNullStaticField();
+  void InitStaticField(uint64 val, isolate_id_t isolateID = CURRENT_ISOLATE);
+  void InitStaticField(JavaObject* val, isolate_id_t isolateID = CURRENT_ISOLATE);
+  void InitStaticField(double val, isolate_id_t isolateID = CURRENT_ISOLATE);
+  void InitStaticField(float val, isolate_id_t isolateID = CURRENT_ISOLATE);
+  void InitNullStaticField(isolate_id_t isolateID = CURRENT_ISOLATE);
 
 public:
   
@@ -1132,13 +1150,13 @@ public:
   ///
   const UTF8* type;
 
-  /// attributs - List of Java attributs for this field.
+  /// attributes - List of Java attributes for this field.
   ///
-  Attribut* attributs;
+  JavaAttribute* attributes;
   
-  /// nbAttributs - The number of attributes.
+  /// nbAttributes - The number of attributes.
   ///
-  uint16 nbAttributs;
+  uint16 nbAttributes;
 
   /// classDef - The class where the field is defined.
   ///
@@ -1167,13 +1185,13 @@ public:
   ///
   void InitStaticField(Jnjvm* vm);
 
-  /// lookupAttribut - Look up the attribut in the field's list of attributs.
+  /// lookupAttribute - Look up the attribute in the field's list of attributes.
   ///
-  Attribut* lookupAttribut(const UTF8* key);
+  JavaAttribute* lookupAttribute(const UTF8* key);
 
-  JavaObject** getStaticObjectFieldPtr() {
-    assert(classDef->getStaticInstance());
-    return (JavaObject**)((uint64)classDef->getStaticInstance() + ptrOffset);
+  JavaObject** getStaticObjectFieldPtr(isolate_id_t isolateID = CURRENT_ISOLATE) {
+    assert(classDef->getStaticInstance(isolateID));
+    return (JavaObject**)((uint64)classDef->getStaticInstance(isolateID) + ptrOffset);
   }
 
   JavaObject** getInstanceObjectFieldPtr(JavaObject* obj) {
@@ -1181,74 +1199,89 @@ public:
     return (JavaObject**)((uint64)obj + ptrOffset);
   }
 
+private:
   /// getStatic*Field - Get a static field.
   ///
-  #define GETSTATICFIELD(TYPE, TYPE_NAME)                                   \
-  TYPE getStatic##TYPE_NAME##Field() {                                      \
-    assert(classDef->isResolved());                                         \
-    void* ptr = (void*)((uint64)classDef->getStaticInstance() + ptrOffset); \
-    return ((TYPE*)ptr)[0];                                                 \
-  }
+  template <class TYPE>
+  TYPE getStaticField(isolate_id_t isolateID) {
+    assert(classDef->isResolved(isolateID));
+    void* ptr = (void*)((uint64)classDef->getStaticInstance(isolateID) + ptrOffset);
+    return *static_cast<TYPE *>(ptr);
+  }
+
+  /*
+    The struct FieldSetter is a workaround in C++ to enable
+    template-based method specialization in a non-template
+    class. See specialization below the class declaration.
+  */
+  template<class TYPE>
+  struct FieldSetter {
+	  /// setStatic*Field - Set a field of an object.
+	  ///
+	  static void setStaticField(const JavaField* field, TYPE val, isolate_id_t isolateID) {
+	    assert(field->classDef->isResolved(isolateID));
+	    void* ptr = (void*)((uint64)field->classDef->getStaticInstance(isolateID) + field->ptrOffset);
+	    *static_cast<TYPE *>(ptr) = val;
+	  }
+      
+	  /// setInstance*Field - Set an instance field.
+	  ///
+	  static void setInstanceField(const JavaField* field, JavaObject* obj, TYPE val) {
+	    llvm_gcroot(obj, 0);
+	    assert(field->classDef->isResolved());
+	    void* ptr = (void*)((uint64)obj + field->ptrOffset);
+	    *static_cast<TYPE *>(ptr) = val;
+	  }
+  };
 
   /// setStatic*Field - Set a field of an object.
   ///
-  #define SETSTATICFIELD(TYPE, TYPE_NAME)                                   \
-  void setStatic##TYPE_NAME##Field(TYPE val) {                              \
-    assert(classDef->isResolved());                                         \
-    void* ptr = (void*)((uint64)classDef->getStaticInstance() + ptrOffset); \
-    ((TYPE*)ptr)[0] = val;                                                  \
+  template <class TYPE>
+  void setStaticField(TYPE val, isolate_id_t isolateID) {
+    FieldSetter<TYPE>::setStaticField(this, val, isolateID);
   }
 
   /// getInstance*Field - Get an instance field.
   ///
-  #define GETINSTANCEFIELD(TYPE, TYPE_NAME)                                 \
-  TYPE getInstance##TYPE_NAME##Field(JavaObject* obj) {                     \
-    llvm_gcroot(obj, 0);                                                    \
-    assert(classDef->isResolved());                                         \
-    void* ptr = (void*)((uint64)obj + ptrOffset);                           \
-    return ((TYPE*)ptr)[0];                                                 \
-  }                                                                         \
-
-  /// setInstance*Field - Set an instance field.
-  ///
-  #define SETINSTANCEFIELD(TYPE, TYPE_NAME)                                 \
-  void setInstance##TYPE_NAME##Field(JavaObject* obj, TYPE val) {           \
-    llvm_gcroot(obj, 0);                                                    \
-    assert(classDef->isResolved());                                         \
-    void* ptr = (void*)((uint64)obj + ptrOffset);                           \
-    ((TYPE*)ptr)[0] = val;                                                  \
-  }
-
-  #define MK_ASSESSORS(TYPE, TYPE_NAME)                                     \
-    GETSTATICFIELD(TYPE, TYPE_NAME)                                         \
-    SETSTATICFIELD(TYPE, TYPE_NAME)                                         \
-    GETINSTANCEFIELD(TYPE, TYPE_NAME)                                       \
-    SETINSTANCEFIELD(TYPE, TYPE_NAME)                                       \
-
-  MK_ASSESSORS(float, Float)
-  MK_ASSESSORS(double, Double)
-  MK_ASSESSORS(uint8, Int8)
-  MK_ASSESSORS(uint16, Int16)
-  MK_ASSESSORS(uint32, Int32)
-  MK_ASSESSORS(sint64, Long)
-
-  JavaObject* getStaticObjectField() {
-    assert(classDef->isResolved());
-    void* ptr = (void*)((uint64)classDef->getStaticInstance() + ptrOffset);
-    return ((JavaObject**)ptr)[0];
-  }
-
-  void setStaticObjectField(JavaObject* val);
-
-  JavaObject* getInstanceObjectField(JavaObject* obj) {
+  template<class TYPE>
+  TYPE getInstanceField(JavaObject* obj) {
     llvm_gcroot(obj, 0);
     assert(classDef->isResolved());
     void* ptr = (void*)((uint64)obj + ptrOffset);
-    return ((JavaObject**)ptr)[0];
+    return *static_cast<TYPE *>(ptr);
   }
 
-  // This can't be inlined because of a linker bug.
-  void setInstanceObjectField(JavaObject* obj, JavaObject* val);
+  /// setInstance*Field - Set an instance field.
+  ///
+  template<class TYPE>
+  void setInstanceField(JavaObject* obj, TYPE val) {
+    FieldSetter<TYPE>::setInstanceField(this, obj, val);
+  }
+
+#define JavaField_DECL_ASSESSORS(TYPE, TYPE_NAME)			\
+	TYPE getStatic##TYPE_NAME##Field(isolate_id_t isolateID = CURRENT_ISOLATE);						\
+	void setStatic##TYPE_NAME##Field(TYPE val, isolate_id_t isolateID = CURRENT_ISOLATE);				\
+	TYPE getInstance##TYPE_NAME##Field(JavaObject* obj);	\
+	void setInstance##TYPE_NAME##Field(JavaObject* obj, TYPE val);
+
+#define JavaField_IMPL_ASSESSORS(TYPE, TYPE_NAME)																			\
+	TYPE JavaField::getStatic##TYPE_NAME##Field(isolate_id_t isolateID) {			\
+  		return getStaticField<TYPE>(isolateID);}									\
+	void JavaField::setStatic##TYPE_NAME##Field(TYPE val, isolate_id_t isolateID) {	\
+		return setStaticField<TYPE>(val, isolateID);}								\
+	TYPE JavaField::getInstance##TYPE_NAME##Field(JavaObject* obj) {				\
+		return this->getInstanceField<TYPE>(obj);}									\
+	void JavaField::setInstance##TYPE_NAME##Field(JavaObject* obj, TYPE val) {		\
+		return this->setInstanceField<TYPE>(obj, val);}
+
+public:
+  JavaField_DECL_ASSESSORS(float, Float)
+  JavaField_DECL_ASSESSORS(double, Double)
+  JavaField_DECL_ASSESSORS(uint8, Int8)
+  JavaField_DECL_ASSESSORS(uint16, Int16)
+  JavaField_DECL_ASSESSORS(uint32, Int32)
+  JavaField_DECL_ASSESSORS(sint64, Long)
+  JavaField_DECL_ASSESSORS(JavaObject*, Object)
   
   bool isReference() {
     uint16 val = type->elements[0];
@@ -1289,6 +1322,28 @@ public:
 
 };
 
+// Specialization for TYPE=JavaObject*
+template<>
+struct JavaField::FieldSetter<JavaObject*> {
+
+  static void setStaticField(const JavaField* field, JavaObject* val, isolate_id_t isolateID = CURRENT_ISOLATE) {
+	llvm_gcroot(val, 0);
+	if (val != NULL) assert(val->getVirtualTable());
+	assert(field->classDef->isResolved(isolateID));
+	JavaObject** ptr = (JavaObject**)((uint64)field->classDef->getStaticInstance(isolateID) + field->ptrOffset);
+	vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)ptr, (gc*)val);
+  }
+
+  static void setInstanceField(const JavaField* field, JavaObject* obj, JavaObject* val) {
+	llvm_gcroot(obj, 0);
+	llvm_gcroot(val, 0);
+	if (val != NULL) assert(val->getVirtualTable());
+	assert(field->classDef->isResolved());
+	JavaObject** ptr = (JavaObject**)((uint64)obj + field->ptrOffset);
+	vmkit::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr, (gc*)val);
+  }
+};
+
 
 } // end namespace j3
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaConstantPool.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaConstantPool.cpp Thu Apr 25 11:46:36 2013
@@ -157,6 +157,7 @@ uint32 JavaConstantPool::CtpReaderDouble
 void*
 JavaConstantPool::operator new(size_t sz, vmkit::BumpPtrAllocator& allocator,
                                uint32 ctpSize) {
+  // NOTICE: 'size' is not the final size of the object, as it does more allocations in the constructor
   uint32 size = sz + ctpSize * (sizeof(void*) + sizeof(sint32) + sizeof(uint8));
   return allocator.Allocate(size, "Constant pool");
 }
@@ -176,6 +177,14 @@ JavaConstantPool::JavaConstantPool(Class
   while (cur < ctpSize) {
     uint8 curType = reader.readU1();
     ctpType[cur] = curType;
+
+    // 'ctpRes' entries corresponding to 'ConstantString' types are pointers to arrays of values
+    // corresponding to different isolates.
+    if (ctpType[cur] == ConstantString) {
+    	ctpRes[cur] = classDef->classLoader->allocator.Allocate(sizeof(void *) * NR_ISOLATES, NULL);
+    	memset(ctpRes[cur], 0, sizeof(void *) * NR_ISOLATES);
+    }
+
     cur += ((funcsReader[curType])(this, reader, cur));
   }
 }
@@ -187,7 +196,7 @@ const UTF8* JavaConstantPool::UTF8At(uin
     abort();
   }
   
-  if (!ctpRes[entry]) {
+  if (!getCachedValue(entry)) {
     vmkit::ThreadAllocator allocator;
     Reader reader(classDef->bytes, ctpDef[entry]);
     uint32 len = reader.readU2();
@@ -219,13 +228,13 @@ const UTF8* JavaConstantPool::UTF8At(uin
   
     JnjvmClassLoader* loader = classDef->classLoader;
     const UTF8* utf8 = loader->hashUTF8->lookupOrCreateReader(buf, n);
-    ctpRes[entry] = const_cast<UTF8*>(utf8);
+    updateCachedValue(entry, const_cast<UTF8*>(utf8));
   
     PRINT_DEBUG(JNJVM_LOAD, 3, COLOR_NORMAL, "; [%5d] <utf8>\t\t\"%s\"\n",
                 entry, UTF8Buffer(utf8)->cString());
 
   }
-  return (const UTF8*)ctpRes[entry];
+  return (const UTF8*)getCachedValue(entry);
 }
 
 float JavaConstantPool::FloatAt(uint32 entry) {
@@ -271,12 +280,12 @@ CommonClass* JavaConstantPool::isClassLo
     abort();
   }
 
-  CommonClass* res = (CommonClass*)ctpRes[entry];
+  CommonClass* res = (CommonClass*)getCachedValue(entry);
   if (res == NULL) {
     JnjvmClassLoader* loader = classDef->classLoader;
     const UTF8* name = UTF8At(ctpDef[entry]);
     res = loader->lookupClassOrArray(name);
-    ctpRes[entry] = res;
+    updateCachedValue(entry, res);
   }
   return res;
 }
@@ -297,7 +306,7 @@ CommonClass* JavaConstantPool::loadClass
     } else {
       temp = loader->loadName(name, resolve, false, NULL);
     }
-    ctpRes[index] = temp;
+    updateCachedValue(index, temp);
   } else if (resolve && temp->isClass()) {
     temp->asClass()->resolveClass();
   }
@@ -319,7 +328,7 @@ CommonClass* JavaConstantPool::getMethod
 }
 
 Typedef* JavaConstantPool::resolveNameAndType(uint32 index) {
-  void* res = ctpRes[index];
+  void* res = getCachedValue(index);
   if (!res) {
     if (typeAt(index) != ConstantNameAndType) {
       fprintf(stderr, "Malformed class %s\n",
@@ -329,14 +338,14 @@ Typedef* JavaConstantPool::resolveNameAn
     sint32 entry = ctpDef[index];
     const UTF8* type = UTF8At(entry & 0xFFFF);
     Typedef* sign = classDef->classLoader->constructType(type);
-    ctpRes[index] = sign;
+    updateCachedValue(index, sign);
     return sign;
   }
   return (Typedef*)res;
 }
 
 Signdef* JavaConstantPool::resolveNameAndSign(uint32 index) {
-  void* res = ctpRes[index];
+  void* res = getCachedValue(index);
   if (!res) {
     if (typeAt(index) != ConstantNameAndType) {
       fprintf(stderr, "Malformed class %s\n",
@@ -346,7 +355,7 @@ Signdef* JavaConstantPool::resolveNameAn
     sint32 entry = ctpDef[index];
     const UTF8* type = UTF8At(entry & 0xFFFF);
     Signdef* sign = classDef->classLoader->constructSign(type);
-    ctpRes[index] = sign;
+    updateCachedValue(index, sign);
     return sign;
   }
   return (Signdef*)res;
@@ -471,7 +480,7 @@ void JavaConstantPool::resolveMethod(uin
                                      const UTF8*& utf8, Signdef*& sign) {
   sint32 entry = ctpDef[index];
   sint32 ntIndex = entry & 0xFFFF;
-  sign = (Signdef*)ctpRes[ntIndex];
+  sign = (Signdef*)getCachedValue(ntIndex);
   assert(sign && "No cached signature after JITting");
   utf8 = UTF8At(ctpDef[ntIndex] >> 16);
   cl = loadClass(entry >> 16);
@@ -484,7 +493,7 @@ void JavaConstantPool::resolveField(uint
                                     const UTF8*& utf8, Typedef*& sign) {
   sint32 entry = ctpDef[index];
   sint32 ntIndex = entry & 0xFFFF;
-  sign = (Typedef*)ctpRes[ntIndex];
+  sign = (Typedef*)getCachedValue(ntIndex);
   assert(sign && "No cached Typedef after JITting");
   utf8 = UTF8At(ctpDef[ntIndex] >> 16);
   cl = loadClass(entry >> 16);
@@ -496,7 +505,7 @@ void JavaConstantPool::resolveField(uint
 JavaField* JavaConstantPool::lookupField(uint32 index, bool stat) {
   sint32 entry = ctpDef[index];
   sint32 ntIndex = entry & 0xFFFF;
-  Typedef* sign = (Typedef*)ctpRes[ntIndex];
+  Typedef* sign = (Typedef*)getCachedValue(ntIndex);
   const UTF8* utf8 = UTF8At(ctpDef[ntIndex] >> 16);
   CommonClass* cl = getMethodClassIfLoaded(entry >> 16);
   if (cl) {
@@ -507,10 +516,10 @@ JavaField* JavaConstantPool::lookupField
       // don't throw if no field, the exception will be thrown just in time  
       if (field) {
         if (!stat) {
-          ctpRes[index] = (void*)field->ptrOffset;
+          updateCachedValue(index, (void*)field->ptrOffset);
         } else if (lookup->isReady()) {
           void* S = field->classDef->getStaticInstance();
-          ctpRes[index] = (void*)((uint64)S + field->ptrOffset);
+          updateCachedValue(index, (void*)((uint64)S + field->ptrOffset));
         }
       }
       return field;
@@ -527,6 +536,24 @@ JavaString* JavaConstantPool::resolveStr
   return str;
 }
 
+void** JavaConstantPool::getCachedValuePtr(uint32_t index, isolate_id_t isolateID)
+{
+    assert(index < ctpSize && "Invalid constant index");
+	void **entry = ctpRes + index;
+	if (ctpType[index] != ConstantString) return entry;
+
+	isolateID = JavaThread::getValidIsolateID(isolateID);
+	void ** stringArray = reinterpret_cast<void **>(*entry);
+	return stringArray + isolateID;
+}
+
+void* JavaConstantPool::updateCachedValue(uint32_t index, void* newValue, isolate_id_t isolateID) {
+	void** valuePtr = getCachedValuePtr(index, isolateID);
+	void* oldValue = *valuePtr;
+	*valuePtr = newValue;
+	return oldValue;
+}
+
 JavaConstantPool::ctpReader JavaConstantPool::funcsReader[16] = {
   unimplemented,
   CtpReaderUTF8,

Modified: vmkit/trunk/lib/j3/VMCore/JavaConstantPool.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaConstantPool.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaConstantPool.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaConstantPool.h Thu Apr 25 11:46:36 2013
@@ -49,11 +49,13 @@ public:
   ///
   sint32* ctpDef;
   
+private:
   /// ctpRes - Objects resolved dynamically, e.g. UTF8s, classes, methods,
   /// fields, string pointers.
   ///
   void**  ctpRes;
   
+public:
   /// operator new - Redefine the operator to allocate the arrays of a
   /// constant pool inline.
   void* operator new(size_t sz, vmkit::BumpPtrAllocator& allocator,
@@ -257,6 +259,23 @@ public:
   /// ~JavaConstantPool - Delete the constant pool.
   ///
   ~JavaConstantPool() {}
+
+protected:
+  void** getCachedValuePtr(uint32_t index, isolate_id_t isolateID = CURRENT_ISOLATE);
+
+public:
+  void* getCachedValue(uint32_t index, isolate_id_t isolateID = CURRENT_ISOLATE) {
+	  return *getCachedValuePtr(index, isolateID);
+  }
+
+  /// This returns the old contents before updating
+  void* updateCachedValueSynchronized(uint32_t index, void* newValue, void* oldValue, isolate_id_t isolateID = CURRENT_ISOLATE) {
+	  void** valuePtr = getCachedValuePtr(index, isolateID);
+	  return __sync_val_compare_and_swap(valuePtr, oldValue, newValue);
+  }
+
+  /// This returns the old contents before updating
+  void* updateCachedValue(uint32_t index, void* newValue, isolate_id_t isolateID = CURRENT_ISOLATE);
 };
 
 } // end namespace j3

Modified: vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp Thu Apr 25 11:46:36 2013
@@ -23,260 +23,88 @@
 using namespace j3;
 
 
-#define readArgs(buf, signature, ap, jni) { \
-  jvalue* buffer = (jvalue*)buf; \
-  Typedef* const* arguments = signature->getArgumentsType(); \
-  for (uint32 i = 0; i < signature->nbArguments; ++i) { \
-    const Typedef* type = arguments[i];\
-    if (type->isPrimitive()) {\
-      const PrimitiveTypedef* prim = (const PrimitiveTypedef*)type;\
-      if (prim->isLong()) {\
-        buffer[i].j = va_arg(ap, sint64);\
-      } else if (prim->isInt()){ \
-        buffer[i].i = va_arg(ap, sint32);\
-      } else if (prim->isChar()) { \
-        buffer[i].c = va_arg(ap, uint32);\
-      } else if (prim->isShort()) { \
-        buffer[i].s = va_arg(ap, sint32);\
-      } else if (prim->isByte()) { \
-        buffer[i].b = va_arg(ap, sint32);\
-      } else if (prim->isBool()) { \
-        buffer[i].z = va_arg(ap, uint32);\
-      } else if (prim->isFloat()) {\
-        buffer[i].f = (float)va_arg(ap, double);\
-      } else if (prim->isDouble()) {\
-        buffer[i].d = va_arg(ap, double);\
-      } else {\
-        fprintf(stderr, "Can't happen");\
-        abort();\
-      }\
-    } else{\
-      buffer[i].l = reinterpret_cast<jobject>(va_arg(ap, JavaObject**));\
-    }\
-  }\
-}
-  
-#define DO_TRY
-#define DO_CATCH if (th->pendingException) { th->throwFromJava(); }
-
 //===----------------------------------------------------------------------===//
 // We do not need to have special care on the GC-pointers in the buffer
 // manipulated in these functions because the objects in the buffer are
 // addressed and never stored directly.
 //===----------------------------------------------------------------------===//
 
-#if 1 // VA_ARGS do not work on all platforms for LLVM.
-#define INVOKE_AP(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-\
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
-  llvm_gcroot(obj, 0); \
-  verifyNull(obj); \
-  Signdef* sign = getSignature(); \
-  vmkit::ThreadAllocator allocator; \
-  jvalue* buf = (jvalue*)allocator.Allocate(sign->nbArguments * sizeof(jvalue)); \
-  readArgs(buf, sign, ap, jni); \
-  return invoke##TYPE_NAME##VirtualBuf(vm, cl, obj, buf); \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\
-  llvm_gcroot(obj, 0); \
-  verifyNull(obj); \
-  Signdef* sign = getSignature(); \
-  vmkit::ThreadAllocator allocator; \
-  jvalue* buf = (jvalue*)allocator.Allocate(sign->nbArguments * sizeof(jvalue)); \
-  readArgs(buf, sign, ap, jni); \
-  return invoke##TYPE_NAME##SpecialBuf(vm, cl, obj, buf); \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\
-  Signdef* sign = getSignature(); \
-  vmkit::ThreadAllocator allocator; \
-  jvalue* buf = (jvalue*)allocator.Allocate(sign->nbArguments * sizeof(jvalue)); \
-  readArgs(buf, sign, ap, jni); \
-  return invoke##TYPE_NAME##StaticBuf(vm, cl, buf); \
-}
-
-#else
-
-#define INVOKE_AP(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
-  llvm_gcroot(obj, 0); \
-  verifyNull(obj); \
-  UserClass* objCl = JavaObject::getClass(obj)->isArray() ? JavaObject::getClass(obj)->super : JavaObject::getClass(obj)->asClass(); \
-  if (objCl == classDef || isFinal(access)) { \
-    meth = this; \
-  } else { \
-    meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \
-  } \
-  assert(meth && "No method found"); \
-  void* func = meth->compiledPtr(); \
-  Signdef* sign = getSignature(); \
-  FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \
-  JavaThread* th = JavaThread::get(); \
-  th->startJava(); \
-  TYPE res = 0; \
-  DO_TRY \
-  res = call(cl->getConstantPool(), func, obj, ap);\
-  DO_CATCH \
-  th->endJava(); \
-  return res; \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\
-  llvm_gcroot(obj, 0); \
-  verifyNull(obj);\
-  void* func = this->compiledPtr();\
-  Signdef* sign = getSignature(); \
-  FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \
-  JavaThread* th = JavaThread::get(); \
-  th->startJava(); \
-  TYPE res = 0; \
-  DO_TRY \
-  res = call(cl->getConstantPool(), func, obj, ap);\
-  DO_CATCH \
-  th->endJava(); \
-  return res; \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\
-  if (!cl->isReady()) { \
-    cl->resolveClass(); \
-    cl->initialiseClass(vm); \
-  } \
-  \
-  void* func = this->compiledPtr();\
-  Signdef* sign = getSignature(); \
-  FUNC_TYPE_STATIC_AP call = (FUNC_TYPE_STATIC_AP)sign->getStaticCallAP(); \
-  JavaThread* th = JavaThread::get(); \
-  th->startJava(); \
-  TYPE res = 0; \
-  DO_TRY \
-  res = call(cl->getConstantPool(), func, ap);\
-  DO_CATCH \
-  th->endJava(); \
-  return res; \
+jvalue* JavaMethod::marshalArguments(vmkit::ThreadAllocator& allocator, va_list& ap)
+{
+	Signdef* signature = getSignature();
+	if (signature->nbArguments == 0) return NULL;	//Zero arguments
+
+	Typedef* const* arguments = signature->getArgumentsType();
+
+	jvalue* buffer = (jvalue*)allocator.Allocate(signature->nbArguments * sizeof(jvalue));
+
+	for (uint32 i = 0; i < signature->nbArguments; ++i) {
+		const Typedef* type = arguments[i];
+
+		if (type->isPrimitive()) {
+			const PrimitiveTypedef* prim = (const PrimitiveTypedef*)type;
+
+			     if (prim->isLong())	buffer[i].j = va_arg(ap, sint64);
+			else if (prim->isInt())		buffer[i].i = va_arg(ap, sint32);
+			else if (prim->isChar())	buffer[i].c = va_arg(ap, uint32);
+			else if (prim->isShort())	buffer[i].s = va_arg(ap, sint32);
+			else if (prim->isByte())	buffer[i].b = va_arg(ap, sint32);
+			else if (prim->isBool())	buffer[i].z = va_arg(ap, uint32);
+			else if (prim->isFloat())	buffer[i].f = (float)va_arg(ap, double);
+			else if (prim->isDouble())	buffer[i].d = va_arg(ap, double);
+			else assert(0 && "Unknown primitive type.");
+		} else
+			buffer[i].l = reinterpret_cast<jobject>(va_arg(ap, JavaObject**));
+	}
+	return buffer;
 }
 
-#endif
-
-#define INVOKE_BUF(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
-  llvm_gcroot(obj, 0); \
-  verifyNull(obj);\
-  Signdef* sign = getSignature(); \
-  UserClass* objCl = JavaObject::getClass(obj)->isArray() ? JavaObject::getClass(obj)->super : JavaObject::getClass(obj)->asClass(); \
-  JavaMethod* meth = NULL; \
-  if (objCl == classDef || isFinal(access)) { \
-    meth = this; \
-  } else { \
-    meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \
-  } \
-  assert(meth && "No method found"); \
-  assert(objCl->isSubclassOf(meth->classDef) && "Wrong type"); \
-  void* func = meth->compiledPtr(); \
-  FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
-  JavaThread* th = JavaThread::get(); \
-  th->startJava(); \
-  TYPE res = 0; \
-  DO_TRY \
-  res = call(cl->getConstantPool(), func, obj, buf);\
-  DO_CATCH \
-  th->endJava(); \
-  return res; \
-}\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
-  llvm_gcroot(obj, 0); \
-  verifyNull(obj);\
-  void* func = this->compiledPtr();\
-  Signdef* sign = getSignature(); \
-  FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
-  JavaThread* th = JavaThread::get(); \
-  th->startJava(); \
-  TYPE res = 0; \
-  DO_TRY \
-  res = call(cl->getConstantPool(), func, obj, buf);\
-  DO_CATCH \
-  th->endJava(); \
-  return res; \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\
-  if (!cl->isReady()) { \
-    cl->resolveClass(); \
-    cl->initialiseClass(vm); \
-  } \
-  \
-  void* func = this->compiledPtr();\
-  Signdef* sign = getSignature(); \
-  FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \
-  JavaThread* th = JavaThread::get(); \
-  th->startJava(); \
-  TYPE res = 0; \
-  DO_TRY \
-  res = call(cl->getConstantPool(), func, buf);\
-  DO_CATCH \
-  th->endJava(); \
-  return res; \
-}\
-
-#define INVOKE_VA(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \
-  llvm_gcroot(obj, 0); \
-  va_list ap;\
-  va_start(ap, obj);\
-  TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\
-  va_end(ap); \
-  return res; \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\
-  llvm_gcroot(obj, 0); \
-  va_list ap;\
-  va_start(ap, obj);\
-  TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\
-  va_end(ap); \
-  return res; \
-}\
-\
-TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\
-  va_list ap;\
-  va_start(ap, cl);\
-  TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\
-  va_end(ap); \
-  return res; \
-}\
-
-#define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-  INVOKE_AP(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-  INVOKE_BUF(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
-  INVOKE_VA(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF)
-
-typedef uint32 (*uint32_virtual_ap)(UserConstantPool*, void*, JavaObject*, va_list);
-typedef sint64 (*sint64_virtual_ap)(UserConstantPool*, void*, JavaObject*, va_list);
-typedef float  (*float_virtual_ap)(UserConstantPool*, void*, JavaObject*, va_list);
-typedef double (*double_virtual_ap)(UserConstantPool*, void*, JavaObject*, va_list);
-typedef JavaObject* (*object_virtual_ap)(UserConstantPool*, void*, JavaObject*, va_list);
-
-typedef uint32 (*uint32_static_ap)(UserConstantPool*, void*, va_list);
-typedef sint64 (*sint64_static_ap)(UserConstantPool*, void*, va_list);
-typedef float  (*float_static_ap)(UserConstantPool*, void*, va_list);
-typedef double (*double_static_ap)(UserConstantPool*, void*, va_list);
-typedef JavaObject* (*object_static_ap)(UserConstantPool*, void*, va_list);
-
-typedef uint32 (*uint32_virtual_buf)(UserConstantPool*, void*, JavaObject*, void*);
-typedef sint64 (*sint64_virtual_buf)(UserConstantPool*, void*, JavaObject*, void*);
-typedef float  (*float_virtual_buf)(UserConstantPool*, void*, JavaObject*, void*);
-typedef double (*double_virtual_buf)(UserConstantPool*, void*, JavaObject*, void*);
-typedef JavaObject* (*object_virtual_buf)(UserConstantPool*, void*, JavaObject*, void*);
-
-typedef uint32 (*uint32_static_buf)(UserConstantPool*, void*, void*);
-typedef sint64 (*sint64_static_buf)(UserConstantPool*, void*, void*);
-typedef float  (*float_static_buf)(UserConstantPool*, void*, void*);
-typedef double (*double_static_buf)(UserConstantPool*, void*, void*);
-typedef JavaObject* (*object_static_buf)(UserConstantPool*, void*, void*);
-
-INVOKE(uint32, Int, uint32_virtual_ap, uint32_static_ap, uint32_virtual_buf, uint32_static_buf)
-INVOKE(sint64, Long, sint64_virtual_ap, sint64_static_ap, sint64_virtual_buf, sint64_static_buf)
-INVOKE(float,  Float, float_virtual_ap,  float_static_ap,  float_virtual_buf,  float_static_buf)
-INVOKE(double, Double, double_virtual_ap, double_static_ap, double_virtual_buf, double_static_buf)
-INVOKE(JavaObject*, JavaObject, object_virtual_ap, object_static_ap, object_virtual_buf, object_static_buf)
+#define JavaMethod_INVOKE_VA(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
+	TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {	\
+		llvm_gcroot(obj, 0);	\
+		va_list ap;	\
+		va_start(ap, obj);	\
+		TYPE res = invokeVirtualAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap);	\
+		va_end(ap);	\
+		return res;	\
+	}	\
+	TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {	\
+	  llvm_gcroot(obj, 0);	\
+	  va_list ap;	\
+	  va_start(ap, obj);	\
+	  TYPE res = invokeSpecialAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap);	\
+	  va_end(ap);	\
+	  return res;	\
+	}	\
+	TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {	\
+	  va_list ap;	\
+	  va_start(ap, cl);	\
+	  TYPE res = invokeStaticAP<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, ap);	\
+	  va_end(ap);	\
+	  return res;	\
+	}
+
+#define JavaMethod_INVOKE_AP(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF)	\
+	TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list& ap)	{return invokeVirtualAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap);}	\
+	TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list& ap)	{return invokeSpecialAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap);}	\
+	TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list& ap)						{return invokeStaticAP<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, ap);}
+
+#define JavaMethod_INVOKE_BUF(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF)	\
+	TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf)	{return invokeVirtualBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf);} \
+	TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf)	{return invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf);} \
+	TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf)						{return invokeStaticBuf<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, buf);}
+
+#define JavaMethod_INVOKE(TYPE, TYPE_NAME) \
+	typedef TYPE (* func_virtual_ap_##TYPE_NAME)(UserConstantPool*, void*, JavaObject*, va_list);	\
+	typedef TYPE (* func_static_ap_##TYPE_NAME)(UserConstantPool*, void*, va_list);					\
+	typedef TYPE (* func_virtual_buf_##TYPE_NAME)(UserConstantPool*, void*, JavaObject*, void*);	\
+	typedef TYPE (* func_static_buf_##TYPE_NAME)(UserConstantPool*, void*, void*);					\
+	JavaMethod_INVOKE_AP(TYPE, TYPE_NAME, func_virtual_ap_##TYPE_NAME, func_static_ap_##TYPE_NAME, func_virtual_buf_##TYPE_NAME, func_static_buf_##TYPE_NAME) \
+	JavaMethod_INVOKE_BUF(TYPE, TYPE_NAME, func_virtual_ap_##TYPE_NAME, func_static_ap_##TYPE_NAME, func_virtual_buf_##TYPE_NAME, func_static_buf_##TYPE_NAME) \
+	JavaMethod_INVOKE_VA(TYPE, TYPE_NAME, func_virtual_ap_##TYPE_NAME, func_static_ap_##TYPE_NAME, func_virtual_buf_##TYPE_NAME, func_static_buf_##TYPE_NAME)
+
+JavaMethod_INVOKE(uint32, Int)
+JavaMethod_INVOKE(sint64, Long)
+JavaMethod_INVOKE(float,  Float)
+JavaMethod_INVOKE(double, Double)
+JavaMethod_INVOKE(JavaObject*, JavaObject)

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.cpp Thu Apr 25 11:46:36 2013
@@ -68,7 +68,7 @@ uint32_t JavaObject::hashCode(JavaObject
 
 
 void JavaObject::waitIntern(
-    JavaObject* self, struct timeval* info, bool timed) {
+    JavaObject* self, struct timeval* info, bool& timed) {
   llvm_gcroot(self, 0);
   JavaThread* thread = JavaThread::get();
   vmkit::LockSystem& table = thread->getJVM()->lockSystem;
@@ -88,15 +88,18 @@ void JavaObject::waitIntern(
 
 void JavaObject::wait(JavaObject* self) {
   llvm_gcroot(self, 0);
-  waitIntern(self, NULL, false);
+  bool timeout = false;
+  waitIntern(self, NULL, timeout);
 }
 
-void JavaObject::timedWait(JavaObject* self, struct timeval& info) {
+bool JavaObject::timedWait(JavaObject* self, struct timeval& info) {
   llvm_gcroot(self, 0);
-  waitIntern(self, &info, true);
+  bool timeout = true;
+  waitIntern(self, &info, timeout);
+  return !timeout;	//Return false if timed out
 }
 
-void JavaObject::wait(JavaObject* self, int64_t ms, int32_t ns) {
+bool JavaObject::wait(JavaObject* self, int64_t ms, int32_t ns) {
   llvm_gcroot(self, 0);
 
   Jnjvm* vm = JavaThread::get()->getJVM();
@@ -112,9 +115,10 @@ void JavaObject::wait(JavaObject* self,
     struct timeval t;
     t.tv_sec = sec;
     t.tv_usec = usec;
-    JavaObject::timedWait(self, t);
+    return JavaObject::timedWait(self, t);
   } else {
     JavaObject::wait(self);
+    return true;
   }
 }
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.h Thu Apr 25 11:46:36 2013
@@ -233,7 +233,7 @@ private:
   
   /// waitIntern - internal wait on a monitor
   ///
-  static void waitIntern(JavaObject* self, struct timeval *info, bool timed);
+  static void waitIntern(JavaObject* self, struct timeval *info, bool& timed);
   
 public:
 
@@ -255,11 +255,11 @@ public:
   /// timedWait - Java timed wait. Makes the current thread waiting on a
   /// monitor for the given amount of time.
   ///
-  static void timedWait(JavaObject* self, struct timeval &info);
+  static bool timedWait(JavaObject* self, struct timeval &info);
   
   /// wait - Wait for specified ms and ns.  Wrapper for either wait() or
   /// timedWait, depending on duration specified.
-  static void wait(JavaObject* self, int64_t ms, int32_t ns);
+  static bool wait(JavaObject* self, int64_t ms, int32_t ns);
 
   /// notify - Java notify. Notifies a thread from the availability of the
   /// monitor.

Modified: vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaRuntimeJIT.cpp Thu Apr 25 11:46:36 2013
@@ -8,7 +8,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <sstream>
 
+#include "Classpath.h"
 #include "ClasspathReflect.h"
 #include "JavaArray.h"
 #include "JavaClass.h"
@@ -25,13 +27,30 @@
 
 using namespace j3;
 
+extern "C" UserCommonClass* j3RuntimeInitialiseClass(UserClass*);
+
+extern "C" UserClass* j3InitialisationCheck(UserClass* cl)
+{
+	if (!cl->isClass()) return cl;
+	if (!cl->isInitializing())
+		cl = j3RuntimeInitialiseClass(cl)->asClass();
+	return cl;
+}
+
+extern "C" UserClass* j3InitialisationCheckForJavaObject(JavaObject* obj)
+{
+	CommonClass* ccl = JavaObject::getClass(obj);
+	if (!ccl->isClass()) return NULL;
+	return j3InitialisationCheck(ccl->asClass());
+}
+
 extern "C" void* j3InterfaceLookup(UserClass* caller, uint32 index) {
 
   void* res = 0;
 
   UserConstantPool* ctpInfo = caller->getConstantPool();
-  if (ctpInfo->ctpRes[index]) {
-    res = ctpInfo->ctpRes[index];
+  if (ctpInfo->getCachedValue(index)) {
+    res = ctpInfo->getCachedValue(index);
   } else {
     UserCommonClass* cl = 0;
     const UTF8* utf8 = 0;
@@ -41,7 +60,7 @@ extern "C" void* j3InterfaceLookup(UserC
     assert(cl->isClass() && isInterface(cl->access) && "Wrong type of method");
     res = cl->asClass()->lookupInterfaceMethod(utf8, sign->keyName);
     
-    ctpInfo->ctpRes[index] = (void*)res;
+    ctpInfo->updateCachedValue(index, res);
   }
   return res;
 }
@@ -52,8 +71,8 @@ extern "C" void* j3VirtualFieldLookup(Us
   void* res = 0;
 
   UserConstantPool* ctpInfo = caller->getConstantPool();
-  if (ctpInfo->ctpRes[index]) {
-    res = ctpInfo->ctpRes[index];
+  if (ctpInfo->getCachedValue(index)) {
+    res = ctpInfo->getCachedValue(index);
   } else {
   
     UserCommonClass* cl = 0;
@@ -65,7 +84,7 @@ extern "C" void* j3VirtualFieldLookup(Us
     UserClass* lookup = cl->isArray() ? cl->super : cl->asClass();
     JavaField* field = lookup->lookupField(utf8, sign->keyName, false, true, 0);
   
-    ctpInfo->ctpRes[index] = (void*)field->ptrOffset;
+    ctpInfo->updateCachedValue(index, (void*)field->ptrOffset);
   
     res = (void*)field->ptrOffset;
   }
@@ -80,8 +99,8 @@ extern "C" void* j3StaticFieldLookup(Use
   
   UserConstantPool* ctpInfo = caller->getConstantPool();
   
-  if (ctpInfo->ctpRes[index]) {
-    res = ctpInfo->ctpRes[index];
+  if (ctpInfo->getCachedValue(index)) {
+    res = ctpInfo->getCachedValue(index);
   } else {
   
     UserCommonClass* cl = 0;
@@ -101,7 +120,7 @@ extern "C" void* j3StaticFieldLookup(Use
     assert(obj && "No static instance in static field lookup");
   
     void* ptr = (void*)((uint64)obj + field->ptrOffset);
-    ctpInfo->ctpRes[index] = ptr;
+    ctpInfo->updateCachedValue(index, ptr);
    
     res = ptr;
   }
@@ -173,8 +192,9 @@ extern "C" void* j3ClassLookup(UserClass
 // Calls Java code.
 // Throws if initializing the class throws an exception.
 extern "C" UserCommonClass* j3RuntimeInitialiseClass(UserClass* cl) {
+  Jnjvm* vm = JavaThread::get()->getJVM();
   cl->resolveClass();
-  cl->initialiseClass(JavaThread::get()->getJVM());
+  cl->initialiseClass(vm);
   return cl;
 }
 
@@ -183,6 +203,10 @@ extern "C" JavaObject* j3RuntimeDelegate
   return cl->getClassDelegatee(JavaThread::get()->getJVM());
 }
 
+extern "C" JavaObject** j3RuntimeDelegateePtr(UserCommonClass* cl) {
+  return const_cast<JavaObject**>(cl->getClassDelegateePtr(JavaThread::get()->getJVM()));
+}
+
 // Throws if one of the dimension is negative.
 JavaObject* multiCallNewIntern(UserClassArray* cl, uint32 len,
                                sint32* dims, Jnjvm* vm) {
@@ -266,13 +290,13 @@ extern "C" void j3EndJNI(uint32** oldLRN
   th->currentAddedReferences = *oldLRN;
 }
 
-extern "C" word_t j3StartJNI(uint32* localReferencesNumber,
+extern "C" void* j3StartJNI(uint32* localReferencesNumber,
                                uint32** oldLocalReferencesNumber,
                                vmkit::KnownFrame* Frame) 
   __attribute__((noinline));
 
 // Never throws. Does not call Java code. Can not yield a GC. May join a GC.
-extern "C" word_t j3StartJNI(uint32* localReferencesNumber,
+extern "C" void* j3StartJNI(uint32* localReferencesNumber,
                                uint32** oldLocalReferencesNumber,
                                vmkit::KnownFrame* Frame) {
   
@@ -359,7 +383,7 @@ extern "C" void* j3StringLookup(UserClas
   UserConstantPool* ctpInfo = cl->getConstantPool();
   const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]);
   str = cl->classLoader->UTF8ToStr(utf8);
-  ctpInfo->ctpRes[index] = str;
+  ctpInfo->updateCachedValue(index, str);
   return (void*)str;
 }
 
@@ -453,7 +477,7 @@ extern "C" void* j3ResolveStaticStub() {
   result = callee->compiledPtr();
     
   // Update the entry in the constant pool.
-  ctpInfo->ctpRes[ctpIndex] = result;
+  ctpInfo->updateCachedValue(ctpIndex, result);
 
   return result;
 }
@@ -494,7 +518,7 @@ extern "C" void* j3ResolveSpecialStub()
   result = callee->compiledPtr();
     
   // Update the entry in the constant pool.
-  ctpInfo->ctpRes[ctpIndex] = result;
+  ctpInfo->updateCachedValue(ctpIndex, result);
 
   return result;
 }
@@ -502,7 +526,10 @@ extern "C" void* j3ResolveSpecialStub()
 // Does not throw an exception.
 extern "C" void* j3ResolveInterface(JavaObject* obj, JavaMethod* meth, uint32_t index) {
   word_t result = 0;
-  InterfaceMethodTable* IMT = JavaObject::getClass(obj)->virtualVT->IMT;
+  UserClass* cl = j3InitialisationCheckForJavaObject(obj);
+  assert(cl && "Invalid class of JavaObject");
+
+  InterfaceMethodTable* IMT = cl->virtualVT->IMT;
   if ((IMT->contents[index] & 1) == 0) {
     result = IMT->contents[index];
   } else {
@@ -525,15 +552,42 @@ extern "C" void* j3ResolveInterface(Java
 }
 
 extern "C" void j3PrintMethodStart(JavaMethod* meth) {
-  fprintf(stderr, "[%p] executing %s.%s\n", (void*)vmkit::Thread::get(),
-          UTF8Buffer(meth->classDef->name).cString(),
-          UTF8Buffer(meth->name).cString());
+#if JNJVM_EXECUTE > 0
+	JavaThread *thread = JavaThread::get();
+	char tab_level[10240];
+
+	assert((thread->call_level < sizeof(tab_level)/sizeof(tab_level[0])) && "Too deep call level to be logged!");
+
+	memset(tab_level, ' ', thread->call_level);
+	tab_level[thread->call_level++] = '\0';
+
+//	uint16_t c = meth->classDef->name->elements[0];
+//	if (c != 'i') return;
+
+	std::ostringstream log;
+	log << '[' << *thread << ']' << tab_level << " call " <<
+		*meth->classDef->name << '.' << *meth->name << std::endl;
+	std::cerr << log.str();
+#endif
 }
 
 extern "C" void j3PrintMethodEnd(JavaMethod* meth) {
-  fprintf(stderr, "[%p] return from %s.%s\n", (void*)vmkit::Thread::get(),
-          UTF8Buffer(meth->classDef->name).cString(),
-          UTF8Buffer(meth->name).cString());
+#if JNJVM_EXECUTE > 0
+	JavaThread *thread = JavaThread::get();
+	char tab_level[10240];
+
+	thread->call_level--;
+	memset(tab_level, ' ', thread->call_level);
+	tab_level[thread->call_level] = '\0';
+
+//	uint16_t c = meth->classDef->name->elements[0];
+//	if (c != 'i') return;
+
+	std::ostringstream log;
+	log << '[' << *thread << ']' << tab_level << " ret " <<
+		*meth->classDef->name << '.' << *meth->name << std::endl;
+	std::cerr << log.str();
+#endif
 }
 
 extern "C" void j3PrintExecution(uint32 opcode, uint32 index,
@@ -543,3 +597,50 @@ extern "C" void j3PrintExecution(uint32
          UTF8Buffer(meth->name).cString(),
          OpcodeNames[opcode], index);
 }
+
+extern "C" void* j3GetCachedValue(UserClass* cl, uint32 index, isolate_id_t isolateID)
+{
+	return cl->ctpInfo->getCachedValue(index, isolateID);
+}
+
+extern "C" uint32_t j3SetIsolate(uint32_t isolateID, uint32_t* currentIsolateID)
+{
+	vmkit::Thread* thread = vmkit::Thread::get();
+	isolate_id_t oldIsolateID = thread->getIsolateID();
+	isolate_id_t curIsolateID = oldIsolateID;
+
+	if ((isolateID != CURRENT_ISOLATE) && (isolateID != oldIsolateID)) {
+		thread->setIsolateID(isolateID);
+		curIsolateID = isolateID;
+	}
+
+	if (currentIsolateID != NULL) *currentIsolateID = curIsolateID;
+	return oldIsolateID;
+}
+
+extern "C" JavaObject** j3GetClassDelegateePtr(UserCommonClass* commonCl)
+{
+	JavaObject **obj = commonCl->getDelegateePtr();
+	if (!obj || !(*obj)) {
+		Jnjvm* vm = JavaThread::get()->getJVM();
+		commonCl->getClassDelegatee(vm, NULL);
+		obj = commonCl->getDelegateePtr();
+
+		assert(obj && (*obj) && "Invalid class delegatee");
+	}
+	return obj;
+}
+
+extern "C" JavaObject* j3GetClassDelegatee(UserCommonClass* commonClass)
+{
+	JavaObject *obj = commonClass->getDelegatee();
+	if (!obj) obj = j3RuntimeDelegatee(commonClass);
+	return obj;
+}
+
+extern "C" void* j3GetStaticInstance(UserClass* caller)
+{
+	TaskClassMirror& tcm = caller->getCurrentTaskClassMirror();
+	assert(caller->isInitializing() && (tcm.staticInstance != NULL) && "Isolate static instance not initialized.");
+	return tcm.staticInstance;
+}

Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.cpp Thu Apr 25 11:46:36 2013
@@ -7,12 +7,15 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <sstream>
+
 #include "vmkit/Locks.h"
 #include "vmkit/Thread.h"
 
 #include "JavaClass.h"
 #include "JavaObject.h"
 #include "JavaThread.h"
+#include "JavaString.h"
 #include "JavaUpcalls.h"
 #include "Jnjvm.h"
 
@@ -21,6 +24,9 @@ using namespace j3;
 
 JavaThread::JavaThread(Jnjvm* isolate) : MutatorThread() { 
   MyVM = isolate;
+  JavaThread* th = JavaThread::get();
+  if (th->isVmkitThread())
+	  isolateID = th->getIsolateID();
   pendingException = NULL;
   jniEnv = isolate->jniEnv;
   localJNIRefs = new JNILocalReferences();
@@ -40,12 +46,13 @@ JavaThread::~JavaThread() {
   delete localJNIRefs;
 }
 
-void JavaThread::throwException(JavaObject* obj) {
+void JavaThread::throwException(JavaObject* obj, bool immediate) {
   llvm_gcroot(obj, 0);
   JavaThread* th = JavaThread::get();
   assert(th->pendingException == 0 && "pending exception already there?");
   vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)&(th->pendingException), (gc*)obj);
-  th->internalThrowException();
+  if (immediate)
+    th->internalThrowException();
 }
 
 void JavaThread::throwPendingException() {
@@ -127,7 +134,7 @@ void JavaThread::printJavaBacktrace() {
 
   while (vmkit::FrameInfo* FI = Walker.get()) {
     if (FI->Metadata != NULL) {
-      MyVM->printMethod(FI, Walker.ip, Walker.addr);
+      MyVM->printMethod(FI, Walker.getReturnAddress(), Walker.getCallFrame());
     }
     ++Walker;
   }
@@ -163,3 +170,92 @@ void JNILocalReferences::removeJNIRefere
     length -= num;
   }
 }
+
+std::ostream& j3::operator << (std::ostream& os, JavaThread& thread)
+{
+	os << (void*)(&thread);
+
+	Jnjvm* vm = thread.getJVM();
+	JavaObject* jThread = thread.currentThread();
+	if (vm && jThread) {
+		JavaString* threadNameObj = static_cast<JavaString*>(
+			vm->upcalls->threadName->getInstanceObjectField(jThread));
+		char *threadName = JavaString::strToAsciiz(threadNameObj);
+		os << '(' << threadName << ')';
+		delete [] threadName;
+	}
+
+	return os << ',' << thread.getIsolateID();
+}
+
+void JavaThread::printStackTrace(int skip, int level_deep)
+{
+	JavaThread *thread = JavaThread::get();
+	std::cerr << '[' << *thread << "] Call stack trace:" << std::endl;
+
+	j3::Jnjvm *vm = thread->getJVM();
+	vmkit::StackWalker Walker(thread);
+	for (vmkit::FrameInfo* FI = NULL; (level_deep > 0) && ((FI = Walker.get()) != NULL); ++Walker) {
+		if (!FI->Metadata) continue;
+		if (skip > 0) {--skip; continue;}
+
+		vm->printMethod(FI, Walker.getReturnAddress(), Walker.getCallFrame());
+		--level_deep;
+	}
+}
+
+void JavaThread::throwNullPointerException(void* methodIP) const
+{
+	if (!this->isVmkitThread())
+		return vmkit::Thread::throwNullPointerException(methodIP);
+
+	this->cleanUpOnDeadIsolateBeforeException(&methodIP);
+
+	MyVM->nullPointerException();
+	UNREACHABLE();
+}
+
+void JavaThread::throwDeadIsolateException() const
+{
+	if (this->runsDeadIsolate())
+		const_cast<JavaThread*>(this)->setIsolateID(0);
+
+	if (!this->isVmkitThread())
+		return vmkit::Thread::throwDeadIsolateException();
+
+	void *methodIP = StackWalker_getCallFrameAddress();
+	methodIP = vmkit::StackWalker::getReturnAddressFromCallFrame(methodIP);
+
+	MyVM->deadIsolateException(methodIP, true);
+	UNREACHABLE();
+}
+
+extern "C" uint32_t j3SetIsolate(uint32_t isolateID, uint32_t* currentIsolateID);
+
+void JavaThread::cleanUpOnDeadIsolateBeforeException(void** methodIP, JavaMethod** method) const
+{
+	vmkit::StackWalker walker(const_cast<JavaThread*>(this), true);
+	vmkit::FrameInfo *FI = walker.get();
+
+	if (!FI) {
+		if (methodIP != NULL) *methodIP = NULL;
+		if (method != NULL) *method = NULL;
+		return;
+	}
+
+	JavaMethod* meth = (JavaMethod*)FI->Metadata;
+
+	// Restore the current isolate ID to that of the caller
+	isolate_id_t callerIsolateID = meth->classDef->classLoader->getIsolateID();
+	j3SetIsolate(callerIsolateID, NULL);
+
+	if (methodIP != NULL) *methodIP = FI->ReturnAddress;
+	if (method != NULL) *method = meth;
+}
+
+void JavaThread::runAfterLeavingGarbageCollectorRendezVous()
+{
+	// Be sure to throw an exception if I am running in a dead isolate
+	if (this->runsDeadIsolate())
+		throwDeadIsolateException();
+}

Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.h Thu Apr 25 11:46:36 2013
@@ -10,6 +10,8 @@
 #ifndef JNJVM_JAVA_THREAD_H
 #define JNJVM_JAVA_THREAD_H
 
+#include <ostream>
+
 #include "vmkit/Cond.h"
 #include "vmkit/Locks.h"
 #include "vmkit/ObjectLocks.h"
@@ -33,7 +35,7 @@ class Jnjvm;
 
 #define BEGIN_JNI_EXCEPTION \
   JavaThread* th = JavaThread::get(); \
-  word_t SP = th->getLastSP(); \
+  void* SP = th->getLastSP(); \
   th->leaveUncooperativeCode(); \
   vmkit::KnownFrame Frame; \
   th->startKnownFrame(Frame); \
@@ -92,6 +94,9 @@ public:
   ///
   JNILocalReferences* localJNIRefs;
 
+#if JNJVM_EXECUTE > 0
+  unsigned int call_level;
+#endif
 
   JavaObject** pushJNIRef(JavaObject* obj) {
     llvm_gcroot(obj, 0);
@@ -109,6 +114,9 @@ public:
   /// JavaThread - Empty constructor, used to get the VT.
   ///
   JavaThread() {
+#if JNJVM_EXECUTE > 0
+	  call_level = 0;
+#endif
   }
 
   /// ~JavaThread - Delete any potential malloc'ed objects used by this thread.
@@ -141,7 +149,7 @@ public:
  
   /// throwException - Throw the given exception in the current thread.
   ///
-  void throwException(JavaObject* obj);
+  void throwException(JavaObject* obj, bool immediate = true);
 
   /// throwPendingException - Throw a pending exception.
   ///
@@ -155,7 +163,7 @@ public:
 
   /// throwFromJNI - Throw an exception after executing JNI code.
   ///
-  void throwFromJNI(word_t SP) {
+  void throwFromJNI(void* SP) {
     endKnownFrame();
     enterUncooperativeCode(SP);
   }
@@ -203,6 +211,17 @@ public:
   ///
   void printJavaBacktrace();
 
+  static void printStackTrace(int skip = 3, int level_deep = 1) __attribute__((noinline));
+
+  friend std::ostream& operator << (std::ostream&, JavaThread&);
+
+  void cleanUpOnDeadIsolateBeforeException(void** methodIP = NULL, JavaMethod** method = NULL) const;
+
+  virtual void throwNullPointerException(void* methodIP) const;
+  virtual void throwDeadIsolateException() const;
+
+  virtual void runAfterLeavingGarbageCollectorRendezVous();
+
   /// getJavaFrameContext - Fill the buffer with Java methods currently on
   /// the stack.
   ///

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Thu Apr 25 11:46:36 2013
@@ -8,6 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 #define JNJVM_LOAD 0
+#define JNJVM_CLINIT 0
 
 #include <cfloat>
 #include <climits>
@@ -15,6 +16,7 @@
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
+#include <cerrno>
 #include <string>
 #include "debug.h"
 
@@ -119,9 +121,6 @@ void UserClass::initialiseClass(Jnjvm* v
     setInitializationState(inClinit);
     UserClass* cl = (UserClass*)this;
     
-    // Single environment allocates the static instance during resolution, so
-    // that compiled code can access it directly (with an initialization
-    // check just before the access)
     if (!cl->getStaticInstance()) cl->allocateStaticInstance(vm);
 
     release();
@@ -170,8 +169,25 @@ void UserClass::initialiseClass(Jnjvm* v
     JavaMethod* meth = lookupMethodDontThrow(vm->bootstrapLoader->clinitName,
                                              vm->bootstrapLoader->clinitType,
                                              true, false, 0);
+#if JNJVM_CLINIT
+	uint16_t c = this->name->elements[0];
+	bool logInit = !(c == 'j' || c == 'g');
+
+	static char init_buffer[10240];
+    static int init_level;
+    if (logInit) std::cout << '[' << *self << ']' << init_buffer;
+#endif
 
     if (meth) {
+
+#if JNJVM_CLINIT
+      if (logInit) {
+    	  std::cout << " clinit " << *name << " ..." << std::endl;
+          init_buffer[init_level] = ' ';
+          init_buffer[++init_level] = '\0';
+      }
+#endif
+
       TRY {
         meth->invokeIntStatic(vm, cl);
       } CATCH {
@@ -179,12 +195,31 @@ void UserClass::initialiseClass(Jnjvm* v
         assert(exc && "no exception?");
         self->clearException();
       } END_CATCH;
+
+#if JNJVM_CLINIT
+      if (logInit) {
+    	  init_buffer[--init_level] = '\0';
+    	  std::cout << '[' << *self << ']' << init_buffer;
+      }
+#endif
+
     }
 
+#if JNJVM_CLINIT
+    else {
+      if (logInit) std::cout << " init " << *name << " ... ";
+    }
+#endif
+
     // 9. If the execution of the initializers completes normally, then lock
     //    this Class object, label it fully initialized, notify all waiting 
     //    threads, release the lock, and complete this procedure normally.
     if (!exc) {
+
+#if JNJVM_CLINIT
+      if (logInit) std::cout << " done" << std::endl;
+#endif
+
       acquire();
       setInitializationState(ready);
       setOwnerClass(0);
@@ -193,6 +228,10 @@ void UserClass::initialiseClass(Jnjvm* v
       return;
     }
     
+#if JNJVM_CLINIT
+    if (logInit) std::cout << " failed" << std::endl;
+#endif
+    
     // 10. Otherwise, the initializers must have completed abruptly by
     //     throwing some exception E. If the class of E is not Error or one
     //     of its subclasses, then create a new instance of the class 
@@ -263,12 +302,19 @@ JavaObject* Jnjvm::CreateError(UserClass
   return obj;
 }
 
-void Jnjvm::error(UserClass* cl, JavaMethod* init, JavaString* str) {
+void Jnjvm::error(UserClass* cl, JavaMethod* init, JavaString* str, bool immediate) {
   JavaObject* obj = 0;
   llvm_gcroot(obj, 0);
   llvm_gcroot(str, 0);
   obj = CreateError(cl, init, str);
-  JavaThread::get()->throwException(obj);
+  JavaThread::get()->throwException(obj, immediate);
+}
+
+void Jnjvm::error(UserClass* cl, JavaMethod* init, const char* str, bool immediate) {
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+  obj = CreateError(cl, init, str);
+  JavaThread::get()->throwException(obj, immediate);
 }
 
 void Jnjvm::arrayStoreException() {
@@ -763,28 +809,28 @@ void Jnjvm::addProperty(char* key, char*
 }
 
 // Mimic what's happening in Classpath when creating a java.lang.Class object.
-JavaObject* UserCommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) {
+JavaObject* UserCommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd, isolate_id_t isolateID) {
   JavaObjectClass* delegatee = 0;
   JavaObjectClass* base = 0;
   llvm_gcroot(pd, 0);
   llvm_gcroot(delegatee, 0);
   llvm_gcroot(base, 0);
 
-  if (getDelegatee() == NULL) {
+  if (getDelegatee(isolateID) == NULL) {
     UserClass* cl = vm->upcalls->newClass;
-    delegatee = (JavaObjectClass*)cl->doNew(vm);
+    delegatee = (JavaObjectClass*)cl->doNew(vm, isolateID);
     JavaObjectClass::setClass(delegatee, this);
     if (pd == NULL && isArray()) {
       base = (JavaObjectClass*)
-        asArrayClass()->baseClass()->getClassDelegatee(vm, pd);
+        asArrayClass()->baseClass()->getClassDelegatee(vm, pd, isolateID);
       JavaObjectClass::setProtectionDomain(
         delegatee, JavaObjectClass::getProtectionDomain(base));
     } else {
       JavaObjectClass::setProtectionDomain(delegatee, pd);
     }
-    setDelegatee(delegatee);
+    setDelegatee(delegatee, isolateID);
   }
-  return getDelegatee();
+  return getDelegatee(isolateID);
 }
 
 JavaObject* const* UserCommonClass::getClassDelegateePtr(Jnjvm* vm, JavaObject* pd) {
@@ -1325,6 +1371,9 @@ Jnjvm::Jnjvm(vmkit::BumpPtrAllocator& Al
   bootstrapLoader = loader;
   upcalls = bootstrapLoader->upcalls;
   throwable = upcalls->newThrowable;
+
+  RunningIsolates[0].state = IsolateRunning;
+  RunningIsolates[0].loader = loader;
 }
 
 Jnjvm::~Jnjvm() {
@@ -1350,7 +1399,12 @@ void Jnjvm::startCollection() {
   referenceThread->WeakReferencesQueue.acquire();
   referenceThread->PhantomReferencesQueue.acquire();
 }
-  
+
+void Jnjvm::endCollectionBeforeUnblockingThreads()
+{
+	collectIsolates();
+}
+
 void Jnjvm::endCollection() {
   finalizerThread->FinalizationQueueLock.release();
   referenceThread->ToEnqueueLock.release();
@@ -1446,16 +1500,16 @@ extern "C" int StartJnjvmWithoutJIT(int
   return 0; 
 }
 
-void Jnjvm::printMethod(vmkit::FrameInfo* FI, word_t ip, word_t addr) {
+void Jnjvm::printMethod(vmkit::FrameInfo* FI, void* ip, void* callFrame) {
   if (FI->Metadata == NULL) {
-    vmkit::MethodInfoHelper::print(ip, addr);
+    vmkit::MethodInfoHelper::print(ip, callFrame);
     return;
   }
   JavaMethod* meth = (JavaMethod*)FI->Metadata;
 
   fprintf(stderr, "; %p (%p) in %s.%s (line %d, bytecode %d, code start %p)",
-          (void*)ip,
-          (void*)addr,
+          ip,
+          callFrame,
           UTF8Buffer(meth->classDef->name).cString(),
           UTF8Buffer(meth->name).cString(),
           meth->lookupLineNumber(FI),

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.h Thu Apr 25 11:46:36 2013
@@ -24,6 +24,7 @@
 #include "JnjvmConfig.h"
 #include "JNIReferences.h"
 #include "LockedMap.h"
+#include "JavaArray.h"
 
 namespace j3 {
 
@@ -46,6 +47,21 @@ class UserClassArray;
 class UserClassPrimitive;
 class UserCommonClass;
 
+enum IsolateState {	// These are bits that can be set independently
+	IsolateFree				= 0x0,
+	IsolateRunning			= 0x1,
+
+	IsolateDenyExecution	= 0x2,
+	IsolateResetReferences	= 0x4
+};
+typedef uint8_t		isolate_state_t;
+
+struct IsolateDescriptor {
+	isolate_state_t		state;
+	JnjvmClassLoader	*loader;
+};
+
+
 /// ThreadSystem - Thread management of a JVM. Each JVM has one thread
 /// management system to count the number of non-daemon threads it owns.
 /// The initial thread of the JVM is a non-daemon thread. When there are
@@ -94,7 +110,7 @@ public:
   char* jarFile;
   std::vector< std::pair<char*, char*> > agents;
 
-  void readArgs(Jnjvm *vm);
+  void readArgs(class Jnjvm *vm);
   void extractClassFromJar(Jnjvm* vm, int argc, char** argv, int i);
   void javaAgent(char* cur);
 
@@ -123,6 +139,7 @@ private:
   ReferenceThread* referenceThread;
 
   virtual void startCollection();
+  virtual void endCollectionBeforeUnblockingThreads();
   virtual void endCollection();
   virtual void scanWeakReferencesQueue(word_t closure);
   virtual void scanSoftReferencesQueue(word_t closure);
@@ -131,9 +148,11 @@ private:
   virtual void addFinalizationCandidate(gc* obj);
   virtual size_t getObjectSize(gc* obj);
   virtual const char* getObjectTypeName(gc* obj);
-  virtual void printMethod(vmkit::FrameInfo* FI, word_t ip, word_t addr);
 
+public:
+  virtual void printMethod(vmkit::FrameInfo* FI, void* ip, void* callFrame);
 
+private:
   /// CreateError - Creates a Java object of the specified exception class
   /// and calling its <init> function.
   ///
@@ -144,7 +163,8 @@ private:
   /// that calls this functions. This is used internally by Jnjvm to control
   /// which pair class/method are used.
   ///
-  void error(UserClass* cl, JavaMethod* meth, JavaString*);
+  void error(UserClass* cl, JavaMethod* meth, JavaString*, bool immediate = true);
+  void error(UserClass* cl, JavaMethod* meth, const char*, bool immediate = true);
   
   /// errorWithExcp - Throws an exception whose cause is the Java object excp.
   ///
@@ -350,6 +370,34 @@ public:
   /// mapping the initial thread.
   ///
   void loadBootstrap();
+  void loadIsolate(JnjvmClassLoader *loader);
+
+  IsolateDescriptor RunningIsolates[NR_ISOLATES];
+  vmkit::LockNormal IsolateLock;
+
+  int allocateNextFreeIsolateID(JnjvmClassLoader* loader, isolate_id_t *isolateID);
+  void freeIsolateID(isolate_id_t isolateID);
+
+  void disableIsolates(isolate_id_t* isolateID, size_t isolateCount, bool denyIsolateExecution, bool resetIsolateReferences);
+
+  void collectIsolates();
+  void collectIsolate(isolate_id_t isolateID);
+  void denyIsolateExecutionInThread(isolate_id_t isolateID, JavaThread& thread);
+  void denyIsolateExecutionInMethodFrame(const vmkit::StackWalker& CallerWalker, vmkit::StackWalker& CalledWalker);
+  void removeExceptionHandlersInThread(isolate_id_t isolateID, JavaThread& thread);
+  void denyMethodExecution(const vmkit::StackWalker& CallerWalker, vmkit::StackWalker& CalledWalker);
+  void denyMethodExecution(JavaMethod& method);
+  bool isActivatorStopMethod(JavaMethod& method) const;
+  isolate_id_t getFrameIsolateID(const vmkit::FrameInfo& frame) const;
+  isolate_id_t getFrameIsolateID(const JavaMethod& method) const;
+  void redirectMethodProlog(void* methodAddress, void* redirectCode, size_t codeSize);
+  void denyClassExecution(isolate_id_t isolateID, CommonClass& cl);
+  void invalidateAllClassesInIsolate(isolate_id_t isolateID);
+
+  virtual bool resetDeadIsolateReference(void* source, void** objectRef);
+  virtual void deadIsolateException(void* methodIP, bool immediate = true);
+
+  virtual void printCallStack(const vmkit::StackWalker& walker);
 };
 
 } // end namespace j3

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Thu Apr 25 11:46:36 2013
@@ -49,6 +49,7 @@ typedef void (*static_init_t)(JnjvmClass
 const UTF8* JavaCompiler::InlinePragma = 0;
 const UTF8* JavaCompiler::NoInlinePragma = 0;
 
+extern "C" uint32_t j3SetIsolate(uint32_t isolateID, uint32_t* currentIsolateID);
 
 JnjvmBootstrapLoader::JnjvmBootstrapLoader(vmkit::BumpPtrAllocator& Alloc,
                                            JavaCompiler* Comp, 
@@ -142,18 +143,18 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
   arrayTable[JavaArray::T_LONG - 4] = upcalls->ArrayOfLong;
   arrayTable[JavaArray::T_DOUBLE - 4] = upcalls->ArrayOfDouble;
   
-  Attribut::annotationsAttribut =
+  JavaAttribute::annotationsAttribute =
     asciizConstructUTF8("RuntimeVisibleAnnotations");
-  Attribut::codeAttribut = asciizConstructUTF8("Code");
-  Attribut::exceptionsAttribut = asciizConstructUTF8("Exceptions");
-  Attribut::constantAttribut = asciizConstructUTF8("ConstantValue");
-  Attribut::lineNumberTableAttribut = asciizConstructUTF8("LineNumberTable");
-  Attribut::innerClassesAttribut = asciizConstructUTF8("InnerClasses");
-  Attribut::sourceFileAttribut = asciizConstructUTF8("SourceFile");
-  Attribut::signatureAttribut = asciizConstructUTF8("Signature");
-  Attribut::enclosingMethodAttribut = asciizConstructUTF8("EnclosingMethod");
-  Attribut::paramAnnotationsAttribut = asciizConstructUTF8("RuntimeVisibleParameterAnnotations");
-  Attribut::annotationDefaultAttribut = asciizConstructUTF8("AnnotationDefault");
+  JavaAttribute::codeAttribute = asciizConstructUTF8("Code");
+  JavaAttribute::exceptionsAttribute = asciizConstructUTF8("Exceptions");
+  JavaAttribute::constantAttribute = asciizConstructUTF8("ConstantValue");
+  JavaAttribute::lineNumberTableAttribute = asciizConstructUTF8("LineNumberTable");
+  JavaAttribute::innerClassesAttribute = asciizConstructUTF8("InnerClasses");
+  JavaAttribute::sourceFileAttribute = asciizConstructUTF8("SourceFile");
+  JavaAttribute::signatureAttribute = asciizConstructUTF8("Signature");
+  JavaAttribute::enclosingMethodAttribute = asciizConstructUTF8("EnclosingMethod");
+  JavaAttribute::paramAnnotationsAttribute = asciizConstructUTF8("RuntimeVisibleParameterAnnotations");
+  JavaAttribute::annotationDefaultAttribute = asciizConstructUTF8("AnnotationDefault");
  
   JavaCompiler::InlinePragma =
     asciizConstructUTF8("Lorg/vmmagic/pragma/Inline;");
@@ -172,6 +173,7 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
   VMDoubleName = asciizConstructUTF8("java/lang/VMDouble");
   stackWalkerName = asciizConstructUTF8("gnu/classpath/VMStackWalker");
   NoClassDefFoundError = asciizConstructUTF8("java/lang/NoClassDefFoundError");
+  org_osgi_framework_BundleContext = asciizConstructUTF8("Lorg/osgi/framework/BundleContext;");
 
 #define DEF_UTF8(var) \
   var = asciizConstructUTF8(#var)
@@ -204,14 +206,20 @@ JnjvmBootstrapLoader::JnjvmBootstrapLoad
   DEF_UTF8(doubleToRawLongBits);
   DEF_UTF8(intBitsToFloat);
   DEF_UTF8(longBitsToDouble);
+  DEF_UTF8(stop);
 
 #undef DEF_UTF8 
 }
 
+JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) :
+	isolateID(0), allocator(Alloc)
+{
+}
+
 JnjvmClassLoader::JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc,
                                    JnjvmClassLoader& JCL, JavaObject* loader,
                                    VMClassLoader* vmdata,
-                                   Jnjvm* I) : allocator(Alloc) {
+                                   Jnjvm* VM) : isolateID(0), allocator(Alloc) {
   llvm_gcroot(loader, 0);
   llvm_gcroot(vmdata, 0);
   bootstrapLoader = JCL.bootstrapLoader;
@@ -226,13 +234,22 @@ JnjvmClassLoader::JnjvmClassLoader(vmkit
   vmdata->JCL = this;
   vmkit::Collector::objectReferenceNonHeapWriteBarrier(
       (gc**)&javaLoader, (gc*)loader);
-  isolate = I;
+  vm = VM;
 
   JavaMethod* meth = bootstrapLoader->upcalls->loadInClassLoader;
   loadClassMethod = 
     JavaObject::getClass(loader)->asClass()->lookupMethodDontThrow(
         meth->name, meth->type, false, true, &loadClass);
   assert(loadClass && "Loader does not have a loadClass function");
+
+  if (VM->appClassLoader != NULL) {	// Is the system class loader already set up?
+    isolate_id_t oldIsolateID = 0;
+    VM->allocateNextFreeIsolateID(this, &isolateID);
+
+    oldIsolateID = j3SetIsolate(isolateID, NULL);
+    VM->loadIsolate(this);
+    j3SetIsolate(oldIsolateID, NULL);
+  }
 }
 
 void JnjvmClassLoader::setCompiler(JavaCompiler* Comp) {
@@ -330,9 +347,9 @@ UserClass* JnjvmClassLoader::internalLoa
   if (!cl) {
     UserClass* forCtp = loadClass;
     if (strName == NULL) {
-      strName = JavaString::internalToJava(name, isolate);
+      strName = JavaString::internalToJava(name, vm);
     }
-    obj = loadClassMethod->invokeJavaObjectVirtual(isolate, forCtp, javaLoader,
+    obj = loadClassMethod->invokeJavaObjectVirtual(vm, forCtp, javaLoader,
                                                    &strName);
     cl = JavaObjectClass::getClass(((JavaObjectClass*)obj));
   }
@@ -837,8 +854,9 @@ const UTF8* JnjvmClassLoader::readerCons
 
 JnjvmClassLoader::~JnjvmClassLoader() {
 
-  if (isolate) {
-    isolate->removeFrameInfos(TheCompiler);
+  if (vm) {
+    vm->removeFrameInfos(TheCompiler);
+    vm->freeIsolateID(isolateID);
   }
 
   if (classes) {
@@ -879,7 +897,7 @@ JnjvmBootstrapLoader::~JnjvmBootstrapLoa
 JavaString** JnjvmClassLoader::UTF8ToStr(const UTF8* val) {
   JavaString* res = NULL;
   llvm_gcroot(res, 0);
-  res = isolate->internalUTF8ToStr(val);
+  res = vm->internalUTF8ToStr(val);
   return strings->addString(this, res);
 }
 

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Thu Apr 25 11:46:36 2013
@@ -57,12 +57,14 @@ private:
 
   /// isolate - Which isolate defined me? Null for the bootstrap class loader.
   ///
-  Jnjvm* isolate;
+  Jnjvm* vm;
+  isolate_id_t isolateID;
 
   /// javaLoder - The Java representation of the class loader. Null for the
   /// bootstrap class loader.
   ///
   JavaObject* javaLoader;
+//  JavaObject* javaLoader[NR_ISOLATES];
 
   /// internalLoad - Load the class with the given name.
   ///
@@ -78,7 +80,7 @@ private:
   /// first use of a Java class loader.
   ///
   JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc, JnjvmClassLoader& JCL,
-                   JavaObject* loader, VMClassLoader* vmdata, Jnjvm* isolate);
+                   JavaObject* loader, VMClassLoader* vmdata, Jnjvm* VM);
 
   /// lookupComponentName - Try to find the component name of the given array
   /// name. If the component name is not in the table of UTF8s and holder
@@ -92,7 +94,7 @@ private:
   void ensureCached(UserCommonClass* cl);
 protected:
   
-  JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) : allocator(Alloc) {}
+  JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc);
   
   /// TheCompiler - The Java compiler for this class loader.
   ///
@@ -130,9 +132,7 @@ public:
   ///
   vmkit::BumpPtrAllocator& allocator;
  
-  /// getIsolate - Returns the isolate that created this class loader.
-  ///
-  Jnjvm* getIsolate() const { return isolate; }
+  isolate_id_t getIsolateID() const {return isolateID;}
 
   /// getClasses - Returns the classes this class loader has loaded.
   ///
@@ -387,6 +387,7 @@ public:
   Classpath* upcalls;
   
   /// Lists of UTF8s used internaly in VMKit.
+  const UTF8* org_osgi_framework_BundleContext;
   const UTF8* NoClassDefFoundError;
   const UTF8* initName;
   const UTF8* clinitName;
@@ -427,6 +428,7 @@ public:
   const UTF8* doubleToRawLongBits;
   const UTF8* intBitsToFloat;
   const UTF8* longBitsToDouble;
+  const UTF8* stop;
 
   /// primitiveMap - Map of primitive classes, hashed by id.
   std::map<const char, UserClassPrimitive*> primitiveMap;

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmConfig.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmConfig.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmConfig.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmConfig.h Thu Apr 25 11:46:36 2013
@@ -28,6 +28,6 @@ class JavaConstantPool;
 }
 #define ISOLATE_STATIC static
 
-#define NR_ISOLATES 1
+#define NR_ISOLATES 256
 
 #endif // JNJVM_CONFIG_H

Added: vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.cpp?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.cpp (added)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.cpp Thu Apr 25 11:46:36 2013
@@ -0,0 +1,196 @@
+
+#include "JnjvmIsolate.h"
+
+using namespace j3;
+
+
+extern "C" jint Java_ijvm_isolate_vm_IJVM_getObjectIsolateID(JavaObject* object)
+{
+	llvm_gcroot(object, 0);
+	const UserCommonClass* ccl = JavaObject::getClass(object);
+	isolate_id_t isolateID = ccl->classLoader->getIsolateID();
+	return isolateID;
+}
+
+extern "C" void Java_ijvm_isolate_vm_IJVM_disableIsolates(ArrayLong *isolateID, jboolean denyIsolateExecution, jboolean resetIsolateReferences)
+{
+	size_t isolateCount = ArrayLong::getSize(isolateID);
+	isolate_id_t* list = new isolate_id_t[isolateCount];
+
+	for (size_t i=0; i < isolateCount; ++i)
+		list[i] = (isolate_id_t)ArrayLong::getElement(isolateID, i);
+
+	((Jnjvm*)vmkit::Thread::get()->MyVM)->disableIsolates(list, isolateCount, denyIsolateExecution, resetIsolateReferences);
+
+	delete [] list;
+}
+
+void Jnjvm::disableIsolates(isolate_id_t* isolateID, size_t isolateCount, bool denyIsolateExecution, bool resetIsolateReferences)
+{
+	if (!isolateID || !isolateCount || (!denyIsolateExecution && !resetIsolateReferences)) return;	// Nothing to do
+
+	for (size_t i=0; i < isolateCount; ++i) {
+		if (isolateID[i] == 0)
+			illegalArgumentException("isolateID must not be zero");
+	}
+
+	{
+		vmkit::LockGuard lg(IsolateLock);
+		for (size_t i=0; i < isolateCount; ++i) {
+			RunningIsolates[isolateID[i]].state |=
+				(resetIsolateReferences ? IsolateResetReferences : 0) |
+				(denyIsolateExecution ? IsolateDenyExecution : 0);
+		}
+	}
+
+	vmkit::Collector::collect();
+}
+
+void Jnjvm::collectIsolates()
+{
+//	vmkit::LockGuard lg(IsolateLock);
+	for (isolate_id_t isolateID = 0; isolateID < NR_ISOLATES; ++isolateID)
+		collectIsolate(isolateID);
+}
+
+void Jnjvm::collectIsolate(isolate_id_t isolateID)
+{
+	if (!(RunningIsolates[isolateID].state & IsolateDenyExecution)) return;
+
+	// Deny current isolate execution in running threads
+	vmkit::Thread *thisThread = vmkit::Thread::get();
+	for (vmkit::Thread* th = (vmkit::Thread*)thisThread->next(); th != thisThread; th = (vmkit::Thread*)th->next())
+		denyIsolateExecutionInThread(isolateID, *(JavaThread*)th);
+
+	// Deny future isolate execution
+	ClassMap* classes = RunningIsolates[isolateID].loader->getClasses();
+//	classes->lock.lock();
+	for (ClassMap::iterator cl = classes->map.begin(), clEnd = classes->map.end(); cl != clEnd; ++cl)
+		denyClassExecution(isolateID, *cl->second);
+//	classes->lock.unlock();
+
+	invalidateAllClassesInIsolate(isolateID);
+}
+
+void Jnjvm::printCallStack(const vmkit::StackWalker& walker)
+{
+	vmkit::FrameInfo* FI = NULL;
+	JavaThread* thread = (JavaThread*)walker.getScannedThread();
+
+	std::cerr << '[' << *thread << "] Call stack trace from call frame=" << walker.getCallFrame() << std::endl;
+	for (vmkit::StackWalker w(walker); (FI = w.get()) != NULL; ++w)
+		this->printMethod(FI, w.getReturnAddress(), w.getCallFrame());
+	std::cerr << std::endl;
+}
+
+void Jnjvm::loadIsolate(JnjvmClassLoader *loader)
+{
+  JavaObject* obj = NULL;
+  JavaObject* javaLoader = NULL;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(javaLoader, 0);
+
+  assert((bootstrapLoader->upcalls->newString != NULL) && "bootstrap class loader not initialized");
+
+#define LOAD_CLASS(cl) \
+  cl->resolveClass(); \
+  cl->initialiseClass(this);
+
+  LOAD_CLASS(upcalls->newString);
+
+  // The initialization code of the classes initialized below may require
+  // to get the Java thread, so we create the Java thread object first.
+  LOAD_CLASS(upcalls->newThread);
+  LOAD_CLASS(upcalls->newVMThread);
+  LOAD_CLASS(upcalls->threadGroup);
+
+  LOAD_CLASS(upcalls->newClass);
+  LOAD_CLASS(upcalls->newConstructor);
+  LOAD_CLASS(upcalls->newField);
+  LOAD_CLASS(upcalls->newMethod);
+  LOAD_CLASS(upcalls->newStackTraceElement);
+  LOAD_CLASS(upcalls->boolClass);
+  LOAD_CLASS(upcalls->byteClass);
+  LOAD_CLASS(upcalls->charClass);
+  LOAD_CLASS(upcalls->shortClass);
+  LOAD_CLASS(upcalls->intClass);
+  LOAD_CLASS(upcalls->longClass);
+  LOAD_CLASS(upcalls->floatClass);
+  LOAD_CLASS(upcalls->doubleClass);
+  LOAD_CLASS(upcalls->InvocationTargetException);
+  LOAD_CLASS(upcalls->ArrayStoreException);
+  LOAD_CLASS(upcalls->ClassCastException);
+  LOAD_CLASS(upcalls->IllegalMonitorStateException);
+  LOAD_CLASS(upcalls->IllegalArgumentException);
+  LOAD_CLASS(upcalls->InterruptedException);
+  LOAD_CLASS(upcalls->IndexOutOfBoundsException);
+  LOAD_CLASS(upcalls->ArrayIndexOutOfBoundsException);
+  LOAD_CLASS(upcalls->NegativeArraySizeException);
+  LOAD_CLASS(upcalls->NullPointerException);
+  LOAD_CLASS(upcalls->SecurityException);
+  LOAD_CLASS(upcalls->ClassFormatError);
+  LOAD_CLASS(upcalls->ClassCircularityError);
+  LOAD_CLASS(upcalls->NoClassDefFoundError);
+  LOAD_CLASS(upcalls->UnsupportedClassVersionError);
+  LOAD_CLASS(upcalls->NoSuchFieldError);
+  LOAD_CLASS(upcalls->NoSuchMethodError);
+  LOAD_CLASS(upcalls->InstantiationError);
+  LOAD_CLASS(upcalls->IllegalAccessError);
+  LOAD_CLASS(upcalls->IllegalAccessException);
+  LOAD_CLASS(upcalls->VerifyError);
+  LOAD_CLASS(upcalls->ExceptionInInitializerError);
+  LOAD_CLASS(upcalls->LinkageError);
+  LOAD_CLASS(upcalls->AbstractMethodError);
+  LOAD_CLASS(upcalls->UnsatisfiedLinkError);
+  LOAD_CLASS(upcalls->InternalError);
+  LOAD_CLASS(upcalls->OutOfMemoryError);
+  LOAD_CLASS(upcalls->StackOverflowError);
+  LOAD_CLASS(upcalls->UnknownError);
+  LOAD_CLASS(upcalls->ClassNotFoundException);
+  LOAD_CLASS(upcalls->ArithmeticException);
+  LOAD_CLASS(upcalls->InstantiationException);
+  LOAD_CLASS(upcalls->SystemClass);
+  LOAD_CLASS(upcalls->cloneableClass);
+  LOAD_CLASS(upcalls->CloneNotSupportedException);
+#undef LOAD_CLASS
+
+  // Implementation-specific end-of-bootstrap initialization
+  upcalls->InitializeSystem(this);
+
+  obj = JavaThread::get()->currentThread();
+  javaLoader = loader->getJavaClassLoader();
+  upcalls->setContextClassLoader->invokeIntSpecial(this, upcalls->newThread, obj, &javaLoader);
+
+  // load and initialize math since it is responsible for dlopen'ing
+  // libjavalang.so and we are optimizing some math operations
+  UserCommonClass* math = bootstrapLoader->loadName(bootstrapLoader->mathName, true, true, NULL);
+  math->asClass()->initialiseClass(this);
+}
+
+int Jnjvm::allocateNextFreeIsolateID(JnjvmClassLoader* loader, isolate_id_t *isolateID)
+{
+	isolate_id_t i = 0;
+	{
+		vmkit::LockGuard lg(IsolateLock);
+		for (; (i < NR_ISOLATES) && (RunningIsolates[i].state != IsolateFree); ++i);
+
+		if (i < NR_ISOLATES) {
+			RunningIsolates[i].state = IsolateRunning;
+			RunningIsolates[i].loader = loader;
+
+			if (isolateID != NULL) *isolateID = i;
+		}
+	}
+
+	assert((i < NR_ISOLATES) && "Not enough isolate slots");
+	return (i < NR_ISOLATES) ? 0 : ENOENT;
+}
+
+void Jnjvm::freeIsolateID(isolate_id_t isolateID)
+{
+	vmkit::LockGuard lg(IsolateLock);
+	RunningIsolates[isolateID].state = IsolateFree;
+	RunningIsolates[isolateID].loader = NULL;
+
+	std::cout << "Isolate " << isolateID << " unloaded from memory." << std::endl;
+}

Added: vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.h?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.h (added)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIsolate.h Thu Apr 25 11:46:36 2013
@@ -0,0 +1,32 @@
+
+#include <sys/mman.h>
+#include <llvm/Support/Memory.h>
+#include <cerrno>
+
+#include "VmkitGC.h"
+#include "Jnjvm.h"
+#include "JavaClass.h"
+#include "JavaUpcalls.h"
+#include "VMStaticInstance.h"
+#include "j3/JavaJITCompiler.h"
+#include "j3/jni.h"
+
+
+extern "C" uint32_t j3SetIsolate(uint32_t isolateID, uint32_t* currentIsolateID);
+
+extern "C" void CalledStoppedIsolateMethod(void* methodIP) __attribute__((noinline));
+extern "C" void ReturnedToStoppedIsolateMethod(void* methodIP) __attribute__((noinline));
+
+extern "C" void StoppedIsolate_Redirect_ReturnToDeadMethod() __attribute__((naked, noreturn, noinline));
+
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod() __attribute__((naked, noreturn, noinline));
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod_End() __attribute__((naked, noreturn, noinline));
+
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop() __attribute__((naked, noreturn, noinline));
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop_End() __attribute__((naked, noreturn, noinline));
+
+#define StoppedIsolate_Redirect_CallToDeadMethod_CodeSize	\
+	((size_t)((intptr_t)StoppedIsolate_Redirect_CallToDeadMethod_End - (intptr_t)StoppedIsolate_Redirect_CallToDeadMethod))
+
+#define StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop_CodeSize	\
+	((size_t)((intptr_t)StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop_End - (intptr_t)StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop))

Added: vmkit/trunk/lib/j3/VMCore/JnjvmIsolateRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIsolateRef.cpp?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIsolateRef.cpp (added)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIsolateRef.cpp Thu Apr 25 11:46:36 2013
@@ -0,0 +1,37 @@
+
+#include "JnjvmIsolate.h"
+
+using namespace j3;
+
+
+bool Jnjvm::resetDeadIsolateReference(void* source, void** ptr)
+{
+	// Don't touch fake Java objects that exist only as bridges between the
+	// Java object model and the C++ object model.
+	if (!ptr || !(*ptr)	// NULL reference or NULL object
+		|| VMClassLoader::isVMClassLoader(*(JavaObject**)ptr)
+		|| VMStaticInstance::isVMStaticInstance(*(JavaObject**)ptr))
+		return false;
+
+	CommonClass* ccl = JavaObject::getClass(*((JavaObject**)ptr));
+	isolate_id_t isolateID = ccl->classLoader->getIsolateID();
+
+	// vmkit::LockGuard lg(IsolateLock);
+	if (!(RunningIsolates[isolateID].state & IsolateResetReferences))
+		return false;	// Isolate not marked for resetting references
+
+	std::cout << "Resetting @reference=" << ptr << " @oldObject=" << *ptr <<
+		" class=" << *ccl->name << " isolateID=" << isolateID;
+
+	if (source) {
+		CommonClass* sccl = JavaObject::getClass(((JavaObject*)source));
+		isolate_id_t sourceIsolateID = sccl->classLoader->getIsolateID();
+
+		std::cout << " fromClass=" << *sccl->name << " fromIsolateID=" << sourceIsolateID;
+	}
+
+	std::cout << std::endl;
+
+	*ptr = NULL;	// Reset the reference
+	return true;
+}

Added: vmkit/trunk/lib/j3/VMCore/JnjvmIsolateTerm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmIsolateTerm.cpp?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmIsolateTerm.cpp (added)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmIsolateTerm.cpp Thu Apr 25 11:46:36 2013
@@ -0,0 +1,505 @@
+
+#include "JnjvmIsolate.h"
+
+using namespace j3;
+
+
+void Jnjvm::invalidateAllClassesInIsolate(isolate_id_t isolateID)
+{
+	// Mark all classes as invalid in the given isolate
+	ClassMap* classes = RunningIsolates[isolateID].loader->getClasses();
+//	classes->lock.lock();
+
+	for (isolate_id_t runningIsolateID = 0; runningIsolateID < NR_ISOLATES; ++runningIsolateID) {
+		if (RunningIsolates[runningIsolateID].state == IsolateFree) continue;
+
+		classes = RunningIsolates[runningIsolateID].loader->getClasses();
+		for (ClassMap::iterator cli = classes->map.begin(), cliEnd = classes->map.end(); cli != cliEnd; ++cli) {
+			if (!cli->second->isClass()) continue;
+
+			Class *cl = cli->second->asClass();
+			for (isolate_id_t deniedIsolateID = 0; deniedIsolateID < NR_ISOLATES; ++deniedIsolateID) {
+				if (!(RunningIsolates[deniedIsolateID].state & IsolateDenyExecution)) continue;
+
+				TaskClassMirror& tcm = cl->getTaskClassMirror(deniedIsolateID);
+				tcm.initialized = false;
+				tcm.status = loaded;
+			}
+		}
+	}
+//	classes->lock.unlock();
+}
+
+void Jnjvm::denyIsolateExecutionInThread(isolate_id_t isolateID, JavaThread& thread)
+{
+	if (!thread.isVmkitThread()) return;	// This is not a Java thread
+
+	removeExceptionHandlersInThread(isolateID, thread);
+
+	// We look at every pair of methods (native and Java methods).
+	vmkit::StackWalker CallerWalker(&thread);
+
+	if (!CallerWalker.isValid())
+		return;	// No methods (native/Java) to inspect in this stack
+
+	vmkit::StackWalker CalledWalker(CallerWalker);
+	++CallerWalker;
+
+	if (!CallerWalker.isValid()) return;	// One frame in the stack (is this normal? possible?)
+
+	// Loop over pairs of method frames (caller/called) in the stack
+	for (vmkit::StackWalkerState state = vmkit::StackWalkerInvalid;
+		(state = CallerWalker.getState()) >= vmkit::StackWalkerValid;
+		CalledWalker = CallerWalker, ++CallerWalker)
+	{
+		if (state != vmkit::StackWalkerValidMetadata)
+			continue;	// The caller method is not a Java method
+
+		const vmkit::FrameInfo* CallerFrame = CallerWalker.get();
+		if (isolateID != getFrameIsolateID(*CallerFrame))
+			continue;	// The caller method does not belong to the terminating isolate
+
+		// The caller method is a Java method belonging to the terminating isolate.
+		vmkit::StackWalker LastJavaCallerWalker(CallerWalker);
+
+		// Look for the next Java methods.
+		CallerWalker.reportOnlyMetadataEnabledFrames(true);
+		for (++CallerWalker; ; LastJavaCallerWalker = CallerWalker, ++CallerWalker) {
+			if ((state = CallerWalker.getState()) == vmkit::StackWalkerInvalid) {
+				// No Java methods calling this method, only native methods.
+				CallerWalker = LastJavaCallerWalker;
+				break;
+			}
+
+			// We found a Java caller method
+			CallerFrame = CallerWalker.get();
+			if (isolateID != getFrameIsolateID(*CallerFrame)) {
+				// The Java caller method does not belong to the terminating isolate.
+				// Make CallerWalker point at the last frame before that foreign Java method frame.
+				vmkit::StackWalker ForeignCaller(CallerWalker);
+				CallerWalker = LastJavaCallerWalker;
+				CallerWalker.reportOnlyMetadataEnabledFrames(false);
+
+				for (++CallerWalker;
+					CallerWalker != ForeignCaller;
+					LastJavaCallerWalker = CallerWalker, ++CallerWalker);
+
+				CallerWalker = LastJavaCallerWalker;
+				break;
+			}
+
+			// We found another Java caller method belonging to the terminating isolate.
+			// Continue scanning...
+		}
+		CallerWalker.reportOnlyMetadataEnabledFrames(false);
+
+		// CalledWalker                     : called frame, native or NOT belonging to the terminating isolate.
+		// (CalledWalker + 1)...CallerWalker: caller frames, native or belonging to the terminating isolate.
+		denyIsolateExecutionInMethodFrame(CallerWalker, CalledWalker);
+
+		// We are sure that the next method frame is either native or a Java method frame
+		// not belonging to the terminating isolate.
+		++CallerWalker;
+	}
+
+	// If the thread was running code in the isolate to kill, set its current isolate ID
+	// to the dead isolate ID, it should throw an exception as soon as it accesses isolate ID
+	if (thread.getIsolateID() == isolateID)
+		thread.markRunningDeadIsolate();
+}
+
+isolate_id_t Jnjvm::getFrameIsolateID(const vmkit::FrameInfo& frame) const
+{
+	assert(frame.Metadata && "Method frame has no metadata.");
+	return getFrameIsolateID(*(const JavaMethod*)frame.Metadata);
+}
+
+isolate_id_t Jnjvm::getFrameIsolateID(const JavaMethod& method) const
+{
+	const JnjvmClassLoader* loader = method.classDef->classLoader;
+	return (loader == loader->bootstrapLoader) ? 0 : loader->getIsolateID();
+}
+
+void Jnjvm::denyIsolateExecutionInMethodFrame(const vmkit::StackWalker& CallerWalker, vmkit::StackWalker& CalledWalker)
+{
+	denyMethodExecution(CallerWalker, CalledWalker);
+
+	// Patch the return address of the given method frame in order to return to the address of
+	// StoppedIsolate_RedirectMethodCodeToException when it executes the ret instruction.
+	vmkit::StackWalker walker(CalledWalker);
+	++walker;
+	walker.updateReturnAddress((void*)(intptr_t)(&StoppedIsolate_Redirect_ReturnToDeadMethod));
+
+	// Patch the thread stack frames to exclude the given method frames, so that further scanning of the stack does
+	// not reveal those method frames.
+	walker.updateCallerFrameAddress(CallerWalker.getCallerCallFrame());
+}
+
+void Jnjvm::redirectMethodProlog(void* methodAddress, void* redirectCode, size_t codeSize)
+{
+	llvm::sys::MemoryBlock methodProlog(methodAddress, codeSize);
+	llvm::sys::Memory::setWritable(methodProlog);
+
+	memcpy(methodAddress, redirectCode, codeSize);
+
+	llvm::sys::Memory::InvalidateInstructionCache(methodAddress, codeSize);
+}
+
+void Jnjvm::removeExceptionHandlersInThread(isolate_id_t isolateID, JavaThread& thread)
+{
+	// Remove all exception handlers which run in the given isolate.
+	// These exception handlers might exist in a method that was loaded by the isolate class loader itself,
+	// and might be a method that does not modify the current isolate ID (e.g. a Java runtime method) and
+	// which consequently run in the isolate of its caller.
+
+	vmkit::ExceptionBuffer *CurExceptBuffer, *CalledExceptBuffer = NULL;
+	for (CurExceptBuffer = thread.lastExceptionBuffer;
+		CurExceptBuffer != NULL;
+		CurExceptBuffer = CurExceptBuffer->getPrevious())
+	{
+		if (isolateID != CurExceptBuffer->getHandlerIsolateID()) {
+			CalledExceptBuffer = CurExceptBuffer;
+			continue;
+		}
+
+		if (JavaMethod* method = (JavaMethod*)thread.MyVM->IPToFrameInfo(CurExceptBuffer->getHandlerMethod())->Metadata) {
+			std::cout << '[' << thread << "] Disabling exception handler inside method=" <<
+				*method->classDef->name << '.' << *method->name <<
+				" in isolateID=" << getFrameIsolateID(*method) << std::endl;
+		}
+
+		// Skip the exception buffer
+		if (!CalledExceptBuffer)
+			thread.lastExceptionBuffer = CurExceptBuffer->getPrevious();
+		else
+			CalledExceptBuffer->setPrevious(CurExceptBuffer->getPrevious());
+	}
+}
+/*
+void Jnjvm::removeExceptionHandlersInMethodFrames(JavaThread& thread, const vmkit::StackWalker& CallerWalker, vmkit::StackWalker& CalledWalker)
+{
+	// Remove all exception handlers in the given methods
+	vmkit::ExceptionBuffer *CurExceptBuffer, *CalledExceptBuffer = NULL;
+	bool MoreFramesToCheck = true, skippedExceptHandler = false;
+	vmkit::StackWalker CalledMarkerWalker(CalledWalker);
+	++CalledMarkerWalker;	// Skip the called method
+
+	for (CurExceptBuffer = thread.lastExceptionBuffer;
+		CurExceptBuffer != NULL;
+		CalledExceptBuffer = skippedExceptHandler ? CalledExceptBuffer : CurExceptBuffer,
+		CurExceptBuffer = CurExceptBuffer->getPrevious())
+	{
+		vmkit::FrameInfo* ExceptHandlerMethodFrame;
+		JavaMethod* ExceptHandlerMethodInfo;
+		vmkit::StackWalker walker(CalledMarkerWalker);
+		skippedExceptHandler = false;
+
+		void* ExceptHandlerMethodAddr = CurExceptBuffer->getHandlerMethod();
+		if (!ExceptHandlerMethodAddr) continue;
+
+		ExceptHandlerMethodFrame = thread.MyVM->IPToFrameInfo(ExceptHandlerMethodAddr);
+		if (!ExceptHandlerMethodFrame) continue;
+
+		ExceptHandlerMethodInfo = (JavaMethod*)ExceptHandlerMethodFrame->Metadata;
+		if (!ExceptHandlerMethodInfo) continue;
+
+		walker.reportOnlyMetadataEnabledFrames(false);
+
+		for (bool inLastCaller = false; !inLastCaller; ++walker) {
+			inLastCaller = (walker == CallerWalker);
+
+			vmkit::FrameInfo* DeadMethodFrame = walker.get();
+			if (!DeadMethodFrame) continue;
+
+			JavaMethod* DeadMethodInfo = (JavaMethod*)DeadMethodFrame->Metadata;
+			if (!DeadMethodInfo) continue;
+			if (DeadMethodInfo != ExceptHandlerMethodInfo) continue;
+
+			std::cout << '[' << thread << "] Disabling exception handler inside method=" <<
+				*DeadMethodInfo->classDef->name << '.' << *DeadMethodInfo->name <<
+				" in isolateID=" << getFrameIsolateID(*DeadMethodInfo) << std::endl;
+
+			// Skip the exception buffer
+			if (!CalledExceptBuffer)
+				thread.lastExceptionBuffer = CurExceptBuffer->getPrevious();
+			else
+				CalledExceptBuffer->setPrevious(CurExceptBuffer->getPrevious());
+
+			// This called method frame exception buffer is now skipped, don't check it again.
+			CalledMarkerWalker = walker;
+			++CalledMarkerWalker;
+
+			skippedExceptHandler = true;
+			MoreFramesToCheck = !inLastCaller;	// Still have method frames to check?
+			break;
+		}
+
+		if (!MoreFramesToCheck)
+			break;
+	}
+}
+*/
+void Jnjvm::denyMethodExecution(const vmkit::StackWalker& CallerWalker, vmkit::StackWalker& CalledWalker)
+{
+	vmkit::StackWalker walker(CalledWalker);
+	do {
+		++walker;
+		if (walker.getState() < vmkit::StackWalkerValidMetadata) continue;
+
+		denyMethodExecution(*((JavaMethod*)walker.get()->Metadata));
+	} while (walker != CallerWalker);
+}
+
+void Jnjvm::denyMethodExecution(JavaMethod& method)
+{
+	void *redirectCode;
+	size_t redirectCodeSize;
+	if (isActivatorStopMethod(method)) {
+		redirectCode = (void*)(intptr_t)StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop;
+		redirectCodeSize = StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop_CodeSize;
+	} else {
+		redirectCode = (void*)(intptr_t)StoppedIsolate_Redirect_CallToDeadMethod;
+		redirectCodeSize = StoppedIsolate_Redirect_CallToDeadMethod_CodeSize;
+	}
+
+	if (method.code == redirectCode)
+		return;	// Already denied, nothing to do
+
+	if (method.code != NULL) {	// Method was generated, overwrite its prolog code in memory
+		std::cout << "Patching prolog of method[generated,non-custom]=" <<
+			*method.classDef->name << '.' << *method.name <<
+			" in isolateID=" << getFrameIsolateID(method) << std::endl;
+
+		redirectMethodProlog(method.code, redirectCode, redirectCodeSize);
+
+		method.code = redirectCode;		// Make the function point to the redirection code.
+		return;
+	}
+
+	if (!method.isCustomizable) {
+		std::cout << "Patching prolog of method[not-generated,non-custom]=" <<
+			*method.classDef->name << '.' << *method.name <<
+			" in isolateID=" << getFrameIsolateID(method) << std::endl;
+
+		method.code = redirectCode;		// Make the function point to the redirection code.
+		return;
+	}
+
+	// NOTE:
+	// We must NOT generate code here, because we might cause a dead lock while trying to obtain
+	// the LLVM-IR lock via protectIR().
+
+	// Avoid any further customizations to this method
+	JavaJITCompiler* compiler = static_cast<JavaJITCompiler*>(method.classDef->classLoader->getCompiler());
+	LLVMMethodInfo* methodInfo = compiler->getMethodInfo(&method);
+
+	method.isCustomizable = false;
+	methodInfo->isCustomizable = false;
+
+	// Patch all the customized versions of the method.
+	LLVMMethodInfo::customizedVersionsType* methodVersions = methodInfo->getCustomizedVersions();
+	for (LLVMMethodInfo::customizedVersionsIterator methodCode = methodVersions->begin(),
+		methodCodeEnd = methodVersions->end();
+		methodCode != methodCodeEnd;
+		++methodCode)
+	{
+		std::cout << "Patching prolog of method[generated,custom]=" <<
+			*method.classDef->name << '.' << *method.name <<
+			" customizedFor=" << *methodCode->first->name <<
+			" in isolateID=" << getFrameIsolateID(method) << std::endl;
+
+		void *code = compiler->executionEngine->getPointerToGlobal(methodCode->second);
+		redirectMethodProlog(code, redirectCode, redirectCodeSize);
+	}
+
+	method.code = redirectCode;		// Make the function point to the redirection code.
+}
+
+bool Jnjvm::isActivatorStopMethod(JavaMethod& method) const
+{
+	/*
+		WARNING: We have made enough checks to be sure this method is:
+		public void stop(BundleContext bundleContext) throws Exception
+
+		However, we must also check that the class of this method is the Activator of the bundle.
+		This would require calling org.osgi.framework.Bundle.getHeaders() and finding the
+		"Bundle-Activator" meta-data to compare it with method.classDef.
+	*/
+	if (!isPublic(method.access) || isStatic(method.access)) return false;
+
+	const Signdef* sign = method.getSignature();
+	if ((sign->nbArguments != 1) || !sign->getReturnType()->isVoid()) return false;
+
+	JnjvmBootstrapLoader* bootstrapLoader = method.classDef->classLoader->bootstrapLoader;
+	return	method.name->equals(bootstrapLoader->stop)
+			&& (**sign->getArgumentsType()).keyName->equals(bootstrapLoader->org_osgi_framework_BundleContext);
+}
+
+void Jnjvm::denyClassExecution(isolate_id_t isolateID, CommonClass& ccl)
+{
+	if ((ccl.classLoader->getIsolateID() != isolateID)
+		|| ccl.isPrimitive() || ccl.isArray() || ccl.isInterface())
+		return;
+
+	if (ccl.super)
+		denyClassExecution(isolateID, *ccl.super);	// Deny the super class, if any
+
+	Class& cl = *ccl.asClass();
+	for (size_t i=0; i < cl.nbInnerClasses; ++i)
+		denyClassExecution(isolateID, *cl.innerClasses[i]);	// Deny inner classes, if any
+
+	std::cout << "Denying class execution: " << *cl.name << std::endl;
+
+	for (size_t i=0; i < cl.nbStaticMethods; ++i)
+		denyMethodExecution(cl.staticMethods[i]);	// Deny static class methods
+
+	for (size_t i=0; i < cl.nbVirtualMethods; ++i)
+		denyMethodExecution(cl.virtualMethods[i]);	// Deny virtual object methods
+}
+
+extern "C" void CalledStoppedIsolateMethod(void* methodIP)
+{
+	JavaThread *thread = JavaThread::get();
+	JavaMethod* method = NULL;
+	thread->cleanUpOnDeadIsolateBeforeException(&methodIP, &method);
+
+	if (method) {
+		std::cout << '[' << *thread << "] DeadIsolateException(ReturnedToStoppedIsolateMethod) in method=" <<
+			*method->classDef->name << '.' << *method->name << std::endl;
+	}
+
+	thread->MyVM->deadIsolateException(methodIP);
+	UNREACHABLE();
+}
+
+extern "C" void ReturnedToStoppedIsolateMethod(void* methodIP)
+{
+	JavaThread *thread = JavaThread::get();
+	JavaMethod* method = NULL;
+	thread->cleanUpOnDeadIsolateBeforeException(&methodIP, &method);
+
+	if (method) {
+		std::cout << '[' << *thread << "] DeadIsolateException(ReturnedToStoppedIsolateMethod) in method=" <<
+			*method->classDef->name << '.' << *method->name << std::endl;
+	}
+
+	thread->MyVM->deadIsolateException(methodIP);
+	UNREACHABLE();
+}
+
+void Jnjvm::deadIsolateException(void* methodIP, bool immediate)
+{
+	//error(upcalls->DeadIsolateException, upcalls->InitDeadIsolateException, str, immediate);
+	error(
+		upcalls->InterruptedException, upcalls->InitInterruptedException,
+		"Called method is implemented by a bundle that was stopped.",
+		immediate);
+}
+
+#if defined(ARCH_X86) && defined(LINUX_OS)
+
+/*
+This code treats the case where M0 calls M1 which calls M2 (Mi are Java methods) where:
+- M1 belongs to the terminating isolate, and
+- M0 and M2 do not.
+
+M2 will continue running as expected. But when it returns, instead of jumping to M1, it comes here.
+In fact, M2 should have its on-stack return address patched to jump here.
+So, this code will run in the stack frame of M1. This code will adjust the stack frame of M1 then
+simulate a call to throw an exception. The adjustment made will make it seem as if M0 thrown the
+exception directly.
+
+In short, this code transforms: M0 > M1 > M2
+						  into: M0 > throw exception
+
+NOTICE:
+* The exception thrower function should never return to its caller, except to exception handlers.
+* This code supposes that the calling convention of LLVM-generated code is cdecl. The stdcall calling
+  convention requires the called method to know the number of parameters it receives and to pop them
+  out on return (instruction: ret N), this would prohibit us from writing a generic code to patch the
+  stack, and would require dynamic code generation, or another way of doing things...
+* This code must be position-independent because it might be copied elsewhere, so no relative
+  offsets should be generated. Careful choosing instructions.
+*/
+
+extern "C" void StoppedIsolate_Redirect_ReturnToDeadMethod()
+{
+	asm volatile (
+		"mov %ebp, %esp								\n"	// Free all locals
+		"pop %ebp									\n"	// caller EBP ==> EBP
+		"push (%esp)								\n"	// Arg0 = ReturnAddress
+		// Copy the full function address into the register to avoid generating an offset-based call instruction.
+		"mov $ReturnedToStoppedIsolateMethod, %eax	\n"
+		"jmp %eax									\n"	// simulate a call from caller
+	);
+}
+
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod()
+{
+	asm volatile (
+		"push (%esp)											\n"	// Arg0 = ReturnAddress
+		// Copy the full function address into the register to avoid generating an offset-based call instruction.
+		"mov $CalledStoppedIsolateMethod, %eax					\n"
+		"jmp %eax												\n"	// simulate a call from caller
+		"StoppedIsolate_Redirect_CallToDeadMethod_End:			\n"	// Mark the end of code
+
+		".globl StoppedIsolate_Redirect_CallToDeadMethod_End	\n"	// Reserve space for the label address
+	);
+}
+
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop()
+{
+	asm volatile (
+		"ret																\n"	// Return directly to the caller
+		"StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop_End:		\n"// Mark the end of code
+
+		".globl StoppedIsolate_Redirect_CallToDeadMethod_ActivatorStop_End	\n"// Reserve space for the label address
+	);
+}
+
+/*
+// NOTE: This works more correctly than __builtin_frame_address because this does NOT require stack frame to be setup.
+extern "C" void* StoppedIsolate_GetEIP()
+{
+	asm volatile (
+		"mov (%esp), %eax	\n"
+		"ret				\n"
+	);
+}
+
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod_Redirect()
+{
+	asm volatile (
+		"sub $StoppedIsolate_Redirect_CallToDeadMethod_Code, %eax	\n"
+		"add $StoppedIsolate_Redirect_CallToDeadMethod_Data, %eax	\n"
+		"mov (%eax), %eax											\n"
+
+		"push %ebp													\n"
+		"push %eax													\n"
+		"mov $CalledStoppedIsolateMethod, %eax						\n"
+		"call %eax													\n"
+		);
+}
+
+extern "C" void StoppedIsolate_Redirect_CallToDeadMethod()
+{
+	asm volatile (
+		"mov $StoppedIsolate_GetEIP, %eax						\n"
+		"call %eax												\n"
+
+		"StoppedIsolate_Redirect_CallToDeadMethod_Code:			\n"
+		"mov $StoppedIsolate_Redirect_CallToDeadMethod_Redirect, %ebx	\n"
+		"jmp %ebx												\n"
+
+		"StoppedIsolate_Redirect_CallToDeadMethod_Data:			\n"
+		".fill 4												\n"// Enough to store a (void*)
+		"StoppedIsolate_Redirect_CallToDeadMethod_End:			\n"
+
+		".globl StoppedIsolate_Redirect_CallToDeadMethod_End	\n"
+	);
+}
+*/
+
+#else
+#error "Sorry. Only Linux x86 is currently supported."
+#endif

Modified: vmkit/trunk/lib/j3/VMCore/LinkJavaRuntime.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/LinkJavaRuntime.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/LinkJavaRuntime.h (original)
+++ vmkit/trunk/lib/j3/VMCore/LinkJavaRuntime.h Thu Apr 25 11:46:36 2013
@@ -29,6 +29,14 @@ namespace vmkit {
 
 using namespace j3;
 
+extern "C" uint32_t j3SetIsolate(uint32_t isolateID, uint32_t* currentIsolateID);
+extern "C" void* j3GetStaticInstance(UserClass* cl);
+extern "C" void* j3GetCachedValue(UserClass* cl, uint32 index, isolate_id_t isolateID);
+extern "C" JavaObject** j3GetClassDelegateePtr(UserCommonClass* commonCl);
+extern "C" JavaObject* j3GetClassDelegatee(UserCommonClass* commonCl);
+extern "C" UserClass* j3InitialisationCheck(UserClass* cl);
+extern "C" UserClass* j3InitialisationCheckForJavaObject(JavaObject* obj);
+
 extern "C" void* j3InterfaceLookup(UserClass* caller, uint32 index);
 extern "C" void* j3VirtualFieldLookup(UserClass* caller, uint32 index);
 extern "C" void* j3StaticFieldLookup(UserClass* caller, uint32 index);
@@ -36,6 +44,7 @@ extern "C" void* j3VirtualTableLookup(Us
 extern "C" void* j3StringLookup(UserClass* cl, uint32 index);
 extern "C" void* j3ClassLookup(UserClass* caller, uint32 index);
 extern "C" UserCommonClass* j3RuntimeInitialiseClass(UserClass* cl);
+extern "C" JavaObject** j3RuntimeDelegateePtr(UserCommonClass* cl);
 extern "C" JavaObject* j3RuntimeDelegatee(UserCommonClass* cl);
 extern "C" JavaArray* j3MultiCallNew(UserClassArray* cl, uint32 len, ...);
 extern "C" UserClassArray* j3GetArrayClass(UserCommonClass*,

Modified: vmkit/trunk/lib/j3/VMCore/Reader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Reader.h?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Reader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/Reader.h Thu Apr 25 11:46:36 2013
@@ -44,7 +44,7 @@ public:
   uint32 cursor;
   uint32 max;
 
-  Reader(Attribut* attr, ClassBytes* bytes) {
+  Reader(JavaAttribute* attr, ClassBytes* bytes) {
     this->bytes = bytes;
     this->cursor = attr->start;
     this->min = attr->start;

Modified: vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/VirtualTables.cpp Thu Apr 25 11:46:36 2013
@@ -175,8 +175,8 @@ void CommonClass::tracer(word_t closure)
   }
 
   for (uint32 i = 0; i < NR_ISOLATES; ++i) {
-    if (delegatee[i] != NULL) {
-      vmkit::Collector::markAndTraceRoot(delegatee + i, closure);
+    if (getDelegatee(i) != NULL) {
+      vmkit::Collector::markAndTraceRoot(getDelegateePtr(i), closure);
     }
   }
 }
@@ -184,13 +184,12 @@ void CommonClass::tracer(word_t closure)
 void Class::tracer(word_t closure) {
   CommonClass::tracer(closure);
   
-  for (uint32 i = 0; i < NR_ISOLATES; ++i) {
-    TaskClassMirror &M = IsolateInfo[i];
-    if (M.staticInstance != NULL) {
+  for (uint32 isolateID = 0; isolateID < NR_ISOLATES; ++isolateID) {
+    if (getStaticInstance(isolateID) != NULL) {
       for (uint32 i = 0; i < nbStaticFields; ++i) {
         JavaField& field = staticFields[i];
         if (field.isReference()) {
-          JavaObject** ptr = field.getStaticObjectFieldPtr();
+          JavaObject** ptr = field.getStaticObjectFieldPtr(isolateID);
           vmkit::Collector::markAndTraceRoot(ptr, closure);
         }
       }

Modified: vmkit/trunk/lib/vmkit/CommonThread/CollectionRV.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/CollectionRV.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/CollectionRV.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/CollectionRV.cpp Thu Apr 25 11:46:36 2013
@@ -90,7 +90,7 @@ void CooperativeCollectionRV::join() {
   th->inRV = true;
   
   lockRV();
-  th->setLastSP(System::GetCallerAddress());
+  th->setLastSP(StackWalker_getCallFrameAddress());
   th->joinedRV = true;
   another_mark();
   waitEndOfRV();
@@ -98,6 +98,8 @@ void CooperativeCollectionRV::join() {
   unlockRV();
   
   th->inRV = false;
+
+  th->runAfterLeavingGarbageCollectorRendezVous();
 }
 
 void CooperativeCollectionRV::joinBeforeUncooperative() {
@@ -108,6 +110,7 @@ void CooperativeCollectionRV::joinBefore
   th->inRV = true;
   
   lockRV();
+  bool wasInRV = th->doYield;
   if (th->doYield) {
     if (!th->joinedRV) {
       th->joinedRV = true;
@@ -118,9 +121,11 @@ void CooperativeCollectionRV::joinBefore
   unlockRV();
 
   th->inRV = false;
+
+  if (wasInRV) th->runAfterLeavingGarbageCollectorRendezVous();
 }
 
-void CooperativeCollectionRV::joinAfterUncooperative(word_t SP) {
+void CooperativeCollectionRV::joinAfterUncooperative(void* SP) {
   vmkit::Thread* th = vmkit::Thread::get();
   assert((th->getLastSP() == 0) &&
          "SP set after entering uncooperative code");
@@ -128,6 +133,7 @@ void CooperativeCollectionRV::joinAfterU
   th->inRV = true;
 
   lockRV();
+  bool wasInRV = th->doYield;
   if (th->doYield) {
     th->setLastSP(SP);
     if (!th->joinedRV) {
@@ -140,6 +146,8 @@ void CooperativeCollectionRV::joinAfterU
   unlockRV();
 
   th->inRV = false;
+
+  if (wasInRV) th->runAfterLeavingGarbageCollectorRendezVous();
 }
 
 extern "C" void conditionalSafePoint() {

Modified: vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ObjectLocks.cpp Thu Apr 25 11:46:36 2013
@@ -387,7 +387,7 @@ FatLock* LockSystem::getFatLockFromID(wo
 
 
 bool LockingThread::wait(
-    gc* self, LockSystem& table, struct timeval* info, bool timed) {
+    gc* self, LockSystem& table, struct timeval* info, bool& timed) {
   llvm_gcroot(self, 0);
   assert(vmkit::ThinLock::owner(self, table));
 
@@ -443,6 +443,7 @@ bool LockingThread::wait(
          l->firstThread->nextWaiting)) && "Inconsistent list");
  
   bool interrupted = (this->interruptFlag != 0);
+  timed = timeout;
 
   if (interrupted || timeout) {
     if (this->nextWaiting) {

Modified: vmkit/trunk/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/Sigsegv-linux-x86.inc Thu Apr 25 11:46:36 2013
@@ -39,8 +39,8 @@ void Handler::UpdateRegistersForNPE() {
 }
 
 void Handler::UpdateRegistersForStackOverflow() {
-  word_t alt_stack = vmkit::Thread::get()->GetAlternativeStackStart();
-  ((ucontext_t*)context)->uc_mcontext.gregs[REG_EBX] = System::GetIPFromCallerAddress(((ucontext_t*)context)->uc_mcontext.gregs[REG_EBP]);
+  greg_t alt_stack = (greg_t)vmkit::Thread::get()->GetAlternativeStackStart();
+  ((ucontext_t*)context)->uc_mcontext.gregs[REG_EBX] = (greg_t)StackWalker::getReturnAddressFromCallFrame((void*)((ucontext_t*)context)->uc_mcontext.gregs[REG_EBP]);
   ((ucontext_t*)context)->uc_mcontext.gregs[REG_EAX] = ((ucontext_t*)context)->uc_mcontext.gregs[REG_EBP];
   ((ucontext_t*)context)->uc_mcontext.gregs[REG_ESP] = alt_stack;
   ((ucontext_t*)context)->uc_mcontext.gregs[REG_EIP] = (word_t)HandleStackOverflow;

Modified: vmkit/trunk/lib/vmkit/CommonThread/Sigsegv.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/Sigsegv.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/Sigsegv.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/Sigsegv.cpp Thu Apr 25 11:46:36 2013
@@ -52,7 +52,7 @@ bool System::SupportsHardwareStackOverfl
 }
 #endif
 
-extern "C" void ThrowStackOverflowError(word_t ip) {
+extern "C" void ThrowStackOverflowError(void* ip) {
   vmkit::Thread* th = vmkit::Thread::get();
   vmkit::FrameInfo* FI = th->MyVM->IPToFrameInfo(ip);
   if (FI->Metadata == NULL) {
@@ -65,23 +65,15 @@ extern "C" void ThrowStackOverflowError(
   UNREACHABLE();
 }
 
-extern "C" void ThrowNullPointerException(word_t ip) {
-  vmkit::Thread* th = vmkit::Thread::get();
-  vmkit::FrameInfo* FI = th->MyVM->IPToFrameInfo(ip);
-  if (FI->Metadata == NULL) {
-    fprintf(stderr, "Thread %p received a SIGSEGV: either the VM code or an external\n"
-                    "native method is bogus. Aborting...\n", (void*)th);
-    abort();
-  } else {
-    vmkit::Thread::get()->MyVM->nullPointerException();
-  }
-  UNREACHABLE();
+extern "C" void ThrowNullPointerException(void* methodIP)
+{
+	vmkit::Thread::get()->throwNullPointerException(methodIP);
 }
 
 void sigsegvHandler(int n, siginfo_t *info, void *context) {
   Handler handler(context);
   vmkit::Thread* th = vmkit::Thread::get();
-  word_t addr = (word_t)info->si_addr;
+  void* addr = (void*)info->si_addr;
   if (th->IsStackOverflowAddr(addr)) {
     if (vmkit::System::SupportsHardwareStackOverflow()) {
       handler.UpdateRegistersForStackOverflow();

Modified: vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/vmkit/CommonThread/ctthread.cpp Thu Apr 25 11:46:36 2013
@@ -16,6 +16,7 @@
 #include "vmkit/Locks.h"
 #include "vmkit/Thread.h"
 
+#include <iostream>
 #include <cassert>
 #include <cstdio>
 #include <errno.h>
@@ -27,6 +28,27 @@
 
 using namespace vmkit;
 
+ExceptionBuffer::ExceptionBuffer()
+{
+	addToThreadExceptionList(0);
+	handlerIsolateID = Thread::get()->getIsolateID();
+}
+
+void ExceptionBuffer::addToThreadExceptionList(void* returnAddr)
+{
+  Thread* th = Thread::get();
+  handlerMethod = returnAddr;
+  previousBuffer = th->lastExceptionBuffer;
+  th->lastExceptionBuffer = this;
+}
+
+void ExceptionBuffer::removeFromThreadExceptionList()
+{
+  Thread* th = Thread::get();
+  assert(th->lastExceptionBuffer == this && "Wrong exception buffer");
+  th->lastExceptionBuffer = previousBuffer;
+}
+
 int Thread::kill(void* tid, int signo) {
   return pthread_kill((pthread_t)tid, signo);
 }
@@ -53,13 +75,13 @@ void Thread::joinRVBeforeEnter() {
   MyVM->rendezvous.joinBeforeUncooperative(); 
 }
 
-void Thread::joinRVAfterLeave(word_t savedSP) {
+void Thread::joinRVAfterLeave(void* savedSP) {
   MyVM->rendezvous.joinAfterUncooperative(savedSP); 
 }
 
 void Thread::startKnownFrame(KnownFrame& F) {
   // Get the caller of this function
-  word_t cur = System::GetCallerAddress();
+  void* cur = StackWalker_getCallFrameAddress();
   F.previousFrame = lastKnownFrame;
   F.currentFP = cur;
   // This is used as a marker.
@@ -74,12 +96,12 @@ void Thread::endKnownFrame() {
 
 void Thread::startUnknownFrame(KnownFrame& F) {
   // Get the caller of this function
-  word_t cur = System::GetCallerAddress();
+  void* cur = StackWalker_getCallFrameAddress();
   // Get the caller of the caller.
-  cur = System::GetCallerOfAddress(cur);
+  cur = StackWalker::getCallerCallFrameAddress(cur);
   F.previousFrame = lastKnownFrame;
   F.currentFP = cur;
-  F.currentIP = System::GetIPFromCallerAddress(cur);
+  F.currentIP = StackWalker::getReturnAddressFromCallFrame(cur);
   lastKnownFrame = &F;
 }
 
@@ -89,23 +111,23 @@ void Thread::endUnknownFrame() {
 }
 
 void Thread::internalThrowException() {
-  LONGJMP(lastExceptionBuffer->buffer, 1);
+  LONGJMP(lastExceptionBuffer->getSetJmpBuffer(), 1);
 }
 
 void Thread::printBacktrace() {
   StackWalker Walker(this);
 
   while (FrameInfo* FI = Walker.get()) {
-    MyVM->printMethod(FI, Walker.ip, Walker.addr);
+    MyVM->printMethod(FI, Walker.getReturnAddress(), Walker.getCallFrame());
     ++Walker;
   }
 }
 
-void Thread::getFrameContext(word_t* buffer) {
+void Thread::getFrameContext(void** buffer) {
   vmkit::StackWalker Walker(this);
   uint32_t i = 0;
 
-  while (word_t ip = *Walker) {
+  while (void* ip = *Walker) {
     buffer[i++] = ip;
     ++Walker;
   }
@@ -122,63 +144,185 @@ uint32_t Thread::getFrameContextLength()
   return i;
 }
 
+void* StackWalker::getCallerCallFrameAddress(void* callFrame)
+{
+	void **oldBasePtr = (void**)callFrame;
+	return *oldBasePtr;
+}
+
+void** StackWalker::getReturnAddressPtrFromCallFrame(void* callFrame)
+{
+	void **oldBasePtr = (void**)callFrame;
+
+#if defined(MACOS_OS) && defined(ARCH_PPC)
+    return oldBasePtr + 2;
+#else
+    return oldBasePtr + 1;
+#endif
+}
+
+void* StackWalker::getReturnAddressFromCallFrame(void* callFrame)
+{
+	return *getReturnAddressPtrFromCallFrame(callFrame);
+}
+
 FrameInfo* StackWalker::get() {
-  if (addr == thread->baseSP) return 0;
-  ip = System::GetIPFromCallerAddress(addr);
-  return thread->MyVM->IPToFrameInfo(ip);
+  if (callFrame == thread->baseSP) return 0;
+  return thread->MyVM->IPToFrameInfo(getReturnAddress());
 }
 
-word_t StackWalker::operator*() {
-  if (addr == thread->baseSP) return 0;
-  ip = System::GetIPFromCallerAddress(addr);
-  return ip;
+StackWalkerState StackWalker::getState() const
+{
+    const FrameInfo *fi = this->get();
+    if (!fi) return				StackWalkerInvalid;
+    if (!fi->Metadata) return	StackWalkerValid;
+    return						StackWalkerValidMetadata;
 }
 
-void StackWalker::operator++() {
-  if (addr != thread->baseSP) {
-    assert((addr < thread->baseSP) && "Corrupted stack");
-    assert((addr < System::GetCallerOfAddress(addr)) && "Corrupted stack");
-    if ((frame != NULL) && (addr == frame->currentFP)) {
-      assert(frame->currentIP == 0);
-      frame = frame->previousFrame;
-      assert(frame != NULL);
-      assert(frame->currentIP != 0);
-      addr = frame->currentFP;
-      frame = frame->previousFrame;
-    } else {
-      addr = System::GetCallerOfAddress(addr);
-    }
-  }
+void* StackWalker::operator*() {
+  if (callFrame == thread->baseSP) return 0;
+  return getReturnAddress();
 }
 
-StackWalker::StackWalker(vmkit::Thread* th) {
-  thread = th;
-  frame = th->lastKnownFrame;
-  if (vmkit::Thread::get() == th) {
-    addr = System::GetCallerAddress();
-    addr = System::GetCallerOfAddress(addr);
-  } else {
-    addr = th->waitOnSP();
-    if (frame) {
-      assert(frame->currentFP >= addr);
-    }
-    if (frame && (addr == frame->currentFP)) {
-      frame = frame->previousFrame;
-      // Let this be called from JNI, as in
-      // OpenJDK's JVM_FillInStackTrace:
-      if (frame && frame->currentIP != 0)
+void* StackWalker::getCallerCallFrame() const
+{
+	StackWalker walker(*this);
+	++walker;
+	return walker.getCallFrame();
+}
+
+void StackWalker::operator++() {
+  for (;;) {
+    if (callFrame != thread->baseSP) {
+      assert((callFrame < thread->baseSP) && "Corrupted stack");
+      assert((callFrame < StackWalker::getCallerCallFrameAddress(callFrame)) && "Corrupted stack");
+      if ((frame != NULL) && (callFrame == frame->currentFP)) {
+        assert(frame->currentIP == 0);
+        frame = frame->previousFrame;
+        assert(frame != NULL);
+        assert(frame->currentIP != 0);
+        callFrame = frame->currentFP;
         frame = frame->previousFrame;
-      assert((frame == NULL) || (frame->currentIP == 0));
+      } else {
+        callFrame = StackWalker::getCallerCallFrameAddress(callFrame);
+      }
     }
-  }
-  assert(addr && "No address to start with");
-}
 
+    if (!onlyReportMetadataEnabledFrames) break;
+    StackWalkerState state = getState();
+    if (state == StackWalkerInvalid || state == StackWalkerValidMetadata) break;
+  }
+}
+
+void StackWalker::operator--()
+{
+	// The call stack is a singly-linked list of call frames whose head is the last
+	// called method frame. This means that implementing this feature (getting the
+	// called frame of the current frame) requires rescanning the whole stack from the
+	// beginning (the last called frame), which can be slow in some cases.
+
+	StackWalker caller(*this, true);
+	StackWalker called(caller);
+	++caller;
+
+	for (void* currentAddr = this->getCallFrame();
+		(caller.get() != NULL) && (caller.getCallFrame() != currentAddr);
+		called = caller, ++caller);
+
+	assert((caller.get() != NULL) && "Caller of the current frame not found!");
+	*this = called;
+}
+
+// This code must be a macro because it must be directly called
+//from its caller, with not additional function frames in between.
+#define StackWalker_reset()										\
+{																\
+	if (vmkit::Thread::get() == thread) {						\
+		callFrame = StackWalker_getCallFrameAddress();			\
+		callFrame = StackWalker::getCallerCallFrameAddress(callFrame);	\
+	} else {													\
+		callFrame = thread->waitOnSP();							\
+		if (frame) assert(frame->currentFP >= callFrame);		\
+		if (frame && (callFrame == frame->currentFP)) {			\
+			frame = frame->previousFrame;						\
+			if (frame && frame->currentIP != 0)					\
+				frame = frame->previousFrame;					\
+			assert((frame == NULL) || (frame->currentIP == 0));	\
+		}														\
+	}															\
+	assert(callFrame && "No address to start with");			\
+	if (onlyReportMetadataEnabledFrames) {						\
+		FrameInfo *fi = this->get();							\
+		if ((fi != NULL) && !fi->Metadata) ++(*(this));			\
+	}															\
+}
+
+StackWalker::StackWalker(vmkit::Thread* th, bool only_report_metadata_enabled_frames) :
+	callFrame(0), frame(th->lastKnownFrame), thread(th),
+	onlyReportMetadataEnabledFrames(only_report_metadata_enabled_frames)
+{
+	StackWalker_reset();
+}
+
+StackWalker::StackWalker(const StackWalker& obj, bool reset) :
+	callFrame(obj.callFrame), frame(obj.frame), thread(obj.thread),
+	onlyReportMetadataEnabledFrames(obj.onlyReportMetadataEnabledFrames)
+{
+	if (!reset) return;
+	StackWalker_reset();
+}
+
+void StackWalker::reset()
+{
+	StackWalker_reset();
+}
+
+StackWalker& StackWalker::operator = (const StackWalker& obj)
+{
+	callFrame = obj.callFrame;
+	frame = obj.frame;
+	thread = obj.thread;
+	onlyReportMetadataEnabledFrames = obj.onlyReportMetadataEnabledFrames;
+	return *this;
+}
+
+void* StackWalker::updateReturnAddress(void* newAddr)
+{
+	void** retAddrPtr = StackWalker::getReturnAddressPtrFromCallFrame(callFrame);
+	void* oldRetAddr = *retAddrPtr;
+	*retAddrPtr = newAddr;
+	return oldRetAddr;
+}
+
+void* StackWalker::updateCallerFrameAddress(void* newAddr)
+{
+	void **oldBasePtr = (void**)callFrame;
+	void* oldOldBasePtr = *oldBasePtr;
+
+	for (void* framePtr = callFrame; framePtr != newAddr; framePtr = StackWalker::getCallerCallFrameAddress(framePtr)) {
+		for (KnownFrame *kf = thread->lastKnownFrame, *pkf = NULL; kf != NULL; pkf = kf, kf = kf->previousFrame) {
+			if (kf->currentFP != framePtr) continue;
+
+			if (!pkf)
+				thread->lastKnownFrame = kf->previousFrame;
+			else
+				pkf->previousFrame = kf->previousFrame;
+		}
+	}
+
+	*oldBasePtr = newAddr;
+	return oldOldBasePtr;
+}
+
+void StackWalker::dump() const
+{
+	thread->MyVM->printCallStack(*this);
+}
 
 void Thread::scanStack(word_t closure) {
   StackWalker Walker(this);
   while (FrameInfo* MI = Walker.get()) {
-    MethodInfoHelper::scan(closure, MI, Walker.ip, Walker.addr);
+    MethodInfoHelper::scan(closure, MI, Walker.getReturnAddress(), Walker.getCallFrame());
     ++Walker;
   }
 }
@@ -188,10 +332,10 @@ void Thread::enterUncooperativeCode(uint
     if (!inRV) {
       assert(!lastSP && "SP already set when entering uncooperative code");
       // Get the caller.
-      word_t temp = System::GetCallerAddress();
+      void* temp = StackWalker_getCallFrameAddress();
       // Make sure to at least get the caller of the caller.
       ++level;
-      while (level--) temp = System::GetCallerOfAddress(temp);
+      while (level--) temp = StackWalker::getCallerCallFrameAddress(temp);
       // The cas is not necessary, but it does a memory barrier.
       __sync_bool_compare_and_swap(&lastSP, 0, temp);
       if (doYield) joinRVBeforeEnter();
@@ -200,7 +344,7 @@ void Thread::enterUncooperativeCode(uint
   }
 }
 
-void Thread::enterUncooperativeCode(word_t SP) {
+void Thread::enterUncooperativeCode(void* SP) {
   if (isVmkitThread()) {
     if (!inRV) {
       assert(!lastSP && "SP already set when entering uncooperative code");
@@ -216,7 +360,7 @@ void Thread::leaveUncooperativeCode() {
   if (isVmkitThread()) {
     if (!inRV) {
       assert(lastSP && "No last SP when leaving uncooperative code");
-      word_t savedSP = lastSP;
+      void* savedSP = lastSP;
       // The cas is not necessary, but it does a memory barrier.
       __sync_bool_compare_and_swap(&lastSP, lastSP, 0);
       // A rendezvous has just been initiated, join it.
@@ -226,9 +370,9 @@ void Thread::leaveUncooperativeCode() {
   }
 }
 
-word_t Thread::waitOnSP() {
+void* Thread::waitOnSP() {
   // First see if we can get lastSP directly.
-  word_t sp = lastSP;
+  void* sp = lastSP;
   if (sp) return sp;
   
   // Then loop a fixed number of iterations to get lastSP.
@@ -322,13 +466,14 @@ public:
 StackThreadManager TheStackManager;
 
 extern void sigsegvHandler(int, siginfo_t*, void*);
+//extern void interruptSignalHandler(int signal_number, siginfo_t *info, void *context);
 
 /// internalThreadStart - The initial function called by a thread. Sets some
 /// thread specific data, registers the thread to the GC and calls the
 /// given routine of th.
 ///
 void Thread::internalThreadStart(vmkit::Thread* th) {
-  th->baseSP  = System::GetCallerAddress();
+  th->baseSP  = StackWalker_getCallFrameAddress();
 
   // Set the alternate stack as the second page of the thread's
   // stack.
@@ -339,11 +484,11 @@ void Thread::internalThreadStart(vmkit::
   sigaltstack(&st, NULL);
 
   // Set the SIGSEGV handler to diagnose errors.
-  struct sigaction sa;
-  sigset_t mask;
-  sigfillset(&mask);
+  struct sigaction sa = {};
+//  sigset_t mask;
+//  sigfillset(&mask);
   sa.sa_flags = SA_SIGINFO | SA_ONSTACK;
-  sa.sa_mask = mask;
+//  sa.sa_mask = mask;
   sa.sa_sigaction = sigsegvHandler;
   sigaction(SIGSEGV, &sa, NULL);
   sigaction(SIGBUS, &sa, NULL);
@@ -398,3 +543,47 @@ void Thread::releaseThread(vmkit::Thread
   index = (index & ~TheStackManager.baseAddr) >> 20;
   TheStackManager.used[index] = 0;
 }
+
+isolate_id_t Thread::getValidIsolateID(isolate_id_t isolateID)
+{
+	if (isolateID != CURRENT_ISOLATE) return isolateID;
+	return Thread::get()->getIsolateID();
+}
+
+bool Thread::runsDeadIsolate() const
+{
+	return runningDeadIsolate;
+}
+
+void Thread::markRunningDeadIsolate()
+{
+	runningDeadIsolate = true;
+}
+
+void Thread::setIsolateID(isolate_id_t newIsolateID)
+{
+	isolateID = newIsolateID;
+}
+
+isolate_id_t Thread::getIsolateID() const
+{
+	return isolateID;
+}
+
+bool Thread::isCurrentThread()
+{
+	return (pthread_t)internalThreadID == pthread_self();
+}
+
+void Thread::throwNullPointerException(void* methodIP) const
+{
+	vmkit::FrameInfo* FI = MyVM->IPToFrameInfo(methodIP);
+	if (FI->Metadata == NULL) {
+		fprintf(stderr, "Thread %p received a SIGSEGV: either the VM code or an external\n"
+					"native method is bogus. Aborting...\n", (void*)this);
+		abort();
+	}
+
+	MyVM->nullPointerException();
+	UNREACHABLE();
+}

Modified: vmkit/trunk/lib/vmkit/Compiler/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Compiler/JIT.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/vmkit/Compiler/JIT.cpp Thu Apr 25 11:46:36 2013
@@ -315,6 +315,7 @@ void BaseIntrinsics::init(llvm::Module*
   constantPtrZero = ConstantInt::get(pointerSizeType, 0);
 
   constantPtrNull = Constant::getNullValue(ptrType); 
+  constantPtr32Null = Constant::getNullValue(ptr32Type);
   constantPtrLogSize = 
     ConstantInt::get(Type::getInt32Ty(Context), kWordSizeLog2);
   arrayPtrType = PointerType::getUnqual(ArrayType::get(Type::getInt8Ty(Context), 0));
@@ -405,10 +406,10 @@ Frames* VmkitModule::addToVM(VirtualMach
     frame->FrameSize = FI->getFrameSize();
     frame->Metadata = meta;
     frame->SourceIndex = I->Loc.getLine();
-    frame->ReturnAddress = JCE->getLabelAddress(I->Label);
-    // If the safe point is fro an NPE, increment the return address to
+    frame->ReturnAddress = (void*)JCE->getLabelAddress(I->Label);
+    // If the safe point is from an NPE, increment the return address to
     // not clash with post calls.
-    if (I->Loc.getCol() == 1) frame->ReturnAddress += 1;
+    if (I->Loc.getCol() == 1) frame->ReturnAddress = (void*)((uintptr_t)frame->ReturnAddress + 1);
     int i = 0;
     for (llvm::GCFunctionInfo::live_iterator KI = FI->live_begin(I),
          KE = FI->live_end(I); KI != KE; ++KI) {

Modified: vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll (original)
+++ vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll Thu Apr 25 11:46:36 2013
@@ -70,7 +70,9 @@ declare void @fieldWriteBarrier(i8*, i8*
 declare void @nonHeapWriteBarrier(i8**, i8*)
 
 
+; ExceptionBuffer. A size of 0 means an undefined size.
+%ExceptionBuffer = type {i8*, i32, %ExceptionBuffer*, [0 x i8]}
 
 declare i32 @_setjmp(i8*) nounwind
-declare void @registerSetjmp(i8*) nounwind
-declare void @unregisterSetjmp(i8*) nounwind
+declare void @registerSetjmp(%ExceptionBuffer*) nounwind
+declare void @unregisterSetjmp(%ExceptionBuffer*) nounwind

Modified: vmkit/trunk/lib/vmkit/Runtime/MethodInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Runtime/MethodInfo.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Runtime/MethodInfo.cpp (original)
+++ vmkit/trunk/lib/vmkit/Runtime/MethodInfo.cpp Thu Apr 25 11:46:36 2013
@@ -19,25 +19,25 @@
 
 namespace vmkit {
 
-void MethodInfoHelper::scan(word_t closure, FrameInfo* FI, word_t ip, word_t addr) {
-  //word_t spaddr = (word_t)addr + FI->FrameSize + sizeof(void*);
-  word_t spaddr = System::GetCallerOfAddress(addr);
+void MethodInfoHelper::scan(word_t closure, FrameInfo* FI, void* ip, void* callFrame) {
+  //void* spaddr = (void*)((intptr_t)callFrame + FI->FrameSize + sizeof(void*));
+  void* spaddr = StackWalker::getCallerCallFrameAddress(callFrame);
   for (uint16 i = 0; i < FI->NumLiveOffsets; ++i) {
-    word_t obj = *(word_t*)(spaddr + FI->LiveOffsets[i]);    
+	  void* obj = *(void**)((intptr_t)spaddr + FI->LiveOffsets[i]);
     // Verify that obj does not come from a JSR bytecode.
-    if (!(obj & 1)) {
-      Collector::scanObject((void**)(spaddr + FI->LiveOffsets[i]), closure);
+    if (!((uintptr_t)obj & 1)) {
+      Collector::scanObject((void**)((intptr_t)spaddr + FI->LiveOffsets[i]), closure);
     }
   }
 }
 
-void MethodInfoHelper::print(word_t ip, word_t addr) {
+void MethodInfoHelper::print(void* ip, void* callFrame) {
   Dl_info info;
-  int res = dladdr((void*)ip, &info);
+  int res = dladdr(ip, &info);
   if (res != 0 && info.dli_sname != NULL) {
-    fprintf(stderr, "; %p (%p) in %s\n",  (void*)ip, (void*)addr, info.dli_sname);
+    fprintf(stderr, "; %p (%p) in %s\n",  ip, callFrame, info.dli_sname);
   } else {
-    fprintf(stderr, "; %p in Unknown method\n", (void*)ip);
+    fprintf(stderr, "; %p in Unknown method\n", ip);
   }
 }
 
@@ -71,9 +71,9 @@ FunctionMap::FunctionMap(BumpPtrAllocato
 // Create a dummy FrameInfo, so that methods don't have to null check.
 static FrameInfo emptyInfo;
 
-FrameInfo* FunctionMap::IPToFrameInfo(word_t ip) {
+FrameInfo* FunctionMap::IPToFrameInfo(void* ip) {
   FunctionMapLock.acquire();
-  llvm::DenseMap<word_t, FrameInfo*>::iterator I = Functions.find(ip);
+  llvm::DenseMap<void*, FrameInfo*>::iterator I = Functions.find(ip);
   FrameInfo* res = NULL;
   if (I != Functions.end()) {
     res = I->second;
@@ -87,7 +87,7 @@ FrameInfo* FunctionMap::IPToFrameInfo(wo
 }
 
 
-void FunctionMap::addFrameInfo(word_t ip, FrameInfo* meth) {
+void FunctionMap::addFrameInfo(void* ip, FrameInfo* meth) {
   FunctionMapLock.acquire();
   addFrameInfoNoLock(ip, meth);
   FunctionMapLock.release();

Modified: vmkit/trunk/lib/vmkit/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Runtime/Object.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/vmkit/Runtime/Object.cpp Thu Apr 25 11:46:36 2013
@@ -39,11 +39,13 @@ extern "C" void EmptyDestructor() {
 }
 
 extern "C" void registerSetjmp(ExceptionBuffer* buffer) {
-  buffer->init();
+	void* callFrame = StackWalker_getCallFrameAddress();
+	void* retAddr = StackWalker::getReturnAddressFromCallFrame(callFrame);
+	buffer->addToThreadExceptionList(retAddr);
 }
 
 extern "C" void unregisterSetjmp(ExceptionBuffer* buffer) {
-  buffer->remove();
+  buffer->removeFromThreadExceptionList();
 }
 
 void VirtualMachine::waitForExit() {   

Modified: vmkit/trunk/lib/vmkit/Runtime/UTF8.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Runtime/UTF8.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Runtime/UTF8.cpp (original)
+++ vmkit/trunk/lib/vmkit/Runtime/UTF8.cpp Thu Apr 25 11:46:36 2013
@@ -39,6 +39,32 @@ uint32 UTF8::readerHasher(const uint16*
   return (r1 & 255) + ((r0 & 255) << 8);
 }
 
+std::string UTF8::toString() const
+{
+	std::string contents;
+	contents.resize(size);
+
+	for (ssize_t i = 0; i < size; ++i)
+		contents[i] = (std::string::value_type)(elements[i]);
+
+	return contents;
+}
+
+int UTF8::compare(const char *s) const
+{
+	int len = strlen(s);
+	int diff = size - len;
+	if (diff != 0) return diff;
+
+	for (int i = 0; (i < size) && (diff == 0); ++i)
+		diff = (char)(elements[i]) - s[i];
+	return diff;
+}
+
+void UTF8::dump() const
+{
+	std::cout << (const void *)this << ": " << toString() << std::endl;
+}
 
 const UTF8* UTF8Map::lookupOrCreateAsciiz(const char* asciiz) {
   sint32 size = strlen(asciiz);

Modified: vmkit/trunk/mmtk/java/build.xml.in
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/java/build.xml.in?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/mmtk/java/build.xml.in (original)
+++ vmkit/trunk/mmtk/java/build.xml.in Thu Apr 25 11:46:36 2013
@@ -1,7 +1,7 @@
 <project name="MMTK-VMKit" default="main" basedir=".">
   <target name="main">
     <mkdir dir="classes"/>
-    <javac srcdir="@abs_top_srcdir@/mmtk/java/src:./src" destdir="classes" source="1.5"/>
+    <javac srcdir="@abs_top_srcdir@/mmtk/java/src" destdir="classes" source="1.5" includeantruntime="false"/>
     <jar jarfile="mmtk-vmkit.jar">
       <fileset dir="classes"/>
     </jar>

Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Thu Apr 25 11:46:36 2013
@@ -113,6 +113,8 @@ void Collector::scanObject(void** ptr, w
   if ((*ptr) != NULL) {
     assert(((gc*)(*ptr))->getVirtualTable());
   }
+  if (vmkit::Thread::get()->MyVM->resetDeadIsolateReference(NULL, ptr))
+	  return;
   JnJVM_org_j3_bindings_Bindings_reportDelayedRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2(closure, ptr);
 }
  
@@ -122,6 +124,8 @@ void Collector::markAndTrace(void* sourc
     assert(((gc*)(*ptr_))->getVirtualTable());
   }
   if ((*(void**)ptr) != NULL) assert(((gc*)(*(void**)ptr))->getVirtualTable());
+  if (vmkit::Thread::get()->MyVM->resetDeadIsolateReference(source, ptr_))
+	  return;
   JnJVM_org_j3_bindings_Bindings_processEdge__Lorg_mmtk_plan_TransitiveClosure_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2(closure, source, ptr);
 }
   
@@ -130,6 +134,8 @@ void Collector::markAndTraceRoot(void* p
   if ((*ptr_) != NULL) {
     assert(((gc*)(*ptr_))->getVirtualTable());
   }
+  if (vmkit::Thread::get()->MyVM->resetDeadIsolateReference(NULL, ptr_))
+	  return;
   JnJVM_org_j3_bindings_Bindings_processRootEdge__Lorg_mmtk_plan_TraceLocal_2Lorg_vmmagic_unboxed_Address_2Z(closure, ptr, true);
 }
 

Modified: vmkit/trunk/mmtk/mmtk-j3/Collection.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/Collection.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/Collection.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/Collection.cpp Thu Apr 25 11:46:36 2013
@@ -41,6 +41,7 @@ extern "C" void Java_org_j3_mmtk_Collect
 
     JnJVM_org_j3_bindings_Bindings_collect__I(why);
 
+    th->MyVM->endCollectionBeforeUnblockingThreads();
     th->MyVM->rendezvous.finishRV();
     th->MyVM->endCollection();
   }

Added: vmkit/trunk/tests/debug.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/debug.txt?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/debug.txt (added)
+++ vmkit/trunk/tests/debug.txt Thu Apr 25 11:46:36 2013
@@ -0,0 +1,30 @@
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.StaticExposer_1.0.0.jar
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.StaticClient_1.0.0.jar
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.StaticClient_1.0.1.jar
+start 10 11 12
+
+
+stop 10 11 12
+
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.StaticExposer_1.0.0.jar
+start 10
+stop 10
+framework uninstall 10
+framework meminfo -gc
+framework meminfo -gc
+
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.looper_1.0.0.jar
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.tier_1.0.0.jar
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.loopClient_1.0.0.jar
+install file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.isolateKiller_1.0.0.jar
+start 10 11 12
+
+framework call ijvm.isolate.isolatemanager.IsolateManager killBundles ijvm.tests.tier ijvm.tests.looper
+
+framework call ijvm.isolate.isolatemanager.IsolateManager killBundle ijvm.tests.looper
+
+framework call ijvm.isolate.isolatemanager.IsolateManager killBundle ijvm.tests.tierImpl
+
+framework call ijvm.tests.looper.LoopController cancelLoop
+
+framework meminfo -gc

Added: vmkit/trunk/tests/i-jvm-log.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/i-jvm-log.txt?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/i-jvm-log.txt (added)
+++ vmkit/trunk/tests/i-jvm-log.txt Thu Apr 25 11:46:36 2013
@@ -0,0 +1,129 @@
+I-JVM
+
+==============================================================================
+Direct access to static string:
+==============================================================================
+
+INFO[2:21:22.804 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:21:22.805 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:21:22.805 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:21:23.432 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:21:23.432 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:21:23.433 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:21:23.806 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:21:23.806 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:21:23.807 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:21:24.433 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:21:24.434 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:21:24.434 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+
+==============================================================================
+Access to static string through a getter function:
+==============================================================================
+
+INFO[2:42:21.715 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:21.987 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:21.988 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:21.988 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:22.989 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:22.990 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:22.990 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:23.990 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:23.991 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:23.991 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:24.991 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:24.992 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:24.992 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:25.992 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:25.993 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:25.993 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:26.993 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:26.993 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:26.994 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:27.994 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:27.995 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:27.995 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:28.996 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:28.996 @ 9befe00 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:28.996 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:42:29.996 @ 9bef100 vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:42:29.997 @ 9bef100 vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:42:29.997 @ 9befe00 vmkit.tests.staticstringclient.Activator.sync] |*|
+
+==============================================================================
+Direct and getter-based access to static object (Integer):
+==============================================================================
+
+INFO[17:57:28.139 @ 9bb8240 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:28.744 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:28.744 @ 9bb8c40 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:28.776 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 362
+INFO[17:57:29.776 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:29.776 @ 9bb8240 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:29.777 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 116
+INFO[17:57:30.777 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:30.777 @ 9bb8c40 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:30.777 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 362
+INFO[17:57:31.778 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:31.778 @ 9bb8240 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:31.778 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 116
+INFO[17:57:32.778 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:32.779 @ 9bb8c40 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:32.779 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 362
+INFO[17:57:33.779 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:33.779 @ 9bb8240 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:33.779 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 116
+INFO[17:57:34.780 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:34.780 @ 9bb8c40 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:34.780 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 362
+INFO[17:57:35.780 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:35.781 @ 9bb8240 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:35.781 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 116
+INFO[17:57:36.781 @ 9bb8c40 vmkit.tests.staticclient.Activator.sync2] |>>
+INFO[17:57:36.781 @ 9bb8c40 vmkit.tests.staticclient.Activator.run] >>|
+INFO[17:57:36.781 @ 9bb8240 vmkit.tests.staticclient.Activator.sync2] |*| r = 59, m = 362
+
+==============================================================================
+Forced isolate termination:
+==============================================================================
+
+INFO[17:59:55.807 @ b5bab9e4 ijvm.tests.isolatekiller.Activator.killTheIsolate] Killed TierService bundle.
+INFO[17:59:55.808 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+
+Exception in thread "Tier worker" java.lang.InterruptedException
+   at ijvm.tests.tier.Activator.run(Activator.java:68)
+   at java.lang.Thread.run(Thread.java:743)
+   at java.lang.VMThread.run(VMThread.java:120)
+
+INFO[17:59:58.809 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+INFO[18:0:1.810 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+INFO[18:0:4.810 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+INFO[18:0:7.811 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+INFO[18:0:10.811 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+INFO[18:0:13.812 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Still looping...
+INFO[18:0:15.809 @ b5bab9e4 ijvm.tests.isolatekiller.Activator.killTheIsolate] Cancelling LoopController loop...
+INFO[18:0:15.830 @ b5bab9e4 ijvm.tests.looper.LoopControllerImpl.cancelLoop] Cancel looping
+INFO[18:0:15.830 @ b5bab9e4 ijvm.tests.isolatekiller.Activator.killTheIsolate] Cancelled LoopController loop.
+INFO[18:0:16.813 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.loop] Done looping
+
+INFO[18:0:19.454 @ 9bd7e20 ijvm.tests.looper.LoopControllerImpl.callMeBack] ijvm.tests.looper.LoopControllerImpl.callMeBack
+java.lang.InterruptedException
+   at ijvm.tests.tier.TierServiceImpl.callBack(TierServiceImpl.java:57)
+   at ijvm.tests.looper.LoopControllerImpl.callMeBack(LoopControllerImpl.java:38)
+   at ijvm.tests.tier.TierServiceImpl.beforeLeaving(TierServiceImpl.java:47)
+   at ijvm.tests.tier.TierServiceImpl.thenAnotherThing(TierServiceImpl.java:35)
+   at ijvm.tests.tier.TierServiceImpl.doSomething(TierServiceImpl.java:23)
+   at ijvm.tests.loopclient.Activator.run(Activator.java:54)
+   at java.lang.Thread.run(Thread.java:743)
+   at java.lang.VMThread.run(VMThread.java:120)
+
+INFO[18:0:21.548 @ 9bd7e20 ijvm.tests.loopclient.Activator.run] ijvm.tests.loopclient.Activator.run
+java.lang.InterruptedException
+   at ijvm.tests.tier.TierServiceImpl.beforeLeaving(TierServiceImpl.java:47)
+   at ijvm.tests.tier.TierServiceImpl.thenAnotherThing(TierServiceImpl.java:35)
+   at ijvm.tests.tier.TierServiceImpl.doSomething(TierServiceImpl.java:23)
+   at ijvm.tests.loopclient.Activator.run(Activator.java:54)
+   at java.lang.Thread.run(Thread.java:743)
+   at java.lang.VMThread.run(VMThread.java:120)
+
+INFO[18:0:21.549 @ 9bd7e20 ijvm.tests.loopclient.Activator.run] Loop client done.

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/.classpath (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/.project (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.isolate.IsolateManager</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: IsolateManager
+Bundle-SymbolicName: ijvm.isolate.IsolateManager;singleton:=true
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.isolate.IsolateManagerActivator
+Import-Package: org.osgi.framework;version="1.3.0",
+ org.osgi.service.packageadmin;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-Vendor: Koutheir Attouchi
+Export-Package: ijvm.isolate.isolatemanager

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/build.properties (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerActivator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerActivator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerActivator.java (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerActivator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,40 @@
+package ijvm.isolate;
+
+
+import ijvm.isolate.isolatemanager.IsolateManager;
+import ijvm.isolate.util.IsolateLogger;
+
+import java.util.Hashtable;
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class IsolateManagerActivator
+	implements BundleActivator
+{
+	private Logger log;
+	private IsolateManagerImpl serviceImpl;
+	
+	public void start(BundleContext context) throws Exception
+	{
+		log = IsolateLogger.createLogger(IsolateManagerActivator.class.getName());
+		log.info("STARTING");
+		
+		// Create the service implementation
+		serviceImpl = new IsolateManagerImpl(log);
+		serviceImpl.open(context);
+		
+		// Register the service
+		context.registerService(IsolateManager.class.getName(), serviceImpl, new Hashtable());
+	}
+	
+	public void stop(BundleContext context) throws Exception
+	{
+		serviceImpl.close();
+		serviceImpl = null;
+		
+		log.info("DONE");
+		log = null;
+	}
+}

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerImpl.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerImpl.java (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/IsolateManagerImpl.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,167 @@
+package ijvm.isolate;
+
+import ijvm.isolate.isolatemanager.IsolateManager;
+import ijvm.isolate.vm.IJVM;
+
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Version;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+
+class IsolateManagerImpl
+	implements IsolateManager, FrameworkListener
+{
+	private Logger log;
+	private BundleContext context;
+	private List isolatesToKill;
+
+	public IsolateManagerImpl(Logger log)
+	{
+		this.log = log;
+		isolatesToKill = new ArrayList();
+	}
+
+	public void open(BundleContext context)
+	{
+		this.context = context;
+		// We need to know when packages are refreshed
+		context.addFrameworkListener(this);
+	}
+
+	public void close()
+	{
+		context.removeFrameworkListener(this);
+	}
+	
+	Bundle getBundle(String symbolicName)
+	{
+		Bundle[] bundles = context.getBundles();
+		for (int i=0; i < bundles.length; ++i) {
+			if (symbolicName.equals(bundles[i].getSymbolicName()))
+				return bundles[i];
+		}
+		return null;
+	}
+	
+	public void killBundle(String bundleName) throws Exception
+	{
+		log.info("Killing bundle: " + bundleName);
+		killBundles(new Bundle[] {getBundle(bundleName)});
+		log.info("Killed bundle.");
+	}
+	
+	public void killBundles(String bundleName1, String bundleName2) throws Exception
+	{
+		log.info("Killing bundles: " + bundleName1 + ", " + bundleName2);
+		killBundles(new Bundle[] {getBundle(bundleName1), getBundle(bundleName2)});
+		log.info("Killed bundles.");
+	}
+
+	public void killBundles(Bundle[] bundles) throws Exception
+	{
+		// We kill bundles asynchronously
+		final Object intializedLock = new Object();
+		final Bundle[] theBundles = bundles;
+		
+		Thread worker = new Thread(new Runnable() {
+			public void run()
+			{
+				try {
+					killBundlesThread(intializedLock, theBundles);
+				} catch (Exception e) {
+					log.info(IsolateManagerImpl.class.getName() + ".killBundles");
+					e.printStackTrace();
+				}
+			}
+		}, "Bundles killer");
+		worker.start();
+		
+		synchronized (intializedLock) {
+			intializedLock.wait();
+		}
+		// At this point, we are sure the bundle execution is denied
+	}
+
+	void killBundlesThread(final Object intializedLock, final Bundle[] bundles) throws Exception
+	{
+		synchronized (isolatesToKill) {
+			while (!isolatesToKill.isEmpty()) {
+				log.info("Previous killBundles operation pending...");
+				isolatesToKill.wait(4000);
+			}
+		}
+
+		long[] isolateID = new long[bundles.length];
+		for (int i = 0; i < bundles.length; ++i) {
+			String activatorClassName = (String)bundles[i].getHeaders().get("Bundle-Activator");
+			Object activatorObject = bundles[i].loadClass(activatorClassName).newInstance();
+			isolateID[i] = IJVM.getObjectIsolateID(activatorObject);
+			activatorObject = null;
+		}
+		
+		// Disable bundle execution
+		log.info("Denying bundles execution...");
+		IJVM.disableIsolates(isolateID, true, false);
+		
+		synchronized (intializedLock) {	// Enable caller to continue
+			intializedLock.notify();
+		}
+		
+		// Stop and uninstall the bundles
+		// NOTE: As the bundle Activator.stop() method is specially patched to return directly
+		// without doing anything, we can call it.
+		log.info("Stopping and uninstalling bundles...");
+		for (int i = 0; i < bundles.length; ++i) {
+			bundles[i].stop();
+			bundles[i].uninstall();
+		}
+
+		synchronized (isolatesToKill) {
+			for (int i = 0; i < bundles.length; ++i)
+				isolatesToKill.add(i, new Long(isolateID[i]));
+			
+			isolatesToKill.notifyAll();
+		}
+		
+		log.info("Refreshing framework...");
+		ServiceReference pkgAdminRef = context.getServiceReference("org.osgi.service.packageadmin.PackageAdmin");
+		PackageAdmin pkgAdmin = (PackageAdmin)context.getService(pkgAdminRef);
+		pkgAdmin.refreshPackages(bundles);
+	}
+	
+	public void frameworkEvent(FrameworkEvent event)
+	{
+		if (event.getType() != FrameworkEvent.PACKAGES_REFRESHED) return;
+
+		log.info("Framework refreshed.");
+		
+		long[] isolateID = null;
+		
+		synchronized (isolatesToKill) {
+			int isolateCount = isolatesToKill.size();
+			if (isolateCount > 0) {
+				isolateID = new long[isolateCount];
+				for (int i = 0; i < isolateCount; ++i)
+					isolateID[i] = ((Long)isolatesToKill.get(i)).longValue();
+				
+				isolatesToKill.clear();
+				isolatesToKill.notifyAll();
+			}
+		}
+		
+		if (isolateID == null) return;
+
+		log.info("Resetting isolate references...");
+		IJVM.disableIsolates(isolateID, true, true);
+	}
+}

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/isolatemanager/IsolateManager.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/isolatemanager/IsolateManager.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/isolatemanager/IsolateManager.java (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/isolatemanager/IsolateManager.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,11 @@
+package ijvm.isolate.isolatemanager;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Version;
+
+public interface IsolateManager
+{
+	public void killBundles(Bundle[] bundles) throws Exception;
+	public void killBundles(String bundleName1, String bundleName2) throws Exception;
+	public void killBundle(String bundleName) throws Exception;
+}

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/util/IsolateLogger.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/util/IsolateLogger.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/util/IsolateLogger.java (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/util/IsolateLogger.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,47 @@
+package ijvm.isolate.util;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+public class IsolateLogger
+	extends java.util.logging.Formatter
+{
+	public static Logger createLogger(String className)
+	{
+		Logger log = Logger.getAnonymousLogger();
+		
+		Handler logConsoleHandler = new ConsoleHandler();
+		logConsoleHandler.setFormatter(new IsolateLogger());
+		log.addHandler(logConsoleHandler);
+		
+		log.setUseParentHandlers(false);
+		log.setLevel(Level.INFO);
+		return log;
+	}
+	
+	public String format(LogRecord record)
+	{
+		Calendar cal = GregorianCalendar.getInstance();
+		cal.setTime(new Date(record.getMillis()));
+		String logTime = cal.get(Calendar.HOUR_OF_DAY) + ":" +
+			cal.get(Calendar.MINUTE) + ":" +
+			cal.get(Calendar.SECOND) + "." +
+			cal.get(Calendar.MILLISECOND);
+		
+		StringBuffer str = new StringBuffer(256);
+		str.append(record.getLevel().getName() +
+			"[" + logTime +
+			" @ " + Integer.toHexString(record.getThreadID()) + " " +
+			record.getSourceClassName() + "." + record.getSourceMethodName() + "] " +
+			record.getMessage() + "\n"
+			);
+		
+		return str.toString();
+	}
+}

Added: vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/vm/IJVM.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/vm/IJVM.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/vm/IJVM.java (added)
+++ vmkit/trunk/tests/ijvm.isolate.IsolateManager/src/ijvm/isolate/vm/IJVM.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,9 @@
+package ijvm.isolate.vm;
+
+import java.util.ArrayList;
+
+public class IJVM
+{
+	public static native int getObjectIsolateID(Object object);
+	public static native void disableIsolates(long[] isolateID, boolean denyIsolateExecution, boolean resetIsolateReferences);
+}

Added: vmkit/trunk/tests/ijvm.tests.StaticClient/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticClient/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticClient/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticClient/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.StaticClient/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticClient/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticClient/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticClient/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.StaticClient</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.StaticClient/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticClient/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticClient/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticClient/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: StaticClient
+Bundle-SymbolicName: ijvm.tests.StaticClient
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.staticclient.Activator
+Import-Package: ijvm.tests.staticexposer,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4

Added: vmkit/trunk/tests/ijvm.tests.StaticClient/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticClient/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticClient/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticClient/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/logging/InlineFormatter.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/logging/InlineFormatter.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/logging/InlineFormatter.java (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/logging/InlineFormatter.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,41 @@
+package ijvm.tests.logging;
+
+import java.util.*;
+import java.util.logging.*;
+
+public class InlineFormatter
+	extends java.util.logging.Formatter
+{
+	public static Logger createLogger(String className)
+	{
+		Logger log = Logger.getAnonymousLogger();
+		
+		Handler logConsoleHandler = new ConsoleHandler();
+		logConsoleHandler.setFormatter(new InlineFormatter());
+		log.addHandler(logConsoleHandler);
+		
+		log.setUseParentHandlers(false);
+		log.setLevel(Level.INFO);
+		return log;
+	}
+	
+	public String format(LogRecord record)
+	{
+		Calendar cal = GregorianCalendar.getInstance();
+		cal.setTime(new Date(record.getMillis()));
+		String logTime = cal.get(Calendar.HOUR_OF_DAY) + ":" +
+			cal.get(Calendar.MINUTE) + ":" +
+			cal.get(Calendar.SECOND) + "." +
+			cal.get(Calendar.MILLISECOND);
+		
+		StringBuffer str = new StringBuffer(256);
+		str.append(record.getLevel().getName() +
+			"[" + logTime +
+			" @ " + Integer.toHexString(record.getThreadID()) + " " +
+			record.getSourceClassName() + "." + record.getSourceMethodName() + "] " +
+			record.getMessage() + "\n"
+			);
+		
+		return str.toString();
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/staticclient/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/staticclient/Activator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/staticclient/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticClient/src/ijvm/tests/staticclient/Activator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,93 @@
+package ijvm.tests.staticclient;
+
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+import ijvm.tests.logging.InlineFormatter;
+import ijvm.tests.staticexposer.StaticExposer;
+
+
+public class Activator
+	implements BundleActivator, Runnable
+{
+	private StaticExposer service;
+	private ServiceTracker serviceTracker;
+	private Thread thread;
+	boolean stopThread;
+	Logger log;
+	
+	public void start(BundleContext context) throws Exception
+	{
+		log = InlineFormatter.createLogger(Activator.class.getName());
+		log.info("STARTING");
+		
+		serviceTracker = new ServiceTracker(context, StaticExposer.class.getName(), null);
+		serviceTracker.open();
+		service = (StaticExposer)serviceTracker.getService();
+
+		stopThread = false;
+		thread = new Thread(this, "Sync Client");
+		thread.start();
+	}
+	
+	public void stop(BundleContext context) throws Exception
+	{
+		stopThread = true;
+		thread.join();
+		thread = null;
+		
+		serviceTracker.close();
+		serviceTracker = null;
+		
+		log.info("DONE");
+		log = null;
+	}
+	
+	public void run()
+	{
+		try {
+			while (!stopThread) {
+				log.info(">>|");
+//				sync1();
+				sync2();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void sync1() throws InterruptedException
+	{
+//		synchronized(service.theStaticString) {
+		synchronized(service.getStaticString()) {
+			log.info("|*|");
+			Thread.sleep(1000);
+			log.info("|>>");
+		}				
+	}
+
+	private void sync2() throws InterruptedException
+	{
+		synchronized(service.getStaticInteger()) {
+			int r = xync3();
+			int m = xync4();
+			
+			log.info("|*| r = " + r + ", m = " + m);
+			Thread.sleep(1000);
+			log.info("|>>");
+		}				
+	}
+	
+	private int xync3()
+	{
+		return service.getStaticInteger().intValue();
+	}
+	
+	private int xync4()
+	{
+		return service.theStaticInteger.intValue();
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.StaticExposer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: StaticExposer
+Bundle-SymbolicName: ijvm.tests.StaticExposer
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.staticexposer.Activator
+Import-Package: org.osgi.framework;version="1.3.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Export-Package: ijvm.tests.staticexposer;uses:="org.osgi.framework"

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/Activator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/Activator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,25 @@
+package ijvm.tests.staticexposer;
+
+import java.util.Hashtable;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator
+	implements BundleActivator
+{
+	private StaticExposer service;
+	
+	public void start(BundleContext context) throws Exception
+	{
+		service = new StaticExposerImpl();
+		
+		Hashtable properties = new Hashtable();
+		context.registerService(StaticExposer.class.getName(), service, properties);
+	}
+
+	public void stop(BundleContext context) throws Exception
+	{
+		service = null;
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposer.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposer.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposer.java (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposer.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,10 @@
+package ijvm.tests.staticexposer;
+
+public interface StaticExposer
+{
+	public String theStaticString = "Hello World Two";
+	public Integer theStaticInteger = new Integer((int)(Math.random() * 1000.0));
+	
+	public String getStaticString();
+	public Integer getStaticInteger();
+}

Added: vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposerImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposerImpl.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposerImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.StaticExposer/src/ijvm/tests/staticexposer/StaticExposerImpl.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,15 @@
+package ijvm.tests.staticexposer;
+
+public class StaticExposerImpl
+	implements StaticExposer
+{
+	public String getStaticString()
+	{
+		return theStaticString;
+	}
+
+	public Integer getStaticInteger()
+	{
+		return theStaticInteger;
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.loopClient/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.loopClient/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.loopClient/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.loopClient/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.loopClient/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.loopClient/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.loopClient/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.loopClient/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.loopClient</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.loopClient/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.loopClient/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.loopClient/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.loopClient/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: LoopClient
+Bundle-SymbolicName: ijvm.tests.loopClient
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.loopclient.Activator
+Import-Package: ijvm.tests.tier,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4

Added: vmkit/trunk/tests/ijvm.tests.loopClient/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.loopClient/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.loopClient/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.loopClient/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/logging/InlineFormatter.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/logging/InlineFormatter.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/logging/InlineFormatter.java (added)
+++ vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/logging/InlineFormatter.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,41 @@
+package ijvm.tests.logging;
+
+import java.util.*;
+import java.util.logging.*;
+
+public class InlineFormatter
+	extends java.util.logging.Formatter
+{
+	public static Logger createLogger(String className)
+	{
+		Logger log = Logger.getAnonymousLogger();
+		
+		Handler logConsoleHandler = new ConsoleHandler();
+		logConsoleHandler.setFormatter(new InlineFormatter());
+		log.addHandler(logConsoleHandler);
+		
+		log.setUseParentHandlers(false);
+		log.setLevel(Level.INFO);
+		return log;
+	}
+	
+	public String format(LogRecord record)
+	{
+		Calendar cal = GregorianCalendar.getInstance();
+		cal.setTime(new Date(record.getMillis()));
+		String logTime = cal.get(Calendar.HOUR_OF_DAY) + ":" +
+			cal.get(Calendar.MINUTE) + ":" +
+			cal.get(Calendar.SECOND) + "." +
+			cal.get(Calendar.MILLISECOND);
+		
+		StringBuffer str = new StringBuffer(256);
+		str.append(record.getLevel().getName() +
+			"[" + logTime +
+			" @ " + Integer.toHexString(record.getThreadID()) + " " +
+			record.getSourceClassName() + "." + record.getSourceMethodName() + "] " +
+			record.getMessage() + "\n"
+			);
+		
+		return str.toString();
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/loopclient/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/loopclient/Activator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/loopclient/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.loopClient/src/ijvm/tests/loopclient/Activator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,101 @@
+package ijvm.tests.loopclient;
+
+import java.util.ArrayList;
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+
+import ijvm.tests.logging.InlineFormatter;
+import ijvm.tests.tier.TierService;
+import ijvm.tests.tier.Utility;
+
+public class Activator
+	implements BundleActivator, ServiceListener, Runnable
+{
+	private BundleContext context;
+	private Logger log;
+	
+	private ServiceTracker serviceTracker;
+	private TierService service;
+	
+	private Thread thread;
+	private ArrayList utilArray;
+
+	public void start(BundleContext context) throws Exception
+	{
+		this.context = context;
+		log = InlineFormatter.createLogger(Activator.class.getName());
+		log.info("STARTING");
+		
+		serviceTracker = new ServiceTracker(context, TierService.class.getName(), null);
+		serviceTracker.open();
+		service = (TierService)serviceTracker.getService();
+		context.addServiceListener(this, "(objectclass=" + TierService.class.getName() + ")");
+		
+		thread = new Thread(this, "Loop Client");
+		thread.start();
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		log.info("Stopping...");
+
+		this.context = null;
+		
+		thread.join();
+		thread = null;
+
+		serviceTracker.close();
+		serviceTracker = null;
+		service = null;
+
+		log.info("DONE");
+		log = null;
+	}
+
+	public void serviceChanged(ServiceEvent event)
+	{
+		Object serviceObj = context.getService(event.getServiceReference());
+		
+		switch(event.getType()) {
+		case ServiceEvent.REGISTERED:
+			if (TierService.class.isInstance(serviceObj))
+				service = (TierService)serviceObj;
+			break;
+			
+		case ServiceEvent.UNREGISTERING:
+			if (TierService.class.isInstance(serviceObj))
+				service = null;
+			break;
+		}
+	}
+
+	public void run()
+	{
+		log.info("Loop client running...");
+		
+		utilArray = new ArrayList(1);
+		utilArray.add(
+			service.getSomething());
+		
+		try {			
+			service.doSomething();
+		} catch (Exception e) {
+			log.info(Activator.class.getName() + ".run");
+			e.printStackTrace();
+		}
+
+		try {
+			((Utility)utilArray.get(0)).getSomething();
+		} catch (Exception e) {
+			log.info(Activator.class.getName() + ".run");
+			e.printStackTrace();
+		}
+
+		log.info("Loop client done.");
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.looper/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.looper/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.looper</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.looper/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Looper
+Bundle-SymbolicName: ijvm.tests.looper
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.looper.Activator
+Import-Package: org.osgi.framework;version="1.3.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Export-Package: ijvm.tests.looper

Added: vmkit/trunk/tests/ijvm.tests.looper/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/logging/InlineFormatter.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/logging/InlineFormatter.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/logging/InlineFormatter.java (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/logging/InlineFormatter.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,41 @@
+package ijvm.tests.logging;
+
+import java.util.*;
+import java.util.logging.*;
+
+public class InlineFormatter
+	extends java.util.logging.Formatter
+{
+	public static Logger createLogger(String className)
+	{
+		Logger log = Logger.getAnonymousLogger();
+		
+		Handler logConsoleHandler = new ConsoleHandler();
+		logConsoleHandler.setFormatter(new InlineFormatter());
+		log.addHandler(logConsoleHandler);
+		
+		log.setUseParentHandlers(false);
+		log.setLevel(Level.INFO);
+		return log;
+	}
+	
+	public String format(LogRecord record)
+	{
+		Calendar cal = GregorianCalendar.getInstance();
+		cal.setTime(new Date(record.getMillis()));
+		String logTime = cal.get(Calendar.HOUR_OF_DAY) + ":" +
+			cal.get(Calendar.MINUTE) + ":" +
+			cal.get(Calendar.SECOND) + "." +
+			cal.get(Calendar.MILLISECOND);
+		
+		StringBuffer str = new StringBuffer(256);
+		str.append(record.getLevel().getName() +
+			"[" + logTime +
+			" @ " + Integer.toHexString(record.getThreadID()) + " " +
+			record.getSourceClassName() + "." + record.getSourceMethodName() + "] " +
+			record.getMessage() + "\n"
+			);
+		
+		return str.toString();
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/Activator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/Activator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,39 @@
+package ijvm.tests.looper;
+
+import ijvm.tests.logging.InlineFormatter;
+
+import java.util.Hashtable;
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+
+
+public class Activator
+	implements BundleActivator
+{
+	private Logger log;
+	private LoopController service;
+	
+	public void start(BundleContext context) throws Exception
+	{
+		log = InlineFormatter.createLogger(Activator.class.getName());
+		log.info("STARTING");
+
+		service = new LoopControllerImpl(log);
+		
+		context.registerService(LoopController.class.getName(), service, new Hashtable());
+	}
+	
+	public void stop(BundleContext context) throws Exception
+	{
+		log.info("Stopping...");
+
+		service.cancelLoop();
+		service = null;
+		
+		log.info("DONE");
+		log = null;
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/CallBack.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/CallBack.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/CallBack.java (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/CallBack.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,6 @@
+package ijvm.tests.looper;
+
+public interface CallBack
+{
+	public void callBack() throws Exception;
+}

Added: vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopController.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopController.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopController.java (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopController.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,9 @@
+package ijvm.tests.looper;
+
+public interface LoopController
+{
+	public void loop() throws Exception;
+	public void callMeBack(CallBack cb) throws Exception;
+	public void cancelLoop();
+	public void keepThis(Object o);
+}

Added: vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopControllerImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopControllerImpl.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopControllerImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.looper/src/ijvm/tests/looper/LoopControllerImpl.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,50 @@
+package ijvm.tests.looper;
+
+import java.util.logging.Logger;
+
+public class LoopControllerImpl
+	implements LoopController
+{
+	protected boolean cancelLoop;
+	private Logger log;
+	private Object keptObj;
+	
+	public LoopControllerImpl(Logger log)
+	{
+		this.log = log;
+	}
+
+	public void loop() throws Exception
+	{
+		log.info("Start looping");
+		
+		cancelLoop = false;
+		while (!cancelLoop) {
+			log.info("Still looping...");
+			Thread.sleep(10000);
+		}
+		
+		log.info("Done looping");
+	}
+
+	public void cancelLoop()
+	{
+		log.info("Cancel looping");
+		cancelLoop = true;
+	}
+
+	public void callMeBack(CallBack cb) throws Exception
+	{
+		try {
+			cb.callBack();
+		} catch (Exception e) {
+			log.info(LoopControllerImpl.class.getName() + ".callMeBack");
+			e.printStackTrace();
+		}
+	}
+
+	public void keepThis(Object o)
+	{
+		keptObj = o;
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.tier/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.tier/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.tier</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.tier/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tier
+Bundle-SymbolicName: ijvm.tests.tier
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.tier.Activator
+Import-Package: org.osgi.framework;version="1.3.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Export-Package: ijvm.tests.tier

Added: vmkit/trunk/tests/ijvm.tests.tier/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/logging/InlineFormatter.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/logging/InlineFormatter.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/logging/InlineFormatter.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/logging/InlineFormatter.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,41 @@
+package ijvm.tests.logging;
+
+import java.util.*;
+import java.util.logging.*;
+
+public class InlineFormatter
+	extends java.util.logging.Formatter
+{
+	public static Logger createLogger(String className)
+	{
+		Logger log = Logger.getAnonymousLogger();
+		
+		Handler logConsoleHandler = new ConsoleHandler();
+		logConsoleHandler.setFormatter(new InlineFormatter());
+		log.addHandler(logConsoleHandler);
+		
+		log.setUseParentHandlers(false);
+		log.setLevel(Level.INFO);
+		return log;
+	}
+	
+	public String format(LogRecord record)
+	{
+		Calendar cal = GregorianCalendar.getInstance();
+		cal.setTime(new Date(record.getMillis()));
+		String logTime = cal.get(Calendar.HOUR_OF_DAY) + ":" +
+			cal.get(Calendar.MINUTE) + ":" +
+			cal.get(Calendar.SECOND) + "." +
+			cal.get(Calendar.MILLISECOND);
+		
+		StringBuffer str = new StringBuffer(256);
+		str.append(record.getLevel().getName() +
+			"[" + logTime +
+			" @ " + Integer.toHexString(record.getThreadID()) + " " +
+			record.getSourceClassName() + "." + record.getSourceMethodName() + "] " +
+			record.getMessage() + "\n"
+			);
+		
+		return str.toString();
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Activator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Activator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,26 @@
+package ijvm.tests.tier;
+
+import ijvm.tests.logging.InlineFormatter;
+
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator
+	implements BundleActivator
+{
+	private Logger log;
+
+	public void start(BundleContext bundleContext) throws Exception
+	{
+		log = InlineFormatter.createLogger(Activator.class.getName());
+		log.info("STARTING");
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		log.info("DONE");
+		log = null;
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/TierService.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/TierService.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/TierService.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/TierService.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+package ijvm.tests.tier;
+
+public interface TierService
+{
+	public void doSomething() throws Exception;
+	public Utility getSomething();
+}

Added: vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Utility.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Utility.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Utility.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tier/src/ijvm/tests/tier/Utility.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+package ijvm.tests.tier;
+
+public interface Utility
+{
+	public int getSomething();
+	public void setSomething(int x);
+}

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/.classpath
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/.classpath?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/.classpath (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/.classpath Thu Apr 25 11:46:36 2013
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/.project
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/.project?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/.project (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/.project Thu Apr 25 11:46:36 2013
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ijvm.tests.tierImpl</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/META-INF/MANIFEST.MF
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/META-INF/MANIFEST.MF?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/META-INF/MANIFEST.MF (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/META-INF/MANIFEST.MF Thu Apr 25 11:46:36 2013
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: TierImpl
+Bundle-SymbolicName: ijvm.tests.tierImpl
+Bundle-Version: 1.0.0
+Bundle-Activator: ijvm.tests.tierImpl.Activator
+Import-Package: ijvm.tests.looper,
+ ijvm.tests.tier,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.0.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.4

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/build.properties
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/build.properties?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/build.properties (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/build.properties Thu Apr 25 11:46:36 2013
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/logging/InlineFormatter.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/logging/InlineFormatter.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/logging/InlineFormatter.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/logging/InlineFormatter.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,41 @@
+package ijvm.tests.logging;
+
+import java.util.*;
+import java.util.logging.*;
+
+public class InlineFormatter
+	extends java.util.logging.Formatter
+{
+	public static Logger createLogger(String className)
+	{
+		Logger log = Logger.getAnonymousLogger();
+		
+		Handler logConsoleHandler = new ConsoleHandler();
+		logConsoleHandler.setFormatter(new InlineFormatter());
+		log.addHandler(logConsoleHandler);
+		
+		log.setUseParentHandlers(false);
+		log.setLevel(Level.INFO);
+		return log;
+	}
+	
+	public String format(LogRecord record)
+	{
+		Calendar cal = GregorianCalendar.getInstance();
+		cal.setTime(new Date(record.getMillis()));
+		String logTime = cal.get(Calendar.HOUR_OF_DAY) + ":" +
+			cal.get(Calendar.MINUTE) + ":" +
+			cal.get(Calendar.SECOND) + "." +
+			cal.get(Calendar.MILLISECOND);
+		
+		StringBuffer str = new StringBuffer(256);
+		str.append(record.getLevel().getName() +
+			"[" + logTime +
+			" @ " + Integer.toHexString(record.getThreadID()) + " " +
+			record.getSourceClassName() + "." + record.getSourceMethodName() + "] " +
+			record.getMessage() + "\n"
+			);
+		
+		return str.toString();
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/Activator.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/Activator.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/Activator.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/Activator.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,117 @@
+package ijvm.tests.tierImpl;
+
+import ijvm.tests.logging.InlineFormatter;
+import ijvm.tests.looper.LoopController;
+import ijvm.tests.tier.TierService;
+
+import java.util.Hashtable;
+import java.util.logging.Logger;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.util.tracker.ServiceTracker;
+
+
+public class Activator
+	implements BundleActivator, ServiceListener, Runnable
+{
+	private BundleContext context;
+	private Logger log;
+	
+	private ServiceTracker loopControllerTracker;
+	private LoopController loopControllerService;
+	
+	private TierServiceImpl serviceImpl;
+	
+	private Thread thread;
+	private boolean stopThread;
+
+	
+	public void start(BundleContext context) throws Exception
+	{
+		this.context = context;
+		log = InlineFormatter.createLogger(Activator.class.getName());
+		log.info("STARTING");
+
+		loopControllerTracker = new ServiceTracker(context, LoopController.class.getName(), null);
+		loopControllerTracker.open();
+		loopControllerService = (LoopController)loopControllerTracker.getService();
+		context.addServiceListener(this, "(objectclass=" + LoopController.class.getName() + ")");
+
+		serviceImpl = new TierServiceImpl(log);
+		serviceImpl.setLoopControllerService(loopControllerService);
+		
+		context.registerService(TierService.class.getName(), serviceImpl, new Hashtable());
+
+//		thread = new Thread(this, "Tier worker");
+//		stopThread = false;
+//		thread.start();
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception
+	{
+		log.info("Stopping...");
+
+		this.context = null;
+		
+		if (thread != null) {
+			stopThread = true;
+			thread.join();
+			thread = null;
+		}
+		
+		serviceImpl = null;
+
+		loopControllerTracker.close();
+		loopControllerTracker = null;
+		loopControllerService = null;
+
+		log.info("DONE");
+		log = null;
+	}
+
+	public void serviceChanged(ServiceEvent event)
+	{
+		Object serviceObj = context.getService(event.getServiceReference());
+		
+		switch(event.getType()) {
+		case ServiceEvent.REGISTERED:
+			if (LoopController.class.isInstance(serviceObj))
+				serviceImpl.setLoopControllerService((LoopController)serviceObj);
+			break;
+			
+		case ServiceEvent.UNREGISTERING:
+			if (LoopController.class.isInstance(serviceObj))
+				serviceImpl.setLoopControllerService(null);
+			break;
+		}
+	}
+
+	public void run()
+	{
+		log.info("Tier thread running...");
+		
+//		for (;;) {}
+		
+		try {
+/*
+			boolean done;
+			for (done = false; !done; ) {
+				done = false;
+			}
+			
+			Thread.sleep(1000);
+*/
+			while (!stopThread) {
+				Thread.sleep(1000);
+			}
+		} catch (InterruptedException e) {
+			log.info(Activator.class.getName() + ".run");
+			e.printStackTrace();
+		}
+
+		log.info("Tier thread done.");
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/TierServiceImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/TierServiceImpl.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/TierServiceImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/TierServiceImpl.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,77 @@
+package ijvm.tests.tierImpl;
+
+import ijvm.tests.looper.CallBack;
+import ijvm.tests.looper.LoopController;
+import ijvm.tests.tier.TierService;
+import ijvm.tests.tier.Utility;
+
+import java.util.ArrayList;
+import java.util.logging.Logger;
+
+public class TierServiceImpl
+	implements TierService, CallBack
+{
+	private Logger log;
+	private LoopController loopControllerService;
+	
+	TierServiceImpl(Logger log)
+	{
+		this.loopControllerService = null;
+		this.log = log;
+	}
+	
+	public void setLoopControllerService(LoopController loopControllerService)
+	{
+		this.loopControllerService = loopControllerService;
+	}
+
+	public void doSomething() throws Exception
+	{
+		log.info("Now doing something");
+		
+		try {
+			thenAnotherThing();
+		} catch (Exception e) {
+			log.info(TierServiceImpl.class.getName() + ".doSomething");
+			e.printStackTrace();
+		}
+		
+		log.info("Done something");
+	}
+	
+	public void thenAnotherThing() throws Exception
+	{
+		try {
+			beforeLeaving();
+		} catch (Exception e) {
+			log.info(TierServiceImpl.class.getName() + ".thenAnotherThing");
+			e.printStackTrace();
+		}
+	}
+	
+	public void beforeLeaving() throws Exception
+	{
+		try {
+			loopControllerService.callMeBack(this);
+		} catch (Exception e) {
+			log.info(TierServiceImpl.class.getName() + ".beforeLeaving");
+			e.printStackTrace();
+		}
+	}
+
+	public void callBack() throws Exception
+	{
+		try {
+			loopControllerService.keepThis(this);
+			loopControllerService.loop();
+		} catch (Exception e) {
+			log.info(TierServiceImpl.class.getName() + ".callBack");
+			e.printStackTrace();
+		}
+	}
+
+	public Utility getSomething()
+	{
+		return new UtilityImpl(22);
+	}
+}

Added: vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/UtilityImpl.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/UtilityImpl.java?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/UtilityImpl.java (added)
+++ vmkit/trunk/tests/ijvm.tests.tierImpl/src/ijvm/tests/tierImpl/UtilityImpl.java Thu Apr 25 11:46:36 2013
@@ -0,0 +1,30 @@
+package ijvm.tests.tierImpl;
+
+import ijvm.tests.tier.Utility;
+
+public class UtilityImpl
+	implements Utility
+{
+	int something;
+	
+	UtilityImpl(int x)
+	{
+		something = x;
+	}
+	
+	protected void finalize() throws Throwable
+	{
+		System.out.println("UtilityImpl.finalize()");
+		something = -1;
+	}
+	
+	public int getSomething()
+	{
+		return something;
+	}
+	
+	public void setSomething(int x)
+	{
+		something = x;
+	}
+}

Added: vmkit/trunk/tests/minimal.xargs
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/minimal.xargs?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/minimal.xargs (added)
+++ vmkit/trunk/tests/minimal.xargs Thu Apr 25 11:46:36 2013
@@ -0,0 +1,28 @@
+-Dorg.knopflerfish.framework.main.verbosity=0
+-Dorg.knopflerfish.gosg.jars=file:jars/
+-Forg.knopflerfish.framework.debug.errors=true
+-Forg.knopflerfish.framework.debug.packages=false
+-Forg.knopflerfish.framework.debug.classloader=false
+-Forg.osgi.framework.system.packages.extra=
+
+-Forg.knopflerfish.startlevel.use=true
+
+-init
+
+-install log/log_api-3.1.2.jar
+-install console/console_api-3.0.3.jar
+-istart  cm/cm_api-3.0.4.jar
+-istart  log/log-3.1.2.jar
+-istart  console/console-3.0.3.jar
+-istart  consoletty/consoletty-3.0.1.jar
+-istart  frameworkcommands/frameworkcommands-3.0.4.jar
+-istart  logcommands/logcommands-3.1.1.jar
+-istart  useradmin/useradmin_api-3.0.2.jar
+
+-istart  file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.isolate.IsolateManager_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.looper_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.tier_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.tierImpl_1.0.0.jar
+-istart  file:///home/koutheir/PhD/VMKit/ijvm/tests/plugins/ijvm.tests.loopClient_1.0.0.jar
+
+-launch

Added: vmkit/trunk/tests/sun-jvm-log.txt
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/sun-jvm-log.txt?rev=180279&view=auto
==============================================================================
--- vmkit/trunk/tests/sun-jvm-log.txt (added)
+++ vmkit/trunk/tests/sun-jvm-log.txt Thu Apr 25 11:46:36 2013
@@ -0,0 +1,58 @@
+Sun JVM
+
+Direct access to static string.
+
+INFO[2:24:52.372 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:52.373 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:24:52.378 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:53.373 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:24:53.373 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:53.373 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:24:54.374 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:24:54.374 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:54.374 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:24:55.374 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:24:55.375 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:55.375 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:24:56.375 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:24:56.375 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:56.375 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:24:57.376 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:24:57.376 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:24:57.376 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+
+Access to static string through a getter function.
+
+INFO[2:45:5.298 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:5.308 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:5.309 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:6.308 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:6.308 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:6.308 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:7.309 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:7.309 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:7.309 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:8.310 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:8.310 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:8.310 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:9.310 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:9.310 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:9.310 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:10.311 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:10.311 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:10.311 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:11.312 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:11.312 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:11.312 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:12.312 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:12.313 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:12.313 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:13.313 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:13.313 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:13.313 @ b vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:14.314 @ b vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:14.314 @ b vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:14.314 @ c vmkit.tests.staticstringclient.Activator.sync] |*|
+INFO[2:45:15.314 @ c vmkit.tests.staticstringclient.Activator.sync] |>>
+INFO[2:45:15.315 @ c vmkit.tests.staticstringclient.Activator.run] >>|
+INFO[2:45:15.315 @ b vmkit.tests.staticstringclient.Activator.sync] |*|

Modified: vmkit/trunk/tools/precompiler/trainer/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/precompiler/trainer/Makefile?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/tools/precompiler/trainer/Makefile (original)
+++ vmkit/trunk/tools/precompiler/trainer/Makefile Thu Apr 25 11:46:36 2013
@@ -33,7 +33,7 @@ generated.bc: $(PRECOMPILER) HelloWorld.
 Precompiled.bc: HelloWorld.class $(LibDir)/StaticGCPass$(SHLIBEXT) $(LibDir)/StaticGCPrinter$(SHLIBEXT) generated.bc
 	$(Echo) "Building precompiled bootstrap code"
 	$(Verb) $(MKDIR) $(ObjDir)
-	$(Verb) $(LLC) -disable-branch-fold -disable-cfi -disable-debug-info-print -disable-fp-elim -O3 -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) generated.bc -o $(ObjDir)/Precompiled.s
+	$(Verb) $(LLC) -disable-branch-fold -disable-cfi -disable-debug-info-print -disable-fp-elim $(PRECOMPILER_FLAGS) -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) generated.bc -o $(ObjDir)/Precompiled.s
 	$(Verb) $(CC) -c $(ObjDir)/Precompiled.s -o $(ObjDir)/Precompiled.o
 	$(Verb) $(Archive) $(LibDir)/libPrecompiled.a $(ObjDir)/Precompiled.o
 	$(Verb) $(Ranlib) $(LibDir)/libPrecompiled.a

Modified: vmkit/trunk/tools/vmjc/vmjc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=180279&r1=180278&r2=180279&view=diff
==============================================================================
--- vmkit/trunk/tools/vmjc/vmjc.cpp (original)
+++ vmkit/trunk/tools/vmjc/vmjc.cpp Thu Apr 25 11:46:36 2013
@@ -124,7 +124,11 @@ int main(int argc, char **argv) {
   vmkit::VmkitModule::initialise(argc, argv);
   vmkit::Collector::initialise(argc, argv);
 
-  JavaAOTCompiler* Comp = new JavaAOTCompiler("AOT");
+  // WARNING: This is a silly method to discover that we are compiling MMTk.
+  // Please change to anything more deterministic.
+  bool compilingMMTk = (DisableExceptions && DisableCooperativeGC && DisableStubs && AssumeCompiled);
+
+  JavaAOTCompiler* Comp = new JavaAOTCompiler("AOT", compilingMMTk);
 
   vmkit::BumpPtrAllocator allocator;
   JnjvmBootstrapLoader* loader = new(allocator, "Bootstrap loader")





More information about the vmkit-commits mailing list