Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
986d79a1
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看板
提交
986d79a1
编写于
9月 09, 2014
作者:
D
drchase
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
e3a68ba3
171718e4
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
312 addition
and
48 deletion
+312
-48
src/share/vm/ci/ciMethod.cpp
src/share/vm/ci/ciMethod.cpp
+16
-0
src/share/vm/ci/ciMethod.hpp
src/share/vm/ci/ciMethod.hpp
+2
-0
src/share/vm/compiler/compilerOracle.cpp
src/share/vm/compiler/compilerOracle.cpp
+285
-48
src/share/vm/compiler/compilerOracle.hpp
src/share/vm/compiler/compilerOracle.hpp
+5
-0
src/share/vm/opto/compile.hpp
src/share/vm/opto/compile.hpp
+4
-0
未找到文件。
src/share/vm/ci/ciMethod.cpp
浏览文件 @
986d79a1
...
...
@@ -1105,6 +1105,22 @@ bool ciMethod::has_option(const char* option) {
return
CompilerOracle
::
has_option_string
(
mh
,
option
);
}
// ------------------------------------------------------------------
// ciMethod::has_option_value
//
template
<
typename
T
>
bool
ciMethod
::
has_option_value
(
const
char
*
option
,
T
&
value
)
{
check_is_loaded
();
VM_ENTRY_MARK
;
methodHandle
mh
(
THREAD
,
get_Method
());
return
CompilerOracle
::
has_option_value
(
mh
,
option
,
value
);
}
// Explicit instantiation for all OptionTypes supported.
template
bool
ciMethod
::
has_option_value
<
intx
>(
const
char
*
option
,
intx
&
value
);
template
bool
ciMethod
::
has_option_value
<
uintx
>(
const
char
*
option
,
uintx
&
value
);
template
bool
ciMethod
::
has_option_value
<
bool
>(
const
char
*
option
,
bool
&
value
);
template
bool
ciMethod
::
has_option_value
<
ccstr
>(
const
char
*
option
,
ccstr
&
value
);
// ------------------------------------------------------------------
// ciMethod::can_be_compiled
//
...
...
src/share/vm/ci/ciMethod.hpp
浏览文件 @
986d79a1
...
...
@@ -264,6 +264,8 @@ class ciMethod : public ciMetadata {
bool
should_print_assembly
();
bool
break_at_execute
();
bool
has_option
(
const
char
*
option
);
template
<
typename
T
>
bool
has_option_value
(
const
char
*
option
,
T
&
value
);
bool
can_be_compiled
();
bool
can_be_osr_compiled
(
int
entry_bci
);
void
set_not_compilable
(
const
char
*
reason
=
NULL
);
...
...
src/share/vm/compiler/compilerOracle.cpp
浏览文件 @
986d79a1
...
...
@@ -167,44 +167,134 @@ bool MethodMatcher::match(Symbol* candidate, Symbol* match, Mode match_mode) {
}
}
enum
OptionType
{
IntxType
,
UintxType
,
BoolType
,
CcstrType
,
UnknownType
};
class
MethodOptionMatcher
:
public
MethodMatcher
{
const
char
*
option
;
public:
MethodOptionMatcher
(
Symbol
*
class_name
,
Mode
class_mode
,
Symbol
*
method_name
,
Mode
method_mode
,
Symbol
*
signature
,
const
char
*
opt
,
MethodMatcher
*
next
)
:
MethodMatcher
(
class_name
,
class_mode
,
method_name
,
method_mode
,
signature
,
next
)
{
option
=
opt
;
/* Methods to map real type names to OptionType */
template
<
typename
T
>
static
OptionType
get_type_for
()
{
return
UnknownType
;
};
template
<
>
OptionType
get_type_for
<
intx
>
()
{
return
IntxType
;
}
template
<
>
OptionType
get_type_for
<
uintx
>
()
{
return
UintxType
;
}
template
<
>
OptionType
get_type_for
<
bool
>
()
{
return
BoolType
;
}
template
<
>
OptionType
get_type_for
<
ccstr
>
()
{
return
CcstrType
;
}
template
<
typename
T
>
static
const
T
copy_value
(
const
T
value
)
{
return
value
;
}
template
<
>
const
ccstr
copy_value
<
ccstr
>
(
const
ccstr
value
)
{
return
(
const
ccstr
)
strdup
(
value
);
}
template
<
typename
T
>
class
TypedMethodOptionMatcher
:
public
MethodMatcher
{
const
char
*
_option
;
OptionType
_type
;
const
T
_value
;
public:
TypedMethodOptionMatcher
(
Symbol
*
class_name
,
Mode
class_mode
,
Symbol
*
method_name
,
Mode
method_mode
,
Symbol
*
signature
,
const
char
*
opt
,
const
T
value
,
MethodMatcher
*
next
)
:
MethodMatcher
(
class_name
,
class_mode
,
method_name
,
method_mode
,
signature
,
next
),
_type
(
get_type_for
<
T
>
()),
_value
(
copy_value
<
T
>
(
value
))
{
_option
=
strdup
(
opt
);
}
bool
match
(
methodHandle
method
,
const
char
*
opt
)
{
MethodOptionMatcher
*
current
=
this
;
~
TypedMethodOptionMatcher
()
{
free
((
void
*
)
_option
);
}
TypedMethodOptionMatcher
*
match
(
methodHandle
method
,
const
char
*
opt
)
{
TypedMethodOptionMatcher
*
current
=
this
;
while
(
current
!=
NULL
)
{
current
=
(
MethodOptionMatcher
*
)
current
->
find
(
method
);
current
=
(
Typed
MethodOptionMatcher
*
)
current
->
find
(
method
);
if
(
current
==
NULL
)
{
return
false
;
return
NULL
;
}
if
(
strcmp
(
current
->
option
,
opt
)
==
0
)
{
return
true
;
if
(
strcmp
(
current
->
_
option
,
opt
)
==
0
)
{
return
current
;
}
current
=
current
->
next
();
}
return
false
;
return
NULL
;
}
MethodOptionMatcher
*
next
()
{
return
(
MethodOptionMatcher
*
)
_next
;
Typed
MethodOptionMatcher
*
next
()
{
return
(
Typed
MethodOptionMatcher
*
)
_next
;
}
virtual
void
print
()
{
OptionType
get_type
(
void
)
{
return
_type
;
};
T
value
()
{
return
_value
;
}
void
print
()
{
ttyLocker
ttyl
;
print_base
();
tty
->
print
(
" %s"
,
option
);
tty
->
print
(
" %s"
,
_option
);
tty
->
print
(
" <unknown option type>"
);
tty
->
cr
();
}
};
template
<
>
void
TypedMethodOptionMatcher
<
intx
>::
print
()
{
ttyLocker
ttyl
;
print_base
();
tty
->
print
(
" intx %s"
,
_option
);
tty
->
print
(
" = "
INTX_FORMAT
,
_value
);
tty
->
cr
();
};
template
<
>
void
TypedMethodOptionMatcher
<
uintx
>::
print
()
{
ttyLocker
ttyl
;
print_base
();
tty
->
print
(
" uintx %s"
,
_option
);
tty
->
print
(
" = "
UINTX_FORMAT
,
_value
);
tty
->
cr
();
};
template
<
>
void
TypedMethodOptionMatcher
<
bool
>::
print
()
{
ttyLocker
ttyl
;
print_base
();
tty
->
print
(
" bool %s"
,
_option
);
tty
->
print
(
" = %s"
,
_value
?
"true"
:
"false"
);
tty
->
cr
();
};
template
<
>
void
TypedMethodOptionMatcher
<
ccstr
>::
print
()
{
ttyLocker
ttyl
;
print_base
();
tty
->
print
(
" const char* %s"
,
_option
);
tty
->
print
(
" = '%s'"
,
_value
);
tty
->
cr
();
};
// this must parallel the command_names below
enum
OracleCommand
{
...
...
@@ -259,23 +349,46 @@ static MethodMatcher* add_predicate(OracleCommand command,
return
lists
[
command
];
}
template
<
typename
T
>
static
MethodMatcher
*
add_option_string
(
Symbol
*
class_name
,
MethodMatcher
::
Mode
c_mode
,
Symbol
*
method_name
,
MethodMatcher
::
Mode
m_mode
,
Symbol
*
signature
,
const
char
*
option
)
{
lists
[
OptionCommand
]
=
new
MethodOptionMatcher
(
class_name
,
c_mode
,
method_name
,
m_mode
,
signature
,
option
,
lists
[
OptionCommand
]);
const
char
*
option
,
T
value
)
{
lists
[
OptionCommand
]
=
new
TypedMethodOptionMatcher
<
T
>
(
class_name
,
c_mode
,
method_name
,
m_mode
,
signature
,
option
,
value
,
lists
[
OptionCommand
]);
return
lists
[
OptionCommand
];
}
template
<
typename
T
>
static
bool
get_option_value
(
methodHandle
method
,
const
char
*
option
,
T
&
value
)
{
TypedMethodOptionMatcher
<
T
>*
m
;
if
(
lists
[
OptionCommand
]
!=
NULL
&&
(
m
=
((
TypedMethodOptionMatcher
<
T
>*
)
lists
[
OptionCommand
])
->
match
(
method
,
option
))
!=
NULL
&&
m
->
get_type
()
==
get_type_for
<
T
>
())
{
value
=
m
->
value
();
return
true
;
}
else
{
return
false
;
}
}
bool
CompilerOracle
::
has_option_string
(
methodHandle
method
,
const
char
*
option
)
{
return
lists
[
OptionCommand
]
!=
NULL
&&
((
MethodOptionMatcher
*
)
lists
[
OptionCommand
])
->
match
(
method
,
option
);
bool
value
=
false
;
get_option_value
(
method
,
option
,
value
);
return
value
;
}
template
<
typename
T
>
bool
CompilerOracle
::
has_option_value
(
methodHandle
method
,
const
char
*
option
,
T
&
value
)
{
return
::
get_option_value
(
method
,
option
,
value
);
}
// Explicit instantiation for all OptionTypes supported.
template
bool
CompilerOracle
::
has_option_value
<
intx
>(
methodHandle
method
,
const
char
*
option
,
intx
&
value
);
template
bool
CompilerOracle
::
has_option_value
<
uintx
>(
methodHandle
method
,
const
char
*
option
,
uintx
&
value
);
template
bool
CompilerOracle
::
has_option_value
<
bool
>(
methodHandle
method
,
const
char
*
option
,
bool
&
value
);
template
bool
CompilerOracle
::
has_option_value
<
ccstr
>(
methodHandle
method
,
const
char
*
option
,
ccstr
&
value
);
bool
CompilerOracle
::
should_exclude
(
methodHandle
method
,
bool
&
quietly
)
{
quietly
=
true
;
...
...
@@ -433,6 +546,94 @@ static bool scan_line(const char * line,
// Scan next flag and value in line, return MethodMatcher object on success, NULL on failure.
// On failure, error_msg contains description for the first error.
// For future extensions: set error_msg on first error.
static
MethodMatcher
*
scan_flag_and_value
(
const
char
*
type
,
const
char
*
line
,
int
&
total_bytes_read
,
Symbol
*
c_name
,
MethodMatcher
::
Mode
c_match
,
Symbol
*
m_name
,
MethodMatcher
::
Mode
m_match
,
Symbol
*
signature
,
char
*
errorbuf
,
const
int
buf_size
)
{
total_bytes_read
=
0
;
int
bytes_read
=
0
;
char
flag
[
256
];
// Read flag name.
if
(
sscanf
(
line
,
"%*[
\t
]%255[a-zA-Z0-9]%n"
,
flag
,
&
bytes_read
)
==
1
)
{
line
+=
bytes_read
;
total_bytes_read
+=
bytes_read
;
// Read value.
if
(
strcmp
(
type
,
"intx"
)
==
0
)
{
intx
value
;
if
(
sscanf
(
line
,
"%*[
\t
]"
INTX_FORMAT
"%n"
,
&
value
,
&
bytes_read
)
==
1
)
{
total_bytes_read
+=
bytes_read
;
return
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
flag
,
value
);
}
else
{
jio_snprintf
(
errorbuf
,
buf_size
,
" Value cannot be read for flag %s of type %s "
,
flag
,
type
);
}
}
else
if
(
strcmp
(
type
,
"uintx"
)
==
0
)
{
uintx
value
;
if
(
sscanf
(
line
,
"%*[
\t
]"
UINTX_FORMAT
"%n"
,
&
value
,
&
bytes_read
)
==
1
)
{
total_bytes_read
+=
bytes_read
;
return
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
flag
,
value
);
}
else
{
jio_snprintf
(
errorbuf
,
buf_size
,
" Value cannot be read for flag %s of type %s"
,
flag
,
type
);
}
}
else
if
(
strcmp
(
type
,
"ccstr"
)
==
0
)
{
ResourceMark
rm
;
char
*
value
=
NEW_RESOURCE_ARRAY
(
char
,
strlen
(
line
)
+
1
);
if
(
sscanf
(
line
,
"%*[
\t
]%255[_a-zA-Z0-9]%n"
,
value
,
&
bytes_read
)
==
1
)
{
total_bytes_read
+=
bytes_read
;
return
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
flag
,
(
ccstr
)
value
);
}
else
{
jio_snprintf
(
errorbuf
,
buf_size
,
" Value cannot be read for flag %s of type %s"
,
flag
,
type
);
}
}
else
if
(
strcmp
(
type
,
"ccstrlist"
)
==
0
)
{
// Accumulates several strings into one. The internal type is ccstr.
ResourceMark
rm
;
char
*
value
=
NEW_RESOURCE_ARRAY
(
char
,
strlen
(
line
)
+
1
);
char
*
next_value
=
value
;
if
(
sscanf
(
line
,
"%*[
\t
]%255[_a-zA-Z0-9]%n"
,
next_value
,
&
bytes_read
)
==
1
)
{
total_bytes_read
+=
bytes_read
;
line
+=
bytes_read
;
next_value
+=
bytes_read
;
char
*
end_value
=
next_value
-
1
;
while
(
sscanf
(
line
,
"%*[
\t
]%255[_a-zA-Z0-9]%n"
,
next_value
,
&
bytes_read
)
==
1
)
{
total_bytes_read
+=
bytes_read
;
line
+=
bytes_read
;
*
end_value
=
' '
;
// override '\0'
next_value
+=
bytes_read
;
end_value
=
next_value
-
1
;
}
return
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
flag
,
(
ccstr
)
value
);
}
else
{
jio_snprintf
(
errorbuf
,
buf_size
,
" Value cannot be read for flag %s of type %s"
,
flag
,
type
);
}
}
else
if
(
strcmp
(
type
,
"bool"
)
==
0
)
{
char
value
[
256
];
if
(
sscanf
(
line
,
"%*[
\t
]%255[a-zA-Z]%n"
,
value
,
&
bytes_read
)
==
1
)
{
if
(
strcmp
(
value
,
"true"
)
==
0
)
{
total_bytes_read
+=
bytes_read
;
return
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
flag
,
true
);
}
else
if
(
strcmp
(
value
,
"false"
)
==
0
)
{
total_bytes_read
+=
bytes_read
;
return
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
flag
,
false
);
}
else
{
jio_snprintf
(
errorbuf
,
buf_size
,
" Value cannot be read for flag %s of type %s"
,
flag
,
type
);
}
}
else
{
jio_snprintf
(
errorbuf
,
sizeof
(
errorbuf
),
" Value cannot be read for flag %s of type %s"
,
flag
,
type
);
}
}
else
{
jio_snprintf
(
errorbuf
,
sizeof
(
errorbuf
),
" Type %s not supported "
,
type
);
}
}
else
{
jio_snprintf
(
errorbuf
,
sizeof
(
errorbuf
),
" Flag name for type %s should be alphanumeric "
,
type
);
}
return
NULL
;
}
void
CompilerOracle
::
parse_from_line
(
char
*
line
)
{
if
(
line
[
0
]
==
'\0'
)
return
;
if
(
line
[
0
]
==
'#'
)
return
;
...
...
@@ -462,8 +663,10 @@ void CompilerOracle::parse_from_line(char* line) {
int
bytes_read
;
OracleCommand
command
=
parse_command_name
(
line
,
&
bytes_read
);
line
+=
bytes_read
;
ResourceMark
rm
;
if
(
command
==
UnknownCommand
)
{
ttyLocker
ttyl
;
tty
->
print_cr
(
"CompilerOracle: unrecognized line"
);
tty
->
print_cr
(
"
\"
%s
\"
"
,
original_line
);
return
;
...
...
@@ -485,7 +688,7 @@ void CompilerOracle::parse_from_line(char* line) {
char
method_name
[
256
];
char
sig
[
1024
];
char
errorbuf
[
1024
];
const
char
*
error_msg
=
NULL
;
const
char
*
error_msg
=
NULL
;
// description of first error that appears
MethodMatcher
*
match
=
NULL
;
if
(
scan_line
(
line
,
class_name
,
&
c_match
,
method_name
,
&
m_match
,
&
bytes_read
,
error_msg
))
{
...
...
@@ -504,43 +707,77 @@ void CompilerOracle::parse_from_line(char* line) {
}
if
(
command
==
OptionCommand
)
{
// Look for trailing options to support
// ciMethod::has_option("string") to control features in the
// compiler. Multiple options may follow the method name.
char
option
[
256
];
// Look for trailing options.
//
// Two types of trailing options are
// supported:
//
// (1) CompileCommand=option,Klass::method,flag
// (2) CompileCommand=option,Klass::method,type,flag,value
//
// Type (1) is used to support ciMethod::has_option("someflag")
// (i.e., to check if a flag "someflag" is enabled for a method).
//
// Type (2) is used to support options with a value. Values can have the
// the following types: intx, uintx, bool, ccstr, and ccstrlist.
//
// For future extensions: extend scan_flag_and_value()
char
option
[
256
];
// stores flag for Type (1) and type of Type (2)
while
(
sscanf
(
line
,
"%*[
\t
]%255[a-zA-Z0-9]%n"
,
option
,
&
bytes_read
)
==
1
)
{
if
(
match
!=
NULL
&&
!
_quiet
)
{
// Print out the last match added
ttyLocker
ttyl
;
tty
->
print
(
"CompilerOracle: %s "
,
command_names
[
command
]);
match
->
print
();
}
match
=
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
strdup
(
option
));
line
+=
bytes_read
;
}
if
(
strcmp
(
option
,
"intx"
)
==
0
||
strcmp
(
option
,
"uintx"
)
==
0
||
strcmp
(
option
,
"bool"
)
==
0
||
strcmp
(
option
,
"ccstr"
)
==
0
||
strcmp
(
option
,
"ccstrlist"
)
==
0
)
{
// Type (2) option: parse flag name and value.
match
=
scan_flag_and_value
(
option
,
line
,
bytes_read
,
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
errorbuf
,
sizeof
(
errorbuf
));
if
(
match
==
NULL
)
{
error_msg
=
errorbuf
;
break
;
}
line
+=
bytes_read
;
}
else
{
// Type (1) option
match
=
add_option_string
(
c_name
,
c_match
,
m_name
,
m_match
,
signature
,
option
,
true
);
}
}
// while(
}
else
{
bytes_read
=
0
;
sscanf
(
line
,
"%*[
\t
]%n"
,
&
bytes_read
);
if
(
line
[
bytes_read
]
!=
'\0'
)
{
jio_snprintf
(
errorbuf
,
sizeof
(
errorbuf
),
" Unrecognized text after command: %s"
,
line
);
error_msg
=
errorbuf
;
}
else
{
match
=
add_predicate
(
command
,
c_name
,
c_match
,
m_name
,
m_match
,
signature
);
}
match
=
add_predicate
(
command
,
c_name
,
c_match
,
m_name
,
m_match
,
signature
);
}
}
if
(
match
!=
NULL
)
{
if
(
!
_quiet
)
{
ResourceMark
rm
;
tty
->
print
(
"CompilerOracle: %s "
,
command_names
[
command
]);
match
->
print
();
}
}
else
{
ttyLocker
ttyl
;
if
(
error_msg
!=
NULL
)
{
// an error has happened
tty
->
print_cr
(
"CompilerOracle: unrecognized line"
);
tty
->
print_cr
(
"
\"
%s
\"
"
,
original_line
);
if
(
error_msg
!=
NULL
)
{
tty
->
print_cr
(
"%s"
,
error_msg
);
}
}
else
{
// check for remaining characters
bytes_read
=
0
;
sscanf
(
line
,
"%*[
\t
]%n"
,
&
bytes_read
);
if
(
line
[
bytes_read
]
!=
'\0'
)
{
tty
->
print_cr
(
"CompilerOracle: unrecognized line"
);
tty
->
print_cr
(
"
\"
%s
\"
"
,
original_line
);
tty
->
print_cr
(
" Unrecognized text %s after command "
,
line
);
}
else
if
(
match
!=
NULL
&&
!
_quiet
)
{
tty
->
print
(
"CompilerOracle: %s "
,
command_names
[
command
]);
match
->
print
();
}
}
}
...
...
src/share/vm/compiler/compilerOracle.hpp
浏览文件 @
986d79a1
...
...
@@ -64,6 +64,11 @@ class CompilerOracle : AllStatic {
// Check to see if this method has option set for it
static
bool
has_option_string
(
methodHandle
method
,
const
char
*
option
);
// Check if method has option and value set. If yes, overwrite value and return true,
// otherwise leave value unchanged and return false.
template
<
typename
T
>
static
bool
has_option_value
(
methodHandle
method
,
const
char
*
option
,
T
&
value
);
// Reads from string instead of file
static
void
parse_from_string
(
const
char
*
command_string
,
void
(
*
parser
)(
char
*
));
...
...
src/share/vm/opto/compile.hpp
浏览文件 @
986d79a1
...
...
@@ -598,6 +598,10 @@ class Compile : public Phase {
bool
method_has_option
(
const
char
*
option
)
{
return
method
()
!=
NULL
&&
method
()
->
has_option
(
option
);
}
template
<
typename
T
>
bool
method_has_option_value
(
const
char
*
option
,
T
&
value
)
{
return
method
()
!=
NULL
&&
method
()
->
has_option_value
(
option
,
value
);
}
#ifndef PRODUCT
bool
trace_opto_output
()
const
{
return
_trace_opto_output
;
}
bool
parsed_irreducible_loop
()
const
{
return
_parsed_irreducible_loop
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录