Mon, 11 Mar 2013 15:37:10 +0100
Merge
1.1 --- a/.hgtags Mon Mar 11 12:56:00 2013 +0000 1.2 +++ b/.hgtags Mon Mar 11 15:37:10 2013 +0100 1.3 @@ -320,3 +320,5 @@ 1.4 555ec35a250783110aa070dbc8a8603f6cabe41f hs25-b20 1.5 6691814929b606fe0e7954fd6e485dd876505c83 jdk8-b79 1.6 df5396524152118535c36da5801d828b560d19a2 hs25-b21 1.7 +4a198b201f3ce84433fa94a3ca65d061473e7c4c jdk8-b80 1.8 +dd6350b4abc4a6c19c89dd982cc0e4f3d119885c hs25-b22
2.1 --- a/agent/src/os/bsd/MacosxDebuggerLocal.m Mon Mar 11 12:56:00 2013 +0000 2.2 +++ b/agent/src/os/bsd/MacosxDebuggerLocal.m Mon Mar 11 15:37:10 2013 +0100 2.3 @@ -160,7 +160,7 @@ 2.4 CHECK_EXCEPTION_(0); 2.5 2.6 unsigned long alignedAddress; 2.7 - unsigned long alignedLength; 2.8 + unsigned long alignedLength = 0; 2.9 kern_return_t result; 2.10 vm_offset_t *pages; 2.11 int *mapped; 2.12 @@ -630,7 +630,7 @@ 2.13 /* Couldn't find entry point. error_message should contain some 2.14 * platform dependent error message. 2.15 */ 2.16 - THROW_NEW_DEBUGGER_EXCEPTION(error_message); 2.17 + THROW_NEW_DEBUGGER_EXCEPTION_(error_message, (jlong)func); 2.18 } 2.19 return (jlong)func; 2.20 }
3.1 --- a/agent/src/os/linux/LinuxDebuggerLocal.c Mon Mar 11 12:56:00 2013 +0000 3.2 +++ b/agent/src/os/linux/LinuxDebuggerLocal.c Mon Mar 11 15:37:10 2013 +0100 3.3 @@ -1,5 +1,5 @@ 3.4 /* 3.5 - * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. 3.6 + * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. 3.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3.8 * 3.9 * This code is free software; you can redistribute it and/or modify it 3.10 @@ -25,6 +25,13 @@ 3.11 #include <jni.h> 3.12 #include "libproc.h" 3.13 3.14 +#include <elf.h> 3.15 +#include <sys/types.h> 3.16 +#include <sys/stat.h> 3.17 +#include <fcntl.h> 3.18 +#include <string.h> 3.19 +#include <limits.h> 3.20 + 3.21 #if defined(x86_64) && !defined(amd64) 3.22 #define amd64 1 3.23 #endif 3.24 @@ -154,6 +161,39 @@ 3.25 } 3.26 } 3.27 3.28 + 3.29 +/* 3.30 + * Verify that a named ELF binary file (core or executable) has the same 3.31 + * bitness as ourselves. 3.32 + * Throw an exception if there is a mismatch or other problem. 3.33 + * 3.34 + * If we proceed using a mismatched debugger/debuggee, the best to hope 3.35 + * for is a missing symbol, the worst is a crash searching for debug symbols. 3.36 + */ 3.37 +void verifyBitness(JNIEnv *env, const char *binaryName) { 3.38 + int fd = open(binaryName, O_RDONLY); 3.39 + if (fd < 0) { 3.40 + THROW_NEW_DEBUGGER_EXCEPTION("cannot open binary file"); 3.41 + } 3.42 + unsigned char elf_ident[EI_NIDENT]; 3.43 + int i = read(fd, &elf_ident, sizeof(elf_ident)); 3.44 + close(fd); 3.45 + 3.46 + if (i < 0) { 3.47 + THROW_NEW_DEBUGGER_EXCEPTION("cannot read binary file"); 3.48 + } 3.49 +#ifndef _LP64 3.50 + if (elf_ident[EI_CLASS] == ELFCLASS64) { 3.51 + THROW_NEW_DEBUGGER_EXCEPTION("debuggee is 64 bit, use 64-bit java for debugger"); 3.52 + } 3.53 +#else 3.54 + if (elf_ident[EI_CLASS] != ELFCLASS64) { 3.55 + THROW_NEW_DEBUGGER_EXCEPTION("debuggee is 32 bit, use 32 bit java for debugger"); 3.56 + } 3.57 +#endif 3.58 +} 3.59 + 3.60 + 3.61 /* 3.62 * Class: sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal 3.63 * Method: attach0 3.64 @@ -162,6 +202,12 @@ 3.65 JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLocal_attach0__I 3.66 (JNIEnv *env, jobject this_obj, jint jpid) { 3.67 3.68 + // For bitness checking, locate binary at /proc/jpid/exe 3.69 + char buf[PATH_MAX]; 3.70 + snprintf((char *) &buf, PATH_MAX, "/proc/%d/exe", jpid); 3.71 + verifyBitness(env, (char *) &buf); 3.72 + CHECK_EXCEPTION; 3.73 + 3.74 struct ps_prochandle* ph; 3.75 if ( (ph = Pgrab(jpid)) == NULL) { 3.76 THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process"); 3.77 @@ -187,6 +233,9 @@ 3.78 coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy); 3.79 CHECK_EXCEPTION; 3.80 3.81 + verifyBitness(env, execName_cstr); 3.82 + CHECK_EXCEPTION; 3.83 + 3.84 if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) { 3.85 (*env)->ReleaseStringUTFChars(env, execName, execName_cstr); 3.86 (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
4.1 --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Mon Mar 11 12:56:00 2013 +0000 4.2 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java Mon Mar 11 15:37:10 2013 +0100 4.3 @@ -60,8 +60,13 @@ 4.4 return null; 4.5 } 4.6 4.7 + // Check alignment of rbp 4.8 + if ( dbg.getAddressValue(rbp) % ADDRESS_SIZE != 0) { 4.9 + return null; 4.10 + } 4.11 + 4.12 Address nextRBP = rbp.getAddressAt( 0 * ADDRESS_SIZE); 4.13 - if (nextRBP == null) { 4.14 + if (nextRBP == null || nextRBP.lessThanOrEqual(rbp)) { 4.15 return null; 4.16 } 4.17 Address nextPC = rbp.getAddressAt( 1 * ADDRESS_SIZE);
5.1 --- a/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Mon Mar 11 12:56:00 2013 +0000 5.2 +++ b/agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java Mon Mar 11 15:37:10 2013 +0100 5.3 @@ -61,8 +61,13 @@ 5.4 return null; 5.5 } 5.6 5.7 + // Check alignment of ebp 5.8 + if ( dbg.getAddressValue(ebp) % ADDRESS_SIZE != 0) { 5.9 + return null; 5.10 + } 5.11 + 5.12 Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE); 5.13 - if (nextEBP == null) { 5.14 + if (nextEBP == null || nextEBP.lessThanOrEqual(ebp)) { 5.15 return null; 5.16 } 5.17 Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE);
6.1 --- a/make/hotspot_version Mon Mar 11 12:56:00 2013 +0000 6.2 +++ b/make/hotspot_version Mon Mar 11 15:37:10 2013 +0100 6.3 @@ -35,7 +35,7 @@ 6.4 6.5 HS_MAJOR_VER=25 6.6 HS_MINOR_VER=0 6.7 -HS_BUILD_NUMBER=22 6.8 +HS_BUILD_NUMBER=23 6.9 6.10 JDK_MAJOR_VER=1 6.11 JDK_MINOR_VER=8
7.1 --- a/src/os/bsd/vm/os_bsd.cpp Mon Mar 11 12:56:00 2013 +0000 7.2 +++ b/src/os/bsd/vm/os_bsd.cpp Mon Mar 11 15:37:10 2013 +0100 7.3 @@ -2695,7 +2695,7 @@ 7.4 assert(thread->is_VM_thread(), "Must be VMThread"); 7.5 // read current suspend action 7.6 int action = osthread->sr.suspend_action(); 7.7 - if (action == SR_SUSPEND) { 7.8 + if (action == os::Bsd::SuspendResume::SR_SUSPEND) { 7.9 suspend_save_context(osthread, siginfo, context); 7.10 7.11 // Notify the suspend action is about to be completed. do_suspend() 7.12 @@ -2717,12 +2717,12 @@ 7.13 do { 7.14 sigsuspend(&suspend_set); 7.15 // ignore all returns until we get a resume signal 7.16 - } while (osthread->sr.suspend_action() != SR_CONTINUE); 7.17 + } while (osthread->sr.suspend_action() != os::Bsd::SuspendResume::SR_CONTINUE); 7.18 7.19 resume_clear_context(osthread); 7.20 7.21 } else { 7.22 - assert(action == SR_CONTINUE, "unexpected sr action"); 7.23 + assert(action == os::Bsd::SuspendResume::SR_CONTINUE, "unexpected sr action"); 7.24 // nothing special to do - just leave the handler 7.25 } 7.26 7.27 @@ -2776,7 +2776,7 @@ 7.28 // but this seems the normal response to library errors 7.29 static bool do_suspend(OSThread* osthread) { 7.30 // mark as suspended and send signal 7.31 - osthread->sr.set_suspend_action(SR_SUSPEND); 7.32 + osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_SUSPEND); 7.33 int status = pthread_kill(osthread->pthread_id(), SR_signum); 7.34 assert_status(status == 0, status, "pthread_kill"); 7.35 7.36 @@ -2785,18 +2785,18 @@ 7.37 for (int i = 0; !osthread->sr.is_suspended(); i++) { 7.38 os::yield_all(i); 7.39 } 7.40 - osthread->sr.set_suspend_action(SR_NONE); 7.41 + osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE); 7.42 return true; 7.43 } 7.44 else { 7.45 - osthread->sr.set_suspend_action(SR_NONE); 7.46 + osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE); 7.47 return false; 7.48 } 7.49 } 7.50 7.51 static void do_resume(OSThread* osthread) { 7.52 assert(osthread->sr.is_suspended(), "thread should be suspended"); 7.53 - osthread->sr.set_suspend_action(SR_CONTINUE); 7.54 + osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_CONTINUE); 7.55 7.56 int status = pthread_kill(osthread->pthread_id(), SR_signum); 7.57 assert_status(status == 0, status, "pthread_kill"); 7.58 @@ -2806,7 +2806,7 @@ 7.59 os::yield_all(i); 7.60 } 7.61 } 7.62 - osthread->sr.set_suspend_action(SR_NONE); 7.63 + osthread->sr.set_suspend_action(os::Bsd::SuspendResume::SR_NONE); 7.64 } 7.65 7.66 //////////////////////////////////////////////////////////////////////////////// 7.67 @@ -3903,15 +3903,27 @@ 7.68 jlong os::current_thread_cpu_time() { 7.69 #ifdef __APPLE__ 7.70 return os::thread_cpu_time(Thread::current(), true /* user + sys */); 7.71 +#else 7.72 + Unimplemented(); 7.73 + return 0; 7.74 #endif 7.75 } 7.76 7.77 jlong os::thread_cpu_time(Thread* thread) { 7.78 +#ifdef __APPLE__ 7.79 + return os::thread_cpu_time(thread, true /* user + sys */); 7.80 +#else 7.81 + Unimplemented(); 7.82 + return 0; 7.83 +#endif 7.84 } 7.85 7.86 jlong os::current_thread_cpu_time(bool user_sys_cpu_time) { 7.87 #ifdef __APPLE__ 7.88 return os::thread_cpu_time(Thread::current(), user_sys_cpu_time); 7.89 +#else 7.90 + Unimplemented(); 7.91 + return 0; 7.92 #endif 7.93 } 7.94 7.95 @@ -3935,6 +3947,9 @@ 7.96 } else { 7.97 return ((jlong)tinfo.user_time.seconds * 1000000000) + ((jlong)tinfo.user_time.microseconds * (jlong)1000); 7.98 } 7.99 +#else 7.100 + Unimplemented(); 7.101 + return 0; 7.102 #endif 7.103 } 7.104
8.1 --- a/src/os/bsd/vm/os_bsd.hpp Mon Mar 11 12:56:00 2013 +0000 8.2 +++ b/src/os/bsd/vm/os_bsd.hpp Mon Mar 11 15:37:10 2013 +0100 8.3 @@ -1,5 +1,5 @@ 8.4 /* 8.5 - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. 8.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 8.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 8.8 * 8.9 * This code is free software; you can redistribute it and/or modify it 8.10 @@ -151,36 +151,25 @@ 8.11 // for BsdThreads are no longer needed. 8.12 class SuspendResume { 8.13 private: 8.14 - volatile int _suspend_action; 8.15 + volatile int _suspend_action; 8.16 + volatile jint _state; 8.17 + public: 8.18 // values for suspend_action: 8.19 - #define SR_NONE (0x00) 8.20 - #define SR_SUSPEND (0x01) // suspend request 8.21 - #define SR_CONTINUE (0x02) // resume request 8.22 + enum { 8.23 + SR_NONE = 0x00, 8.24 + SR_SUSPEND = 0x01, // suspend request 8.25 + SR_CONTINUE = 0x02, // resume request 8.26 + SR_SUSPENDED = 0x20 // values for _state: + SR_NONE 8.27 + }; 8.28 8.29 - volatile jint _state; 8.30 - // values for _state: + SR_NONE 8.31 - #define SR_SUSPENDED (0x20) 8.32 - public: 8.33 SuspendResume() { _suspend_action = SR_NONE; _state = SR_NONE; } 8.34 8.35 int suspend_action() const { return _suspend_action; } 8.36 void set_suspend_action(int x) { _suspend_action = x; } 8.37 8.38 // atomic updates for _state 8.39 - void set_suspended() { 8.40 - jint temp, temp2; 8.41 - do { 8.42 - temp = _state; 8.43 - temp2 = Atomic::cmpxchg(temp | SR_SUSPENDED, &_state, temp); 8.44 - } while (temp2 != temp); 8.45 - } 8.46 - void clear_suspended() { 8.47 - jint temp, temp2; 8.48 - do { 8.49 - temp = _state; 8.50 - temp2 = Atomic::cmpxchg(temp & ~SR_SUSPENDED, &_state, temp); 8.51 - } while (temp2 != temp); 8.52 - } 8.53 + inline void set_suspended(); 8.54 + inline void clear_suspended(); 8.55 bool is_suspended() { return _state & SR_SUSPENDED; } 8.56 8.57 #undef SR_SUSPENDED
9.1 --- a/src/os/bsd/vm/os_bsd.inline.hpp Mon Mar 11 12:56:00 2013 +0000 9.2 +++ b/src/os/bsd/vm/os_bsd.inline.hpp Mon Mar 11 15:37:10 2013 +0100 9.3 @@ -25,7 +25,6 @@ 9.4 #ifndef OS_BSD_VM_OS_BSD_INLINE_HPP 9.5 #define OS_BSD_VM_OS_BSD_INLINE_HPP 9.6 9.7 -#include "runtime/atomic.hpp" 9.8 #include "runtime/atomic.inline.hpp" 9.9 #include "runtime/os.hpp" 9.10 9.11 @@ -286,4 +285,21 @@ 9.12 const char* optval, socklen_t optlen) { 9.13 return ::setsockopt(fd, level, optname, optval, optlen); 9.14 } 9.15 + 9.16 +inline void os::Bsd::SuspendResume::set_suspended() { 9.17 + jint temp, temp2; 9.18 + do { 9.19 + temp = _state; 9.20 + temp2 = Atomic::cmpxchg(temp | SR_SUSPENDED, &_state, temp); 9.21 + } while (temp2 != temp); 9.22 +} 9.23 + 9.24 +inline void os::Bsd::SuspendResume::clear_suspended() { 9.25 + jint temp, temp2; 9.26 + do { 9.27 + temp = _state; 9.28 + temp2 = Atomic::cmpxchg(temp & ~SR_SUSPENDED, &_state, temp); 9.29 + } while (temp2 != temp); 9.30 +} 9.31 + 9.32 #endif // OS_BSD_VM_OS_BSD_INLINE_HPP
10.1 --- a/src/os/linux/vm/os_linux.cpp Mon Mar 11 12:56:00 2013 +0000 10.2 +++ b/src/os/linux/vm/os_linux.cpp Mon Mar 11 15:37:10 2013 +0100 10.3 @@ -3461,7 +3461,7 @@ 10.4 assert(thread->is_VM_thread(), "Must be VMThread"); 10.5 // read current suspend action 10.6 int action = osthread->sr.suspend_action(); 10.7 - if (action == SR_SUSPEND) { 10.8 + if (action == os::Linux::SuspendResume::SR_SUSPEND) { 10.9 suspend_save_context(osthread, siginfo, context); 10.10 10.11 // Notify the suspend action is about to be completed. do_suspend() 10.12 @@ -3483,12 +3483,12 @@ 10.13 do { 10.14 sigsuspend(&suspend_set); 10.15 // ignore all returns until we get a resume signal 10.16 - } while (osthread->sr.suspend_action() != SR_CONTINUE); 10.17 + } while (osthread->sr.suspend_action() != os::Linux::SuspendResume::SR_CONTINUE); 10.18 10.19 resume_clear_context(osthread); 10.20 10.21 } else { 10.22 - assert(action == SR_CONTINUE, "unexpected sr action"); 10.23 + assert(action == os::Linux::SuspendResume::SR_CONTINUE, "unexpected sr action"); 10.24 // nothing special to do - just leave the handler 10.25 } 10.26 10.27 @@ -3542,7 +3542,7 @@ 10.28 // but this seems the normal response to library errors 10.29 static bool do_suspend(OSThread* osthread) { 10.30 // mark as suspended and send signal 10.31 - osthread->sr.set_suspend_action(SR_SUSPEND); 10.32 + osthread->sr.set_suspend_action(os::Linux::SuspendResume::SR_SUSPEND); 10.33 int status = pthread_kill(osthread->pthread_id(), SR_signum); 10.34 assert_status(status == 0, status, "pthread_kill"); 10.35 10.36 @@ -3551,18 +3551,18 @@ 10.37 for (int i = 0; !osthread->sr.is_suspended(); i++) { 10.38 os::yield_all(i); 10.39 } 10.40 - osthread->sr.set_suspend_action(SR_NONE); 10.41 + osthread->sr.set_suspend_action(os::Linux::SuspendResume::SR_NONE); 10.42 return true; 10.43 } 10.44 else { 10.45 - osthread->sr.set_suspend_action(SR_NONE); 10.46 + osthread->sr.set_suspend_action(os::Linux::SuspendResume::SR_NONE); 10.47 return false; 10.48 } 10.49 } 10.50 10.51 static void do_resume(OSThread* osthread) { 10.52 assert(osthread->sr.is_suspended(), "thread should be suspended"); 10.53 - osthread->sr.set_suspend_action(SR_CONTINUE); 10.54 + osthread->sr.set_suspend_action(os::Linux::SuspendResume::SR_CONTINUE); 10.55 10.56 int status = pthread_kill(osthread->pthread_id(), SR_signum); 10.57 assert_status(status == 0, status, "pthread_kill"); 10.58 @@ -3572,7 +3572,7 @@ 10.59 os::yield_all(i); 10.60 } 10.61 } 10.62 - osthread->sr.set_suspend_action(SR_NONE); 10.63 + osthread->sr.set_suspend_action(os::Linux::SuspendResume::SR_NONE); 10.64 } 10.65 10.66 ////////////////////////////////////////////////////////////////////////////////
11.1 --- a/src/os/linux/vm/os_linux.hpp Mon Mar 11 12:56:00 2013 +0000 11.2 +++ b/src/os/linux/vm/os_linux.hpp Mon Mar 11 15:37:10 2013 +0100 11.3 @@ -1,5 +1,5 @@ 11.4 /* 11.5 - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. 11.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 11.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 11.8 * 11.9 * This code is free software; you can redistribute it and/or modify it 11.10 @@ -209,39 +209,27 @@ 11.11 // for LinuxThreads are no longer needed. 11.12 class SuspendResume { 11.13 private: 11.14 - volatile int _suspend_action; 11.15 + volatile int _suspend_action; 11.16 + volatile jint _state; 11.17 + public: 11.18 // values for suspend_action: 11.19 - #define SR_NONE (0x00) 11.20 - #define SR_SUSPEND (0x01) // suspend request 11.21 - #define SR_CONTINUE (0x02) // resume request 11.22 + enum { 11.23 + SR_NONE = 0x00, 11.24 + SR_SUSPEND = 0x01, // suspend request 11.25 + SR_CONTINUE = 0x02, // resume request 11.26 + SR_SUSPENDED = 0x20 // values for _state: + SR_NONE 11.27 + }; 11.28 11.29 - volatile jint _state; 11.30 - // values for _state: + SR_NONE 11.31 - #define SR_SUSPENDED (0x20) 11.32 - public: 11.33 SuspendResume() { _suspend_action = SR_NONE; _state = SR_NONE; } 11.34 11.35 int suspend_action() const { return _suspend_action; } 11.36 void set_suspend_action(int x) { _suspend_action = x; } 11.37 11.38 // atomic updates for _state 11.39 - void set_suspended() { 11.40 - jint temp, temp2; 11.41 - do { 11.42 - temp = _state; 11.43 - temp2 = Atomic::cmpxchg(temp | SR_SUSPENDED, &_state, temp); 11.44 - } while (temp2 != temp); 11.45 - } 11.46 - void clear_suspended() { 11.47 - jint temp, temp2; 11.48 - do { 11.49 - temp = _state; 11.50 - temp2 = Atomic::cmpxchg(temp & ~SR_SUSPENDED, &_state, temp); 11.51 - } while (temp2 != temp); 11.52 - } 11.53 + inline void set_suspended(); 11.54 + inline void clear_suspended(); 11.55 bool is_suspended() { return _state & SR_SUSPENDED; } 11.56 11.57 - #undef SR_SUSPENDED 11.58 }; 11.59 11.60 private:
12.1 --- a/src/os/linux/vm/os_linux.inline.hpp Mon Mar 11 12:56:00 2013 +0000 12.2 +++ b/src/os/linux/vm/os_linux.inline.hpp Mon Mar 11 15:37:10 2013 +0100 12.3 @@ -25,7 +25,6 @@ 12.4 #ifndef OS_LINUX_VM_OS_LINUX_INLINE_HPP 12.5 #define OS_LINUX_VM_OS_LINUX_INLINE_HPP 12.6 12.7 -#include "runtime/atomic.hpp" 12.8 #include "runtime/atomic.inline.hpp" 12.9 #include "runtime/os.hpp" 12.10 12.11 @@ -288,4 +287,21 @@ 12.12 const char* optval, socklen_t optlen) { 12.13 return ::setsockopt(fd, level, optname, optval, optlen); 12.14 } 12.15 + 12.16 +inline void os::Linux::SuspendResume::set_suspended() { 12.17 + jint temp, temp2; 12.18 + do { 12.19 + temp = _state; 12.20 + temp2 = Atomic::cmpxchg(temp | SR_SUSPENDED, &_state, temp); 12.21 + } while (temp2 != temp); 12.22 +} 12.23 + 12.24 +inline void os::Linux::SuspendResume::clear_suspended() { 12.25 + jint temp, temp2; 12.26 + do { 12.27 + temp = _state; 12.28 + temp2 = Atomic::cmpxchg(temp & ~SR_SUSPENDED, &_state, temp); 12.29 + } while (temp2 != temp); 12.30 +} 12.31 + 12.32 #endif // OS_LINUX_VM_OS_LINUX_INLINE_HPP
13.1 --- a/src/os/solaris/vm/os_solaris.inline.hpp Mon Mar 11 12:56:00 2013 +0000 13.2 +++ b/src/os/solaris/vm/os_solaris.inline.hpp Mon Mar 11 15:37:10 2013 +0100 13.3 @@ -25,7 +25,6 @@ 13.4 #ifndef OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP 13.5 #define OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP 13.6 13.7 -#include "runtime/atomic.hpp" 13.8 #include "runtime/atomic.inline.hpp" 13.9 #include "runtime/os.hpp" 13.10
14.1 --- a/src/os/windows/vm/decoder_windows.cpp Mon Mar 11 12:56:00 2013 +0000 14.2 +++ b/src/os/windows/vm/decoder_windows.cpp Mon Mar 11 15:37:10 2013 +0100 14.3 @@ -1,5 +1,5 @@ 14.4 /* 14.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 14.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 14.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 14.8 * 14.9 * This code is free software; you can redistribute it and/or modify it 14.10 @@ -24,6 +24,7 @@ 14.11 14.12 #include "precompiled.hpp" 14.13 #include "prims/jvm.h" 14.14 +#include "runtime/arguments.hpp" 14.15 #include "decoder_windows.hpp" 14.16 14.17 WindowsDecoder::WindowsDecoder() {
15.1 --- a/src/os/windows/vm/os_windows.inline.hpp Mon Mar 11 12:56:00 2013 +0000 15.2 +++ b/src/os/windows/vm/os_windows.inline.hpp Mon Mar 11 15:37:10 2013 +0100 15.3 @@ -25,7 +25,6 @@ 15.4 #ifndef OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP 15.5 #define OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP 15.6 15.7 -#include "runtime/atomic.hpp" 15.8 #include "runtime/atomic.inline.hpp" 15.9 #include "runtime/os.hpp" 15.10
16.1 --- a/src/os_cpu/bsd_x86/vm/atomic_bsd_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 16.2 +++ b/src/os_cpu/bsd_x86/vm/atomic_bsd_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 16.3 @@ -1,5 +1,5 @@ 16.4 /* 16.5 - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. 16.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 16.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 16.8 * 16.9 * This code is free software; you can redistribute it and/or modify it 16.10 @@ -25,7 +25,6 @@ 16.11 #ifndef OS_CPU_BSD_X86_VM_ATOMIC_BSD_X86_INLINE_HPP 16.12 #define OS_CPU_BSD_X86_VM_ATOMIC_BSD_X86_INLINE_HPP 16.13 16.14 -#include "orderAccess_bsd_x86.inline.hpp" 16.15 #include "runtime/atomic.hpp" 16.16 #include "runtime/os.hpp" 16.17 #include "vm_version_x86.hpp"
17.1 --- a/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 17.2 +++ b/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 17.3 @@ -1,5 +1,5 @@ 17.4 /* 17.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 17.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 17.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 17.8 * 17.9 * This code is free software; you can redistribute it and/or modify it 17.10 @@ -25,8 +25,9 @@ 17.11 #ifndef OS_CPU_BSD_X86_VM_ORDERACCESS_BSD_X86_INLINE_HPP 17.12 #define OS_CPU_BSD_X86_VM_ORDERACCESS_BSD_X86_INLINE_HPP 17.13 17.14 -#include "runtime/atomic.hpp" 17.15 +#include "runtime/atomic.inline.hpp" 17.16 #include "runtime/orderAccess.hpp" 17.17 +#include "runtime/os.hpp" 17.18 #include "vm_version_x86.hpp" 17.19 17.20 // Implementation of class OrderAccess.
18.1 --- a/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp Mon Mar 11 12:56:00 2013 +0000 18.2 +++ b/src/os_cpu/bsd_zero/vm/atomic_bsd_zero.inline.hpp Mon Mar 11 15:37:10 2013 +0100 18.3 @@ -1,5 +1,5 @@ 18.4 /* 18.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 18.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 18.7 * Copyright 2007, 2008, 2011 Red Hat, Inc. 18.8 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 18.9 * 18.10 @@ -26,7 +26,6 @@ 18.11 #ifndef OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP 18.12 #define OS_CPU_BSD_ZERO_VM_ATOMIC_BSD_ZERO_INLINE_HPP 18.13 18.14 -#include "orderAccess_bsd_zero.inline.hpp" 18.15 #include "runtime/atomic.hpp" 18.16 #include "runtime/os.hpp" 18.17 #include "vm_version_zero.hpp"
19.1 --- a/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp Mon Mar 11 12:56:00 2013 +0000 19.2 +++ b/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp Mon Mar 11 15:37:10 2013 +0100 19.3 @@ -1,5 +1,5 @@ 19.4 /* 19.5 - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. 19.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 19.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 19.8 * 19.9 * This code is free software; you can redistribute it and/or modify it 19.10 @@ -25,7 +25,6 @@ 19.11 #ifndef OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP 19.12 #define OS_CPU_LINUX_SPARC_VM_ATOMIC_LINUX_SPARC_INLINE_HPP 19.13 19.14 -#include "orderAccess_linux_sparc.inline.hpp" 19.15 #include "runtime/atomic.hpp" 19.16 #include "runtime/os.hpp" 19.17 #include "vm_version_sparc.hpp"
20.1 --- a/src/os_cpu/linux_x86/vm/atomic_linux_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 20.2 +++ b/src/os_cpu/linux_x86/vm/atomic_linux_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 20.3 @@ -1,5 +1,5 @@ 20.4 /* 20.5 - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. 20.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 20.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 20.8 * 20.9 * This code is free software; you can redistribute it and/or modify it 20.10 @@ -25,7 +25,6 @@ 20.11 #ifndef OS_CPU_LINUX_X86_VM_ATOMIC_LINUX_X86_INLINE_HPP 20.12 #define OS_CPU_LINUX_X86_VM_ATOMIC_LINUX_X86_INLINE_HPP 20.13 20.14 -#include "orderAccess_linux_x86.inline.hpp" 20.15 #include "runtime/atomic.hpp" 20.16 #include "runtime/os.hpp" 20.17 #include "vm_version_x86.hpp"
21.1 --- a/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 21.2 +++ b/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 21.3 @@ -1,5 +1,5 @@ 21.4 /* 21.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 21.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 21.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 21.8 * 21.9 * This code is free software; you can redistribute it and/or modify it 21.10 @@ -25,8 +25,9 @@ 21.11 #ifndef OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP 21.12 #define OS_CPU_LINUX_X86_VM_ORDERACCESS_LINUX_X86_INLINE_HPP 21.13 21.14 -#include "runtime/atomic.hpp" 21.15 +#include "runtime/atomic.inline.hpp" 21.16 #include "runtime/orderAccess.hpp" 21.17 +#include "runtime/os.hpp" 21.18 #include "vm_version_x86.hpp" 21.19 21.20 // Implementation of class OrderAccess.
22.1 --- a/src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp Mon Mar 11 12:56:00 2013 +0000 22.2 +++ b/src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp Mon Mar 11 15:37:10 2013 +0100 22.3 @@ -1,5 +1,5 @@ 22.4 /* 22.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 22.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 22.7 * Copyright 2007, 2008, 2011 Red Hat, Inc. 22.8 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 22.9 * 22.10 @@ -26,7 +26,6 @@ 22.11 #ifndef OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_INLINE_HPP 22.12 #define OS_CPU_LINUX_ZERO_VM_ATOMIC_LINUX_ZERO_INLINE_HPP 22.13 22.14 -#include "orderAccess_linux_zero.inline.hpp" 22.15 #include "runtime/atomic.hpp" 22.16 #include "runtime/os.hpp" 22.17 #include "vm_version_zero.hpp"
23.1 --- a/src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp Mon Mar 11 12:56:00 2013 +0000 23.2 +++ b/src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp Mon Mar 11 15:37:10 2013 +0100 23.3 @@ -1,5 +1,5 @@ 23.4 /* 23.5 - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. 23.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 23.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 23.8 * 23.9 * This code is free software; you can redistribute it and/or modify it 23.10 @@ -25,7 +25,6 @@ 23.11 #ifndef OS_CPU_SOLARIS_SPARC_VM_ATOMIC_SOLARIS_SPARC_INLINE_HPP 23.12 #define OS_CPU_SOLARIS_SPARC_VM_ATOMIC_SOLARIS_SPARC_INLINE_HPP 23.13 23.14 -#include "orderAccess_solaris_sparc.inline.hpp" 23.15 #include "runtime/atomic.hpp" 23.16 #include "runtime/os.hpp" 23.17 #include "vm_version_sparc.hpp"
24.1 --- a/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp Mon Mar 11 12:56:00 2013 +0000 24.2 +++ b/src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp Mon Mar 11 15:37:10 2013 +0100 24.3 @@ -1,5 +1,5 @@ 24.4 /* 24.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 24.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 24.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 24.8 * 24.9 * This code is free software; you can redistribute it and/or modify it 24.10 @@ -25,6 +25,7 @@ 24.11 #ifndef OS_CPU_SOLARIS_SPARC_VM_ORDERACCESS_SOLARIS_SPARC_INLINE_HPP 24.12 #define OS_CPU_SOLARIS_SPARC_VM_ORDERACCESS_SOLARIS_SPARC_INLINE_HPP 24.13 24.14 +#include "runtime/atomic.inline.hpp" 24.15 #include "runtime/orderAccess.hpp" 24.16 #include "vm_version_sparc.hpp" 24.17
25.1 --- a/src/os_cpu/solaris_x86/vm/atomic_solaris_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 25.2 +++ b/src/os_cpu/solaris_x86/vm/atomic_solaris_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 25.3 @@ -1,5 +1,5 @@ 25.4 /* 25.5 - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. 25.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 25.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 25.8 * 25.9 * This code is free software; you can redistribute it and/or modify it 25.10 @@ -25,7 +25,6 @@ 25.11 #ifndef OS_CPU_SOLARIS_X86_VM_ATOMIC_SOLARIS_X86_INLINE_HPP 25.12 #define OS_CPU_SOLARIS_X86_VM_ATOMIC_SOLARIS_X86_INLINE_HPP 25.13 25.14 -#include "orderAccess_solaris_x86.inline.hpp" 25.15 #include "runtime/atomic.hpp" 25.16 #include "runtime/os.hpp" 25.17 #include "vm_version_x86.hpp"
26.1 --- a/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 26.2 +++ b/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 26.3 @@ -1,5 +1,5 @@ 26.4 /* 26.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 26.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 26.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 26.8 * 26.9 * This code is free software; you can redistribute it and/or modify it 26.10 @@ -25,7 +25,7 @@ 26.11 #ifndef OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP 26.12 #define OS_CPU_SOLARIS_X86_VM_ORDERACCESS_SOLARIS_X86_INLINE_HPP 26.13 26.14 -#include "runtime/atomic.hpp" 26.15 +#include "runtime/atomic.inline.hpp" 26.16 #include "runtime/orderAccess.hpp" 26.17 #include "runtime/os.hpp" 26.18 #include "vm_version_x86.hpp"
27.1 --- a/src/os_cpu/windows_x86/vm/atomic_windows_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 27.2 +++ b/src/os_cpu/windows_x86/vm/atomic_windows_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 27.3 @@ -1,5 +1,5 @@ 27.4 /* 27.5 - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. 27.6 + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. 27.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 27.8 * 27.9 * This code is free software; you can redistribute it and/or modify it 27.10 @@ -25,7 +25,6 @@ 27.11 #ifndef OS_CPU_WINDOWS_X86_VM_ATOMIC_WINDOWS_X86_INLINE_HPP 27.12 #define OS_CPU_WINDOWS_X86_VM_ATOMIC_WINDOWS_X86_INLINE_HPP 27.13 27.14 -#include "orderAccess_windows_x86.inline.hpp" 27.15 #include "runtime/atomic.hpp" 27.16 #include "runtime/os.hpp" 27.17 #include "vm_version_x86.hpp"
28.1 --- a/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp Mon Mar 11 12:56:00 2013 +0000 28.2 +++ b/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp Mon Mar 11 15:37:10 2013 +0100 28.3 @@ -1,5 +1,5 @@ 28.4 /* 28.5 - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 28.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 28.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 28.8 * 28.9 * This code is free software; you can redistribute it and/or modify it 28.10 @@ -25,12 +25,11 @@ 28.11 #ifndef OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP 28.12 #define OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP 28.13 28.14 -#include "runtime/atomic.hpp" 28.15 +#include "runtime/atomic.inline.hpp" 28.16 #include "runtime/orderAccess.hpp" 28.17 +#include "runtime/os.hpp" 28.18 #include "vm_version_x86.hpp" 28.19 28.20 -#pragma warning(disable: 4035) // Disables warnings reporting missing return statement 28.21 - 28.22 // Implementation of class OrderAccess. 28.23 28.24 inline void OrderAccess::loadload() { acquire(); } 28.25 @@ -214,6 +213,4 @@ 28.26 #endif // AMD64 28.27 } 28.28 28.29 -#pragma warning(default: 4035) // Enables warnings reporting missing return statement 28.30 - 28.31 #endif // OS_CPU_WINDOWS_X86_VM_ORDERACCESS_WINDOWS_X86_INLINE_HPP
29.1 --- a/src/share/vm/c1/c1_FrameMap.cpp Mon Mar 11 12:56:00 2013 +0000 29.2 +++ b/src/share/vm/c1/c1_FrameMap.cpp Mon Mar 11 15:37:10 2013 +0100 29.3 @@ -308,27 +308,6 @@ 29.4 return sp_offset_for_monitor_base(index) + in_ByteSize(BasicObjectLock::obj_offset_in_bytes()); 29.5 } 29.6 29.7 -void FrameMap::print_frame_layout() const { 29.8 - int svar; 29.9 - tty->print_cr("#####################################"); 29.10 - tty->print_cr("Frame size in words %d", framesize()); 29.11 - 29.12 - if( _num_monitors > 0) { 29.13 - tty->print_cr("monitor [0]:%d | [%2d]:%d", 29.14 - in_bytes(sp_offset_for_monitor_base(0)), 29.15 - in_bytes(sp_offset_for_monitor_base(_num_monitors))); 29.16 - } 29.17 - if( _num_spills > 0) { 29.18 - svar = _num_spills - 1; 29.19 - if(svar == 0) 29.20 - tty->print_cr("spill [0]:%d", in_bytes(sp_offset_for_spill(0))); 29.21 - else 29.22 - tty->print_cr("spill [0]:%d | [%2d]:%d", in_bytes(sp_offset_for_spill(0)), 29.23 - svar, 29.24 - in_bytes(sp_offset_for_spill(svar))); 29.25 - } 29.26 -} 29.27 - 29.28 29.29 // For OopMaps, map a local variable or spill index to an VMReg. 29.30 // This is the offset from sp() in the frame of the slot for the index,
30.1 --- a/src/share/vm/c1/c1_FrameMap.hpp Mon Mar 11 12:56:00 2013 +0000 30.2 +++ b/src/share/vm/c1/c1_FrameMap.hpp Mon Mar 11 15:37:10 2013 +0100 30.3 @@ -226,8 +226,6 @@ 30.4 return make_new_address(sp_offset_for_monitor_object(monitor_index)); 30.5 } 30.6 30.7 - void print_frame_layout() const; 30.8 - 30.9 // Creates Location describing desired slot and returns it via pointer 30.10 // to Location object. Returns true if the stack frame offset was legal 30.11 // (as defined by Location::legal_offset_in_bytes()), false otherwise.
31.1 --- a/src/share/vm/classfile/classLoaderData.hpp Mon Mar 11 12:56:00 2013 +0000 31.2 +++ b/src/share/vm/classfile/classLoaderData.hpp Mon Mar 11 15:37:10 2013 +0100 31.3 @@ -234,6 +234,7 @@ 31.4 void add_to_deallocate_list(Metadata* m); 31.5 31.6 static ClassLoaderData* class_loader_data(oop loader); 31.7 + static ClassLoaderData* class_loader_data_or_null(oop loader); 31.8 static ClassLoaderData* anonymous_class_loader_data(oop loader, TRAPS); 31.9 static void print_loader(ClassLoaderData *loader_data, outputStream *out); 31.10
32.1 --- a/src/share/vm/classfile/classLoaderData.inline.hpp Mon Mar 11 12:56:00 2013 +0000 32.2 +++ b/src/share/vm/classfile/classLoaderData.inline.hpp Mon Mar 11 15:37:10 2013 +0100 32.3 @@ -25,9 +25,15 @@ 32.4 #include "classfile/classLoaderData.hpp" 32.5 #include "classfile/javaClasses.hpp" 32.6 32.7 +inline ClassLoaderData* ClassLoaderData::class_loader_data_or_null(oop loader) { 32.8 + if (loader == NULL) { 32.9 + return ClassLoaderData::the_null_class_loader_data(); 32.10 + } 32.11 + return java_lang_ClassLoader::loader_data(loader); 32.12 +} 32.13 + 32.14 inline ClassLoaderData* ClassLoaderData::class_loader_data(oop loader) { 32.15 - if (loader == NULL) return ClassLoaderData::the_null_class_loader_data(); 32.16 - ClassLoaderData* loader_data = java_lang_ClassLoader::loader_data(loader); 32.17 + ClassLoaderData* loader_data = class_loader_data_or_null(loader); 32.18 assert(loader_data != NULL, "Must be"); 32.19 return loader_data; 32.20 }
33.1 --- a/src/share/vm/classfile/dictionary.cpp Mon Mar 11 12:56:00 2013 +0000 33.2 +++ b/src/share/vm/classfile/dictionary.cpp Mon Mar 11 15:37:10 2013 +0100 33.3 @@ -347,6 +347,7 @@ 33.4 assert_locked_or_safepoint(SystemDictionary_lock); 33.5 assert(obj() != NULL, "adding NULL obj"); 33.6 assert(obj()->name() == class_name, "sanity check on name"); 33.7 + assert(loader_data != NULL, "Must be non-NULL"); 33.8 33.9 unsigned int hash = compute_hash(class_name, loader_data); 33.10 int index = hash_to_index(hash);
34.1 --- a/src/share/vm/classfile/systemDictionary.cpp Mon Mar 11 12:56:00 2013 +0000 34.2 +++ b/src/share/vm/classfile/systemDictionary.cpp Mon Mar 11 15:37:10 2013 +0100 34.3 @@ -866,16 +866,22 @@ 34.4 // the new entry. 34.5 34.6 Klass* SystemDictionary::find(Symbol* class_name, 34.7 - Handle class_loader, 34.8 - Handle protection_domain, 34.9 - TRAPS) { 34.10 + Handle class_loader, 34.11 + Handle protection_domain, 34.12 + TRAPS) { 34.13 34.14 // UseNewReflection 34.15 // The result of this call should be consistent with the result 34.16 // of the call to resolve_instance_class_or_null(). 34.17 // See evaluation 6790209 and 4474172 for more details. 34.18 class_loader = Handle(THREAD, java_lang_ClassLoader::non_reflection_class_loader(class_loader())); 34.19 - ClassLoaderData* loader_data = register_loader(class_loader, CHECK_NULL); 34.20 + ClassLoaderData* loader_data = ClassLoaderData::class_loader_data_or_null(class_loader()); 34.21 + 34.22 + if (loader_data == NULL) { 34.23 + // If the ClassLoaderData has not been setup, 34.24 + // then the class loader has no entries in the dictionary. 34.25 + return NULL; 34.26 + } 34.27 34.28 unsigned int d_hash = dictionary()->compute_hash(class_name, loader_data); 34.29 int d_index = dictionary()->hash_to_index(d_hash);
35.1 --- a/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Mon Mar 11 12:56:00 2013 +0000 35.2 +++ b/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp Mon Mar 11 15:37:10 2013 +0100 35.3 @@ -373,6 +373,8 @@ 35.4 " does not exceed used.end() = " PTR_FORMAT "," 35.5 " yet last_chunk_index_to_check " INTPTR_FORMAT 35.6 " exceeds last_chunk_index " INTPTR_FORMAT, 35.7 + last_block, last_block + last_block_size, 35.8 + used.end(), 35.9 last_chunk_index_to_check, last_chunk_index)); 35.10 assert(sp->used_region().end() > used.end(), 35.11 err_msg("Expansion did not happen: "
36.1 --- a/src/share/vm/memory/allocation.inline.hpp Mon Mar 11 12:56:00 2013 +0000 36.2 +++ b/src/share/vm/memory/allocation.inline.hpp Mon Mar 11 15:37:10 2013 +0100 36.3 @@ -1,5 +1,5 @@ 36.4 /* 36.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 36.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 36.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 36.8 * 36.9 * This code is free software; you can redistribute it and/or modify it 36.10 @@ -25,6 +25,7 @@ 36.11 #ifndef SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP 36.12 #define SHARE_VM_MEMORY_ALLOCATION_INLINE_HPP 36.13 36.14 +#include "runtime/atomic.inline.hpp" 36.15 #include "runtime/os.hpp" 36.16 36.17 // Explicit C-heap memory management
37.1 --- a/src/share/vm/memory/cardTableModRefBS.cpp Mon Mar 11 12:56:00 2013 +0000 37.2 +++ b/src/share/vm/memory/cardTableModRefBS.cpp Mon Mar 11 15:37:10 2013 +0100 37.3 @@ -694,7 +694,7 @@ 37.4 if (failed) { 37.5 if (!failures) { 37.6 tty->cr(); 37.7 - tty->print_cr("== CT verification failed: ["PTR_FORMAT","PTR_FORMAT"]"); 37.8 + tty->print_cr("== CT verification failed: ["PTR_FORMAT","PTR_FORMAT"]", start, end); 37.9 tty->print_cr("== %sexpecting value: %d", 37.10 (val_equals) ? "" : "not ", val); 37.11 failures = true;
38.1 --- a/src/share/vm/memory/cardTableRS.cpp Mon Mar 11 12:56:00 2013 +0000 38.2 +++ b/src/share/vm/memory/cardTableRS.cpp Mon Mar 11 15:37:10 2013 +0100 38.3 @@ -353,7 +353,7 @@ 38.4 assert(jp >= _begin && jp < _end, 38.5 err_msg("Error: jp " PTR_FORMAT " should be within " 38.6 "[_begin, _end) = [" PTR_FORMAT "," PTR_FORMAT ")", 38.7 - _begin, _end)); 38.8 + jp, _begin, _end)); 38.9 oop obj = oopDesc::load_decode_heap_oop(p); 38.10 guarantee(obj == NULL || (HeapWord*)obj >= _boundary, 38.11 err_msg("pointer " PTR_FORMAT " at " PTR_FORMAT " on "
39.1 --- a/src/share/vm/oops/instanceKlass.cpp Mon Mar 11 12:56:00 2013 +0000 39.2 +++ b/src/share/vm/oops/instanceKlass.cpp Mon Mar 11 15:37:10 2013 +0100 39.3 @@ -2170,7 +2170,11 @@ 39.4 if (impl != NULL) { 39.5 if (!impl->is_loader_alive(is_alive)) { 39.6 // remove this guy 39.7 - *adr_implementor() = NULL; 39.8 + Klass** klass = adr_implementor(); 39.9 + assert(klass != NULL, "null klass"); 39.10 + if (klass != NULL) { 39.11 + *klass = NULL; 39.12 + } 39.13 } 39.14 } 39.15 } 39.16 @@ -3151,9 +3155,10 @@ 39.17 if (protection_domain() != NULL) { 39.18 guarantee(protection_domain()->is_oop(), "should be oop"); 39.19 } 39.20 - if (host_klass() != NULL) { 39.21 - guarantee(host_klass()->is_metadata(), "should be in metaspace"); 39.22 - guarantee(host_klass()->is_klass(), "should be klass"); 39.23 + const Klass* host = host_klass(); 39.24 + if (host != NULL) { 39.25 + guarantee(host->is_metadata(), "should be in metaspace"); 39.26 + guarantee(host->is_klass(), "should be klass"); 39.27 } 39.28 if (signers() != NULL) { 39.29 guarantee(signers()->is_objArray(), "should be obj array");
40.1 --- a/src/share/vm/oops/instanceKlass.hpp Mon Mar 11 12:56:00 2013 +0000 40.2 +++ b/src/share/vm/oops/instanceKlass.hpp Mon Mar 11 15:37:10 2013 +0100 40.3 @@ -536,7 +536,9 @@ 40.4 assert(is_anonymous(), "not anonymous"); 40.5 Klass** addr = (Klass**)adr_host_klass(); 40.6 assert(addr != NULL, "no reversed space"); 40.7 - *addr = host; 40.8 + if (addr != NULL) { 40.9 + *addr = host; 40.10 + } 40.11 } 40.12 bool is_anonymous() const { 40.13 return (_misc_flags & _misc_is_anonymous) != 0; 40.14 @@ -758,7 +760,10 @@ 40.15 void set_implementor(Klass* k) { 40.16 assert(is_interface(), "not interface"); 40.17 Klass** addr = adr_implementor(); 40.18 - *addr = k; 40.19 + assert(addr != NULL, "null addr"); 40.20 + if (addr != NULL) { 40.21 + *addr = k; 40.22 + } 40.23 } 40.24 40.25 int nof_implementors() const {
41.1 --- a/src/share/vm/oops/symbol.cpp Mon Mar 11 12:56:00 2013 +0000 41.2 +++ b/src/share/vm/oops/symbol.cpp Mon Mar 11 15:37:10 2013 +0100 41.3 @@ -1,5 +1,5 @@ 41.4 /* 41.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 41.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 41.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 41.8 * 41.9 * This code is free software; you can redistribute it and/or modify it 41.10 @@ -27,6 +27,7 @@ 41.11 #include "classfile/altHashing.hpp" 41.12 #include "classfile/classLoaderData.hpp" 41.13 #include "oops/symbol.hpp" 41.14 +#include "runtime/atomic.inline.hpp" 41.15 #include "runtime/os.hpp" 41.16 #include "memory/allocation.inline.hpp" 41.17 #include "memory/resourceArea.hpp" 41.18 @@ -210,6 +211,28 @@ 41.19 return AltHashing::murmur3_32(seed, (const jbyte*)as_C_string(), utf8_length()); 41.20 } 41.21 41.22 +void Symbol::increment_refcount() { 41.23 + // Only increment the refcount if positive. If negative either 41.24 + // overflow has occurred or it is a permanent symbol in a read only 41.25 + // shared archive. 41.26 + if (_refcount >= 0) { 41.27 + Atomic::inc(&_refcount); 41.28 + NOT_PRODUCT(Atomic::inc(&_total_count);) 41.29 + } 41.30 +} 41.31 + 41.32 +void Symbol::decrement_refcount() { 41.33 + if (_refcount >= 0) { 41.34 + Atomic::dec(&_refcount); 41.35 +#ifdef ASSERT 41.36 + if (_refcount < 0) { 41.37 + print(); 41.38 + assert(false, "reference count underflow for symbol"); 41.39 + } 41.40 +#endif 41.41 + } 41.42 +} 41.43 + 41.44 void Symbol::print_on(outputStream* st) const { 41.45 if (this == NULL) { 41.46 st->print_cr("NULL");
42.1 --- a/src/share/vm/oops/symbol.hpp Mon Mar 11 12:56:00 2013 +0000 42.2 +++ b/src/share/vm/oops/symbol.hpp Mon Mar 11 15:37:10 2013 +0100 42.3 @@ -1,5 +1,5 @@ 42.4 /* 42.5 - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 42.6 + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 42.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 42.8 * 42.9 * This code is free software; you can redistribute it and/or modify it 42.10 @@ -27,7 +27,6 @@ 42.11 42.12 #include "utilities/utf8.hpp" 42.13 #include "memory/allocation.hpp" 42.14 -#include "runtime/atomic.hpp" 42.15 42.16 // A Symbol is a canonicalized string. 42.17 // All Symbols reside in global SymbolTable and are reference counted. 42.18 @@ -150,8 +149,8 @@ 42.19 42.20 // Reference counting. See comments above this class for when to use. 42.21 int refcount() const { return _refcount; } 42.22 - inline void increment_refcount(); 42.23 - inline void decrement_refcount(); 42.24 + void increment_refcount(); 42.25 + void decrement_refcount(); 42.26 42.27 int byte_at(int index) const { 42.28 assert(index >=0 && index < _length, "symbol index overflow"); 42.29 @@ -232,26 +231,4 @@ 42.30 return (((uintptr_t)this < (uintptr_t)other) ? -1 42.31 : ((uintptr_t)this == (uintptr_t) other) ? 0 : 1); 42.32 } 42.33 - 42.34 -inline void Symbol::increment_refcount() { 42.35 - // Only increment the refcount if positive. If negative either 42.36 - // overflow has occurred or it is a permanent symbol in a read only 42.37 - // shared archive. 42.38 - if (_refcount >= 0) { 42.39 - Atomic::inc(&_refcount); 42.40 - NOT_PRODUCT(Atomic::inc(&_total_count);) 42.41 - } 42.42 -} 42.43 - 42.44 -inline void Symbol::decrement_refcount() { 42.45 - if (_refcount >= 0) { 42.46 - Atomic::dec(&_refcount); 42.47 -#ifdef ASSERT 42.48 - if (_refcount < 0) { 42.49 - print(); 42.50 - assert(false, "reference count underflow for symbol"); 42.51 - } 42.52 -#endif 42.53 - } 42.54 -} 42.55 #endif // SHARE_VM_OOPS_SYMBOL_HPP
43.1 --- a/src/share/vm/opto/c2_globals.hpp Mon Mar 11 12:56:00 2013 +0000 43.2 +++ b/src/share/vm/opto/c2_globals.hpp Mon Mar 11 15:37:10 2013 +0100 43.3 @@ -54,6 +54,12 @@ 43.4 43.5 #define C2_FLAGS(develop, develop_pd, product, product_pd, diagnostic, experimental, notproduct) \ 43.6 \ 43.7 + develop(bool, StressLCM, false, \ 43.8 + "Randomize instruction scheduling in LCM") \ 43.9 + \ 43.10 + develop(bool, StressGCM, false, \ 43.11 + "Randomize instruction scheduling in GCM") \ 43.12 + \ 43.13 notproduct(intx, CompileZapFirst, 0, \ 43.14 "If +ZapDeadCompiledLocals, " \ 43.15 "skip this many before compiling in zap calls") \
44.1 --- a/src/share/vm/opto/compile.cpp Mon Mar 11 12:56:00 2013 +0000 44.2 +++ b/src/share/vm/opto/compile.cpp Mon Mar 11 15:37:10 2013 +0100 44.3 @@ -2899,6 +2899,13 @@ 44.4 } 44.5 } 44.6 break; 44.7 + case Op_MemBarStoreStore: 44.8 + // Break the link with AllocateNode: it is no longer useful and 44.9 + // confuses register allocation. 44.10 + if (n->req() > MemBarNode::Precedent) { 44.11 + n->set_req(MemBarNode::Precedent, top()); 44.12 + } 44.13 + break; 44.14 default: 44.15 assert( !n->is_Call(), "" ); 44.16 assert( !n->is_Mem(), "" ); 44.17 @@ -3669,3 +3676,38 @@ 44.18 n->set_req(0, NULL); 44.19 } 44.20 } 44.21 + 44.22 +// Auxiliary method to support randomized stressing/fuzzing. 44.23 +// 44.24 +// This method can be called the arbitrary number of times, with current count 44.25 +// as the argument. The logic allows selecting a single candidate from the 44.26 +// running list of candidates as follows: 44.27 +// int count = 0; 44.28 +// Cand* selected = null; 44.29 +// while(cand = cand->next()) { 44.30 +// if (randomized_select(++count)) { 44.31 +// selected = cand; 44.32 +// } 44.33 +// } 44.34 +// 44.35 +// Including count equalizes the chances any candidate is "selected". 44.36 +// This is useful when we don't have the complete list of candidates to choose 44.37 +// from uniformly. In this case, we need to adjust the randomicity of the 44.38 +// selection, or else we will end up biasing the selection towards the latter 44.39 +// candidates. 44.40 +// 44.41 +// Quick back-envelope calculation shows that for the list of n candidates 44.42 +// the equal probability for the candidate to persist as "best" can be 44.43 +// achieved by replacing it with "next" k-th candidate with the probability 44.44 +// of 1/k. It can be easily shown that by the end of the run, the 44.45 +// probability for any candidate is converged to 1/n, thus giving the 44.46 +// uniform distribution among all the candidates. 44.47 +// 44.48 +// We don't care about the domain size as long as (RANDOMIZED_DOMAIN / count) is large. 44.49 +#define RANDOMIZED_DOMAIN_POW 29 44.50 +#define RANDOMIZED_DOMAIN (1 << RANDOMIZED_DOMAIN_POW) 44.51 +#define RANDOMIZED_DOMAIN_MASK ((1 << (RANDOMIZED_DOMAIN_POW + 1)) - 1) 44.52 +bool Compile::randomized_select(int count) { 44.53 + assert(count > 0, "only positive"); 44.54 + return (os::random() & RANDOMIZED_DOMAIN_MASK) < (RANDOMIZED_DOMAIN / count); 44.55 +}
45.1 --- a/src/share/vm/opto/compile.hpp Mon Mar 11 12:56:00 2013 +0000 45.2 +++ b/src/share/vm/opto/compile.hpp Mon Mar 11 15:37:10 2013 +0100 45.3 @@ -678,6 +678,7 @@ 45.4 void record_dead_node(uint idx) { if (_dead_node_list.test_set(idx)) return; 45.5 _dead_node_count++; 45.6 } 45.7 + bool is_dead_node(uint idx) { return _dead_node_list.test(idx) != 0; } 45.8 uint dead_node_count() { return _dead_node_count; } 45.9 void reset_dead_node_list() { _dead_node_list.Reset(); 45.10 _dead_node_count = 0; 45.11 @@ -1086,6 +1087,9 @@ 45.12 45.13 // Definitions of pd methods 45.14 static void pd_compiler2_init(); 45.15 + 45.16 + // Auxiliary method for randomized fuzzing/stressing 45.17 + static bool randomized_select(int count); 45.18 }; 45.19 45.20 #endif // SHARE_VM_OPTO_COMPILE_HPP
46.1 --- a/src/share/vm/opto/gcm.cpp Mon Mar 11 12:56:00 2013 +0000 46.2 +++ b/src/share/vm/opto/gcm.cpp Mon Mar 11 15:37:10 2013 +0100 46.3 @@ -1046,6 +1046,8 @@ 46.4 } 46.5 #endif 46.6 46.7 + int cand_cnt = 0; // number of candidates tried 46.8 + 46.9 // Walk up the dominator tree from LCA (Lowest common ancestor) to 46.10 // the earliest legal location. Capture the least execution frequency. 46.11 while (LCA != early) { 46.12 @@ -1071,8 +1073,11 @@ 46.13 LCA->_pre_order, LCA->_nodes[0]->_idx, start_lat, end_idx, end_lat, LCA_freq); 46.14 } 46.15 #endif 46.16 + cand_cnt++; 46.17 if (LCA_freq < least_freq || // Better Frequency 46.18 - ( !in_latency && // No block containing latency 46.19 + (StressGCM && Compile::randomized_select(cand_cnt)) || // Should be randomly accepted in stress mode 46.20 + (!StressGCM && // Otherwise, choose with latency 46.21 + !in_latency && // No block containing latency 46.22 LCA_freq < least_freq * delta && // No worse frequency 46.23 target >= end_lat && // within latency range 46.24 !self->is_iteratively_computed() ) // But don't hoist IV increments 46.25 @@ -1210,7 +1215,8 @@ 46.26 } 46.27 46.28 // If there is no opportunity to hoist, then we're done. 46.29 - bool try_to_hoist = (LCA != early); 46.30 + // In stress mode, try to hoist even the single operations. 46.31 + bool try_to_hoist = StressGCM || (LCA != early); 46.32 46.33 // Must clone guys stay next to use; no hoisting allowed. 46.34 // Also cannot hoist guys that alter memory or are otherwise not
47.1 --- a/src/share/vm/opto/lcm.cpp Mon Mar 11 12:56:00 2013 +0000 47.2 +++ b/src/share/vm/opto/lcm.cpp Mon Mar 11 15:37:10 2013 +0100 47.3 @@ -421,6 +421,7 @@ 47.4 uint latency = 0; // Bigger is scheduled first 47.5 uint score = 0; // Bigger is better 47.6 int idx = -1; // Index in worklist 47.7 + int cand_cnt = 0; // Candidate count 47.8 47.9 for( uint i=0; i<cnt; i++ ) { // Inspect entire worklist 47.10 // Order in worklist is used to break ties. 47.11 @@ -503,11 +504,14 @@ 47.12 uint n_score = n->req(); // Many inputs get high score to break ties 47.13 47.14 // Keep best latency found 47.15 - if( choice < n_choice || 47.16 - ( choice == n_choice && 47.17 - ( latency < n_latency || 47.18 - ( latency == n_latency && 47.19 - ( score < n_score ))))) { 47.20 + cand_cnt++; 47.21 + if (choice < n_choice || 47.22 + (choice == n_choice && 47.23 + ((StressLCM && Compile::randomized_select(cand_cnt)) || 47.24 + (!StressLCM && 47.25 + (latency < n_latency || 47.26 + (latency == n_latency && 47.27 + (score < n_score))))))) { 47.28 choice = n_choice; 47.29 latency = n_latency; 47.30 score = n_score;
48.1 --- a/src/share/vm/opto/macro.cpp Mon Mar 11 12:56:00 2013 +0000 48.2 +++ b/src/share/vm/opto/macro.cpp Mon Mar 11 15:37:10 2013 +0100 48.3 @@ -1101,12 +1101,6 @@ 48.4 Node* klass_node = alloc->in(AllocateNode::KlassNode); 48.5 Node* initial_slow_test = alloc->in(AllocateNode::InitialTest); 48.6 48.7 - Node* storestore = alloc->storestore(); 48.8 - if (storestore != NULL) { 48.9 - // Break this link that is no longer useful and confuses register allocation 48.10 - storestore->set_req(MemBarNode::Precedent, top()); 48.11 - } 48.12 - 48.13 assert(ctrl != NULL, "must have control"); 48.14 // We need a Region and corresponding Phi's to merge the slow-path and fast-path results. 48.15 // they will not be used if "always_slow" is set 48.16 @@ -1324,7 +1318,7 @@ 48.17 // No InitializeNode or no stores captured by zeroing 48.18 // elimination. Simply add the MemBarStoreStore after object 48.19 // initialization. 48.20 - MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot, fast_oop_rawmem); 48.21 + MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot); 48.22 transform_later(mb); 48.23 48.24 mb->init_req(TypeFunc::Memory, fast_oop_rawmem);
49.1 --- a/src/share/vm/opto/memnode.cpp Mon Mar 11 12:56:00 2013 +0000 49.2 +++ b/src/share/vm/opto/memnode.cpp Mon Mar 11 15:37:10 2013 +0100 49.3 @@ -238,7 +238,7 @@ 49.4 return this; 49.5 ctl = in(MemNode::Control); 49.6 // Don't bother trying to transform a dead node 49.7 - if( ctl && ctl->is_top() ) return NodeSentinel; 49.8 + if (ctl && ctl->is_top()) return NodeSentinel; 49.9 49.10 PhaseIterGVN *igvn = phase->is_IterGVN(); 49.11 // Wait if control on the worklist. 49.12 @@ -262,8 +262,8 @@ 49.13 } 49.14 // Ignore if memory is dead, or self-loop 49.15 Node *mem = in(MemNode::Memory); 49.16 - if( phase->type( mem ) == Type::TOP ) return NodeSentinel; // caller will return NULL 49.17 - assert( mem != this, "dead loop in MemNode::Ideal" ); 49.18 + if (phase->type( mem ) == Type::TOP) return NodeSentinel; // caller will return NULL 49.19 + assert(mem != this, "dead loop in MemNode::Ideal"); 49.20 49.21 if (can_reshape && igvn != NULL && igvn->_worklist.member(mem)) { 49.22 // This memory slice may be dead. 49.23 @@ -273,12 +273,12 @@ 49.24 } 49.25 49.26 Node *address = in(MemNode::Address); 49.27 - const Type *t_adr = phase->type( address ); 49.28 - if( t_adr == Type::TOP ) return NodeSentinel; // caller will return NULL 49.29 - 49.30 - if( can_reshape && igvn != NULL && 49.31 + const Type *t_adr = phase->type(address); 49.32 + if (t_adr == Type::TOP) return NodeSentinel; // caller will return NULL 49.33 + 49.34 + if (can_reshape && igvn != NULL && 49.35 (igvn->_worklist.member(address) || 49.36 - igvn->_worklist.size() > 0 && (phase->type(address) != adr_type())) ) { 49.37 + igvn->_worklist.size() > 0 && (t_adr != adr_type())) ) { 49.38 // The address's base and type may change when the address is processed. 49.39 // Delay this mem node transformation until the address is processed. 49.40 phase->is_IterGVN()->_worklist.push(this); 49.41 @@ -288,7 +288,7 @@ 49.42 // Do NOT remove or optimize the next lines: ensure a new alias index 49.43 // is allocated for an oop pointer type before Escape Analysis. 49.44 // Note: C++ will not remove it since the call has side effect. 49.45 - if ( t_adr->isa_oopptr() ) { 49.46 + if (t_adr->isa_oopptr()) { 49.47 int alias_idx = phase->C->get_alias_index(t_adr->is_ptr()); 49.48 } 49.49 49.50 @@ -296,6 +296,26 @@ 49.51 Node* base = NULL; 49.52 if (address->is_AddP()) 49.53 base = address->in(AddPNode::Base); 49.54 + if (base != NULL && phase->type(base)->higher_equal(TypePtr::NULL_PTR) && 49.55 + !t_adr->isa_rawptr()) { 49.56 + // Note: raw address has TOP base and top->higher_equal(TypePtr::NULL_PTR) is true. 49.57 + Compile* C = phase->C; 49.58 + tty->cr(); 49.59 + tty->print_cr("===== NULL+offs not RAW address ====="); 49.60 + if (C->is_dead_node(this->_idx)) tty->print_cr("'this' is dead"); 49.61 + if ((ctl != NULL) && C->is_dead_node(ctl->_idx)) tty->print_cr("'ctl' is dead"); 49.62 + if (C->is_dead_node(mem->_idx)) tty->print_cr("'mem' is dead"); 49.63 + if (C->is_dead_node(address->_idx)) tty->print_cr("'address' is dead"); 49.64 + if (C->is_dead_node(base->_idx)) tty->print_cr("'base' is dead"); 49.65 + tty->cr(); 49.66 + base->dump(1); 49.67 + tty->cr(); 49.68 + this->dump(2); 49.69 + tty->print("this->adr_type(): "); adr_type()->dump(); tty->cr(); 49.70 + tty->print("phase->type(address): "); t_adr->dump(); tty->cr(); 49.71 + tty->print("phase->type(base): "); phase->type(address)->dump(); tty->cr(); 49.72 + tty->cr(); 49.73 + } 49.74 assert(base == NULL || t_adr->isa_rawptr() || 49.75 !phase->type(base)->higher_equal(TypePtr::NULL_PTR), "NULL+offs not RAW address?"); 49.76 #endif
50.1 --- a/src/share/vm/prims/jvmtiEnter.xsl Mon Mar 11 12:56:00 2013 +0000 50.2 +++ b/src/share/vm/prims/jvmtiEnter.xsl Mon Mar 11 15:37:10 2013 +0100 50.3 @@ -773,7 +773,7 @@ 50.4 </xsl:text> 50.5 <xsl:apply-templates select=".." mode="traceError"> 50.6 <xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param> 50.7 - <xsl:with-param name="comment"> - jthread resolved to NULL - jthread = %0x%x</xsl:with-param> 50.8 + <xsl:with-param name="comment"> - jthread resolved to NULL - jthread = 0x%x</xsl:with-param> 50.9 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param> 50.10 </xsl:apply-templates> 50.11 <xsl:text> 50.12 @@ -782,7 +782,7 @@ 50.13 </xsl:text> 50.14 <xsl:apply-templates select=".." mode="traceError"> 50.15 <xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param> 50.16 - <xsl:with-param name="comment"> - oop is not a thread - jthread = %0x%x</xsl:with-param> 50.17 + <xsl:with-param name="comment"> - oop is not a thread - jthread = 0x%x</xsl:with-param> 50.18 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param> 50.19 </xsl:apply-templates> 50.20 <xsl:text> 50.21 @@ -794,7 +794,7 @@ 50.22 <xsl:with-param name="err"> 50.23 <xsl:text>JVMTI_ERROR_THREAD_NOT_ALIVE</xsl:text> 50.24 </xsl:with-param> 50.25 - <xsl:with-param name="comment"> - not a Java thread - jthread = %0x%x</xsl:with-param> 50.26 + <xsl:with-param name="comment"> - not a Java thread - jthread = 0x%x</xsl:with-param> 50.27 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param> 50.28 </xsl:apply-templates> 50.29 <xsl:text> 50.30 @@ -838,7 +838,7 @@ 50.31 </xsl:text> 50.32 <xsl:apply-templates select=".." mode="traceError"> 50.33 <xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param> 50.34 - <xsl:with-param name="comment"> - negative depth - jthread = %0x%x</xsl:with-param> 50.35 + <xsl:with-param name="comment"> - negative depth - jthread = 0x%x</xsl:with-param> 50.36 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param> 50.37 </xsl:apply-templates> 50.38 <xsl:text>
51.1 --- a/src/share/vm/prims/jvmtiEnvBase.cpp Mon Mar 11 12:56:00 2013 +0000 51.2 +++ b/src/share/vm/prims/jvmtiEnvBase.cpp Mon Mar 11 15:37:10 2013 +0100 51.3 @@ -997,13 +997,19 @@ 51.4 // move our object at this point. However, our owner value is safe 51.5 // since it is either the Lock word on a stack or a JavaThread *. 51.6 owning_thread = Threads::owning_thread_from_monitor_owner(owner, !at_safepoint); 51.7 - assert(owning_thread != NULL, "sanity check"); 51.8 - if (owning_thread != NULL) { // robustness 51.9 + // Cannot assume (owning_thread != NULL) here because this function 51.10 + // may not have been called at a safepoint and the owning_thread 51.11 + // might not be suspended. 51.12 + if (owning_thread != NULL) { 51.13 // The monitor's owner either has to be the current thread, at safepoint 51.14 // or it has to be suspended. Any of these conditions will prevent both 51.15 // contending and waiting threads from modifying the state of 51.16 // the monitor. 51.17 if (!at_safepoint && !JvmtiEnv::is_thread_fully_suspended(owning_thread, true, &debug_bits)) { 51.18 + // Don't worry! This return of JVMTI_ERROR_THREAD_NOT_SUSPENDED 51.19 + // will not make it back to the JVM/TI agent. The error code will 51.20 + // get intercepted in JvmtiEnv::GetObjectMonitorUsage() which 51.21 + // will retry the call via a VM_GetObjectMonitorUsage VM op. 51.22 return JVMTI_ERROR_THREAD_NOT_SUSPENDED; 51.23 } 51.24 HandleMark hm;
52.1 --- a/src/share/vm/runtime/frame.cpp Mon Mar 11 12:56:00 2013 +0000 52.2 +++ b/src/share/vm/runtime/frame.cpp Mon Mar 11 15:37:10 2013 +0100 52.3 @@ -1070,7 +1070,12 @@ 52.4 52.5 // First consult the ADLC on where it puts parameter 0 for this signature. 52.6 VMReg reg = SharedRuntime::name_for_receiver(); 52.7 - oop r = *caller.oopmapreg_to_location(reg, reg_map); 52.8 + oop* oop_adr = caller.oopmapreg_to_location(reg, reg_map); 52.9 + if (oop_adr == NULL) { 52.10 + guarantee(oop_adr != NULL, "bad register save location"); 52.11 + return NULL; 52.12 + } 52.13 + oop r = *oop_adr; 52.14 assert(Universe::heap()->is_in_or_null(r), err_msg("bad receiver: " INTPTR_FORMAT " (" INTX_FORMAT ")", (intptr_t) r, (intptr_t) r)); 52.15 return r; 52.16 }
53.1 --- a/src/share/vm/runtime/synchronizer.cpp Mon Mar 11 12:56:00 2013 +0000 53.2 +++ b/src/share/vm/runtime/synchronizer.cpp Mon Mar 11 15:37:10 2013 +0100 53.3 @@ -813,6 +813,7 @@ 53.4 } 53.5 53.6 if (owner != NULL) { 53.7 + // owning_thread_from_monitor_owner() may also return NULL here 53.8 return Threads::owning_thread_from_monitor_owner(owner, doLock); 53.9 } 53.10
54.1 --- a/src/share/vm/runtime/thread.cpp Mon Mar 11 12:56:00 2013 +0000 54.2 +++ b/src/share/vm/runtime/thread.cpp Mon Mar 11 15:37:10 2013 +0100 54.3 @@ -4285,7 +4285,9 @@ 54.4 if (owner == (address)p) return p; 54.5 } 54.6 } 54.7 - assert(UseHeavyMonitors == false, "Did not find owning Java thread with UseHeavyMonitors enabled"); 54.8 + // Cannot assert on lack of success here since this function may be 54.9 + // used by code that is trying to report useful problem information 54.10 + // like deadlock detection. 54.11 if (UseHeavyMonitors) return NULL; 54.12 54.13 // 54.14 @@ -4303,7 +4305,7 @@ 54.15 } 54.16 } 54.17 } 54.18 - assert(the_owner != NULL, "Did not find owning Java thread for lock word address"); 54.19 + // cannot assert on lack of success here; see above comment 54.20 return the_owner; 54.21 } 54.22
55.1 --- a/src/share/vm/services/memReporter.cpp Mon Mar 11 12:56:00 2013 +0000 55.2 +++ b/src/share/vm/services/memReporter.cpp Mon Mar 11 15:37:10 2013 +0100 55.3 @@ -419,7 +419,7 @@ 55.4 _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset); 55.5 _output->print("%28s", " "); 55.6 } else { 55.7 - _output->print("[" PTR_FORMAT "]%18s", " "); 55.8 + _output->print("[" PTR_FORMAT "]%18s", pc, " "); 55.9 } 55.10 55.11 _output->print_cr("(mmap: reserved=%d%s, committed=%d%s)", 55.12 @@ -596,7 +596,7 @@ 55.13 _output->print_cr("[" PTR_FORMAT "] %s+0x%x", pc, buf, offset); 55.14 _output->print("%28s", " "); 55.15 } else { 55.16 - _output->print("[" PTR_FORMAT "]%18s", " "); 55.17 + _output->print("[" PTR_FORMAT "]%18s", pc, " "); 55.18 } 55.19 } 55.20
56.1 --- a/src/share/vm/services/threadService.cpp Mon Mar 11 12:56:00 2013 +0000 56.2 +++ b/src/share/vm/services/threadService.cpp Mon Mar 11 15:37:10 2013 +0100 56.3 @@ -1,5 +1,5 @@ 56.4 /* 56.5 - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 56.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 56.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 56.8 * 56.9 * This code is free software; you can redistribute it and/or modify it 56.10 @@ -327,8 +327,28 @@ 56.11 while (waitingToLockMonitor != NULL || waitingToLockBlocker != NULL) { 56.12 cycle->add_thread(currentThread); 56.13 if (waitingToLockMonitor != NULL) { 56.14 - currentThread = Threads::owning_thread_from_monitor_owner((address)waitingToLockMonitor->owner(), 56.15 - false /* no locking needed */); 56.16 + currentThread = Threads::owning_thread_from_monitor_owner( 56.17 + (address)waitingToLockMonitor->owner(), 56.18 + false /* no locking needed */); 56.19 + if (currentThread == NULL) { 56.20 + // This function is called at a safepoint so the JavaThread 56.21 + // that owns waitingToLockMonitor should be findable, but 56.22 + // if it is not findable, then the previous currentThread is 56.23 + // blocked permanently. We record this as a deadlock. 56.24 + num_deadlocks++; 56.25 + 56.26 + cycle->set_deadlock(true); 56.27 + 56.28 + // add this cycle to the deadlocks list 56.29 + if (deadlocks == NULL) { 56.30 + deadlocks = cycle; 56.31 + } else { 56.32 + last->set_next(cycle); 56.33 + } 56.34 + last = cycle; 56.35 + cycle = new DeadlockCycle(); 56.36 + break; 56.37 + } 56.38 } else { 56.39 if (concurrent_locks) { 56.40 if (waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass())) { 56.41 @@ -841,7 +861,17 @@ 56.42 owner_desc = " (JVMTI raw monitor),\n which is held by"; 56.43 } 56.44 currentThread = Threads::owning_thread_from_monitor_owner( 56.45 - (address)waitingToLockMonitor->owner(), false /* no locking needed */); 56.46 + (address)waitingToLockMonitor->owner(), 56.47 + false /* no locking needed */); 56.48 + if (currentThread == NULL) { 56.49 + // The deadlock was detected at a safepoint so the JavaThread 56.50 + // that owns waitingToLockMonitor should be findable, but 56.51 + // if it is not findable, then the previous currentThread is 56.52 + // blocked permanently. 56.53 + st->print("%s UNKNOWN_owner_addr=" PTR_FORMAT, owner_desc, 56.54 + (address)waitingToLockMonitor->owner()); 56.55 + continue; 56.56 + } 56.57 } else { 56.58 st->print(" waiting for ownable synchronizer " INTPTR_FORMAT ", (a %s)", 56.59 (address)waitingToLockBlocker,
57.1 --- a/src/share/vm/utilities/numberSeq.cpp Mon Mar 11 12:56:00 2013 +0000 57.2 +++ b/src/share/vm/utilities/numberSeq.cpp Mon Mar 11 15:37:10 2013 +0100 57.3 @@ -245,7 +245,7 @@ 57.4 57.5 void NumberSeq::dump_on(outputStream* s) { 57.6 AbsSeq::dump_on(s); 57.7 - s->print_cr("\t\t _last = %7.3f, _maximum = %7.3f"); 57.8 + s->print_cr("\t\t _last = %7.3f, _maximum = %7.3f", _last, _maximum); 57.9 } 57.10 57.11 void TruncatedSeq::dump_on(outputStream* s) {
58.1 --- a/test/compiler/6431242/Test.java Mon Mar 11 12:56:00 2013 +0000 58.2 +++ b/test/compiler/6431242/Test.java Mon Mar 11 15:37:10 2013 +0100 58.3 @@ -25,7 +25,7 @@ 58.4 /* 58.5 * @test 58.6 * @bug 6431242 58.7 - * @run main/othervm -server -XX:+PrintCompilation Test 58.8 + * @run main Test 58.9 */ 58.10 58.11 public class Test{
59.1 --- a/test/compiler/6589834/Test_ia32.java Mon Mar 11 12:56:00 2013 +0000 59.2 +++ b/test/compiler/6589834/Test_ia32.java Mon Mar 11 15:37:10 2013 +0100 59.3 @@ -26,7 +26,7 @@ 59.4 * @bug 6589834 59.5 * @summary deoptimization problem with -XX:+DeoptimizeALot 59.6 * 59.7 - * @run main/othervm -server Test_ia32 59.8 + * @run main Test_ia32 59.9 */ 59.10 59.11 /***************************************************************************************
60.1 --- a/test/compiler/6636138/Test1.java Mon Mar 11 12:56:00 2013 +0000 60.2 +++ b/test/compiler/6636138/Test1.java Mon Mar 11 15:37:10 2013 +0100 60.3 @@ -26,7 +26,7 @@ 60.4 * @bug 6636138 60.5 * @summary SuperWord::co_locate_pack(Node_List* p) generates memory graph that leads to memory order violation. 60.6 * 60.7 - * @run main/othervm -server -Xbatch -XX:CompileOnly=Test1.init Test1 60.8 + * @run main/othervm -Xbatch -XX:CompileOnly=Test1.init Test1 60.9 */ 60.10 60.11 public class Test1 {
61.1 --- a/test/compiler/6636138/Test2.java Mon Mar 11 12:56:00 2013 +0000 61.2 +++ b/test/compiler/6636138/Test2.java Mon Mar 11 15:37:10 2013 +0100 61.3 @@ -26,7 +26,7 @@ 61.4 * @bug 6636138 61.5 * @summary SuperWord::co_locate_pack(Node_List* p) generates memory graph that leads to memory order violation. 61.6 * 61.7 - * @run main/othervm -server -Xbatch -XX:CompileOnly=Test2.shift Test2 61.8 + * @run main/othervm -Xbatch -XX:CompileOnly=Test2.shift Test2 61.9 */ 61.10 61.11 public class Test2 {
62.1 --- a/test/compiler/6795161/Test.java Mon Mar 11 12:56:00 2013 +0000 62.2 +++ b/test/compiler/6795161/Test.java Mon Mar 11 15:37:10 2013 +0100 62.3 @@ -26,7 +26,7 @@ 62.4 * @test 62.5 * @bug 6795161 62.6 * @summary Escape analysis leads to data corruption 62.7 - * @run main/othervm -server -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:CompileOnly=Test -XX:+DoEscapeAnalysis Test 62.8 + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -Xcomp -XX:CompileOnly=Test -XX:+DoEscapeAnalysis Test 62.9 */ 62.10 62.11 class Test_Class_1 {
63.1 --- a/test/compiler/6946040/TestCharShortByteSwap.java Mon Mar 11 12:56:00 2013 +0000 63.2 +++ b/test/compiler/6946040/TestCharShortByteSwap.java Mon Mar 11 15:37:10 2013 +0100 63.3 @@ -26,7 +26,7 @@ 63.4 * @test 63.5 * @bug 6946040 63.6 * @summary Tests Character/Short.reverseBytes and their intrinsics implementation in the server compiler 63.7 - * @run main/othervm -Xbatch -server -XX:CompileOnly=.testChar,.testShort TestCharShortByteSwap 63.8 + * @run main/othervm -Xbatch -XX:CompileOnly=.testChar,.testShort TestCharShortByteSwap 63.9 */ 63.10 63.11 // This test must run without any command line arguments.
64.1 --- a/test/compiler/7068051/Test7068051.sh Mon Mar 11 12:56:00 2013 +0000 64.2 +++ b/test/compiler/7068051/Test7068051.sh Mon Mar 11 15:37:10 2013 +0100 64.3 @@ -45,5 +45,5 @@ 64.4 64.5 ${TESTJAVA}/bin/javac -d . Test7068051.java 64.6 64.7 -${TESTJAVA}/bin/java -showversion -Xbatch ${TESTVMOPTS} Test7068051 foo.jar 64.8 +${TESTJAVA}/bin/java ${TESTVMOPTS} -showversion -Xbatch Test7068051 foo.jar 64.9
65.1 --- a/test/compiler/8000805/Test8000805.java Mon Mar 11 12:56:00 2013 +0000 65.2 +++ b/test/compiler/8000805/Test8000805.java Mon Mar 11 15:37:10 2013 +0100 65.3 @@ -26,7 +26,7 @@ 65.4 * @bug 8000805 65.5 * @summary JMM issue: short loads are non-atomic 65.6 * 65.7 - * @run main/othervm -server -XX:-TieredCompilation -Xcomp -XX:+PrintCompilation -XX:CompileOnly=Test8000805.loadS2LmaskFF,Test8000805.loadS2Lmask16,Test8000805.loadS2Lmask13,Test8000805.loadUS_signExt,Test8000805.loadB2L_mask8 Test8000805 65.8 + * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation -Xcomp -XX:+PrintCompilation -XX:CompileOnly=Test8000805.loadS2LmaskFF,Test8000805.loadS2Lmask16,Test8000805.loadS2Lmask13,Test8000805.loadUS_signExt,Test8000805.loadB2L_mask8 Test8000805 65.9 */ 65.10 65.11 public class Test8000805 {