From nicolas.geoffray at lip6.fr Sat Sep 5 10:56:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 05 Sep 2009 17:56:44 -0000 Subject: [vmkit-commits] [vmkit] r81089 - /vmkit/trunk/autoconf/configure.ac Message-ID: <200909051756.n85HuiIT013805@zion.cs.uiuc.edu> Author: geoffray Date: Sat Sep 5 12:56:43 2009 New Revision: 81089 URL: http://llvm.org/viewvc/llvm-project?rev=81089&view=rev Log: Add a --with-llvmgcc command line option to build VMKit with llvm-gcc. Modified: vmkit/trunk/autoconf/configure.ac Modified: vmkit/trunk/autoconf/configure.ac URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/autoconf/configure.ac?rev=81089&r1=81088&r2=81089&view=diff ============================================================================== --- vmkit/trunk/autoconf/configure.ac (original) +++ vmkit/trunk/autoconf/configure.ac Sat Sep 5 12:56:43 2009 @@ -149,6 +149,21 @@ dnl=== dnl===-----------------------------------------------------------------------=== +AC_ARG_WITH(llvmgcc, + [AS_HELP_STRING(--with-llvmgcc, + [Compile with llvm-gcc])], + [[withllvm=yes]], + [[withllvm=no]], +) + +if test "x$withllvm" = "xyes"; then + WITH_LLVM_GCC=1 + LLVM_FLAGS=-DWITH_LLVM_GCC +fi + +AC_SUBST([WITH_LLVM_GCC]) +AC_SUBST([LLVM_FLAGS]) + AC_ARG_WITH(thread, [AS_HELP_STRING(--with-thread=something, [Thread type ('common' or 'no')])], @@ -183,7 +198,7 @@ dnl ************************************************************************** -dnl VVM GC type +dnl GC type dnl ************************************************************************** AC_ARG_WITH(gc, [AS_HELP_STRING(--with-gc=something, From nicolas.geoffray at lip6.fr Sat Sep 5 10:57:02 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 05 Sep 2009 17:57:02 -0000 Subject: [vmkit-commits] [vmkit] r81090 - /vmkit/trunk/configure Message-ID: <200909051757.n85Hv2OS013853@zion.cs.uiuc.edu> Author: geoffray Date: Sat Sep 5 12:57:02 2009 New Revision: 81090 URL: http://llvm.org/viewvc/llvm-project?rev=81090&view=rev Log: Regenerated configure. Modified: vmkit/trunk/configure Modified: vmkit/trunk/configure URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/configure?rev=81090&r1=81089&r2=81090&view=diff ============================================================================== --- vmkit/trunk/configure (original) +++ vmkit/trunk/configure Sat Sep 5 12:57:02 2009 @@ -671,6 +671,8 @@ target_vendor target_os DYLIB_EXTENSION +WITH_LLVM_GCC +LLVM_FLAGS CC CFLAGS LDFLAGS @@ -1321,6 +1323,7 @@ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-llvmsrc Location of LLVM Source Code --with-llvmobj Location of LLVM Object Code + --with-llvmgcc Compile with llvm-gcc --with-thread=something Thread type ('common' or 'no') --with-gc=something GC type ('single-mmap' 'multi-mmap' or 'boehm') --with-vm-type=something @@ -2086,6 +2089,23 @@ +# Check whether --with-llvmgcc was given. +if test "${with_llvmgcc+set}" = set; then + withval=$with_llvmgcc; withllvm=yes +else + withllvm=no +fi + + +if test "x$withllvm" = "xyes"; then + WITH_LLVM_GCC=1 + LLVM_FLAGS=-DWITH_LLVM_GCC +fi + + + + + # Check whether --with-thread was given. if test "${with_thread+set}" = set; then withval=$with_thread; thread=$withval @@ -7893,6 +7913,8 @@ target_vendor!$target_vendor$ac_delim target_os!$target_os$ac_delim DYLIB_EXTENSION!$DYLIB_EXTENSION$ac_delim +WITH_LLVM_GCC!$WITH_LLVM_GCC$ac_delim +LLVM_FLAGS!$LLVM_FLAGS$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim @@ -7935,8 +7957,6 @@ CMP!$CMP$ac_delim CP!$CP$ac_delim DATE!$DATE$ac_delim -FIND!$FIND$ac_delim -MKDIR!$MKDIR$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then @@ -7978,6 +7998,8 @@ ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF +FIND!$FIND$ac_delim +MKDIR!$MKDIR$ac_delim MV!$MV$ac_delim RANLIB!$RANLIB$ac_delim RM!$RM$ac_delim @@ -7996,7 +8018,7 @@ LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 16; then + if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 18; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 @@ -8400,9 +8422,9 @@ case $ac_file$ac_mode in "Makefile":C) ${llvm_src}/autoconf/mkinstalldirs `dirname Makefile` - ${SHELL} ${llvm_src}/autoconf/install-sh -c ${srcdir}/Makefile Makefile ;; + ${SHELL} ${llvm_src}/autoconf/install-sh -m 0644 -c ${srcdir}/Makefile Makefile ;; "lib/Makefile":C) ${llvm_src}/autoconf/mkinstalldirs `dirname lib/Makefile` - ${SHELL} ${llvm_src}/autoconf/install-sh -c ${srcdir}/lib/Makefile lib/Makefile ;; + ${SHELL} ${llvm_src}/autoconf/install-sh -m 0644 -c ${srcdir}/lib/Makefile lib/Makefile ;; esac done # for ac_tag From nicolas.geoffray at lip6.fr Sat Sep 5 10:58:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 05 Sep 2009 17:58:58 -0000 Subject: [vmkit-commits] [vmkit] r81091 - in /vmkit/trunk: ./ include/mvm/ include/mvm/Threads/ lib/JnJVM/Classpath/ lib/JnJVM/Compiler/ lib/JnJVM/VMCore/ lib/Mvm/Allocator/ lib/Mvm/BoehmGC/ lib/Mvm/CommonThread/ lib/Mvm/Compiler/ lib/Mvm/GCMmap2/ lib/Mvm/Runtime/ lib/N3/Mono/ lib/N3/PNetLib/ lib/N3/VMCore/ Message-ID: <200909051758.n85HwxeM014113@zion.cs.uiuc.edu> Author: geoffray Date: Sat Sep 5 12:58:58 2009 New Revision: 81091 URL: http://llvm.org/viewvc/llvm-project?rev=81091&view=rev Log: Generate .bc files when compiling with llvm-gcc. Modified: vmkit/trunk/Makefile.common.in vmkit/trunk/Makefile.config.in vmkit/trunk/include/mvm/Allocator.h vmkit/trunk/include/mvm/Threads/Locks.h vmkit/trunk/lib/JnJVM/Classpath/Makefile vmkit/trunk/lib/JnJVM/Compiler/Makefile vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/Makefile vmkit/trunk/lib/Mvm/Allocator/Makefile vmkit/trunk/lib/Mvm/BoehmGC/Makefile vmkit/trunk/lib/Mvm/CommonThread/Makefile vmkit/trunk/lib/Mvm/Compiler/Makefile vmkit/trunk/lib/Mvm/GCMmap2/Makefile vmkit/trunk/lib/Mvm/Runtime/Makefile vmkit/trunk/lib/N3/Mono/Makefile vmkit/trunk/lib/N3/PNetLib/Makefile vmkit/trunk/lib/N3/VMCore/Makefile Modified: vmkit/trunk/Makefile.common.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.common.in?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/Makefile.common.in (original) +++ vmkit/trunk/Makefile.common.in Sat Sep 5 12:58:58 2009 @@ -23,7 +23,7 @@ # Include LLVM's Master Makefile. include $(LLVM_OBJ_ROOT)/Makefile.common -CXX.Flags += @GC_FLAGS@ @VM_FLAGS@ @EXCEPTION_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -fno-strict-aliasing -Wno-deprecated -ansi -DENABLE_THREADS +CXX.Flags += @LLVM_FLAGS@ @GC_FLAGS@ @VM_FLAGS@ @EXCEPTION_FLAGS@ -Wno-variadic-macros -fno-omit-frame-pointer -fno-strict-aliasing -Wno-deprecated -ansi -DENABLE_THREADS # GNU Classpath flags CLASSPATH_FLAGS = @classpathinclude@ Modified: vmkit/trunk/Makefile.config.in URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.config.in?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/Makefile.config.in (original) +++ vmkit/trunk/Makefile.config.in Sat Sep 5 12:58:58 2009 @@ -12,3 +12,4 @@ SERVICE_BUILD = @SERVICE_BUILD@ SINGLE_BUILD = @SINGLE_BUILD@ WITH_64 = @WITH_64@ +WITH_LLVM_GCC = @WITH_LLVM_GCC@ Modified: vmkit/trunk/include/mvm/Allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Allocator.h?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Allocator.h (original) +++ vmkit/trunk/include/mvm/Allocator.h Sat Sep 5 12:58:58 2009 @@ -20,7 +20,7 @@ class VirtualTable; -#ifdef LLVM_GCC +#ifdef WITH_LLVM_GCC extern "C" void llvm_gcroot(const void*, void*) asm("llvm.gcroot"); #else #define llvm_gcroot(a, b) Modified: vmkit/trunk/include/mvm/Threads/Locks.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Locks.h?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Locks.h (original) +++ vmkit/trunk/include/mvm/Threads/Locks.h Sat Sep 5 12:58:58 2009 @@ -27,6 +27,8 @@ extern "C" uint64 llvm_atomic_cmp_swap_i64(uint64* ptr, uint64 cmp, uint64 val); +#ifndef WITH_LLVM_GCC + // TODO: find what macro for gcc < 4.2 #define __sync_bool_compare_and_swap_32(ptr, cmp, val) \ @@ -58,6 +60,8 @@ #endif +#endif + class Cond; class LockNormal; class LockRecursive; @@ -230,7 +234,7 @@ /// acquire - Acquire the lock. void acquire(Owner* O = 0) { uint64_t id = mvm::Thread::get()->getThreadID(); - uintptr_t val = __sync_val_compare_and_swap((uintptr_t)&lock, 0, id); + uintptr_t val = __sync_val_compare_and_swap(&lock, 0, id); if (val != 0) { //fat! Modified: vmkit/trunk/lib/JnJVM/Classpath/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/Makefile (original) +++ vmkit/trunk/lib/JnJVM/Classpath/Makefile Sat Sep 5 12:58:58 2009 @@ -8,9 +8,14 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = Classpath - include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = Classpath +else + LIBRARYNAME = Classpath +endif + include $(LEVEL)/Makefile.common CXX.Flags += -I$(PROJ_SRC_DIR)/../VMCore $(CLASSPATH_FLAGS) Modified: vmkit/trunk/lib/JnJVM/Compiler/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/Makefile (original) +++ vmkit/trunk/lib/JnJVM/Compiler/Makefile Sat Sep 5 12:58:58 2009 @@ -8,11 +8,16 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = JnjvmCompiler +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = JnjvmCompiler +else + LIBRARYNAME = JnjvmCompiler +endif EXTRA_DIST = ExceptionsCheck.inc ExceptionsDwarf.inc -include $(LEVEL)/Makefile.config include $(LEVEL)/Makefile.common Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sat Sep 5 12:58:58 2009 @@ -1054,7 +1054,7 @@ JavaObject* CommonClass::setDelegatee(JavaObject* val) { JavaObject* prev = (JavaObject*) - __sync_val_compare_and_swap((uintptr_t)&(delegatee[0]), NULL, val); + __sync_val_compare_and_swap(&(delegatee[0]), NULL, val); if (!prev) return val; else return prev; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Sat Sep 5 12:58:58 2009 @@ -77,7 +77,6 @@ JavaString* JavaString::internalToJava(const UTF8* name, Jnjvm* vm) { ArrayUInt16* array = 0; - llvm_gcroot(this, 0); llvm_gcroot(array, 0); array = (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(name->size, vm); Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sat Sep 5 12:58:58 2009 @@ -1095,7 +1095,7 @@ JavaObject* group = 0; llvm_gcroot(args, 0); - llvm_gcroot(ex, 0); + llvm_gcroot(exc, 0); llvm_gcroot(obj, 0); llvm_gcroot(group, 0); Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sat Sep 5 12:58:58 2009 @@ -856,7 +856,7 @@ JnjvmClassLoader* JnjvmClassLoader::getJnjvmLoaderFromJavaObject(JavaObject* loader, Jnjvm* vm) { - VMClassLoader* vmdata = 0 + VMClassLoader* vmdata = 0; llvm_gcroot(loader, 0); llvm_gcroot(vmdata, 0); Modified: vmkit/trunk/lib/JnJVM/VMCore/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/Makefile (original) +++ vmkit/trunk/lib/JnJVM/VMCore/Makefile Sat Sep 5 12:58:58 2009 @@ -8,10 +8,15 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = JnJVM - include $(LEVEL)/Makefile.config +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = JnJVM +else + LIBRARYNAME = JnJVM +endif + + include $(LEVEL)/Makefile.common CXX.Flags += -I$(PROJ_OBJ_DIR)/../Classpath -I$(PROJ_OBJ_DIR)/../LLVMRuntime -I$(PROJ_SRC_DIR)/../Classpath $(CLASSPATH_FLAGS) -I$(PROJ_SRC_DIR)/../../../include/jnjvm Modified: vmkit/trunk/lib/Mvm/Allocator/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Allocator/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Allocator/Makefile (original) +++ vmkit/trunk/lib/Mvm/Allocator/Makefile Sat Sep 5 12:58:58 2009 @@ -8,6 +8,13 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = Allocator +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = Allocator +else + LIBRARYNAME = Allocator +endif + include $(LEVEL)/Makefile.common Modified: vmkit/trunk/lib/Mvm/BoehmGC/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/BoehmGC/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/BoehmGC/Makefile (original) +++ vmkit/trunk/lib/Mvm/BoehmGC/Makefile Sat Sep 5 12:58:58 2009 @@ -1,4 +1,4 @@ -##===- lib/JnJVM/VMCore/Makefile ---------------------------*- Makefile -*-===## +##===- lib/Mvm/BoehmGC/Makefile ----------------------------*- Makefile -*-===## # # The vmkit project # @@ -8,6 +8,13 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = BoehmGC +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = BoehmGC +else + LIBRARYNAME = BoehmGC +endif + include $(LEVEL)/Makefile.common Modified: vmkit/trunk/lib/Mvm/CommonThread/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/CommonThread/Makefile (original) +++ vmkit/trunk/lib/Mvm/CommonThread/Makefile Sat Sep 5 12:58:58 2009 @@ -8,6 +8,14 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = CommonThread +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = CommonThread +else + LIBRARYNAME = CommonThread +endif + + include $(LEVEL)/Makefile.common Modified: vmkit/trunk/lib/Mvm/Compiler/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/Makefile (original) +++ vmkit/trunk/lib/Mvm/Compiler/Makefile Sat Sep 5 12:58:58 2009 @@ -10,7 +10,12 @@ include $(LEVEL)/Makefile.config -LIBRARYNAME = MvmCompiler +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = MvmCompiler +else + LIBRARYNAME = MvmCompiler +endif + VMKIT_RUNTIME = $(PROJ_SRC_DIR)/LLVMRuntime.ll BUILT_SOURCES = LLVMRuntime.inc Modified: vmkit/trunk/lib/Mvm/GCMmap2/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/GCMmap2/Makefile (original) +++ vmkit/trunk/lib/Mvm/GCMmap2/Makefile Sat Sep 5 12:58:58 2009 @@ -8,7 +8,14 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = GCMmap2 +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = GCMmap2 +else + LIBRARYNAME = GCMmap2 +endif + include $(LEVEL)/Makefile.common CXX.Flags += -I$(PROJ_SRC_DIR)/../CommonThread -I$(PROJ_SRC_DIR)/../Allocator Modified: vmkit/trunk/lib/Mvm/Runtime/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Makefile (original) +++ vmkit/trunk/lib/Mvm/Runtime/Makefile Sat Sep 5 12:58:58 2009 @@ -10,15 +10,22 @@ include $(LEVEL)/Makefile.config -LIBRARYNAME = Mvm -VMKIT_ASSEMBLY = $(PROJ_SRC_DIR)/LLVMAssembly.ll -BUILT_SOURCES = LLVMAssembly.s +ifeq ($(WITH_LLVM_GCC), 1) -ifeq ($(WITH_64), 1) - VMKIT_ASSEMBLY += $(PROJ_SRC_DIR)/LLVMAssembly64.ll -endif + MODULE_NAME = Mvm + +else + LIBRARYNAME = Mvm + + VMKIT_ASSEMBLY = $(PROJ_SRC_DIR)/LLVMAssembly.ll + BUILT_SOURCES = LLVMAssembly.s + ifeq ($(WITH_64), 1) + VMKIT_ASSEMBLY += $(PROJ_SRC_DIR)/LLVMAssembly64.ll + endif -SOURCES = LLVMAssembly.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) + SOURCES = LLVMAssembly.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) + +endif include $(LEVEL)/Makefile.common Modified: vmkit/trunk/lib/N3/Mono/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/N3/Mono/Makefile (original) +++ vmkit/trunk/lib/N3/Mono/Makefile Sat Sep 5 12:58:58 2009 @@ -8,7 +8,14 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = Mono +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = Mono +else + LIBRARYNAME = Mono +endif + include $(LEVEL)/Makefile.common CXX.Flags += -I$(PROJ_SRC_DIR)/../VMCore Modified: vmkit/trunk/lib/N3/PNetLib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/N3/PNetLib/Makefile (original) +++ vmkit/trunk/lib/N3/PNetLib/Makefile Sat Sep 5 12:58:58 2009 @@ -8,6 +8,13 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = PNetLib +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = PNetLib +else + LIBRARYNAME = PNetLib +endif + include $(LEVEL)/Makefile.common CXX.Flags += -I$(PROJ_SRC_DIR)/../VMCore Modified: vmkit/trunk/lib/N3/VMCore/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Makefile?rev=81091&r1=81090&r2=81091&view=diff ============================================================================== --- vmkit/trunk/lib/N3/VMCore/Makefile (original) +++ vmkit/trunk/lib/N3/VMCore/Makefile Sat Sep 5 12:58:58 2009 @@ -8,7 +8,14 @@ ##===----------------------------------------------------------------------===## LEVEL = ../../.. -LIBRARYNAME = N3 +include $(LEVEL)/Makefile.config + +ifeq ($(WITH_LLVM_GCC), 1) + MODULE_NAME = N3 +else + LIBRARYNAME = N3 +endif + include $(LEVEL)/Makefile.common CXX.Flags += -I$(PROJ_OBJ_DIR)/../LLVMRuntime From nicolas.geoffray at lip6.fr Sun Sep 6 07:58:30 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 06 Sep 2009 14:58:30 -0000 Subject: [vmkit-commits] [vmkit] r81119 - in /vmkit/trunk: Makefile.rules include/mvm/Allocator.h lib/JnJVM/VMCore/JavaObject.cpp lib/JnJVM/VMCore/JavaObject.h lib/JnJVM/VMCore/JavaString.cpp tools/jnjvm/Makefile tools/vmkit/Makefile Message-ID: <200909061458.n86EwUWa013286@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 6 09:58:29 2009 New Revision: 81119 URL: http://llvm.org/viewvc/llvm-project?rev=81119&view=rev Log: Build vmkit and jnjvm with .bc files. Modified: vmkit/trunk/Makefile.rules vmkit/trunk/include/mvm/Allocator.h vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp vmkit/trunk/tools/jnjvm/Makefile vmkit/trunk/tools/vmkit/Makefile Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Sun Sep 6 09:58:29 2009 @@ -97,3 +97,29 @@ endif + + +ifdef TOOLNAME +ifdef USEDMODULES + +ProjLibsPaths := $(addprefix $(LibDir)/,$(USEDMODULES)) + +$(TOOLNAME).bc : $(ProjLibsPaths) + $(Echo) Building $(BuildMode) Bytecode Module $(notdir $@) + $(Verb) $(LLVMLD) -L$(CFERuntimeLibDir) -r -o $@ $(ProjLibsPaths) + +$(TOOLNAME).s : $(TOOLNAME).bc + $(Echo) Building $(BuildMode) Assembly file $(notdir $@) + $(Verb) $(LOPT) -f $(TOOLNAME).bc -o $(TOOLNAME)-optimized.bc + $(Verb) $(LLC) -f $(TOOLNAME)-optimized.bc -o $(TOOLNAME).s + +$(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES) + $(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG) + $(Verb) $(Compile.C) $< -o $(ObjDir)/$*.o + +clean-local:: + $(Verb) $(RM) -f $(TOOLNAME)-optimized.bc $(TOOLNAME).bc $(TOOLNAME).s + +endif +endif + Modified: vmkit/trunk/include/mvm/Allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Allocator.h?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Allocator.h (original) +++ vmkit/trunk/include/mvm/Allocator.h Sun Sep 6 09:58:29 2009 @@ -21,7 +21,8 @@ class VirtualTable; #ifdef WITH_LLVM_GCC -extern "C" void llvm_gcroot(const void*, void*) asm("llvm.gcroot"); +extern "C" void __llvm_gcroot(const void*, void*) __attribute__((nothrow)); +#define llvm_gcroot(a, b) __llvm_gcroot(&a, b) #else #define llvm_gcroot(a, b) #endif Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Sun Sep 6 09:58:29 2009 @@ -36,11 +36,12 @@ void JavaObject::waitIntern(struct timeval* info, bool timed) { LockObj* l = 0; - llvm_gcroot(this, 0); + JavaObject* self = this; + llvm_gcroot(self, 0); llvm_gcroot(l, 0); if (owner()) { - l = lock.changeToFatlock(this); + l = self->lock.changeToFatlock(self); JavaThread* thread = JavaThread::get(); thread->waitsOn = l; mvm::Cond& varcondThread = thread->varcond; @@ -48,7 +49,7 @@ if (thread->interruptFlag != 0) { thread->interruptFlag = 0; thread->waitsOn = 0; - thread->getJVM()->interruptedException(this); + thread->getJVM()->interruptedException(self); } else { thread->state = JavaThread::StateWaiting; if (l->firstThread) { @@ -122,32 +123,35 @@ if (interrupted) { thread->interruptFlag = 0; - thread->getJVM()->interruptedException(this); + thread->getJVM()->interruptedException(self); } } } else { - JavaThread::get()->getJVM()->illegalMonitorStateException(this); + JavaThread::get()->getJVM()->illegalMonitorStateException(self); } assert(owner() && "Not owner after wait"); } void JavaObject::wait() { - llvm_gcroot(this, 0); + JavaObject* self = this; + llvm_gcroot(self, 0); waitIntern(0, false); } void JavaObject::timedWait(struct timeval& info) { - llvm_gcroot(this, 0); + JavaObject* self = this; + llvm_gcroot(self, 0); waitIntern(&info, true); } void JavaObject::notify() { LockObj* l = 0; - llvm_gcroot(this, 0); + JavaObject* self = this; + llvm_gcroot(self, 0); llvm_gcroot(l, 0); if (owner()) { - l = lock.getFatLock(); + l = self->lock.getFatLock(); if (l) { JavaThread* cur = l->firstThread; if (cur) { @@ -181,18 +185,19 @@ } } } else { - JavaThread::get()->getJVM()->illegalMonitorStateException(this); + JavaThread::get()->getJVM()->illegalMonitorStateException(self); } assert(owner() && "Not owner after notify"); } void JavaObject::notifyAll() { LockObj* l = 0; - llvm_gcroot(this, 0); + JavaObject* self = this; + llvm_gcroot(self, 0); llvm_gcroot(l, 0); if (owner()) { - l = lock.getFatLock(); + l = self->lock.getFatLock(); if (l) { JavaThread* cur = l->firstThread; if (cur) { @@ -207,7 +212,7 @@ } } } else { - JavaThread::get()->getJVM()->illegalMonitorStateException(this); + JavaThread::get()->getJVM()->illegalMonitorStateException(self); } assert(owner() && "Not owner after notifyAll"); @@ -359,8 +364,9 @@ } bool JavaObject::instanceOf(UserCommonClass* cl) { - llvm_gcroot(this, 0); + JavaObject* self = this; + llvm_gcroot(self, 0); - if (!this) return false; - else return this->getClass()->isAssignableFrom(cl); + if (!self) return false; + else return self->getClass()->isAssignableFrom(cl); } Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Sun Sep 6 09:58:29 2009 @@ -49,8 +49,9 @@ /// acquire - Acquires the lock. /// void acquire() { - llvm_gcroot(this, 0); - lock.lock(); + LockObj* self = this; + llvm_gcroot(self, 0); + self->lock.lock(); } /// tryAcquire - Tries to acquire the lock. @@ -61,8 +62,9 @@ /// acquireAll - Acquires the lock nb times. void acquireAll(uint32 nb) { - llvm_gcroot(this, 0); - lock.lockAll(nb); + LockObj* self = this; + llvm_gcroot(self, 0); + self->lock.lockAll(nb); } /// release - Releases the lock. @@ -301,8 +303,9 @@ /// acquire - Acquire the lock on this object. void acquire() { - llvm_gcroot(this, 0); - lock.acquire(); + JavaObject* self = this; + llvm_gcroot(self, 0); + self->lock.acquire(); } /// release - Release the lock on this object Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Sun Sep 6 09:58:29 2009 @@ -49,20 +49,21 @@ } const ArrayUInt16* JavaString::strToArray(Jnjvm* vm) { - llvm_gcroot(this, 0); + JavaString* self = this; + llvm_gcroot(self, 0); - assert(value && "String without an array?"); - if (offset || (count != value->size)) { + assert(self->value && "String without an array?"); + if (self->offset || (self->count != self->value->size)) { ArrayUInt16* array = - (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(count, vm); + (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(self->count, vm); uint16* buf = array->elements; for (sint32 i = 0; i < count; i++) { - buf[i] = value->elements[i + offset]; + buf[i] = self->value->elements[i + self->offset]; } return array; } else { - return value; + return self->value; } } @@ -92,15 +93,16 @@ } const UTF8* JavaString::javaToInternal(UTF8Map* map) const { - llvm_gcroot(this, 0); + const JavaString* self = this; + llvm_gcroot(self, 0); - uint16* java = (uint16*)alloca(sizeof(uint16) * count); + uint16* java = (uint16*)alloca(sizeof(uint16) * self->count); for (sint32 i = 0; i < count; ++i) { - uint16 cur = value->elements[offset + i]; + uint16 cur = self->value->elements[offset + i]; if (cur == '.') java[i] = '/'; else java[i] = cur; } - return map->lookupOrCreateReader(java, count); + return map->lookupOrCreateReader(java, self->count); } Modified: vmkit/trunk/tools/jnjvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/jnjvm/Makefile?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/tools/jnjvm/Makefile (original) +++ vmkit/trunk/tools/jnjvm/Makefile Sun Sep 6 09:58:29 2009 @@ -11,12 +11,32 @@ include $(LEVEL)/Makefile.config TOOLNAME = jnjvm + +ifeq ($(WITH_LLVM_GCC), 1) + + USEDMODULES = JnJVM.bc Classpath.bc JnjvmCompiler.bc Allocator.bc CommonThread.bc \ + Mvm.bc MvmCompiler.bc $(GCLIB).bc + + ifeq ($(ISOLATE_SHARING_BUILD), 1) + USEDMODULES += Isolate.bc + endif + + BUILT_SOURCES = jnjvm.s + SOURCES = jnjvm.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) + +else + USEDLIBS = JnJVM.a Classpath.a JnjvmCompiler.a Allocator.a CommonThread.a \ Mvm.a MvmCompiler.a $(GCLIB).a -LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo -ifeq ($(ISOLATE_SHARING_BUILD), 1) + ifeq ($(ISOLATE_SHARING_BUILD), 1) USEDLIBS += Isolate + endif + endif + +LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo + + include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/vmkit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Makefile?rev=81119&r1=81118&r2=81119&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Makefile (original) +++ vmkit/trunk/tools/vmkit/Makefile Sun Sep 6 09:58:29 2009 @@ -12,19 +12,44 @@ TOOLNAME = vmkit -ifeq ($(WITH_JNJVM), 1) -USEDLIBS += JnJVM.a Classpath.a JnjvmCompiler.a -endif -ifeq ($(ISOLATE_SHARING_BUILD), 1) +ifeq ($(WITH_LLVM_GCC), 1) + + ifeq ($(WITH_JNJVM), 1) + USEDMODULES += JnJVM.bc Classpath.bc JnjvmCompiler.bc + endif + + ifeq ($(ISOLATE_SHARING_BUILD), 1) + USEDMODULES += Isolate.bc + endif + + ifeq ($(WITH_N3_PNETLIB), 1) + USEDMODULES += N3.bc PNetLib.bc + endif + + USEDMODULES += Allocator.bc CommonThread.bc Mvm.bc MvmCompiler.bc $(GCLIB).bc + + BUILT_SOURCES = vmkit.s + SOURCES = vmkit.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) + + +else + + ifeq ($(WITH_JNJVM), 1) + USEDLIBS += JnJVM.a Classpath.a JnjvmCompiler.a + endif + + ifeq ($(ISOLATE_SHARING_BUILD), 1) USEDLIBS += Isolate.a -endif + endif -ifeq ($(WITH_N3_PNETLIB), 1) - USEDLIBS += N3.a PNetLib.a -endif + ifeq ($(WITH_N3_PNETLIB), 1) + USEDLIBS += N3.a PNetLib.a + endif + + USEDLIBS += Allocator.a CommonThread.a Mvm.a MvmCompiler.a $(GCLIB).a -USEDLIBS += Allocator.a CommonThread.a Mvm.a MvmCompiler.a $(GCLIB).a +endif LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo From nicolas.geoffray at lip6.fr Sun Sep 6 09:19:06 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 06 Sep 2009 16:19:06 -0000 Subject: [vmkit-commits] [vmkit] r81120 - /vmkit/trunk/Makefile.rules Message-ID: <200909061619.n86GJ625023155@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 6 11:19:06 2009 New Revision: 81120 URL: http://llvm.org/viewvc/llvm-project?rev=81120&view=rev Log: Compile vmkit in bitcode mode with the frame pointer. Modified: vmkit/trunk/Makefile.rules Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=81120&r1=81119&r2=81120&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Sun Sep 6 11:19:06 2009 @@ -111,7 +111,7 @@ $(TOOLNAME).s : $(TOOLNAME).bc $(Echo) Building $(BuildMode) Assembly file $(notdir $@) $(Verb) $(LOPT) -f $(TOOLNAME).bc -o $(TOOLNAME)-optimized.bc - $(Verb) $(LLC) -f $(TOOLNAME)-optimized.bc -o $(TOOLNAME).s + $(Verb) $(LLC) -disable-fp-elim -f $(TOOLNAME)-optimized.bc -o $(TOOLNAME).s $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES) $(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG) From nicolas.geoffray at lip6.fr Sun Sep 6 09:19:43 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 06 Sep 2009 16:19:43 -0000 Subject: [vmkit-commits] [vmkit] r81121 - /vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Message-ID: <200909061619.n86GJhZb023240@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 6 11:19:43 2009 New Revision: 81121 URL: http://llvm.org/viewvc/llvm-project?rev=81121&view=rev Log: Avoid warnings. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp?rev=81121&r1=81120&r2=81121&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.cpp Sun Sep 6 11:19:43 2009 @@ -135,13 +135,13 @@ void JavaObject::wait() { JavaObject* self = this; llvm_gcroot(self, 0); - waitIntern(0, false); + self->waitIntern(0, false); } void JavaObject::timedWait(struct timeval& info) { JavaObject* self = this; llvm_gcroot(self, 0); - waitIntern(&info, true); + self->waitIntern(&info, true); } void JavaObject::notify() { From nicolas.geoffray at lip6.fr Sun Sep 6 14:37:31 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 06 Sep 2009 21:37:31 -0000 Subject: [vmkit-commits] [vmkit] r81134 - /vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Message-ID: <200909062137.n86LbV1f032508@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 6 16:37:31 2009 New Revision: 81134 URL: http://llvm.org/viewvc/llvm-project?rev=81134&view=rev Log: Add new llvm_gcroots. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=81134&r1=81133&r2=81134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Sun Sep 6 16:37:31 2009 @@ -19,11 +19,16 @@ JavaVirtualTable* JavaString::internStringVT = 0; -JavaString* JavaString::stringDup(const ArrayUInt16*& array, Jnjvm* vm) { +JavaString* JavaString::stringDup(const ArrayUInt16*& _array, Jnjvm* vm) { + + JavaString* res = 0; + const ArrayUInt16* array = 0; llvm_gcroot(array, 0); + llvm_gcroot(res, 0); + array = _array; UserClass* cl = vm->upcalls->newString; - JavaString* res = (JavaString*)cl->doNew(vm); + res = (JavaString*)cl->doNew(vm); // It's a hashed string, set the destructor so that the string // removes itself from the vm string map. Do this only if From nicolas.geoffray at lip6.fr Sun Sep 6 14:38:31 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 06 Sep 2009 21:38:31 -0000 Subject: [vmkit-commits] [vmkit] r81135 - in /vmkit/trunk: Makefile.rules include/mvm/Allocator.h lib/Mvm/Makefile lib/Mvm/StaticGCPass/ lib/Mvm/StaticGCPass/Makefile lib/Mvm/StaticGCPass/StaticGCPass.cpp Message-ID: <200909062138.n86LcVUG032645@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 6 16:38:30 2009 New Revision: 81135 URL: http://llvm.org/viewvc/llvm-project?rev=81135&view=rev Log: Output ocaml GC metadata for now when building with llvm-gcc. Added: vmkit/trunk/lib/Mvm/StaticGCPass/ vmkit/trunk/lib/Mvm/StaticGCPass/Makefile vmkit/trunk/lib/Mvm/StaticGCPass/StaticGCPass.cpp Modified: vmkit/trunk/Makefile.rules vmkit/trunk/include/mvm/Allocator.h vmkit/trunk/lib/Mvm/Makefile Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=81135&r1=81134&r2=81135&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Sun Sep 6 16:38:30 2009 @@ -110,15 +110,15 @@ $(TOOLNAME).s : $(TOOLNAME).bc $(Echo) Building $(BuildMode) Assembly file $(notdir $@) - $(Verb) $(LOPT) -f $(TOOLNAME).bc -o $(TOOLNAME)-optimized.bc - $(Verb) $(LLC) -disable-fp-elim -f $(TOOLNAME)-optimized.bc -o $(TOOLNAME).s + $(Verb) $(LOPT) -load=$(LibDir)/StaticGCPass.so -std-compile-opts -StaticGCPass -f $(TOOLNAME).bc -o vmkitoptimized.bc + $(Verb) $(LLC) -disable-fp-elim -f vmkitoptimized.bc -o $(TOOLNAME).s $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES) $(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG) $(Verb) $(Compile.C) $< -o $(ObjDir)/$*.o clean-local:: - $(Verb) $(RM) -f $(TOOLNAME)-optimized.bc $(TOOLNAME).bc $(TOOLNAME).s + $(Verb) $(RM) -f vmkitoptimized.bc $(TOOLNAME).bc $(TOOLNAME).s endif endif Modified: vmkit/trunk/include/mvm/Allocator.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Allocator.h?rev=81135&r1=81134&r2=81135&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Allocator.h (original) +++ vmkit/trunk/include/mvm/Allocator.h Sun Sep 6 16:38:30 2009 @@ -21,8 +21,8 @@ class VirtualTable; #ifdef WITH_LLVM_GCC -extern "C" void __llvm_gcroot(const void*, void*) __attribute__((nothrow)); -#define llvm_gcroot(a, b) __llvm_gcroot(&a, b) +extern "C" void __llvm_gcroot(const void**, void*) __attribute__((nothrow)); +#define llvm_gcroot(a, b) __llvm_gcroot((const void**)&a, b) #else #define llvm_gcroot(a, b) #endif Modified: vmkit/trunk/lib/Mvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Makefile?rev=81135&r1=81134&r2=81135&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Makefile (original) +++ vmkit/trunk/lib/Mvm/Makefile Sun Sep 6 16:38:30 2009 @@ -12,6 +12,6 @@ EXTRA_DIST = BoehmGC GCMmap2 -DIRS = Allocator CommonThread $(GCLIB) Runtime Compiler +DIRS = Allocator CommonThread $(GCLIB) Runtime Compiler StaticGCPass include $(LEVEL)/Makefile.common Added: vmkit/trunk/lib/Mvm/StaticGCPass/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/StaticGCPass/Makefile?rev=81135&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/StaticGCPass/Makefile (added) +++ vmkit/trunk/lib/Mvm/StaticGCPass/Makefile Sun Sep 6 16:38:30 2009 @@ -0,0 +1,16 @@ +##===- lib/Mvm/StaticGCPass/Makefile -----------------------*- Makefile -*-===## +# +# The VMKit project +# +# This file is distributed under the University of Illinois Open Source +# License. See LICENSE.TXT for details. +# +##===----------------------------------------------------------------------===## + +LEVEL = ../../.. +LIBRARYNAME = StaticGCPass +LOADABLE_MODULE = 1 +USEDLIBS = + +include $(LEVEL)/Makefile.common + Added: vmkit/trunk/lib/Mvm/StaticGCPass/StaticGCPass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/StaticGCPass/StaticGCPass.cpp?rev=81135&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/StaticGCPass/StaticGCPass.cpp (added) +++ vmkit/trunk/lib/Mvm/StaticGCPass/StaticGCPass.cpp Sun Sep 6 16:38:30 2009 @@ -0,0 +1,63 @@ +//===---- StaticGCPass.cpp - Put GC information in functions compiled --------// +//===----------------------- with llvm-gcc --------------------------------===// +// +// The VMKit project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "llvm/Intrinsics.h" +#include "llvm/Module.h" +#include "llvm/Pass.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +namespace { + + class VISIBILITY_HIDDEN StaticGCPass : public ModulePass { + public: + static char ID; + + StaticGCPass() : ModulePass((intptr_t)&ID) {} + + virtual bool runOnModule(Module& M); + + /// getAnalysisUsage - We do not modify anything. + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + } + + }; + + char StaticGCPass::ID = 0; + RegisterPass X("StaticGCPass", + "Add GC information in files compiled with llvm-gcc"); + +bool StaticGCPass::runOnModule(Module& M) { + + Function* F = M.getFunction("__llvm_gcroot"); + if (F) { + Function *gcrootFun = Intrinsic::getDeclaration(&M, Intrinsic::gcroot); + + F->replaceAllUsesWith(gcrootFun); + F->eraseFromParent(); + + for (Value::use_iterator I = gcrootFun->use_begin(), + E = gcrootFun->use_end(); I != E; ++I) { + if (Instruction* II = dyn_cast(I)) { + Function* F = II->getParent()->getParent(); + if (!F->hasGC()) F->setGC("ocaml"); + } + } + + return true; + } + + return false; +} + +} From nicolas.geoffray at lip6.fr Mon Sep 7 00:33:50 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 07 Sep 2009 07:33:50 -0000 Subject: [vmkit-commits] [vmkit] r81145 - in /vmkit/trunk: Makefile.rules tools/jnjvm/Makefile tools/n3-mono/Makefile tools/n3-pnetlib/Makefile tools/vmjc/Makefile tools/vmkit/Makefile Message-ID: <200909070733.n877XojS011349@zion.cs.uiuc.edu> Author: geoffray Date: Mon Sep 7 02:33:49 2009 New Revision: 81145 URL: http://llvm.org/viewvc/llvm-project?rev=81145&view=rev Log: Update Makefiles for al tools. Modified: vmkit/trunk/Makefile.rules vmkit/trunk/tools/jnjvm/Makefile vmkit/trunk/tools/n3-mono/Makefile vmkit/trunk/tools/n3-pnetlib/Makefile vmkit/trunk/tools/vmjc/Makefile vmkit/trunk/tools/vmkit/Makefile Modified: vmkit/trunk/Makefile.rules URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=81145&r1=81144&r2=81145&view=diff ============================================================================== --- vmkit/trunk/Makefile.rules (original) +++ vmkit/trunk/Makefile.rules Mon Sep 7 02:33:49 2009 @@ -99,26 +99,26 @@ -ifdef TOOLNAME +ifdef MODULESNAME ifdef USEDMODULES ProjLibsPaths := $(addprefix $(LibDir)/,$(USEDMODULES)) -$(TOOLNAME).bc : $(ProjLibsPaths) +$(MODULESNAME).bc : $(ProjLibsPaths) $(Echo) Building $(BuildMode) Bytecode Module $(notdir $@) $(Verb) $(LLVMLD) -L$(CFERuntimeLibDir) -r -o $@ $(ProjLibsPaths) -$(TOOLNAME).s : $(TOOLNAME).bc +$(MODULESNAME).s : $(MODULESNAME).bc $(Echo) Building $(BuildMode) Assembly file $(notdir $@) - $(Verb) $(LOPT) -load=$(LibDir)/StaticGCPass.so -std-compile-opts -StaticGCPass -f $(TOOLNAME).bc -o vmkitoptimized.bc - $(Verb) $(LLC) -disable-fp-elim -f vmkitoptimized.bc -o $(TOOLNAME).s + $(Verb) $(LOPT) -load=$(LibDir)/StaticGCPass.so -std-compile-opts -StaticGCPass -f $(MODULESNAME).bc -o vmkitoptimized.bc + $(Verb) $(LLC) -disable-fp-elim -f vmkitoptimized.bc -o $(MODULESNAME).s $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES) $(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG) $(Verb) $(Compile.C) $< -o $(ObjDir)/$*.o clean-local:: - $(Verb) $(RM) -f vmkitoptimized.bc $(TOOLNAME).bc $(TOOLNAME).s + $(Verb) $(RM) -f vmkitoptimized.bc $(MODULESNAME).bc $(MODULESNAME).s endif endif Modified: vmkit/trunk/tools/jnjvm/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/jnjvm/Makefile?rev=81145&r1=81144&r2=81145&view=diff ============================================================================== --- vmkit/trunk/tools/jnjvm/Makefile (original) +++ vmkit/trunk/tools/jnjvm/Makefile Mon Sep 7 02:33:49 2009 @@ -14,6 +14,7 @@ ifeq ($(WITH_LLVM_GCC), 1) + MODULESNAME = jnjvm USEDMODULES = JnJVM.bc Classpath.bc JnjvmCompiler.bc Allocator.bc CommonThread.bc \ Mvm.bc MvmCompiler.bc $(GCLIB).bc Modified: vmkit/trunk/tools/n3-mono/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-mono/Makefile?rev=81145&r1=81144&r2=81145&view=diff ============================================================================== --- vmkit/trunk/tools/n3-mono/Makefile (original) +++ vmkit/trunk/tools/n3-mono/Makefile Mon Sep 7 02:33:49 2009 @@ -12,8 +12,19 @@ TOOLNAME = n3-mono LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo -USEDLIBS = N3.a Mono.a Allocator.a CommonThread.a Mvm.a MvmCompiler.a \ - $(GCLIB).a + + +ifeq ($(WITH_LLVM_GCC), 1) + MODULESNAME = vmkit + USEDMODULES = N3.bc Mono.bc Allocator.bc CommonThread.bc Mvm.bc \ + MvmCompiler.bc $(GCLIB).bc + BUILT_SOURCES = vmkit.s + SOURCES = vmkit.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) +else + + USEDLIBS = N3.a Mono.a Allocator.a CommonThread.a Mvm.a MvmCompiler.a \ + $(GCLIB).a +endif include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/n3-pnetlib/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-pnetlib/Makefile?rev=81145&r1=81144&r2=81145&view=diff ============================================================================== --- vmkit/trunk/tools/n3-pnetlib/Makefile (original) +++ vmkit/trunk/tools/n3-pnetlib/Makefile Mon Sep 7 02:33:49 2009 @@ -12,8 +12,17 @@ TOOLNAME = n3-pnetlib LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo -USEDLIBS = N3.a PNetLib.a Allocator.a CommonThread.a Mvm.a MvmCompiler.a \ - $(GCLIB).a + +ifeq ($(WITH_LLVM_GCC), 1) + MODULESNAME = vmkit + USEDMODULES = N3.bc PNetLibc.bc Allocator.bc CommonThread.bc Mvm.bc \ + MvmCompiler.bc $(GCLIB).bc + BUILT_SOURCES = vmkit.s + SOURCES = vmkit.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) +else + USEDLIBS = N3.a PNetLib.a Allocator.a CommonThread.a Mvm.a MvmCompiler.a \ + $(GCLIB).a +endif include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/vmjc/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/Makefile?rev=81145&r1=81144&r2=81145&view=diff ============================================================================== --- vmkit/trunk/tools/vmjc/Makefile (original) +++ vmkit/trunk/tools/vmjc/Makefile Mon Sep 7 02:33:49 2009 @@ -13,8 +13,22 @@ EXTRA_DIST = libvmjc TOOLNAME = vmjc -USEDLIBS = JnJVM.a Classpath.a JnjvmCompiler.a Allocator.a CommonThread.a \ - Mvm.a MvmCompiler.a $(GCLIB).a + + +ifeq ($(WITH_LLVM_GCC), 1) + MODULESNAME = vmkit + USEDMODULES = JnJVM.bc Classpath.bc JnjvmCompiler.bc Allocator.bc \ + CommonThread.bc Mvm.bc MvmCompiler.bc $(GCLIB).bc + + BUILT_SOURCES = vmkit.s + SOURCES = vmkit.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) + +else + + USEDLIBS = JnJVM.a Classpath.a JnjvmCompiler.a Allocator.a CommonThread.a \ + Mvm.a MvmCompiler.a $(GCLIB).a +endif + LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo bitwriter include $(LEVEL)/Makefile.common Modified: vmkit/trunk/tools/vmkit/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Makefile?rev=81145&r1=81144&r2=81145&view=diff ============================================================================== --- vmkit/trunk/tools/vmkit/Makefile (original) +++ vmkit/trunk/tools/vmkit/Makefile Mon Sep 7 02:33:49 2009 @@ -15,6 +15,8 @@ ifeq ($(WITH_LLVM_GCC), 1) + MODULESNAME = vmkit + ifeq ($(WITH_JNJVM), 1) USEDMODULES += JnJVM.bc Classpath.bc JnjvmCompiler.bc endif From nicolas.geoffray at lip6.fr Fri Sep 11 14:53:10 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 11 Sep 2009 21:53:10 -0000 Subject: [vmkit-commits] [vmkit] r81578 - /vmkit/trunk/tools/n3-mono/Makefile Message-ID: <200909112153.n8BLrAk8029340@zion.cs.uiuc.edu> Author: geoffray Date: Fri Sep 11 16:53:10 2009 New Revision: 81578 URL: http://llvm.org/viewvc/llvm-project?rev=81578&view=rev Log: Workaround for a llvm-ld bug. Modified: vmkit/trunk/tools/n3-mono/Makefile Modified: vmkit/trunk/tools/n3-mono/Makefile URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/n3-mono/Makefile?rev=81578&r1=81577&r2=81578&view=diff ============================================================================== --- vmkit/trunk/tools/n3-mono/Makefile (original) +++ vmkit/trunk/tools/n3-mono/Makefile Fri Sep 11 16:53:10 2009 @@ -16,8 +16,8 @@ ifeq ($(WITH_LLVM_GCC), 1) MODULESNAME = vmkit - USEDMODULES = N3.bc Mono.bc Allocator.bc CommonThread.bc Mvm.bc \ - MvmCompiler.bc $(GCLIB).bc + USEDMODULES = Mono.bc Allocator.bc CommonThread.bc Mvm.bc \ + MvmCompiler.bc N3.bc $(GCLIB).bc BUILT_SOURCES = vmkit.s SOURCES = vmkit.s $(notdir $(wildcard $(PROJ_SRC_DIR)/*.cpp)) else From nicolas.geoffray at lip6.fr Sat Sep 12 15:38:06 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 12 Sep 2009 22:38:06 -0000 Subject: [vmkit-commits] [vmkit] r81642 - /vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Message-ID: <200909122238.n8CMc67o006392@zion.cs.uiuc.edu> Author: geoffray Date: Sat Sep 12 17:38:06 2009 New Revision: 81642 URL: http://llvm.org/viewvc/llvm-project?rev=81642&view=rev Log: Add vmkit's GC for JIT-generated functions. Added: vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Added: vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp?rev=81642&view=auto ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp (added) +++ vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Sat Sep 12 17:38:06 2009 @@ -0,0 +1,29 @@ +//===------- VmkitGC.cpp - GC for JIT-generated functions -----------------===// +// +// The VMKit project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "llvm/CodeGen/GCs.h" +#include "llvm/CodeGen/GCStrategy.h" +#include "llvm/Support/Compiler.h" + +using namespace llvm; + +namespace { + class VISIBILITY_HIDDEN VmkitGC : public GCStrategy { + public: + VmkitGC(); + }; +} + +static GCRegistry::Add +X("vmkit", "VMKit GC for JIT-generated functions"); + +VmkitGC::VmkitGC() { + NeededSafePoints = 1 << GC::PostCall; +} From nicolas.geoffray at lip6.fr Sat Sep 12 15:42:52 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 12 Sep 2009 22:42:52 -0000 Subject: [vmkit-commits] [vmkit] r81643 - /vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Message-ID: <200909122242.n8CMgqP3007068@zion.cs.uiuc.edu> Author: geoffray Date: Sat Sep 12 17:42:51 2009 New Revision: 81643 URL: http://llvm.org/viewvc/llvm-project?rev=81643&view=rev Log: Put gc alloca at the beginning of a native function. Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=81643&r1=81642&r2=81643&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Sat Sep 12 17:42:51 2009 @@ -356,8 +356,8 @@ currentBlock = NotZero; - Value* temp = new AllocaInst(module->JavaObjectType, "", - currentBlock); + Instruction* temp = new AllocaInst(module->JavaObjectType, "", + func->begin()->begin()); Value* GCArgs[2] = { new BitCastInst(temp, module->ptrPtrType, "", currentBlock), module->constantPtrNull @@ -365,7 +365,7 @@ if (TheCompiler->useCooperativeGC()) { CallInst::Create(module->llvm_gc_gcroot, GCArgs, GCArgs + 2, "", - currentBlock); + temp); } new StoreInst(i, temp, false, currentBlock); From nicolas.geoffray at lip6.fr Sat Sep 12 15:45:25 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sat, 12 Sep 2009 22:45:25 -0000 Subject: [vmkit-commits] [vmkit] r81645 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/GCInfoPass.cpp lib/JnJVM/Compiler/JITInfo.cpp lib/JnJVM/Compiler/JnjvmModule.cpp Message-ID: <200909122245.n8CMjPMf007426@zion.cs.uiuc.edu> Author: geoffray Date: Sat Sep 12 17:45:24 2009 New Revision: 81645 URL: http://llvm.org/viewvc/llvm-project?rev=81645&view=rev Log: Set the GC for JIT-generated functions and get back the frame layout from LLVM during a compilation pass. Added: vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=81645&r1=81644&r2=81645&view=diff ============================================================================== --- vmkit/trunk/include/jnjvm/JnjvmModule.h (original) +++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sat Sep 12 17:45:24 2009 @@ -26,6 +26,7 @@ class FunctionPassManager; class FunctionType; class GlobalVariable; + class GCFunctionInfo; class Module; class Type; class Value; @@ -110,15 +111,17 @@ public: + llvm::GCFunctionInfo* GCInfo; llvm::Function* getMethod(); llvm::Constant* getOffset(); const llvm::FunctionType* getFunctionType(); LLVMMethodInfo(JavaMethod* M) : methodDef(M), methodFunction(0), - offsetConstant(0), functionType(0) {} + offsetConstant(0), functionType(0), GCInfo(0) {} virtual void clear() { + GCInfo = 0; methodFunction = 0; offsetConstant = 0; functionType = 0; Added: vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp?rev=81645&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp (added) +++ vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp Sat Sep 12 17:45:24 2009 @@ -0,0 +1,57 @@ +//===---- GCInfoPass.cpp - Get GC info for JIT-generated functions --------===// +// +// The VMKit project +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + + +#include "llvm/Function.h" +#include "llvm/Pass.h" +#include "llvm/CodeGen/GCMetadata.h" +#include "llvm/Support/Compiler.h" + +#include "jnjvm/JnjvmModule.h" + +using namespace jnjvm; +using namespace llvm; + +namespace { + class VISIBILITY_HIDDEN GCInfoPass : public FunctionPass { + public: + static char ID; + JavaLLVMCompiler* Comp; + GCInfoPass(JavaLLVMCompiler* C) : FunctionPass(&ID) { + Comp = C; + } + + void getAnalysisUsage(AnalysisUsage &AU) const { + FunctionPass::getAnalysisUsage(AU); + AU.setPreservesAll(); + AU.addRequired(); + } + + bool runOnFunction(Function &F) { + // Quick exit for functions that do not use GC. + assert(F.hasGC() && "Function without GC"); + GCFunctionInfo &FI = getAnalysis().getFunctionInfo(F); + JavaMethod* meth = Comp->getJavaMethod(&F); + assert(meth && "Function without a Java method"); + + LLVMMethodInfo* LMI = Comp->getMethodInfo(meth); + LMI->GCInfo = &FI; + return false; + } + }; +} + +char GCInfoPass::ID = 0; + +namespace jnjvm { + FunctionPass* createGCInfo(JavaLLVMCompiler* C) { + return new GCInfoPass(C); + } +} + Modified: vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp?rev=81645&r1=81644&r2=81645&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp Sat Sep 12 17:45:24 2009 @@ -169,6 +169,11 @@ "", Mod->getLLVMModule()); } + + if (Mod->useCooperativeGC()) { + methodFunction->setGC("vmkit"); + } + Mod->functions.insert(std::make_pair(methodFunction, methodDef)); } return methodFunction; Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=81645&r1=81644&r2=81645&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Sat Sep 12 17:45:24 2009 @@ -67,7 +67,7 @@ JavaIntrinsics(TheModule) { enabledException = true; - cooperativeGC = false; + cooperativeGC = true; } void JavaLLVMCompiler::resolveVirtualClass(Class* cl) { @@ -377,6 +377,7 @@ namespace jnjvm { llvm::FunctionPass* createLowerConstantCallsPass(JnjvmModule* M); + llvm::FunctionPass* createGCInfo(JavaLLVMCompiler* Comp); } void JavaLLVMCompiler::addJavaPasses() { @@ -385,12 +386,16 @@ // Lower constant calls to lower things like getClass used // on synchronized methods. JavaNativeFunctionPasses->add(createLowerConstantCallsPass(getIntrinsics())); + JavaNativeFunctionPasses->add(createGCInfo(this)); JavaFunctionPasses = new FunctionPassManager(TheModuleProvider); JavaFunctionPasses->add(new TargetData(TheModule)); if (cooperativeGC) JavaFunctionPasses->add(mvm::createLoopSafePointsPass()); - JavaFunctionPasses->add(mvm::createEscapeAnalysisPass()); + // Re-enable this when the pointers in stack-allocated objects can + // be given to the GC. + //JavaFunctionPasses->add(mvm::createEscapeAnalysisPass()); JavaFunctionPasses->add(createLowerConstantCallsPass(getIntrinsics())); + JavaFunctionPasses->add(createGCInfo(this)); } From nicolas.geoffray at lip6.fr Sun Sep 13 10:07:39 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 13 Sep 2009 17:07:39 -0000 Subject: [vmkit-commits] [vmkit] r81676 - in /vmkit/trunk: include/mvm/Threads/Thread.h lib/JnJVM/VMCore/JavaThread.h Message-ID: <200909131707.n8DH7daM026189@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 13 12:07:39 2009 New Revision: 81676 URL: http://llvm.org/viewvc/llvm-project?rev=81676&view=rev Log: Move the addresses field from jnjvm::JavaThread to mvm::Thread. Modified: vmkit/trunk/include/mvm/Threads/Thread.h vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Modified: vmkit/trunk/include/mvm/Threads/Thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=81676&r1=81675&r2=81676&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Thread.h (original) +++ vmkit/trunk/include/mvm/Threads/Thread.h Sun Sep 13 12:07:39 2009 @@ -11,6 +11,7 @@ #define MVM_THREAD_H #include +#include #include "types.h" @@ -273,6 +274,11 @@ /// handler. /// virtual void printBacktraceAfterSignal() {} + + /// addresses - The list of return addresses which represent native/app cross + /// calls. + /// + std::vector addresses; }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=81676&r1=81675&r2=81676&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Sun Sep 13 12:07:39 2009 @@ -114,11 +114,6 @@ /// void* currentSjljBuffer; - /// addresses - The list of return addresses which represent native/Java cross - /// calls. - /// - std::vector addresses; - /// currentAddedReferences - Current number of added local references. /// uint32_t* currentAddedReferences; From nicolas.geoffray at lip6.fr Sun Sep 13 12:58:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 13 Sep 2009 19:58:58 -0000 Subject: [vmkit-commits] [vmkit] r81706 - /vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Message-ID: <200909131958.n8DJwwru016810@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 13 14:58:57 2009 New Revision: 81706 URL: http://llvm.org/viewvc/llvm-project?rev=81706&view=rev Log: Fix error from last commit: continue to not be cooperative. Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=81706&r1=81705&r2=81706&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Sun Sep 13 14:58:57 2009 @@ -67,7 +67,7 @@ JavaIntrinsics(TheModule) { enabledException = true; - cooperativeGC = true; + cooperativeGC = false; } void JavaLLVMCompiler::resolveVirtualClass(Class* cl) { @@ -397,5 +397,6 @@ // be given to the GC. //JavaFunctionPasses->add(mvm::createEscapeAnalysisPass()); JavaFunctionPasses->add(createLowerConstantCallsPass(getIntrinsics())); - JavaFunctionPasses->add(createGCInfo(this)); + if (cooperativeGC) + JavaFunctionPasses->add(createGCInfo(this)); } From nicolas.geoffray at lip6.fr Sun Sep 13 13:10:29 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 13 Sep 2009 20:10:29 -0000 Subject: [vmkit-commits] [vmkit] r81708 - /vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Message-ID: <200909132010.n8DKATpG018314@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 13 15:10:28 2009 New Revision: 81708 URL: http://llvm.org/viewvc/llvm-project?rev=81708&view=rev Log: Don't create a GCInfo pass if the compiler is non-cooperative. Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=81708&r1=81707&r2=81708&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Sun Sep 13 15:10:28 2009 @@ -386,7 +386,8 @@ // Lower constant calls to lower things like getClass used // on synchronized methods. JavaNativeFunctionPasses->add(createLowerConstantCallsPass(getIntrinsics())); - JavaNativeFunctionPasses->add(createGCInfo(this)); + if (cooperativeGC) + JavaNativeFunctionPasses->add(createGCInfo(this)); JavaFunctionPasses = new FunctionPassManager(TheModuleProvider); JavaFunctionPasses->add(new TargetData(TheModule)); From nicolas.geoffray at lip6.fr Sun Sep 13 13:29:53 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 13 Sep 2009 20:29:53 -0000 Subject: [vmkit-commits] [vmkit] r81713 - in /vmkit/trunk/lib/Mvm/Compiler: JIT.cpp VmkitGC.cpp Message-ID: <200909132029.n8DKTrH2020820@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 13 15:29:53 2009 New Revision: 81713 URL: http://llvm.org/viewvc/llvm-project?rev=81713&view=rev Log: Add a function to force linking vmkit's GC. Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/JIT.cpp?rev=81713&r1=81712&r2=81713&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Sun Sep 13 15:29:53 2009 @@ -39,6 +39,7 @@ namespace llvm_runtime { #include "LLVMRuntime.inc" } + void linkVmkitGC(); } const char* MvmModule::getHostTriple() { @@ -48,6 +49,7 @@ void MvmModule::initialise(CodeGenOpt::Level level, Module* M, TargetMachine* T) { + mvm::linkVmkitGC(); llvm_start_multithreaded(); Modified: vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp?rev=81713&r1=81712&r2=81713&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp (original) +++ vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Sun Sep 13 15:29:53 2009 @@ -21,6 +21,10 @@ }; } +namespace mvm { + void linkVmkitGC() { } +} + static GCRegistry::Add X("vmkit", "VMKit GC for JIT-generated functions"); From nicolas.geoffray at lip6.fr Sun Sep 13 14:26:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Sun, 13 Sep 2009 21:26:58 -0000 Subject: [vmkit-commits] [vmkit] r81717 - in /vmkit/trunk/lib/JnJVM: Compiler/JnjvmModule.cpp LLVMRuntime/runtime-default.ll Message-ID: <200909132126.n8DLQx7d028087@zion.cs.uiuc.edu> Author: geoffray Date: Sun Sep 13 16:26:58 2009 New Revision: 81717 URL: http://llvm.org/viewvc/llvm-project?rev=81717&view=rev Log: Fix offsets in mvm::Thread fields. Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=81717&r1=81716&r2=81717&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Sun Sep 13 16:26:58 2009 @@ -204,11 +204,11 @@ OffsetDoYieldInThreadConstant = ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 6); OffsetJNIInThreadConstant = - ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 12); - OffsetJavaExceptionInThreadConstant = ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 13); - OffsetCXXExceptionInThreadConstant = + OffsetJavaExceptionInThreadConstant = ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 14); + OffsetCXXExceptionInThreadConstant = + ConstantInt::get(Type::getInt32Ty(getGlobalContext()), 15); ClassReadyConstant = ConstantInt::get(Type::getInt8Ty(getGlobalContext()), ready); Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=81717&r1=81716&r2=81717&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original) +++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Sun Sep 13 16:26:58 2009 @@ -34,6 +34,8 @@ ;;; Field 3: The static instance %TaskClassMirror = type { i8, i1, i8* } +%Vector = type {i32, i8*, i8*} + ;;; Field 0: the VT of threads ;;; Field 1: next ;;; Field 2: prev @@ -46,11 +48,12 @@ ;;; Field 9: lastSP ;;; Field 10: internalThreadID ;;; field 11: routine -;;; field 12: jnienv -;;; field 13: Java pendingException -;;; field 14: CXX pendingException +;;; field 12: addresses +;;; field 13: jnienv +;;; field 14: Java pendingException +;;; field 15: CXX pendingException %JavaThread = type { %VT*, %JavaThread*, %JavaThread*, i8*, i8*, i8*, i1, i1, - i1, i8*, i8*, i8*, i8*, %JavaObject*, i8* } + i1, i8*, i8*, i8*, %Vector, i8*, %JavaObject*, i8* } %Attribut = type { %UTF8*, i32, i32 } From nicolas.geoffray at lip6.fr Mon Sep 14 09:20:07 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Mon, 14 Sep 2009 16:20:07 -0000 Subject: [vmkit-commits] [vmkit] r81767 - in /vmkit/trunk: include/mvm/Threads/Thread.h lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JavaThread.h lib/Mvm/CommonThread/ctthread.cpp Message-ID: <200909141620.n8EGK756025660@zion.cs.uiuc.edu> Author: geoffray Date: Mon Sep 14 11:20:07 2009 New Revision: 81767 URL: http://llvm.org/viewvc/llvm-project?rev=81767&view=rev Log: Move the startNative and endNative functions in the mvm::Thread class. Modified: vmkit/trunk/include/mvm/Threads/Thread.h vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Modified: vmkit/trunk/include/mvm/Threads/Thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=81767&r1=81766&r2=81767&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Thread.h (original) +++ vmkit/trunk/include/mvm/Threads/Thread.h Mon Sep 14 11:20:07 2009 @@ -10,6 +10,7 @@ #ifndef MVM_THREAD_H #define MVM_THREAD_H +#include #include #include @@ -279,6 +280,18 @@ /// calls. /// std::vector addresses; + + /// startNative - Record that we are entering native code. + /// + void startNative(int level) __attribute__ ((noinline)); + + /// endNative - Record that we are leaving native code. + /// + void endNative() { + assert(!(addresses.size() % 2) && "Wrong stack"); + addresses.pop_back(); + } + }; Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=81767&r1=81766&r2=81767&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Mon Sep 14 11:20:07 2009 @@ -80,19 +80,6 @@ __cxa_throw(exc, 0, 0); } -void JavaThread::startNative(int level) { - // Caller of this function. - void** cur = (void**)FRAME_PTR(); - - while (level--) - cur = (void**)cur[0]; - - // When entering, the number of addresses should be odd. - assert((addresses.size() % 2) && "Wrong stack"); - - addresses.push_back(cur); -} - void JavaThread::startJNI(int level) { // Caller of this function. void** cur = (void**)FRAME_PTR(); Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=81767&r1=81766&r2=81767&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon Sep 14 11:20:07 2009 @@ -210,12 +210,8 @@ addresses.pop_back(); throwPendingException(); } - - /// startNative - Record that we are entering native code. - /// - void startNative(int level) __attribute__ ((noinline)); - /// startNative - Record that we are entering native code. + /// startJNI - Record that we are entering native code. /// void startJNI(int level) __attribute__ ((noinline)); @@ -223,13 +219,6 @@ /// void startJava() __attribute__ ((noinline)); - /// endNative - Record that we are leaving native code. - /// - void endNative() { - assert(!(addresses.size() % 2) && "Wrong stack"); - addresses.pop_back(); - } - void endJNI() { assert(!(addresses.size() % 2) && "Wrong stack"); Modified: vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp?rev=81767&r1=81766&r2=81767&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp (original) +++ vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Mon Sep 14 11:20:07 2009 @@ -48,6 +48,18 @@ Collector::traceStackThread(); } +void Thread::startNative(int level) { + // Caller of this function. + void** cur = (void**)FRAME_PTR(); + + while (level--) + cur = (void**)cur[0]; + + // When entering, the number of addresses should be odd. + assert((addresses.size() % 2) && "Wrong stack"); + + addresses.push_back(cur); +} uintptr_t Thread::baseAddr = 0; From nicolas.geoffray at lip6.fr Wed Sep 16 01:54:17 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 08:54:17 -0000 Subject: [vmkit-commits] [vmkit] r82030 - /vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Message-ID: <200909160854.n8G8sHJT014049@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 03:54:16 2009 New Revision: 82030 URL: http://llvm.org/viewvc/llvm-project?rev=82030&view=rev Log: Get the callback buffer before entering Java code: getting the buffer may yield a GC, so the thread should be in native mode and not in Java mode. Also, readArgs after any point that may lead to a GC: the arguments will be in a buffer and we won't be able to copy them. TODO: make sure that's GC-copying safe. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=82030&r1=82029&r2=82030&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Sep 16 03:54:16 2009 @@ -79,13 +79,14 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - readArgs(buf, sign, ap, jni); \ void* func = (((void***)obj)[0])[offset];\ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ + readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\ + res = call(cl->getConstantPool(), func, obj, _buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -98,13 +99,14 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - readArgs(buf, sign, ap, jni); \ void* func = this->compiledPtr();\ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ + readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\ + res = call(cl->getConstantPool(), func, obj, _buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -121,13 +123,14 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - readArgs(buf, sign, ap, jni); \ void* func = this->compiledPtr();\ + FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \ + readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ - res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, _buf);\ + res = call(cl->getConstantPool(), func, _buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -139,11 +142,12 @@ verifyNull(obj);\ Signdef* sign = getSignature(); \ void* func = (((void***)obj)[0])[offset];\ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -155,11 +159,12 @@ 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; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -175,11 +180,12 @@ \ 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; \ try { \ - res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\ + res = call(cl->getConstantPool(), func, buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -219,11 +225,12 @@ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ + FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\ + res = call(cl->getConstantPool(), func, obj, ap);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -235,11 +242,12 @@ 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; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\ + res = call(cl->getConstantPool(), func, obj, ap);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -255,11 +263,12 @@ \ 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; \ try { \ - res = ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(cl->getConstantPool(), func, ap);\ + res = call(cl->getConstantPool(), func, ap);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -271,11 +280,12 @@ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -287,11 +297,12 @@ 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; \ try { \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -307,11 +318,12 @@ \ 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; \ try { \ - res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\ + res = call(cl->getConstantPool(), func, buf);\ } catch (...) { \ th->throwFromJava(); \ } \ @@ -355,12 +367,13 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - readArgs(buf, sign, ap, jni); \ void* func = (((void***)obj)[0])[offset];\ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ + readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\ + res = call(cl->getConstantPool(), func, obj, _buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -373,12 +386,13 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - readArgs(buf, sign, ap, jni); \ void* func = this->compiledPtr();\ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ + readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\ + res = call(cl->getConstantPool(), func, obj, _buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -395,12 +409,13 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - readArgs(buf, sign, ap, jni); \ void* func = this->compiledPtr();\ + FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \ + readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, _buf);\ + res = call(cl->getConstantPool(), func, _buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -412,10 +427,11 @@ verifyNull(obj);\ Signdef* sign = getSignature(); \ void* func = (((void***)obj)[0])[offset];\ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -427,10 +443,11 @@ 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; \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -446,10 +463,11 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ + FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\ + res = call(cl->getConstantPool(), func, buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -489,10 +507,11 @@ verifyNull(obj); \ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ + FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\ + res = call(cl->getConstantPool(), func, obj, ap);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -504,10 +523,11 @@ 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; \ - res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\ + res = call(cl->getConstantPool(), func, obj, ap);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -523,10 +543,11 @@ \ 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; \ - res = ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(cl->getConstantPool(), func, ap);\ + res = call(cl->getConstantPool(), func, ap);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -538,10 +559,11 @@ verifyNull(obj);\ void* func = (((void***)obj)[0])[offset];\ Signdef* sign = getSignature(); \ + FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -553,10 +575,11 @@ 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; \ - res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\ + res = call(cl->getConstantPool(), func, obj, buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -572,10 +595,11 @@ \ 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; \ - res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\ + res = call(cl->getConstantPool(), func, buf);\ if (th->pendingException) { \ th->throwFromJava(); \ } \ @@ -644,6 +668,7 @@ void Jnjvm::invokeFinalizer(gc* _obj) { JavaObject* obj = (JavaObject*)_obj; + llvm_gcroot(obj, 0); JavaMethod* meth = upcalls->FinalizeObject; UserClass* cl = obj->getClass()->asClass(); meth->invokeIntVirtualBuf(this, cl, obj, 0); @@ -651,6 +676,7 @@ bool Jnjvm::enqueueReference(gc* _obj) { JavaObject* obj = (JavaObject*)_obj; + llvm_gcroot(obj, 0); JavaMethod* meth = upcalls->EnqueueReference; UserClass* cl = obj->getClass()->asClass(); return (bool)meth->invokeIntSpecialBuf(this, cl, obj, 0); From nicolas.geoffray at lip6.fr Wed Sep 16 02:02:30 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 09:02:30 -0000 Subject: [vmkit-commits] [vmkit] r82031 - /vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Message-ID: <200909160902.n8G92Ukh015161@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 04:02:30 2009 New Revision: 82031 URL: http://llvm.org/viewvc/llvm-project?rev=82031&view=rev Log: Update comments and set jnjvmStringLookup as being a native function. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=82031&r1=82030&r2=82031&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Wed Sep 16 04:02:30 2009 @@ -377,7 +377,7 @@ return res; } -// Does not call Java code. +// Does not call Java code. Can not yield a GC. extern "C" void jnjvmEndJNI(uint32** oldLRN, void** oldBuffer) { JavaThread* th = JavaThread::get(); @@ -391,15 +391,9 @@ th->currentAddedReferences = *oldLRN; -#ifdef DWARF_EXCEPTIONS - // If there's an exception, throw it now. - if (JavaThread::get()->pendingException) { - th->throwPendingException(); - } -#endif } -// Never throws. +// Never throws. Does not call Java code. Can not yied a GC. extern "C" void** jnjvmStartJNI(uint32* localReferencesNumber, uint32** oldLocalReferencesNumber, void* newBuffer, void** oldBuffer) { @@ -419,17 +413,25 @@ // Never throws. extern "C" void jnjvmJavaObjectAquire(JavaObject* obj) { + BEGIN_NATIVE_EXCEPTION(1) + llvm_gcroot(obj, 0); obj->acquire(); + + END_NATIVE_EXCEPTION } // Never throws. extern "C" void jnjvmJavaObjectRelease(JavaObject* obj) { + BEGIN_NATIVE_EXCEPTION(1) + llvm_gcroot(obj, 0); obj->release(); + + END_NATIVE_EXCEPTION } -// Does not call any Java code. +// Does not call any Java code. Can not yield a GC. extern "C" void jnjvmThrowException(JavaObject* obj) { return JavaThread::get()->throwException(obj); } @@ -629,12 +631,20 @@ } extern "C" void* jnjvmStringLookup(UserClass* cl, uint32 index) { + + JavaString** str = 0; + + BEGIN_NATIVE_EXCEPTION(1) + UserConstantPool* ctpInfo = cl->getConstantPool(); const UTF8* utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[index]); - JavaString** str = cl->classLoader->UTF8ToStr(utf8); + str = cl->classLoader->UTF8ToStr(utf8); #if defined(ISOLATE_SHARING) || !defined(ISOLATE) ctpInfo->ctpRes[index] = str; #endif + + END_NATIVE_EXCEPTION + return (void*)str; } From nicolas.geoffray at lip6.fr Wed Sep 16 02:06:04 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 09:06:04 -0000 Subject: [vmkit-commits] [vmkit] r82032 - /vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.inc Message-ID: <200909160906.n8G964A4015692@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 04:06:03 2009 New Revision: 82032 URL: http://llvm.org/viewvc/llvm-project?rev=82032&view=rev Log: Embrace nativeGetBootPackages with exception macros. Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.inc Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.inc URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.inc?rev=82032&r1=82031&r2=82032&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.inc (original) +++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.inc Wed Sep 16 04:06:03 2009 @@ -352,11 +352,16 @@ ArrayObject* obj = 0; llvm_gcroot(obj, 0); + BEGIN_NATIVE_EXCEPTION(0) + Jnjvm* vm = JavaThread::get()->getJVM(); obj = (ArrayObject*)vm->upcalls->ArrayOfString->doNew(NUM_BOOT_PACKAGES, vm); for (uint32 i = 0; i < NUM_BOOT_PACKAGES; ++i) { obj->elements[i] = vm->asciizToStr(bootPackages[i]); } + + END_NATIVE_EXCEPTION + return obj; } From nicolas.geoffray at lip6.fr Wed Sep 16 02:38:38 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 09:38:38 -0000 Subject: [vmkit-commits] [vmkit] r82035 - /vmkit/trunk/lib/Mvm/Allocator/gcmapper.cpp Message-ID: <200909160938.n8G9cc7W020412@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 04:38:37 2009 New Revision: 82035 URL: http://llvm.org/viewvc/llvm-project?rev=82035&view=rev Log: Fix compilation for Snow Leopard. Patch by Argyris Kyrtzidis! Modified: vmkit/trunk/lib/Mvm/Allocator/gcmapper.cpp Modified: vmkit/trunk/lib/Mvm/Allocator/gcmapper.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Allocator/gcmapper.cpp?rev=82035&r1=82034&r2=82035&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Allocator/gcmapper.cpp (original) +++ vmkit/trunk/lib/Mvm/Allocator/gcmapper.cpp Wed Sep 16 04:38:37 2009 @@ -34,7 +34,7 @@ { void * res = addr; if (new_size < old_size) - DO_MUNMAP((void*)((int)addr + new_size), old_size - new_size); + DO_MUNMAP((void*)((intptr_t)addr + new_size), old_size - new_size); else if (new_size > old_size) // Use of MAP_FIXED is discouraged... // res = mmap(addr, new_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, MAP_FIXED); From nicolas.geoffray at lip6.fr Wed Sep 16 02:43:18 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 09:43:18 -0000 Subject: [vmkit-commits] [vmkit] r82036 - /vmkit/trunk/lib/JnJVM/Classpath/JavaUpcalls.cpp Message-ID: <200909160943.n8G9hIoU021015@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 04:43:18 2009 New Revision: 82036 URL: http://llvm.org/viewvc/llvm-project?rev=82036&view=rev Log: Embrace native Java functions with BEGIN_NATIVE_EXCEPTION. Modified: vmkit/trunk/lib/JnJVM/Classpath/JavaUpcalls.cpp Modified: vmkit/trunk/lib/JnJVM/Classpath/JavaUpcalls.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/JavaUpcalls.cpp?rev=82036&r1=82035&r2=82036&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Classpath/JavaUpcalls.cpp (original) +++ vmkit/trunk/lib/JnJVM/Classpath/JavaUpcalls.cpp Wed Sep 16 04:43:18 2009 @@ -293,9 +293,13 @@ llvm_gcroot(reference, 0); llvm_gcroot(referent, 0); + BEGIN_NATIVE_EXCEPTION(0) + reference->init(referent, 0); JavaThread::get()->getJVM()->addWeakReference(reference); + END_NATIVE_EXCEPTION + } extern "C" void nativeInitWeakReferenceQ(JavaObjectReference* reference, @@ -305,8 +309,12 @@ llvm_gcroot(referent, 0); llvm_gcroot(queue, 0); + BEGIN_NATIVE_EXCEPTION(0) + reference->init(referent, queue); JavaThread::get()->getJVM()->addWeakReference(reference); + + END_NATIVE_EXCEPTION } @@ -315,8 +323,12 @@ llvm_gcroot(reference, 0); llvm_gcroot(referent, 0); + BEGIN_NATIVE_EXCEPTION(0) + reference->init(referent, 0); JavaThread::get()->getJVM()->addSoftReference(reference); + + END_NATIVE_EXCEPTION } @@ -326,9 +338,13 @@ llvm_gcroot(reference, 0); llvm_gcroot(referent, 0); llvm_gcroot(queue, 0); - + + BEGIN_NATIVE_EXCEPTION(0) + reference->init(referent, queue); JavaThread::get()->getJVM()->addSoftReference(reference); + + END_NATIVE_EXCEPTION } @@ -339,25 +355,42 @@ llvm_gcroot(referent, 0); llvm_gcroot(queue, 0); + BEGIN_NATIVE_EXCEPTION(0) + reference->init(referent, queue); JavaThread::get()->getJVM()->addPhantomReference(reference); + END_NATIVE_EXCEPTION } extern "C" JavaString* nativeInternString(JavaString* obj) { const ArrayUInt16* array = 0; + JavaString* res = 0; llvm_gcroot(obj, 0); llvm_gcroot(array, 0); + llvm_gcroot(res, 0); + + BEGIN_NATIVE_EXCEPTION(0) Jnjvm* vm = JavaThread::get()->getJVM(); array = obj->strToArray(vm); - return vm->constructString(array); + res = vm->constructString(array); + + END_NATIVE_EXCEPTION + + return res; } extern "C" uint8 nativeIsArray(JavaObjectClass* klass) { llvm_gcroot(klass, 0); + UserCommonClass* cl = 0; - UserCommonClass* cl = klass->getClass(); + BEGIN_NATIVE_EXCEPTION(0) + + cl = klass->getClass(); + + END_NATIVE_EXCEPTION + return (uint8)cl->isArray(); } @@ -371,6 +404,7 @@ JavaThread* th = JavaThread::get(); UserClass* cl = th->getCallingClass(1); if (cl) res = cl->getClassDelegatee(th->getJVM()); + END_NATIVE_EXCEPTION return res; @@ -382,9 +416,11 @@ llvm_gcroot(res, 0); BEGIN_NATIVE_EXCEPTION(0) + JavaThread* th = JavaThread::get(); UserClass* cl = th->getCallingClass(1); res = cl->classLoader->getJavaClassLoader(); + END_NATIVE_EXCEPTION return res; @@ -395,8 +431,10 @@ llvm_gcroot(res, 0); BEGIN_NATIVE_EXCEPTION(0) + JavaThread* th = JavaThread::get(); res = th->getNonNullClassLoader(); + END_NATIVE_EXCEPTION return res; @@ -408,10 +446,12 @@ llvm_gcroot(res, 0); BEGIN_NATIVE_EXCEPTION(0) + JavaThread* th = JavaThread::get(); Jnjvm* vm = th->getJVM(); UserClass* cl = th->getCallingClassLevel(index); if (cl) res = cl->getClassDelegatee(vm); + END_NATIVE_EXCEPTION return res; @@ -423,9 +463,18 @@ } extern "C" JavaObject* nativeGetDeclaredAnnotations() { + JavaObject* res = 0; + llvm_gcroot(res, 0); + + BEGIN_NATIVE_EXCEPTION(0) + Jnjvm* vm = JavaThread::get()->getJVM(); UserClassArray* array = vm->upcalls->constructorArrayAnnotation; - return array->doNew(0, vm); + res = array->doNew(0, vm); + + END_NATIVE_EXCEPTION + + return res; } extern "C" void nativePropertiesPostInit(JavaObject* prop); @@ -459,16 +508,23 @@ extern "C" ArrayObject* nativeGetBootPackages(); extern "C" JavaString* nativeGetenv(JavaString* str) { + JavaString* ret = 0; llvm_gcroot(str, 0); + llvm_gcroot(ret, 0); + + BEGIN_NATIVE_EXCEPTION(0) char* buf = str->strToAsciiz(); char* res = getenv(buf); delete[] buf; if (res) { Jnjvm* vm = JavaThread::get()->getJVM(); - return vm->asciizToStr(res); + ret = vm->asciizToStr(res); } - return 0; + + END_NATIVE_EXCEPTION + + return ret; } void Classpath::initialiseClasspath(JnjvmClassLoader* loader) { From nicolas.geoffray at lip6.fr Wed Sep 16 03:15:28 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 10:15:28 -0000 Subject: [vmkit-commits] [vmkit] r82037 - /vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Message-ID: <200909161015.n8GAFSIR025136@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 05:15:27 2009 New Revision: 82037 URL: http://llvm.org/viewvc/llvm-project?rev=82037&view=rev Log: Lookup the virtual method instead of using a stub so that the thread manager can understand its call stack. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=82037&r1=82036&r2=82037&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Sep 16 05:15:27 2009 @@ -69,6 +69,13 @@ // calling). //===----------------------------------------------------------------------===// +//===----------------------------------------------------------------------===// +// Also, virtual calls must not be used with stubs, because the thread manager +// won't understand the frame layout of a CallBuf/CallAP calling +// LLVM code (hence native code). Therefore, lookup the real JavaMethod, +// compile it, and give it to the CallBuf/CallAP. +//===----------------------------------------------------------------------===// + #if defined(DWARF_EXCEPTIONS) #if 1//defined(__PPC__) && !defined(__MACH__) @@ -79,7 +86,13 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ @@ -141,7 +154,13 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ Signdef* sign = getSignature(); \ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ @@ -223,7 +242,13 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \ verifyNull(obj); \ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \ JavaThread* th = JavaThread::get(); \ @@ -278,7 +303,13 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ @@ -367,7 +398,13 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ readArgs(buf, sign, ap, jni); \ JavaThread* th = JavaThread::get(); \ @@ -426,7 +463,13 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ Signdef* sign = getSignature(); \ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ @@ -505,7 +548,13 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \ verifyNull(obj); \ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \ JavaThread* th = JavaThread::get(); \ @@ -557,7 +606,13 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ - void* func = (((void***)obj)[0])[offset];\ + JavaMethod* meth = this; \ + if (classDef != cl) {\ + UserClass* cl2 = 0; \ + meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ + assert(cl2 == cl && "Different classes in invoke virtual"); \ + } \ + void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ From nicolas.geoffray at lip6.fr Wed Sep 16 06:13:06 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 13:13:06 -0000 Subject: [vmkit-commits] [vmkit] r82044 - /vmkit/trunk/include/mvm/Threads/Thread.h Message-ID: <200909161313.n8GDD6BC015395@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 08:13:05 2009 New Revision: 82044 URL: http://llvm.org/viewvc/llvm-project?rev=82044&view=rev Log: When entering uncooperative mode, set the lastSP as a "living" lastSP: the data it points to won't be replaced while the thread is executing uncooperative code. Modified: vmkit/trunk/include/mvm/Threads/Thread.h Modified: vmkit/trunk/include/mvm/Threads/Thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=82044&r1=82043&r2=82044&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Thread.h (original) +++ vmkit/trunk/include/mvm/Threads/Thread.h Wed Sep 16 08:13:05 2009 @@ -197,9 +197,10 @@ void* getLastSP() { return lastSP; } void setLastSP(void* V) { lastSP = V; } - void enterUncooperativeCode() { + void enterUncooperativeCode(unsigned level = 0) { if (isMvmThread()) { lastSP = __builtin_frame_address(0); + while (level--) lastSP = ((void**)lastSP)[0]; if (doYield && !inGC) joinCollection(); } } From nicolas.geoffray at lip6.fr Wed Sep 16 06:14:09 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 13:14:09 -0000 Subject: [vmkit-commits] [vmkit] r82045 - /vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Message-ID: <200909161314.n8GDE91Y015534@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 08:14:08 2009 New Revision: 82045 URL: http://llvm.org/viewvc/llvm-project?rev=82045&view=rev Log: When entering JNI, give the correct level of frames for the laspSP of the thread that was running cooperative code. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=82045&r1=82044&r2=82045&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Wed Sep 16 08:14:08 2009 @@ -83,6 +83,7 @@ void JavaThread::startJNI(int level) { // Caller of this function. void** cur = (void**)FRAME_PTR(); + unsigned level2 = level; while (level--) cur = (void**)cur[0]; @@ -93,7 +94,7 @@ addresses.push_back(cur); // Start uncooperative mode. - enterUncooperativeCode(); + enterUncooperativeCode(level2); } void JavaThread::startJava() { From nicolas.geoffray at lip6.fr Wed Sep 16 06:14:49 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 13:14:49 -0000 Subject: [vmkit-commits] [vmkit] r82046 - /vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Message-ID: <200909161314.n8GDEnJF015637@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 08:14:48 2009 New Revision: 82046 URL: http://llvm.org/viewvc/llvm-project?rev=82046&view=rev Log: Don't use the cl information in JavaMetaJIT.cpp, do a full lookup on the object's class. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=82046&r1=82045&r2=82046&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Sep 16 08:14:48 2009 @@ -86,12 +86,8 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ readArgs(buf, sign, ap, jni); \ @@ -154,12 +150,8 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ Signdef* sign = getSignature(); \ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ @@ -242,12 +234,8 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \ verifyNull(obj); \ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \ @@ -303,12 +291,8 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ @@ -398,12 +382,8 @@ Signdef* sign = getSignature(); \ uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \ void* _buf = (void*)buf; \ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ readArgs(buf, sign, ap, jni); \ @@ -463,12 +443,8 @@ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ Signdef* sign = getSignature(); \ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ JavaThread* th = JavaThread::get(); \ @@ -506,7 +482,7 @@ \ void* func = this->compiledPtr();\ Signdef* sign = getSignature(); \ - FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getVirtualCallBuf(); \ + FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \ JavaThread* th = JavaThread::get(); \ th->startJava(); \ TYPE res = 0; \ @@ -548,12 +524,8 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \ verifyNull(obj); \ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \ @@ -606,12 +578,8 @@ \ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\ verifyNull(obj);\ - JavaMethod* meth = this; \ - if (classDef != cl) {\ - UserClass* cl2 = 0; \ - meth = cl->lookupMethodDontThrow(name, type, false, true, &cl2); \ - assert(cl2 == cl && "Different classes in invoke virtual"); \ - } \ + UserClass* objCl = obj->getClass()->isArray() ? obj->getClass()->super : obj->getClass()->asClass(); \ + JavaMethod* meth = objCl->lookupMethodDontThrow(name, type, false, true, &cl); \ void* func = meth->compiledPtr(); \ Signdef* sign = getSignature(); \ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \ From nicolas.geoffray at lip6.fr Wed Sep 16 07:18:38 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 16 Sep 2009 14:18:38 -0000 Subject: [vmkit-commits] [vmkit] r82048 - /vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Message-ID: <200909161418.n8GEIc1P023832@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 16 09:18:37 2009 New Revision: 82048 URL: http://llvm.org/viewvc/llvm-project?rev=82048&view=rev Log: Add a forgotten llvm_gcroot. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp?rev=82048&r1=82047&r2=82048&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaString.cpp Wed Sep 16 09:18:37 2009 @@ -55,12 +55,13 @@ const ArrayUInt16* JavaString::strToArray(Jnjvm* vm) { JavaString* self = this; + ArrayUInt16* array = 0; llvm_gcroot(self, 0); + llvm_gcroot(array, 0); assert(self->value && "String without an array?"); if (self->offset || (self->count != self->value->size)) { - ArrayUInt16* array = - (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(self->count, vm); + array = (ArrayUInt16*)vm->upcalls->ArrayOfChar->doNew(self->count, vm); uint16* buf = array->elements; for (sint32 i = 0; i < count; i++) { From nicolas.geoffray at lip6.fr Thu Sep 17 01:33:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 08:33:58 -0000 Subject: [vmkit-commits] [vmkit] r82134 - /vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Message-ID: <200909170833.n8H8Xxtx018980@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 03:33:56 2009 New Revision: 82134 URL: http://llvm.org/viewvc/llvm-project?rev=82134&view=rev Log: Pop the address of the Java call after calling leaveUncooperativeCode so that the thread call's stack stays consistent. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=82134&r1=82133&r2=82134&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Thu Sep 17 03:33:56 2009 @@ -223,10 +223,13 @@ assert(!(addresses.size() % 2) && "Wrong stack"); localJNIRefs->removeJNIReferences(this, *currentAddedReferences); - addresses.pop_back(); // Go back to cooperative mode. leaveUncooperativeCode(); + + // Pop the address after calling leaveUncooperativeCode + // to let the thread's call stack coherent. + addresses.pop_back(); } /// endJava - Record that we are leaving Java code. From nicolas.geoffray at lip6.fr Thu Sep 17 02:21:09 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:21:09 -0000 Subject: [vmkit-commits] [vmkit] r82135 - /vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Message-ID: <200909170921.n8H9LBhS025276@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:21:07 2009 New Revision: 82135 URL: http://llvm.org/viewvc/llvm-project?rev=82135&view=rev Log: Fixes to cooperate with a precise GC: - Locals and stacks are now initialized to zero. - The return value of a JNI function call is stored in a GC'd alloca. - A native function implemented by VMKit does not need a runtime GC. Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=82135&r1=82134&r2=82135&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Thu Sep 17 04:21:07 2009 @@ -270,6 +270,7 @@ Function* func = llvmFunction; if (jnjvm) { compilingMethod->setCompiledPtr((void*)natPtr, functionName); + llvmFunction->clearGC(); return llvmFunction; } @@ -380,6 +381,24 @@ } } + + Instruction* ResultObject = 0; + if (returnType == module->JavaObjectType) { + ResultObject = new AllocaInst(module->JavaObjectType, "", + func->begin()->begin()); + Value* GCArgs[2] = { + new BitCastInst(ResultObject, module->ptrPtrType, "", ResultObject), + module->constantPtrNull + }; + + if (TheCompiler->useCooperativeGC()) { + CallInst::Create(module->llvm_gc_gcroot, GCArgs, GCArgs + 2, "", + ResultObject); + } + new StoreInst(module->JavaObjectNullConstant, ResultObject, "", + ResultObject); + } + Value* nativeFunc = TheCompiler->getNativeFunction(compilingMethod, (void*)natPtr); @@ -414,16 +433,19 @@ CallInst::Create(module->StartJNIFunction, Args4, Args4 + 4, "", currentBlock); - Value* FrameAddr = CallInst::Create(module->llvm_frameaddress, - module->constantZero, "", currentBlock); + // FIXME: Is this still needed? + // // When calling a native method, it may do whatever it wants with the // frame pointer. Therefore make sure it's on the stack. x86_64 has // this problem because it passes first arguments in registers. // Therefore, it was overwriting the frame pointer when entering the // native method. - Value* Temp = new AllocaInst(module->ptrType, "", currentBlock); - new StoreInst(FrameAddr, Temp, currentBlock); + //Value* FrameAddr = CallInst::Create(module->llvm_frameaddress, + // module->constantZero, "", currentBlock); + //Value* Temp = new AllocaInst(module->ptrType, "", currentBlock); + //new StoreInst(FrameAddr, Temp, currentBlock); + Value* result = llvm::CallInst::Create(nativeFunc, nativeArgs.begin(), nativeArgs.end(), "", currentBlock); @@ -438,7 +460,7 @@ currentBlock = loadBlock; result = new LoadInst(result, "", currentBlock); - + new StoreInst(result, ResultObject, "", currentBlock); endNode->addIncoming(result, currentBlock); } else if (returnType != Type::getVoidTy(getGlobalContext())) { @@ -662,7 +684,11 @@ for (std::vector::iterator i = locals.begin(), e = locals.end(); i != e; ++i) { AllocaInst* temp = *i; - if (!temp->getNumUses()) { + unsigned uses = temp->getNumUses(); + if (!uses) { + temp->eraseFromParent(); + } else if (uses == 1 && dyn_cast(temp->use_begin())) { + dyn_cast(temp->use_begin())->eraseFromParent(); temp->eraseFromParent(); } } @@ -673,7 +699,13 @@ for (std::vector::iterator i = objects.begin(), e = objects.end(); i != e; ++i) { AllocaInst* temp = *i; - if (temp->getNumUses()) { + unsigned uses = temp->getNumUses(); + if (!uses) { + temp->eraseFromParent(); + } else if (uses == 1 && dyn_cast(temp->use_begin())) { + dyn_cast(temp->use_begin())->eraseFromParent(); + temp->eraseFromParent(); + } else { if (coop) { Instruction* I = new BitCastInst(temp, module->ptrPtrType, ""); I->insertAfter(temp); @@ -682,8 +714,6 @@ GCArgs + 2, ""); C->insertAfter(I); } - } else { - temp->eraseFromParent(); } } } @@ -736,16 +766,22 @@ for (int i = 0; i < maxLocals; i++) { intLocals.push_back(new AllocaInst(Type::getInt32Ty(getGlobalContext()), "", firstInstruction)); + new StoreInst(Constant::getNullValue(Type::getInt32Ty(*llvmContext)), intLocals.back(), false, firstInstruction); doubleLocals.push_back(new AllocaInst(Type::getDoubleTy(getGlobalContext()), "", firstInstruction)); + new StoreInst(Constant::getNullValue(Type::getDoubleTy(*llvmContext)), doubleLocals.back(), false, firstInstruction); longLocals.push_back(new AllocaInst(Type::getInt64Ty(getGlobalContext()), "", firstInstruction)); + new StoreInst(Constant::getNullValue(Type::getInt64Ty(*llvmContext)), longLocals.back(), false, firstInstruction); floatLocals.push_back(new AllocaInst(Type::getFloatTy(getGlobalContext()), "", firstInstruction)); + new StoreInst(Constant::getNullValue(Type::getFloatTy(*llvmContext)), floatLocals.back(), false, firstInstruction); objectLocals.push_back(new AllocaInst(module->JavaObjectType, "", firstInstruction)); + new StoreInst(Constant::getNullValue(module->JavaObjectType), objectLocals.back(), false, firstInstruction); } for (int i = 0; i < maxStack; i++) { objectStack.push_back(new AllocaInst(module->JavaObjectType, "", firstInstruction)); + new StoreInst(Constant::getNullValue(module->JavaObjectType), objectStack.back(), false, firstInstruction); intStack.push_back(new AllocaInst(Type::getInt32Ty(getGlobalContext()), "", firstInstruction)); doubleStack.push_back(new AllocaInst(Type::getDoubleTy(getGlobalContext()), "", firstInstruction)); @@ -756,16 +792,22 @@ } else { for (int i = 0; i < maxLocals; i++) { intLocals.push_back(new AllocaInst(Type::getInt32Ty(getGlobalContext()), "", firstBB)); + new StoreInst(Constant::getNullValue(Type::getInt32Ty(*llvmContext)), intLocals.back(), false, firstBB); doubleLocals.push_back(new AllocaInst(Type::getDoubleTy(getGlobalContext()), "", firstBB)); + new StoreInst(Constant::getNullValue(Type::getDoubleTy(*llvmContext)), doubleLocals.back(), false, firstBB); longLocals.push_back(new AllocaInst(Type::getInt64Ty(getGlobalContext()), "", firstBB)); + new StoreInst(Constant::getNullValue(Type::getInt64Ty(*llvmContext)), longLocals.back(), false, firstBB); floatLocals.push_back(new AllocaInst(Type::getFloatTy(getGlobalContext()), "", firstBB)); + new StoreInst(Constant::getNullValue(Type::getFloatTy(*llvmContext)), floatLocals.back(), false, firstBB); objectLocals.push_back(new AllocaInst(module->JavaObjectType, "", firstBB)); + new StoreInst(Constant::getNullValue(module->JavaObjectType), objectLocals.back(), false, firstBB); } for (int i = 0; i < maxStack; i++) { objectStack.push_back(new AllocaInst(module->JavaObjectType, "", firstBB)); + new StoreInst(Constant::getNullValue(module->JavaObjectType), objectStack.back(), false, firstBB); intStack.push_back(new AllocaInst(Type::getInt32Ty(getGlobalContext()), "", firstBB)); doubleStack.push_back(new AllocaInst(Type::getDoubleTy(getGlobalContext()), "", firstBB)); longStack.push_back(new AllocaInst(Type::getInt64Ty(getGlobalContext()), "", firstBB)); @@ -908,16 +950,22 @@ for (int i = 0; i < maxLocals; i++) { intLocals.push_back(new AllocaInst(Type::getInt32Ty(getGlobalContext()), "", currentBlock)); + new StoreInst(Constant::getNullValue(Type::getInt32Ty(*llvmContext)), intLocals.back(), false, currentBlock); doubleLocals.push_back(new AllocaInst(Type::getDoubleTy(getGlobalContext()), "", currentBlock)); + new StoreInst(Constant::getNullValue(Type::getDoubleTy(*llvmContext)), doubleLocals.back(), false, currentBlock); longLocals.push_back(new AllocaInst(Type::getInt64Ty(getGlobalContext()), "", currentBlock)); + new StoreInst(Constant::getNullValue(Type::getInt64Ty(*llvmContext)), longLocals.back(), false, currentBlock); floatLocals.push_back(new AllocaInst(Type::getFloatTy(getGlobalContext()), "", currentBlock)); + new StoreInst(Constant::getNullValue(Type::getFloatTy(*llvmContext)), floatLocals.back(), false, currentBlock); objectLocals.push_back(new AllocaInst(module->JavaObjectType, "", currentBlock)); + new StoreInst(Constant::getNullValue(module->JavaObjectType), objectLocals.back(), false, currentBlock); } for (int i = 0; i < maxStack; i++) { objectStack.push_back(new AllocaInst(module->JavaObjectType, "", currentBlock)); + new StoreInst(Constant::getNullValue(module->JavaObjectType), objectStack.back(), false, currentBlock); intStack.push_back(new AllocaInst(Type::getInt32Ty(getGlobalContext()), "", currentBlock)); doubleStack.push_back(new AllocaInst(Type::getDoubleTy(getGlobalContext()), "", currentBlock)); longStack.push_back(new AllocaInst(Type::getInt64Ty(getGlobalContext()), "", currentBlock)); From nicolas.geoffray at lip6.fr Thu Sep 17 02:23:00 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:23:00 -0000 Subject: [vmkit-commits] [vmkit] r82136 - /vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Message-ID: <200909170923.n8H9N0Rx025513@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:23:00 2009 New Revision: 82136 URL: http://llvm.org/viewvc/llvm-project?rev=82136&view=rev Log: Give the native Java function as initiating the JNI call, not the Java function calling the native Java function. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=82136&r1=82135&r2=82136&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Thu Sep 17 04:23:00 2009 @@ -405,7 +405,7 @@ *oldLocalReferencesNumber = th->currentAddedReferences; th->currentAddedReferences = localReferencesNumber; - th->startJNI(2); + th->startJNI(1); void** val = (void**)th->addresses.back(); return val; From nicolas.geoffray at lip6.fr Thu Sep 17 02:25:19 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:25:19 -0000 Subject: [vmkit-commits] [vmkit] r82137 - /vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Message-ID: <200909170925.n8H9PJoS025810@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:25:19 2009 New Revision: 82137 URL: http://llvm.org/viewvc/llvm-project?rev=82137&view=rev Log: Set the GC info when the method is JIT-generated. Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp?rev=82137&r1=82136&r2=82137&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Thu Sep 17 04:25:19 2009 @@ -12,8 +12,11 @@ #include "llvm/Function.h" #include "llvm/Instructions.h" #include "llvm/Module.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" #include "MvmGC.h" #include "mvm/VirtualMachine.h" @@ -224,6 +227,20 @@ Function* func = parseFunction(meth); void* res = mvm::MvmModule::executionEngine->getPointerToGlobal(func); func->deleteBody(); + + // Update the GC info. + LLVMMethodInfo* LMI = getMethodInfo(meth); + // If it's not, we know the last GC info is for this method. + if (func->hasGC() && !LMI->GCInfo) { + GCStrategy::iterator I = mvm::MvmModule::GC->end(); + I--; + DEBUG(errs() << (*I)->getFunction().getName() << '\n'); + DEBUG(errs() << LMI->getMethod()->getName() << '\n'); + assert(&(*I)->getFunction() == LMI->getMethod() && + "GC Info and method do not correspond"); + LMI->GCInfo = *I; + } + mvm::MvmModule::unprotectIR(); return res; From nicolas.geoffray at lip6.fr Thu Sep 17 02:27:58 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:27:58 -0000 Subject: [vmkit-commits] [vmkit] r82138 - in /vmkit/trunk/lib/JnJVM/Compiler: GCInfoPass.cpp JnjvmModule.cpp Message-ID: <200909170927.n8H9RxGH026234@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:27:58 2009 New Revision: 82138 URL: http://llvm.org/viewvc/llvm-project?rev=82138&view=rev Log: No need for a GC info pass: we can get the GC info from the GC strategy object. Removed: vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Removed: vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp?rev=82137&view=auto ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/GCInfoPass.cpp (removed) @@ -1,57 +0,0 @@ -//===---- GCInfoPass.cpp - Get GC info for JIT-generated functions --------===// -// -// The VMKit project -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - - -#include "llvm/Function.h" -#include "llvm/Pass.h" -#include "llvm/CodeGen/GCMetadata.h" -#include "llvm/Support/Compiler.h" - -#include "jnjvm/JnjvmModule.h" - -using namespace jnjvm; -using namespace llvm; - -namespace { - class VISIBILITY_HIDDEN GCInfoPass : public FunctionPass { - public: - static char ID; - JavaLLVMCompiler* Comp; - GCInfoPass(JavaLLVMCompiler* C) : FunctionPass(&ID) { - Comp = C; - } - - void getAnalysisUsage(AnalysisUsage &AU) const { - FunctionPass::getAnalysisUsage(AU); - AU.setPreservesAll(); - AU.addRequired(); - } - - bool runOnFunction(Function &F) { - // Quick exit for functions that do not use GC. - assert(F.hasGC() && "Function without GC"); - GCFunctionInfo &FI = getAnalysis().getFunctionInfo(F); - JavaMethod* meth = Comp->getJavaMethod(&F); - assert(meth && "Function without a Java method"); - - LLVMMethodInfo* LMI = Comp->getMethodInfo(meth); - LMI->GCInfo = &FI; - return false; - } - }; -} - -char GCInfoPass::ID = 0; - -namespace jnjvm { - FunctionPass* createGCInfo(JavaLLVMCompiler* C) { - return new GCInfoPass(C); - } -} - Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=82138&r1=82137&r2=82138&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Thu Sep 17 04:27:58 2009 @@ -377,7 +377,6 @@ namespace jnjvm { llvm::FunctionPass* createLowerConstantCallsPass(JnjvmModule* M); - llvm::FunctionPass* createGCInfo(JavaLLVMCompiler* Comp); } void JavaLLVMCompiler::addJavaPasses() { @@ -386,8 +385,6 @@ // Lower constant calls to lower things like getClass used // on synchronized methods. JavaNativeFunctionPasses->add(createLowerConstantCallsPass(getIntrinsics())); - if (cooperativeGC) - JavaNativeFunctionPasses->add(createGCInfo(this)); JavaFunctionPasses = new FunctionPassManager(TheModuleProvider); JavaFunctionPasses->add(new TargetData(TheModule)); @@ -398,6 +395,4 @@ // be given to the GC. //JavaFunctionPasses->add(mvm::createEscapeAnalysisPass()); JavaFunctionPasses->add(createLowerConstantCallsPass(getIntrinsics())); - if (cooperativeGC) - JavaFunctionPasses->add(createGCInfo(this)); } From nicolas.geoffray at lip6.fr Thu Sep 17 02:29:22 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:29:22 -0000 Subject: [vmkit-commits] [vmkit] r82139 - in /vmkit/trunk: include/mvm/JIT.h lib/Mvm/Compiler/JIT.cpp Message-ID: <200909170929.n8H9TMef026441@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:29:21 2009 New Revision: 82139 URL: http://llvm.org/viewvc/llvm-project?rev=82139&view=rev Log: Add a GC strategy object to the list of global variables for JIT compilation. Modified: vmkit/trunk/include/mvm/JIT.h vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Modified: vmkit/trunk/include/mvm/JIT.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=82139&r1=82138&r2=82139&view=diff ============================================================================== --- vmkit/trunk/include/mvm/JIT.h (original) +++ vmkit/trunk/include/mvm/JIT.h Thu Sep 17 04:29:21 2009 @@ -26,6 +26,7 @@ class ExistingModuleProvider; class Function; class FunctionPassManager; + class GCStrategy; class LLVMContext; class Module; class ModuleProvider; @@ -169,6 +170,7 @@ static const llvm::Type* pointerSizeType; static llvm::ExecutionEngine* executionEngine; + static llvm::GCStrategy* GC; static mvm::LockRecursive protectEngine; static llvm::Module *globalModule; static llvm::ExistingModuleProvider *globalModuleProvider; Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/JIT.cpp?rev=82139&r1=82138&r2=82139&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Thu Sep 17 04:29:21 2009 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -229,6 +230,7 @@ const llvm::Type* MvmModule::arrayPtrType; const llvm::TargetData* MvmModule::TheTargetData; +llvm::GCStrategy* MvmModule::GC; llvm::Module *MvmModule::globalModule; llvm::ExistingModuleProvider *MvmModule::globalModuleProvider; llvm::FunctionPassManager* MvmModule::globalFunctionPasses; From nicolas.geoffray at lip6.fr Thu Sep 17 02:30:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:30:44 -0000 Subject: [vmkit-commits] [vmkit] r82140 - /vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Message-ID: <200909170930.n8H9UiMA026629@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:30:44 2009 New Revision: 82140 URL: http://llvm.org/viewvc/llvm-project?rev=82140&view=rev Log: If lastSP is not null, then we are printing a stack from another thread. Use lastSP instead of our last frame pointer for starting the printing. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=82140&r1=82139&r2=82140&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Thu Sep 17 04:30:44 2009 @@ -254,7 +254,7 @@ std::vector::iterator it = addresses.end(); Jnjvm* vm = getJVM(); - void** addr = (void**)FRAME_PTR(); + void** addr = getLastSP() ? (void**)getLastSP() : (void**)FRAME_PTR(); // Loop until we cross the first Java frame. while (it != addresses.begin()) { From nicolas.geoffray at lip6.fr Thu Sep 17 02:31:42 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 09:31:42 -0000 Subject: [vmkit-commits] [vmkit] r82141 - /vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Message-ID: <200909170931.n8H9VgGq026777@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 04:31:42 2009 New Revision: 82141 URL: http://llvm.org/viewvc/llvm-project?rev=82141&view=rev Log: Set the mvm::MvmModule::GC strategy when it's created. Modified: vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Modified: vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp?rev=82141&r1=82140&r2=82141&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp (original) +++ vmkit/trunk/lib/Mvm/Compiler/VmkitGC.cpp Thu Sep 17 04:31:42 2009 @@ -12,6 +12,8 @@ #include "llvm/CodeGen/GCStrategy.h" #include "llvm/Support/Compiler.h" +#include "mvm/JIT.h" + using namespace llvm; namespace { @@ -30,4 +32,5 @@ VmkitGC::VmkitGC() { NeededSafePoints = 1 << GC::PostCall; + mvm::MvmModule::GC = this; } From nicolas.geoffray at lip6.fr Thu Sep 17 05:06:44 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 12:06:44 -0000 Subject: [vmkit-commits] [vmkit] r82142 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmClassLoader.cpp JnjvmClassLoader.h Message-ID: <200909171206.n8HC6iAP014121@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 07:06:43 2009 New Revision: 82142 URL: http://llvm.org/viewvc/llvm-project?rev=82142&view=rev Log: Delete the allocator of a class loader after the class loader has been deallocated: the allocator owns the memory of the class loader therefore can not be deleted by the class loader. Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=82142&r1=82141&r2=82142&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Sep 17 07:06:43 2009 @@ -898,7 +898,7 @@ } JnjvmClassLoader::~JnjvmClassLoader() { - + if (isolate) isolate->removeMethodsInFunctionMap(this); @@ -928,7 +928,9 @@ } delete TheCompiler; - delete &allocator; + + // Don't delete the allocator. The caller of this method must + // delete it after the current object is deleted. } Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=82142&r1=82141&r2=82142&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Thu Sep 17 07:06:43 2009 @@ -442,7 +442,10 @@ /// ~VMClassLoader - Delete the internal class loader. /// static void staticDestructor(VMClassLoader* obj) { - if (obj->JCL) obj->JCL->~JnjvmClassLoader(); + if (obj->JCL) { + obj->JCL->~JnjvmClassLoader(); + delete &(obj->JCL->allocator); + } } /// VMClassLoader - Default constructors. From nicolas.geoffray at lip6.fr Thu Sep 17 12:18:47 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Thu, 17 Sep 2009 19:18:47 -0000 Subject: [vmkit-commits] [vmkit] r82158 - /vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp Message-ID: <200909171918.n8HJIlRv005065@zion.cs.uiuc.edu> Author: geoffray Date: Thu Sep 17 14:18:46 2009 New Revision: 82158 URL: http://llvm.org/viewvc/llvm-project?rev=82158&view=rev Log: Tag a jsr local by placing 1 in the first bit, so that the GC can differentiate it with a real object. Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp?rev=82158&r1=82157&r2=82158&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp (original) +++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp Thu Sep 17 14:18:46 2009 @@ -1742,9 +1742,11 @@ case JSR : { uint32 tmp = i; + uint32 index = jsrIndex | 1; + jsrIndex += 2; Value* expr = ConstantExpr::getIntToPtr( ConstantInt::get(Type::getInt64Ty(*llvmContext), - uint64_t (jsrIndex++)), + uint64_t (index)), module->JavaObjectType); push(expr, false); branch(opcodeInfos[tmp + readS2(bytecodes, i)].newBlock, @@ -1761,8 +1763,8 @@ uint32 index = 0; for (std::vector::iterator i = jsrs.begin(), - e = jsrs.end(); i!= e; ++i, ++index) { - inst->addCase(ConstantInt::get(Type::getInt32Ty(*llvmContext), index), *i); + e = jsrs.end(); i!= e; ++i, index += 2) { + inst->addCase(ConstantInt::get(Type::getInt32Ty(*llvmContext), index | 1), *i); } break; From nicolas.geoffray at lip6.fr Fri Sep 18 00:41:27 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Fri, 18 Sep 2009 07:41:27 -0000 Subject: [vmkit-commits] [vmkit] r82207 - in /vmkit/trunk/lib/N3/PNetLib: PNetLib.cpp PNetString.cpp Message-ID: <200909180741.n8I7fRbW004910@zion.cs.uiuc.edu> Author: geoffray Date: Fri Sep 18 02:41:27 2009 New Revision: 82207 URL: http://llvm.org/viewvc/llvm-project?rev=82207&view=rev Log: Move to new LLVM API. Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp vmkit/trunk/lib/N3/PNetLib/PNetString.cpp Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp?rev=82207&r1=82206&r2=82207&view=diff ============================================================================== --- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original) +++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Fri Sep 18 02:41:27 2009 @@ -691,38 +691,38 @@ } static void decapsulePrimitive(VMObject* arg, const llvm::Type* type, std::vector& args) { - if (type == llvm::Type::Int1Ty) { + if (type == llvm::Type::getInt1Ty(llvm::getGlobalContext())) { llvm::GenericValue gv; gv.IntVal = llvm::APInt(1, (bool)((uint32*)arg)[VALUE_OFFSET]); args.push_back(gv); - } else if (type == llvm::Type::Int8Ty) { + } else if (type == llvm::Type::getInt8Ty(llvm::getGlobalContext())) { llvm::GenericValue gv; gv.IntVal = llvm::APInt(8, (uint8)((uint32*)arg)[VALUE_OFFSET]); args.push_back(gv); - } else if (type == llvm::Type::Int16Ty) { + } else if (type == llvm::Type::getInt16Ty(llvm::getGlobalContext())) { llvm::GenericValue gv; gv.IntVal = llvm::APInt(16, (uint16)((uint32*)arg)[VALUE_OFFSET]); args.push_back(gv); - } else if (type == llvm::Type::Int32Ty) { + } else if (type == llvm::Type::getInt32Ty(llvm::getGlobalContext())) { llvm::GenericValue gv; gv.IntVal = llvm::APInt(32, (uint32)((uint32*)arg)[VALUE_OFFSET]); args.push_back(gv); - } else if (type == llvm::Type::Int64Ty) { + } else if (type == llvm::Type::getInt64Ty(llvm::getGlobalContext())) { llvm::GenericValue gv; uint32* ptr = &((uint32*)arg)[VALUE_OFFSET]; gv.IntVal = llvm::APInt(64, ((uint64*)ptr)[0]); args.push_back(gv); - } else if (type == llvm::Type::FloatTy) { + } else if (type == llvm::Type::getFloatTy(llvm::getGlobalContext())) { llvm::GenericValue gv; float* ptr = &((float*)arg)[VALUE_OFFSET]; gv.FloatVal = ((float*)ptr)[0]; args.push_back(gv); - } else if (type == llvm::Type::DoubleTy) { + } else if (type == llvm::Type::getDoubleTy(llvm::getGlobalContext())) { llvm::GenericValue gv; uint32* ptr = &((uint32*)arg)[VALUE_OFFSET]; gv.DoubleVal = ((double*)ptr)[0]; args.push_back(gv); - } else if (type == llvm::PointerType::getUnqual(llvm::Type::Int8Ty)) { + } else if (type == llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(llvm::getGlobalContext()))) { llvm::GenericValue gv(((void**)arg)[VALUE_OFFSET]); args.push_back(gv); } else { @@ -759,7 +759,7 @@ for ( ;i != e; ++i, ++index) { const llvm::Type* type = i->getType(); - if (llvm::isa(type) && type != llvm::PointerType::getUnqual(llvm::Type::Int8Ty)) { + if (llvm::isa(type) && type != llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(llvm::getGlobalContext()))) { llvm::GenericValue gv(args->elements[index]); gvargs.push_back(gv); } else { Modified: vmkit/trunk/lib/N3/PNetLib/PNetString.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetString.cpp?rev=82207&r1=82206&r2=82207&view=diff ============================================================================== --- vmkit/trunk/lib/N3/PNetLib/PNetString.cpp (original) +++ vmkit/trunk/lib/N3/PNetLib/PNetString.cpp Fri Sep 18 02:41:27 2009 @@ -52,7 +52,7 @@ if (!str->_llvmVar) { const Type* pty = mvm::MvmModule::ptrType; Constant* cons = - ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty, uint64_t (this)), + ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), uint64_t (this)), pty); str->_llvmVar = new GlobalVariable(*(vm->getLLVMModule()), pty, true, GlobalValue::ExternalLinkage, From nicolas.geoffray at lip6.fr Tue Sep 29 21:03:16 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 30 Sep 2009 04:03:16 -0000 Subject: [vmkit-commits] [vmkit] r83139 - /vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp Message-ID: <200909300403.n8U43HtD021846@zion.cs.uiuc.edu> Author: geoffray Date: Tue Sep 29 23:03:15 2009 New Revision: 83139 URL: http://llvm.org/viewvc/llvm-project?rev=83139&view=rev Log: Inform the loop analysis that new blocks are in the loop when inserting a safe point. Modified: vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp Modified: vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp?rev=83139&r1=83138&r2=83139&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp (original) +++ vmkit/trunk/lib/Mvm/Compiler/LoopSafePoints.cpp Tue Sep 29 23:03:15 2009 @@ -25,9 +25,14 @@ virtual bool runOnLoop(Loop* L, LPPassManager& LPM); + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + } + + private: void insertSafePoint(BasicBlock* BB, Function* SafeFunction, - Value* YieldPtr); + Value* YieldPtr, Loop* L, LoopInfo* LI); }; char LoopSafePoints::ID = 0; @@ -35,9 +40,10 @@ "Add safe points in loop headers"); void LoopSafePoints::insertSafePoint(BasicBlock* BB, Function* SafeFunction, - Value* YieldPtr) { + Value* YieldPtr, Loop* L, LoopInfo* LI) { Instruction* I = BB->getFirstNonPHI(); BasicBlock* NBB = BB->splitBasicBlock(I); + L->addBasicBlockToLoop(NBB, LI->getBase()); NBB = NBB->getSinglePredecessor(); I = NBB->getTerminator(); @@ -47,14 +53,20 @@ Value* Ld = new LoadInst(YieldPtr, "", NBB); BasicBlock* yield = BasicBlock::Create(SafeFunction->getContext(), "", BB->getParent()); + BranchInst::Create(yield, SU, Ld, NBB); CallInst::Create(SafeFunction, "", yield); BranchInst::Create(SU, yield); + + L->addBasicBlockToLoop(yield, LI->getBase()); + } + bool LoopSafePoints::runOnLoop(Loop* L, LPPassManager& LPM) { - + + LoopInfo* LI = &getAnalysis(); BasicBlock* Header = L->getHeader(); Function *F = Header->getParent(); Function* SafeFunction = @@ -101,18 +113,18 @@ bool containsSecond = L->contains(Second); if (!containsFirst) { - insertSafePoint(Second, SafeFunction, YieldPtr); + insertSafePoint(Second, SafeFunction, YieldPtr, L, LI); return true; } if (!containsSecond) { - insertSafePoint(First, SafeFunction, YieldPtr); + insertSafePoint(First, SafeFunction, YieldPtr, L, LI); return true; } } } - insertSafePoint(Header, SafeFunction, YieldPtr); + insertSafePoint(Header, SafeFunction, YieldPtr, L, LI); return true; } From nicolas.geoffray at lip6.fr Tue Sep 29 21:04:48 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 30 Sep 2009 04:04:48 -0000 Subject: [vmkit-commits] [vmkit] r83140 - in /vmkit/trunk/lib: JnJVM/VMCore/JavaThread.cpp Mvm/Compiler/JIT.cpp Message-ID: <200909300404.n8U44mxe022077@zion.cs.uiuc.edu> Author: geoffray Date: Tue Sep 29 23:04:47 2009 New Revision: 83140 URL: http://llvm.org/viewvc/llvm-project?rev=83140&view=rev Log: Fix stub magic value to match with LLVM's value. Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=83140&r1=83139&r2=83140&view=diff ============================================================================== --- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original) +++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Tue Sep 29 23:04:47 2009 @@ -163,6 +163,8 @@ do { void* ip = FRAME_IP(addr); + bool isStub = ((unsigned char*)ip)[0] == 0xCE; + if (isStub) ip = addr[2]; context.push_back(ip); addr = (void**)addr[0]; // We end walking the stack when we cross a native -> Java call. Here @@ -198,6 +200,8 @@ do { void* ip = FRAME_IP(addr); + bool isStub = ((unsigned char*)ip)[0] == 0xCE; + if (isStub) ip = addr[2]; if (index == level) { JavaMethod* meth = getJVM()->IPToMethod(ip); return meth->classDef; @@ -241,6 +245,8 @@ do { void* ip = FRAME_IP(addr); + bool isStub = ((unsigned char*)ip)[0] == 0xCE; + if (isStub) ip = addr[2]; JavaMethod* meth = getJVM()->IPToMethod(ip); JnjvmClassLoader* loader = meth->classDef->classLoader; obj = loader->getJavaClassLoader(); @@ -320,6 +326,8 @@ do { void* ip = FRAME_IP(addr); + bool isStub = ((unsigned char*)ip)[0] == 0xCE; + if (isStub) ip = addr[2]; JavaMethod* meth = vm->IPToMethod(ip); assert(meth && "Wrong stack"); fprintf(stderr, "; %p in %s.%s\n", ip, Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/JIT.cpp?rev=83140&r1=83139&r2=83140&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original) +++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Tue Sep 29 23:04:47 2009 @@ -347,7 +347,8 @@ std::vector::iterator it = th->addresses.end(); VirtualMachine* vm = th->MyVM; - void** addr = mvm::Thread::get() == th ? (void**)FRAME_PTR() : (void**)th->getLastSP(); + void** addr = mvm::Thread::get() == th ? + (void**)FRAME_PTR() : (void**)th->getLastSP(); void** oldAddr = addr; // Loop until we cross the first Java frame. @@ -395,7 +396,7 @@ do { void* ip = FRAME_IP(addr); - bool isStub = ((unsigned char*)ip)[0] == 0xCD; + bool isStub = ((unsigned char*)ip)[0] == 0xCE; if (isStub) ip = addr[2]; camlframe* CF = (camlframe*)VirtualMachine::GCMap.GCInfos[ip]; if (CF) { @@ -416,7 +417,7 @@ for (llvm::GCFunctionInfo::live_iterator K = GFI->live_begin(J), KE = GFI->live_end(J); K != KE; ++K) { intptr_t obj = *(intptr_t*)(spaddr + K->StackOffset); - // Verify that obj does cnot come from a JSR bytecode. + // Verify that obj does not come from a JSR bytecode. if (!(obj & 1)) Collector::scanObject((void*)obj); } } From nicolas.geoffray at lip6.fr Wed Sep 30 10:57:06 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 30 Sep 2009 17:57:06 -0000 Subject: [vmkit-commits] [vmkit] r83154 - /vmkit/trunk/lib/Mvm/Runtime/Object.cpp Message-ID: <200909301757.n8UHv6f5024028@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 30 12:57:06 2009 New Revision: 83154 URL: http://llvm.org/viewvc/llvm-project?rev=83154&view=rev Log: Change stub magic value. Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=83154&r1=83153&r2=83154&view=diff ============================================================================== --- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original) +++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Wed Sep 30 12:57:06 2009 @@ -365,7 +365,7 @@ do { void* ip = FRAME_IP(addr); - bool isStub = ((unsigned char*)ip)[0] == 0xCD; + bool isStub = ((unsigned char*)ip)[0] == 0xCE; if (isStub) ip = addr[2]; camlframe* CF = (camlframe*)VirtualMachine::GCMap.GCInfos[ip]; if (CF) { From nicolas.geoffray at lip6.fr Wed Sep 30 10:58:34 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 30 Sep 2009 17:58:34 -0000 Subject: [vmkit-commits] [vmkit] r83155 - /vmkit/trunk/include/mvm/Threads/Cond.h Message-ID: <200909301758.n8UHwYAw024229@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 30 12:58:34 2009 New Revision: 83155 URL: http://llvm.org/viewvc/llvm-project?rev=83155&view=rev Log: Set condition functions noinline because they enter uncooperative code. Modified: vmkit/trunk/include/mvm/Threads/Cond.h Modified: vmkit/trunk/include/mvm/Threads/Cond.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Cond.h?rev=83155&r1=83154&r2=83155&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Cond.h (original) +++ vmkit/trunk/include/mvm/Threads/Cond.h Wed Sep 30 12:58:34 2009 @@ -23,10 +23,10 @@ Cond(); ~Cond(); - void broadcast(void); - void wait(Lock *l); - int timedWait(Lock *l, timeval *tv); - void signal(void); + void broadcast(void) __attribute__ ((noinline)); + void wait(Lock *l) __attribute__ ((noinline)); + int timedWait(Lock *l, timeval *tv) __attribute__ ((noinline)); + void signal(void) __attribute__ ((noinline)); }; } // end namespace mvm From nicolas.geoffray at lip6.fr Wed Sep 30 11:00:07 2009 From: nicolas.geoffray at lip6.fr (Nicolas Geoffray) Date: Wed, 30 Sep 2009 18:00:07 -0000 Subject: [vmkit-commits] [vmkit] r83156 - /vmkit/trunk/include/mvm/Threads/Thread.h Message-ID: <200909301800.n8UI07Nn024433@zion.cs.uiuc.edu> Author: geoffray Date: Wed Sep 30 13:00:07 2009 New Revision: 83156 URL: http://llvm.org/viewvc/llvm-project?rev=83156&view=rev Log: Do not enter or leave uncooperative code while in GC. Modified: vmkit/trunk/include/mvm/Threads/Thread.h Modified: vmkit/trunk/include/mvm/Threads/Thread.h URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=83156&r1=83155&r2=83156&view=diff ============================================================================== --- vmkit/trunk/include/mvm/Threads/Thread.h (original) +++ vmkit/trunk/include/mvm/Threads/Thread.h Wed Sep 30 13:00:07 2009 @@ -197,25 +197,40 @@ void* getLastSP() { return lastSP; } void setLastSP(void* V) { lastSP = V; } - void enterUncooperativeCode(unsigned level = 0) { + void enterUncooperativeCode(unsigned level = 0) __attribute__ ((noinline)) { if (isMvmThread()) { - lastSP = __builtin_frame_address(0); - while (level--) lastSP = ((void**)lastSP)[0]; - if (doYield && !inGC) joinCollection(); + if (!inGC) { + assert(!lastSP && "SP already set when entering uncooperative code"); + ++level; + void* temp = __builtin_frame_address(0); + while (level--) temp = ((void**)temp)[0]; + lastSP = temp; + if (doYield) joinCollection(); + assert(lastSP && "No last SP when entering uncooperative code"); + } } } void enterUncooperativeCode(void* SP) { if (isMvmThread()) { - lastSP = SP; - if (doYield && !inGC) joinCollection(); + if (!inGC) { + assert(!lastSP && "SP already set when entering uncooperative code"); + lastSP = SP; + if (doYield) joinCollection(); + assert(lastSP && "No last SP when entering uncooperative code"); + } } } void leaveUncooperativeCode() { if (isMvmThread()) { - lastSP = 0; - if (doYield && !inGC) joinCollection(); + if (!inGC) { + assert(lastSP && "No last SP when leaving uncooperative code"); + if (doYield) joinCollection(); + lastSP = 0; + if (doYield) joinCollection(); + assert(!lastSP && "SP has a value after leaving uncooperative code"); + } } }