Merged revisions 8187-8244 via svnmerge from
authormichi <none@none>
Tue, 31 Jul 2007 09:55:04 +0000 (09:55 +0000)
committermichi <none@none>
Tue, 31 Jul 2007 09:55:04 +0000 (09:55 +0000)
svn+ssh://michi@c1.complang.tuwien.ac.at/ahome/cacao/svn/cacao/trunk

........
  r8189 | ajordan | 2007-07-07 14:03:38 +0200 (Sat, 07 Jul 2007) | 2 lines

  * src/vm/jit/sparc64/solaris/md-os.c: Implemented hardware exception handling.
........
  r8190 | twisti | 2007-07-08 15:42:06 +0200 (Sun, 08 Jul 2007) | 4 lines

  * src/vm/jit/powerpc/linux/md-abi.c (vm/types.h): Removed.
  (stdint.h): Added and use stdint-types in this file.
  (_ALIGN): Removed and use ALIGN_2 in this file.
........
  r8191 | twisti | 2007-07-08 17:15:53 +0200 (Sun, 08 Jul 2007) | 8 lines

  * src/vm/jit/powerpc/emit.c (stdint.h): Added
  (emit_verbosecall_enter): Reimplemented (this implementation is much
  simpler and maybe should be extended to trace also arguments on the
  stack). Darwin support is still missing.

  * src/vm/jit/powerpc/darwin/md-abi.h (TRACE_ARGS_NUM): Changed to 4.
  * src/vm/jit/powerpc/linux/md-abi.h (TRACE_ARGS_NUM): Likewise.
........
  r8192 | twisti | 2007-07-09 13:18:48 +0200 (Mon, 09 Jul 2007) | 3 lines

  * src/vm/jit/x86_64/linux/md-os.c (md_signal_handler_sigsegv): Fixed
  typo.
........
  r8193 | twisti | 2007-07-09 16:37:49 +0200 (Mon, 09 Jul 2007) | 2 lines

  * src/vm/global.h (ALIGN_2): Use logical arithmetic.
........
  r8194 | twisti | 2007-07-10 15:44:37 +0200 (Tue, 10 Jul 2007) | 9 lines

  * src/vmcore/options.c (opt_TraceJavaCalls): Added.
  (options_XX): Added opt_TraceJavaCalls.
  (options_xx): Likewise.

  * src/vmcore/options.h (opt_TraceJavaCalls): Added.

  * src/vm/vm.c (XXusage): Removed -verbose:call.
  (vm_create): Likewise.
........
  r8195 | pm | 2007-07-11 13:27:55 +0200 (Wed, 11 Jul 2007) | 3 lines

  * src/vm/jit/s390/codegen.c (codegen_emit): Extended maximal interface table offset from 12 bit to 16 bit in ICMD_INVOKEINTERFACE.
  * src/vm/jit/s390/patcher.c (patcher_invokeinterface): Likewise.
........
  r8196 | twisti | 2007-07-11 15:54:21 +0200 (Wed, 11 Jul 2007) | 5 lines

  * src/vm/jit/powerpc/codegen.c (codegen_emit): Fixed bug when taking
  out double arguments.
  (codegen_emit_stub_native): Use switch-case for saving and restoring
  argument registers.
........
  r8197 | twisti | 2007-07-11 21:17:04 +0200 (Wed, 11 Jul 2007) | 3 lines

  * src/vm/jit/x86_64/asmpart.S (asm_vm_call_method): Fixed stack
  alignment.
........
  r8198 | twisti | 2007-07-12 09:16:24 +0200 (Thu, 12 Jul 2007) | 10 lines

  * src/vm/jit/alpha/asmpart.S (asm_vm_call_method): Rewritten for new
  argument passing.

  * src/vm/jit/alpha/md-abi.c (md_param_alloc): Set pd->index.

  * src/native/jni.c: Added __ALPHA__ ifdef.
  * src/vm/vm.c: Likewise.
  * src/vm/vm.h: Likewise.
  * src/vm/jit/asmpart.h: Likewise.
........
  r8199 | michi | 2007-07-13 02:39:49 +0200 (Fri, 13 Jul 2007) | 7 lines

  * src/vmcore/statistics.h (size_patchref): Added.
  * src/vmcore/statistics.c (size_patchref): Added.
  (statistics_print_memory_usage): Print size of patcher references.

  * src/vm/jit/patcher-common.c (patcher_add_patch_ref, patcher_list_free)
  [ENABLE_STATISTICS] Set size of patcher references accordingly.
........
  r8200 | twisti | 2007-07-15 11:47:21 +0200 (Sun, 15 Jul 2007) | 2 lines

  * src/vm/vm.c: Build fix.
........
  r8201 | twisti | 2007-07-15 12:37:50 +0200 (Sun, 15 Jul 2007) | 9 lines

  * src/vmcore/primitive.c (stdint.h): Added.
  (primitive_arrayclass_get_by_name): New function.

  * src/vmcore/primitive.h (stdint.h): Added.
  (primitive_arrayclass_get_by_name): Likewise.

  * src/native/vm/sun/jvm.c (JVM_NewArray): Implemented handling for
  primitive arrays.
........
  r8202 | twisti | 2007-07-15 14:08:18 +0200 (Sun, 15 Jul 2007) | 3 lines

  * src/native/include/Makefile.am [WITH_CLASSPATH_SUN]
  (JAVASE_HEADER_FILES): Added sun_reflect_ConstantPool.h.
........
  r8203 | twisti | 2007-07-15 14:30:04 +0200 (Sun, 15 Jul 2007) | 16 lines

  * src/vmcore/primitive.c (primitive_class_is_primitive): Removed.
  * src/vmcore/primitive.h: Likewise.

  * src/vmcore/class.c (class_is_primitive): New function.
  (class_isanysubclass): Use class_is_primitive.
  * src/vmcore/class.h: Likewise.

  * src/native/vm/java_lang_Class.c (isPrimitive): Use
  class_is_primitive.
  (getDeclaringClass): Likewise.
  (getDeclaredClasses): Likewise.

  * src/native/vm/sun/jvm.c (JVM_GetProtectionDomain): Likewise.
  (JVM_IsPrimitiveClass): Likewise.
  (JVM_NewArray): Likewise.
........
  r8204 | twisti | 2007-07-15 14:44:22 +0200 (Sun, 15 Jul 2007) | 4 lines

  * src/native/vm/sun/jvm.c (JVM_ArrayCopy): Fixed warnings.
  (JVM_GetStackTraceElement): Likewise.
  (JVM_FindLoadedClass): Likewise.
........
  r8205 | twisti | 2007-07-15 14:45:40 +0200 (Sun, 15 Jul 2007) | 2 lines

  * src/native/vm/sun/jvm.c: Set Id keyword.
........
  r8206 | twisti | 2007-07-15 16:26:33 +0200 (Sun, 15 Jul 2007) | 7 lines

  * src/vmcore/options.c (opt_TraceJVMCalls): Added.
  * src/vmcore/options.h: Likewise.

  * src/native/vm/sun/jvm.c (vmcore/options.h): Added.
  (DEBUG_JVM): Renamed to TRACEJVMCALLS.
  (JVM_GetArrayLength): Implemented.
........
  r8207 | twisti | 2007-07-16 17:18:32 +0200 (Mon, 16 Jul 2007) | 6 lines

  * src/vmcore/class.c (class_get_declaringclass): New function.
  * src/vmcore/class.h: Likewise.

  * src/native/vm/java_lang_Class.c (getDeclaringClass): Use
  class_get_declaringclass.
........
  r8208 | twisti | 2007-07-17 11:06:22 +0200 (Tue, 17 Jul 2007) | 3 lines

  * src/native/jni.c (TRACEJNICALLS): Added but still unused.
  (JNI_GetCreatedJavaVMs): Implemented.
........
  r8209 | twisti | 2007-07-17 22:13:23 +0200 (Tue, 17 Jul 2007) | 9 lines

  * src/vmcore/class.c (vm/resolve.h): Added.
  (class_define): Changed signature.
  * src/vmcore/class.h (class_define): Likewise.

  * src/native/jni.c (_Jv_JNI_DefineClass): Bug fix, use class_define.

  * src/native/vm/java_lang_ClassLoader.c (defineClass): Use
  class_define.
........
  r8210 | twisti | 2007-07-18 14:51:00 +0200 (Wed, 18 Jul 2007) | 50 lines

  * src/vm/jit/allocator/simplereg.c: Replaced HAS_4BYTE_STACKSLOT with
  SIZEOF_VOID_P == 4.

  * src/vm/jit/i386/emit.c (vm/jit/abi.h): Added.
  (emit_verbosecall_enter): Changed to 8-byte stackslots.

  * src/vm/jit/i386/codegen.c (codegen_emit): Changed to 8-byte
  stackslots.
  (codegen_emit_stub_native): Likewise.

  * src/vm/jit/i386/arch.h (HAS_4BYTE_STACKSLOT): Removed.
  (ALIGN_LONGS_IN_MEMORY): Likewise.
  (ALIGN_DOUBLES_IN_MEMORY): Likewise.

  * src/vm/jit/i386/asmpart.S (asm_vm_call_method): Rewritten for new
  argument passing.
  (asm_handle_exception): Use 8-byte stackslots.

  * src/vm/jit/i386/md-abi.c (md_param_alloc): Use 8-byte stackslots and
  set pd->index.
  (md_param_alloc_native): New function.

  * src/vm/global.h (ALIGN_EVEN): New macro.
  (ALIGN_ODD): Likewise.
  (ALIGN_2): Defined to ALIGN_EVEN.

  * src/vm/builtintable.inc (builtintable_function): Removed #ifdef for
  java.lang.VMSystem.arraycopy, this works now correctly.

  * src/vm/builtin.c (builtintable_init): Set ACC_METHOD_BUILTIN when
  parsing the decriptor.

  * src/vm/jit_interface.h (md_param_alloc_native): Added.

  * src/vm/exceptions.c (exceptions_handle_exception): Temporarily added
  __I386__ to get the monitor object correctly.

  * src/vmcore/descriptor.c (descriptor_pool_parse_method_descriptor):
  Check for ACC_METHOD_BUILTIN flag.
  (descriptor_params_from_paramtypes): Likewise.

  * src/cacaoh/dummy.c (md_param_alloc_native): Added.

  * src/vm/jit/asmpart.h: Added __I386__ ifdef.
  * src/vm/vm.c: Likewise.
  * src/vm/vm.h: Likewise.
  * src/native/jni.c: Likewise.
  (_Jv_jni_invokeNative): Check for exception too when
  vm_array_from_objectarray returns.
........
  r8211 | michi | 2007-07-18 21:52:23 +0200 (Wed, 18 Jul 2007) | 25 lines

  * src/vm/jit/replace.h (REPLACEMENT_EMIT_STUBS): Removed macro.

  * src/vm/jit/emit-common.h (emit_replacement_stubs): Removed.

  * src/vm/jit/arm/emit.c,
  * src/vm/jit/arm/codegen.c,
  * src/vm/jit/powerpc/emit.c,
  * src/vm/jit/powerpc/codegen.c,
  * src/vm/jit/sparc64/emit.c,
  * src/vm/jit/sparc64/codegen.c,
  * src/vm/jit/alpha/emit.c,
  * src/vm/jit/alpha/codegen.c,
  * src/vm/jit/s390/emit.c,
  * src/vm/jit/mips/emit.c,
  * src/vm/jit/mips/codegen.c,
  * src/vm/jit/m68k/codegen.c,
  * src/vm/jit/powerpc64/emit.c,
  * src/vm/jit/powerpc64/codegen.c,
  * src/vm/jit/i386/emit.c,
  * src/vm/jit/i386/codegen.c,
  * src/vm/jit/x86_64/emit.c,
  * src/vm/jit/x86_64/codegen.c
  (emit_replacement_stubs): Removed.
  (codegen_emit): Do not create replacement stubs anymore.
........
  r8212 | twisti | 2007-07-18 21:59:32 +0200 (Wed, 18 Jul 2007) | 14 lines

  * src/vm/vm.c (opts): Added -XX.
  (usage): Small text change.

  * src/vmcore/options.c (opt_DebugStackFrameInfo): Added.
  (opt_DebugStackTrace): Likewise.
  (options_XX): Added type and some documentation.
  (options_xxusage): New function.
  (options_xx): Do more error checking.

  * src/vmcore/options.h (option_t): Added type and renamed option to
  value.
  (opt_DebugStackFrameInfo): Added.
  (opt_DebugStackTrace): Likewise.
........
  r8213 | michi | 2007-07-18 22:08:26 +0200 (Wed, 18 Jul 2007) | 5 lines

  * src/vmcore/options.h (opt_replace_verbose): Removed.
  * src/vmcore/options.c (opt_replace_verbose): Removed.
  * src/vm/vm.c [ENABLE_INLINING]: Removed options -ir and -iR, this is now
  called -XX:TraceReplacement.
........
  r8214 | michi | 2007-07-18 22:27:12 +0200 (Wed, 18 Jul 2007) | 2 lines

  * src/vmcore/options.c (options_XX): Fixed -XX:TraceReplacement.
........
  r8215 | michi | 2007-07-18 22:31:21 +0200 (Wed, 18 Jul 2007) | 6 lines

  * src/vm/jit/code.h (codeinfo) [ENABLE_REPLACEMENT]: Removed obsolet pointer
  to replacementstubs.

  * src/vm/jit/codegen-common.c (codegen_finish) [ENABLE_REPLACEMENT]: Do not
  resolve pointer to replacementstubs.
........
  r8216 | michi | 2007-07-19 15:51:21 +0200 (Thu, 19 Jul 2007) | 20 lines

  * src/vm/jit/powerpc/emit.c (emit_patcher_traps): Formerly known
  as emit_patcher_stubs, now emits traps instead of stubs.

  * src/vm/jit/powerpc/codegen.c (codegen_emit, codegen_emit_stub_native): Call the
  new patcher functions and adapted to above change.

  * src/vm/jit/powerpc/patcher.c: Adapted patchers to new signature for traps.
  (patcher_wrapper): Removed, this is obsolete.

  * src/vm/jit/powerpc/asmpart.S (asm_patcher_wrapper): Removed, this is obsolete.

  * src/vm/jit/powerpc/linux/md-os.c (md_signal_handler_sigsegv): Only calls the
  exception handling if exception object present.

  * src/vm/jit/powerpc/darwin/md-os.c (md_signal_handler_sigsegv): Likewise.

  * src/vm/jit/patcher-common.h [__POWERPC__]: Enabled new patcher stuff.

  * src/vm/jit/patcher.h [__POWERPC__]: Defined away old patcher stuff.
........
  r8217 | michi | 2007-07-19 17:44:41 +0200 (Thu, 19 Jul 2007) | 3 lines

  * src/vm/jit/arm/md-os.c (md_signal_handler_sigsegv): Added additional
  debug output.
........
  r8218 | michi | 2007-07-19 18:33:19 +0200 (Thu, 19 Jul 2007) | 5 lines

  * src/vm/jit/s390/md.c (md_get_method_patch_address): Fixed cornercase
  for replacement.

  * src/vm/jit/m68k/md.c (md_get_method_patch_address): Likewise.
........
  r8219 | twisti | 2007-07-20 18:52:11 +0200 (Fri, 20 Jul 2007) | 6 lines

  * src/vmcore/class.c (class_get_superclass): New function.
  * src/vmcore/class.h: Likewise.

  * src/native/jni.c (_Jv_JNI_GetSuperclass): Use class_get_superclass.
  * src/native/vm/java_lang_Class.c (getSuperclass): Likewise.
........
  r8220 | twisti | 2007-07-22 17:37:52 +0200 (Sun, 22 Jul 2007) | 8 lines

  * src/vmcore/options.c (opt_TraceJNICalls): Added.
  * src/vmcore/options.h: Likewise.

  * src/native/jni.c (TRACEJNICALLS): Enabled.
  (_Jv_JNI_GetStringLength): Added TRACEJNICALLS.
  (_Jv_JNI_NewStringUTF): Likewise.
  (_Jv_JNI_GetStringUTFLength): Likewise.
........
  r8221 | twisti | 2007-07-22 21:31:41 +0200 (Sun, 22 Jul 2007) | 3 lines

  * src/native/jni.c (_Jv_JNI_GetSuperclass): Fixed TRACEJNICALLS.
  (_Jv_JNI_GetStringUTFRegion): Bugfix, start at offset to copy data.
........
  r8222 | twisti | 2007-07-22 22:07:55 +0200 (Sun, 22 Jul 2007) | 3 lines

  * src/threads/native/threads.h (threads_yield): Removed.
  * src/threads/threads-common.h (threads_yield): Added.
........
  r8223 | twisti | 2007-07-22 22:43:05 +0200 (Sun, 22 Jul 2007) | 3 lines

  * src/vmcore/class.c (class_get_signature): New function.
  * src/vmcore/class.h: Likewise.
........
  r8224 | twisti | 2007-07-23 21:07:48 +0200 (Mon, 23 Jul 2007) | 2 lines

  * src/vmcore/class.h (classinfo): Removed unused listnode.
........
  r8225 | twisti | 2007-07-23 23:33:16 +0200 (Mon, 23 Jul 2007) | 5 lines

  * src/native/vm/sun_misc_Unsafe.c (vm/stringlocal.h): Added.
  (putInt): New function.
  (getObject): Likewise.
  (defineClass): Likewise.
........
  r8226 | twisti | 2007-07-24 10:21:23 +0200 (Tue, 24 Jul 2007) | 4 lines

  * src/native/vm/sun_misc_Unsafe.c [WITH_CLASSPATH_SUN]
  (native/include/java_security_ProtectionDomain.h): Removed #ifdef.
  (defineClass) [WITH_CLASSPATH_GNU]: Renamed pd to protectionDomain.
........
  r8227 | twisti | 2007-07-24 13:55:07 +0200 (Tue, 24 Jul 2007) | 16 lines

  * src/vmcore/loader.c (vmcore/field.h): Added.
  (load_field): Removed.
  (load_class_from_classbuffer): Call field_load.

  * src/vmcore/field.c (stdint.h): Added.
  (vm/exceptions.h): Likewise.
  (vm/stringlocal.h): Likewise.
  (vm/vm.h): Likewise.
  (vmcore/descriptor.h): Likewise.
  (vmcore/loader.h): Likewise.
  (vmcore/options.h): Likewise.
  (vmcore/suck.h): Likewise.
  (field_load): New function.

  * src/vmcore/field.h (field_load): Added.
........
  r8228 | twisti | 2007-07-24 14:37:25 +0200 (Tue, 24 Jul 2007) | 12 lines

  * src/vmcore/loader.c (vmcore/method.h): Added.
  (loader_load_method): Removed.
  (load_class_from_classbuffer): Call method_load.

  * src/vmcore/method.c (stdint.h): Added.
  (threads/lock-common): Likewise.
  (vm/exceptions.h): Likewise.
  (vmcore/suck.h): Likewise.
  (method_load): New function.

  * src/vmcore/method.h (method_load): Added.
........
  r8229 | twisti | 2007-07-24 20:42:44 +0200 (Tue, 24 Jul 2007) | 2 lines

  * src/vmcore/field.h (vmcore/loader.h): Added.
........
  r8230 | twisti | 2007-07-25 10:23:10 +0200 (Wed, 25 Jul 2007) | 9 lines

  * src/vm/string.c,
  src/vm/vm.c,
  src/vmcore/class.c,
  src/vmcore/class.h,
  src/vmcore/loader.c,
  src/vmcore/options.c,
  src/vmcore/options.h: Removed eager-loading stuff (as it was broken
  anyways).
........
  r8231 | twisti | 2007-07-25 16:21:24 +0200 (Wed, 25 Jul 2007) | 6 lines

  * src/vmcore/class.c [ENABLE_JAVASE] (class_get_signature): Only for
  JavaSE.
  * src/vmcore/class.h: Likewise.

  * src/vmcore/method.h (vmcore/loader.h): Added.
........
  r8232 | twisti | 2007-07-25 16:51:40 +0200 (Wed, 25 Jul 2007) | 4 lines

  * src/vmcore/descriptor.c (vm/vm.h): Added.
  (descriptor_to_basic_type): Code cleanup.
  (descriptor_typesize): Likewise.
........
  r8233 | twisti | 2007-07-25 17:11:20 +0200 (Wed, 25 Jul 2007) | 5 lines

  * src/vmcore/descriptor.c (descriptor_to_basic_type): Changed return
  type to int.
  (descriptor_typesize): Likewise.
  * src/vmcore/descriptor.h: Likewise.
........
  r8234 | twisti | 2007-07-26 10:21:25 +0200 (Thu, 26 Jul 2007) | 4 lines

  * src/vmcore/linker.c (dummy_alignment_long_t): New structure.
  (dummy_alignment_double_t): Likewise.
  (linker_init): Added long/double alignment check.
........
  r8235 | twisti | 2007-07-26 10:29:24 +0200 (Thu, 26 Jul 2007) | 3 lines

  * THIRDPARTY: Fixed classes path, added contrib/mapfile-vers-product,
  src/lib/gnu/sun/misc/Unsafe.java
........
  r8236 | twisti | 2007-07-27 12:18:17 +0200 (Fri, 27 Jul 2007) | 22 lines

  * src/vm/vm.c (version): Removed configuration output.
  (vm_printconfig): New function.
  (vm_create): Set bootclasspath and classpath whenever changed and
  don't call properties_postinit. This fixes a bug with
  -Djava.class.path.
  * src/vm/vm.h (vm_printconfig): Added.

  * src/vm/properties.c (properties_init): Set java.vm.info for all
  JavaSE configurations.
  (properties_postinit): Removed.
  * src/vm/properties.h (properties_postinit): Likewise.

  * src/vmcore/options.c (opt_PrintConfig): Added.
  (options_xx): Likewise.
  * src/vmcore/options.h (opt_PrintConfig): Likewise.

  * src/vmcore/suck.c (suck_add_from_property): Reset the bootclasspath
  after it changed.

  * src/cacaoh/dummy.c (properties_add): New dummy.
  (vm_printconfig): Likewise.
........
  r8237 | twisti | 2007-07-27 18:15:29 +0200 (Fri, 27 Jul 2007) | 16 lines

  * src/vmcore/class.c (class_sun_reflect_MagicAccessorImpl): Added.
  (class_issubclass): Don't get super-class directly, it can be
  unresolved. Use class_get_superclass.

  * src/vmcore/class.h (class_sun_reflect_MagicAccessorImpl): Added.

  * src/vmcore/loader.c (loader_init): Load
  class_sun_reflect_MagicAccessorImpl.

  * src/vmcore/linker.c (linker_init): Link
  class_sun_reflect_MagicAccessorImpl.

  * src/vm/access.c (access_is_accessible_class) [WITH_CLASSPATH_SUN]:
  Added sun/reflect/MagicAccessorImpl check.
  (access_is_accessible_member): Likewise.
........
  r8238 | twisti | 2007-07-27 20:41:53 +0200 (Fri, 27 Jul 2007) | 4 lines

  * src/vmcore/class.c (class_resolve_superclass): New function.
  (class_issubclass): Use class_resolve_superclass.
  (class_get_superclass): Likewise.
........
  r8239 | twisti | 2007-07-29 21:21:18 +0200 (Sun, 29 Jul 2007) | 3 lines

  * src/vm/vm.c (vm_create) [WITH_CLASSPATH_SUN]: Set bootclasspath as
  HotSpot does.
........
  r8240 | pm | 2007-07-29 22:36:47 +0200 (Sun, 29 Jul 2007) | 7 lines

  * src/vm/jit/replace.c: Enaled replacement on s390.
  * src/vm/jit/s390/arch.h,
  src/vm/jit/s390/codegen.h,
  src/vm/jit/s390/codegen.c,
  src/vm/jit/s390/emit.c,
  src/vm/jit/s390/md.c: Changed a lot: implemented profiling, fixed bugs found by mauve, begun work on replacament.
........
  r8241 | twisti | 2007-07-30 11:26:31 +0200 (Mon, 30 Jul 2007) | 4 lines

  * m4/ac_prog_javac.m4 (AC_PROG_JAVAC): Try javac as first
  compiler. Left jikes in there so configure can finish on machines
  where we don't have a javac or ecj.
........
  r8242 | twisti | 2007-07-31 10:45:35 +0200 (Tue, 31 Jul 2007) | 4 lines

  * src/mm/boehm.c (heap_allocate): Call GC_REGISTER_FINALIZER_NO_ORDER
  instead of GC_REGISTER_FINALIZER. This fixes the GC heap memory leak
  seen with e.g. Jetty.
........
  r8243 | michi | 2007-07-31 10:57:54 +0200 (Tue, 31 Jul 2007) | 21 lines

  * src/vm/exceptions.c (exceptions_new_hardware_exception): Do not create sfi.
  * src/vm/exceptions.h (exceptions_new_hardware_exception): Changed signature.

  * src/vm/jit/arm/linux/md-os.c
  * src/vm/jit/powerpc/linux/md-os.c
  * src/vm/jit/powerpc/darwin/md-os.c
  * src/vm/jit/sparc64/linux/md-os.c
  * src/vm/jit/sparc64/solaris/md-os.c
  * src/vm/jit/alpha/linux/md-os.c
  * src/vm/jit/s390/md.c
  * src/vm/jit/mips/linux/md-os.c
  * src/vm/jit/mips/irix/md-os.c
  * src/vm/jit/m68k/linux/md-os.c
  * src/vm/jit/powerpc64/linux/md-os.c
  * src/vm/jit/i386/darwin/md-os.c
  * src/vm/jit/i386/linux/md-os.c
  * src/vm/jit/x86_64/linux/md-os.c:
  Signal handlers create the sfi now.
  Adapted to above changes.
  Exception object variable is now called "e" on all archs.
........
  r8244 | michi | 2007-07-31 11:30:28 +0200 (Tue, 31 Jul 2007) | 4 lines

  * src/vm/jit/replace.c (replace_me_wrapper): Added.
  * src/vm/jit/replace.h (replace_me_wrapper): Added.
  * src/vm/exceptions.c (exceptions_new_hardware_exception): Call above function.
........

--HG--
branch : exact-gc

96 files changed:
THIRDPARTY
m4/ac_prog_javac.m4
src/cacaoh/dummy.c
src/mm/boehm.c
src/native/include/Makefile.am
src/native/jni.c
src/native/vm/java_lang_Class.c
src/native/vm/java_lang_ClassLoader.c
src/native/vm/sun_misc_Unsafe.c
src/threads/native/threads.h
src/threads/threads-common.h
src/vm/access.c
src/vm/builtin.c
src/vm/builtintable.inc
src/vm/exceptions.c
src/vm/exceptions.h
src/vm/global.h
src/vm/jit/allocator/simplereg.c
src/vm/jit/alpha/asmpart.S
src/vm/jit/alpha/codegen.c
src/vm/jit/alpha/emit.c
src/vm/jit/alpha/linux/md-os.c
src/vm/jit/alpha/md-abi.c
src/vm/jit/arm/codegen.c
src/vm/jit/arm/emit.c
src/vm/jit/arm/linux/md-os.c
src/vm/jit/asmpart.h
src/vm/jit/code.h
src/vm/jit/codegen-common.c
src/vm/jit/emit-common.h
src/vm/jit/i386/arch.h
src/vm/jit/i386/asmpart.S
src/vm/jit/i386/codegen.c
src/vm/jit/i386/darwin/md-os.c
src/vm/jit/i386/emit.c
src/vm/jit/i386/linux/md-os.c
src/vm/jit/i386/md-abi.c
src/vm/jit/m68k/codegen.c
src/vm/jit/m68k/linux/md-os.c
src/vm/jit/m68k/md.c
src/vm/jit/mips/codegen.c
src/vm/jit/mips/emit.c
src/vm/jit/mips/irix/md-os.c
src/vm/jit/mips/linux/md-os.c
src/vm/jit/patcher.h
src/vm/jit/powerpc/asmpart.S
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc/darwin/md-abi.h
src/vm/jit/powerpc/darwin/md-os.c
src/vm/jit/powerpc/emit.c
src/vm/jit/powerpc/linux/md-abi.c
src/vm/jit/powerpc/linux/md-abi.h
src/vm/jit/powerpc/linux/md-os.c
src/vm/jit/powerpc/patcher.c
src/vm/jit/powerpc64/codegen.c
src/vm/jit/powerpc64/emit.c
src/vm/jit/powerpc64/linux/md-os.c
src/vm/jit/replace.c
src/vm/jit/replace.h
src/vm/jit/s390/arch.h
src/vm/jit/s390/codegen.c
src/vm/jit/s390/codegen.h
src/vm/jit/s390/emit.c
src/vm/jit/s390/md.c
src/vm/jit/s390/patcher.c
src/vm/jit/sparc64/codegen.c
src/vm/jit/sparc64/emit.c
src/vm/jit/sparc64/linux/md-os.c
src/vm/jit/sparc64/solaris/md-os.c
src/vm/jit/x86_64/asmpart.S
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/emit.c
src/vm/jit/x86_64/linux/md-os.c
src/vm/jit_interface.h
src/vm/properties.c
src/vm/properties.h
src/vm/string.c
src/vm/vm.c
src/vm/vm.h
src/vmcore/class.c
src/vmcore/class.h
src/vmcore/descriptor.c
src/vmcore/descriptor.h
src/vmcore/field.c
src/vmcore/field.h
src/vmcore/linker.c
src/vmcore/loader.c
src/vmcore/method.c
src/vmcore/method.h
src/vmcore/options.c
src/vmcore/options.h
src/vmcore/primitive.c
src/vmcore/primitive.h
src/vmcore/statistics.c
src/vmcore/statistics.h
src/vmcore/suck.c

index e63655fdeeceb552c91686c2aa85420d8bc9930f..830fdbf3140e06b2860963c0ace782550cbb22fa 100644 (file)
@@ -70,7 +70,7 @@ The upstream for fdlibm is libgcj (http://gcc.gnu.org/java/), they sync
 again with the 'real' upstream (http://www.netlib.org/fdlibm/readme).
 
 
-* src/lib/classes/*
+* src/lib/gnu/*
 
 GNU Classpath is licensed under the terms of the GNU General Public 
 License  with the following clarification and special exception:
@@ -210,3 +210,28 @@ Copyright (C) 2006 Edwin Steiner <edwin.steiner@gmx.net>
 
 See contrib/vmlog/COPYING for the full text of the license.
 
+
+* contrib/mapfile-vers-product, src/lib/gnu/sun/misc/Unsafe.java
+
+Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation.  Sun designates this
+particular file as subject to the "Classpath" exception as provided
+by Sun in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+CA 95054 USA or visit www.sun.com if you need additional information or
+have any questions.
index 293f9fb5cb7e3f8a945daaa4fe5928678e8d874e..74d2e45713eb34a638867139b2e588f2c73588c8 100644 (file)
@@ -37,9 +37,9 @@ dnl @license GPLWithACException
 AC_DEFUN([AC_PROG_JAVAC],[
 AC_REQUIRE([AC_EXEEXT])dnl
 if test "x$JAVAPREFIX" = x; then
-        test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "ecj$EXEEXT -bootclasspath ${CLASSPATH_CLASSES} -1.5" "gcj$EXEEXT -C -bootclasspath ${CLASSPATH_CLASSES}" "jikes$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}" "javac$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}")
+        test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "javac$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}" "ecj$EXEEXT -bootclasspath ${CLASSPATH_CLASSES} -1.5" "gcj$EXEEXT -C -bootclasspath ${CLASSPATH_CLASSES}" "jikes$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}")
 else
-        test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "ecj$EXEEXT -bootclasspath ${CLASSPATH_CLASSES} -1.5" "gcj$EXEEXT -C -bootclasspath ${CLASSPATH_CLASSES}" "jikes$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}" "javac$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}", $JAVAPREFIX)
+        test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "javac$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}" "ecj$EXEEXT -bootclasspath ${CLASSPATH_CLASSES} -1.5" "gcj$EXEEXT -C -bootclasspath ${CLASSPATH_CLASSES}" "jikes$EXEEXT -bootclasspath ${CLASSPATH_CLASSES}", $JAVAPREFIX)
 fi
 test "x$JAVAC" = x && AC_MSG_ERROR([no acceptable Java compiler found in \$PATH])
 AC_PROG_JAVAC_WORKS
index 9efdeca24e66a053e46e88efdb989f8277fbd53a..0473dfab7bf2a7be2a5ce2022931d288b55339ed 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: dummy.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: dummy.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -426,6 +426,10 @@ void md_param_alloc(methoddesc *md)
 {
 }
 
+void md_param_alloc_native(methoddesc *md)
+{
+}
+
 
 /* memory *********************************************************************/
 
@@ -463,6 +467,10 @@ int32_t dump_size(void)
 
 /* properties *****************************************************************/
 
+void properties_add(char *key, char *value)
+{
+}
+
 char *properties_get(char *key)
 {
        return NULL;
@@ -594,6 +602,10 @@ void threads_startworld(void)
 
 /* vm *************************************************************************/
 
+void vm_printconfig(void)
+{
+}
+
 void vm_abort(const char *text, ...)
 {
        va_list ap;
index ebb9952ef75e395c19adc0a3d5808508ea9a2ced..a358090edeb13ae44e25e440cdf337625c10d672 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: boehm.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: boehm.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -157,7 +157,7 @@ void *heap_alloc(u4 size, u4 references, methodinfo *finalizer, bool collect)
                return NULL;
 
        if (finalizer != NULL)
-               GC_REGISTER_FINALIZER(p, finalizer_run, 0, 0, 0);
+               GC_REGISTER_FINALIZER_NO_ORDER(p, finalizer_run, 0, 0, 0);
 
        /* clear allocated memory region */
 
index 765df9c22388900fc6921257413e363efb2452ac..ff610f1cbf50c3e3d44956fd0010873f3c2f89a0 100644 (file)
@@ -22,7 +22,7 @@
 ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 ## 02110-1301, USA.
 ##
-## $Id: Makefile.am 8132 2007-06-22 11:15:47Z twisti $
+## $Id: Makefile.am 8202 2007-07-15 12:08:18Z twisti $
 
 ## Process this file with automake to produce Makefile.in
 
@@ -78,7 +78,8 @@ endif
 if WITH_CLASSPATH_SUN
 JAVASE_HEADER_FILES += \
        java_lang_AssertionStatusDirectives.h \
-       java_nio_ByteBuffer.h
+       java_nio_ByteBuffer.h \
+       sun_reflect_ConstantPool.h
 endif
 
 JAVAME_CLDC1_1_HEADER_FILES = \
index 17e5ff528a92fbd6057732e664b3eae8a07b4fe0..96bf7c5c7c2038da7b74373ba1f43d05c610884b 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jni.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: jni.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
 #include "vmcore/statistics.h"
 
 
+/* debug **********************************************************************/
+
+#if !defined(NDEBUG)
+# define TRACEJNICALLS(format, ...) \
+    do { \
+        if (opt_TraceJNICalls) { \
+            log_println((format), __VA_ARGS__); \
+        } \
+    } while (0)
+#else
+# define TRACEJNICALLS(format, ...)
+#endif
+
+
 /* global variables ***********************************************************/
 
 /* global reference table *****************************************************/
@@ -813,8 +827,7 @@ static void _Jv_jni_CallVoidMethodA(java_objectheader *o, vftbl_t *vftbl,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) \
- && !defined(__M68K__) && !defined(__ARM__) && !defined(__SPARC_64__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o,
                                                                                java_objectarray *params)
 {
@@ -1106,11 +1119,16 @@ java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o,
 
        dumpsize = dump_size();
 
-       /* fill the argument array from a object-array */
+       /* Fill the argument array from a object-array. */
 
        array = vm_array_from_objectarray(resm, o, params);
 
-       if (array == NULL) {
+       /* The array can be NULL if we don't have any arguments to pass
+          and the architecture does not have any argument registers
+          (e.g. i386).  In that case we additionally check for an
+          exception thrown. */
+
+       if ((array == NULL) && (exceptions_get_exception() != NULL)) {
                /* release dump area */
 
                dump_release(dumpsize);
@@ -1310,19 +1328,16 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
                                                   const jbyte *buf, jsize bufLen)
 {
 #if defined(ENABLE_JAVASE)
-       java_lang_ClassLoader *cl;
-       java_lang_String      *s;
-       java_bytearray        *ba;
-       jclass                 c;
+       utf               *u;
+       java_objectheader *cl;
+       classinfo         *c;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS("_Jv_JNI_DefineClass(env=%p, name=%s, loader=%p, buf=%p, bufLen=%d", env, name, loader, buf, bufLen);
 
-       cl = (java_lang_ClassLoader *) loader;
-       s  = (java_lang_String *) javastring_new_from_utf_string(name);
-       ba = (java_bytearray *) buf;
+       u  = utf_new_char(name);
+       cl = (java_objectheader *) loader;
 
-       c = (jclass) _Jv_java_lang_ClassLoader_defineClass(cl, s, ba, 0, bufLen,
-                                                                                                          NULL);
+       c = class_define(u, cl, bufLen, (const uint8_t *) buf);
 
        return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
 #else
@@ -1403,15 +1418,18 @@ jclass _Jv_JNI_FindClass(JNIEnv *env, const char *name)
 jclass _Jv_JNI_GetSuperclass(JNIEnv *env, jclass sub)
 {
        classinfo *c;
+       classinfo *super;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS("_Jv_JNI_GetSuperclass(env=%p, sub=%p)", env, sub);
 
-       c = ((classinfo *) sub)->super.cls;
+       c = (classinfo *) sub;
 
-       if (!c)
+       if (c == NULL)
                return NULL;
 
-       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
+       super = class_get_superclass(c);
+
+       return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) super);
 }
   
  
@@ -4357,6 +4375,8 @@ jsize _Jv_JNI_GetStringLength(JNIEnv *env, jstring str)
 {
        java_lang_String *s;
 
+       TRACEJNICALLS("_Jv_JNI_GetStringLength(env=%p, str=%p)", env, str);
+
        s = (java_lang_String *) str;
 
        return s->count;
@@ -4460,7 +4480,7 @@ jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes)
 {
        java_lang_String *s;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS("_Jv_JNI_NewStringUTF(env=%p, bytes=%s)", env, bytes);
 
        s = (java_lang_String *) javastring_safe_new_from_utf8(bytes);
 
@@ -4475,7 +4495,7 @@ jsize _Jv_JNI_GetStringUTFLength(JNIEnv *env, jstring string)
     java_lang_String *s;
        s4                length;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS("_Jv_JNI_GetStringUTFLength(env=%p, string=%p)", env, string);
 
        s = (java_lang_String *) string;
 
@@ -5575,7 +5595,7 @@ void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
        java_chararray   *ca;
        s4                i;
 
-       STATISTICS(jniinvokation());
+       TRACEJNICALLS("_Jv_JNI_GetStringUTFRegion(env=%p, str=%p, start=%d, len=%d, buf=%p)", env, str, start, len, buf);
 
        s  = (java_lang_String *) str;
        ca = s->value;
@@ -5586,10 +5606,8 @@ void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
                return;
        }
 
-       /* XXX not sure if this is correct */
-
        for (i = 0; i < len; i++)
-               buf[i] = ca->data[start + i];
+               buf[i] = ca->data[s->offset + start + i];
 
        buf[i] = '\0';
 }
@@ -6491,9 +6509,17 @@ jint JNI_GetDefaultJavaVMInitArgs(void *vm_args)
 
 jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
 {
-       log_text("JNI_GetCreatedJavaVMs: IMPLEMENT ME!!!");
+       TRACEJNICALLS("JNI_GetCreatedJavaVMs(vmBuf=%p, jsize=%d, jsize=%p)", vmBuf, bufLen, nVMs);
 
-       return 0;
+       if (bufLen <= 0)
+               return JNI_ERR;
+
+       /* We currently only support 1 VM running. */
+
+       vmBuf[0] = (JavaVM *) _Jv_jvm;
+       *nVMs    = 1;
+
+    return JNI_OK;
 }
 
 
@@ -6506,6 +6532,8 @@ jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
 
 jint JNI_CreateJavaVM(JavaVM **p_vm, void **p_env, void *vm_args)
 {
+       TRACEJNICALLS("JNI_CreateJavaVM(p_vm=%p, p_env=%p, vm_args=%p)", p_vm, p_env, vm_args);
+
        /* actually create the JVM */
 
        if (!vm_createjvm(p_vm, p_env, vm_args))
index ec22506c552ddd9becea714ebca26edad2f1b24f..c4f7c76fbef05cea5f6dcde19bdb6c2760126e4f 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_Class.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: java_lang_Class.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -261,13 +261,10 @@ JNIEXPORT int32_t JNICALL _Jv_java_lang_Class_isInterface(JNIEnv *env, java_lang
 s4 _Jv_java_lang_Class_isPrimitive(java_lang_Class *klass)
 {
        classinfo *c;
-       bool       result;
 
        c = (classinfo *) klass;
 
-       result = primitive_class_is_primitive(c);
-
-       return result;
+       return class_is_primitive(c);
 }
 
 
@@ -279,30 +276,13 @@ s4 _Jv_java_lang_Class_isPrimitive(java_lang_Class *klass)
 java_lang_Class *_Jv_java_lang_Class_getSuperclass(java_lang_Class *klass)
 {
        classinfo *c;
-       classinfo *sc;
+       classinfo *super;
 
        c = (classinfo *) klass;
 
-       /* for java.lang.Object, primitive and Void classes we return NULL */
-
-       if (!c->super.any)
-               return NULL;
-
-       /* for interfaces we also return NULL */
-
-       if (c->flags & ACC_INTERFACE)
-               return NULL;
-
-       /* we may have to resolve the super class reference */
-
-       if ((sc = resolve_classref_or_classinfo_eager(c->super, true)) == NULL)
-               return NULL;
-
-       /* store the resolution */
-
-       c->super.cls = sc;
+       super = class_get_superclass(c);
 
-       return (java_lang_Class *) sc;
+       return super;
 }
 
 
@@ -427,48 +407,11 @@ s4 _Jv_java_lang_Class_getModifiers(java_lang_Class *klass, s4 ignoreInnerClasse
  */
 java_lang_Class *_Jv_java_lang_Class_getDeclaringClass(java_lang_Class *klass)
 {
-       classinfo             *c;
-       classref_or_classinfo  inner;
-       utf                   *innername;
-       classinfo             *outer;
-       s4                     i;
+       classinfo *c;
 
        c = (classinfo *) klass;
 
-       if (!primitive_class_is_primitive(c) && (c->name->text[0] != '[')) {
-               if (c->innerclasscount == 0)  /* no innerclasses exist */
-                       return NULL;
-    
-               for (i = 0; i < c->innerclasscount; i++) {
-                       inner = c->innerclass[i].inner_class;
-
-                       /* check if inner_class is a classref or a real class and
-               get the class name from the structure */
-
-                       innername = IS_CLASSREF(inner) ? inner.ref->name : inner.cls->name;
-
-                       /* innerclass is this class */
-
-                       if (innername == c->name) {
-                               /* maybe the outer class is not loaded yet */
-
-                               if ((outer = resolve_classref_or_classinfo_eager(
-                                                               c->innerclass[i].outer_class,
-                                                               false)) == NULL)
-                                       return NULL;
-
-                               if (!(outer->state & CLASS_LINKED))
-                                       if (!link_class(outer))
-                                               return NULL;
-
-                               return (java_lang_Class *) outer;
-                       }
-               }
-       }
-
-       /* return NULL for arrayclasses and primitive classes */
-
-       return NULL;
+       return (java_lang_Class *) class_get_declaringclass(c);
 }
 
 
@@ -490,7 +433,7 @@ java_objectarray *_Jv_java_lang_Class_getDeclaredClasses(java_lang_Class *klass,
        c = (classinfo *) klass;
        declaredclasscount = 0;
 
-       if (!primitive_class_is_primitive(c) && (c->name->text[0] != '[')) {
+       if (!class_is_primitive(c) && (c->name->text[0] != '[')) {
                /* determine number of declared classes */
 
                for (i = 0; i < c->innerclasscount; i++) {
index e4d7ff1cfc5dedaa754327136ee370808def74fd..3fcac77bf17d926d6eaf7a22786435eb11c44605 100644 (file)
@@ -133,7 +133,7 @@ java_lang_Class *_Jv_java_lang_ClassLoader_defineClass(java_lang_ClassLoader *cl
                c = class_define(utfname, loader, new_class_data_len, new_class_data); 
        else
 #endif
-               c = class_define(utfname, loader, len, (u1 *) &data->data[offset]); 
+               c = class_define(utfname, loader, len, (const uint8_t *) &data->data[offset]);
 
        if (c == NULL)
                return NULL;
index 78c21afc2e9665173e33f04742b250120266b00c..fcc6d571bd60f53bee89987e1c614ba8ba0f64e5 100644 (file)
 #include "native/include/java_lang_Thread.h"             /* required by s.m.U */
 #include "native/include/java_lang_Throwable.h"
 
-#if defined(WITH_CLASSPATH_SUN)
-# include "native/include/java_security_ProtectionDomain.h" /* required by smU*/
-#endif
+#include "native/include/java_security_ProtectionDomain.h" /* required by smU */
 
 #include "native/include/sun_misc_Unsafe.h"
 
 #include "vm/exceptions.h"
 #include "vm/initialize.h"
+#include "vm/stringlocal.h"
 
 #include "vmcore/utf8.h"
 
@@ -66,6 +65,8 @@
 static JNINativeMethod methods[] = {
        { "registerNatives",        "()V",                                                        (void *) (intptr_t) &Java_sun_misc_Unsafe_registerNatives                },
        { "getInt",                 "(Ljava/lang/Object;J)I",                                     (void *) (intptr_t) &Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J   },
+       { "putInt",                 "(Ljava/lang/Object;JI)V",                                    (void *) (intptr_t) &Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI  },
+       { "getObject",              "(Ljava/lang/Object;J)Ljava/lang/Object;",                    (void *) (intptr_t) &Java_sun_misc_Unsafe_getObject                      },
        { "putObject",              "(Ljava/lang/Object;JLjava/lang/Object;)V",                   (void *) (intptr_t) &Java_sun_misc_Unsafe_putObject                      },
        { "getBoolean",             "(Ljava/lang/Object;J)Z",                                     (void *) (intptr_t) &Java_sun_misc_Unsafe_getBoolean                     },
        { "putBoolean",             "(Ljava/lang/Object;JZ)V",                                    (void *) (intptr_t) &Java_sun_misc_Unsafe_putBoolean                     },
@@ -86,6 +87,7 @@ static JNINativeMethod methods[] = {
        { "arrayBaseOffset",        "(Ljava/lang/Class;)I",                                       (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayBaseOffset                },
        { "arrayIndexScale",        "(Ljava/lang/Class;)I",                                       (void *) (intptr_t) &Java_sun_misc_Unsafe_arrayIndexScale                },
        { "addressSize",            "()I",                                                        (void *) (intptr_t) &Java_sun_misc_Unsafe_addressSize                    },
+       { "defineClass",            "(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;", (void *) (intptr_t) &Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2 },
        { "throwException",         "(Ljava/lang/Throwable;)V",                                   (void *) (intptr_t) &Java_sun_misc_Unsafe_throwException                 },
        { "compareAndSwapObject",   "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z", (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapObject           },
        { "compareAndSwapInt",      "(Ljava/lang/Object;JII)Z",                                   (void *) (intptr_t) &Java_sun_misc_Unsafe_compareAndSwapInt              },
@@ -144,6 +146,39 @@ JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIE
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    putInt
+ * Signature: (Ljava/lang/Object;JI)V
+ */
+JNIEXPORT void JNICALL Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset, int32_t x)
+{
+       int32_t *p;
+
+       p = (int32_t *) (((uint8_t *) o) + offset);
+
+       *p = x;
+}
+
+
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    getObject
+ * Signature: (Ljava/lang/Object;J)Ljava/lang/Object;
+ */
+JNIEXPORT java_lang_Object* JNICALL Java_sun_misc_Unsafe_getObject(JNIEnv *env, sun_misc_Unsafe *this, java_lang_Object *o, int64_t offset)
+{
+       void **p;
+       void  *value;
+
+       p = (void **) (((uint8_t *) o) + offset);
+
+       value = *p;
+
+       return value;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    putObject
@@ -490,6 +525,64 @@ JNIEXPORT int32_t JNICALL Java_sun_misc_Unsafe_addressSize(JNIEnv *env, sun_misc
 }
 
 
+/*
+ * Class:     sun/misc/Unsafe
+ * Method:    defineClass
+ * Signature: (Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;
+ */
+JNIEXPORT java_lang_Class* JNICALL Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(JNIEnv *env, sun_misc_Unsafe *this, java_lang_String *name, java_bytearray *b, int32_t off, int32_t len, java_lang_ClassLoader *loader, java_security_ProtectionDomain *protectionDomain)
+{
+       java_objectheader *cl;
+       utf               *utfname;
+       classinfo         *c;
+       java_lang_Class   *o;
+
+       cl = (java_objectheader *) loader;
+
+       /* check if data was passed */
+
+       if (b == NULL) {
+               exceptions_throw_nullpointerexception();
+               return NULL;
+       }
+
+       /* check the indexes passed */
+
+       if ((off < 0) || (len < 0) || ((off + len) > b->header.size)) {
+               exceptions_throw_arrayindexoutofboundsexception();
+               return NULL;
+       }
+
+       if (name != NULL) {
+               /* convert '.' to '/' in java string */
+
+               utfname = javastring_toutf((java_objectheader *) name, true);
+       } 
+       else {
+               utfname = NULL;
+       }
+
+       /* define the class */
+
+       c = class_define(utfname, cl, len, (const uint8_t *) &b->data[off]);
+
+       if (c == NULL)
+               return NULL;
+
+       /* for convenience */
+
+       o = (java_lang_Class *) c;
+
+#if defined(WITH_CLASSPATH_GNU)
+       /* set ProtectionDomain */
+
+       o->pd = protectionDomain;
+#endif
+
+       return o;
+}
+
+
 /*
  * Class:     sun/misc/Unsafe
  * Method:    throwException
index 9a6dc6ff6c30ff496fefddd5897fdaece09423bc..c938e3875fcad7519e5e1bc74cdecd3ca2d40aa1 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: threads.h 8027 2007-06-07 10:30:33Z michi $
+   $Id: threads.h 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -204,7 +204,6 @@ bool threads_resume_thread(threadobject *thread);
 void threads_join_all_threads(void);
 
 void threads_sleep(s8 millis, s4 nanos);
-void threads_yield(void);
 
 bool threads_wait_with_timeout_relative(threadobject *t, s8 millis, s4 nanos);
 
index 9fab77ae9c9a6910839e3fd3cd6def10c799a5c8..abcb13cfdf4202218c11ba1806a591604a2c41f8 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: threads-common.h 8003 2007-06-03 18:42:09Z twisti $
+   $Id: threads-common.h 8222 2007-07-22 20:07:55Z twisti $
 
 */
 
@@ -119,6 +119,8 @@ void          threads_impl_thread_new(threadobject *t);
 void          threads_impl_thread_free(threadobject *t);
 void          threads_impl_thread_start(threadobject *thread, functionptr f);
 
+void          threads_yield(void);
+
 #endif /* ENABLE_THREADS */
 
 #endif /* _THREADS_COMMON_H */
index b01d7d2c4ce9b76faf0c23f8a3b206dcf510e962..70acfc38e9d2b567b41f3f0f916d4ca7913d13ca 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: access.c 7976 2007-05-29 12:22:55Z twisti $
+   $Id: access.c 8237 2007-07-27 16:15:29Z twisti $
 
 */
 
@@ -75,17 +75,31 @@ bool access_is_accessible_class(classinfo *referer, classinfo *cls)
        assert(referer);
        assert(cls);
 
-       /* public classes are always accessible */
+       /* Public classes are always accessible. */
 
        if (cls->flags & ACC_PUBLIC)
                return true;
 
-       /* a class in the same package is always accessible */
+       /* A class in the same package is always accessible. */
 
        if (SAME_PACKAGE(referer, cls))
                return true;
 
-       /* a non-public class in another package is not accessible */
+#if defined(WITH_CLASSPATH_SUN)
+       /* Code for Sun's OpenJDK (see
+          hotspot/src/share/vm/runtime/reflection.cpp
+          (Reflection::verify_class_access)): Allow all accesses from
+          sun/reflect/MagicAccessorImpl subclasses to succeed
+          trivially. */
+
+       /* NOTE: This check must be before checks that could return
+          false. */
+
+       if (class_issubclass(cls, class_sun_reflect_MagicAccessorImpl))
+               return true;
+#endif
+
+       /* A non-public class in another package is not accessible. */
 
        return false;
 }
@@ -120,12 +134,26 @@ bool access_is_accessible_member(classinfo *referer, classinfo *declarer,
 {
        assert(referer);
        assert(declarer);
-       
-       /* public members are accessible */
+
+       /* Public members are accessible. */
 
        if (memberflags & ACC_PUBLIC)
                return true;
 
+#if defined(WITH_CLASSPATH_SUN)
+       /* Code for Sun's OpenJDK (see
+          hotspot/src/share/vm/runtime/reflection.cpp
+          (Reflection::verify_class_access)): Allow all accesses from
+          sun/reflect/MagicAccessorImpl subclasses to succeed
+          trivially. */
+
+       /* NOTE: This check must be before checks that could return
+          false. */
+
+       if (class_issubclass(declarer, class_sun_reflect_MagicAccessorImpl))
+               return true;
+#endif
+
        /* {declarer is not an interface} */
 
        /* private members are only accessible by the class itself */
index 8eff8b11f240389dcaae64d492e0408eb06fb1ea..43db6a30be225c7acdf68a3fac9eef8b44a590fa 100644 (file)
@@ -28,7 +28,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: builtin.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -167,14 +167,15 @@ static bool builtintable_init(void)
 
        descriptor_pool_alloc_parsed_descriptors(descpool);
 
-       /* now parse all descriptors */
+       /* Now parse all descriptors.  NOTE: builtin-functions are treated
+          like static methods (no `this' pointer). */
 
        for (bte = builtintable_internal; bte->fp != NULL; bte++) {
-               /* parse the descriptor, builtin is always static (no `this' pointer) */
-
-               bte->md = descriptor_pool_parse_method_descriptor(descpool,
-                                                                                                                 bte->descriptor,
-                                                                                                                 ACC_STATIC, NULL);
+               bte->md =
+                       descriptor_pool_parse_method_descriptor(descpool,
+                                                                                                       bte->descriptor,
+                                                                                                       ACC_STATIC | ACC_METHOD_BUILTIN,
+                                                                                                       NULL);
 
                /* generate a builtin stub if we need one */
 
@@ -183,15 +184,19 @@ static bool builtintable_init(void)
        }
 
        for (bte = builtintable_automatic; bte->fp != NULL; bte++) {
-               bte->md = descriptor_pool_parse_method_descriptor(descpool,
-                                                                                                                 bte->descriptor,
-                                                                                                                 ACC_STATIC, NULL);
+               bte->md =
+                       descriptor_pool_parse_method_descriptor(descpool,
+                                                                                                       bte->descriptor,
+                                                                                                       ACC_STATIC | ACC_METHOD_BUILTIN,
+                                                                                                       NULL);
        }
 
        for (bte = builtintable_function; bte->fp != NULL; bte++) {
-               bte->md = descriptor_pool_parse_method_descriptor(descpool,
-                                                                                                                 bte->descriptor,
-                                                                                                                 ACC_STATIC, NULL);
+               bte->md =
+                       descriptor_pool_parse_method_descriptor(descpool,
+                                                                                                       bte->descriptor,
+                                                                                                       ACC_STATIC | ACC_METHOD_BUILTIN,
+                                                                                                       NULL);
        }
 
        /* release dump area */
index e33774c30ef12bb06509bb997c6911c9a7168529..fa962036249eccd3d68133163678b1b627f317b6 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: builtintable.inc 7936 2007-05-22 17:05:42Z michi $
+   $Id: builtintable.inc 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -965,12 +965,6 @@ static builtintable_entry builtintable_function[] = {
 
        /* java.lang.VMSystem.arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V STATIC NATIVE */
 
-#if defined(__MIPS__) && (SIZEOF_VOID_P != 4)
-       /* We can't use this optimization on MIPS32, since it has only 4
-          argument registers and we use 8-byte stack slots.  The code
-          generated does not access the correct 5th argument (hint: *8
-          instead of *4). */
-
        {
                ICMD_BUILTIN,
                BUILTINTABLE_FLAG_EXCEPTION,
@@ -984,7 +978,6 @@ static builtintable_entry builtintable_function[] = {
                NULL,
                NULL
        },
-#endif
 
        /* java.lang.System.arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V PUBLIC STATIC */
 
index 51cb6ce9596ca00c6e37c28c310565768b3c0598..f1fceffa67b15ece2205aadea862a1d6f389d139 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: exceptions.c 8178 2007-07-05 11:13:20Z michi $
+   $Id: exceptions.c 8244 2007-07-31 09:30:28Z michi $
 
 */
 
@@ -1732,16 +1732,12 @@ java_objectheader *exceptions_fillinstacktrace(void)
 
 *******************************************************************************/
 
-java_objectheader *exceptions_new_hardware_exception(u1 *pv, u1 *sp, u1 *ra, u1 *xpc, s4 type, ptrint val, stackframeinfo *sfi)
+java_objectheader *exceptions_new_hardware_exception(u1 *xpc, s4 type, ptrint val)
 {
        java_objectheader *e;
        java_objectheader *o;
        s4                 index;
 
-       /* create stackframeinfo */
-
-       stacktrace_create_extern_stackframeinfo(sfi, pv, sp, ra, xpc);
-
        switch (type) {
        case EXCEPTION_HARDWARE_NULLPOINTER:
                e = exceptions_new_nullpointerexception();
@@ -1766,6 +1762,12 @@ java_objectheader *exceptions_new_hardware_exception(u1 *pv, u1 *sp, u1 *ra, u1
                break;
 
        case EXCEPTION_HARDWARE_PATCHER:
+#if defined(ENABLE_REPLACEMENT)
+               if (replace_me_wrapper(xpc)) {
+                       e = NULL;
+                       break;
+               }
+#endif
                e = patcher_handler(xpc);
                break;
 
@@ -1796,10 +1798,6 @@ java_objectheader *exceptions_new_hardware_exception(u1 *pv, u1 *sp, u1 *ra, u1
                e = NULL;
        }
 
-       /* remove stackframeinfo */
-
-       stacktrace_remove_stackframeinfo(sfi);
-
        /* return the exception object */
 
        return e;
@@ -1977,7 +1975,7 @@ u1 *exceptions_handle_exception(java_objectheader *xptr, u1 *xpc, u1 *pv, u1 *sp
        if (issync) {
                /* get synchronization object */
 
-# if defined(__MIPS__) && (SIZEOF_VOID_P == 4)
+# if (defined(__MIPS__) && (SIZEOF_VOID_P == 4)) || defined(__I386__)
                /* XXX change this if we ever want to use 4-byte stackslots */
                o = *((java_objectheader **) (sp + issync - 8));
 # else
index 9b7968307139866905f9ef81b22c4d9cf724e198..803e5a11a5db698f7ffc129c2572f63a4e908258 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: exceptions.h 8178 2007-07-05 11:13:20Z michi $
+   $Id: exceptions.h 8243 2007-07-31 08:57:54Z michi $
 
 */
 
@@ -138,7 +138,7 @@ void exceptions_classnotfoundexception_to_noclassdeffounderror(void);
 
 java_objectheader *exceptions_fillinstacktrace(void);
 
-java_objectheader *exceptions_new_hardware_exception(u1 *pv, u1 *sp, u1 *ra, u1 *xpc, s4 type, ptrint val, stackframeinfo *sfi);
+java_objectheader *exceptions_new_hardware_exception(u1 *xpc, s4 type, ptrint val);
 
 void exceptions_print_exception(java_objectheader *xptr);
 void exceptions_print_current_exception(void);
index 6cee78a254626f7b9843d4372d9699fb1509a887..94e04cf3f126cf39c72681645a9476a923805751 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: global.h 8179 2007-07-05 11:21:08Z michi $
+   $Id: global.h 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -73,7 +73,10 @@ typedef union {
 
 /* alignment macros ***********************************************************/
 
-#define ALIGN_2(a)    do { if ((a) & 0x1) (a)++; } while (0)
+#define ALIGN_EVEN(a)                   ((a) = (((a) + 1) & ~1))
+#define ALIGN_ODD(a)                    ((a) =   (a) | 1       )
+
+#define ALIGN_2(a)                      ALIGN_EVEN(a)
 
 
 /* forward typedefs ***********************************************************/
@@ -186,8 +189,9 @@ typedef struct java_objectarray java_objectarray;
 
 /* special flags used in methodinfo *******************************************/
 
-#define ACC_METHOD_IMPLEMENTED 0x00010000     /* there is an implementation   */
-#define ACC_METHOD_MONOMORPHIC 0x00020000     /* currently monomorphic method */
+#define ACC_METHOD_BUILTIN     0x00010000     /* use for descriptor parsing   */
+#define ACC_METHOD_IMPLEMENTED 0x00020000     /* there is an implementation   */
+#define ACC_METHOD_MONOMORPHIC 0x00040000     /* currently monomorphic method */
 
 
 /* data structures of the runtime system **************************************/
index 3d057aa1daa8c7885eb52a5f388ef2c98af34633..c5c557bc390efc42f0a228902a4f38dff63ca823 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.
 
-   $Id: simplereg.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: simplereg.c 8210 2007-07-18 12:51:00Z twisti $
 
 */
 
@@ -440,7 +440,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                                fltalloc = s * 5 + t;
                                        }
                                        else { /* !IS_FLT_DBL_TYPE(t) */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                /*
                                                 * for i386 put all longs in memory
                                                 */
@@ -449,7 +449,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                                        NEW_MEM_SLOT_INT_LNG(regoff);
                                                } 
                                                else
-#endif /* defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE...GISTERS) */
+#endif
                                                        if (intalloc >= 0) {
                                                                /* Reuse memory slot(s)/register(s) for shared interface slots */
                                                                flags |= jd->interface_map[intalloc].flags & ~SAVEDVAR;
@@ -515,7 +515,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                                                fltalloc = s * 5 + t;
                                        }
                                        else { /* IS_INT_LNG */
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                /*
                                                 * for i386 put all longs in memory
                                                 */
@@ -694,7 +694,7 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
 
                                } 
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -846,7 +846,7 @@ static void simplereg_allocate_locals(jitdata *jd)
                                        fltalloc = jd->local_map[s * 5 + t];
                                }
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -875,7 +875,7 @@ static void simplereg_allocate_locals(jitdata *jd)
                                                        v->flags = INMEMORY;
                                                        NEW_MEM_SLOT_INT_LNG(v->vv.regoff);
                                                }
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        }
 #endif
                                        intalloc = jd->local_map[s * 5 + t];
@@ -1065,7 +1065,7 @@ static void simplereg_new_temp(jitdata *jd, s4 index)
                                        }
                                } 
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
@@ -1121,7 +1121,7 @@ static void simplereg_new_temp(jitdata *jd, s4 index)
 
                                } 
                                else {
-#if defined(HAS_4BYTE_STACKSLOT) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
+#if (SIZEOF_VOID_P == 4) && !defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                        /*
                                         * for i386 put all longs in memory
                                         */
index 142e758a386e2683d11a461b88f82c1394fc29ac..9a35eefbc6046c226eb16ebb7d5b0dbc86cf9e50 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 8186 2007-07-05 23:48:16Z michi $
+   $Id: asmpart.S 8198 2007-07-12 07:16:24Z twisti $
 
 */
 
@@ -114,92 +114,72 @@ asm_vm_call_method_long:
 asm_vm_call_method_float:
 asm_vm_call_method_double:
        ldgp    gp,0(pv)
-       lda     sp,-5*8(sp)               /* allocate stack space                 */
-       stq     ra,0*8(sp)                /* save return address                  */
-       stq     gp,1*8(sp)                /* save global pointer                  */
-       stq     s6,3*8(sp)
-
-       stq     a0,4*8(sp)                /* save method pointer for compiler     */
-
-       mov     a2,t0                     /* pointer to arg block                 */
-       mov     a1,s6                     /* arg count                            */
-
-       ble     s6,calljava_argsloaded
-       lda     s6,-1(s6)
-       ldq     a0,offvmargdata(t0)
-       ldt     $f16,offvmargdata(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a1,offvmargdata+sizevmarg*1(t0)
-       ldt     $f17,offvmargdata+sizevmarg*1(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a2,offvmargdata+sizevmarg*2(t0)
-       ldt     $f18,offvmargdata+sizevmarg*2(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a3,offvmargdata+sizevmarg*3(t0)
-       ldt     $f19,offvmargdata+sizevmarg*3(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a4,offvmargdata+sizevmarg*4(t0)
-       ldt     $f20,offvmargdata+sizevmarg*4(t0)
-       ble     s6,calljava_argsloaded
-
-       lda     s6,-1(s6)
-       ldq     a5,offvmargdata+sizevmarg*5(t0)
-       ldt     $f21,offvmargdata+sizevmarg*5(t0)
-calljava_argsloaded:
-       mov     sp,t4
-       ble     s6,calljava_nocopy
-       negq    s6,t1
-       s8addq  t1,sp,sp
-       s8addq  t1,t4,t2
-
-calljava_copyloop:
-       ldq     t3,offvmargdata+sizevmarg*6(t0)
-       stq     t3,0(t2)
-       lda     t1,1(t1)
-       lda     t0,sizevmarg(t0)
-       lda     t2,8(t2)
-       bne     t1,calljava_copyloop
-
-calljava_nocopy:
-       ldq     itmp1,4*8(t4)             /* pass method pointer via itmp1        */
-
-       lda     mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
-       stq     mptr,2*8(t4)              /* store function address               */
-       lda     mptr,1*8(t4)              /* set method pointer                   */
-
-       ldq     pv,1*8(mptr)              /* method call as in Java               */
-       jmp     ra,(pv)                   /* call JIT compiler                    */
-calljava_jit2:
-       lda     pv,(asm_vm_call_method - calljava_jit2)(ra)
-
-       s8addq  s6,sp,sp
-calljava_return2:
-       ldq     ra,0*8(sp)                /* restore return address               */
-       ldq     gp,1*8(sp)                /* restore global pointer               */
-       ldq     s6,3*8(sp)
-       lda     sp,5*8(sp)                /* free stack space                     */
-
-calljava_ret2:
+       lda     sp,-5*8(sp)                 /* allocate stack space               */
+       stq     ra,0*8(sp)                  /* save return address                */
+       stq     gp,1*8(sp)                  /* save global pointer                */
+
+       stq     s0,3*8(sp)
+       stq     a0,4*8(sp)                  /* save method PV                     */
+
+       mov     a1,t0                       /* address of argument array          */
+       mov     a2,t1                       /* stack argument count               */
+       mov     sp,s0                       /* save stack pointer                 */
+
+       ldq     a0,0*8(t0)
+       ldq     a1,1*8(t0)
+       ldq     a2,2*8(t0)
+       ldq     a3,3*8(t0)
+       ldq     a4,4*8(t0)
+       ldq     a5,5*8(t0)
+
+       ldt     fa0,6*8(t0)
+       ldt     fa1,7*8(t0)
+       ldt     fa2,8*8(t0)
+       ldt     fa3,9*8(t0)
+       ldt     fa4,10*8(t0)
+       ldt     fa5,11*8(t0)
+
+       beq     t1,L_asm_vm_call_method_stack_copy_done
+
+       negq    t1,t2                       /* calculate stackframe size (* 8)    */
+       s8addq  t2,sp,sp                    /* create stackframe                  */
+       mov     sp,t2                       /* temporary stack pointer            */
+
+L_asm_vm_call_method_stack_copy_loop:
+       ldq     t3,12*8(t0)                 /* load argument                      */
+       stq     t3,0(t2)                    /* store argument on stack            */
+
+       subq    t1,1,t1                     /* subtract 1 argument                */
+       addq    t0,8,t0                     /* load address of next argument      */
+       addq    t2,8,t2                     /* increase stack pointer             */
+
+       bgt     t1,L_asm_vm_call_method_stack_copy_loop
+
+L_asm_vm_call_method_stack_copy_done:
+       lda     mptr,4*8(s0)                /* get address of PV                  */
+       ldq     pv,0*8(mptr)                /* load PV                            */
+       jmp     ra,(pv)
+L_asm_vm_call_method_recompute_pv:
+       lda     pv,(asm_vm_call_method - L_asm_vm_call_method_recompute_pv)(ra)
+
+       mov     s0,sp                       /* restore stack pointer              */
+
+L_asm_vm_call_method_recompute_return:
+       ldq     ra,0*8(sp)                  /* restore RA                         */
+       ldq     gp,1*8(sp)                  /* restore global pointer             */
+       ldq     s0,3*8(sp)
+
+       lda     sp,5*8(sp)                  /* free stack space                   */
        jmp     zero,(ra)
 
 asm_vm_call_method_exception_handler:
-       s8addq  s6,sp,sp
-       ldq     gp,1*8(sp)                /* restore global pointer               */
+       mov     s0,sp                       /* restore stack pointer              */
+       ldq     gp,1*8(sp)                  /* restore global pointer             */
        mov     itmp1,a0
        jsr     ra,builtin_throw_exception
-       ldq     ra,0*8(sp)                /* restore return address               */
-       ldq     s6,3*8(sp)
-       lda     sp,5*8(sp)                /* free stack space                     */
+
 asm_vm_call_method_end:                                        
-       jmp     zero,(ra)
+       br      L_asm_vm_call_method_recompute_return
 
        .end    asm_vm_call_method
 
index fcf43b4c3fd899aa8ad319cae173ab8fe005f356..f0c42559aec9ad7f0493bfe273b70d2f842b7994 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8188 2007-07-06 00:31:03Z michi $
+   $Id: codegen.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -3069,10 +3069,9 @@ gen_method:
 
        dseg_createlinenumbertable(cd);
 
-       /* generate stubs */
+       /* generate traps */
 
        emit_patcher_traps(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */
 
index d0e08dce33b3bacab539035cdc3efd8b426c0ad6..6a9dabd3d0cc78279576e41b548d46813c462d1d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 8186 2007-07-05 23:48:16Z michi $
+   $Id: emit.c 8211 2007-07-18 19:52:23Z michi $
 
 */
 
@@ -450,71 +450,6 @@ void emit_patcher_traps(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       s4           disp;
-       s4           i;
-#if !defined(NDEBUG)
-       u1          *savedmcodeptr;
-#endif
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       rplp = code->rplpoints;
-
-       /* store beginning of replacement stubs */
-
-       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
-
-       for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
-               /* do not generate stubs for non-trappable points */
-
-               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-               /* check code segment size */
-
-               MCODECHECK(100);
-
-#if !defined(NDEBUG)
-               savedmcodeptr = cd->mcodeptr;
-#endif
-
-               /* create stack frame - 16-byte aligned */
-
-               M_LSUB_IMM(REG_SP, 2 * 8, REG_SP);
-
-               /* push address of `rplpoint` struct */
-
-               disp = dseg_add_address(cd, rplp);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST(REG_ITMP3, REG_SP, 0 * 8);
-
-               /* jump to replacement function */
-
-               disp = dseg_add_functionptr(cd, asm_replacement_out);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_JMP(REG_ZERO, REG_ITMP3);
-
-               assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
-       }
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
index b2b265fd5d32b6dc2365c35376263a9e9e2ef024..f26293d2fe87082539464e230986b59a73011e71 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8188 2007-07-06 00:31:03Z michi $
+   $Id: md-os.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -106,9 +106,17 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                type = (s4) addr;
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
index 457b23d9b0b054e8505fbb0bc0424bbb60e288df..2fed88870da49d2dee57e2968126d7137c299b2a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: md-abi.c 8198 2007-07-12 07:16:24Z twisti $
 
 */
 
@@ -174,12 +174,14 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (i < INT_ARG_CNT) {
                                pd->inmemory = false;
+                               pd->index    = reguse;
                                pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                                md->argintreguse = reguse;
                        }
                        else {
                                pd->inmemory = true;
+                               pd->index    = stacksize;
                                pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
@@ -189,12 +191,14 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (i < FLT_ARG_CNT) {
                                pd->inmemory = false;
+                               pd->index    = reguse;
                                pd->regoff   = abi_registers_float_argument[reguse];
                                reguse++;
                                md->argfltreguse = reguse;
                        }
                        else {
                                pd->inmemory = true;
+                               pd->index    = stacksize;
                                pd->regoff   = stacksize * 8;
                                stacksize++;
                        }
index e1128c95eb0319a69b07b29f1e87936e7dc0a3a0..9b9125a87d3e9567a798492904c8dcfe9bbc5187 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8183 2007-07-05 20:37:05Z michi $
+   $Id: codegen.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -2885,10 +2885,9 @@ bool codegen_emit(jitdata *jd)
        dseg_createlinenumbertable(cd);
 
 
-       /* generate stubs */
+       /* generate traps */
 
        emit_patcher_traps(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */
 
index ae658a566124167cc4cece09f012133f042f1c6d..2967a7872d14f65d4fecf28f8eecb382cd62c09b 100644 (file)
@@ -604,30 +604,6 @@ void emit_patcher_traps(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       u1          *savedmcodeptr;
-       s4           disp;
-       s4           i;
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
index 0957136f454ae8a7da176270843c9fcf0d2e02dd..4c593bba102466e98c043590895afb41f03fa04c 100644 (file)
@@ -82,7 +82,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        ptrint             addr;
        s4                 type;
        ptrint             val;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t*) _p;
        _sc = &_uc->uc_mcontext;
@@ -97,6 +97,9 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
 
        /* get exception-throwing instruction */
 
+       if (xpc == NULL)
+               vm_abort("md_signal_handler_sigsegv: the program counter is NULL");
+
        mcode = *((s4 *) xpc);
 
        /* this is a NullPointerException */
@@ -108,13 +111,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        if (addr != 0)
                vm_abort("md_signal_handler_sigsegv: faulting address is not NULL: addr=%p", addr);
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _sc->arm_r10 = (ptrint) o;
+       _sc->arm_r10 = (ptrint) e;
        _sc->arm_fp  = (ptrint) xpc;
        _sc->arm_pc  = (ptrint) asm_handle_exception;
 }
@@ -138,7 +149,7 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p)
        u4                 mcode;
        s4                 type;
        ptrint             val;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t*) _p;
        _sc = &_uc->uc_mcontext;
@@ -163,15 +174,23 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p)
        type = (mcode >> 8) & 0x0fff;
        val  = *((s4 *) _sc + OFFSET(scontext_t, arm_r0)/4 + (mcode & 0x0f));
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers if we have an exception, return continue execution
           otherwise (this is needed for patchers to work) */
 
-       if (o != NULL) {
-               _sc->arm_r10 = (ptrint) o;
+       if (e != NULL) {
+               _sc->arm_r10 = (ptrint) e;
                _sc->arm_fp  = (ptrint) xpc;
                _sc->arm_pc  = (ptrint) asm_handle_exception;
        }
index 5628823bf8eba1b734c71f81b1e23c635bc8b25c..1cf98d67148c4466c56036f298ba9aa3d6839ba4 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.h 8128 2007-06-21 16:29:53Z tbfg $
+   $Id: asmpart.h 8210 2007-07-18 12:51:00Z twisti $
 
 */
 
@@ -89,7 +89,7 @@ s4   asm_md_init(void);
 void asm_call_jit_compiler(void);
 
 #if defined(ENABLE_JIT)
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 java_objectheader *asm_vm_call_method(methodinfo *m, s4 vmargscount,
                                                                          vm_arg *vmargs);
 s4     asm_vm_call_method_int(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
index d26bfdf80be41a47e67c35b73cb2e14b5a74854e..db25e78b3866551ffe35450dd4226f07fdddc528 100644 (file)
@@ -82,7 +82,6 @@ struct codeinfo {
 #if defined(ENABLE_REPLACEMENT)
        rplpoint     *rplpoints;            /* replacement points                 */
        rplalloc     *regalloc;             /* register allocation info           */
-       u1           *replacementstubs;     /* beginning of replacement stubs     */
        s4            rplpointcount;        /* number of replacement points       */
        s4            globalcount;          /* number of global allocations       */
        s4            regalloccount;        /* number of total allocations        */
index c675edd19416a5931f37a18396abf077052ff1d8..c495c959c8d5e42de7eae891425caab49b6dca8a 100644 (file)
@@ -39,7 +39,7 @@
    memory. All functions writing values into the data area return the offset
    relative the begin of the code area (start of procedure).   
 
-   $Id: codegen-common.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: codegen-common.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -1082,8 +1082,6 @@ void codegen_finish(jitdata *jd)
                int i;
                rplpoint *rp;
 
-               code->replacementstubs += (ptrint) epoint;
-
                rp = code->rplpoints;
                for (i=0; i<code->rplpointcount; ++i, ++rp) {
                        rp->pc = (u1*) ((ptrint) epoint + (ptrint) rp->pc);
index 2749d8ebf757fe276357feae6200b2e9cdb1fa64..99c4b7216113d2fc0c6a64fcf2f3aa9151775884 100644 (file)
@@ -180,9 +180,6 @@ void emit_exception_check(codegendata *cd, instruction *iptr);
 
 void emit_patcher_stubs(jitdata *jd);
 void emit_patcher_traps(jitdata *jd);
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd);
-#endif
 
 void emit_verbosecall_enter(jitdata *jd);
 void emit_verbosecall_exit(jitdata *jd);
index 22cd6de2e36f26b7db00e103373aefe497bf641d..812b0c17114357c8906c802e447eec987a3e812c 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: arch.h 7695 2007-04-12 19:49:34Z twisti $
+   $Id: arch.h 8210 2007-07-18 12:51:00Z twisti $
 
 */
 
 #endif
 
 
-#define HAS_4BYTE_STACKSLOT
-#define ALIGN_LONGS_IN_MEMORY       /* Align Longs and/or Doubles at         */
-#define ALIGN_DOUBLES_IN_MEMORY     /* 2*Stackslotsize relativ to stackframe */
-/* Memory Positions for not Interface Stackslots (allocate_scratch_registers)*/
-/* are not properly aligned in case HAS_4_BYTE_STACKSLOT is not defined!     */
-/* For HAS_4_BYTE_STACKSLOT archs no distinction is made between long and dbl*/
 /* define SUPPORT_COMBINE_INTEGER_REGISTERS */
 
 
index f40b406a3e981e795b81fc938abbc9785f89820f..f344e1afff1957fdb2f795cc1a8baab6ece47112 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7678 2007-04-09 17:23:55Z twisti $
+   $Id: asmpart.S 8210 2007-07-18 12:51:00Z twisti $
 
 */
 
@@ -152,65 +152,36 @@ asm_vm_call_method_double:
        mov     s1,1*4(sp)
        mov     s2,2*4(sp)
 
-       mov     4*4(bp),itmp1               /* pointer to arg block (4(push)+4(return)+4+4)*/
-       mov     3*4(bp),itmp2               /* arg count            (4(push)+4(return)+4 */
+       mov     sp,s1                       /* save stack pointer                 */
 
-       mov     sp,s1                       /* save the stackpointer              */
+       mov     3*4(bp),t0                  /* address of data structure          */
+       mov     4*4(bp),itmp1               /* number of stack arguments          */
 
-       test    itmp2,itmp2                 /* maybe we have no args              */
-       jle     L_asm_vm_call_method_copy_done
+       cmp     $0,itmp1
+       je      L_asm_vm_call_method_stack_copy_done
 
-       mov     itmp2,itmp3                 /* calculate stack size               */
-       mov     itmp1,%edi                  /* save pointer to arg block          */
+       mov     itmp1,itmp2
+       add     $1,itmp2                    /* keep stack 16-byte aligned         */
+       and     $0xfffffffe,itmp2
+       shl     $3,itmp2                    /* calculate stack size               */
+       sub     itmp2,sp                    /* create stack frame                 */
+       mov     sp,itmp2                    /* temporary stack pointer            */
 
-calljava_calcstacksize:
-       mov     offvmargtype(itmp1),t0
-       test    $1,t0                       /* two word type?                     */
-       jz      calljava_onewordtype
+L_asm_vm_call_method_stack_copy_loop:
+       mov     0(t0),itmp3                 /* load argument                      */
+       mov     itmp3,0(itmp2)              /* store argument on stack            */
+       mov     4(t0),itmp3
+       mov     itmp3,4(itmp2)
 
-       sub     $4,sp                       /* add 1 slot to stackframe size      */
+       sub     $1,itmp1                    /* subtract 1 argument                */
+       add     $8,t0                       /* set address of next argument       */
+       add     $8,itmp2                    /* increase SP                        */
 
-calljava_onewordtype:
-       sub     $4,sp                       /* add 1 slot to stackframe size      */
-       sub     $1,itmp3
-       test    itmp3,itmp3                 /* any args left?                     */
-       jz      calljava_setstack
+       cmp     $0,itmp1
+       jg      L_asm_vm_call_method_stack_copy_loop
 
-       add     $sizevmarg,itmp1            /* goto next argument block           */
-       jmp     calljava_calcstacksize
-               
-calljava_setstack:                             
-       mov     %edi,itmp1                  /* restore pointer to arg block       */
-       and     $0xfffffff0,sp              /* align stack to 16-byte             */
-       mov     sp,itmp3                    /* initialize pointer for copying     */
-
-calljava_copyloop:
-       mov     offvmargdata(itmp1),t0      /* get 4-bytes of argument            */
-       mov     t0,(itmp3)                  /* and store them on the stack        */
-       add     $4,itmp3                    /* increase sp to next argument       */
-
-       mov     offvmargtype(itmp1),t0      /* get the argument type              */
-       test    $1,t0                       /* two word type?                     */
-       jz      calljava_copynext
-
-       mov     offvmargdata+4(itmp1),t0    /* get upper 4-bytes of 2 word type   */
-       mov     t0,(itmp3)                      
-       add     $4,itmp3                    /* increase sp to next argument       */
-
-calljava_copynext:             
-       sub     $1,itmp2                    /* are there any args left?           */
-       test    itmp2,itmp2
-       jle     L_asm_vm_call_method_copy_done
-
-       add     $sizevmarg,itmp1            /* goto next argument block           */
-       jmp     calljava_copyloop
-
-L_asm_vm_call_method_copy_done:
-       mov     2*4(bp),itmp1               /* move function pointer to itmp1     */
-
-       lea     L_asm_call_jit_compiler,mptr
-       mov     mptr,3*4(s1)
-       lea     (3*4-256)(s1),mptr          /* We subtract 256 to force the next  */
+L_asm_vm_call_method_stack_copy_done:
+       lea     (2*4-256)(bp),mptr          /* We subtract 256 to force the next  */
                                            /* move instruction to have a 32-bit  */
                                            /* offset.                            */
 
@@ -381,11 +352,11 @@ L_asm_handle_exception_no_leaf_stack:
        cmp     $2,itmp1
        je      int2
 
-       mov     -3*4(itmp2),s0
+       mov     -3*8(itmp2),s0
 int2:  
-       mov     -2*4(itmp2),s1
+       mov     -2*8(itmp2),s1
 int1:  
-       mov     -1*4(itmp2),s2
+       mov     -1*8(itmp2),s2
 
        shl     $2,itmp1                    /* multiply by 4 bytes                */
        sub     itmp1,itmp2
index 7adca2432970340918e193d68efdd6e7d0509804..05438e2b1c758f5465547702e554aeff7e94bc9a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8138 2007-06-22 20:01:51Z michi $
+   $Id: codegen.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -132,9 +132,7 @@ bool codegen_emit(jitdata *jd)
        /* space to save used callee saved registers */
 
        savedregs_num += (INT_SAV_CNT - rd->savintreguse);
-
-       /* float register are saved on 2 4-byte stackslots */
-       savedregs_num += (FLT_SAV_CNT - rd->savfltreguse) * 2;
+       savedregs_num += (FLT_SAV_CNT - rd->savfltreguse);
 
        cd->stackframesize = rd->memuse + savedregs_num;
 
@@ -142,25 +140,20 @@ bool codegen_emit(jitdata *jd)
 #if defined(ENABLE_THREADS)
        /* space to save argument of monitor_enter */
 
-       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
-               /* reserve 2 slots for long/double return values for monitorexit */
-
-               if (IS_2_WORD_TYPE(m->parseddesc->returntype.type))
-                       cd->stackframesize += 2;
-               else
-                       cd->stackframesize++;
-       }
+       if (checksync && (m->flags & ACC_SYNCHRONIZED))
+               cd->stackframesize++;
 #endif
 
        /* create method header */
 
     /* Keep stack of non-leaf functions 16-byte aligned. */
 
-       if (!jd->isleafmethod)
-               cd->stackframesize |= 0x3;
+       if (!jd->isleafmethod) {
+               ALIGN_ODD(cd->stackframesize);    /* XXX this is wrong, +4 is missing */
+       }
 
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
-       (void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize       */
+       (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize       */
 
 #if defined(ENABLE_THREADS)
        /* IsSync contains the offset relative to the stack pointer for the
@@ -170,7 +163,7 @@ bool codegen_emit(jitdata *jd)
        */
 
        if (checksync && (m->flags & ACC_SYNCHRONIZED))
-               (void) dseg_add_unique_s4(cd, (rd->memuse + 1) * 4); /* IsSync        */
+               (void) dseg_add_unique_s4(cd, (rd->memuse + 1) * 8); /* IsSync        */
        else
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
@@ -211,16 +204,16 @@ bool codegen_emit(jitdata *jd)
        /* create stack frame (if necessary) */
 
        if (cd->stackframesize)
-               M_ASUB_IMM(cd->stackframesize * 4, REG_SP);
+               M_ASUB_IMM(cd->stackframesize * 8, REG_SP);
 
        /* save return address and used callee saved registers */
 
        p = cd->stackframesize;
        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
-               p--; M_AST(rd->savintregs[i], REG_SP, p * 4);
+               p--; M_AST(rd->savintregs[i], REG_SP, p * 8);
        }
        for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
-               p-=2; emit_fld_reg(cd, rd->savfltregs[i]); emit_fstpl_membase(cd, REG_SP, p * 4);
+               p--; emit_fld_reg(cd, rd->savfltregs[i]); emit_fstpl_membase(cd, REG_SP, p * 8);
        }
 
        /* take arguments out of register or stack frame */
@@ -248,8 +241,8 @@ bool codegen_emit(jitdata *jd)
                        continue;
 
                var = VAR(varindex);
-               
-               s1 = md->params[p].regoff;
+               s1  = md->params[p].regoff;
+               d   = var->vv.regoff;
 
                if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
                        if (!md->params[p].inmemory) {           /* register arguments    */
@@ -262,27 +255,25 @@ bool codegen_emit(jitdata *jd)
                                        /* rd->argintregs[md->params[p].regoff -> var->vv.regoff * 4 */
                                }
                        } 
-                       else {                                   /* stack arguments       */
-                               if (!(var->flags & INMEMORY)) {      /* stack arg -> register */
-                                       emit_mov_membase_reg(           /* + 4 for return address */
-                                          cd, REG_SP, cd->stackframesize * 4 + s1 + 4, var->vv.regoff);
-                                                                       /* + 4 for return address */
+                       else {
+                               if (!(var->flags & INMEMORY)) {
+                                       M_ILD(d, REG_SP, cd->stackframesize * 8 + 4 + s1);
                                } 
-                               else {                               /* stack arg -> spilled  */
+                               else {
                                        if (!IS_2_WORD_TYPE(t)) {
 #if defined(ENABLE_SSA)
                                                /* no copy avoiding by now possible with SSA */
                                                if (ls != NULL) {
                                                        emit_mov_membase_reg(   /* + 4 for return address */
-                                                                cd, REG_SP, cd->stackframesize * 4 + s1 + 4,
+                                                                cd, REG_SP, cd->stackframesize * 8 + s1 + 4,
                                                                 REG_ITMP1);    
                                                        emit_mov_reg_membase(
                                                                 cd, REG_ITMP1, REG_SP, var->vv.regoff);
                                                }
                                                else 
 #endif /*defined(ENABLE_SSA)*/
-                                                                 /* reuse Stackslotand avoid copying */
-                                                       var->vv.regoff = cd->stackframesize * 4 + s1 + 4;
+                                                       /* reuse stackslot */
+                                                       var->vv.regoff = cd->stackframesize * 8 + 4 + s1;
 
                                        } 
                                        else {
@@ -290,20 +281,20 @@ bool codegen_emit(jitdata *jd)
                                                /* no copy avoiding by now possible with SSA */
                                                if (ls != NULL) {
                                                        emit_mov_membase_reg(  /* + 4 for return address */
-                                                                cd, REG_SP, cd->stackframesize * 4 + s1 + 4,
+                                                                cd, REG_SP, cd->stackframesize * 8 + s1 + 4,
                                                                 REG_ITMP1);
                                                        emit_mov_reg_membase(
                                                                 cd, REG_ITMP1, REG_SP, var->vv.regoff);
                                                        emit_mov_membase_reg(   /* + 4 for return address */
-                                                                 cd, REG_SP, cd->stackframesize * 4 + s1 + 4 + 4,
+                                                                 cd, REG_SP, cd->stackframesize * 8 + s1 + 4 + 4,
                                                                  REG_ITMP1);             
                                                        emit_mov_reg_membase(
                                                                 cd, REG_ITMP1, REG_SP, var->vv.regoff + 4);
                                                }
                                                else
 #endif /*defined(ENABLE_SSA)*/
-                                                                 /* reuse Stackslotand avoid copying */
-                                                       var->vv.regoff = cd->stackframesize * 4 + s1 + 4;
+                                                       /* reuse stackslot */
+                                                       var->vv.regoff = cd->stackframesize * 8 + 4 + s1;
                                        }
                                }
                        }
@@ -315,7 +306,7 @@ bool codegen_emit(jitdata *jd)
                                if (!(var->flags & INMEMORY)) {  /* reg arg -> register   */
                                        /* rd->argfltregs[md->params[p].regoff -> var->vv.regoff     */
                                } else {                                     /* reg arg -> spilled    */
-                                       /* rd->argfltregs[md->params[p].regoff -> var->vv.regoff * 4 */
+                                       /* rd->argfltregs[md->params[p].regoff -> var->vv.regoff * 8 */
                                }
 
                        } 
@@ -323,14 +314,14 @@ bool codegen_emit(jitdata *jd)
                                if (!(var->flags & INMEMORY)) {      /* stack-arg -> register */
                                        if (t == TYPE_FLT) {
                                                emit_flds_membase(
-                            cd, REG_SP, cd->stackframesize * 4 + s1 + 4);
+                            cd, REG_SP, cd->stackframesize * 8 + s1 + 4);
                                                assert(0);
 /*                                             emit_fstp_reg(cd, var->vv.regoff + fpu_st_offset); */
 
                                        } 
                                        else {
                                                emit_fldl_membase(
-                            cd, REG_SP, cd->stackframesize * 4 + s1 + 4);
+                            cd, REG_SP, cd->stackframesize * 8 + s1 + 4);
                                                assert(0);
 /*                                             emit_fstp_reg(cd, var->vv.regoff + fpu_st_offset); */
                                        }
@@ -340,28 +331,28 @@ bool codegen_emit(jitdata *jd)
                                        /* no copy avoiding by now possible with SSA */
                                        if (ls != NULL) {
                                                emit_mov_membase_reg(
-                                                cd, REG_SP, cd->stackframesize * 4 + s1 + 4, REG_ITMP1);
+                                                cd, REG_SP, cd->stackframesize * 8 + s1 + 4, REG_ITMP1);
                                                emit_mov_reg_membase(
                                                                         cd, REG_ITMP1, REG_SP, var->vv.regoff);
                                                if (t == TYPE_FLT) {
                                                        emit_flds_membase(
-                                                                 cd, REG_SP, cd->stackframesize * 4 + s1 + 4);
+                                                                 cd, REG_SP, cd->stackframesize * 8 + s1 + 4);
                                                        emit_fstps_membase(cd, REG_SP, var->vv.regoff);
                                                } 
                                                else {
                                                        emit_fldl_membase(
-                                                                 cd, REG_SP, cd->stackframesize * 4 + s1 + 4);
+                                                                 cd, REG_SP, cd->stackframesize * 8 + s1 + 4);
                                                        emit_fstpl_membase(cd, REG_SP, var->vv.regoff);
                                                }
                                        }
                                        else
 #endif /*defined(ENABLE_SSA)*/
-                                                                 /* reuse Stackslotand avoid copying */
-                                               var->vv.regoff = cd->stackframesize * 4 + s1 + 4;
+                                               /* reuse stackslot */
+                                               var->vv.regoff = cd->stackframesize * 8 + 4 + s1;
                                }
                        }
                }
-       }  /* end for */
+       }
 
        /* call monitorenter function */
 
@@ -373,13 +364,13 @@ bool codegen_emit(jitdata *jd)
                        M_MOV_IMM(&m->class->object.header, REG_ITMP1);
                }
                else {
-                       M_ALD(REG_ITMP1, REG_SP, cd->stackframesize * 4 + 4);
+                       M_ALD(REG_ITMP1, REG_SP, cd->stackframesize * 8 + 4);
                        M_TEST(REG_ITMP1);
                        M_BNE(6);
                        M_ALD_MEM(REG_ITMP1, EXCEPTION_HARDWARE_NULLPOINTER);
                }
 
-               M_AST(REG_ITMP1, REG_SP, s1 * 4);
+               M_AST(REG_ITMP1, REG_SP, s1 * 8);
                M_AST(REG_ITMP1, REG_SP, 0 * 4);
                M_MOV_IMM(LOCK_monitor_enter, REG_ITMP3);
                M_CALL(REG_ITMP3);
@@ -1040,9 +1031,9 @@ bool codegen_emit(jitdata *jd)
                                if (iptr->s1.var->flags & INMEMORY) {
                                        /* Alpha algorithm */
                                        disp = 3;
-                                       CALCOFFSETBYTES(disp, REG_SP, iptr->s1.var->vv.regoff * 4);
+                                       CALCOFFSETBYTES(disp, REG_SP, iptr->s1.var->vv.regoff * 8);
                                        disp += 3;
-                                       CALCOFFSETBYTES(disp, REG_SP, iptr->s1.var->vv.regoff * 4 + 4);
+                                       CALCOFFSETBYTES(disp, REG_SP, iptr->s1.var->vv.regoff * 8 + 4);
 
                                        disp += 2;
                                        disp += 3;
@@ -1058,16 +1049,16 @@ bool codegen_emit(jitdata *jd)
                                        disp += 3;
                                        disp += 2;
 
-                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 4, REG_ITMP1);
-                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 4 + 4, REG_ITMP2);
+                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 8, REG_ITMP1);
+                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 8 + 4, REG_ITMP2);
                                        
                                        emit_alu_imm_reg(cd, ALU_AND, iptr->sx.val.l, REG_ITMP1);
                                        emit_alu_imm_reg(cd, ALU_AND, iptr->sx.val.l >> 32, REG_ITMP2);
-                                       emit_alu_imm_membase(cd, ALU_CMP, 0, REG_SP, iptr->s1.var->vv.regoff * 4 + 4);
+                                       emit_alu_imm_membase(cd, ALU_CMP, 0, REG_SP, iptr->s1.var->vv.regoff * 8 + 4);
                                        emit_jcc(cd, CC_GE, disp);
 
-                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 4, REG_ITMP1);
-                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 4 + 4, REG_ITMP2);
+                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 8, REG_ITMP1);
+                                       emit_mov_membase_reg(cd, REG_SP, iptr->s1.var->vv.regoff * 8 + 4, REG_ITMP2);
                                        
                                        emit_neg_reg(cd, REG_ITMP1);
                                        emit_alu_imm_reg(cd, ALU_ADC, 0, REG_ITMP2);
@@ -1080,8 +1071,8 @@ bool codegen_emit(jitdata *jd)
                                        emit_alu_imm_reg(cd, ALU_ADC, 0, REG_ITMP2);
                                        emit_neg_reg(cd, REG_ITMP2);
 
-                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst.var->vv.regoff * 4);
-                                       emit_mov_reg_membase(cd, REG_ITMP2, REG_SP, iptr->dst.var->vv.regoff * 4 + 4);
+                                       emit_mov_reg_membase(cd, REG_ITMP1, REG_SP, iptr->dst.var->vv.regoff * 8);
+                                       emit_mov_reg_membase(cd, REG_ITMP2, REG_SP, iptr->dst.var->vv.regoff * 8 + 4);
                                }
                        }
 
@@ -2765,25 +2756,25 @@ nowperformreturn:
 
 #if defined(ENABLE_THREADS)
                        if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
-                               M_ALD(REG_ITMP2, REG_SP, rd->memuse * 4);
+                               M_ALD(REG_ITMP2, REG_SP, rd->memuse * 8);
 
                                /* we need to save the proper return value */
                                switch (iptr->opc) {
                                case ICMD_IRETURN:
                                case ICMD_ARETURN:
-                                       M_IST(REG_RESULT, REG_SP, rd->memuse * 4);
+                                       M_IST(REG_RESULT, REG_SP, rd->memuse * 8);
                                        break;
 
                                case ICMD_LRETURN:
-                                       M_LST(REG_RESULT_PACKED, REG_SP, rd->memuse * 4);
+                                       M_LST(REG_RESULT_PACKED, REG_SP, rd->memuse * 8);
                                        break;
 
                                case ICMD_FRETURN:
-                                       emit_fstps_membase(cd, REG_SP, rd->memuse * 4);
+                                       emit_fstps_membase(cd, REG_SP, rd->memuse * 8);
                                        break;
 
                                case ICMD_DRETURN:
-                                       emit_fstpl_membase(cd, REG_SP, rd->memuse * 4);
+                                       emit_fstpl_membase(cd, REG_SP, rd->memuse * 8);
                                        break;
                                }
 
@@ -2795,19 +2786,19 @@ nowperformreturn:
                                switch (iptr->opc) {
                                case ICMD_IRETURN:
                                case ICMD_ARETURN:
-                                       M_ILD(REG_RESULT, REG_SP, rd->memuse * 4);
+                                       M_ILD(REG_RESULT, REG_SP, rd->memuse * 8);
                                        break;
 
                                case ICMD_LRETURN:
-                                       M_LLD(REG_RESULT_PACKED, REG_SP, rd->memuse * 4);
+                                       M_LLD(REG_RESULT_PACKED, REG_SP, rd->memuse * 8);
                                        break;
 
                                case ICMD_FRETURN:
-                                       emit_flds_membase(cd, REG_SP, rd->memuse * 4);
+                                       emit_flds_membase(cd, REG_SP, rd->memuse * 8);
                                        break;
 
                                case ICMD_DRETURN:
-                                       emit_fldl_membase(cd, REG_SP, rd->memuse * 4);
+                                       emit_fldl_membase(cd, REG_SP, rd->memuse * 8);
                                        break;
                                }
                        }
@@ -2816,12 +2807,12 @@ nowperformreturn:
                        /* restore saved registers */
 
                        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
-                               p--; M_ALD(rd->savintregs[i], REG_SP, p * 4);
+                               p--; M_ALD(rd->savintregs[i], REG_SP, p * 8);
                        }
 
                        for (i = FLT_SAV_CNT - 1; i >= rd->savfltreguse; i--) {
                                p--;
-                               emit_fldl_membase(cd, REG_SP, p * 4);
+                               emit_fldl_membase(cd, REG_SP, p * 8);
                                if (iptr->opc == ICMD_FRETURN || iptr->opc == ICMD_DRETURN) {
                                        assert(0);
 /*                                     emit_fstp_reg(cd, rd->savfltregs[i] + fpu_st_offset + 1); */
@@ -2834,7 +2825,7 @@ nowperformreturn:
                        /* deallocate stack */
 
                        if (cd->stackframesize)
-                               M_AADD_IMM(cd->stackframesize * 4, REG_SP);
+                               M_AADD_IMM(cd->stackframesize * 8, REG_SP);
 
                        emit_ret(cd);
                        }
@@ -2991,7 +2982,7 @@ gen_method:
                                break;
 
                        case ICMD_INVOKESPECIAL:
-                               M_ALD(REG_ITMP1, REG_SP, 0 * 4);
+                               M_ALD(REG_ITMP1, REG_SP, 0 * 8);
                                emit_nullpointer_check(cd, iptr, REG_ITMP1);
                                /* fall through */
 
@@ -3015,7 +3006,7 @@ gen_method:
                                break;
 
                        case ICMD_INVOKEVIRTUAL:
-                               M_ALD(REG_ITMP1, REG_SP, 0 * 4);
+                               M_ALD(REG_ITMP1, REG_SP, 0 * 8);
                                emit_nullpointer_check(cd, iptr, s1);
 
                                if (lm == NULL) {
@@ -3039,7 +3030,7 @@ gen_method:
                                break;
 
                        case ICMD_INVOKEINTERFACE:
-                               M_ALD(REG_ITMP1, REG_SP, 0 * 4);
+                               M_ALD(REG_ITMP1, REG_SP, 0 * 8);
                                emit_nullpointer_check(cd, iptr, s1);
 
                                if (lm == NULL) {
@@ -3492,7 +3483,6 @@ gen_method:
        /* generate stubs */
 
        emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */
 
@@ -3729,12 +3719,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
     /* keep stack 16-byte aligned */
 
-       cd->stackframesize |= 0x3;
+       ALIGN_ODD(cd->stackframesize);        /* XXX this is wrong, +4 is missing */
 
        /* create method header */
 
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
-       (void) dseg_add_unique_s4(cd, cd->stackframesize * 4); /* FrameSize       */
+       (void) dseg_add_unique_s4(cd, cd->stackframesize * 8); /* FrameSize       */
        (void) dseg_add_unique_s4(cd, 0);                      /* IsSync          */
        (void) dseg_add_unique_s4(cd, 0);                      /* IsLeaf          */
        (void) dseg_add_unique_s4(cd, 0);                      /* IntSave         */
@@ -3755,7 +3745,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* calculate stackframe size for native function */
 
-       M_ASUB_IMM(cd->stackframesize * 4, REG_SP);
+       M_ASUB_IMM(cd->stackframesize * 8, REG_SP);
 
 #if !defined(NDEBUG)
        emit_verbosecall_enter(jd);
@@ -3786,7 +3776,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* remember callee saved int registers in stackframeinfo (GC may need to  */
        /* recover them during a collection).                                     */
 
-       disp = cd->stackframesize * 4 - sizeof(stackframeinfo) +
+       disp = cd->stackframesize * 8 - sizeof(stackframeinfo) +
                OFFSET(stackframeinfo, intregs);
 
        for (i = 0; i < INT_SAV_CNT; i++)
@@ -3796,17 +3786,17 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* prepare data structures for native function call */
 
        M_MOV(REG_SP, REG_ITMP1);
-       M_AADD_IMM(cd->stackframesize * 4, REG_ITMP1);
+       M_AADD_IMM(cd->stackframesize * 8, REG_ITMP1);
 
        M_AST(REG_ITMP1, REG_SP, 0 * 4);
        M_IST_IMM(0, REG_SP, 1 * 4);
        dseg_adddata(cd);
 
        M_MOV(REG_SP, REG_ITMP2);
-       M_AADD_IMM(cd->stackframesize * 4 + SIZEOF_VOID_P, REG_ITMP2);
+       M_AADD_IMM(cd->stackframesize * 8 + SIZEOF_VOID_P, REG_ITMP2);
 
        M_AST(REG_ITMP2, REG_SP, 2 * 4);
-       M_ALD(REG_ITMP3, REG_SP, cd->stackframesize * 4);
+       M_ALD(REG_ITMP3, REG_SP, cd->stackframesize * 8);
        M_AST(REG_ITMP3, REG_SP, 3 * 4);
        M_MOV_IMM(codegen_start_native_call, REG_ITMP1);
        M_CALL(REG_ITMP1);
@@ -3820,8 +3810,11 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
                if (!md->params[i].inmemory) {
                        /* no integer argument registers */
-               } else {       /* float/double in memory can be copied like int/longs */
-                       s1 = md->params[i].regoff + cd->stackframesize * 4 + 4;
+               }
+               else {
+                       /* float/double in memory can be copied like int/longs */
+
+                       s1 = md->params[i].regoff + cd->stackframesize * 8 + 4;
                        s2 = nmd->params[j].regoff;
 
                        M_ILD(REG_ITMP1, REG_SP, s1);
@@ -3851,16 +3844,16 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        switch (md->returntype.type) {
        case TYPE_INT:
        case TYPE_ADR:
-               M_IST(REG_RESULT, REG_SP, 1 * 4);
+               M_IST(REG_RESULT, REG_SP, 1 * 8);
                break;
        case TYPE_LNG:
-               M_LST(REG_RESULT_PACKED, REG_SP, 1 * 4);
+               M_LST(REG_RESULT_PACKED, REG_SP, 1 * 8);
                break;
        case TYPE_FLT:
-               emit_fsts_membase(cd, REG_SP, 1 * 4);
+               emit_fsts_membase(cd, REG_SP, 1 * 8);
                break;
        case TYPE_DBL:
-               emit_fstl_membase(cd, REG_SP, 1 * 4);
+               emit_fstl_membase(cd, REG_SP, 1 * 8);
                break;
        case TYPE_VOID:
                break;
@@ -3873,7 +3866,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* remove native stackframe info */
 
        M_MOV(REG_SP, REG_ITMP1);
-       M_AADD_IMM(cd->stackframesize * 4, REG_ITMP1);
+       M_AADD_IMM(cd->stackframesize * 8, REG_ITMP1);
 
        M_AST(REG_ITMP1, REG_SP, 0 * 4);
        M_MOV_IMM(codegen_finish_native_call, REG_ITMP1);
@@ -3885,16 +3878,16 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        switch (md->returntype.type) {
        case TYPE_INT:
        case TYPE_ADR:
-               M_ILD(REG_RESULT, REG_SP, 1 * 4);
+               M_ILD(REG_RESULT, REG_SP, 1 * 8);
                break;
        case TYPE_LNG:
-               M_LLD(REG_RESULT_PACKED, REG_SP, 1 * 4);
+               M_LLD(REG_RESULT_PACKED, REG_SP, 1 * 8);
                break;
        case TYPE_FLT:
-               emit_flds_membase(cd, REG_SP, 1 * 4);
+               emit_flds_membase(cd, REG_SP, 1 * 8);
                break;
        case TYPE_DBL:
-               emit_fldl_membase(cd, REG_SP, 1 * 4);
+               emit_fldl_membase(cd, REG_SP, 1 * 8);
                break;
        case TYPE_VOID:
                break;
@@ -3904,14 +3897,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* restore callee saved int registers from stackframeinfo (GC might have  */
        /* modified them during a collection).                                    */
 
-       disp = cd->stackframesize * 4 - sizeof(stackframeinfo) +
+       disp = cd->stackframesize * 8 - sizeof(stackframeinfo) +
                OFFSET(stackframeinfo, intregs);
 
        for (i = 0; i < INT_SAV_CNT; i++)
                M_ALD(abi_registers_integer_saved[i], REG_SP, disp + i * 4);
 #endif
 
-       M_AADD_IMM(cd->stackframesize * 4, REG_SP);
+       M_AADD_IMM(cd->stackframesize * 8, REG_SP);
 
        /* check for exception */
 
index dd9672c96382bc6065768d83ec65868ed57cb722..d04a842bc3d10282084513fa4648047351b22267 100644 (file)
@@ -78,7 +78,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
     s4                   disp;
     ptrint               val;
     s4                   type;
-    java_objectheader   *o;
+    java_objectheader   *e;
 
        _uc = (ucontext_t *) _p;
        _mc = _uc->uc_mcontext;
@@ -121,13 +121,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
         type = EXCEPTION_HARDWARE_NULLPOINTER;
     }
 
-    /* generate appropriate exception */
+       /* create stackframeinfo */
 
-    o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
     /* set registers */
 
-    _ss->eax = (ptrint) o;
+    _ss->eax = (ptrint) e;
        _ss->ecx = (ptrint) xpc;
        _ss->eip = (ptrint) asm_handle_exception;
 }
@@ -152,7 +160,7 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
        u1                  *xpc;
     s4                   type;
     ptrint               val;
-    java_objectheader   *o;
+    java_objectheader   *e;
 
 
        _uc = (ucontext_t *) _p;
@@ -169,11 +177,19 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
     type = EXCEPTION_HARDWARE_ARITHMETIC;
     val  = 0;
 
-    /* generate appropriate exception */
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
 
-    o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       stacktrace_remove_stackframeinfo(&sfi);
 
-    _ss->eax = (ptrint) o;
+    _ss->eax = (ptrint) e;
        _ss->ecx = (ptrint) xpc;
        _ss->eip = (ptrint) asm_handle_exception;
 }
index 3bbf45e3d9ec6f3a5028c3647833433d985c56c8..9c4d2d6e1f99f6309bebf0e2e07f0a4275234305 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: emit.c 8211 2007-07-18 19:52:23Z michi $
 
 */
 
@@ -44,6 +44,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/dseg.h"
 #include "vm/jit/emit-common.h"
@@ -575,71 +576,6 @@ void emit_patcher_stubs(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       s4           i;
-       s4           branchmpc;
-       s4           outcode;
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       rplp = code->rplpoints;
-
-       /* store beginning of replacement stubs */
-
-       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
-
-       for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
-               /* do not generate stubs for non-trappable points */
-
-               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-               /* check code segment size */
-
-               MCODECHECK(512);
-
-               /* note start of stub code */
-
-               outcode = (s4) (cd->mcodeptr - cd->mcodebase);
-
-               /* push address of `rplpoint` struct */
-                       
-               M_PUSH_IMM(rplp);
-
-               /* jump to replacement function */
-
-               M_PUSH_IMM(asm_replacement_out);
-               M_RET;
-
-               /* add jump reference for COUNTDOWN points */
-
-               if (rplp->flags & RPLPOINT_FLAG_COUNTDOWN) {
-
-                       branchmpc = (s4)rplp->pc + (7 + 6);
-
-                       md_codegen_patch_branch(cd, branchmpc, (s4) outcode);
-               }
-
-               assert(((cd->mcodeptr - cd->mcodebase) - outcode) == REPLACEMENT_STUB_SIZE);
-       }
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-       
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
@@ -653,8 +589,9 @@ void emit_verbosecall_enter(jitdata *jd)
        codegendata  *cd;
        registerdata *rd;
        methoddesc   *md;
-       s4            disp;
-       s4            i, t;
+       int32_t       disp;
+       int           i;
+       int           d;
 
        if (!JITDATA_HAS_FLAG_VERBOSECALL(jd))
                return;
@@ -673,50 +610,49 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* methodinfo* + arguments + return address */
 
-       disp = TRACE_ARGS_NUM * 8 + 4 + INT_TMP_CNT * 4 +
-               cd->stackframesize * 4 + 4;
+       disp = (TRACE_ARGS_NUM + 1 + TMP_CNT) * 8 + cd->stackframesize * 8 + 4;
 
-       M_ASUB_IMM(TRACE_ARGS_NUM * 8 + 4 + INT_TMP_CNT * 4, REG_SP);
+       M_ASUB_IMM((TRACE_ARGS_NUM + 1 + TMP_CNT) * 8, REG_SP);
 
        /* save temporary registers for leaf methods */
 
        for (i = 0; i < INT_TMP_CNT; i++)
-               M_IST(rd->tmpintregs[i], REG_SP, TRACE_ARGS_NUM * 8 + 4 + i * 4);
+               M_IST(rd->tmpintregs[i], REG_SP, (TRACE_ARGS_NUM + 1 + i) * 8);
 
-       for (i = 0; i < md->paramcount && i < TRACE_ARGS_NUM; i++) {
-               t = md->paramtypes[i].type;
+       /* save argument registers */
 
-               if (IS_INT_LNG_TYPE(t)) {
-                       if (IS_2_WORD_TYPE(t)) {
-                               M_LLD(REG_ITMP12_PACKED, REG_SP, disp);
-                               M_LST(REG_ITMP12_PACKED, REG_SP, i * 8);
-                       }
-                       else if (IS_ADR_TYPE(t)) {
-                               M_ALD(REG_ITMP1, REG_SP, disp);
-                               M_AST(REG_ITMP1, REG_SP, i * 8);
-                               M_IST_IMM(0, REG_SP, i * 8 + 4);
-                       }
-                       else {
-                               M_ILD(EAX, REG_SP, disp);
-                               emit_cltd(cd);
-                               M_LST(EAX_EDX_PACKED, REG_SP, i * 8);
-                       }
-               }
-               else {
-                       if (IS_2_WORD_TYPE(t)) {
-                               M_DLD(REG_NULL, REG_SP, disp);
-                               M_DST(REG_NULL, REG_SP, i * 8);
-                       }
-                       else {
-                               M_FLD(REG_NULL, REG_SP, disp);
-                               M_FST(REG_NULL, REG_SP, i * 8);
-                               M_IST_IMM(0, REG_SP, i * 8 + 4);
-                       }
+       for (i = 0; i < md->paramcount; i++) {
+               d = i * 8;
+
+               switch (md->paramtypes[i].type) {
+               case TYPE_INT:
+                       M_ILD(EAX, REG_SP, disp);
+                       emit_cltd(cd);
+                       M_LST(EAX_EDX_PACKED, REG_SP, d);
+                       break;
+               case TYPE_LNG:
+                       M_LLD(REG_ITMP12_PACKED, REG_SP, disp);
+                       M_LST(REG_ITMP12_PACKED, REG_SP, d);
+                       break;
+               case TYPE_ADR:
+                       M_ALD(REG_ITMP1, REG_SP, disp);
+                       M_AST(REG_ITMP1, REG_SP, d);
+                       M_IST_IMM(0, REG_SP, d + 4);                /* high-bits are zero */
+                       break;
+               case TYPE_FLT:
+                       M_FLD(REG_NULL, REG_SP, disp);
+                       M_FST(REG_NULL, REG_SP, d);
+                       M_IST_IMM(0, REG_SP, d + 4);                /* high-bits are zero */
+                       break;
+               case TYPE_DBL:
+                       M_DLD(REG_NULL, REG_SP, disp);
+                       M_DST(REG_NULL, REG_SP, d);
+                       break;
                }
 
-               disp += (IS_2_WORD_TYPE(t)) ? 8 : 4;
+               disp += 8;
        }
-       
+
        M_AST_IMM(m, REG_SP, TRACE_ARGS_NUM * 8);
 
        M_MOV_IMM(builtin_verbosecall_enter, REG_ITMP1);
@@ -725,9 +661,9 @@ void emit_verbosecall_enter(jitdata *jd)
        /* restore temporary registers for leaf methods */
 
        for (i = 0; i < INT_TMP_CNT; i++)
-               M_ILD(rd->tmpintregs[i], REG_SP, TRACE_ARGS_NUM * 8 + 4 + i * 4);
+               M_ILD(rd->tmpintregs[i], REG_SP, (TRACE_ARGS_NUM + 1 + i) * 8);
 
-       M_AADD_IMM(TRACE_ARGS_NUM * 8 + 4 + INT_TMP_CNT * 4, REG_SP);
+       M_AADD_IMM((TRACE_ARGS_NUM + 1 + TMP_CNT) * 8, REG_SP);
 
        /* mark trace code */
 
index e2ce9025a7315e4ed30ed6b1a1920bac627a4c93..53376f0b35ef7064c51db3ae88ef8ccf0fff0fb2 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: md-os.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -69,7 +69,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        s4                 disp;
        ptrint             val;
        s4                 type;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
        _mc = &_uc->uc_mcontext;
@@ -111,13 +111,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                val  = 0;
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _mc->gregs[REG_EAX] = (ptrint) o;
+       _mc->gregs[REG_EAX] = (ptrint) e;
        _mc->gregs[REG_ECX] = (ptrint) xpc;                      /* REG_ITMP2_XPC */
        _mc->gregs[REG_EIP] = (ptrint) asm_handle_exception;
 }
@@ -141,7 +149,7 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
        u1                *xpc;
        s4                 type;
        ptrint             val;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
        _mc = &_uc->uc_mcontext;
@@ -156,11 +164,19 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
        type = EXCEPTION_HARDWARE_ARITHMETIC;
        val  = 0;
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
-       _mc->gregs[REG_EAX] = (ptrint) o;
+       _mc->gregs[REG_EAX] = (ptrint) e;
        _mc->gregs[REG_ECX] = (ptrint) xpc;                      /* REG_ITMP2_XPC */
        _mc->gregs[REG_EIP] = (ptrint) asm_handle_exception;
 }
index 1978c8a282b11364c8d5a3184a3d535cc02d0ed7..c0e94dd979b7dd4cab177237ddf657adf0ba292a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: md-abi.c 8210 2007-07-18 12:51:00Z twisti $
 
 */
 
@@ -106,19 +106,20 @@ const s4 abi_registers_float_temporary[] = {
 void md_param_alloc(methoddesc *md)
 {
        paramdesc *pd;
-       s4        stacksize;
-       s4        i;
+       int        stacksize;
+       int        i;
 
        pd = md->params;
        stacksize = 0;
 
        for (i = 0; i < md->paramcount; i++, pd++) {
                pd->inmemory = true;
-               pd->regoff = stacksize * 4;
-               stacksize += IS_2_WORD_TYPE(md->paramtypes[i].type) ? 2 : 1;
+               pd->index    = stacksize;
+               pd->regoff   = stacksize * 8;
+               stacksize++;
        }
 
-       md->memuse = stacksize;
+       md->memuse       = stacksize;
        md->argintreguse = 0;
        md->argfltreguse = 0;
 }
@@ -132,10 +133,23 @@ void md_param_alloc(methoddesc *md)
 
 void md_param_alloc_native(methoddesc *md)
 {
-       /* On i386 we use the same ABI for JIT method calls as for native
-          method calls. */
+       paramdesc *pd;
+       int        stacksize;
+       int        i;
 
-       md_param_alloc(md);
+       pd = md->params;
+       stacksize = 0;
+
+       for (i = 0; i < md->paramcount; i++, pd++) {
+               pd->inmemory  = true;
+               pd->index     = stacksize;
+               pd->regoff    = stacksize * 4;
+               stacksize    += IS_2_WORD_TYPE(md->paramtypes[i].type) ? 2 : 1;
+       }
+
+       md->memuse       = stacksize;
+       md->argintreguse = 0;
+       md->argfltreguse = 0;
 }
 
 
index 7e0127b07adebf3155b5f061b907c3f5140f4597..4023041827596bcd6d47939e33e8396a7f9cc214 100644 (file)
@@ -2372,7 +2372,6 @@ nowperformreturn:
 
        /* generate stubs */
        emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        return true;
 }
index dcaabd058a67c4ef2df6f64224684ece49a2f26c..1055a78855db50fa9b01cd8b5ba53d5908f2ffe2 100644 (file)
@@ -141,7 +141,18 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, actual_ucontext_t *_
 
        /*fprintf(stderr, "SEGV: sp=%x, xpc=%x, regval=%x\n", sp, xpc, regval);
        */
-       e = exceptions_new_hardware_exception(0, sp, xpc, xpc, EXCEPTION_HARDWARE_NULLPOINTER, regval, &sfi);
+
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, NULL, sp, xpc, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, EXCEPTION_HARDWARE_NULLPOINTER, regval);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP1]     = (ptrint) e;
        _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP2_XPC] = (ptrint) xpc;
@@ -211,7 +222,18 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, actual_ucontext_t *_u
 
        /*fprintf(stderr, "NEW HWE: sp=%x, xpc=%x, tpye=%x, regval=%x\n", sp, xpc, type, regval);
        */
-       e = exceptions_new_hardware_exception(0, sp, xpc, xpc, type, regval, &sfi);
+
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, NULL, sp, xpc, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, regval);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP1]     = (ptrint) e;
        _mc->gregs[GREGS_ADRREG_OFF + REG_ATMP2_XPC] = (ptrint) xpc;
index 7b6371ba7a036b7886e4408a3d0506f05baa1dfb..c9759b52c26efcfb3d25a67df6dda578b4060c2d 100644 (file)
@@ -124,6 +124,12 @@ u1* md_get_method_patch_address(u1 *ra, stackframeinfo *sfi, u1 *mptr)
                        /* found an invokevirtual */
                        /* get offset of load instruction 246b XXXX */
                        offset = *((s2*)(ra - 4));
+
+                       /* return NULL if no mptr was specified (used for replacement) */
+
+                       if (mptr == NULL)
+                               return NULL;
+
                        pa = mptr + offset;                     /* mptr contains the magic we want */
                } else  {
                        /* we had a moveal XXX, %a3 which is a 3 word opcode */
index 6294fff9443af4ff22e5f57f8618a27997d3a0b5..4e3a515c23e62a9f3754cac6c1ed2f41a8c4a0fe 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: codegen.c 8211 2007-07-18 19:52:23Z michi $
 
 */
 
@@ -3595,7 +3595,6 @@ gen_method:
        /* generate stubs */
 
        emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */
 
index d3352fbcdb666c482fe8c6728f58161cc15b51a3..094350a33f6a159d48e330d44cba72b23a2d7829 100644 (file)
@@ -743,72 +743,6 @@ void emit_patcher_stubs(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       s4           disp;
-       s4           i;
-#if !defined(NDEBUG)
-       u1          *savedmcodeptr;
-#endif
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       rplp = code->rplpoints;
-
-       /* store beginning of replacement stubs */
-
-       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
-
-       for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
-               /* do not generate stubs for non-trappable points */
-
-               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-               /* check code segment size */
-
-               MCODECHECK(100);
-
-#if !defined(NDEBUG)
-               savedmcodeptr = cd->mcodeptr;
-#endif
-
-               /* create stack frame - 16-byte aligned */
-
-               M_ASUB_IMM(REG_SP, 2 * 8, REG_SP);
-
-               /* push address of `rplpoint` struct */
-
-               disp = dseg_add_address(cd, rplp);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST(REG_ITMP3, REG_SP, 0 * 8);
-
-               /* jump to replacement function */
-
-               disp = dseg_add_functionptr(cd, asm_replacement_out);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_JMP(REG_ITMP3);
-               M_NOP; /* delay slot */
-
-               assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
-       }
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
index 327a9b9e7fe4eccc4a6dbaeb66070d9e07313dda..620177dd16edadd9bcf31691ac8385c5905cdb5a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: md-os.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -99,7 +99,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        ptrint             val;
        ptrint             addr;
        s4                 type;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (struct ucontext *) _p;
        _mc = &_uc->uc_mcontext;
@@ -134,13 +134,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                val  = 0;
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _mc->gregs[REG_ITMP1_XPTR] = (ptrint) o;
+       _mc->gregs[REG_ITMP1_XPTR] = (ptrint) e;
        _mc->gregs[REG_ITMP2_XPC]  = (ptrint) xpc;
        _mc->gregs[CTX_EPC]        = (ptrint) asm_handle_exception;
 }
index d6231b9da0e80638d90e431eed8d7308b448a7eb..1f05e83d7b99598054ab35d1d203a88cd852b367 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: md-os.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -101,7 +101,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        ptrint             val;
        ptrint             addr;
        s4                 type;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc    = (struct ucontext *) _p;
        _mc    = &_uc->uc_mcontext;
@@ -172,13 +172,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                val  = 0;
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _gregs[REG_ITMP1_XPTR] = (ptrint) o;
+       _gregs[REG_ITMP1_XPTR] = (ptrint) e;
        _gregs[REG_ITMP2_XPC]  = (ptrint) xpc;
 
 #if defined(__UCLIBC__)
index 2b15fb8bd728035325af5cc3fd1307965d24ae9b..b95db2f5602352d991393f9fd29cb28ebfc73cf0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.h 8186 2007-07-05 23:48:16Z michi $
+   $Id: patcher.h 8216 2007-07-19 13:51:21Z michi $
 
 */
 
@@ -41,7 +41,7 @@
 #include "vm/global.h"
 
 
-#if defined(__ALPHA__) || defined(__ARM__)
+#if defined(__ALPHA__) || defined(__ARM__) || defined(__POWERPC__)
 # error "you should no longer include this file"
 #else
 
index ab55c89e26517a7d1cd10bd7d20e8db07e56a7ae..2f2cdf49ff6d0556f0b337c293e549525617602d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7989 2007-05-30 21:04:42Z twisti $
+   $Id: asmpart.S 8216 2007-07-19 13:51:21Z michi $
 
 */
 
@@ -60,8 +60,6 @@
 
        .globl asm_abstractmethoderror
 
-       .globl asm_patcher_wrapper
-
 #if defined(ENABLE_REPLACEMENT)
        .globl asm_replacement_out
        .globl asm_replacement_in
@@ -978,152 +976,6 @@ asm_abstractmethoderror:
        b       L_asm_handle_nat_exception
 
 
-/* asm_patcher_wrapper *********************************************************
-
-   XXX
-
-   Stack layout:
-     20   return address into JIT code (patch position)
-     16   pointer to virtual java_objectheader
-     12   machine code (which is patched back later)
-      8   unresolved class/method/field reference
-      4   data segment displacement from load instructions
-      0   patcher function pointer to call (pv is saved here afterwards)
-
-*******************************************************************************/
-
-asm_patcher_wrapper:
-       mflr    r0                    /* get Java return address (leaf)           */
-       stw     r0,6*4(sp)            /* store it in the stub stackframe          */
-                                     /* keep stack 16-bytes aligned: 6+1+37 = 44 */
-       stwu    sp,-(LA_SIZE+(5+58)*4)(sp)
-
-#if defined(__DARWIN__)
-       stw     a0,LA_SIZE+(5+0)*4(sp)      /* save argument registers            */
-       stw     a1,LA_SIZE+(5+1)*4(sp)      /* preserve linkage area (24 bytes)   */
-       stw     a2,LA_SIZE+(5+2)*4(sp)      /* and 4 bytes for 4 argument         */
-       stw     a3,LA_SIZE+(5+3)*4(sp)
-       stw     a4,LA_SIZE+(5+4)*4(sp)
-       stw     a5,LA_SIZE+(5+5)*4(sp)
-       stw     a6,LA_SIZE+(5+6)*4(sp)
-       stw     a7,LA_SIZE+(5+7)*4(sp)
-
-       stfd    fa0,LA_SIZE+(5+8)*4(sp)
-       stfd    fa1,LA_SIZE+(5+10)*4(sp)
-       stfd    fa2,LA_SIZE+(5+12)*4(sp)
-       stfd    fa3,LA_SIZE+(5+14)*4(sp)
-       stfd    fa4,LA_SIZE+(5+16)*4(sp)
-       stfd    fa5,LA_SIZE+(5+18)*4(sp)
-       stfd    fa6,LA_SIZE+(5+20)*4(sp)
-       stfd    fa7,LA_SIZE+(5+22)*4(sp)
-       stfd    fa8,LA_SIZE+(5+24)*4(sp)
-       stfd    fa9,LA_SIZE+(5+26)*4(sp)
-       stfd    fa10,LA_SIZE+(5+28)*4(sp)
-       stfd    fa11,LA_SIZE+(5+30)*4(sp)
-       stfd    fa12,LA_SIZE+(5+32)*4(sp)
-
-       stw     t0,LA_SIZE+(5+33)*4(sp)
-       stw     t1,LA_SIZE+(5+34)*4(sp)
-       stw     t2,LA_SIZE+(5+35)*4(sp)
-       stw     t3,LA_SIZE+(5+36)*4(sp)
-       stw     t4,LA_SIZE+(5+37)*4(sp)
-       stw     t5,LA_SIZE+(5+38)*4(sp)
-       stw     t6,LA_SIZE+(5+39)*4(sp)
-       stw     t7,LA_SIZE+(5+40)*4(sp)
-
-       stfd    ft0,LA_SIZE+(5+42)*4(sp)
-       stfd    ft1,LA_SIZE+(5+44)*4(sp)
-       stfd    ft2,LA_SIZE+(5+46)*4(sp)
-       stfd    ft3,LA_SIZE+(5+48)*4(sp)
-       stfd    ft4,LA_SIZE+(5+50)*4(sp)
-       stfd    ft5,LA_SIZE+(5+52)*4(sp)
-#else
-       /* save 8 int/8 float arguments */
-       SAVE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+1)
-       SAVE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+1+24)
-#endif
-
-       stw     itmp1,LA_SIZE+(5+54)*4(sp)
-       stw     itmp2,LA_SIZE+(5+55)*4(sp)
-       stw     pv,LA_SIZE+(5+56)*4(sp)
-
-       addi    a0,sp,LA_SIZE+(5+58)*4      /* pass SP of patcher stub            */
-       mr      a1,pv                       /* pass PV                            */
-       mr      a2,r0                       /* pass RA (correct for leafs)        */
-       bl      patcher_wrapper
-       stw     v0,LA_SIZE+(5+57)*4(sp)     /* save return value                  */
-
-#if defined(__DARWIN__)
-       lwz     a0,LA_SIZE+(5+0)*4(sp)
-       lwz     a1,LA_SIZE+(5+1)*4(sp)
-       lwz     a2,LA_SIZE+(5+2)*4(sp)
-       lwz     a3,LA_SIZE+(5+3)*4(sp)
-       lwz     a4,LA_SIZE+(5+4)*4(sp)
-       lwz     a5,LA_SIZE+(5+5)*4(sp)
-       lwz     a6,LA_SIZE+(5+6)*4(sp)
-       lwz     a7,LA_SIZE+(5+7)*4(sp)
-
-       lfd     fa0,LA_SIZE+(5+8)*4(sp)
-       lfd     fa1,LA_SIZE+(5+10)*4(sp)
-       lfd     fa2,LA_SIZE+(5+12)*4(sp)
-       lfd     fa3,LA_SIZE+(5+14)*4(sp)
-       lfd     fa4,LA_SIZE+(5+16)*4(sp)
-       lfd     fa5,LA_SIZE+(5+18)*4(sp)
-       lfd     fa6,LA_SIZE+(5+20)*4(sp)
-       lfd     fa7,LA_SIZE+(5+22)*4(sp)
-       lfd     fa8,LA_SIZE+(5+24)*4(sp)
-       lfd     fa9,LA_SIZE+(5+26)*4(sp)
-       lfd     fa10,LA_SIZE+(5+28)*4(sp)
-       lfd     fa11,LA_SIZE+(5+30)*4(sp)
-       lfd     fa12,LA_SIZE+(5+32)*4(sp)
-
-       lwz     t0,LA_SIZE+(5+33)*4(sp)
-       lwz     t1,LA_SIZE+(5+34)*4(sp)
-       lwz     t2,LA_SIZE+(5+35)*4(sp)
-       lwz     t3,LA_SIZE+(5+36)*4(sp)
-       lwz     t4,LA_SIZE+(5+37)*4(sp)
-       lwz     t5,LA_SIZE+(5+38)*4(sp)
-       lwz     t6,LA_SIZE+(5+39)*4(sp)
-       lwz     t7,LA_SIZE+(5+40)*4(sp)
-
-       lfd     ft0,LA_SIZE+(5+42)*4(sp)
-       lfd     ft1,LA_SIZE+(5+44)*4(sp)
-       lfd     ft2,LA_SIZE+(5+46)*4(sp)
-       lfd     ft3,LA_SIZE+(5+48)*4(sp)
-       lfd     ft4,LA_SIZE+(5+50)*4(sp)
-       lfd     ft5,LA_SIZE+(5+52)*4(sp)
-#else
-       /* restore 8 int/8 float arguments */
-       RESTORE_ARGUMENT_REGISTERS(LA_SIZE_IN_POINTERS+1)
-       RESTORE_TEMPORARY_REGISTERS(LA_SIZE_IN_POINTERS+1+24)
-#endif
-
-       lwz     itmp1,LA_SIZE+(5+54)*4(sp)
-       lwz     itmp2,LA_SIZE+(5+55)*4(sp)
-       lwz     pv,LA_SIZE+(5+56)*4(sp)
-       lwz     itmp3,LA_SIZE+(5+57)*4(sp)  /* restore return value into temp reg.*/
-
-       lwz     r0,6*4+LA_SIZE+(5+58)*4(sp) /* restore RA                         */
-       mtlr    r0
-
-       mr.     itmp3,itmp3           /* check for an exception                   */
-       bne     L_asm_patcher_wrapper_exception
-
-                                     /* get return address (into JIT code)       */
-       lwz     itmp3,5*4+LA_SIZE+(5+58)*4(sp)
-
-                                     /* remove stack frame + patcher stub stack  */
-       addi    sp,sp,8*4+LA_SIZE+(5+58)*4
-
-       mtctr   itmp3
-       bctr                          /* jump to new patched code                 */
-
-L_asm_patcher_wrapper_exception:
-       mr      xptr,itmp3                  /* get exception                      */
-       lwz     xpc,5*4+LA_SIZE+(5+58)*4(sp)
-       addi    sp,sp,8*4+LA_SIZE+(5+58)*4
-       b       L_asm_handle_exception
-
 #if defined(ENABLE_REPLACEMENT)
 
 /* asm_replacement_out *********************************************************
@@ -1613,26 +1465,6 @@ L_exceptions_asm_new_abstractmethoderror$lazy_ptr:
        .long dyld_stub_binding_helper
 
 
-.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
-       .align 2
-L_patcher_wrapper$stub:
-       .indirect_symbol _patcher_wrapper
-       mflr r0
-       bcl 20,31,L00$_patcher_wrapper
-L00$_patcher_wrapper:
-       mflr r11
-       addis r11,r11,ha16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)
-       mtlr r0
-       lwzu r12,lo16(L_patcher_wrapper$lazy_ptr - L00$_patcher_wrapper)(r11)
-       mtctr r12
-       bctr
-.data
-.lazy_symbol_pointer
-L_patcher_wrapper$lazy_ptr:
-       .indirect_symbol _patcher_wrapper
-       .long dyld_stub_binding_helper
-
-
 # if defined(ENABLE_REPLACEMENT)
 
 .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
index bdae06faa6b955033669e6a5e1fce8e2e2c61b0b..8602d35db81b0eab4f6ea38847e464574acbe4bb 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: codegen.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -62,7 +62,7 @@
 #include "vm/jit/md.h"
 #include "vm/jit/methodheader.h"
 #include "vm/jit/parse.h"
-#include "vm/jit/patcher.h"
+#include "vm/jit/patcher-common.h"
 #include "vm/jit/reg.h"
 #include "vm/jit/replace.h"
 #include "vm/jit/stacktrace.h"
@@ -305,9 +305,8 @@ bool codegen_emit(jitdata *jd)
                                        if (IS_2_WORD_TYPE(t)) {
                                                M_DLD(REG_FTMP1, REG_SP, cd->stackframesize * 4 + s1);
                                                M_DST(REG_FTMP1, REG_SP, var->vv.regoff);
-                                               var->vv.regoff = cd->stackframesize + s1;
-
-                                       } else {
+                                       }
+                                       else {
                                                M_FLD(REG_FTMP1, REG_SP, cd->stackframesize * 4 + s1);
                                                M_FST(REG_FTMP1, REG_SP, var->vv.regoff);
                                        }
@@ -545,7 +544,7 @@ bool codegen_emit(jitdata *jd)
 
                                disp = dseg_add_unique_address(cd, cr);
 
-                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_classinfo,
+                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo,
                                                                        cr, disp);
                        }
                        else
@@ -1640,7 +1639,7 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = uf->fieldref->parseddesc.fd->type;
                                disp      = dseg_add_unique_address(cd, uf);
 
-                               codegen_addpatchref(cd, PATCHER_get_putstatic, uf, disp);
+                               patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
@@ -1648,7 +1647,7 @@ bool codegen_emit(jitdata *jd)
                                disp      = dseg_add_address(cd, &(fi->value));
 
                                if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
-                                       codegen_addpatchref(cd, PATCHER_initialize_class,
+                                       patcher_add_patch_ref(jd, PATCHER_initialize_class,
                                                                                fi->class, disp);
                        }
 
@@ -1686,7 +1685,7 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = uf->fieldref->parseddesc.fd->type;
                                disp      = dseg_add_unique_address(cd, uf);
 
-                               codegen_addpatchref(cd, PATCHER_get_putstatic, uf, disp);
+                               patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
@@ -1694,7 +1693,7 @@ bool codegen_emit(jitdata *jd)
                                disp      = dseg_add_address(cd, &(fi->value));
 
                                if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
-                                       codegen_addpatchref(cd, PATCHER_initialize_class,
+                                       patcher_add_patch_ref(jd, PATCHER_initialize_class,
                                                                                fi->class, disp);
                        }
 
@@ -1733,7 +1732,7 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = uf->fieldref->parseddesc.fd->type;
                                disp      = 0;
 
-                               codegen_addpatchref(cd, PATCHER_get_putfield, uf, 0);
+                               patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
@@ -1799,7 +1798,7 @@ bool codegen_emit(jitdata *jd)
                                s2 = emit_load_s2(jd, iptr, REG_FTMP2);
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr))
-                               codegen_addpatchref(cd, PATCHER_get_putfield, uf, 0);
+                               patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
 
                        /* implicit null-pointer check */
                        switch (fieldtype) {
@@ -1834,7 +1833,7 @@ bool codegen_emit(jitdata *jd)
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                unresolved_class *uc = iptr->sx.s23.s2.uc;
 
-                               codegen_addpatchref(cd, PATCHER_resolve_class, uc, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
                        }
 #endif /* ENABLE_VERIFIER */
 
@@ -2170,7 +2169,7 @@ bool codegen_emit(jitdata *jd)
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                unresolved_class *uc = iptr->sx.s23.s2.uc;
 
-                               codegen_addpatchref(cd, PATCHER_resolve_class, uc, 0);
+                               patcher_add_patch_ref(jd, PATCHER_resolve_class, uc, 0);
                        }
 #endif /* ENABLE_VERIFIER */
                        goto nowperformreturn;
@@ -2463,7 +2462,7 @@ gen_method:
                                if (lm == NULL) {
                                        disp = dseg_add_unique_address(cd, um);
 
-                                       codegen_addpatchref(cd, PATCHER_invokestatic_special,
+                                       patcher_add_patch_ref(jd, PATCHER_invokestatic_special,
                                                                                um, disp);
                                }
                                else
@@ -2483,7 +2482,7 @@ gen_method:
 
                        case ICMD_INVOKEVIRTUAL:
                                if (lm == NULL) {
-                                       codegen_addpatchref(cd, PATCHER_invokevirtual, um, 0);
+                                       patcher_add_patch_ref(jd, PATCHER_invokevirtual, um, 0);
 
                                        s1 = 0;
                                }
@@ -2508,7 +2507,7 @@ gen_method:
 
                        case ICMD_INVOKEINTERFACE:
                                if (lm == NULL) {
-                                       codegen_addpatchref(cd, PATCHER_invokeinterface, um, 0);
+                                       patcher_add_patch_ref(jd, PATCHER_invokeinterface, um, 0);
 
                                        s1 = 0;
                                        s2 = 0;
@@ -2590,7 +2589,7 @@ gen_method:
 
                                        disp = dseg_add_unique_s4(cd, 0);         /* super->flags */
 
-                                       codegen_addpatchref(cd,
+                                       patcher_add_patch_ref(jd,
                                                                                PATCHER_resolve_classref_to_flags,
                                                                                iptr->sx.s23.s3.c.ref,
                                                                                disp);
@@ -2604,7 +2603,7 @@ gen_method:
 
                                if ((super == NULL) || (super->flags & ACC_INTERFACE)) {
                                        if (super == NULL) {
-                                               codegen_addpatchref(cd,
+                                               patcher_add_patch_ref(jd,
                                                                                        PATCHER_checkcast_interface,
                                                                                        iptr->sx.s23.s3.c.ref,
                                                                                        0);
@@ -2639,7 +2638,7 @@ gen_method:
 
                                                disp = dseg_add_unique_address(cd, NULL);
 
-                                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_vftbl,
+                                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_vftbl,
                                                                                        iptr->sx.s23.s3.c.ref,
                                                                                        disp);
                                        }
@@ -2695,7 +2694,7 @@ gen_method:
                                if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                        disp = dseg_add_unique_address(cd, NULL);
 
-                                       codegen_addpatchref(cd, PATCHER_resolve_classref_to_classinfo,
+                                       patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo,
                                                                                iptr->sx.s23.s3.c.ref,
                                                                                disp);
                                }
@@ -2753,7 +2752,7 @@ gen_method:
 
                                disp = dseg_add_unique_s4(cd, 0);             /* super->flags */
 
-                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_flags,
+                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_flags,
                                                                        iptr->sx.s23.s3.c.ref, disp);
 
                                M_ILD(REG_ITMP3, REG_PV, disp);
@@ -2765,7 +2764,7 @@ gen_method:
 
                        if ((super == NULL) || (super->flags & ACC_INTERFACE)) {
                                if (super == NULL) {
-                                       codegen_addpatchref(cd,
+                                       patcher_add_patch_ref(jd,
                                                                                PATCHER_instanceof_interface,
                                                                                iptr->sx.s23.s3.c.ref, 0);
                                }
@@ -2799,7 +2798,7 @@ gen_method:
 
                                        disp = dseg_add_unique_address(cd, NULL);
 
-                                       codegen_addpatchref(cd, PATCHER_resolve_classref_to_vftbl,
+                                       patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_vftbl,
                                                                                iptr->sx.s23.s3.c.ref,
                                                                                disp);
                                }
@@ -2871,7 +2870,7 @@ gen_method:
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                disp = dseg_add_unique_address(cd, NULL);
 
-                               codegen_addpatchref(cd, PATCHER_resolve_classref_to_classinfo,
+                               patcher_add_patch_ref(jd, PATCHER_resolve_classref_to_classinfo,
                                                                        iptr->sx.s23.s3.c.ref, disp);
                        }
                        else
@@ -2916,10 +2915,9 @@ gen_method:
 
        dseg_createlinenumbertable(cd);
 
-       /* generate stubs */
+       /* generate traps */
 
-       emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
+       emit_patcher_traps(jd);
 
        /* everything's ok */
 
@@ -3017,7 +3015,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
 #if !defined(WITH_STATIC_CLASSPATH)
        if (f == NULL)
-               codegen_addpatchref(cd, PATCHER_resolve_native_function, m, funcdisp);
+               patcher_add_patch_ref(jd, PATCHER_resolve_native_function, m, funcdisp);
 #endif
 
        /* emit trace code */
@@ -3037,34 +3035,22 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save integer and float argument registers */
 
-       j = 0;
-
        for (i = 0; i < md->paramcount; i++) {
-               t = md->paramtypes[i].type;
-
-               if (IS_INT_LNG_TYPE(t)) {
-                       if (!md->params[i].inmemory) {
-                               s1 = md->params[i].regoff;
+               if (!md->params[i].inmemory) {
+                       s1 = md->params[i].regoff;
 
-                               if (IS_2_WORD_TYPE(t)) {
-                                       M_IST(GET_HIGH_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
-                                       j++;
-                                       M_IST(GET_LOW_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
-                               }
-                               else
-                                       M_IST(s1, REG_SP, LA_SIZE + 4 * 4 + j * 4);
-
-                               j++;
-                       }
-               }
-       }
-
-       for (i = 0; i < md->paramcount; i++) {
-               if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
-                       if (!md->params[i].inmemory) {
-                               s1 = md->params[i].regoff;
-                               M_DST(s1, REG_SP, LA_SIZE + 4 * 4 + j * 8);
-                               j++;
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_ADR:
+                               M_IST(s1, REG_SP, LA_SIZE + 4*4 + i * 8);
+                               break;
+                       case TYPE_LNG:
+                               M_LST(s1, REG_SP, LA_SIZE + 4*4 + i * 8);
+                               break;
+                       case TYPE_FLT:
+                       case TYPE_DBL:
+                               M_DST(s1, REG_SP, LA_SIZE + 4*4 + i * 8);
+                               break;
                        }
                }
        }
@@ -3082,38 +3068,26 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore integer and float argument registers */
 
-       j = 0;
-
        for (i = 0; i < md->paramcount; i++) {
-               t = md->paramtypes[i].type;
-
-               if (IS_INT_LNG_TYPE(t)) {
-                       if (!md->params[i].inmemory) {
-                               s1 = md->params[i].regoff;
+               if (!md->params[i].inmemory) {
+                       s1 = md->params[i].regoff;
 
-                               if (IS_2_WORD_TYPE(t)) {
-                                       M_ILD(GET_HIGH_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
-                                       j++;
-                                       M_ILD(GET_LOW_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
-                               }
-                               else
-                                       M_ILD(s1, REG_SP, LA_SIZE + 4 * 4 + j * 4);
-
-                               j++;
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_ADR:
+                               M_ILD(s1, REG_SP, LA_SIZE + 4*4 + i * 8);
+                               break;
+                       case TYPE_LNG:
+                               M_LLD(s1, REG_SP, LA_SIZE + 4*4 + i * 8);
+                               break;
+                       case TYPE_FLT:
+                       case TYPE_DBL:
+                               M_DLD(s1, REG_SP, LA_SIZE + 4*4 + i * 8);
+                               break;
                        }
                }
        }
 
-       for (i = 0; i < md->paramcount; i++) {
-               if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
-                       if (!md->params[i].inmemory) {
-                               s1 = md->params[i].regoff;
-                               M_DLD(s1, REG_SP, LA_SIZE + 4 * 4 + j * 8);
-                               j++;
-                       }
-               }
-       }
-       
        /* copy or spill arguments to new locations */
 
        for (i = md->paramcount - 1, j = i + nativeparams; i >= 0; i--, j--) {
@@ -3272,9 +3246,9 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_MTCTR(REG_ITMP3);
        M_RTS;
 
-       /* generate patcher stubs */
+       /* generate patcher traps */
 
-       emit_patcher_stubs(jd);
+       emit_patcher_traps(jd);
 }
 
 
index 0c0045c7682a3fd25f7f29c4fa89d50715dda7c5..7d4459eb9b9b13df0b1b315eafdd08a0050a4db4 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.h 7988 2007-05-30 20:53:56Z twisti $
+   $Id: md-abi.h 8191 2007-07-08 15:15:53Z twisti $
 
 */
 
@@ -80,7 +80,7 @@
 #define FLT_TMP_CNT      6   /* number of float temporary registers           */
 #define FLT_RES_CNT      3   /* number of float reserved registers            */
 
-#define TRACE_ARGS_NUM   8
+#define TRACE_ARGS_NUM   4
 
 
 /* packed register defines ****************************************************/
index d7749c4b9c732e34d84effc62c032c94ce058ae8..258180df7281f60c4df75bc1f8bbe520afa40597 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8178 2007-07-05 11:13:20Z michi $
+   $Id: md-os.c 8243 2007-07-31 08:57:54Z michi $
 
 */
 
@@ -76,7 +76,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        ptrint             addr;
        ptrint             val;
        s4                 type;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
        _mc = _uc->uc_mcontext;
@@ -121,15 +121,25 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                        vm_abort("md_signal_handler_sigsegv: faulting address is not NULL: addr=%p", addr);
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
 
-       /* set registers */
+       /* remove stackframeinfo */
 
-       _ss->r11  = (ptrint) o;
-       _ss->r12  = (ptrint) xpc;
-       _ss->srr0 = (ptrint) asm_handle_exception;
+       stacktrace_remove_stackframeinfo(&sfi);
+
+       /* set registers (only if exception object ready) */
+
+       if (e != NULL) {
+               _ss->r11  = (ptrint) e;
+               _ss->r12  = (ptrint) xpc;
+               _ss->srr0 = (ptrint) asm_handle_exception;
+       }
 }
 
 
@@ -154,7 +164,7 @@ void md_signal_handler_sigtrap(int sig, siginfo_t *siginfo, void *_p)
        s4                  s1;
        ptrint              val;
        s4                  type;
-       java_objectheader  *o;
+       java_objectheader  *e;
 
        _uc = (ucontext_t *) _p;
        _mc = _uc->uc_mcontext;
@@ -182,13 +192,21 @@ void md_signal_handler_sigtrap(int sig, siginfo_t *siginfo, void *_p)
        type = EXCEPTION_HARDWARE_ARRAYINDEXOUTOFBOUNDS;
        val  = gregs[s1];
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _ss->r11  = (ptrint) o;
+       _ss->r11  = (ptrint) e;
        _ss->r12  = (ptrint) xpc;
        _ss->srr0 = (ptrint) asm_handle_exception;
 }
index e5db9ae4d1c7660fccaf74d644ccbb75fed3ac4f..5a86e5cecbd376d79f09bef69f1dd9d534da2a9b 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: emit.c 8216 2007-07-19 13:51:21Z michi $
 
 */
 
@@ -30,6 +30,7 @@
 #include "config.h"
 
 #include <assert.h>
+#include <stdint.h>
 
 #include "vm/types.h"
 
@@ -50,6 +51,7 @@
 #include "vm/jit/dseg.h"
 #include "vm/jit/emit-common.h"
 #include "vm/jit/jit.h"
+#include "vm/jit/patcher-common.h"
 #include "vm/jit/replace.h"
 
 #include "vmcore/options.h"
@@ -505,184 +507,49 @@ void emit_exception_check(codegendata *cd, instruction *iptr)
 }
 
 
-/* emit_patcher_stubs **********************************************************
+/* emit_patcher_traps **********************************************************
 
    Generates the code for the patcher stubs.
 
 *******************************************************************************/
 
-void emit_patcher_stubs(jitdata *jd)
+void emit_patcher_traps(jitdata *jd)
 {
        codegendata *cd;
-       patchref    *pref;
-       u4           mcode;
+       codeinfo    *code;
+       patchref_t  *pr;
        u1          *savedmcodeptr;
        u1          *tmpmcodeptr;
-       s4           targetdisp;
-       s4           disp;
 
        /* get required compiler data */
 
-       cd = jd->cd;
+       cd   = jd->cd;
+       code = jd->code;
 
        /* generate code patching stub call code */
 
-       targetdisp = 0;
-
-       for (pref = cd->patchrefs; pref != NULL; pref = pref->next) {
-               /* check code segment size */
-
-               MCODECHECK(100);
+       for (pr = list_first_unsynced(code->patchers); pr != NULL; pr = list_next_unsynced(code->patchers, pr)) {
 
                /* Get machine code which is patched back in later. The
-                  call is 1 instruction word long. */
+                  trap is 1 instruction word long. */
 
-               tmpmcodeptr = (u1 *) (cd->mcodebase + pref->branchpos);
+               tmpmcodeptr = (u1 *) (cd->mcodebase + pr->mpc);
 
-               mcode = *((u4 *) tmpmcodeptr);
+               pr->mcode = *((u4 *) tmpmcodeptr);
 
-               /* Patch in the call to call the following code (done at
+               /* Patch in the trap to call the signal handler (done at
                   compile time). */
 
                savedmcodeptr = cd->mcodeptr;   /* save current mcodeptr          */
                cd->mcodeptr  = tmpmcodeptr;    /* set mcodeptr to patch position */
 
-               disp = ((u4 *) savedmcodeptr) - (((u4 *) tmpmcodeptr) + 1);
-               M_BR(disp);
+               M_ALD_INTERN(REG_ZERO, REG_ZERO, EXCEPTION_HARDWARE_PATCHER);
 
                cd->mcodeptr = savedmcodeptr;   /* restore the current mcodeptr   */
-
-               /* create stack frame - keep stack 16-byte aligned */
-
-               M_AADD_IMM(REG_SP, -8 * 4, REG_SP);
-
-               /* calculate return address and move it onto the stack */
-
-               M_LDA(REG_ITMP3, REG_PV, pref->branchpos);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 5 * 4);
-
-               /* move pointer to java_objectheader onto stack */
-
-#if defined(ENABLE_THREADS)
-               /* order reversed because of data segment layout */
-
-               (void) dseg_add_unique_address(cd, NULL);                  /* flcword */
-               (void) dseg_add_unique_address(cd, lock_get_initial_lock_word());
-               disp = dseg_add_unique_address(cd, NULL);                  /* vftbl   */
-
-               M_LDA(REG_ITMP3, REG_PV, disp);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 4 * 4);
-#else
-               /* do nothing */
-#endif
-
-               /* move machine code onto stack */
-
-               disp = dseg_add_s4(cd, mcode);
-               M_ILD(REG_ITMP3, REG_PV, disp);
-               M_IST_INTERN(REG_ITMP3, REG_SP, 3 * 4);
-
-               /* move class/method/field reference onto stack */
-
-               disp = dseg_add_address(cd, pref->ref);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 2 * 4);
-
-               /* move data segment displacement onto stack */
-
-               disp = dseg_add_s4(cd, pref->disp);
-               M_ILD(REG_ITMP3, REG_PV, disp);
-               M_IST_INTERN(REG_ITMP3, REG_SP, 1 * 4);
-
-               /* move patcher function pointer onto stack */
-
-               disp = dseg_add_functionptr(cd, pref->patcher);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 4);
-
-               if (targetdisp == 0) {
-                       targetdisp = ((u4 *) cd->mcodeptr) - ((u4 *) cd->mcodebase);
-
-                       disp = dseg_add_functionptr(cd, asm_patcher_wrapper);
-                       M_ALD(REG_ITMP3, REG_PV, disp);
-                       M_MTCTR(REG_ITMP3);
-                       M_RTS;
-               }
-               else {
-                       disp = (((u4 *) cd->mcodebase) + targetdisp) -
-                               (((u4 *) cd->mcodeptr) + 1);
-                       M_BR(disp);
-               }
        }
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       s4           disp;
-       s4           i;
-#if !defined(NDEBUG)
-       u1          *savedmcodeptr;
-#endif
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       rplp = code->rplpoints;
-
-       /* store beginning of replacement stubs */
-
-       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
-
-       for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
-               /* do not generate stubs for non-trappable points */
-
-               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-               /* check code segment size */
-
-               MCODECHECK(100);
-
-#if !defined(NDEBUG)
-               savedmcodeptr = cd->mcodeptr;
-#endif
-
-               /* create stack frame - keep 16-byte aligned */
-
-               M_AADD_IMM(REG_SP, -4 * 4, REG_SP);
-
-               /* push address of `rplpoint` struct */
-
-               disp = dseg_add_address(cd, rplp);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 4);
-
-               /* jump to replacement function */
-
-               disp = dseg_add_functionptr(cd, asm_replacement_out);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_MTCTR(REG_ITMP3);
-               M_RTS;
-
-               assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
-       }
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
@@ -695,10 +562,11 @@ void emit_verbosecall_enter(jitdata *jd)
        methodinfo   *m;
        codegendata  *cd;
        registerdata *rd;
-       s4 s1, p, t, d;
-       int stack_off;
-       int stack_size;
-       methoddesc *md;
+       methoddesc   *md;
+       int32_t       disp;
+       int32_t       i;
+       int32_t       s, d;
+       int32_t       x;
 
        if (!JITDATA_HAS_FLAG_VERBOSECALL(jd))
                return;
@@ -710,27 +578,6 @@ void emit_verbosecall_enter(jitdata *jd)
        rd = jd->rd;
 
        md = m->parseddesc;
-       
-       /* Build up Stackframe for builtin_trace_args call (a multiple of 16) */
-       /* For Darwin:                                                        */
-       /* LA + TRACE_ARGS_NUM u8 args + methodinfo + LR                      */
-       /* LA_SIZE(=6*4) + 8*8         + 4          + 4  + 0(Padding)         */
-       /* 6 * 4 + 8 * 8 + 2 * 4 = 12 * 8 = 6 * 16                            */
-       /* For Linux:                                                         */
-       /* LA + (TRACE_ARGS_NUM - INT_ARG_CNT/2) u8 args + methodinfo         */
-       /* + INT_ARG_CNT * 4 ( save integer registers) + LR + 8 + 8 (Padding) */
-       /* LA_SIZE(=2*4) + 4 * 8 + 4 + 8 * 4 + 4 + 8                          */
-       /* 2 * 4 + 4 * 8 + 10 * 4 + 1 * 8 + 8= 12 * 8 = 6 * 16                */
-       
-       /* in nativestubs no Place to save the LR (Link Register) would be needed */
-       /* but since the stack frame has to be aligned the 4 Bytes would have to  */
-       /* be padded again */
-
-#if defined(__DARWIN__)
-       stack_size = LA_SIZE + (TRACE_ARGS_NUM + 1) * 8;
-#else
-       stack_size = 6 * 16;
-#endif
 
        /* mark trace code */
 
@@ -738,175 +585,93 @@ void emit_verbosecall_enter(jitdata *jd)
 
        M_MFLR(REG_ZERO);
        M_AST(REG_ZERO, REG_SP, LA_LR_OFFSET);
-       M_STWU(REG_SP, REG_SP, -stack_size);
+       M_STWU(REG_SP, REG_SP, -(LA_SIZE + (1 + ARG_CNT + TMP_CNT) * 8));
 
-       M_CLR(REG_ITMP1);    /* clear help register */
+       M_CLR(REG_ITMP1);                            /* prepare a "zero" register */
 
-       /* save up to TRACE_ARGS_NUM arguments into the reserved stack space */
-#if defined(__DARWIN__)
-       /* Copy Params starting from first to Stack                          */
-       /* since TRACE_ARGS == INT_ARG_CNT all used integer argument regs    */ 
-       /* are saved                                                         */
-       p = 0;
-#else
-       /* Copy Params starting from fifth to Stack (INT_ARG_CNT/2) are in   */
-       /* integer argument regs                                             */
-       /* all integer argument registers have to be saved                   */
-       for (p = 0; p < 8; p++) {
-               d = abi_registers_integer_argument[p];
-               /* save integer argument registers */
-               M_IST(d, REG_SP, LA_SIZE + 4 * 8 + 4 + p * 4);
-       }
-       p = 4;
-#endif
-       stack_off = LA_SIZE;
-
-       for (; p < md->paramcount && p < TRACE_ARGS_NUM; p++, stack_off += 8) {
-               t = md->paramtypes[p].type;
-
-               if (IS_INT_LNG_TYPE(t)) {
-                       if (!md->params[p].inmemory) {
-                               s1 = md->params[p].regoff;
-
-                               if (IS_2_WORD_TYPE(t)) {
-                                       M_IST(GET_HIGH_REG(s1), REG_SP, stack_off);
-                                       M_IST(GET_LOW_REG(s1), REG_SP, stack_off + 4);
-                               }
-                               else {
-                                       M_IST(REG_ITMP1, REG_SP, stack_off);
-                                       M_IST(s1, REG_SP, stack_off + 4);
-                               }
-                       }
-                       else {
-                               s1 = md->params[p].regoff + cd->stackframesize * 4 
-                                       + stack_size;
-                               if (IS_2_WORD_TYPE(t)) {
-                                       M_ILD(REG_ITMP2, REG_SP, s1);
-                                       M_IST(REG_ITMP2, REG_SP, stack_off);
-                                       M_ILD(REG_ITMP2, REG_SP, s1 + 4);
-                                       M_IST(REG_ITMP2, REG_SP, stack_off + 4);
-                               }
-                               else {
-                                       M_IST(REG_ITMP1, REG_SP, stack_off);
-                                       M_ILD(REG_ITMP2, REG_SP, s1);
-                                       M_IST(REG_ITMP2, REG_SP, stack_off + 4);
-                               }
-                       }
-               }
-               else {
-                       if (!md->params[p].inmemory) {
-                               s1 = md->params[p].regoff;
-
-                               if (!IS_2_WORD_TYPE(t)) {
-                                       M_IST(REG_ITMP1, REG_SP, stack_off);
-                                       M_FST(s1, REG_SP, stack_off + 4);
-                               }
-                               else
-                                       M_DST(s1, REG_SP, stack_off);
-                       }
-                       else {
-                               /* this should not happen */
+       /* save argument registers */
+
+       for (i = 0; i < md->paramcount; i++) {
+               if (!md->params[i].inmemory) {
+                       s = md->params[i].regoff;
+                       d = LA_SIZE + (1 + i) * 8;
+
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_ADR:
+                               M_IST(REG_ITMP1, REG_SP, d);            /* high-bits are zero */
+                               M_IST(s, REG_SP, d + 4);
+                               break;
+                       case TYPE_LNG:
+                               M_LST(s, REG_SP, d);
+                               break;
+                       case TYPE_FLT:
+                               M_IST(REG_ITMP1, REG_SP, d);            /* high-bits are zero */
+                               M_FST(s, REG_SP, d + 4);
+                               break;
+                       case TYPE_DBL:
+                               M_DST(s, REG_SP, d);
+                               break;
                        }
                }
        }
 
-       /* load first 4 (==INT_ARG_CNT/2) arguments into integer registers */
-#if defined(__DARWIN__)
-       for (p = 0; p < 8; p++) {
-               d = abi_registers_integer_argument[p];
-               M_ILD(d, REG_SP, LA_SIZE + p * 4);
-       }
-#else
-       /* LINUX */
-       /* Set integer and float argument registers vor trace_args call */
-       /* offset to saved integer argument registers                   */
+       /* load arguments as longs */
 
-       stack_off = LA_SIZE + 4 * 8 + 4;
+       d = 0;
 
-       for (p = 0; (p < 4) && (p < md->paramcount); p++) {
-               t = md->paramtypes[p].type;
+       for (i = 0; i < md->paramcount && i < TRACE_ARGS_NUM; i++) {
+               s = LA_SIZE + (1 + i) * 8;
+               x = PACK_REGS(abi_registers_integer_argument[d + 1],
+                                         abi_registers_integer_argument[d]);
 
-               if (IS_INT_LNG_TYPE(t)) {
-                       /* "stretch" int types */
-                       if (!IS_2_WORD_TYPE(t)) {
-                               M_CLR(abi_registers_integer_argument[2 * p]);
-                               M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP,stack_off);
-                               stack_off += 4;
-                       }
-                       else {
-                               M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP,stack_off + 4);
-                               M_ILD(abi_registers_integer_argument[2 * p], REG_SP,stack_off);
-                               stack_off += 8;
-                       }
-               }
-               else {
-                       if (!md->params[p].inmemory) {
-                               /* use reserved Place on Stack (sp + 5 * 16) to copy  */
-                               /* float/double arg reg to int reg                    */
-
-                               s1 = md->params[p].regoff;
-
-                               if (!IS_2_WORD_TYPE(t)) {
-                                       M_FST(s1, REG_SP, 5 * 16);
-                                       M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP, 5 * 16);
-                                       M_CLR(abi_registers_integer_argument[2 * p]);
-                               }
-                               else {
-                                       M_DST(s1, REG_SP, 5 * 16);
-                                       M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP,  5 * 16 + 4);
-                                       M_ILD(abi_registers_integer_argument[2 * p], REG_SP, 5 * 16);
-                               }
-                       }
-               }
+               M_LLD(x, REG_SP, s);
+
+               d += 2;
        }
-#endif
 
-       /* put methodinfo pointer on Stackframe */
-       p = dseg_add_address(cd, m);
-       M_ALD(REG_ITMP1, REG_PV, p);
+       /* put methodinfo pointer as last argument on the stack */
+
+       disp = dseg_add_address(cd, m);
+       M_ALD(REG_ITMP1, REG_PV, disp);
 #if defined(__DARWIN__)
        M_AST(REG_ITMP1, REG_SP, LA_SIZE + TRACE_ARGS_NUM * 8); 
 #else
-       M_AST(REG_ITMP1, REG_SP, LA_SIZE + 4 * 8);
+       M_AST(REG_ITMP1, REG_SP, LA_SIZE);
 #endif
-       p = dseg_add_functionptr(cd, builtin_verbosecall_enter);
-       M_ALD(REG_ITMP2, REG_PV, p);
+       disp = dseg_add_functionptr(cd, builtin_verbosecall_enter);
+       M_ALD(REG_ITMP2, REG_PV, disp);
        M_MTCTR(REG_ITMP2);
        M_JSR;
 
-#if defined(__DARWIN__)
-       /* restore integer argument registers from the reserved stack space */
-
-       stack_off = LA_SIZE;
+       /* restore argument registers */
 
-       for (p = 0; p < md->paramcount && p < TRACE_ARGS_NUM; p++, stack_off += 8) {
-               t = md->paramtypes[p].type;
+       for (i = 0; i < md->paramcount; i++) {
+               if (!md->params[i].inmemory) {
+                       s = LA_SIZE + (1 + i) * 8;
+                       d = md->params[i].regoff;
 
-               if (IS_INT_LNG_TYPE(t)) {
-                       if (!md->params[p].inmemory) {
-                               s1 = md->params[p].regoff;
-
-                               if (IS_2_WORD_TYPE(t)) {
-                                       M_ILD(GET_HIGH_REG(s1), REG_SP, stack_off);
-                                       M_ILD(GET_LOW_REG(s1), REG_SP, stack_off + 4);
-                               }
-                               else
-                                       M_ILD(s1, REG_SP, stack_off + 4);
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_ADR:
+                               M_ILD(d, REG_SP, s + 4);                      /* get low-bits */
+                               break;
+                       case TYPE_LNG:
+                               M_LLD(d, REG_SP, s);
+                               break;
+                       case TYPE_FLT:
+                               M_FLD(d, REG_SP, s + 4);                      /* get low-bits */
+                               break;
+                       case TYPE_DBL:
+                               M_DLD(d, REG_SP, s);
+                               break;
                        }
                }
        }
-#else
-       /* LINUX */
-       for (p = 0; p < 8; p++) {
-               d = abi_registers_integer_argument[p];
-               /* save integer argument registers */
-               M_ILD(d, REG_SP, LA_SIZE + 4 * 8 + 4 + p * 4);
-       }
-#endif
 
-       M_ALD(REG_ZERO, REG_SP, stack_size + LA_LR_OFFSET);
+       M_ALD(REG_ZERO, REG_SP, LA_SIZE + (1 + ARG_CNT + TMP_CNT) * 8 + LA_LR_OFFSET);
        M_MTLR(REG_ZERO);
-       M_LDA(REG_SP, REG_SP, stack_size);
+       M_LDA(REG_SP, REG_SP, LA_SIZE + (1 + ARG_CNT + TMP_CNT) * 8);
 
        /* mark trace code */
 
index 39670401f249df5a91fe76f50cc08cbb6cda69f1..5554fea240c14044938ca18f5385278f8d590770 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: md-abi.c 8190 2007-07-08 13:42:06Z twisti $
 
 */
 
@@ -30,8 +30,7 @@
 #include "config.h"
 
 #include <assert.h>
-
-#include "vm/types.h"
+#include <stdint.h>
 
 #include "vm/jit/powerpc/linux/md-abi.h"
 
 #include "vmcore/descriptor.h"
 
 
-#define _ALIGN(a)    do { if ((a) & 1) (a)++; } while (0)
-
-
 /* register descripton arrays *************************************************/
 
-s4 nregdescint[] = {
+int32_t nregdescint[] = {
        /* zero,      sp, NO(sys),   a0/v0,   a1/v1,      a2,      a3,      a4,   */
        REG_RES, REG_RES, REG_RES, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG,
 
@@ -70,7 +66,7 @@ const char *abi_registers_integer_name[] = {
        "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
 };
 
-const s4 abi_registers_integer_argument[] = {
+const int32_t abi_registers_integer_argument[] = {
        3,  /* a0 */
        4,  /* a1 */
        5,  /* a2 */
@@ -81,7 +77,7 @@ const s4 abi_registers_integer_argument[] = {
        10, /* a7 */
 };
 
-const s4 abi_registers_integer_saved[] = {
+const int32_t abi_registers_integer_saved[] = {
        14, /* s0 */
        15, /* s1 */
        24, /* s2 */
@@ -94,7 +90,7 @@ const s4 abi_registers_integer_saved[] = {
        31, /* s9 */
 };
 
-const s4 abi_registers_integer_temporary[] = {
+const int32_t abi_registers_integer_temporary[] = {
        17, /* t0 */
        18, /* t1 */
        19, /* t2 */
@@ -105,7 +101,7 @@ const s4 abi_registers_integer_temporary[] = {
 };
 
 
-s4 nregdescfloat[] = {
+int32_t nregdescfloat[] = {
        /*ftmp3,  fa0/v0,     fa1,     fa2,     fa3,     fa4,     fa5,     fa6,   */
        REG_RES, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG,
 
@@ -122,7 +118,7 @@ s4 nregdescfloat[] = {
 };
 
 
-const s4 abi_registers_float_argument[] = {
+const int32_t abi_registers_float_argument[] = {
        1,  /* fa0  */
        2,  /* fa1  */
        3,  /* fa2  */
@@ -133,7 +129,7 @@ const s4 abi_registers_float_argument[] = {
        8,  /* fa7  */
 };
 
-const s4 abi_registers_float_saved[] = {
+const int32_t abi_registers_float_saved[] = {
        14, /* fs0  */
        15, /* fs1  */
        24, /* fs2  */
@@ -146,7 +142,7 @@ const s4 abi_registers_float_saved[] = {
        31, /* fs9  */
 };
 
-const s4 abi_registers_float_temporary[] = {
+const int32_t abi_registers_float_temporary[] = {
        9,  /* ft0  */
        10, /* ft1  */
        11, /* ft2  */
@@ -181,10 +177,10 @@ const s4 abi_registers_float_temporary[] = {
 void md_param_alloc(methoddesc *md)
 {
        paramdesc *pd;
-       s4         i;
-       s4         iarg;
-       s4         farg;
-       s4         stacksize;
+       int32_t    i;
+       int32_t    iarg;
+       int32_t    farg;
+       int32_t    stacksize;
 
        /* set default values */
 
@@ -214,7 +210,7 @@ void md_param_alloc(methoddesc *md)
 
                case TYPE_LNG:
                        if (iarg < INT_ARG_CNT - 1) {
-                               _ALIGN(iarg);
+                               ALIGN_2(iarg);
                                pd->inmemory  = false;
                                pd->regoff    =
                                        PACK_REGS(abi_registers_integer_argument[iarg + 1],
@@ -222,7 +218,7 @@ void md_param_alloc(methoddesc *md)
                                iarg += 2;
                        }
                        else {
-                               _ALIGN(stacksize);
+                               ALIGN_2(stacksize);
                                pd->inmemory  = true;
                                pd->regoff    = stacksize * 4;
                                iarg          = INT_ARG_CNT;
@@ -250,7 +246,7 @@ void md_param_alloc(methoddesc *md)
                                farg++;
                        }
                        else {
-                               _ALIGN(stacksize);
+                               ALIGN_2(stacksize);
                                pd->inmemory  = true;
                                pd->regoff    = stacksize * 4;
                                stacksize    += 2;
index 0063dcd4141d0abe2577bdb086b5e6d6a634e184..716afad9f2ab0068996cbf00f56d91467be2a8ce 100644 (file)
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-
-   Changes:
-
-   $Id: md-abi.h 7713 2007-04-15 21:49:48Z twisti $
+   $Id: md-abi.h 8191 2007-07-08 15:15:53Z twisti $
 
 */
 
@@ -86,7 +80,7 @@
 #define FLT_TMP_CNT     11   /* number of float temporary registers           */
 #define FLT_RES_CNT      3   /* number of float reserved registers            */
 
-#define TRACE_ARGS_NUM   8
+#define TRACE_ARGS_NUM   4
 
 
 /* packed register defines ****************************************************/
index d5e90ef2fc2bb53bb66f2bb1b5f9edbc00c1afbd..737439741e45ed69d7cb037c87c68926f37b5ec8 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8178 2007-07-05 11:13:20Z michi $
+   $Id: md-os.c 8243 2007-07-31 08:57:54Z michi $
 
 */
 
@@ -76,7 +76,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        ptrint             addr;
        ptrint             val;
        s4                 type;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
 
@@ -121,15 +121,25 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                        vm_abort("md_signal_handler_sigsegv: faulting address is not NULL: addr=%p", addr);
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
 
-       /* set registers */
+       /* remove stackframeinfo */
 
-       _gregs[REG_ITMP1_XPTR] = (ptrint) o;
-       _gregs[REG_ITMP2_XPC]  = (ptrint) xpc;
-       _gregs[PT_NIP]         = (ptrint) asm_handle_exception;
+       stacktrace_remove_stackframeinfo(&sfi);
+
+       /* set registers (only if exception object ready) */
+
+       if (e != NULL) {
+               _gregs[REG_ITMP1_XPTR] = (ptrint) e;
+               _gregs[REG_ITMP2_XPC]  = (ptrint) xpc;
+               _gregs[PT_NIP]         = (ptrint) asm_handle_exception;
+       }
 }
 
 
@@ -153,7 +163,7 @@ void md_signal_handler_sigtrap(int sig, siginfo_t *siginfo, void *_p)
        s4                 s1;
        ptrint             val;
        s4                 type;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
 
@@ -181,13 +191,21 @@ void md_signal_handler_sigtrap(int sig, siginfo_t *siginfo, void *_p)
        type = EXCEPTION_HARDWARE_ARRAYINDEXOUTOFBOUNDS;
        val  = _gregs[s1];
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _gregs[REG_ITMP1_XPTR] = (ptrint) o;
+       _gregs[REG_ITMP1_XPTR] = (ptrint) e;
        _gregs[REG_ITMP2_XPC]  = (ptrint) xpc;
        _gregs[PT_NIP]         = (ptrint) asm_handle_exception;
 }
index 275acb322a28a0a7688da7782fc2d5c8202c3507..105f7a583afdc3f04c3f126cdeb3136cebd648f1 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: patcher.c 7596 2007-03-28 21:05:53Z twisti $
+   $Id: patcher.c 8216 2007-07-19 13:51:21Z michi $
 
 */
 
@@ -41,9 +41,9 @@
 #include "vm/initialize.h"
 
 #include "vm/jit/asmpart.h"
-#include "vm/jit/patcher.h"
 #include "vm/jit/md.h"
 #include "vm/jit/methodheader.h"
+#include "vm/jit/patcher-common.h"
 #include "vm/jit/stacktrace.h"
 
 #include "vmcore/class.h"
 #include "vmcore/references.h"
 
 
-/* patcher_wrapper *************************************************************
-
-   Wrapper for all patchers.  It also creates the stackframe info
-   structure.
-
-   If the return value of the patcher function is false, it gets the
-   exception object, clears the exception pointer and returns the
-   exception.
-
-*******************************************************************************/
-
-java_objectheader *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra)
-{
-       stackframeinfo     sfi;
-       u1                *xpc;
-       java_objectheader *o;
-       u4                 mcode;
-       functionptr        f;
-       bool               result;
-       java_objectheader *e;
-
-       /* define the patcher function */
-
-       bool (*patcher_function)(u1 *);
-
-       assert(pv != NULL);
-
-       /* get stuff from the stack */
-
-       xpc = (u1 *)                *((ptrint *) (sp + 5 * 4));
-       o   = (java_objectheader *) *((ptrint *) (sp + 4 * 4));
-       f   = (functionptr)         *((ptrint *) (sp + 0 * 4));
-
-       /* Correct RA is calculated in codegen.c and stored in the patcher
-          stub stack.  There's no need to adjust xpc. */
-
-       /* store PV into the patcher function position */
-
-       *((ptrint *) (sp + 0 * 4)) = (ptrint) pv;
-
-       /* cast the passed function to a patcher function */
-
-       patcher_function = (bool (*)(u1 *)) (ptrint) f;
-
-       /* enter a monitor on the patching position */
-
-       PATCHER_MONITORENTER;
-
-       /* create the stackframeinfo */
-
-       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp + 8 * 4, ra, xpc);
-
-       /* call the proper patcher function */
-
-       result = (patcher_function)(sp);
-
-       /* remove the stackframeinfo */
-
-       stacktrace_remove_stackframeinfo(&sfi);
-
-       /* check for return value and exit accordingly */
-
-       if (result == false) {
-               e = exceptions_get_and_clear_exception();
-
-               PATCHER_MONITOREXIT;
-
-               return e;
-       }
-
-       /* patch back original code */
-
-       mcode = *((u4 *) (sp + 3 * 4));
-
-       *((u4 *) xpc) = mcode;
-
-       /* synchronize instruction cache */
-
-       md_icacheflush(xpc, 4);
-
-       PATCHER_MARK_PATCHED_MONITOREXIT;
-
-       return NULL;
-}
+#define PATCH_BACK_ORIGINAL_MCODE \
+       *((u4 *) pr->mpc) = (u4) pr->mcode; \
+       md_icacheflush((u1 *) pr->mpc, 4);
 
 
 /* patcher_initialize_class ****************************************************
@@ -146,13 +65,13 @@ java_objectheader *patcher_wrapper(u1 *sp, u1 *pv, u1 *ra)
 
 *******************************************************************************/
 
-bool patcher_initialize_class(u1 *sp)
+bool patcher_initialize_class(patchref_t *pr)
 {
        classinfo *c;
 
        /* get stuff from the stack */
 
-       c = (classinfo *) *((ptrint *) (sp + 2 * 4));
+       c = (classinfo *) pr->ref;
 
        /* check if the class is initialized */
 
@@ -160,6 +79,8 @@ bool patcher_initialize_class(u1 *sp)
                if (!initialize_class(c))
                        return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        return true;
 }
 
@@ -172,19 +93,21 @@ bool patcher_initialize_class(u1 *sp)
 *******************************************************************************/
 
 #ifdef ENABLE_VERIFIER
-bool patcher_resolve_class(u1 *sp)
+bool patcher_resolve_class(patchref_t *pr)
 {
        unresolved_class *uc;
 
        /* get stuff from the stack */
 
-       uc = (unresolved_class *) *((ptrint *) (sp + 2 * 4));
+       uc = (unresolved_class *) pr->ref;
 
        /* resolve the class and check subtype constraints */
 
        if (!resolve_class_eager_no_access_check(uc))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        return true;
 }
 #endif /* ENABLE_VERIFIER */
@@ -221,31 +144,31 @@ bool patcher_resolve_class(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_resolve_classref_to_classinfo(u1 *sp)
+bool patcher_resolve_classref_to_classinfo(patchref_t *pr)
 {
        constant_classref *cr;
-       s4                 disp;
-       u1                *pv;
+       u1                *datap;
        classinfo         *c;
 
        /* get stuff from the stack */
 
-       cr   = (constant_classref *) *((ptrint *) (sp + 2 * 4));
-       disp =                       *((s4 *)     (sp + 1 * 4));
-       pv   = (u1 *)                *((ptrint *) (sp + 0 * 4));
+       cr    = (constant_classref *) pr->ref;
+       datap = (u1 *)                pr->datap;
 
        /* get the classinfo */
 
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* patch the classinfo pointer */
 
-       *((ptrint *) (pv + disp)) = (ptrint) c;
+       *((ptrint *) datap) = (ptrint) c;
 
        /* synchronize data cache */
 
-       md_dcacheflush(pv + disp, SIZEOF_VOID_P);
+       md_dcacheflush(datap, SIZEOF_VOID_P);
 
        return true;
 }
@@ -269,31 +192,31 @@ bool patcher_resolve_classref_to_classinfo(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_resolve_classref_to_vftbl(u1 *sp)
+bool patcher_resolve_classref_to_vftbl(patchref_t *pr)
 {
        constant_classref *cr;
-       s4                 disp;
-       u1                *pv;
+       u1                *datap;
        classinfo         *c;
 
        /* get stuff from the stack */
 
-       cr   = (constant_classref *) *((ptrint *) (sp + 2 * 4));
-       disp =                       *((s4 *)     (sp + 1 * 4));
-       pv   = (u1 *)                *((ptrint *) (sp + 0 * 4));
+       cr    = (constant_classref *) pr->ref;
+       datap = (u1 *)                pr->datap;
 
        /* get the fieldinfo */
 
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* patch super class' vftbl */
 
-       *((ptrint *) (pv + disp)) = (ptrint) c->vftbl;
+       *((ptrint *) datap) = (ptrint) c->vftbl;
 
        /* synchronize data cache */
 
-       md_dcacheflush(pv + disp, SIZEOF_VOID_P);
+       md_dcacheflush(datap, SIZEOF_VOID_P);
 
        return true;
 }
@@ -308,31 +231,31 @@ bool patcher_resolve_classref_to_vftbl(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_resolve_classref_to_flags(u1 *sp)
+bool patcher_resolve_classref_to_flags(patchref_t *pr)
 {
        constant_classref *cr;
-       s4                 disp;
-       u1                *pv;
+       u1                *datap;
        classinfo         *c;
 
        /* get stuff from the stack */
 
-       cr   = (constant_classref *) *((ptrint *) (sp + 2 * 4));
-       disp =                       *((s4 *)     (sp + 1 * 4));
-       pv   = (u1 *)                *((ptrint *) (sp + 0 * 4));
+       cr    = (constant_classref *) pr->ref;
+       datap = (u1 *)                pr->datap;
 
        /* get the fieldinfo */
 
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* patch class flags */
 
-       *((s4 *) (pv + disp)) = (s4) c->flags;
+       *((s4 *) datap) = (s4) c->flags;
 
        /* synchronize data cache */
 
-       md_dcacheflush(pv + disp, SIZEOF_VOID_P);
+       md_dcacheflush(datap, SIZEOF_VOID_P);
 
        return true;
 }
@@ -345,31 +268,31 @@ bool patcher_resolve_classref_to_flags(u1 *sp)
 *******************************************************************************/
 
 #if !defined(WITH_STATIC_CLASSPATH)
-bool patcher_resolve_native_function(u1 *sp)
+bool patcher_resolve_native_function(patchref_t *pr)
 {
        methodinfo  *m;
-       s4           disp;
-       u1          *pv;
+       u1          *datap;
        functionptr  f;
 
        /* get stuff from the stack */
 
-       m    = (methodinfo *) *((ptrint *) (sp + 2 * 4));
-       disp =                *((s4 *)     (sp + 1 * 4));
-       pv   = (u1 *)         *((ptrint *) (sp + 0 * 4));
+       m     = (methodinfo *) pr->ref;
+       datap = (u1 *)         pr->datap;
 
        /* resolve native function */
 
        if (!(f = native_resolve_function(m)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* patch native function pointer */
 
-       *((ptrint *) (pv + disp)) = (ptrint) f;
+       *((ptrint *) datap) = (ptrint) f;
 
        /* synchronize data cache */
 
-       md_dcacheflush(pv + disp, SIZEOF_VOID_P);
+       md_dcacheflush(datap, SIZEOF_VOID_P);
 
        return true;
 }
@@ -386,22 +309,18 @@ bool patcher_resolve_native_function(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_get_putstatic(u1 *sp)
+bool patcher_get_putstatic(patchref_t *pr)
 {
        u1               *ra;
-       u4                mcode;
        unresolved_field *uf;
-       s4                disp;
-       u1               *pv;
+       u1               *datap;
        fieldinfo        *fi;
 
        /* get stuff from the stack */
 
-       ra    = (u1 *)                *((ptrint *) (sp + 5 * 4));
-       mcode =                       *((u4 *)     (sp + 3 * 4));
-       uf    = (unresolved_field *)  *((ptrint *) (sp + 2 * 4));
-       disp  =                       *((s4 *)     (sp + 1 * 4));
-       pv    = (u1 *)                *((ptrint *) (sp + 0 * 4));
+       ra    = (u1 *)                pr->mpc;
+       uf    = (unresolved_field *)  pr->ref;
+       datap = (u1 *)                pr->datap;
 
        /* get the fieldinfo */
 
@@ -414,13 +333,15 @@ bool patcher_get_putstatic(u1 *sp)
                if (!initialize_class(fi->class))
                        return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* patch the field value's address */
 
-       *((ptrint *) (pv + disp)) = (ptrint) &(fi->value);
+       *((ptrint *) datap) = (ptrint) &(fi->value);
 
        /* synchronize data cache */
 
-       md_dcacheflush(pv + disp, SIZEOF_VOID_P);
+       md_dcacheflush(datap, SIZEOF_VOID_P);
 
        return true;
 }
@@ -435,74 +356,53 @@ bool patcher_get_putstatic(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_get_putfield(u1 *sp)
+bool patcher_get_putfield(patchref_t *pr)
 {
        u1               *ra;
        unresolved_field *uf;
-       u1               *pv;
        fieldinfo        *fi;
        s2                disp;
 
-       ra = (u1 *)               *((ptrint *) (sp + 5 * 4));
-       uf = (unresolved_field *) *((ptrint *) (sp + 2 * 4));
-       pv = (u1 *)               *((ptrint *) (sp + 1 * 4));
+       ra = (u1 *)               pr->mpc;
+       uf = (unresolved_field *) pr->ref;
 
        /* get the fieldinfo */
 
        if (!(fi = resolve_field_eager(uf)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* if we show NOPs, we have to skip them */
 
-       if (opt_shownops) {
-               /* patch the field's offset */
-
-               if (IS_LNG_TYPE(fi->type)) {
-                       /* If the field has type long, we have to patch two
-                          instructions.  But we have to check which instruction
-                          is first.  We do that with the offset of the first
-                          instruction. */
-
-                       disp = *((u4 *) (ra + 1 * 4));
-
-                       if (disp == 4) {
-                               *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
-                               *((u4 *) (ra + 2 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
-                       }
-                       else {
-                               *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
-                               *((u4 *) (ra + 2 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
-                       }
+       if (opt_shownops)
+               ra = ra + 1 * 4;
+
+       /* patch the field's offset */
+
+       if (IS_LNG_TYPE(fi->type)) {
+               /* If the field has type long, we have to patch two
+                  instructions.  But we have to check which instruction
+                  is first.  We do that with the offset of the first
+                  instruction. */
+
+               disp = *((u4 *) (ra + 0 * 4));
+
+               if (disp == 4) {
+                       *((u4 *) (ra + 0 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
+                       *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
                }
-               else
-                       *((u4 *) (ra + 1 * 4)) |= (s2) (fi->offset & 0x0000ffff);
-       }
-       else {
-               if (IS_LNG_TYPE(fi->type)) {
-
-                       disp = *((u4 *) (sp + 3 * 4));
-
-                       /* We patch the first instruction in the patcher stub
-                          stack and the second in the code.  The first
-                          instruction is patched back later in
-                          patcher_wrapper. */
-
-                       if (disp == 4) {
-                               *((u4 *) (sp + 3 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
-                               *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
-                       }
-                       else {
-                               *((u4 *) (sp + 3 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
-                               *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
-                       }
+               else {
+                       *((u4 *) (ra + 0 * 4)) |= (s2) ((fi->offset + 0) & 0x0000ffff);
+                       *((u4 *) (ra + 1 * 4)) |= (s2) ((fi->offset + 4) & 0x0000ffff);
                }
-               else
-                       *((u4 *) (sp + 3 * 4)) |= (s2) (fi->offset & 0x0000ffff);
        }
+       else
+               *((u4 *) (ra + 0 * 4)) |= (s2) (fi->offset & 0x0000ffff);
 
        /* synchronize instruction cache */
 
-       md_icacheflush(ra + 1 * 4, 2 * 4);
+       md_icacheflush(ra + 0 * 4, 2 * 4);
 
        return true;
 }
@@ -519,31 +419,31 @@ bool patcher_get_putfield(u1 *sp)
 
 ******************************************************************************/
 
-bool patcher_invokestatic_special(u1 *sp)
+bool patcher_invokestatic_special(patchref_t *pr)
 {
        unresolved_method *um;
-       s4                 disp;
-       u1                *pv;
+       u1                *datap;
        methodinfo        *m;
 
        /* get stuff from the stack */
 
-       um   = (unresolved_method *) *((ptrint *) (sp + 2 * 4));
-       disp =                       *((s4 *)     (sp + 1 * 4));
-       pv   = (u1 *)                *((ptrint *) (sp + 0 * 4));
+       um    = (unresolved_method *) pr->ref;
+       datap = (u1 *)                pr->datap;
 
        /* get the fieldinfo */
 
        if (!(m = resolve_method_eager(um)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* patch stubroutine */
 
-       *((ptrint *) (pv + disp)) = (ptrint) m->stubroutine;
+       *((ptrint *) datap) = (ptrint) m->stubroutine;
 
        /* synchronize data cache */
 
-       md_dcacheflush(pv + disp, SIZEOF_VOID_P);
+       md_dcacheflush(datap, SIZEOF_VOID_P);
 
        return true;
 }
@@ -561,7 +461,7 @@ bool patcher_invokestatic_special(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_invokevirtual(u1 *sp)
+bool patcher_invokevirtual(patchref_t *pr)
 {
        u1                *ra;
        unresolved_method *um;
@@ -570,14 +470,16 @@ bool patcher_invokevirtual(u1 *sp)
 
        /* get stuff from the stack */
 
-       ra = (u1 *)                *((ptrint *) (sp + 5 * 4));
-       um = (unresolved_method *) *((ptrint *) (sp + 2 * 4));
+       ra = (u1 *)                pr->mpc;
+       um = (unresolved_method *) pr->ref;
 
        /* get the fieldinfo */
 
        if (!(m = resolve_method_eager(um)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* if we show NOPs, we have to skip them */
 
        if (opt_shownops)
@@ -610,7 +512,7 @@ bool patcher_invokevirtual(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_invokeinterface(u1 *sp)
+bool patcher_invokeinterface(patchref_t *pr)
 {
        u1                *ra;
        unresolved_method *um;
@@ -619,14 +521,16 @@ bool patcher_invokeinterface(u1 *sp)
 
        /* get stuff from the stack */
 
-       ra = (u1 *)                *((ptrint *) (sp + 5 * 4));
-       um = (unresolved_method *) *((ptrint *) (sp + 2 * 4));
+       ra = (u1 *)                pr->mpc;
+       um = (unresolved_method *) pr->ref;
 
        /* get the fieldinfo */
 
        if (!(m = resolve_method_eager(um)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* if we show NOPs, we have to skip them */
 
        if (opt_shownops)
@@ -671,7 +575,7 @@ bool patcher_invokeinterface(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_checkcast_interface(u1 *sp)
+bool patcher_checkcast_interface(patchref_t *pr)
 {
        u1                *ra;
        constant_classref *cr;
@@ -680,14 +584,16 @@ bool patcher_checkcast_interface(u1 *sp)
 
        /* get stuff from the stack */
 
-       ra = (u1 *)                *((ptrint *) (sp + 5 * 4));
-       cr = (constant_classref *) *((ptrint *) (sp + 2 * 4));
+       ra = (u1 *)                pr->mpc;
+       cr = (constant_classref *) pr->ref;
 
        /* get the fieldinfo */
 
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* if we show NOPs, we have to skip them */
 
        if (opt_shownops)
@@ -725,7 +631,7 @@ bool patcher_checkcast_interface(u1 *sp)
 
 *******************************************************************************/
 
-bool patcher_instanceof_interface(u1 *sp)
+bool patcher_instanceof_interface(patchref_t *pr)
 {
        u1                *ra;
        constant_classref *cr;
@@ -734,14 +640,16 @@ bool patcher_instanceof_interface(u1 *sp)
 
        /* get stuff from the stack */
 
-       ra = (u1 *)                *((ptrint *) (sp + 5 * 4));
-       cr = (constant_classref *) *((ptrint *) (sp + 2 * 4));
+       ra = (u1 *)                pr->mpc;
+       cr = (constant_classref *) pr->ref;
 
        /* get the fieldinfo */
 
        if (!(c = resolve_classref_eager(cr)))
                return false;
 
+       PATCH_BACK_ORIGINAL_MCODE;
+
        /* if we show NOPs, we have to skip them */
 
        if (opt_shownops)
index 8e2bc29642692d7ad6765cf154d5d7407cd032da..01919a281b2cd23ab1ba8a15befa374fed58ee01 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: codegen.c 8211 2007-07-18 19:52:23Z michi $
 
 */
 
@@ -2676,7 +2676,6 @@ gen_method:
        /* generate stubs */
 
        emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */
 
index 4a8dc9bf644d62291c48c4309a1f823ba03f66f9..c5c6c7ded01d9e0676bc79bdb61887fc8eef31c5 100644 (file)
@@ -757,100 +757,6 @@ void emit_patcher_stubs(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *replacementpoint;
-       s4           disp;
-       s4           i;
-#if !defined(NDEBUG)
-       u1          *savedmcodeptr;
-#endif
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       replacementpoint = jd->code->rplpoints;
-
-       for (i = 0; i < code->rplpointcount; ++i, ++replacementpoint) {
-               /* do not generate stubs for non-trappable points */
-
-               if (replacementpoint->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-
-               /* check code segment size */
-
-               MCODECHECK(200);
-
-#if !defined(NDEBUG)
-               savedmcodeptr = cd->mcodeptr;
-#endif
-               /* create stack frame - keep 16-byte aligned */
-
-               M_AADD_IMM(REG_SP, -4 * 8, REG_SP);
-
-               /* push address of `rplpoint` struct */
-
-               disp = dseg_add_address(cd, replacementpoint);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 8);
-
-               /* jump to replacement function */
-
-               disp = dseg_add_functionptr(cd, asm_replacement_out);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_MTCTR(REG_ITMP3);
-               M_RTS;
-
-               assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
-
-#if 0
-               /* note start of stub code */
-
-               replacementpoint->outcode = (u1 *) (cd->mcodeptr - cd->mcodebase);
-
-               /* make machine code for patching */
-
-               savedmcodeptr  = cd->mcodeptr;
-               cd->mcodeptr = (u1 *) &(replacementpoint->mcode) + 1 /* big-endian */;
-
-               disp = (ptrint)((s4*)replacementpoint->outcode - (s4*)replacementpoint->pc) - 1;
-               M_BR(disp);
-
-               cd->mcodeptr = savedmcodeptr;
-
-               /* create stack frame - keep 16-byte aligned */
-
-               M_AADD_IMM(REG_SP, -4 * 4, REG_SP);
-
-               /* push address of `rplpoint` struct */
-
-               disp = dseg_add_unique_address(cd, replacementpoint);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_AST_INTERN(REG_ITMP3, REG_SP, 0 * 4);
-
-               /* jump to replacement function */
-
-               disp = dseg_add_functionptr(cd, asm_replacement_out);
-               M_ALD(REG_ITMP3, REG_PV, disp);
-               M_MTCTR(REG_ITMP3);
-               M_RTS;
-#endif
-       }
-}
-#endif /* define(ENABLE_REPLACEMENT) */
-
 /*
 * These are local overrides for various environment variables in Emacs.
 * Please do not remove this and leave it at the end of the file, where
index 221548b2c0fb08dc1cdc806f465428b517fd5b23..db2a9d5a2c25949b66f0f5af9dc5cb45ef36b197 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-os.c 8178 2007-07-05 11:13:20Z michi $
+   $Id: md-os.c 8243 2007-07-31 08:57:54Z michi $
 
 */
 
@@ -103,7 +103,18 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                addr = _mc->gp_regs[s1];
                type = (s4) addr;
        }
-       e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        _mc->gp_regs[REG_ITMP1]     = (ptrint) e;
        _mc->gp_regs[REG_ITMP2_XPC] = (ptrint) xpc;
index a4f16ff81b05f1b4e86f7548443263fb2e8ddc78..be4d2b8fdcbbfa21107126ac2779fbf0b915ad98 100644 (file)
 #define REPLACE_RA_LINKAGE_AREA
 #define REPLACE_LEAFMETHODS_RA_REGISTER
 #define REPLACE_REG_RA REG_ITMP3 /* the execution state has the LR in itmp3 */
+/* s390 */
+#elif defined(__S390__)
+#define REPLACE_RA_TOP_OF_FRAME
+#define REPLACE_REG_RA REG_ITMP3
 #endif
 
 
@@ -853,7 +857,7 @@ void replace_activate_replacement_points(codeinfo *code, bool mappable)
 
                savedmcode -= REPLACEMENT_PATCH_SIZE;
 
-#if (defined(__I386__) || defined(__X86_64__) || defined(__ALPHA__) || defined(__POWERPC__) || defined(__MIPS__)) && defined(ENABLE_JIT)
+#if (defined(__I386__) || defined(__X86_64__) || defined(__ALPHA__) || defined(__POWERPC__) || defined(__MIPS__) || defined(__S390__)) && defined(ENABLE_JIT)
                md_patch_replacement_point(code, index, rp, savedmcode);
 #endif
                rp->flags |= RPLPOINT_FLAG_ACTIVE;
@@ -915,7 +919,7 @@ void replace_deactivate_replacement_points(codeinfo *code)
                DOLOG( printf("deactivate replacement point:\n");
                           replace_replacement_point_println(rp, 1); fflush(stdout); );
 
-#if (defined(__I386__) || defined(__X86_64__) || defined(__ALPHA__) || defined(__POWERPC__) || defined(__MIPS__)) && defined(ENABLE_JIT)
+#if (defined(__I386__) || defined(__X86_64__) || defined(__ALPHA__) || defined(__POWERPC__) || defined(__MIPS__) || defined(__S390__)) && defined(ENABLE_JIT)
                md_patch_replacement_point(code, -1, rp, savedmcode);
 #endif
 
@@ -2833,6 +2837,55 @@ void replace_free_safestack(replace_safestack_t *st, executionstate_t *tmpes)
 }
 
 
+/* replace_me_wrapper **********************************************************
+
+   TODO: Document me!
+
+*******************************************************************************/
+
+bool replace_me_wrapper(u1 *pc)
+{
+       codeinfo         *code;
+       rplpoint         *rp;
+       executionstate_t  es;
+
+       /* search the codeinfo for the given PC */
+
+       code = code_find_codeinfo_for_pc(pc);
+       assert(code);
+
+       /* search for a replacement point at the given PC */
+
+#if 0
+       rp = replace_find_replacement_point_for_pc(code, pc);
+       assert(rp == NULL || rp->pc == pc);
+#else
+       {
+               int i;
+               rplpoint *rp2;
+               rp = NULL;
+               for (i=0,rp2=code->rplpoints; i<code->rplpointcount; i++,rp2++) {
+                       if (rp2->pc == pc)
+                               rp = rp2;
+               }
+       }
+#endif
+
+       /* check if the replacement point is active */
+
+       if (rp != NULL && (rp->flags & RPLPOINT_FLAG_ACTIVE)) {
+
+               /*md_replace_executionstate_read(&es, context);*/
+
+               replace_me(rp, &es);
+
+               return true;
+       }
+       else
+               return false;
+}
+
+
 /* replace_me ******************************************************************
  
    This function is called by asm_replacement_out when a thread reaches
@@ -2957,7 +3010,7 @@ void replace_me(rplpoint *rp, executionstate_t *es)
 
        /* call the assembler code for the last phase of replacement */
 
-#if (defined(__I386__) || defined(__X86_64__) || defined(__ALPHA__) || defined(__POWERPC__) || defined(__MIPS__)) && defined(ENABLE_JIT)
+#if (defined(__I386__) || defined(__X86_64__) || defined(__ALPHA__) || defined(__POWERPC__) || defined(__MIPS__) || defined(__S390__)) && defined(ENABLE_JIT)
        asm_replacement_in(&(safestack->es), safestack);
 #endif
 
index 690668863d0184d7e7e963d0e8461767c4c8c3a9..2175d6040889b9680ca8bf2dc12d476e258b8fa0 100644 (file)
@@ -45,7 +45,6 @@
 #define REPLACEMENT_POINT_RETURN(cd, iptr)
 #define REPLACEMENT_POINT_INVOKE(cd, iptr)
 #define REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr)
-#define REPLACEMENT_EMIT_STUBS(jd)
 
 #else /* defined(ENABLE_REPLACEMENT) */
 
@@ -280,8 +279,6 @@ struct replace_safestack_t {
                cd->replacementpoint[-1].callsize = (cd->mcodeptr - cd->mcodebase)\
                                        - (ptrint) cd->replacementpoint[-1].pc;
 
-#define REPLACEMENT_EMIT_STUBS(jd)                                   \
-    emit_replacement_stubs(jd);
 
 /*** prototypes ********************************************************/
 
@@ -291,6 +288,8 @@ void replace_free_replacement_points(codeinfo *code);
 void replace_activate_replacement_points(codeinfo *code, bool mappable);
 void replace_deactivate_replacement_points(codeinfo *code);
 
+bool replace_me_wrapper(u1 *pc);
+
 void replace_me(rplpoint *rp,executionstate_t *es);
 
 #if !defined(NDEBUG)
index 95edc5d159636f9b64610cb4baa1fcf5c5d39873..908b0586dec899968c4c2961f12c44ae9e5bbc8e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: arch.h 7839 2007-04-29 22:46:56Z pm $
+   $Id: arch.h 8240 2007-07-29 20:36:47Z pm $
 
 */
 
 
 #define SUPPORT_HARDWARE_DIVIDE_BY_ZERO  1
 
+/* replacement ****************************************************************/
+
+#define REPLACEMENT_PATCH_SIZE           5             /* bytes */
+#define REPLACEMENT_STUB_SIZE            (4+(4+4+4+4)+4+(4+4+4+4)+2) /* bytes */
+
 /* misc ***********************************************************************/
 
 #define HAS_4BYTE_STACKSLOT
index 28340abaf88817c8a3432fb38129bceff337de68..a96e19678b71d26743f3dfca2ddb3421b4c0b146 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8152 2007-06-27 20:37:45Z pm $
+   $Id: codegen.c 8240 2007-07-29 20:36:47Z pm $
 
 */
 
@@ -217,6 +217,8 @@ bool codegen_emit(jitdata *jd)
                ICONST(REG_ITMP2, 1);
                N_AL(REG_ITMP2, OFFSET(codeinfo, frequency), RN, REG_ITMP1);
                M_IST(REG_ITMP2, REG_ITMP1, OFFSET(codeinfo, frequency));
+
+               PROFILE_CYCLE_START;
        }
 #endif
 
@@ -393,9 +395,10 @@ bool codegen_emit(jitdata *jd)
        }
 
        /* end of header generation */
-#if 0
-       replacementpoint = jd->code->rplpoints;
-#endif
+
+       /* create replacement points */
+
+       REPLACEMENT_POINTS_INIT(cd, jd);
 
        /* walk through all basic blocks */
 
@@ -411,35 +414,31 @@ bool codegen_emit(jitdata *jd)
 
                /* handle replacement points */
 
-#if 0
-               if (bptr->bitflags & BBFLAG_REPLACEMENT) {
-                       replacementpoint->pc = (u1*)(ptrint)bptr->mpc; /* will be resolved later */
-                       
-                       replacementpoint++;
-
-                       assert(cd->lastmcodeptr <= cd->mcodeptr);
-                       cd->lastmcodeptr = cd->mcodeptr + 5; /* 5 byte jmp patch */
-               }
-#endif
+               REPLACEMENT_POINT_BLOCK_START(cd, bptr);
 
                /* copy interface registers to their destination */
 
                len = bptr->indepth;
                MCODECHECK(512);
 
+#if defined(ENABLE_PROFILING)
                /* generate basicblock profiling code */
 
                if (JITDATA_HAS_FLAG_INSTRUMENT(jd)) {
                        /* count frequency */
 
-                       M_MOV_IMM(code->bbfrequency, REG_ITMP3);
-                       M_IINC_MEMBASE(REG_ITMP3, bptr->nr * 4);
+                       M_ALD_DSEG(REG_ITMP1, CodeinfoPointer);
+                       M_ALD(REG_ITMP1, REG_ITMP1, OFFSET(codeinfo, bbfrequency));
+                       ICONST(REG_ITMP2, 1);
+                       N_AL(REG_ITMP2, bptr->nr * 4, RN, REG_ITMP1);
+                       M_IST(REG_ITMP2, REG_ITMP1, bptr->nr * 4);
 
                        /* if this is an exception handler, start profiling again */
 
                        if (bptr->type == BBTYPE_EXH)
                                PROFILE_CYCLE_START;
                }
+#endif
 
 #if defined(ENABLE_LSRA)
                if (opt_lsra) {
@@ -496,8 +495,24 @@ bool codegen_emit(jitdata *jd)
                case ICMD_NOP:        /* ...  ==> ...                                 */
                case ICMD_POP:        /* ..., value  ==> ...                          */
                case ICMD_POP2:       /* ..., value, value  ==> ...                   */
-               case ICMD_INLINE_START: /* internal ICMDs                         */
+                       break;
+
+               case ICMD_INLINE_START:
+
+                       REPLACEMENT_POINT_INLINE_START(cd, iptr);
+                       break;
+
+               case ICMD_INLINE_BODY:
+
+                       REPLACEMENT_POINT_INLINE_BODY(cd, iptr);
+                       dseg_addlinenumber_inline_start(cd, iptr);
+                       dseg_addlinenumber(cd, iptr->line);
+                       break;
+
                case ICMD_INLINE_END:
+
+                       dseg_addlinenumber_inline_end(cd, iptr);
+                       dseg_addlinenumber(cd, iptr->line);
                        break;
 
                case ICMD_CHECKNULL:  /* ..., objectref  ==> ..., objectref           */
@@ -2014,9 +2029,11 @@ bool codegen_emit(jitdata *jd)
                                fieldtype = fi->type;
                                disp      = dseg_add_address(cd, &(fi->value));
 
-                               if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
-                                       codegen_addpatchref(cd, PATCHER_clinit,
-                                                                               fi->class, disp);
+                               if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) {
+                                       PROFILE_CYCLE_STOP;
+                                       codegen_addpatchref(cd, PATCHER_clinit, fi->class, disp);
+                                       PROFILE_CYCLE_START;
+                               }
                        }
 
                        M_ALD_DSEG(REG_ITMP1, disp);
@@ -2166,11 +2183,11 @@ bool codegen_emit(jitdata *jd)
 
                case ICMD_ATHROW:       /* ..., objectref ==> ... (, objectref)       */
 
+                       /* PROFILE_CYCLE_STOP; */
+               
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        M_INTMOVE(s1, REG_ITMP1_XPTR);
 
-                       PROFILE_CYCLE_STOP;
-
 #ifdef ENABLE_VERIFIER
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                uc = iptr->sx.s23.s2.uc;
@@ -2503,7 +2520,9 @@ bool codegen_emit(jitdata *jd)
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                unresolved_class *uc = iptr->sx.s23.s2.uc;
 
+                               PROFILE_CYCLE_STOP;
                                codegen_addpatchref(cd, PATCHER_athrow_areturn, uc, 0);
+                               PROFILE_CYCLE_START;
                        }
 #endif /* ENABLE_VERIFIER */
                        goto nowperformreturn;
@@ -2608,6 +2627,9 @@ nowperformreturn:
                        if (cd->stackframesize)
                                M_AADD_IMM(cd->stackframesize * 4, REG_SP);
 
+                       /* generate method profiling code */
+
+                       PROFILE_CYCLE_STOP;
                        M_RET;
                        ALIGNCODENOP;
                        }
@@ -2774,6 +2796,10 @@ gen_method:
                                }
                        }
 
+                       /* generate method profiling code */
+
+                       PROFILE_CYCLE_STOP;
+
                        switch (iptr->opc) {
                        case ICMD_BUILTIN:
                                disp = dseg_add_functionptr(cd, bte->fp);
@@ -2838,8 +2864,6 @@ gen_method:
                                 * and -0xFFF in index register (itmp1)
                                 */
 
-                               N_LHI(REG_ITMP1, -N_DISP_MAX);
-
                                if (lm == NULL) {
                                        codegen_addpatchref(cd, PATCHER_invokeinterface, um, 0);
 
@@ -2848,15 +2872,15 @@ gen_method:
                                }
                                else {
                                        s1 = OFFSET(vftbl_t, interfacetable[0]) -
-                                               sizeof(methodptr*) * lm->class->index +
-                                               N_DISP_MAX;
+                                               sizeof(methodptr*) * lm->class->index;
 
                                        s2 = sizeof(methodptr) * (lm - lm->class->methods);
                                }
 
                                /* Implicit null-pointer check */
                                M_ALD(REG_METHODPTR, REG_A0, OFFSET(java_objectheader, vftbl));
-                               N_L(REG_METHODPTR, s1, REG_ITMP1, REG_METHODPTR);
+                               N_LHI(REG_ITMP1, s1);
+                               N_L(REG_METHODPTR, 0, REG_ITMP1, REG_METHODPTR);
                                M_ALD(REG_PV, REG_METHODPTR, s2);
                                break;
                        }
@@ -2864,9 +2888,8 @@ gen_method:
                        /* generate the actual call */
 
                        M_CALL(REG_PV);
-                       REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr);
                        emit_restore_pv(cd);
-       
+
                        /* post call finalization */
 
                        switch (iptr->opc) {
@@ -2876,6 +2899,14 @@ gen_method:
                                        break;
                        }
 
+                       /* generate method profiling code */
+
+                       PROFILE_CYCLE_START;
+
+                       /* store size of call code in replacement point */
+
+                       REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr);
+       
                        /* store return value */
 
                        d = md->returntype.type;
@@ -3365,8 +3396,8 @@ gen_method:
        /* generate stubs */
 
        emit_patcher_stubs(jd);
-#if 0
-       emit_replacement_stubs(jd);
+#if defined(ENABLE_REPLACEMENT)
+       REPLACEMENT_EMIT_STUBS(jd);
 #endif
 
        /* everything's ok */
@@ -3480,21 +3511,23 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        (void) dseg_addlinenumbertablesize(cd);
        (void) dseg_add_unique_s4(cd, 0);                      /* ExTableSize     */
 
+       /* generate stub code */
+
+       N_AHI(REG_SP, -(cd->stackframesize * SIZEOF_VOID_P));
+       N_AHI(REG_PV, N_PV_OFFSET);
+
        /* generate native method profiling code */
-#if 0
+
+#if defined(ENABLE_PROFILING)
        if (JITDATA_HAS_FLAG_INSTRUMENT(jd)) {
                /* count frequency */
-
-               M_MOV_IMM(code, REG_ITMP3);
-               M_IINC_MEMBASE(REG_ITMP3, OFFSET(codeinfo, frequency));
+               M_ALD_DSEG(REG_ITMP1, CodeinfoPointer);
+               ICONST(REG_ITMP2, 1);
+               N_AL(REG_ITMP2, OFFSET(codeinfo, frequency), RN, REG_ITMP1);
+               M_IST(REG_ITMP2, REG_ITMP1, OFFSET(codeinfo, frequency));
        }
 #endif
 
-       /* generate stub code */
-
-       N_AHI(REG_SP, -(cd->stackframesize * SIZEOF_VOID_P));
-       N_AHI(REG_PV, N_PV_OFFSET);
-
        /* save return address */
 
        N_ST(R14, (cd->stackframesize - 1) * SIZEOF_VOID_P, RN, REG_SP);
index 19375ba07e27b7f4d9d54fe5ddd1963258c277ba..a536bf5a039faa035c941aecdae228f813fe3032 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.h 8123 2007-06-20 23:50:55Z michi $
+   $Id: codegen.h 8240 2007-07-29 20:36:47Z pm $
 
 */
 
 #define M_DSUB(a, dest) N_SDBR(dest, a)
 #define M_DADD(a, dest) N_ADBR(dest, a)
 #define M_DDIV(a, dest) N_DDBR(dest, a)
-#define M_CVTFI(src, dst) N_CFEBR(dst, 4, src)
-#define M_CVTDI(src, dst) N_CFDBR(dst, 4, src)
+#define M_CVTFI(src, dst) N_CFEBR(dst, 5, src)
+#define M_CVTDI(src, dst) N_CFDBR(dst, 5, src)
 #define M_IADD(a, dest) N_AR(dest, a)
 #define M_AADD(a, dest) N_AR(dest, a)
 #define M_ISUB(a, dest) N_SR(dest, a)
index a6bb47f95441630f78d7a669a4f0d0b04c699211..6f92167f39be72b61fd8ab24d70b4fe887ca69f8 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: emit.c 8240 2007-07-29 20:36:47Z pm $
 
 */
 
@@ -368,15 +368,15 @@ __PORTED__ void emit_patcher_stubs(jitdata *jd)
    Generates the code for the replacement stubs.
 
 *******************************************************************************/
-
+#if defined(ENABLE_REPLACEMENT)
 void emit_replacement_stubs(jitdata *jd)
 {
-#if 0
        codegendata *cd;
        codeinfo    *code;
        rplpoint    *rplp;
        s4           disp;
-       s4           i;
+       s4           i, remain;
+       u1          *savedmcodeptr;
 
        /* get required compiler data */
 
@@ -385,34 +385,58 @@ void emit_replacement_stubs(jitdata *jd)
 
        rplp = code->rplpoints;
 
+       /* store beginning of replacement stubs */
+
+       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
+
        for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
+               /* do not generate stubs for non-trappable points */
+
+               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
+                       continue;
+
                /* check code segment size */
 
                MCODECHECK(512);
 
-               /* note start of stub code */
-
-               rplp->outcode = (u1 *) (ptrint) (cd->mcodeptr - cd->mcodebase);
+#if !defined(NDEBUG)
+               savedmcodeptr = cd->mcodeptr;
+#endif
 
-               /* make machine code for patching */
+               /* create stack frame - 8-byte aligned */
 
-               disp = (ptrint) (rplp->outcode - rplp->pc) - 5;
+               M_ASUB_IMM(REG_SP, 2 * 4);
 
-               rplp->mcode = 0xe9 | ((u8) disp << 8);
+               /* push address of `rplpoint` struct, will be used in asm_replacement_out */
 
-               /* push address of `rplpoint` struct */
-                       
-               M_MOV_IMM(rplp, REG_ITMP3);
-               M_PUSH(REG_ITMP3);
+               disp = dseg_add_address(cd, rplp);
+               M_ALD_DSEG(REG_ITMP3, disp);
+               M_AST(REG_ITMP3, REG_SP, 0 * 4);
 
                /* jump to replacement function */
 
-               M_MOV_IMM(asm_replacement_out, REG_ITMP3);
-               M_JMP(REG_ITMP3);
+               disp = dseg_add_functionptr(cd, asm_replacement_out);
+               M_ALD_DSEG(REG_ITMP3, disp);
+               M_JMP(RN, REG_ITMP3);
+
+               assert((cd->mcodeptr - savedmcodeptr) <= REPLACEMENT_STUB_SIZE);
+
+               /* pad with NOPs */
+
+               for (remain = REPLACEMENT_STUB_SIZE - (cd->mcodeptr - savedmcodeptr); remain > 0;) {
+                       if (remain >= 4) {
+                               M_NOP;
+                               remain -= 4;
+                       } else {
+                               M_NOP2;
+                               remain -= 2;
+                       }
+               }
+
+               assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE);
        }
-#endif
 }
-       
+#endif
 
 /* emit_verbosecall_enter ******************************************************
 
index 23dedb80bb3ff26ff81556a0abf3b5a1e3a78766..fd1f08c8daeb2eaed5bc4cb62dc6eb1f7ddb84c7 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: md.c 8178 2007-07-05 11:13:20Z michi $
+   $Id: md.c 8243 2007-07-31 08:57:54Z michi $
 
 */
 
@@ -168,6 +168,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        switch (xpc[0]) {
                case 0x58: /* L */
                case 0x50: /* ST */
+               case 0x55: /* CL (array size check on NULL array) */
                        base = (xpc[2] >> 4) & 0xF;
                        if (base == 0) {
                                is_null = 1;
@@ -192,7 +193,17 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        type = EXCEPTION_HARDWARE_NULLPOINTER;
        val = 0;
 
-       e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        _mc->gregs[REG_ITMP2_XPC] = (ptrint) xpc;
        _mc->gregs[REG_ITMP1_XPTR] = (ptrint) e;
@@ -230,7 +241,17 @@ void md_signal_handler_sigill(int sig, siginfo_t *siginfo, void *_p) {
                sp = (u1 *)_mc->gregs[REG_SP];
                val = (ptrint)_mc->gregs[reg];
 
-               e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+               /* create stackframeinfo */
+
+               stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+               /* generate appropriate exception */
+
+               e = exceptions_new_hardware_exception(xpc, type, val);
+
+               /* remove stackframeinfo */
+
+               stacktrace_remove_stackframeinfo(&sfi);
 
                _mc->gregs[REG_ITMP1_XPTR] = (ptrint)e;
                _mc->gregs[REG_ITMP2_XPC] = (ptrint)xpc;
@@ -305,7 +326,17 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
                        type = EXCEPTION_HARDWARE_ARITHMETIC;
                        val = 0;
 
-                       e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+                       /* create stackframeinfo */
+
+                       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+                       /* generate appropriate exception */
+
+                       e = exceptions_new_hardware_exception(xpc, type, val);
+
+                       /* remove stackframeinfo */
+
+                       stacktrace_remove_stackframeinfo(&sfi);
 
                        _mc->gregs[REG_ITMP1_XPTR] = (ptrint)e;
                        _mc->gregs[REG_ITMP2_XPC] = (ptrint)xpc;
@@ -501,6 +532,11 @@ u1 *md_get_method_patch_address(u1 *ra, stackframeinfo *sfi, u1 *mptr)
 
                        offset = *((u2 *)(ra + 2)) & 0xFFF;
 
+                       /* return NULL if no mptr was specified (used for replacement) */
+
+                       if (mptr == NULL)
+                               return NULL;
+
                        /* add offset to method pointer */
                        
                        pa = mptr + offset;
@@ -577,39 +613,13 @@ void md_dcacheflush(u1 *addr, s4 nbytes)
    Patch the given replacement point.
 
 *******************************************************************************/
-#if 0
-void md_patch_replacement_point(rplpoint *rp)
+#if defined(ENABLE_REPLACEMENT)
+void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp, u1 *savedmcode)
 {
-    u8 mcode;
-
-       /* XXX this is probably unsafe! */
-
-       /* save the current machine code */
-       mcode = *(u8*)rp->pc;
-
-       /* write spinning instruction */
-       *(u2*)(rp->pc) = 0xebfe;
-
-       /* write 5th byte */
-       rp->pc[4] = (rp->mcode >> 32);
-
-       /* write first word */
-    *(u4*)(rp->pc) = (u4) rp->mcode;
-
-       /* store saved mcode */
-       rp->mcode = mcode;
-       
-#if !defined(NDEBUG) && defined(ENABLE_DISASSEMBLER)
-       {
-               u1* u1ptr = rp->pc;
-               DISASSINSTR(u1ptr);
-               fflush(stdout);
-       }
-#endif
-                       
-    /* XXX if required asm_cacheflush(rp->pc,8); */
+       assert(0);
 }
 #endif
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
index dfbbdfcb33e307865d70fee821370d2138bc6b23..3222c3dafd50d74b964d448b0e54c26a073fa8df 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: patcher.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: patcher.c 8195 2007-07-11 11:27:55Z pm $
 
      GENERATED      PATCHER BRANCH           AFTER PATCH
 
@@ -406,10 +406,9 @@ bool patcher_invokeinterface(u1 *sp)
        /* get interfacetable index */
 
        idx = (s4) (OFFSET(vftbl_t, interfacetable[0]) -
-               sizeof(methodptr) * m->class->index) + 
-               N_DISP_MAX;
+               sizeof(methodptr) * m->class->index);
 
-       ASSERT_VALID_DISP(idx);
+       ASSERT_VALID_IMM(idx);
 
        /* get method offset */
 
@@ -419,8 +418,8 @@ bool patcher_invokeinterface(u1 *sp)
 
        /* patch them */
 
-       *((s4 *)(ra + 4)) |= idx;
-       *((s4 *)(ra + 4 + 4)) |= off;
+       *((s4 *)(ra + 4)) |= (u2)idx;
+       *((s4 *)(ra + 4 + 4 + 4)) |= off;
 
        return true;
 }
index 15836d7f3acacc5ecda04e51faf91b41fb8873bb..670246d0639d44a425e8e39366cde77257f7f29d 100644 (file)
@@ -3023,7 +3023,6 @@ gen_method:
        /* generate stubs */
 
        emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
        
        /* everything's ok */
 
index 376dcaa03184b6db297c73ec590148bf325f5307..c89716dc8af31048baf085f1ba4313da2e014ccd 100644 (file)
@@ -682,76 +682,6 @@ void emit_patcher_stubs(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       s4           disp;
-       s4           i;
-#if !defined(NDEBUG)
-       u1          *savedmcodeptr;
-#endif
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       rplp = code->rplpoints;
-
-       /* store beginning of replacement stubs */
-
-       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
-
-       for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
-               /* do not generate stubs for non-trappable points */
-
-               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-               M_LDX(0,0,0);
-
-/* this is just a stub rpl point for the GC */
-#if 0 
-
-               /* check code segment size */
-
-               MCODECHECK(100);
-
-#if !defined(NDEBUG)
-               savedmcodeptr = cd->mcodeptr;
-#endif
-
-               /* create stack frame - 16-byte aligned */
-
-               M_ASUB_IMM(REG_SP, 2 * 8, REG_SP);
-
-               /* push address of `rplpoint` struct */
-
-               disp = dseg_add_address(cd, rplp);
-               M_ALD(REG_ITMP3, REG_PV_CALLEE, disp);
-               M_AST(REG_ITMP3, REG_SP, JITSTACK + 0 * 8);
-
-               /* jump to replacement function */
-
-               disp = dseg_add_functionptr(cd, asm_replacement_out);
-               M_ALD(REG_ITMP3, REG_PV_CALLEE, disp);
-               M_JMP(REG_ZERO, REG_ITMP3, REG_ZERO);
-
-               assert((cd->mcodeptr - savedmcodeptr) == 4*REPLACEMENT_STUB_SIZE);
-#endif
-       }
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
index 5784b0c6aa04f776cf97d1e052635b5b61f8e322..051e15894aeb09ce88dcb3bf0c02eeef1bf7ee19 100644 (file)
@@ -141,8 +141,17 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *info , void *_p)
                type = (s4) addr;
        }
 
+       /* create stackframeinfo */
 
-       e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
index 6a995ac625367aab4d60e71e3275f0fcdda135f7..e46f3abaf4d912074198e0a69df3d4eec32069e8 100644 (file)
@@ -38,7 +38,6 @@
 #include <ucontext.h>
 
 /* work around name clash */
-#define REG_SP_OS REG_SP
 #undef REG_SP
 
 #include "vm/types.h"
@@ -68,16 +67,17 @@ ptrint md_get_reg_from_context(mcontext_t *_mc, u4 rindex)
        if (rindex <= 15) {
                
                /* register is in global or out range, available in context */
+               val = _mc->gregs[rindex + 3];
                
        }
        else {
                assert(rindex <= 31);
                
                /* register is local or in, need to fetch from regsave area on stack */
-       /*      
-               window = ctx->sigc_regs.u_regs[REG_SP] + BIAS;
+
+               window = (s8 *) (_mc->gregs[REG_O6] + BIAS);
                val = window[rindex - 16];
-               */
+
        }
        
        return val;
@@ -95,12 +95,12 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        stackframeinfo     sfi;
        ucontext_t  *_uc;
        mcontext_t  *_mc;
-       u4           instr;
        ptrint       addr;
        u1          *pv;
        u1          *sp;
        u1          *ra;
        u1          *xpc;
+       u4           mcode;
        s4           d;
        s4           s1;
        s4           disp;
@@ -112,10 +112,10 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        _mc = &_uc->uc_mcontext;
 
        pv  = (u1 *) md_get_reg_from_context(_mc, REG_PV_CALLEE);
-#if 0
-       sp  = (u1 *) md_get_reg_from_context(ctx, REG_SP);
-       ra  = (u1 *) md_get_reg_from_context(ctx, REG_RA_CALLEE);  /* this is correct for leafs */
-       xpc = (u1 *) ctx->sigc_regs.tpc;
+       sp  = (u1 *) _mc->gregs[REG_O6];
+       ra  = (u1 *) md_get_reg_from_context(_mc, REG_RA_CALLEE);
+       xpc = (u1 *) _mc->gregs[REG_PC];
+
 
        /* get exception-throwing instruction */        
 
@@ -127,7 +127,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
 
        /* flush register windows? */
        
-       val   = md_get_reg_from_context(ctx, d);
+       val   = md_get_reg_from_context(_mc, d);
 
        /* check for special-load */
 
@@ -140,12 +140,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                /* This is a normal NPE: addr must be NULL and the NPE-type
                   define is 0. */
 
-               addr  = md_get_reg_from_context(ctx, s1);
+               addr  = md_get_reg_from_context(_mc, s1);
                type = (s4) addr;
        }
 
-#endif
-       e = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
+       /* generate appropriate exception */
+
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
@@ -153,32 +162,6 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        _mc->gregs[REG_G3]  = (ptrint) xpc; /* REG_ITMP3_XPC */
        _mc->gregs[REG_PC]  = (ptrint) asm_handle_exception;
        _mc->gregs[REG_nPC] = (ptrint) asm_handle_exception + 4;        
-#if 0
-       if (addr == 0) {
-
-               pv  = (u1 *) _mc->gregs[REG_G3];
-               sp  = (u1 *) (_uc->uc_stack.ss_sp);
-               /*ra  = (u1 *) _mc->mc_i7;*/       /* this is correct for leafs */
-               ra  = 0;
-               xpc = (u1 *) _mc->gregs[REG_PC];
-
-               _mc->gregs[REG_G4] =
-                       (ptrint) stacktrace_hardware_nullpointerexception(pv, sp, ra, xpc);
-
-               _mc->gregs[REG_G5] = (ptrint) xpc;
-               _mc->gregs[REG_PC] = (ptrint) asm_handle_exception;
-
-       } else {
-               addr += (long) ((instr << 16) >> 16);
-
-               /*
-               throw_cacao_exception_exit(string_java_lang_InternalError,
-                                                                  "Segmentation fault: 0x%016lx at 0x%016lx\n",
-                                                                  addr, _mc->mc_gregs[MC_PC]);
-                                                                  */
-               assert(0);
-       }
-#endif
 }
 
 
index bdf498d14c943d0e6aa9dc7628197dd11d358bd3..8f7b5a9e413b26282d0fe305ed90784779439f0e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 8123 2007-06-20 23:50:55Z michi $
+   $Id: asmpart.S 8197 2007-07-11 19:17:04Z twisti $
 
 */
 
@@ -149,7 +149,8 @@ asm_vm_call_method_double:
        je      L_asm_vm_call_method_stack_copy_done
 
        mov     itmp1,itmp2
-       and     $0xfffffffffffffffe,itmp2   /* keep stack 16-byte aligned         */
+       add     $1,itmp2                    /* keep stack 16-byte aligned         */
+       and     $0xfffffffffffffffe,itmp2
        shl     $3,itmp2                    /* calculate stack size               */
        sub     itmp2,sp                    /* create stack frame                 */
        mov     sp,itmp2                    /* temporary stack pointer            */
index 2f169d62c5ec340e2704eea5c92d6ba23593f002..086b41eb4e50d0e5969f59fb32fce19b2da838d3 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: codegen.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -2894,7 +2894,6 @@ gen_method:
        /* generate stubs */
 
        emit_patcher_stubs(jd);
-       REPLACEMENT_EMIT_STUBS(jd);
 
        /* everything's ok */
 
index 356590e3cbca8f422dbb36d30a016ef6aa943dd4..91d5506813318f6ae9e014a65a77087c6fd40084 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: emit.c 8211 2007-07-18 19:52:23Z michi $
 
 */
 
@@ -507,67 +507,6 @@ void emit_patcher_stubs(jitdata *jd)
 }
 
 
-/* emit_replacement_stubs ******************************************************
-
-   Generates the code for the replacement stubs.
-
-*******************************************************************************/
-
-#if defined(ENABLE_REPLACEMENT)
-void emit_replacement_stubs(jitdata *jd)
-{
-       codegendata *cd;
-       codeinfo    *code;
-       rplpoint    *rplp;
-       s4           i;
-#if !defined(NDEBUG)
-       u1          *savedmcodeptr;
-#endif
-
-       /* get required compiler data */
-
-       cd   = jd->cd;
-       code = jd->code;
-
-       rplp = code->rplpoints;
-
-       /* store beginning of replacement stubs */
-
-       code->replacementstubs = (u1*) (cd->mcodeptr - cd->mcodebase);
-
-       for (i = 0; i < code->rplpointcount; ++i, ++rplp) {
-               /* do not generate stubs for non-trappable points */
-
-               if (rplp->flags & RPLPOINT_FLAG_NOTRAP)
-                       continue;
-
-               /* check code segment size */
-
-               MCODECHECK(512);
-
-               /* note start of stub code */
-
-#if !defined(NDEBUG)
-               savedmcodeptr = cd->mcodeptr;
-#endif
-
-               /* push address of `rplpoint` struct */
-                       
-               M_MOV_IMM(rplp, REG_ITMP3);
-               M_PUSH(REG_ITMP3);
-
-               /* jump to replacement function */
-
-               M_MOV_IMM(asm_replacement_out, REG_ITMP3);
-               M_PUSH(REG_ITMP3);
-               M_RET;
-
-               assert((cd->mcodeptr - savedmcodeptr) == REPLACEMENT_STUB_SIZE);
-       }
-}
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
 /* emit_verbosecall_enter ******************************************************
 
    Generates the code for the call trace.
index 6983aa2fd182489d17b6406c93f613480dbd0ea2..e0f007e008e082dee74aa032f9e137168542a5e4 100644 (file)
@@ -71,7 +71,7 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
        s4                 disp;
        s4                 type;
        ptrint             val;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
        _mc = &_uc->uc_mcontext;
@@ -159,13 +159,21 @@ void md_signal_handler_sigsegv(int sig, siginfo_t *siginfo, void *_p)
                val  = 0;
        }
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, NULL, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(NULL, sp, ra, xpc, type, vali, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _mc->gregs[REG_RAX] = (ptrint) o;
+       _mc->gregs[REG_RAX] = (ptrint) e;
        _mc->gregs[REG_R10] = (ptrint) xpc;                      /* REG_ITMP2_XPC */
        _mc->gregs[REG_RIP] = (ptrint) asm_handle_exception;
 }
@@ -189,7 +197,7 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
        u1                *xpc;
        s4                 type;
        ptrint             val;
-       java_objectheader *o;
+       java_objectheader *e;
 
        _uc = (ucontext_t *) _p;
        _mc = &_uc->uc_mcontext;
@@ -207,13 +215,21 @@ void md_signal_handler_sigfpe(int sig, siginfo_t *siginfo, void *_p)
        type = EXCEPTION_HARDWARE_ARITHMETIC;
        val  = 0;
 
+       /* create stackframeinfo */
+
+       stacktrace_create_extern_stackframeinfo(&sfi, pv, sp, ra, xpc);
+
        /* generate appropriate exception */
 
-       o = exceptions_new_hardware_exception(pv, sp, ra, xpc, type, val, &sfi);
+       e = exceptions_new_hardware_exception(xpc, type, val);
+
+       /* remove stackframeinfo */
+
+       stacktrace_remove_stackframeinfo(&sfi);
 
        /* set registers */
 
-       _mc->gregs[REG_RAX] = (ptrint) o;
+       _mc->gregs[REG_RAX] = (ptrint) e;
        _mc->gregs[REG_R10] = (ptrint) xpc;                      /* REG_ITMP2_XPC */
        _mc->gregs[REG_RIP] = (ptrint) asm_handle_exception;
 }
index dfcff33c4ab4090221bfda1635379a9ff8900f3d..7147677e4debc5ef37437208082ae3ef12ab6d4f 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jit_interface.h 7692 2007-04-12 14:47:24Z twisti $
+   $Id: jit_interface.h 8210 2007-07-18 12:51:00Z twisti $
 
 */
 
@@ -53,6 +53,7 @@ void removenativestub(u1 *stub);
 void jit_invalidate_code(methodinfo *m);
 
 void md_param_alloc(methoddesc *md);
+void md_param_alloc_native(methoddesc *md);
 
 /* stub for throwing AbstractMethodError's */
 #if defined(ENABLE_JIT)
index 19dc3f71c1f23b924656313e463944f27cb47d18..ab49257b10611d57de47ee9f9f3dd9c3b50c6a20 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: properties.c 8132 2007-06-22 11:15:47Z twisti $
+   $Id: properties.c 8236 2007-07-27 10:18:17Z twisti $
 
 */
 
@@ -133,6 +133,20 @@ bool properties_init(void)
        properties_add("java.vm.vendor", "CACAO Team");
        properties_add("java.vm.name", "CACAO");
 
+# if defined(ENABLE_INTRP)
+       if (opt_intrp) {
+               /* XXX We don't support java.lang.Compiler */
+/*             properties_add("java.compiler", "cacao.intrp"); */
+               properties_add("java.vm.info", "interpreted mode");
+       }
+       else
+# endif
+       {
+               /* XXX We don't support java.lang.Compiler */
+/*             properties_add("java.compiler", "cacao.jit"); */
+               properties_add("java.vm.info", "JIT mode");
+       }
+
 # if defined(WITH_CLASSPATH_GNU)
 
        /* get properties from system */
@@ -183,17 +197,11 @@ bool properties_init(void)
 
 #  if defined(ENABLE_INTRP)
        if (opt_intrp) {
-               /* XXX We don't support java.lang.Compiler */
-/*             properties_add("java.compiler", "cacao.intrp"); */
-               properties_add("java.vm.info", "interpreted mode");
                properties_add("gnu.java.compiler.name", "cacao.intrp");
        }
        else
 #  endif
        {
-               /* XXX We don't support java.lang.Compiler */
-/*             properties_add("java.compiler", "cacao.jit"); */
-               properties_add("java.vm.info", "JIT mode");
                properties_add("gnu.java.compiler.name", "cacao.jit");
        }
 
@@ -321,27 +329,6 @@ bool properties_init(void)
 }
 
 
-/* properties_postinit *********************************************************
-
-   Re-set some properties that may have changed during command-line
-   parsing.
-
-*******************************************************************************/
-
-bool properties_postinit(void)
-{
-#if defined(ENABLE_JAVASE)
-       properties_add("java.class.path", _Jv_classpath);
-       properties_add("java.boot.class.path", _Jv_bootclasspath);
-       properties_add("sun.boot.class.path", _Jv_bootclasspath);
-#endif
-
-       /* everything's ok */
-
-       return true;
-}
-
-
 /* properties_add **************************************************************
 
    Adds a property entry to the internal property list.  If there's
index 0c2defa1916d26e2abfe0e9893479357a7168319..a983c081d9e7228f3f524ae3384fc42a06e6ca5e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: properties.h 7246 2007-01-29 18:49:05Z twisti $
+   $Id: properties.h 8236 2007-07-27 10:18:17Z twisti $
 
 */
 
@@ -39,7 +39,6 @@
 /* function prototypes ********************************************************/
 
 bool  properties_init(void);
-bool  properties_postinit(void);
 
 void  properties_add(char *key, char *value);
 char *properties_get(char *key);
index 6cea9bafb6cea52fd2d52945b67ef678e4ea7cee..899a9176099b4901343523719b15e9ffd44e59ed 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: string.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: string.c 8230 2007-07-25 08:23:10Z twisti $
 
 */
 
@@ -566,11 +566,6 @@ java_objectheader *literalstring_u2(java_chararray *a, u4 length, u4 offset,
        assert(class_java_lang_String);
        assert(class_java_lang_String->state & CLASS_LOADED);
 
-       /* if we use eager loading, we have to check loaded String class */
-
-       if (opt_eager)
-               list_add_first(&unlinkedclasses, class_java_lang_String);
-
        /* create new javastring */
 
        js = NEW(java_lang_String);
index 9312994b5b80377b371f571f1a8edcfe567771c2..3033b0b9a33ce828b26d445ea51312ec16b5aa94 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: vm.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: vm.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -231,7 +231,6 @@ enum {
        OPT_VERBOSETC,
 #endif
 #endif /* defined(ENABLE_VERIFIER) */
-       OPT_EAGER,
 
        /* optimization options */
 
@@ -257,8 +256,6 @@ enum {
        OPT_INLINE_DEBUG_END,
        OPT_INLINE_DEBUG_MIN,
        OPT_INLINE_DEBUG_MAX,
-       OPT_INLINE_REPLACE_VERBOSE,
-       OPT_INLINE_REPLACE_VERBOSE2,
 #endif /* defined(ENABLE_INLINING_DEBUG) */
 #endif /* defined(ENABLE_INLINING) */
 
@@ -316,6 +313,7 @@ opt_struct opts[] = {
        { "?",                 false, OPT_HELP },
        { "X",                 false, OPT_X },
        { "XX:",               true,  OPT_XX },
+       { "XX",                false, OPT_XX },
 
        { "ea:",               true,  OPT_EA },
        { "da:",               true,  OPT_DA },
@@ -347,7 +345,6 @@ opt_struct opts[] = {
        { "log",               true,  OPT_LOG },
        { "c",                 true,  OPT_CHECK },
        { "l",                 false, OPT_LOAD },
-       { "eager",             false, OPT_EAGER },
 
 #if !defined(NDEBUG)
        { "all",               false, OPT_ALL },
@@ -415,8 +412,6 @@ opt_struct opts[] = {
        { "ii",                true,  OPT_INLINE_DEBUG_MIN },
        { "im",                true,  OPT_INLINE_DEBUG_MAX },
        { "ie",                true,  OPT_INLINE_DEBUG_END },
-       { "ir",                false, OPT_INLINE_REPLACE_VERBOSE },
-       { "iR",                false, OPT_INLINE_REPLACE_VERBOSE2 },
 #endif /* defined(ENABLE_INLINING_DEBUG) */
 #if !defined(NDEBUG)
        { "il",                false, OPT_INLINE_LOG },
@@ -473,7 +468,7 @@ void usage(void)
        puts("    -showversion             print product version and continue");
        puts("    -help, -?                print this help message");
        puts("    -X                       print help on non-standard Java options");
-       puts("    -XX                      print help on CACAO options");
+       puts("    -XX                      print help on debugging options");
     puts("    -ea[:<packagename>...|:<classname>]");
     puts("    -enableassertions[:<packagename>...|:<classname>]");
        puts("                             enable assertions with specified granularity");
@@ -540,7 +535,7 @@ static void XXusage(void)
 {
        puts("    -v                       write state-information");
 #if !defined(NDEBUG)
-       puts("    -verbose[:call|jit|threads]");
+       puts("    -verbose[:jit|threads]");
        puts("                             enable specific verbose output");
        puts("    -debug-color             colored output for ANSI terms");
 #endif
@@ -564,7 +559,6 @@ static void XXusage(void)
        puts("    -oloop                   optimize array accesses in loops");
 #endif
        puts("    -l                       don't start the class after loading");
-       puts("    -eager                   perform eager class loading and linking");
 #if !defined(NDEBUG)
        puts("    -all                     compile all methods, no execution");
        puts("    -m                       compile only a specific method");
@@ -594,8 +588,6 @@ static void XXusage(void)
        puts("    -ii <size>               set minimum size for inlined result");
        puts("    -im <size>               set maximum size for inlined result");
        puts("    -ie <number>             stop inlining after the given number of roots");
-       puts("    -ir                      log on-stack replacement");
-       puts("    -iR                      log on-stack replacement, more verbose");
 #endif /* defined(ENABLE_INLINING_DEBUG) */
 #endif /* defined(ENABLE_INLINING) */
 
@@ -643,8 +635,34 @@ static void version(bool opt_exit)
        puts("This program is distributed in the hope that it will be useful, but");
        puts("WITHOUT ANY WARRANTY; without even the implied warranty of");
        puts("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU");
-       puts("General Public License for more details.\n");
+       puts("General Public License for more details.");
 
+       /* exit normally, if requested */
+
+       if (opt_exit)
+               exit(0);
+}
+
+
+/* fullversion *****************************************************************
+
+   Prints a Sun compatible version information (required e.g. by
+   jpackage, www.jpackage.org).
+
+*******************************************************************************/
+
+static void fullversion(void)
+{
+       puts("java full version \"cacao-"JAVA_VERSION"\"");
+
+       /* exit normally */
+
+       exit(0);
+}
+
+
+void vm_printconfig(void)
+{
        puts("Configure/Build options:\n");
        puts("  ./configure: "VERSION_CONFIGURE_ARGS"");
 #if defined(__VERSION__)
@@ -673,28 +691,6 @@ static void version(bool opt_exit)
        printf("  java.boot.class.path           : %s\n", _Jv_bootclasspath);
        printf("  gnu.classpath.boot.library.path: %s\n", classpath_libdir);
        printf("  java.class.path                : %s\n", _Jv_classpath);
-
-       /* exit normally, if requested */
-
-       if (opt_exit)
-               exit(0);
-}
-
-
-/* fullversion *****************************************************************
-
-   Prints a Sun compatible version information (required e.g. by
-   jpackage, www.jpackage.org).
-
-*******************************************************************************/
-
-static void fullversion(void)
-{
-       puts("java full version \"cacao-"JAVA_VERSION"\"");
-
-       /* exit normally */
-
-       exit(0);
 }
 
 
@@ -913,20 +909,54 @@ bool vm_create(JavaVMInitArgs *vm_args)
                strcat(_Jv_bootclasspath, cacao_prefix);
                strcat(_Jv_bootclasspath, "/share/classpath/glibj.zip");
 #else
-               len =
 # if defined(WITH_CLASSPATH_GNU)
+               len =
                        strlen(CACAO_VM_ZIP) +
                        strlen(":") +
-# endif
                        strlen(CLASSPATH_CLASSES) +
                        strlen("0");
+# elif defined(WITH_CLASSPATH_SUN)
+               /* This is the bootclasspath taken from HotSpot (see
+                  hotspot/src/share/vm/runtime/os.cpp
+                  (os::set_boot_path)). */
+
+               len =
+                       strlen(CLASSPATH_PREFIX"/lib/resources.jar:"
+                                  CLASSPATH_PREFIX"/lib/rt.jar:"
+                                  CLASSPATH_PREFIX"/lib/sunrsasign.jar:"
+                                  CLASSPATH_PREFIX"/lib/jsse.jar:"
+                                  CLASSPATH_PREFIX"/lib/jce.jar:"
+                                  CLASSPATH_PREFIX"/lib/charsets.jar:"
+                                  CLASSPATH_PREFIX"/classes") +
+                       strlen("0");
+# elif defined(WITH_CLASSPATH_CLDC1_1)
+               len =
+                       strlen(CLASSPATH_CLASSES) +
+                       strlen("0");
+# else
+#  error unknown classpath configuration
+# endif
 
                _Jv_bootclasspath = MNEW(char, len);
+
 # if defined(WITH_CLASSPATH_GNU)
-               strcat(_Jv_bootclasspath, CACAO_VM_ZIP);
+               strcpy(_Jv_bootclasspath, CACAO_VM_ZIP);
                strcat(_Jv_bootclasspath, ":");
-# endif
                strcat(_Jv_bootclasspath, CLASSPATH_CLASSES);
+# elif defined(WITH_CLASSPATH_SUN)
+               strcpy(_Jv_bootclasspath,
+                          CLASSPATH_PREFIX"/lib/resources.jar:"
+                          CLASSPATH_PREFIX"/lib/rt.jar:"
+                          CLASSPATH_PREFIX"/lib/sunrsasign.jar:"
+                          CLASSPATH_PREFIX"/lib/jsse.jar:"
+                          CLASSPATH_PREFIX"/lib/jce.jar:"
+                          CLASSPATH_PREFIX"/lib/charsets.jar:"
+                          CLASSPATH_PREFIX"/classes");
+# elif defined(WITH_CLASSPATH_CLDC1_1)
+               strcat(_Jv_bootclasspath, CLASSPATH_CLASSES);
+# else
+#  error unknown classpath configuration
+# endif
 #endif
        }
 
@@ -943,7 +973,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                strcpy(_Jv_classpath, ".");
        }
 
-       /* get and set java.library.path */
+       /* Get and set java.library.path. */
 
        _Jv_java_library_path = getenv("LD_LIBRARY_PATH");
 
@@ -967,10 +997,18 @@ bool vm_create(JavaVMInitArgs *vm_args)
        jvmti = false;
 #endif
 
-       /* initialize and fill properties before command-line handling */
+       /* Initialize and fill properties before command-line handling. */
 
        if (!properties_init())
-               vm_abort("properties_init failed");
+               vm_abort("vm_create: properties_init failed");
+
+       /* Set the classpath properties. */
+
+#if defined(ENABLE_JAVASE)
+       properties_add("java.boot.class.path", _Jv_bootclasspath);
+       properties_add("sun.boot.class.path", _Jv_bootclasspath);
+       properties_add("java.class.path", _Jv_classpath);
+#endif
 
        /* iterate over all passed options */
 
@@ -1007,6 +1045,10 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        _Jv_classpath = MNEW(char, strlen(opt_arg) + strlen("0"));
                        strcpy(_Jv_classpath, opt_arg);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.class.path", _Jv_classpath);
+#endif
                        break;
 
                case OPT_D:
@@ -1033,6 +1075,11 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        _Jv_bootclasspath = MNEW(char, strlen(opt_arg) + strlen("0"));
                        strcpy(_Jv_bootclasspath, opt_arg);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.boot.class.path", _Jv_bootclasspath);
+                       properties_add("sun.boot.class.path", _Jv_bootclasspath);
+#endif
                        break;
 
                case OPT_BOOTCLASSPATH_A:
@@ -1048,6 +1095,11 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        strcat(_Jv_bootclasspath, ":");
                        strcat(_Jv_bootclasspath, opt_arg);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.boot.class.path", _Jv_bootclasspath);
+                       properties_add("sun.boot.class.path", _Jv_bootclasspath);
+#endif
                        break;
 
                case OPT_BOOTCLASSPATH_P:
@@ -1064,6 +1116,11 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        strcat(_Jv_bootclasspath, cp);
 
                        MFREE(cp, char, len);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.boot.class.path", _Jv_bootclasspath);
+                       properties_add("sun.boot.class.path", _Jv_bootclasspath);
+#endif
                        break;
 
                case OPT_BOOTCLASSPATH_C:
@@ -1081,6 +1138,11 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        strcpy(_Jv_bootclasspath, CACAO_VM_ZIP);
                        strcat(_Jv_bootclasspath, ":");
                        strcat(_Jv_bootclasspath, opt_arg);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.boot.class.path", _Jv_bootclasspath);
+                       properties_add("sun.boot.class.path", _Jv_bootclasspath);
+#endif
                        break;
 
 #if defined(ENABLE_JVMTI)
@@ -1160,9 +1222,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
                                opt_verbosejni = true;
                        }
 #if !defined(NDEBUG)
-                       else if (strcmp("call", opt_arg) == 0) {
-                               opt_verbosecall = true;
-                       }
                        else if (strcmp("jit", opt_arg) == 0) {
                                opt_verbose = true;
                                loadverbose = true;
@@ -1248,10 +1307,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        makeinitializations = false;
                        break;
 
-               case OPT_EAGER:
-                       opt_eager = true;
-                       break;
-
 #if !defined(NDEBUG)
                case OPT_ALL:
                        compileall = true;
@@ -1339,12 +1394,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
                case OPT_INLINE_DEBUG_MAX:
                        opt_inline_debug_max_size = atoi(opt_arg);
                        break;
-               case OPT_INLINE_REPLACE_VERBOSE:
-                       opt_replace_verbose = 1;
-                       break;
-               case OPT_INLINE_REPLACE_VERBOSE2:
-                       opt_replace_verbose = 2;
-                       break;
 #endif /* defined(ENABLE_INLINING_DEBUG) */
 #if !defined(NDEBUG)
                case OPT_INLINE_LOG:
@@ -1504,6 +1553,10 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        _Jv_classpath = MNEW(char, strlen(mainstring) + strlen("0"));
 
                        strcpy(_Jv_classpath, mainstring);
+
+#if defined(ENABLE_JAVASE)
+                       properties_add("java.class.path", _Jv_classpath);
+#endif
                }
                else {
                        /* replace .'s with /'s in classname */
@@ -1584,16 +1637,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
        suck_add(_Jv_bootclasspath);
 
-       /* Now re-set some of the properties that may have changed. This
-          must be done after _all_ environment variables have been
-          processes (e.g. -jar handling).
-
-          AFTER: suck_add_from_property, since it may change the
-          _Jv_bootclasspath pointer. */
-
-       if (!properties_postinit())
-               vm_abort("vm_create: properties_postinit failed");
-
        /* initialize the classcache hashtable stuff: lock, hashtable
           (must be done _after_ threads_preinit) */
 
@@ -2519,7 +2562,7 @@ static void vm_array_store_adr(uint64_t *array, paramdesc *pd, void *value)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 static void vm_vmargs_from_valist(methodinfo *m, java_objectheader *o,
                                                                  vm_arg *vmargs, va_list ap)
 {
@@ -2655,7 +2698,7 @@ uint64_t *vm_array_from_valist(methodinfo *m, java_objectheader *o, va_list ap)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
                                                                  vm_arg *vmargs, const jvalue *args)
 {
@@ -2785,7 +2828,7 @@ static uint64_t *vm_array_from_jvalue(methodinfo *m, java_objectheader *o,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 bool vm_vmargs_from_objectarray(methodinfo *m, java_objectheader *o,
                                                                vm_arg *vmargs, java_objectarray *params)
 {
@@ -3188,7 +3231,7 @@ java_objectheader *vm_call_method(methodinfo *m, java_objectheader *o, ...)
 java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
                                                                                 va_list ap)
 {
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
        s4                 vmargscount;
        vm_arg            *vmargs;
        java_objectheader *ro;
@@ -3255,7 +3298,7 @@ java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
 java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
                                                                                 const jvalue *args)
 {
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
        s4                 vmargscount;
        vm_arg            *vmargs;
        java_objectheader *ro;
@@ -3319,7 +3362,7 @@ java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
                                                                                vm_arg *vmargs)
 {
@@ -3387,7 +3430,7 @@ java_objectheader *vm_call_array(methodinfo *m, uint64_t *array)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
 {
        s4 i;
@@ -3474,7 +3517,7 @@ s4 vm_call_method_int(methodinfo *m, java_objectheader *o, ...)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 s4 vm_call_method_int_valist(methodinfo *m, java_objectheader *o, va_list ap)
 {
        s4      vmargscount;
@@ -3543,7 +3586,7 @@ int32_t vm_call_method_int_valist(methodinfo *m, java_objectheader *o, va_list a
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 s4 vm_call_method_int_jvalue(methodinfo *m, java_objectheader *o,
                                                         const jvalue *args)
 {
@@ -3614,7 +3657,7 @@ int32_t vm_call_method_int_jvalue(methodinfo *m, java_objectheader *o,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 s8 vm_call_method_long_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
 {
        s8 l;
@@ -3701,7 +3744,7 @@ s8 vm_call_method_long(methodinfo *m, java_objectheader *o, ...)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 s8 vm_call_method_long_valist(methodinfo *m, java_objectheader *o, va_list ap)
 {
        s4      vmargscount;
@@ -3770,7 +3813,7 @@ int64_t vm_call_method_long_valist(methodinfo *m, java_objectheader *o, va_list
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 s8 vm_call_method_long_jvalue(methodinfo *m, java_objectheader *o,
                                                          const jvalue *args)
 {
@@ -3841,7 +3884,7 @@ int64_t vm_call_method_long_jvalue(methodinfo *m, java_objectheader *o,
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 float vm_call_method_float_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
 {
        float f;
@@ -3929,7 +3972,7 @@ float vm_call_method_float(methodinfo *m, java_objectheader *o, ...)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 float vm_call_method_float_valist(methodinfo *m, java_objectheader *o,
                                                                  va_list ap)
 {
@@ -3998,7 +4041,7 @@ float vm_call_method_float_valist(methodinfo *m, java_objectheader *o, va_list a
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 float vm_call_method_float_jvalue(methodinfo *m, java_objectheader *o,
                                                                  const jvalue *args)
 {
@@ -4068,7 +4111,7 @@ float vm_call_method_float_jvalue(methodinfo *m, java_objectheader *o, const jva
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 double vm_call_method_double_vmarg(methodinfo *m, s4 vmargscount,
                                                                   vm_arg *vmargs)
 {
@@ -4158,7 +4201,7 @@ double vm_call_method_double(methodinfo *m, java_objectheader *o, ...)
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 double vm_call_method_double_valist(methodinfo *m, java_objectheader *o,
                                                                        va_list ap)
 {
@@ -4228,7 +4271,7 @@ double vm_call_method_double_valist(methodinfo *m, java_objectheader *o, va_list
 
 *******************************************************************************/
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 double vm_call_method_double_jvalue(methodinfo *m, java_objectheader *o,
                                                                        const jvalue *args)
 {
index fde0458bab9d57b9960c9870769d021fe8012a50..9aefe59f553e3b489f622f406e897e2953e6df48 100644 (file)
@@ -91,6 +91,7 @@ struct vm_arg {
 /* function prototypes ********************************************************/
 
 void usage(void);
+void vm_printconfig(void);
 
 bool vm_createjvm(JavaVM **p_vm, void **p_env, void *vm_args);
 bool vm_create(JavaVMInitArgs *vm_args);
@@ -104,7 +105,7 @@ void vm_exit_handler(void);
 void vm_abort(const char *text, ...);
 
 /* Java method calling functions */
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 bool vm_vmargs_from_objectarray(methodinfo *m, java_objectheader *o,
                                                                vm_arg *vmargs, java_objectarray *params);
 #else
@@ -118,7 +119,7 @@ java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
 java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
                                                                                 const jvalue *args);
 
-#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__)
+#if !defined(__MIPS__) && !defined(__X86_64__) && !defined(__POWERPC64__) && !defined(__SPARC_64__) && !defined(__M68K__) && !defined(__ARM__) && !defined(__ALPHA__) && !defined(__I386__)
 java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
                                                                                vm_arg *vmargs);
 s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs);
index aef6f648e4eb3c2e8e3f68ff53a6848d6413a840..99c3713cf1cee4eeff849a8667e72436b50ef8b0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: class.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -46,6 +46,7 @@
 
 #include "vm/exceptions.h"
 #include "vm/global.h"
+#include "vm/resolve.h"
 
 #include "vm/jit/asmpart.h"
 
 
 /* global variables ***********************************************************/
 
-list_t unlinkedclasses;                 /* this is only used for eager class  */
-                                        /* loading                            */
-
-
 /* frequently used classes ****************************************************/
 
 /* important system classes */
@@ -85,6 +82,9 @@ classinfo *class_java_lang_VMSystem;
 classinfo *class_java_lang_VMThread;
 classinfo *class_java_io_Serializable;
 
+#if defined(WITH_CLASSPATH_SUN)
+classinfo *class_sun_reflect_MagicAccessorImpl;
+#endif
 
 /* system exception classes required in cacao */
 
@@ -288,7 +288,7 @@ void class_postset_header_vftbl(void)
 
 *******************************************************************************/
 
-classinfo *class_define(utf *name, classloader *cl, s4 length, u1 *data)
+classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data)
 {
        classinfo   *c;
        classinfo   *r;
@@ -1459,6 +1459,37 @@ fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
 }
 
 
+/* class_resolve_superclass ****************************************************
+
+   Resolves the super class reference of the given class if necessary.
+
+*******************************************************************************/
+
+static classinfo *class_resolve_superclass(classinfo *c)
+{
+       classinfo *super;
+
+       if (c->super.any == NULL)
+               return NULL;
+
+       /* Do we have a super class reference or is it already
+          resolved? */
+
+       if (IS_CLASSREF(c->super)) {
+               super = resolve_classref_or_classinfo_eager(c->super, true);
+
+               if (super == NULL)
+                       return NULL;
+
+               /* Store the resolved super class in the class structure. */
+
+               c->super.cls = super;
+       }
+
+       return c->super.cls;
+}
+
+
 /* class_issubclass ************************************************************
 
    Checks if sub is a descendant of super.
@@ -1468,13 +1499,13 @@ fieldinfo *class_resolvefield(classinfo *c, utf *name, utf *desc,
 bool class_issubclass(classinfo *sub, classinfo *super)
 {
        for (;;) {
-               if (!sub)
+               if (sub == NULL)
                        return false;
 
                if (sub == super)
                        return true;
 
-               sub = sub->super.cls;
+               sub = class_resolve_superclass(sub);
        }
 }
 
@@ -1502,8 +1533,7 @@ bool class_isanysubclass(classinfo *sub, classinfo *super)
 
        /* Primitive classes are only subclasses of themselves. */
 
-       if ((sub->flags & ACC_CLASS_PRIMITIVE) ||
-               (super->flags & ACC_CLASS_PRIMITIVE))
+       if (class_is_primitive(sub) || class_is_primitive(super))
                return false;
 
        /* Check for interfaces. */
@@ -1529,6 +1559,21 @@ bool class_isanysubclass(classinfo *sub, classinfo *super)
 }
 
 
+/* class_is_primitive **********************************************************
+
+   Checks if the given class is a primitive class.
+
+*******************************************************************************/
+
+bool class_is_primitive(classinfo *c)
+{
+       if (c->flags & ACC_CLASS_PRIMITIVE)
+               return true;
+
+       return false;
+}
+
+
 /* class_is_array **************************************************************
 
    Checks if the given class is an array class.
@@ -1560,6 +1605,115 @@ bool class_is_interface(classinfo *c)
 }
 
 
+/* class_get_superclass ********************************************************
+
+   Return the super class of the given class.  If the super-field is a
+   class-reference, resolve it and store it in the classinfo.
+
+*******************************************************************************/
+
+classinfo *class_get_superclass(classinfo *c)
+{
+       classinfo *super;
+
+       /* For java.lang.Object, primitive and Void classes we return
+          NULL. */
+
+       if (c->super.any == NULL)
+               return NULL;
+
+       /* For interfaces we also return NULL. */
+
+       if (c->flags & ACC_INTERFACE)
+               return NULL;
+
+       /* We may have to resolve the super class reference. */
+
+       super = class_resolve_superclass(c);
+
+       return super;
+}
+
+
+/* class_get_declaringclass ****************************************************
+
+   If the class or interface given is a member of another class,
+   return the declaring class.  For array and primitive classes return
+   NULL.
+
+*******************************************************************************/
+
+classinfo *class_get_declaringclass(classinfo *c)
+{
+       classref_or_classinfo  innercr;
+       utf                   *innername;
+       classref_or_classinfo  outercr;
+       classinfo             *outer;
+       int16_t                i;
+
+       /* return NULL for arrayclasses and primitive classes */
+
+       if (class_is_primitive(c) || (c->name->text[0] == '['))
+               return NULL;
+
+       /* no innerclasses exist */
+
+       if (c->innerclasscount == 0)
+               return NULL;
+
+       for (i = 0; i < c->innerclasscount; i++) {
+               /* Check if inner_class is a classref or a real class and get
+                  the class name from the structure. */
+
+               innercr = c->innerclass[i].inner_class;
+
+               innername = IS_CLASSREF(innercr) ?
+                       innercr.ref->name : innercr.cls->name;
+
+               /* Is the current innerclass this class? */
+
+               if (innername == c->name) {
+                       /* Maybe the outer class is not loaded yet. */
+
+                       outercr = c->innerclass[i].outer_class;
+
+                       outer = resolve_classref_or_classinfo_eager(outercr, false);
+
+                       if (outer == NULL)
+                               return NULL;
+
+                       if (!(outer->state & CLASS_LINKED))
+                               if (!link_class(outer))
+                                       return NULL;
+
+                       return outer;
+               }
+       }
+
+       return NULL;
+}
+
+
+/* class_get_signature *********************************************************
+
+   Return the signature of the given class.  For array and primitive
+   classes return NULL.
+
+*******************************************************************************/
+
+#if defined(ENABLE_JAVASE)
+utf *class_get_signature(classinfo *c)
+{
+       /* For array and primitive classes return NULL. */
+
+       if (class_is_array(c) || class_is_primitive(c))
+               return NULL;
+
+       return c->signature;
+}
+#endif
+
+
 /* class_printflags ************************************************************
 
    Prints flags of a class.
index 5d12c30c839f3ae31fb6184ee0b04f7283a36049..c33e5d7b5bd34bcc45eaf9e4701f6a876a4d2437 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: class.h 8179 2007-07-05 11:21:08Z michi $
+   $Id: class.h 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -80,8 +80,9 @@ typedef struct castinfo       castinfo;
 /* classinfo ******************************************************************/
 
 /* We define this dummy structure of java_lang_Class so we can
-   bootstrap cacaoh without needing a java_lang_Class.h file.  If the
-   size is big enough, is checked during runtime in vm_create. */
+   bootstrap cacaoh without needing a java_lang_Class.h file.  Whether
+   the size of the dummy structure is big enough is checked during
+   runtime in vm_create. */
 
 typedef struct {
        java_objectheader header;
@@ -125,8 +126,6 @@ struct classinfo {                /* class structure                          */
        s4          methodscount;     /* number of methods                        */
        methodinfo *methods;          /* method table                             */
 
-       listnode_t  listnode;         /* linkage                                  */
-
        s4          state;            /* current class state                      */
        s4          index;            /* hierarchy depth (classes) or index       */
                                      /* (interfaces)                             */
@@ -188,9 +187,6 @@ struct castinfo {
 
 /* global variables ***********************************************************/
 
-extern list_t unlinkedclasses; /* this is only used for eager class loading   */
-
-
 /* frequently used classes ****************************************************/
 
 /* important system classes */
@@ -208,6 +204,9 @@ extern classinfo *class_java_lang_VMSystem;
 extern classinfo *class_java_lang_VMThread;
 extern classinfo *class_java_io_Serializable;
 
+#if defined(WITH_CLASSPATH_SUN)
+extern classinfo *class_sun_reflect_MagicAccessorImpl;
+#endif
 
 /* system exception classes required in cacao */
 
@@ -289,18 +288,12 @@ extern classinfo *pseudo_class_New;
 
 /* function prototypes ********************************************************/
 
-/* create a new classinfo struct */
 classinfo *class_create_classinfo(utf *u);
+void       class_postset_header_vftbl(void);
+classinfo *class_define(utf *name, classloader *cl, int32_t length, const uint8_t *data);
+void       class_set_packagename(classinfo *c);
 
-/* postset's the header.vftbl */
-void class_postset_header_vftbl(void);
-
-classinfo *class_define(utf *name, classloader *cl, s4 length, u1 *data);
-
-/* set the package name after the name has been set */
-void class_set_packagename(classinfo *c);
-
-bool class_load_attributes(classbuffer *cb);
+bool       class_load_attributes(classbuffer *cb);
 
 /* retrieve constantpool element */
 voidptr class_getconstant(classinfo *class, u4 pos, u4 ctype);
@@ -350,10 +343,17 @@ methodinfo *class_resolvemethod(classinfo *c, utf *name, utf *dest);
 methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool throwexception);
 methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool throwexception);
 
-bool class_issubclass(classinfo *sub, classinfo *super);
-bool class_isanysubclass(classinfo *sub, classinfo *super);
-bool class_is_array(classinfo *c);
-bool class_is_interface(classinfo *c);
+bool       class_issubclass(classinfo *sub, classinfo *super);
+bool       class_isanysubclass(classinfo *sub, classinfo *super);
+bool       class_is_primitive(classinfo *c);
+bool       class_is_array(classinfo *c);
+bool       class_is_interface(classinfo *c);
+classinfo *class_get_superclass(classinfo *c);
+classinfo *class_get_declaringclass(classinfo *c);
+
+#if defined(ENABLE_JAVASE)
+utf       *class_get_signature(classinfo *c);
+#endif
 
 /* some debugging functions */
 
index f27a95caba430053bc9b9386962e57047f664c5a..9fce46c62cf55397b4e59e3ad5c6d337ab6ceac4 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: descriptor.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: descriptor.c 8233 2007-07-25 15:11:20Z twisti $
 
 */
 
@@ -38,8 +38,8 @@
 #include "mm/memory.h"
 
 #include "vm/exceptions.h"
-
 #include "vm/jit_interface.h"
+#include "vm/vm.h"
 
 #include "vmcore/descriptor.h"
 #include "vmcore/primitive.h"
@@ -145,29 +145,43 @@ struct descriptor_hash_entry {
 
 *******************************************************************************/
 
-u2 descriptor_to_basic_type(utf *descriptor)
+int descriptor_to_basic_type(utf *descriptor)
 {
        assert(descriptor->blength >= 1);
        
        switch (descriptor->text[0]) {
-               case 'B': 
-               case 'C':
-               case 'I':
-               case 'S':  
-               case 'Z':  return TYPE_INT;
-               case 'D':  return TYPE_DBL;
-               case 'F':  return TYPE_FLT;
-               case 'J':  return TYPE_LNG;
-               case 'L':
-               case '[':  return TYPE_ADR;
+       case 'Z':
+       case 'B':
+       case 'C':
+       case 'S':
+       case 'I':
+               return TYPE_INT;
+
+       case 'J':
+               return TYPE_LNG;
+
+       case 'F':
+               return TYPE_FLT;
+
+       case 'D':
+               return TYPE_DBL;
+
+       case 'L':
+       case '[':
+               return TYPE_ADR;
+
+       default:
+               vm_abort("descriptor_to_basic_type: invalid type %c",
+                                descriptor->text[0]);
        }
-                       
-       assert(0);
 
-       return 0; /* keep the compiler happy */
+       /* keep the compiler happy */
+
+       return 0;
 }
 
-/* descriptor_typesize**** ****************************************************
+
+/* descriptor_typesize *********************************************************
 
    Return the size in bytes needed for the given type.
 
@@ -179,23 +193,32 @@ u2 descriptor_to_basic_type(utf *descriptor)
 
 *******************************************************************************/
 
-u2 descriptor_typesize(typedesc *td)
+int descriptor_typesize(typedesc *td)
 {
        assert(td);
 
        switch (td->type) {
-               case TYPE_INT: return 4;
-               case TYPE_LNG: return 8;
-               case TYPE_FLT: return 4;
-               case TYPE_DBL: return 8;
-               case TYPE_ADR: return sizeof(voidptr);
+       case TYPE_INT:
+       case TYPE_FLT:
+               return 4;
+
+       case TYPE_LNG:
+       case TYPE_DBL:
+               return 8;
+
+       case TYPE_ADR:
+               return SIZEOF_VOID_P;
+
+       default:
+               vm_abort("descriptor_typesize: invalid type %d", td->type);
        }
 
-       assert(0);
+       /* keep the compiler happy */
 
-       return 0; /* keep the compiler happy */
+       return 0;
 }
 
+
 /* name_from_descriptor ********************************************************
 
    Return the class name indicated by the given descriptor
@@ -955,8 +978,8 @@ descriptor_pool_parse_method_descriptor(descriptor_pool *pool, utf *desc,
        md->paramcount = paramcount;
        md->paramslots = paramslots;
 
-       /* If m != ACC_UNDEF we parse a real loaded method, so do param prealloc. */
-       /* Otherwise we do this in stack analysis.                                */
+       /* If mflags != ACC_UNDEF we parse a real loaded method, so do
+          param prealloc.  Otherwise we do this in stack analysis. */
 
        if (mflags != ACC_UNDEF) {
                if (md->paramcount > 0) {
@@ -977,10 +1000,18 @@ descriptor_pool_parse_method_descriptor(descriptor_pool *pool, utf *desc,
 # if defined(ENABLE_INTRP)
                if (!opt_intrp)
 # endif
-                       md_param_alloc(md);
+                       {
+                               /* As builtin-functions are native functions, we have
+                                  to pre-allocate for the native ABI. */
+
+                               if (mflags & ACC_METHOD_BUILTIN)
+                                       md_param_alloc_native(md);
+                               else
+                                       md_param_alloc(md);
+                       }
 #endif
-
-       else {
+       }
+       else {
                /* params will be allocated later by
                   descriptor_params_from_paramtypes if necessary */
 
@@ -1071,7 +1102,15 @@ bool descriptor_params_from_paramtypes(methoddesc *md, s4 mflags)
 # if defined(ENABLE_INTRP)
        if (!opt_intrp)
 # endif
-               md_param_alloc(md);
+               {
+                       /* As builtin-functions are native functions, we have to
+                          pre-allocate for the native ABI. */
+
+                       if (mflags & ACC_METHOD_BUILTIN)
+                               md_param_alloc_native(md);
+                       else
+                               md_param_alloc(md);
+               }
 #endif
 
        return true;
index 27d7e57ff4b5d370a15556bf3f59fec128489530..8c8e9b4541c8b4e7566300bd70a7d8993f135150 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: descriptor.h 8123 2007-06-20 23:50:55Z michi $
+   $Id: descriptor.h 8233 2007-07-25 15:11:20Z twisti $
 
 */
 
@@ -160,8 +160,8 @@ descriptor_pool * descriptor_pool_new(classinfo *referer);
 bool descriptor_pool_add_class(descriptor_pool *pool,utf *name);
 bool descriptor_pool_add(descriptor_pool *pool,utf *desc,int *paramslots);
 
-u2 descriptor_to_basic_type(utf *desc);
-u2 descriptor_typesize(typedesc *td);
+int  descriptor_to_basic_type(utf *desc);
+int  descriptor_typesize(typedesc *td);
 
 constant_classref * descriptor_pool_create_classrefs(descriptor_pool *pool,
                                                                                                         s4 *count);
index 4f8dcff7a907a1086812bad79f4117abd0b74be3..c2c337a7a5ae87160ae207fd0eb30c115e8adf6a 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: field.c 8132 2007-06-22 11:15:47Z twisti $
+   $Id: field.c 8227 2007-07-24 11:55:07Z twisti $
 
 */
 
 #include "config.h"
 
 #include <assert.h>
+#include <stdint.h>
 #include <stdio.h>
 
 #include "vm/types.h"
 
+#include "vm/exceptions.h"
+#include "vm/stringlocal.h"
+#include "vm/vm.h"
+
 #include "vmcore/class.h"
+#include "vmcore/descriptor.h"
 #include "vmcore/field.h"
+#include "vmcore/loader.h"
+#include "vmcore/options.h"
 #include "vmcore/primitive.h"
 #include "vmcore/references.h"
+#include "vmcore/suck.h"
 #include "vmcore/utf8.h"
 
 
+/* field_load ******************************************************************
+
+   Load everything about a class field from the class file and fill a
+   fieldinfo structure.
+
+*******************************************************************************/
+
+#define field_load_NOVALUE  0xffffffff /* must be bigger than any u2 value! */
+
+bool field_load(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool)
+{
+       classinfo *c;
+       u4 attrnum, i;
+       u4 jtype;
+       u4 pindex = field_load_NOVALUE;     /* constantvalue_index */
+       utf *u;
+
+       c = cb->class;
+
+       if (!suck_check_classbuffer_size(cb, 2 + 2 + 2))
+               return false;
+
+       f->flags = suck_u2(cb);
+
+       if (!(u = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
+               return false;
+
+       f->name = u;
+
+       if (!(u = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
+               return false;
+
+       f->descriptor = u;
+       f->parseddesc = NULL;
+
+       if (!descriptor_pool_add(descpool, u, NULL))
+               return false;
+
+       /* descriptor_pool_add accepts method descriptors, so we have to
+          check against them here before the call of
+          descriptor_to_basic_type below. */
+
+       if (u->text[0] == '(') {
+               exceptions_throw_classformaterror(c, "Method descriptor used for field");
+               return false;
+       }
+
+#ifdef ENABLE_VERIFIER
+       if (opt_verify) {
+               /* check name */
+               if (!is_valid_name_utf(f->name) || f->name->text[0] == '<') {
+                       exceptions_throw_classformaterror(c,
+                                                                                         "Illegal Field name \"%s\"",
+                                                                                         f->name->text);
+                       return false;
+               }
+
+               /* check flag consistency */
+               i = f->flags & (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED);
+
+               if ((i != 0 && i != ACC_PUBLIC && i != ACC_PRIVATE && i != ACC_PROTECTED) ||
+                       ((f->flags & (ACC_FINAL | ACC_VOLATILE)) == (ACC_FINAL | ACC_VOLATILE))) {
+                       exceptions_throw_classformaterror(c,
+                                                                                         "Illegal field modifiers: 0x%X",
+                                                                                         f->flags);
+                       return false;
+               }
+
+               if (c->flags & ACC_INTERFACE) {
+                       if (((f->flags & (ACC_STATIC | ACC_PUBLIC | ACC_FINAL))
+                               != (ACC_STATIC | ACC_PUBLIC | ACC_FINAL)) ||
+                               f->flags & ACC_TRANSIENT) {
+                               exceptions_throw_classformaterror(c,
+                                                                                                 "Illegal field modifiers: 0x%X",
+                                                                                                 f->flags);
+                               return false;
+                       }
+               }
+       }
+#endif /* ENABLE_VERIFIER */
+
+       /* data type */
+
+       jtype = descriptor_to_basic_type(f->descriptor);
+
+       f->class  = c;
+       f->type   = jtype;
+       f->offset = 0;                             /* offset from start of object */
+
+       switch (f->type) {
+       case TYPE_INT:
+               f->value.i = 0;
+               break;
+
+       case TYPE_FLT:
+               f->value.f = 0.0;
+               break;
+
+       case TYPE_DBL:
+               f->value.d = 0.0;
+               break;
+
+       case TYPE_ADR:
+               f->value.a = NULL;
+               if (!(f->flags & ACC_STATIC))
+                       c->flags |= ACC_CLASS_HAS_POINTERS;
+               break;
+
+       case TYPE_LNG:
+#if U8_AVAILABLE
+               f->value.l = 0;
+#else
+               f->value.l.low  = 0;
+               f->value.l.high = 0;
+#endif
+               break;
+       }
+
+       /* read attributes */
+       if (!suck_check_classbuffer_size(cb, 2))
+               return false;
+
+       attrnum = suck_u2(cb);
+       for (i = 0; i < attrnum; i++) {
+               if (!suck_check_classbuffer_size(cb, 2))
+                       return false;
+
+               if (!(u = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
+                       return false;
+
+               if (u == utf_ConstantValue) {
+                       if (!suck_check_classbuffer_size(cb, 4 + 2))
+                               return false;
+
+                       /* check attribute length */
+
+                       if (suck_u4(cb) != 2) {
+                               exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
+                               return false;
+                       }
+                       
+                       /* constant value attribute */
+
+                       if (pindex != field_load_NOVALUE) {
+                               exceptions_throw_classformaterror(c, "Multiple ConstantValue attributes");
+                               return false;
+                       }
+                       
+                       /* index of value in constantpool */
+
+                       pindex = suck_u2(cb);
+               
+                       /* initialize field with value from constantpool */             
+
+                       switch (jtype) {
+                       case TYPE_INT: {
+                               constant_integer *ci; 
+
+                               if (!(ci = class_getconstant(c, pindex, CONSTANT_Integer)))
+                                       return false;
+
+                               f->value.i = ci->value;
+                       }
+                       break;
+                                       
+                       case TYPE_LNG: {
+                               constant_long *cl; 
+
+                               if (!(cl = class_getconstant(c, pindex, CONSTANT_Long)))
+                                       return false;
+
+                               f->value.l = cl->value;
+                       }
+                       break;
+
+                       case TYPE_FLT: {
+                               constant_float *cf;
+
+                               if (!(cf = class_getconstant(c, pindex, CONSTANT_Float)))
+                                       return false;
+
+                               f->value.f = cf->value;
+                       }
+                       break;
+                                                                                       
+                       case TYPE_DBL: {
+                               constant_double *cd;
+
+                               if (!(cd = class_getconstant(c, pindex, CONSTANT_Double)))
+                                       return false;
+
+                               f->value.d = cd->value;
+                       }
+                       break;
+                                               
+                       case TYPE_ADR:
+                               if (!(u = class_getconstant(c, pindex, CONSTANT_String)))
+                                       return false;
+
+                               /* create javastring from compressed utf8-string */
+                               f->value.a = literalstring_new(u);
+                               break;
+       
+                       default: 
+                               vm_abort("field_load: invalid field type %d", jtype);
+                       }
+               }
+#if defined(ENABLE_JAVASE)
+               else if (u == utf_Signature) {
+                       /* Signature */
+
+                       if (!loader_load_attribute_signature(cb, &(f->signature)))
+                               return false;
+               }
+#endif
+               else {
+                       /* unknown attribute */
+
+                       if (!loader_skip_attribute_body(cb))
+                               return false;
+               }
+       }
+
+       /* everything was ok */
+
+       return true;
+}
+
+
 /* field_get_type **************************************************************
 
    Returns the type of the field as class.
index 00616399d4c8aac0d891afdd21d6a4bc3c28c284..d995261ae51ef28fb44b44fe6bcbb3e2863c3737 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: field.h 8132 2007-06-22 11:15:47Z twisti $
+   $Id: field.h 8229 2007-07-24 18:42:44Z twisti $
 */
 
 
@@ -41,6 +41,7 @@ typedef struct fieldinfo fieldinfo;
 
 #include "vmcore/descriptor.h"
 #include "vmcore/class.h"
+#include "vmcore/loader.h"
 #include "vmcore/references.h"
 #include "vmcore/utf8.h"
 
@@ -72,6 +73,7 @@ struct fieldinfo {          /* field of a class                                 */
 
 /* function prototypes ********************************************************/
 
+bool       field_load(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool);
 classinfo *field_get_type(fieldinfo *f);
 void       field_free(fieldinfo *f);
 
index badd0ed20cc9782cbe33191405a79f662da70b76..7df0f32d4d821525fe54c513eb55790428f650ad 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: linker.c 8179 2007-07-05 11:21:08Z michi $
+   $Id: linker.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
@@ -88,6 +88,22 @@ static bool linker_addinterface(classinfo *c, classinfo *ic);
 static s4 class_highestinterface(classinfo *c);
 
 
+/* dummy structures for alinment checks ***************************************/
+
+typedef struct dummy_alignment_long_t   dummy_alignment_long_t;
+typedef struct dummy_alignment_double_t dummy_alignment_double_t;
+
+struct dummy_alignment_long_t {
+       int32_t i;
+       int64_t l;
+};
+
+struct dummy_alignment_double_t {
+       int32_t i;
+       double  d;
+};
+
+
 /* linker_init *****************************************************************
 
    Initializes the linker subsystem.
@@ -96,6 +112,27 @@ static s4 class_highestinterface(classinfo *c);
 
 bool linker_init(void)
 {
+       /* Check for if alignment for long and double matches what we
+          assume for the current architecture. */
+
+#if defined(__I386__) || (defined(__ARM__) && !defined(__ARM_EABI__))
+       if (OFFSET(dummy_alignment_long_t, l) != 4)
+               vm_abort("linker_init: long alignment is different from what assumed: %d != %d",
+                                OFFSET(dummy_alignment_long_t, l), 4);
+
+       if (OFFSET(dummy_alignment_double_t, d) != 4)
+               vm_abort("linker_init: double alignment is different from what assumed: %d != %d",
+                                OFFSET(dummy_alignment_double_t, d), 4);
+#else
+       if (OFFSET(dummy_alignment_long_t, l) != 8)
+               vm_abort("linker_init: long alignment is different from what assumed: %d != %d",
+                                OFFSET(dummy_alignment_long_t, l), 8);
+
+       if (OFFSET(dummy_alignment_double_t, d) != 8)
+               vm_abort("linker_init: double alignment is different from what assumed: %d != %d",
+                                OFFSET(dummy_alignment_double_t, d), 8);
+#endif
+
        /* reset interface index */
 
        interfaceindex = 0;
@@ -137,7 +174,6 @@ bool linker_init(void)
                return false;
 #endif
 
-
        /* link classes for wrapping primitive types */
 
 #if defined(ENABLE_JAVASE)
@@ -221,6 +257,11 @@ bool linker_init(void)
        if (!link_class(class_java_util_Vector))
                return false;
 
+# if defined(WITH_CLASSPATH_SUN)
+       if (!link_class(class_sun_reflect_MagicAccessorImpl))
+               return false;
+# endif
+
        if (!link_class(arrayclass_java_lang_Object))
                return false;
 #endif
index a0da4bd74ac5b0602ced587fbdcd3c9877685d88..721d578c8338c424cb777f96fdbe53697611a1bf 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: loader.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: loader.c 8245 2007-07-31 09:55:04Z michi $
 
 */
 
 #endif
 
 #include "vmcore/classcache.h"
+#include "vmcore/field.h"
 #include "vmcore/linker.h"
 #include "vmcore/loader.h"
+#include "vmcore/method.h"
 #include "vmcore/options.h"
 #include "vmcore/primitive.h"
 #include "vmcore/rt-timing.h"
@@ -226,6 +228,12 @@ bool loader_init(void)
        if (!(class_java_util_Vector = load_class_bootstrap(utf_java_util_Vector)))
                return false;
 
+# if defined(WITH_CLASSPATH_SUN)
+       if (!(class_sun_reflect_MagicAccessorImpl =
+                 load_class_bootstrap(utf_new_char("sun/reflect/MagicAccessorImpl"))))
+               return false;
+# endif
+
        if (!(arrayclass_java_lang_Object =
                  load_class_bootstrap(utf_new_char("[Ljava/lang/Object;"))))
                return false;
@@ -770,17 +778,6 @@ static bool load_constantpool(classbuffer *cb, descriptor_pool *descpool)
 
                cptags[forward_classes->thisindex] = CONSTANT_Class;
 
-               if (opt_eager) {
-                       classinfo *tc;
-
-                       if (!(tc = load_class_bootstrap(name)))
-                               return false;
-
-                       /* link the class later, because we cannot link the class currently
-                          loading */
-                       list_add_first(&unlinkedclasses, tc);
-               }
-
                /* the classref is created later */
                cpinfos[forward_classes->thisindex] = name;
 
@@ -941,623 +938,6 @@ bool loader_load_attribute_signature(classbuffer *cb, utf **signature)
 #endif /* defined(ENABLE_JAVASE) */
 
 
-/* load_field ******************************************************************
-
-   Load everything about a class field from the class file and fill a
-   'fieldinfo' structure. For static fields, space in the data segment
-   is allocated.
-
-*******************************************************************************/
-
-#define field_load_NOVALUE  0xffffffff /* must be bigger than any u2 value! */
-
-static bool load_field(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool)
-{
-       classinfo *c;
-       u4 attrnum, i;
-       u4 jtype;
-       u4 pindex = field_load_NOVALUE;     /* constantvalue_index */
-       utf *u;
-
-       c = cb->class;
-
-       if (!suck_check_classbuffer_size(cb, 2 + 2 + 2))
-               return false;
-
-       f->flags = suck_u2(cb);
-
-       if (!(u = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
-               return false;
-
-       f->name = u;
-
-       if (!(u = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
-               return false;
-
-       f->descriptor = u;
-       f->parseddesc = NULL;
-
-       if (!descriptor_pool_add(descpool, u, NULL))
-               return false;
-
-       /* descriptor_pool_add accepts method descriptors, so we have to check  */
-       /* against them here before the call of descriptor_to_basic_type below. */
-       if (u->text[0] == '(') {
-               exceptions_throw_classformaterror(c, "Method descriptor used for field");
-               return false;
-       }
-
-#ifdef ENABLE_VERIFIER
-       if (opt_verify) {
-               /* check name */
-               if (!is_valid_name_utf(f->name) || f->name->text[0] == '<') {
-                       exceptions_throw_classformaterror(c,
-                                                                                         "Illegal Field name \"%s\"",
-                                                                                         f->name->text);
-                       return false;
-               }
-
-               /* check flag consistency */
-               i = f->flags & (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED);
-
-               if ((i != 0 && i != ACC_PUBLIC && i != ACC_PRIVATE && i != ACC_PROTECTED) ||
-                       ((f->flags & (ACC_FINAL | ACC_VOLATILE)) == (ACC_FINAL | ACC_VOLATILE))) {
-                       exceptions_throw_classformaterror(c,
-                                                                                         "Illegal field modifiers: 0x%X",
-                                                                                         f->flags);
-                       return false;
-               }
-
-               if (c->flags & ACC_INTERFACE) {
-                       if (((f->flags & (ACC_STATIC | ACC_PUBLIC | ACC_FINAL))
-                               != (ACC_STATIC | ACC_PUBLIC | ACC_FINAL)) ||
-                               f->flags & ACC_TRANSIENT) {
-                               exceptions_throw_classformaterror(c,
-                                                                                                 "Illegal field modifiers: 0x%X",
-                                                                                                 f->flags);
-                               return false;
-                       }
-               }
-       }
-#endif /* ENABLE_VERIFIER */
-
-       f->type   = jtype = descriptor_to_basic_type(f->descriptor); /* data type */
-       f->offset = 0;                             /* offset from start of object */
-       f->class  = c;
-
-       switch (f->type) {
-       case TYPE_INT:
-               f->value.i = 0;
-               break;
-
-       case TYPE_FLT:
-               f->value.f = 0.0;
-               break;
-
-       case TYPE_DBL:
-               f->value.d = 0.0;
-               break;
-
-       case TYPE_ADR:
-               f->value.a = NULL;
-               if (!(f->flags & ACC_STATIC))
-                       c->flags |= ACC_CLASS_HAS_POINTERS;
-               break;
-
-       case TYPE_LNG:
-#if U8_AVAILABLE
-               f->value.l = 0;
-#else
-               f->value.l.low  = 0;
-               f->value.l.high = 0;
-#endif
-               break;
-       }
-
-       /* read attributes */
-       if (!suck_check_classbuffer_size(cb, 2))
-               return false;
-
-       attrnum = suck_u2(cb);
-       for (i = 0; i < attrnum; i++) {
-               if (!suck_check_classbuffer_size(cb, 2))
-                       return false;
-
-               if (!(u = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
-                       return false;
-
-               if (u == utf_ConstantValue) {
-                       if (!suck_check_classbuffer_size(cb, 4 + 2))
-                               return false;
-
-                       /* check attribute length */
-
-                       if (suck_u4(cb) != 2) {
-                               exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
-                               return false;
-                       }
-                       
-                       /* constant value attribute */
-
-                       if (pindex != field_load_NOVALUE) {
-                               exceptions_throw_classformaterror(c, "Multiple ConstantValue attributes");
-                               return false;
-                       }
-                       
-                       /* index of value in constantpool */
-
-                       pindex = suck_u2(cb);
-               
-                       /* initialize field with value from constantpool */             
-                       switch (jtype) {
-                       case TYPE_INT: {
-                               constant_integer *ci; 
-
-                               if (!(ci = class_getconstant(c, pindex, CONSTANT_Integer)))
-                                       return false;
-
-                               f->value.i = ci->value;
-                       }
-                       break;
-                                       
-                       case TYPE_LNG: {
-                               constant_long *cl; 
-
-                               if (!(cl = class_getconstant(c, pindex, CONSTANT_Long)))
-                                       return false;
-
-                               f->value.l = cl->value;
-                       }
-                       break;
-
-                       case TYPE_FLT: {
-                               constant_float *cf;
-
-                               if (!(cf = class_getconstant(c, pindex, CONSTANT_Float)))
-                                       return false;
-
-                               f->value.f = cf->value;
-                       }
-                       break;
-                                                                                       
-                       case TYPE_DBL: {
-                               constant_double *cd;
-
-                               if (!(cd = class_getconstant(c, pindex, CONSTANT_Double)))
-                                       return false;
-
-                               f->value.d = cd->value;
-                       }
-                       break;
-                                               
-                       case TYPE_ADR:
-                               if (!(u = class_getconstant(c, pindex, CONSTANT_String)))
-                                       return false;
-
-                               /* create javastring from compressed utf8-string */
-                               f->value.a = literalstring_new(u);
-                               break;
-       
-                       default: 
-                               log_text("Invalid Constant - Type");
-                       }
-               }
-#if defined(ENABLE_JAVASE)
-               else if (u == utf_Signature) {
-                       /* Signature */
-
-                       if (!loader_load_attribute_signature(cb, &(f->signature)))
-                               return false;
-               }
-#endif
-               else {
-                       /* unknown attribute */
-
-                       if (!loader_skip_attribute_body(cb))
-                               return false;
-               }
-       }
-
-       /* everything was ok */
-
-       return true;
-}
-
-
-/* loader_load_method **********************************************************
-
-   Loads a method from the class file and fills an existing
-   'methodinfo' structure. For native methods, the function pointer
-   field is set to the real function pointer, for JavaVM methods a
-   pointer to the compiler is used preliminarily.
-
-   method_info {
-       u2 access_flags;
-          u2 name_index;
-          u2 descriptor_index;
-          u2 attributes_count;
-          attribute_info attributes[attribute_count];
-   }
-
-   attribute_info {
-       u2 attribute_name_index;
-          u4 attribute_length;
-          u1 info[attribute_length];
-   }
-
-   LineNumberTable_attribute {
-       u2 attribute_name_index;
-          u4 attribute_length;
-          u2 line_number_table_length;
-          {
-              u2 start_pc;
-                  u2 line_number;
-          } line_number_table[line_number_table_length];
-   }
-
-*******************************************************************************/
-
-static bool loader_load_method(classbuffer *cb, methodinfo *m,
-                                                          descriptor_pool *descpool)
-{
-       classinfo *c;
-       int argcount;
-       s4         i, j, k, l;
-       utf       *u;
-       u2         name_index;
-       u2         descriptor_index;
-       u2         attributes_count;
-       u2         attribute_name_index;
-       utf       *attribute_name;
-       u2         code_attributes_count;
-       u2         code_attribute_name_index;
-       utf       *code_attribute_name;
-
-       /* get classinfo */
-
-       c = cb->class;
-
-#if defined(ENABLE_THREADS)
-       lock_init_object_lock(&m->header);
-#endif
-
-#if defined(ENABLE_STATISTICS)
-       if (opt_stat)
-               count_all_methods++;
-#endif
-
-       /* all fields of m have been zeroed in load_class_from_classbuffer */
-
-       m->class = c;
-       
-       if (!suck_check_classbuffer_size(cb, 2 + 2 + 2))
-               return false;
-
-       /* access flags */
-
-       m->flags = suck_u2(cb);
-
-       /* name */
-
-       name_index = suck_u2(cb);
-
-       if (!(u = class_getconstant(c, name_index, CONSTANT_Utf8)))
-               return false;
-
-       m->name = u;
-
-       /* descriptor */
-
-       descriptor_index = suck_u2(cb);
-
-       if (!(u = class_getconstant(c, descriptor_index, CONSTANT_Utf8)))
-               return false;
-
-       m->descriptor = u;
-
-       if (!descriptor_pool_add(descpool, u, &argcount))
-               return false;
-
-#ifdef ENABLE_VERIFIER
-       if (opt_verify) {
-               if (!is_valid_name_utf(m->name)) {
-                       exceptions_throw_classformaterror(c, "Method with invalid name");
-                       return false;
-               }
-
-               if (m->name->text[0] == '<' &&
-                       m->name != utf_init && m->name != utf_clinit) {
-                       exceptions_throw_classformaterror(c, "Method with invalid special name");
-                       return false;
-               }
-       }
-#endif /* ENABLE_VERIFIER */
-       
-       if (!(m->flags & ACC_STATIC))
-               argcount++; /* count the 'this' argument */
-
-#ifdef ENABLE_VERIFIER
-       if (opt_verify) {
-               if (argcount > 255) {
-                       exceptions_throw_classformaterror(c, "Too many arguments in signature");
-                       return false;
-               }
-
-               /* check flag consistency */
-               if (m->name != utf_clinit) {
-                       i = (m->flags & (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED));
-
-                       if (i != 0 && i != ACC_PUBLIC && i != ACC_PRIVATE && i != ACC_PROTECTED) {
-                               exceptions_throw_classformaterror(c,
-                                                                                                 "Illegal method modifiers: 0x%X",
-                                                                                                 m->flags);
-                               return false;
-                       }
-
-                       if (m->flags & ACC_ABSTRACT) {
-                               if ((m->flags & (ACC_FINAL | ACC_NATIVE | ACC_PRIVATE |
-                                                                ACC_STATIC | ACC_STRICT | ACC_SYNCHRONIZED))) {
-                                       exceptions_throw_classformaterror(c,
-                                                                                                         "Illegal method modifiers: 0x%X",
-                                                                                                         m->flags);
-                                       return false;
-                               }
-                       }
-
-                       if (c->flags & ACC_INTERFACE) {
-                               if ((m->flags & (ACC_ABSTRACT | ACC_PUBLIC)) != (ACC_ABSTRACT | ACC_PUBLIC)) {
-                                       exceptions_throw_classformaterror(c,
-                                                                                                         "Illegal method modifiers: 0x%X",
-                                                                                                         m->flags);
-                                       return false;
-                               }
-                       }
-
-                       if (m->name == utf_init) {
-                               if (m->flags & (ACC_STATIC | ACC_FINAL | ACC_SYNCHRONIZED |
-                                                               ACC_NATIVE | ACC_ABSTRACT)) {
-                                       exceptions_throw_classformaterror(c, "Instance initialization method has invalid flags set");
-                                       return false;
-                               }
-                       }
-               }
-       }
-#endif /* ENABLE_VERIFIER */
-
-       /* mark the method as monomorphic until further notice */
-
-       m->flags |= ACC_METHOD_MONOMORPHIC;
-
-       /* non-abstract methods have an implementation in this class */
-
-       if (!(m->flags & ACC_ABSTRACT))
-               m->flags |= ACC_METHOD_IMPLEMENTED;
-               
-       if (!suck_check_classbuffer_size(cb, 2))
-               return false;
-
-       /* attributes count */
-
-       attributes_count = suck_u2(cb);
-
-       for (i = 0; i < attributes_count; i++) {
-               if (!suck_check_classbuffer_size(cb, 2))
-                       return false;
-
-               /* attribute name index */
-
-               attribute_name_index = suck_u2(cb);
-
-               if (!(attribute_name = class_getconstant(c, attribute_name_index, CONSTANT_Utf8)))
-                       return false;
-
-               if (attribute_name == utf_Code) {
-                       /* Code */
-                       if (m->flags & (ACC_ABSTRACT | ACC_NATIVE)) {
-                               exceptions_throw_classformaterror(c, "Code attribute in native or abstract methods");
-                               return false;
-                       }
-                       
-                       if (m->jcode) {
-                               exceptions_throw_classformaterror(c, "Multiple Code attributes");
-                               return false;
-                       }
-
-                       if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
-                               return false;
-
-                       suck_u4(cb);
-                       m->maxstack = suck_u2(cb);
-                       m->maxlocals = suck_u2(cb);
-
-                       if (m->maxlocals < argcount) {
-                               exceptions_throw_classformaterror(c, "Arguments can't fit into locals");
-                               return false;
-                       }
-                       
-                       if (!suck_check_classbuffer_size(cb, 4))
-                               return false;
-
-                       m->jcodelength = suck_u4(cb);
-
-                       if (m->jcodelength == 0) {
-                               exceptions_throw_classformaterror(c, "Code of a method has length 0");
-                               return false;
-                       }
-                       
-                       if (m->jcodelength > 65535) {
-                               exceptions_throw_classformaterror(c, "Code of a method longer than 65535 bytes");
-                               return false;
-                       }
-
-                       if (!suck_check_classbuffer_size(cb, m->jcodelength))
-                               return false;
-
-                       m->jcode = MNEW(u1, m->jcodelength);
-                       suck_nbytes(m->jcode, cb, m->jcodelength);
-
-                       if (!suck_check_classbuffer_size(cb, 2))
-                               return false;
-
-                       m->rawexceptiontablelength = suck_u2(cb);
-                       if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * m->rawexceptiontablelength))
-                               return false;
-
-                       m->rawexceptiontable = MNEW(raw_exception_entry, m->rawexceptiontablelength);
-
-#if defined(ENABLE_STATISTICS)
-                       if (opt_stat) {
-                               count_vmcode_len += m->jcodelength + 18;
-                               count_extable_len +=
-                                       m->rawexceptiontablelength * sizeof(raw_exception_entry);
-                       }
-#endif
-
-                       for (j = 0; j < m->rawexceptiontablelength; j++) {
-                               u4 idx;
-                               m->rawexceptiontable[j].startpc = suck_u2(cb);
-                               m->rawexceptiontable[j].endpc = suck_u2(cb);
-                               m->rawexceptiontable[j].handlerpc = suck_u2(cb);
-
-                               idx = suck_u2(cb);
-                               if (!idx) {
-                                       m->rawexceptiontable[j].catchtype.any = NULL;
-
-                               } else {
-                                       /* the classref is created later */
-                                       if (!(m->rawexceptiontable[j].catchtype.any =
-                                                 (utf*)class_getconstant(c, idx, CONSTANT_Class)))
-                                               return false;
-                               }
-                       }
-
-                       if (!suck_check_classbuffer_size(cb, 2))
-                               return false;
-
-                       /* code attributes count */
-
-                       code_attributes_count = suck_u2(cb);
-
-                       for (k = 0; k < code_attributes_count; k++) {
-                               if (!suck_check_classbuffer_size(cb, 2))
-                                       return false;
-
-                               /* code attribute name index */
-
-                               code_attribute_name_index = suck_u2(cb);
-
-                               if (!(code_attribute_name = class_getconstant(c, code_attribute_name_index, CONSTANT_Utf8)))
-                                       return false;
-
-                               /* check which code attribute */
-
-                               if (code_attribute_name == utf_LineNumberTable) {
-                                       /* LineNumberTable */
-                                       if (!suck_check_classbuffer_size(cb, 4 + 2))
-                                               return false;
-
-                                       /* attribute length */
-
-                                       (void) suck_u4(cb);
-
-                                       /* line number table length */
-
-                                       m->linenumbercount = suck_u2(cb);
-
-                                       if (!suck_check_classbuffer_size(cb,
-                                                                                               (2 + 2) * m->linenumbercount))
-                                               return false;
-
-                                       m->linenumbers = MNEW(lineinfo, m->linenumbercount);
-
-#if defined(ENABLE_STATISTICS)
-                                       if (opt_stat)
-                                               size_lineinfo += sizeof(lineinfo) * m->linenumbercount;
-#endif
-                                       
-                                       for (l = 0; l < m->linenumbercount; l++) {
-                                               m->linenumbers[l].start_pc    = suck_u2(cb);
-                                               m->linenumbers[l].line_number = suck_u2(cb);
-                                       }
-                               }
-#if defined(ENABLE_JAVASE)
-                               else if (code_attribute_name == utf_StackMapTable) {
-                                       /* StackTableMap */
-
-                                       if (!stackmap_load_attribute_stackmaptable(cb, m))
-                                               return false;
-                               }
-#endif
-                               else {
-                                       /* unknown code attribute */
-
-                                       if (!loader_skip_attribute_body(cb))
-                                               return false;
-                               }
-                       }
-               }
-               else if (attribute_name == utf_Exceptions) {
-                       /* Exceptions */
-
-                       if (m->thrownexceptions != NULL) {
-                               exceptions_throw_classformaterror(c, "Multiple Exceptions attributes");
-                               return false;
-                       }
-
-                       if (!suck_check_classbuffer_size(cb, 4 + 2))
-                               return false;
-
-                       /* attribute length */
-
-                       (void) suck_u4(cb);
-
-                       m->thrownexceptionscount = suck_u2(cb);
-
-                       if (!suck_check_classbuffer_size(cb, 2 * m->thrownexceptionscount))
-                               return false;
-
-                       m->thrownexceptions = MNEW(classref_or_classinfo, m->thrownexceptionscount);
-
-                       for (j = 0; j < m->thrownexceptionscount; j++) {
-                               /* the classref is created later */
-                               if (!((m->thrownexceptions)[j].any =
-                                         (utf*) class_getconstant(c, suck_u2(cb), CONSTANT_Class)))
-                                       return false;
-                       }
-               }
-#if defined(ENABLE_JAVASE)
-               else if (attribute_name == utf_Signature) {
-                       /* Signature */
-
-                       if (!loader_load_attribute_signature(cb, &(m->signature)))
-                               return false;
-               }
-#endif
-               else {
-                       /* unknown attribute */
-
-                       if (!loader_skip_attribute_body(cb))
-                               return false;
-               }
-       }
-
-       if ((m->jcode == NULL) && !(m->flags & (ACC_ABSTRACT | ACC_NATIVE))) {
-               exceptions_throw_classformaterror(c, "Missing Code attribute");
-               return false;
-       }
-
-       /* initialize the hit countdown field */
-
-#if defined(ENABLE_REPLACEMENT)
-       m->hitcountdown = METHOD_INITIAL_HIT_COUNTDOWN;
-#endif
-
-       /* everything was ok */
-
-       return true;
-}
-
-
 /* load_class_from_sysloader ***************************************************
 
    Load the class with the given name using the system class loader
@@ -1948,9 +1328,6 @@ classinfo *load_class_bootstrap(utf *name)
    The super class and the interfaces implemented by this class need
    not be loaded. The link is set later by the function 'class_link'.
 
-   The loaded class is removed from the list 'unloadedclasses' and
-   added to the list 'unlinkedclasses'.
-       
    SYNCHRONIZATION:
        This function is NOT synchronized!
    
@@ -2167,7 +1544,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
 #endif
 
        for (i = 0; i < c->fieldscount; i++) {
-               if (!load_field(cb, &(c->fields[i]),descpool))
+               if (!field_load(cb, &(c->fields[i]), descpool))
                        goto return_exception;
        }
 
@@ -2183,7 +1560,7 @@ classinfo *load_class_from_classbuffer(classbuffer *cb)
        MZERO(c->methods, methodinfo, c->methodscount);
        
        for (i = 0; i < c->methodscount; i++) {
-               if (!loader_load_method(cb, &(c->methods[i]), descpool))
+               if (!method_load(cb, &(c->methods[i]), descpool))
                        goto return_exception;
        }
 
@@ -2550,10 +1927,6 @@ classinfo *load_newly_created_array(classinfo *c, classloader *loader)
 
                assert(comp->state & CLASS_LOADED);
 
-               if (opt_eager)
-                       if (!link_class(c))
-                               return NULL;
-
                /* the array's flags are that of the component class */
                c->flags = (comp->flags & ~ACC_INTERFACE) | ACC_FINAL | ACC_ABSTRACT;
                c->classloader = comp->classloader;
@@ -2575,10 +1948,6 @@ classinfo *load_newly_created_array(classinfo *c, classloader *loader)
 
                assert(comp->state & CLASS_LOADED);
 
-               if (opt_eager)
-                       if (!link_class(c))
-                               return NULL;
-
                /* the array's flags are that of the component class */
                c->flags = (comp->flags & ~ACC_INTERFACE) | ACC_FINAL | ACC_ABSTRACT;
                c->classloader = comp->classloader;
@@ -2611,31 +1980,19 @@ classinfo *load_newly_created_array(classinfo *c, classloader *loader)
        c->super.cls = class_java_lang_Object;
 
 #if defined(ENABLE_JAVASE)
-       c->interfacescount = 2;
-    c->interfaces      = MNEW(classref_or_classinfo, 2);
 
-       if (opt_eager) {
-               classinfo *tc;
+       c->interfacescount   = 2;
+    c->interfaces        = MNEW(classref_or_classinfo, 2);
+       c->interfaces[0].cls = class_java_lang_Cloneable;
+       c->interfaces[1].cls = class_java_io_Serializable;
 
-               tc = class_java_lang_Cloneable;
-               assert(tc->state & CLASS_LOADED);
-               list_add_first(&unlinkedclasses, tc);
-               c->interfaces[0].cls = tc;
-
-               tc = class_java_io_Serializable;
-               assert(tc->state & CLASS_LOADED);
-               list_add_first(&unlinkedclasses, tc);
-               c->interfaces[1].cls = tc;
-       }
-       else {
-               c->interfaces[0].cls = class_java_lang_Cloneable;
-               c->interfaces[1].cls = class_java_io_Serializable;
-       }
 #elif defined(ENABLE_JAVAME_CLDC1_1)
-       c->interfacescount = 0;
-       c->interfaces      = NULL;
+
+       c->interfacescount   = 0;
+       c->interfaces        = NULL;
+
 #else
-#error unknow Java configuration
+# error unknow Java configuration
 #endif
 
        c->methodscount = 1;
index c03b30013b2a65beb13a628723182241f0136323..7e81098d5eb9701ef841775d07ae190b5f29c369 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: method.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: method.c 8228 2007-07-24 12:37:25Z twisti $
 
 */
 
 #include "config.h"
 
 #include <assert.h>
+#include <stdint.h>
 #include <stdio.h>
 
 #include "vm/types.h"
 
 #include "mm/memory.h"
 
+#include "threads/lock-common.h"
+
 #include "vm/builtin.h"
+#include "vm/exceptions.h"
 #include "vm/global.h"
 #include "vm/resolve.h"
 
@@ -49,6 +53,7 @@
 #include "vmcore/loader.h"
 #include "vmcore/method.h"
 #include "vmcore/options.h"
+#include "vmcore/suck.h"
 
 
 #if !defined(NDEBUG) && defined(ENABLE_INLINING)
 #endif
 
 
+/* method_load *****************************************************************
+
+   Loads a method from the class file and fills an existing methodinfo
+   structure.
+
+   method_info {
+       u2 access_flags;
+          u2 name_index;
+          u2 descriptor_index;
+          u2 attributes_count;
+          attribute_info attributes[attribute_count];
+   }
+
+   attribute_info {
+       u2 attribute_name_index;
+          u4 attribute_length;
+          u1 info[attribute_length];
+   }
+
+   LineNumberTable_attribute {
+       u2 attribute_name_index;
+          u4 attribute_length;
+          u2 line_number_table_length;
+          {
+              u2 start_pc;
+                  u2 line_number;
+          } line_number_table[line_number_table_length];
+   }
+
+*******************************************************************************/
+
+bool method_load(classbuffer *cb, methodinfo *m, descriptor_pool *descpool)
+{
+       classinfo *c;
+       int argcount;
+       s4         i, j, k, l;
+       utf       *u;
+       u2         name_index;
+       u2         descriptor_index;
+       u2         attributes_count;
+       u2         attribute_name_index;
+       utf       *attribute_name;
+       u2         code_attributes_count;
+       u2         code_attribute_name_index;
+       utf       *code_attribute_name;
+
+       /* get classinfo */
+
+       c = cb->class;
+
+       LOCK_INIT_OBJECT_LOCK(&(m->header));
+
+#if defined(ENABLE_STATISTICS)
+       if (opt_stat)
+               count_all_methods++;
+#endif
+
+       /* all fields of m have been zeroed in load_class_from_classbuffer */
+
+       m->class = c;
+       
+       if (!suck_check_classbuffer_size(cb, 2 + 2 + 2))
+               return false;
+
+       /* access flags */
+
+       m->flags = suck_u2(cb);
+
+       /* name */
+
+       name_index = suck_u2(cb);
+
+       if (!(u = class_getconstant(c, name_index, CONSTANT_Utf8)))
+               return false;
+
+       m->name = u;
+
+       /* descriptor */
+
+       descriptor_index = suck_u2(cb);
+
+       if (!(u = class_getconstant(c, descriptor_index, CONSTANT_Utf8)))
+               return false;
+
+       m->descriptor = u;
+
+       if (!descriptor_pool_add(descpool, u, &argcount))
+               return false;
+
+#ifdef ENABLE_VERIFIER
+       if (opt_verify) {
+               if (!is_valid_name_utf(m->name)) {
+                       exceptions_throw_classformaterror(c, "Method with invalid name");
+                       return false;
+               }
+
+               if (m->name->text[0] == '<' &&
+                       m->name != utf_init && m->name != utf_clinit) {
+                       exceptions_throw_classformaterror(c, "Method with invalid special name");
+                       return false;
+               }
+       }
+#endif /* ENABLE_VERIFIER */
+       
+       if (!(m->flags & ACC_STATIC))
+               argcount++; /* count the 'this' argument */
+
+#ifdef ENABLE_VERIFIER
+       if (opt_verify) {
+               if (argcount > 255) {
+                       exceptions_throw_classformaterror(c, "Too many arguments in signature");
+                       return false;
+               }
+
+               /* check flag consistency */
+               if (m->name != utf_clinit) {
+                       i = (m->flags & (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED));
+
+                       if (i != 0 && i != ACC_PUBLIC && i != ACC_PRIVATE && i != ACC_PROTECTED) {
+                               exceptions_throw_classformaterror(c,
+                                                                                                 "Illegal method modifiers: 0x%X",
+                                                                                                 m->flags);
+                               return false;
+                       }
+
+                       if (m->flags & ACC_ABSTRACT) {
+                               if ((m->flags & (ACC_FINAL | ACC_NATIVE | ACC_PRIVATE |
+                                                                ACC_STATIC | ACC_STRICT | ACC_SYNCHRONIZED))) {
+                                       exceptions_throw_classformaterror(c,
+                                                                                                         "Illegal method modifiers: 0x%X",
+                                                                                                         m->flags);
+                                       return false;
+                               }
+                       }
+
+                       if (c->flags & ACC_INTERFACE) {
+                               if ((m->flags & (ACC_ABSTRACT | ACC_PUBLIC)) != (ACC_ABSTRACT | ACC_PUBLIC)) {
+                                       exceptions_throw_classformaterror(c,
+                                                                                                         "Illegal method modifiers: 0x%X",
+                                                                                                         m->flags);
+                                       return false;
+                               }
+                       }
+
+                       if (m->name == utf_init) {
+                               if (m->flags & (ACC_STATIC | ACC_FINAL | ACC_SYNCHRONIZED |
+                                                               ACC_NATIVE | ACC_ABSTRACT)) {
+                                       exceptions_throw_classformaterror(c, "Instance initialization method has invalid flags set");
+                                       return false;
+                               }
+                       }
+               }
+       }
+#endif /* ENABLE_VERIFIER */
+
+       /* mark the method as monomorphic until further notice */
+
+       m->flags |= ACC_METHOD_MONOMORPHIC;
+
+       /* non-abstract methods have an implementation in this class */
+
+       if (!(m->flags & ACC_ABSTRACT))
+               m->flags |= ACC_METHOD_IMPLEMENTED;
+               
+       if (!suck_check_classbuffer_size(cb, 2))
+               return false;
+
+       /* attributes count */
+
+       attributes_count = suck_u2(cb);
+
+       for (i = 0; i < attributes_count; i++) {
+               if (!suck_check_classbuffer_size(cb, 2))
+                       return false;
+
+               /* attribute name index */
+
+               attribute_name_index = suck_u2(cb);
+
+               attribute_name =
+                       class_getconstant(c, attribute_name_index, CONSTANT_Utf8);
+
+               if (attribute_name == NULL)
+                       return false;
+
+               if (attribute_name == utf_Code) {
+                       /* Code */
+
+                       if (m->flags & (ACC_ABSTRACT | ACC_NATIVE)) {
+                               exceptions_throw_classformaterror(c, "Code attribute in native or abstract methods");
+                               return false;
+                       }
+                       
+                       if (m->jcode) {
+                               exceptions_throw_classformaterror(c, "Multiple Code attributes");
+                               return false;
+                       }
+
+                       if (!suck_check_classbuffer_size(cb, 4 + 2 + 2))
+                               return false;
+
+                       suck_u4(cb);
+                       m->maxstack = suck_u2(cb);
+                       m->maxlocals = suck_u2(cb);
+
+                       if (m->maxlocals < argcount) {
+                               exceptions_throw_classformaterror(c, "Arguments can't fit into locals");
+                               return false;
+                       }
+                       
+                       if (!suck_check_classbuffer_size(cb, 4))
+                               return false;
+
+                       m->jcodelength = suck_u4(cb);
+
+                       if (m->jcodelength == 0) {
+                               exceptions_throw_classformaterror(c, "Code of a method has length 0");
+                               return false;
+                       }
+                       
+                       if (m->jcodelength > 65535) {
+                               exceptions_throw_classformaterror(c, "Code of a method longer than 65535 bytes");
+                               return false;
+                       }
+
+                       if (!suck_check_classbuffer_size(cb, m->jcodelength))
+                               return false;
+
+                       m->jcode = MNEW(u1, m->jcodelength);
+                       suck_nbytes(m->jcode, cb, m->jcodelength);
+
+                       if (!suck_check_classbuffer_size(cb, 2))
+                               return false;
+
+                       m->rawexceptiontablelength = suck_u2(cb);
+                       if (!suck_check_classbuffer_size(cb, (2 + 2 + 2 + 2) * m->rawexceptiontablelength))
+                               return false;
+
+                       m->rawexceptiontable = MNEW(raw_exception_entry, m->rawexceptiontablelength);
+
+#if defined(ENABLE_STATISTICS)
+                       if (opt_stat) {
+                               count_vmcode_len += m->jcodelength + 18;
+                               count_extable_len +=
+                                       m->rawexceptiontablelength * sizeof(raw_exception_entry);
+                       }
+#endif
+
+                       for (j = 0; j < m->rawexceptiontablelength; j++) {
+                               u4 idx;
+                               m->rawexceptiontable[j].startpc   = suck_u2(cb);
+                               m->rawexceptiontable[j].endpc     = suck_u2(cb);
+                               m->rawexceptiontable[j].handlerpc = suck_u2(cb);
+
+                               idx = suck_u2(cb);
+
+                               if (!idx) {
+                                       m->rawexceptiontable[j].catchtype.any = NULL;
+                               }
+                               else {
+                                       /* the classref is created later */
+                                       if (!(m->rawexceptiontable[j].catchtype.any =
+                                                 (utf *) class_getconstant(c, idx, CONSTANT_Class)))
+                                               return false;
+                               }
+                       }
+
+                       if (!suck_check_classbuffer_size(cb, 2))
+                               return false;
+
+                       /* code attributes count */
+
+                       code_attributes_count = suck_u2(cb);
+
+                       for (k = 0; k < code_attributes_count; k++) {
+                               if (!suck_check_classbuffer_size(cb, 2))
+                                       return false;
+
+                               /* code attribute name index */
+
+                               code_attribute_name_index = suck_u2(cb);
+
+                               code_attribute_name =
+                                       class_getconstant(c, code_attribute_name_index, CONSTANT_Utf8);
+
+                               if (code_attribute_name == NULL)
+                                       return false;
+
+                               /* check which code attribute */
+
+                               if (code_attribute_name == utf_LineNumberTable) {
+                                       /* LineNumberTable */
+
+                                       if (!suck_check_classbuffer_size(cb, 4 + 2))
+                                               return false;
+
+                                       /* attribute length */
+
+                                       (void) suck_u4(cb);
+
+                                       /* line number table length */
+
+                                       m->linenumbercount = suck_u2(cb);
+
+                                       if (!suck_check_classbuffer_size(cb,
+                                                                                               (2 + 2) * m->linenumbercount))
+                                               return false;
+
+                                       m->linenumbers = MNEW(lineinfo, m->linenumbercount);
+
+#if defined(ENABLE_STATISTICS)
+                                       if (opt_stat)
+                                               size_lineinfo += sizeof(lineinfo) * m->linenumbercount;
+#endif
+                                       
+                                       for (l = 0; l < m->linenumbercount; l++) {
+                                               m->linenumbers[l].start_pc    = suck_u2(cb);
+                                               m->linenumbers[l].line_number = suck_u2(cb);
+                                       }
+                               }
+#if defined(ENABLE_JAVASE)
+                               else if (code_attribute_name == utf_StackMapTable) {
+                                       /* StackTableMap */
+
+                                       if (!stackmap_load_attribute_stackmaptable(cb, m))
+                                               return false;
+                               }
+#endif
+                               else {
+                                       /* unknown code attribute */
+
+                                       if (!loader_skip_attribute_body(cb))
+                                               return false;
+                               }
+                       }
+               }
+               else if (attribute_name == utf_Exceptions) {
+                       /* Exceptions */
+
+                       if (m->thrownexceptions != NULL) {
+                               exceptions_throw_classformaterror(c, "Multiple Exceptions attributes");
+                               return false;
+                       }
+
+                       if (!suck_check_classbuffer_size(cb, 4 + 2))
+                               return false;
+
+                       /* attribute length */
+
+                       (void) suck_u4(cb);
+
+                       m->thrownexceptionscount = suck_u2(cb);
+
+                       if (!suck_check_classbuffer_size(cb, 2 * m->thrownexceptionscount))
+                               return false;
+
+                       m->thrownexceptions = MNEW(classref_or_classinfo, m->thrownexceptionscount);
+
+                       for (j = 0; j < m->thrownexceptionscount; j++) {
+                               /* the classref is created later */
+                               if (!((m->thrownexceptions)[j].any =
+                                         (utf*) class_getconstant(c, suck_u2(cb), CONSTANT_Class)))
+                                       return false;
+                       }
+               }
+#if defined(ENABLE_JAVASE)
+               else if (attribute_name == utf_Signature) {
+                       /* Signature */
+
+                       if (!loader_load_attribute_signature(cb, &(m->signature)))
+                               return false;
+               }
+#endif
+               else {
+                       /* unknown attribute */
+
+                       if (!loader_skip_attribute_body(cb))
+                               return false;
+               }
+       }
+
+       if ((m->jcode == NULL) && !(m->flags & (ACC_ABSTRACT | ACC_NATIVE))) {
+               exceptions_throw_classformaterror(c, "Missing Code attribute");
+               return false;
+       }
+
+#if defined(ENABLE_REPLACEMENT)
+       /* initialize the hit countdown field */
+
+       m->hitcountdown = METHOD_INITIAL_HIT_COUNTDOWN;
+#endif
+
+       /* everything was ok */
+
+       return true;
+}
+
+
 /* method_free *****************************************************************
 
    Frees all memory that was allocated for this method.
index 19a50228d5d55e2b054f8fdba4b52d86194e1a09..282db25bf0882e9d2865ac7d6134bda9c4b860df 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: method.h 8123 2007-06-20 23:50:55Z michi $
+   $Id: method.h 8231 2007-07-25 14:21:24Z twisti $
 */
 
 
@@ -46,6 +46,7 @@ typedef struct codeinfo            codeinfo;
 #include "vmcore/descriptor.h"
 #include "vmcore/references.h"
 #include "vmcore/linker.h"
+#include "vmcore/loader.h"
 
 #if defined(ENABLE_JAVASE)
 # include "vmcore/stackmap.h"
@@ -157,6 +158,7 @@ struct lineinfo {
 
 /* function prototypes ********************************************************/
 
+bool method_load(classbuffer *cb, methodinfo *m, descriptor_pool *descpool);
 void method_free(methodinfo *m);
 bool method_canoverwrite(methodinfo *m, methodinfo *old);
 
index f95286c2ff989f4cef76ec7ce115b618ec69d7e3..a55fbbdd9d033ee5a790a3f69ec8caf099d337c6 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: options.c 8174 2007-07-01 17:49:25Z twisti $
+   $Id: options.c 8236 2007-07-27 10:18:17Z twisti $
 
 */
 
@@ -120,7 +120,6 @@ bool opt_getcompilingtime = false; /* compute compile time                   */
 #if defined(ENABLE_VERIFIER)
 bool opt_verify  = true;       /* true if classfiles should be verified      */
 #endif
-bool opt_eager   = false;
 
 #if defined(ENABLE_PROFILING)
 bool opt_prof    = false;
@@ -133,7 +132,6 @@ bool opt_prof_bb = false;
 #if defined(ENABLE_INLINING)
 bool opt_inlining = false;
 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
-s4 opt_replace_verbose = 0;
 s4 opt_inline_debug_min_size = 0;
 s4 opt_inline_debug_max_size = INT_MAX;
 s4 opt_inline_debug_end_counter = INT_MAX;
@@ -179,41 +177,68 @@ const char *opt_filter_show_method = 0;
 
 /* NOTE: For better readability keep these alpha-sorted. */
 
+int32_t  opt_DebugStackFrameInfo       = 0;
+int32_t  opt_DebugStackTrace           = 0;
 int32_t  opt_MaxPermSize               = 0;
 int32_t  opt_PermSize                  = 0;
+int      opt_PrintConfig               = 0;
 int32_t  opt_ProfileGCMemoryUsage      = 0;
 int32_t  opt_ProfileMemoryUsage        = 0;
 FILE    *opt_ProfileMemoryUsageGNUPlot = NULL;
 int32_t  opt_ThreadStackSize           = 0;
 int32_t  opt_TraceExceptions           = 0;
+int32_t  opt_TraceJavaCalls            = 0;
+int32_t  opt_TraceJNICalls             = 0;
+int32_t  opt_TraceJVMCalls             = 0;
 #if defined(ENABLE_REPLACEMENT)
 int32_t  opt_TraceReplacement          = 0;
 #endif
 
 
 enum {
+       OPT_TYPE_BOOLEAN,
+       OPT_TYPE_VALUE
+};
+
+enum {
+       OPT_DebugStackFrameInfo,
+       OPT_DebugStackTrace,
        OPT_MaxPermSize,
        OPT_PermSize,
+       OPT_PrintConfig,
        OPT_ProfileGCMemoryUsage,
        OPT_ProfileMemoryUsage,
        OPT_ProfileMemoryUsageGNUPlot,
        OPT_ThreadStackSize,
        OPT_TraceExceptions,
+       OPT_TraceJavaCalls,
+       OPT_TraceJNICalls,
+       OPT_TraceJVMCalls,
        OPT_TraceReplacement
 };
 
 
 option_t options_XX[] = {
-       { "MaxPermSize",               OPT_MaxPermSize,               "" },
-       { "PermSize",                  OPT_PermSize,                  "" },
-       { "ProfileGCMemoryUsage",      OPT_ProfileGCMemoryUsage,      "" },
-       { "ProfileMemoryUsage",        OPT_ProfileMemoryUsage,        "" },
-       { "ProfileMemoryUsageGNUPlot", OPT_ProfileMemoryUsageGNUPlot, "" },
-       { "ThreadStackSize",           OPT_ThreadStackSize,           "" },
-       { "TraceExceptions",           OPT_TraceExceptions,           "" },
+       { "DebugStackFrameInfo",       OPT_DebugStackFrameInfo,       OPT_TYPE_BOOLEAN, "TODO" },
+       { "DebugStackTrace",           OPT_DebugStackTrace,           OPT_TYPE_BOOLEAN, "TODO" },
+       { "MaxPermSize",               OPT_MaxPermSize,               OPT_TYPE_VALUE,   "not implemented" },
+       { "PermSize",                  OPT_PermSize,                  OPT_TYPE_VALUE,   "not implemented" },
+       { "PrintConfig",               OPT_PrintConfig,               OPT_TYPE_BOOLEAN, "print VM configuration" },
+       { "ProfileGCMemoryUsage",      OPT_ProfileGCMemoryUsage,      OPT_TYPE_VALUE,   "profiles GC memory usage in the given interval, <value> is in seconds (default: 5)" },
+       { "ProfileMemoryUsage",        OPT_ProfileMemoryUsage,        OPT_TYPE_VALUE,   "TODO" },
+       { "ProfileMemoryUsageGNUPlot", OPT_ProfileMemoryUsageGNUPlot, OPT_TYPE_VALUE,   "TODO" },
+       { "ThreadStackSize",           OPT_ThreadStackSize,           OPT_TYPE_VALUE,   "TODO" },
+       { "TraceExceptions",           OPT_TraceExceptions,           OPT_TYPE_BOOLEAN, "TODO" },
+       { "TraceJavaCalls",            OPT_TraceJavaCalls,            OPT_TYPE_BOOLEAN, "trace Java method calls" },
+       { "TraceJNICalls",             OPT_TraceJNICalls,             OPT_TYPE_BOOLEAN, "trace JNI method calls" },
+       { "TraceJVMCalls",             OPT_TraceJVMCalls,             OPT_TYPE_BOOLEAN, "TODO" },
 #if defined(ENABLE_REPLACEMENT)
-       { "TraceReplacement",          OPT_TraceReplacement,          "" },
+       { "TraceReplacement",          OPT_TraceReplacement,          OPT_TYPE_VALUE,   "trace on-stack replacement with the given verbosity level (default: 1)" },
 #endif
+
+       /* end marker */
+
+       { NULL,                        -1,                            -1, NULL }
 };
 
 
@@ -299,6 +324,77 @@ s4 options_get(opt_struct *opts, JavaVMInitArgs *vm_args)
 }
 
 
+/* options_xxusage *************************************************************
+
+   Print usage message for debugging options.
+
+*******************************************************************************/
+
+static void options_xxusage(void)
+{
+       option_t *opt;
+       int       length;
+       int       i;
+       char     *c;
+
+       for (opt = options_XX; opt->name != NULL; opt++) {
+               printf("    -XX:");
+
+               switch (opt->type) {
+               case OPT_TYPE_BOOLEAN:
+                       printf("+%s", opt->name);
+                       length = strlen("    -XX:+") + strlen(opt->name);
+                       break;
+               case OPT_TYPE_VALUE:
+                       printf("%s=<value>", opt->name);
+                       length = strlen("    -XX:") + strlen(opt->name) + strlen("=<value>");
+                       break;
+               }
+
+               /* Check if the help fits into one 80-column line.
+                  Documentation starts at column 29. */
+
+               if (length < (29 - 1)) {
+                       /* Print missing spaces up to column 29. */
+
+                       for (i = length; i < 29; i++)
+                               printf(" ");
+               }
+               else {
+                       printf("\n");
+                       printf("                             "); /* 29 spaces */
+               }
+
+               /* Check documentation length. */
+
+               length = strlen(opt->doc);
+
+               if (length < (80 - 29)) {
+                       printf("%s", opt->doc);
+               }
+               else {
+                       for (c = opt->doc, i = 29; *c != 0; c++, i++) {
+                               /* If we are at the end of the line, break it. */
+
+                               if (i == 80) {
+                                       printf("\n");
+                                       printf("                             "); /* 29 spaces */
+                                       i = 29;
+                               }
+
+                               printf("%c", *c);
+                       }
+               }
+
+               printf("\n");
+       }
+
+       /* exit with error code */
+
+       exit(1);
+}
+
+
 /* options_xx ******************************************************************
 
    Handle -XX: options.
@@ -309,13 +405,17 @@ void options_xx(const char *name)
 {
        const char *start;
        char       *end;
-       int32_t     length;
-       int32_t     enable;
+       int         length;
+       int         enable;
        char       *value;
-       int32_t     option;
+       option_t   *opt;
        char       *filename;
        FILE       *file;
-       int32_t     i;
+
+       /* Check for help (-XX), in this case name is NULL. */
+
+       if (name == NULL)
+               options_xxusage();
 
        /* Check if the option is a boolean option. */
 
@@ -348,18 +448,39 @@ void options_xx(const char *name)
 
        /* search the option in the option array */
 
-       option = OPT_ERROR;
+       for (opt = options_XX; opt->name != NULL; opt++) {
+               if (strncmp(opt->name, start, length) == 0) {
+                       /* Check if the options passed fits to the type. */
+
+                       switch (opt->type) {
+                       case OPT_TYPE_BOOLEAN:
+                               if ((enable == -1) || (value != NULL))
+                                       options_xxusage();
+                               break;
+                       case OPT_TYPE_VALUE:
+                               if ((enable != -1) || (value == NULL))
+                                       options_xxusage();
+                               break;
+                       default:
+                               vm_abort("options_xx: unknown option type %d for option %s",
+                                                opt->type, opt->name);
+                       }
 
-       for (i = 0; options_XX[i].name != NULL; i++) {
-               if (strncmp(options_XX[i].name, start, length) == 0) {
-                       option = options_XX[i].option;
                        break;
                }
        }
 
        /* process the option */
 
-       switch (option) {
+       switch (opt->value) {
+       case OPT_DebugStackFrameInfo:
+               opt_DebugStackFrameInfo = enable;
+               break;
+
+       case OPT_DebugStackTrace:
+               opt_DebugStackTrace = enable;
+               break;
+
        case OPT_MaxPermSize:
                /* currently ignored */
                break;
@@ -368,6 +489,10 @@ void options_xx(const char *name)
                /* currently ignored */
                break;
 
+       case OPT_PrintConfig:
+               vm_printconfig();
+               break;
+
        case OPT_ProfileGCMemoryUsage:
                if (value == NULL)
                        opt_ProfileGCMemoryUsage = 5;
@@ -410,6 +535,19 @@ void options_xx(const char *name)
                opt_TraceExceptions = enable;
                break;
 
+       case OPT_TraceJavaCalls:
+               opt_verbosecall = enable;
+               opt_TraceJavaCalls = enable;
+               break;
+
+       case OPT_TraceJNICalls:
+               opt_TraceJNICalls = enable;
+               break;
+
+       case OPT_TraceJVMCalls:
+               opt_TraceJVMCalls = enable;
+               break;
+
 #if defined(ENABLE_REPLACEMENT)
        case OPT_TraceReplacement:
                if (value == NULL)
@@ -420,7 +558,7 @@ void options_xx(const char *name)
 #endif
 
        default:
-               printf("Unknown option: -XX:%s\n", name);
+               printf("Unknown -XX option: %s\n", name);
                break;
        }
 }
index 049a47079f9b33079696d2c6e2fb4c5e519dc4c4..dd319945c81ad9b7b4b0172543577a0b0f13d5d7 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: options.h 8134 2007-06-22 14:49:10Z twisti $
+   $Id: options.h 8236 2007-07-27 10:18:17Z twisti $
 
 */
 
@@ -63,9 +63,10 @@ struct opt_struct {
 typedef struct option_t option_t;
 
 struct option_t {
-       char    *name;
-       int32_t  option;
-       char    *doc;
+       char *name;
+       int   value;
+       int   type;
+       char *doc;
 };
 
 
@@ -134,7 +135,6 @@ extern bool opt_getcompilingtime;
 #if defined(ENABLE_VERIFIER)
 extern bool opt_verify;
 #endif
-extern bool opt_eager;
 
 #if defined(ENABLE_PROFILING)
 extern bool opt_prof;
@@ -146,7 +146,6 @@ extern bool opt_prof_bb;
 #if defined(ENABLE_INLINING)
 extern bool opt_inlining;
 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
-extern s4 opt_replace_verbose;
 extern s4 opt_inline_debug_min_size;
 extern s4 opt_inline_debug_max_size;
 extern s4 opt_inline_debug_end_counter;
@@ -193,13 +192,19 @@ extern const char *opt_filter_show_method;
 
 /* NOTE: For better readability keep these alpha-sorted. */
 
+extern int32_t  opt_DebugStackFrameInfo;
+extern int32_t  opt_DebugStackTrace;
 extern int32_t  opt_MaxPermSize;
 extern int32_t  opt_PermSize;
+extern int      opt_PrintConfig;
 extern int32_t  opt_ProfileGCMemoryUsage;
 extern int32_t  opt_ProfileMemoryUsage;
 extern FILE    *opt_ProfileMemoryUsageGNUPlot;
 extern int32_t  opt_ThreadStackSize;
 extern int32_t  opt_TraceExceptions;
+extern int32_t  opt_TraceJavaCalls;
+extern int32_t  opt_TraceJNICalls;
+extern int32_t  opt_TraceJVMCalls;
 #if defined(ENABLE_REPLACEMENT)
 extern int32_t  opt_TraceReplacement;
 #endif
index ba2b3e258ca3c44cad5d52210763d8c6a008102e..8d39343b315e2880e8b4485195cf07cdea130f8c 100644 (file)
@@ -30,8 +30,7 @@
 #include "config.h"
 
 #include <assert.h>
-
-#include "vm/types.h"
+#include <stdint.h>
 
 #include "vm/global.h"
 
@@ -82,7 +81,7 @@ bool primitive_init(void)
        utf       *name;
        classinfo *c;
        utf       *u;
-       s4         i;
+       int        i;
 
        for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
                /* skip dummies */
@@ -153,26 +152,6 @@ bool primitive_init(void)
 }
 
 
-/* primitive_class_is_primitive ************************************************
-
-   Check if the given class is a primitive class.
-
-*******************************************************************************/
-
-bool primitive_class_is_primitive(classinfo *c)
-{
-       s4 i;
-
-       /* search table of primitive classes */
-
-       for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
-               if (primitivetype_table[i].class_primitive == c)
-                       return true;
-
-       return false;
-}
-
-
 /* primitive_class_get_by_name *************************************************
 
    Returns the primitive class of the given class name.
@@ -181,7 +160,7 @@ bool primitive_class_is_primitive(classinfo *c)
 
 classinfo *primitive_class_get_by_name(utf *name)
 {
-       s4 i;
+       int i;
 
        /* search table of primitive classes */
 
@@ -201,7 +180,7 @@ classinfo *primitive_class_get_by_name(utf *name)
 
 *******************************************************************************/
 
-classinfo *primitive_class_get_by_type(s4 type)
+classinfo *primitive_class_get_by_type(int32_t type)
 {
        return primitivetype_table[type].class_primitive;
 }
@@ -215,7 +194,7 @@ classinfo *primitive_class_get_by_type(s4 type)
 
 classinfo *primitive_class_get_by_char(char ch)
 {
-       s4 index;
+       int32_t index;
 
        switch (ch) {
        case 'I':
@@ -253,13 +232,36 @@ classinfo *primitive_class_get_by_char(char ch)
 }
 
 
+/* primitive_arrayclass_get_by_name ********************************************
+
+   Returns the primitive array-class of the given primitive class
+   name.
+
+*******************************************************************************/
+
+classinfo *primitive_arrayclass_get_by_name(utf *name)
+{
+       int i;
+
+       /* search table of primitive classes */
+
+       for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
+               if (primitivetype_table[i].name == name)
+                       return primitivetype_table[i].arrayclass;
+
+       /* keep compiler happy */
+
+       return NULL;
+}
+
+
 /* primitive_arrayclass_get_by_type ********************************************
 
    Returns the primitive array-class of the given type.
 
 *******************************************************************************/
 
-classinfo *primitive_arrayclass_get_by_type(s4 type)
+classinfo *primitive_arrayclass_get_by_type(int32_t type)
 {
        return primitivetype_table[type].arrayclass;
 }
index eb04084c7892466e87da7b10706d723222e1e3eb..f9feb5103c7c844a73ef3ba59ef8218681125834 100644 (file)
@@ -32,6 +32,8 @@
 
 #include "config.h"
 
+#include <stdint.h>
+
 #include "vm/global.h"
 
 #include "vmcore/class.h"
@@ -103,11 +105,11 @@ extern primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT];
 /* function prototypes ********************************************************/
 
 bool       primitive_init(void);
-bool       primitive_class_is_primitive(classinfo *c);
 classinfo *primitive_class_get_by_name(utf *name);
-classinfo *primitive_class_get_by_type(s4 type);
+classinfo *primitive_class_get_by_type(int32_t type);
 classinfo *primitive_class_get_by_char(char ch);
-classinfo *primitive_arrayclass_get_by_type(s4 type);
+classinfo *primitive_arrayclass_get_by_name(utf *name);
+classinfo *primitive_arrayclass_get_by_type(int32_t type);
 
 #endif /* _PRIMITIVE_H */
 
index 75323a87f0106159773d25a78f79050026c61073..2a40b363ed89cd358bc8295ca5dad48d88a6bb2f 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: statistics.c 8123 2007-06-20 23:50:55Z michi $
+   $Id: statistics.c 8199 2007-07-13 00:39:49Z michi $
 
 */
 
@@ -103,6 +103,8 @@ s4 size_lock_record      = 0;
 s4 size_lock_hashtable   = 0;
 s4 size_lock_waiter      = 0;
 
+s4 size_patchref         = 0;
+
 u8 count_calls_java_to_native = 0;
 u8 count_calls_native_to_java = 0;
 
@@ -697,6 +699,7 @@ void statistics_print_memory_usage(void)
        log_println("lock record:            %10d", size_lock_record);
        log_println("lock hashtable:         %10d", size_lock_hashtable);
        log_println("lock waiter:            %10d", size_lock_waiter);
+       log_println("patcher references:     %10d", size_patchref);
        log_println("                         ----------");
 
        sum =
@@ -714,7 +717,8 @@ void statistics_print_memory_usage(void)
                size_threadobject +
                size_lock_record +
                size_lock_hashtable +
-               size_lock_waiter;
+               size_lock_waiter +
+               size_patchref;
 
        log_println("                        %10d", sum);
        log_println("");
index 74b4d486fc6dc3a8de3f44a4453a70a2bc81dca5..a5b25d080dac378594ec6b21cdcb787bbebf8dab 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: statistics.h 8123 2007-06-20 23:50:55Z michi $
+   $Id: statistics.h 8199 2007-07-13 00:39:49Z michi $
 
 */
 
@@ -106,6 +106,8 @@ extern s4 size_lock_record;
 extern s4 size_lock_hashtable;
 extern s4 size_lock_waiter;
 
+extern s4 size_patchref;
+
 extern u8 count_calls_java_to_native;
 extern u8 count_calls_native_to_java;
 
index 48613d720278afe1d2752e5dce8bba980e5f5570..f46d243cf479667634995f6c97082593539abcbc 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: suck.c 7813 2007-04-25 19:20:13Z twisti $
+   $Id: suck.c 8236 2007-07-27 10:18:17Z twisti $
 
 */
 
@@ -322,6 +322,11 @@ void suck_add_from_property(char *key)
                                        /* (We use `free` as the memory came from the C library.) */
 
                                        free(namelist[i]);
+
+#if defined(ENABLE_JAVASE)
+                                       properties_add("java.boot.class.path", _Jv_bootclasspath);
+                                       properties_add("sun.boot.class.path", _Jv_bootclasspath);
+#endif
                                }
                        }