Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
f95844ef
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
f95844ef
编写于
5月 16, 2014
作者:
D
dholmes
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
4d3a1720
910fe8b5
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
190 addition
and
77 deletion
+190
-77
.hgtags
.hgtags
+2
-0
make/hotspot_version
make/hotspot_version
+1
-1
src/os/bsd/vm/os_bsd.cpp
src/os/bsd/vm/os_bsd.cpp
+39
-3
src/os/bsd/vm/os_bsd.hpp
src/os/bsd/vm/os_bsd.hpp
+10
-4
src/os/solaris/vm/os_solaris.cpp
src/os/solaris/vm/os_solaris.cpp
+24
-55
src/share/vm/c1/c1_GraphBuilder.cpp
src/share/vm/c1/c1_GraphBuilder.cpp
+13
-10
src/share/vm/c1/c1_GraphBuilder.hpp
src/share/vm/c1/c1_GraphBuilder.hpp
+1
-0
src/share/vm/c1/c1_LIRGenerator.cpp
src/share/vm/c1/c1_LIRGenerator.cpp
+5
-4
src/share/vm/runtime/os.hpp
src/share/vm/runtime/os.hpp
+3
-0
test/compiler/profiling/TestMethodHandleInvokesIntrinsic.java
.../compiler/profiling/TestMethodHandleInvokesIntrinsic.java
+92
-0
未找到文件。
.hgtags
浏览文件 @
f95844ef
...
...
@@ -464,3 +464,5 @@ b6a2ba7d3ea7259a76c8ff1ec22fac9094494c1c hs25.20-b11
47951595af60460a479b8574622375bfbf5c8ed2 jdk8u20-b13
798f5b02be897151fdad44d695446088b1cca6b1 hs25.20-b13
28bbbecff5f08c1e343fc0c40923c05d86b7cf82 hs25.20-b14
c20d8a452574c85c8fc1f7f2d4e788cd6b156bc9 jdk8u20-b14
87bdb86f0aedbd9b9ef8e9999b273114c8be4748 hs25.20-b15
make/hotspot_version
浏览文件 @
f95844ef
...
...
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2014
HS_MAJOR_VER=25
HS_MINOR_VER=20
HS_BUILD_NUMBER=1
5
HS_BUILD_NUMBER=1
6
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
...
...
src/os/bsd/vm/os_bsd.cpp
浏览文件 @
f95844ef
...
...
@@ -127,8 +127,12 @@
// global variables
julong
os
::
Bsd
::
_physical_memory
=
0
;
#ifdef __APPLE__
mach_timebase_info_data_t
os
::
Bsd
::
_timebase_info
=
{
0
,
0
};
volatile
uint64_t
os
::
Bsd
::
_max_abstime
=
0
;
#else
int
(
*
os
::
Bsd
::
_clock_gettime
)(
clockid_t
,
struct
timespec
*
)
=
NULL
;
#endif
pthread_t
os
::
Bsd
::
_main_thread
;
int
os
::
Bsd
::
_page_size
=
-
1
;
...
...
@@ -986,13 +990,15 @@ jlong os::javaTimeMillis() {
return
jlong
(
time
.
tv_sec
)
*
1000
+
jlong
(
time
.
tv_usec
/
1000
);
}
#ifndef __APPLE__
#ifndef CLOCK_MONOTONIC
#define CLOCK_MONOTONIC (1)
#endif
#endif
#ifdef __APPLE__
void
os
::
Bsd
::
clock_init
()
{
// XXXDARWIN: Investigate replacement monotonic clock
mach_timebase_info
(
&
_timebase_info
);
}
#else
void
os
::
Bsd
::
clock_init
()
{
...
...
@@ -1007,10 +1013,38 @@ void os::Bsd::clock_init() {
#endif
#ifdef __APPLE__
jlong
os
::
javaTimeNanos
()
{
const
uint64_t
tm
=
mach_absolute_time
();
const
uint64_t
now
=
(
tm
*
Bsd
::
_timebase_info
.
numer
)
/
Bsd
::
_timebase_info
.
denom
;
const
uint64_t
prev
=
Bsd
::
_max_abstime
;
if
(
now
<=
prev
)
{
return
prev
;
// same or retrograde time;
}
const
uint64_t
obsv
=
Atomic
::
cmpxchg
(
now
,
(
volatile
jlong
*
)
&
Bsd
::
_max_abstime
,
prev
);
assert
(
obsv
>=
prev
,
"invariant"
);
// Monotonicity
// If the CAS succeeded then we're done and return "now".
// If the CAS failed and the observed value "obsv" is >= now then
// we should return "obsv". If the CAS failed and now > obsv > prv then
// some other thread raced this thread and installed a new value, in which case
// we could either (a) retry the entire operation, (b) retry trying to install now
// or (c) just return obsv. We use (c). No loop is required although in some cases
// we might discard a higher "now" value in deference to a slightly lower but freshly
// installed obsv value. That's entirely benign -- it admits no new orderings compared
// to (a) or (b) -- and greatly reduces coherence traffic.
// We might also condition (c) on the magnitude of the delta between obsv and now.
// Avoiding excessive CAS operations to hot RW locations is critical.
// See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
return
(
prev
==
obsv
)
?
now
:
obsv
;
}
#else // __APPLE__
jlong
os
::
javaTimeNanos
()
{
if
(
Bsd
::
supports_monotonic_clock
())
{
struct
timespec
tp
;
int
status
=
Bsd
::
clock_gettime
(
CLOCK_MONOTONIC
,
&
tp
);
int
status
=
Bsd
::
_
clock_gettime
(
CLOCK_MONOTONIC
,
&
tp
);
assert
(
status
==
0
,
"gettime error"
);
jlong
result
=
jlong
(
tp
.
tv_sec
)
*
(
1000
*
1000
*
1000
)
+
jlong
(
tp
.
tv_nsec
);
return
result
;
...
...
@@ -1023,6 +1057,8 @@ jlong os::javaTimeNanos() {
}
}
#endif // __APPLE__
void
os
::
javaTimeNanos_info
(
jvmtiTimerInfo
*
info_ptr
)
{
if
(
Bsd
::
supports_monotonic_clock
())
{
info_ptr
->
max_value
=
ALL_64_BITS
;
...
...
src/os/bsd/vm/os_bsd.hpp
浏览文件 @
f95844ef
...
...
@@ -58,7 +58,13 @@ class Bsd {
// For signal flags diagnostics
static
int
sigflags
[
MAXSIGNUM
];
#ifdef __APPLE__
// mach_absolute_time
static
mach_timebase_info_data_t
_timebase_info
;
static
volatile
uint64_t
_max_abstime
;
#else
static
int
(
*
_clock_gettime
)(
clockid_t
,
struct
timespec
*
);
#endif
static
GrowableArray
<
int
>*
_cpu_to_node
;
...
...
@@ -135,11 +141,11 @@ class Bsd {
static
void
clock_init
(
void
);
static
inline
bool
supports_monotonic_clock
()
{
#ifdef __APPLE__
return
true
;
#else
return
_clock_gettime
!=
NULL
;
}
static
int
clock_gettime
(
clockid_t
clock_id
,
struct
timespec
*
tp
)
{
return
_clock_gettime
?
_clock_gettime
(
clock_id
,
tp
)
:
-
1
;
#endif
}
// Stack repair handling
...
...
src/os/solaris/vm/os_solaris.cpp
浏览文件 @
f95844ef
...
...
@@ -415,11 +415,7 @@ julong os::physical_memory() {
static
hrtime_t
first_hrtime
=
0
;
static
const
hrtime_t
hrtime_hz
=
1000
*
1000
*
1000
;
const
int
LOCK_BUSY
=
1
;
const
int
LOCK_FREE
=
0
;
const
int
LOCK_INVALID
=
-
1
;
static
volatile
hrtime_t
max_hrtime
=
0
;
static
volatile
int
max_hrtime_lock
=
LOCK_FREE
;
// Update counter with LSB as lock-in-progress
void
os
::
Solaris
::
initialize_system_info
()
{
...
...
@@ -1534,58 +1530,31 @@ void* os::thread_local_storage_at(int index) {
}
// gethrtime can move backwards if read from one cpu and then a different cpu
// getTimeNanos is guaranteed to not move backward on Solaris
// local spinloop created as faster for a CAS on an int than
// a CAS on a 64bit jlong. Also Atomic::cmpxchg for jlong is not
// supported on sparc v8 or pre supports_cx8 intel boxes.
// oldgetTimeNanos for systems which do not support CAS on 64bit jlong
// i.e. sparc v8 and pre supports_cx8 (i486) intel boxes
inline
hrtime_t
oldgetTimeNanos
()
{
int
gotlock
=
LOCK_INVALID
;
hrtime_t
newtime
=
gethrtime
();
for
(;;)
{
// grab lock for max_hrtime
int
curlock
=
max_hrtime_lock
;
if
(
curlock
&
LOCK_BUSY
)
continue
;
if
(
gotlock
=
Atomic
::
cmpxchg
(
LOCK_BUSY
,
&
max_hrtime_lock
,
LOCK_FREE
)
!=
LOCK_FREE
)
continue
;
if
(
newtime
>
max_hrtime
)
{
max_hrtime
=
newtime
;
}
else
{
newtime
=
max_hrtime
;
}
// release lock
max_hrtime_lock
=
LOCK_FREE
;
return
newtime
;
}
}
// gethrtime can move backwards if read from one cpu and then a different cpu
// getTimeNanos is guaranteed to not move backward on Solaris
// gethrtime() should be monotonic according to the documentation,
// but some virtualized platforms are known to break this guarantee.
// getTimeNanos() must be guaranteed not to move backwards, so we
// are forced to add a check here.
inline
hrtime_t
getTimeNanos
()
{
if
(
VM_Version
::
supports_cx8
())
{
const
hrtime_t
now
=
gethrtime
();
// Use atomic long load since 32-bit x86 uses 2 registers to keep long.
const
hrtime_t
prev
=
Atomic
::
load
((
volatile
jlong
*
)
&
max_hrtime
);
if
(
now
<=
prev
)
return
prev
;
// same or retrograde time;
const
hrtime_t
prev
=
max_hrtime
;
if
(
now
<=
prev
)
{
return
prev
;
// same or retrograde time;
}
const
hrtime_t
obsv
=
Atomic
::
cmpxchg
(
now
,
(
volatile
jlong
*
)
&
max_hrtime
,
prev
);
assert
(
obsv
>=
prev
,
"invariant"
);
// Monotonicity
// If the CAS succeeded then we're done and return "now".
// If the CAS failed and the observed value "obs
" is >= now then
// we should return "obs". If the CAS failed and now > obs
> prv then
// If the CAS failed and the observed value "obsv
" is >= now then
// we should return "obsv". If the CAS failed and now > obsv
> prv then
// some other thread raced this thread and installed a new value, in which case
// we could either (a) retry the entire operation, (b) retry trying to install now
// or (c) just return obs
. We use (c). No loop is required although in some cases
// or (c) just return obsv
. We use (c). No loop is required although in some cases
// we might discard a higher "now" value in deference to a slightly lower but freshly
// installed obs
value. That's entirely benign -- it admits no new orderings compared
// installed obsv
value. That's entirely benign -- it admits no new orderings compared
// to (a) or (b) -- and greatly reduces coherence traffic.
// We might also condition (c) on the magnitude of the delta between obs
and now.
// We might also condition (c) on the magnitude of the delta between obsv
and now.
// Avoiding excessive CAS operations to hot RW locations is critical.
// See http://blogs.sun.com/dave/entry/cas_and_cache_trivia_invalidate
return
(
prev
==
obsv
)
?
now
:
obsv
;
}
else
{
return
oldgetTimeNanos
();
}
// See https://blogs.oracle.com/dave/entry/cas_and_cache_trivia_invalidate
return
(
prev
==
obsv
)
?
now
:
obsv
;
}
// Time since start-up in seconds to a fine granularity.
...
...
src/share/vm/c1/c1_GraphBuilder.cpp
浏览文件 @
f95844ef
...
...
@@ -1697,6 +1697,15 @@ Values* GraphBuilder::args_list_for_profiling(ciMethod* target, int& start, bool
return
NULL
;
}
void
GraphBuilder
::
check_args_for_profiling
(
Values
*
obj_args
,
int
expected
)
{
#ifdef ASSERT
bool
ignored_will_link
;
ciSignature
*
declared_signature
=
NULL
;
ciMethod
*
real_target
=
method
()
->
get_method_at_bci
(
bci
(),
ignored_will_link
,
&
declared_signature
);
assert
(
expected
==
obj_args
->
length
()
||
real_target
->
is_method_handle_intrinsic
(),
"missed on arg?"
);
#endif
}
// Collect arguments that we want to profile in a list
Values
*
GraphBuilder
::
collect_args_for_profiling
(
Values
*
args
,
ciMethod
*
target
,
bool
may_have_receiver
)
{
int
start
=
0
;
...
...
@@ -1705,13 +1714,14 @@ Values* GraphBuilder::collect_args_for_profiling(Values* args, ciMethod* target,
return
NULL
;
}
int
s
=
obj_args
->
size
();
for
(
int
i
=
start
,
j
=
0
;
j
<
s
;
i
++
)
{
// if called through method handle invoke, some arguments may have been popped
for
(
int
i
=
start
,
j
=
0
;
j
<
s
&&
i
<
args
->
length
();
i
++
)
{
if
(
args
->
at
(
i
)
->
type
()
->
is_object_kind
())
{
obj_args
->
push
(
args
->
at
(
i
));
j
++
;
}
}
assert
(
s
==
obj_args
->
length
(),
"missed on arg?"
);
check_args_for_profiling
(
obj_args
,
s
);
return
obj_args
;
}
...
...
@@ -3843,14 +3853,7 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known, Bytecode
j
++
;
}
}
#ifdef ASSERT
{
bool
ignored_will_link
;
ciSignature
*
declared_signature
=
NULL
;
ciMethod
*
real_target
=
method
()
->
get_method_at_bci
(
bci
(),
ignored_will_link
,
&
declared_signature
);
assert
(
s
==
obj_args
->
length
()
||
real_target
->
is_method_handle_intrinsic
(),
"missed on arg?"
);
}
#endif
check_args_for_profiling
(
obj_args
,
s
);
}
profile_call
(
callee
,
recv
,
holder_known
?
callee
->
holder
()
:
NULL
,
obj_args
,
true
);
}
...
...
src/share/vm/c1/c1_GraphBuilder.hpp
浏览文件 @
f95844ef
...
...
@@ -392,6 +392,7 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC {
Values
*
args_list_for_profiling
(
ciMethod
*
target
,
int
&
start
,
bool
may_have_receiver
);
Values
*
collect_args_for_profiling
(
Values
*
args
,
ciMethod
*
target
,
bool
may_have_receiver
);
void
check_args_for_profiling
(
Values
*
obj_args
,
int
expected
);
public:
NOT_PRODUCT
(
void
print_stats
();)
...
...
src/share/vm/c1/c1_LIRGenerator.cpp
浏览文件 @
f95844ef
...
...
@@ -2634,8 +2634,10 @@ ciKlass* LIRGenerator::profile_type(ciMethodData* md, int md_base_offset, int md
// LIR_Assembler::emit_profile_type() from emitting useless code
profiled_k
=
ciTypeEntries
::
with_status
(
result
,
profiled_k
);
}
if
(
exact_signature_k
!=
NULL
&&
exact_klass
!=
exact_signature_k
)
{
assert
(
exact_klass
==
NULL
,
"obj and signature disagree?"
);
// exact_klass and exact_signature_k can be both non NULL but
// different if exact_klass is loaded after the ciObject for
// exact_signature_k is created.
if
(
exact_klass
==
NULL
&&
exact_signature_k
!=
NULL
&&
exact_klass
!=
exact_signature_k
)
{
// sometimes the type of the signature is better than the best type
// the compiler has
exact_klass
=
exact_signature_k
;
...
...
@@ -2646,8 +2648,7 @@ ciKlass* LIRGenerator::profile_type(ciMethodData* md, int md_base_offset, int md
if
(
improved_klass
==
NULL
)
{
improved_klass
=
comp
->
cha_exact_type
(
callee_signature_k
);
}
if
(
improved_klass
!=
NULL
&&
exact_klass
!=
improved_klass
)
{
assert
(
exact_klass
==
NULL
,
"obj and signature disagree?"
);
if
(
exact_klass
==
NULL
&&
improved_klass
!=
NULL
&&
exact_klass
!=
improved_klass
)
{
exact_klass
=
exact_signature_k
;
}
}
...
...
src/share/vm/runtime/os.hpp
浏览文件 @
f95844ef
...
...
@@ -48,6 +48,9 @@
#ifdef TARGET_OS_FAMILY_bsd
# include "jvm_bsd.h"
# include <setjmp.h>
# ifdef __APPLE__
# include <mach/mach_time.h>
# endif
#endif
class
AgentLibrary
;
...
...
test/compiler/profiling/TestMethodHandleInvokesIntrinsic.java
0 → 100644
浏览文件 @
f95844ef
/*
* Copyright (c) 2014, Oracle and/or its affiliates. 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.
*
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8041458
* @summary profiling of arguments in C1 at MethodHandle invoke of intrinsic tries to profile popped argument.
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TieredStopAtLevel=3 TestMethodHandleInvokesIntrinsic
*
*/
import
java.lang.invoke.*
;
public
class
TestMethodHandleInvokesIntrinsic
{
static
final
MethodHandle
mh_nanoTime
;
static
final
MethodHandle
mh_getClass
;
static
{
MethodHandles
.
Lookup
lookup
=
MethodHandles
.
lookup
();
MethodType
mt
=
MethodType
.
methodType
(
long
.
class
);
MethodHandle
MH
=
null
;
try
{
MH
=
lookup
.
findStatic
(
System
.
class
,
"nanoTime"
,
mt
);
}
catch
(
NoSuchMethodException
nsme
)
{
nsme
.
printStackTrace
();
throw
new
RuntimeException
(
"TEST FAILED"
,
nsme
);
}
catch
(
IllegalAccessException
iae
)
{
iae
.
printStackTrace
();
throw
new
RuntimeException
(
"TEST FAILED"
,
iae
);
}
mh_nanoTime
=
MH
;
mt
=
MethodType
.
methodType
(
Class
.
class
);
MH
=
null
;
try
{
MH
=
lookup
.
findVirtual
(
Object
.
class
,
"getClass"
,
mt
);
}
catch
(
NoSuchMethodException
nsme
)
{
nsme
.
printStackTrace
();
throw
new
RuntimeException
(
"TEST FAILED"
,
nsme
);
}
catch
(
IllegalAccessException
iae
)
{
iae
.
printStackTrace
();
throw
new
RuntimeException
(
"TEST FAILED"
,
iae
);
}
mh_getClass
=
MH
;
}
static
long
m1
()
throws
Throwable
{
return
(
long
)
mh_nanoTime
.
invokeExact
();
}
static
Class
m2
(
Object
o
)
throws
Throwable
{
return
(
Class
)
mh_getClass
.
invokeExact
(
o
);
}
static
public
void
main
(
String
[]
args
)
{
try
{
for
(
int
i
=
0
;
i
<
20000
;
i
++)
{
m1
();
}
TestMethodHandleInvokesIntrinsic
o
=
new
TestMethodHandleInvokesIntrinsic
();
for
(
int
i
=
0
;
i
<
20000
;
i
++)
{
m2
(
o
);
}
}
catch
(
Throwable
t
)
{
System
.
out
.
println
(
"Unexpected exception"
);
t
.
printStackTrace
();
throw
new
RuntimeException
(
"TEST FAILED"
,
t
);
}
System
.
out
.
println
(
"TEST PASSED"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录