提交 3424b1ae 编写于 作者: A amurillo

Merge

...@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2015 ...@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2015
HS_MAJOR_VER=25 HS_MAJOR_VER=25
HS_MINOR_VER=60 HS_MINOR_VER=60
HS_BUILD_NUMBER=21 HS_BUILD_NUMBER=22
JDK_MAJOR_VER=1 JDK_MAJOR_VER=1
JDK_MINOR_VER=8 JDK_MINOR_VER=8
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* This code is distributed in the hope that it will be useful, but WITHOUT * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file hat * version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code). * accompanied this code).
* *
* You should have received a copy of the GNU General Public License version * You should have received a copy of the GNU General Public License version
......
...@@ -70,8 +70,7 @@ ...@@ -70,8 +70,7 @@
// Loaded method. // Loaded method.
ciMethod::ciMethod(methodHandle h_m, ciInstanceKlass* holder) : ciMethod::ciMethod(methodHandle h_m, ciInstanceKlass* holder) :
ciMetadata(h_m()), ciMetadata(h_m()),
_holder(holder), _holder(holder)
_has_injected_profile(false)
{ {
assert(h_m() != NULL, "no null method"); assert(h_m() != NULL, "no null method");
...@@ -168,8 +167,7 @@ ciMethod::ciMethod(ciInstanceKlass* holder, ...@@ -168,8 +167,7 @@ ciMethod::ciMethod(ciInstanceKlass* holder,
_liveness( NULL), _liveness( NULL),
_can_be_statically_bound(false), _can_be_statically_bound(false),
_method_blocks( NULL), _method_blocks( NULL),
_method_data( NULL), _method_data( NULL)
_has_injected_profile( false)
#if defined(COMPILER2) || defined(SHARK) #if defined(COMPILER2) || defined(SHARK)
, ,
_flow( NULL), _flow( NULL),
......
...@@ -78,7 +78,6 @@ class ciMethod : public ciMetadata { ...@@ -78,7 +78,6 @@ class ciMethod : public ciMetadata {
bool _is_c1_compilable; bool _is_c1_compilable;
bool _is_c2_compilable; bool _is_c2_compilable;
bool _can_be_statically_bound; bool _can_be_statically_bound;
bool _has_injected_profile;
// Lazy fields, filled in on demand // Lazy fields, filled in on demand
address _code; address _code;
...@@ -173,9 +172,9 @@ class ciMethod : public ciMetadata { ...@@ -173,9 +172,9 @@ class ciMethod : public ciMetadata {
// Code size for inlining decisions. // Code size for inlining decisions.
int code_size_for_inlining(); int code_size_for_inlining();
bool caller_sensitive() { return get_Method()->caller_sensitive(); } bool caller_sensitive() const { return get_Method()->caller_sensitive(); }
bool force_inline() { return get_Method()->force_inline(); } bool force_inline() const { return get_Method()->force_inline(); }
bool dont_inline() { return get_Method()->dont_inline(); } bool dont_inline() const { return get_Method()->dont_inline(); }
int comp_level(); int comp_level();
int highest_osr_comp_level(); int highest_osr_comp_level();
...@@ -283,9 +282,6 @@ class ciMethod : public ciMetadata { ...@@ -283,9 +282,6 @@ class ciMethod : public ciMetadata {
int instructions_size(); int instructions_size();
int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC
bool has_injected_profile() const { return _has_injected_profile; }
void set_injected_profile(bool x) { _has_injected_profile = x; }
// Stack walking support // Stack walking support
bool is_ignored_by_security_stack_walk() const; bool is_ignored_by_security_stack_walk() const;
......
...@@ -1783,6 +1783,10 @@ ClassFileParser::AnnotationCollector::annotation_index(ClassLoaderData* loader_d ...@@ -1783,6 +1783,10 @@ ClassFileParser::AnnotationCollector::annotation_index(ClassLoaderData* loader_d
if (_location != _in_method) break; // only allow for methods if (_location != _in_method) break; // only allow for methods
if (!privileged) break; // only allow in privileged code if (!privileged) break; // only allow in privileged code
return _method_DontInline; return _method_DontInline;
case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_InjectedProfile_signature):
if (_location != _in_method) break; // only allow for methods
if (!privileged) break; // only allow in privileged code
return _method_InjectedProfile;
case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature): case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature):
if (_location != _in_method) break; // only allow for methods if (_location != _in_method) break; // only allow for methods
if (!privileged) break; // only allow in privileged code if (!privileged) break; // only allow in privileged code
...@@ -1824,6 +1828,8 @@ void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) { ...@@ -1824,6 +1828,8 @@ void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) {
m->set_force_inline(true); m->set_force_inline(true);
if (has_annotation(_method_DontInline)) if (has_annotation(_method_DontInline))
m->set_dont_inline(true); m->set_dont_inline(true);
if (has_annotation(_method_InjectedProfile))
m->set_has_injected_profile(true);
if (has_annotation(_method_LambdaForm_Compiled) && m->intrinsic_id() == vmIntrinsics::_none) if (has_annotation(_method_LambdaForm_Compiled) && m->intrinsic_id() == vmIntrinsics::_none)
m->set_intrinsic_id(vmIntrinsics::_compiledLambdaForm); m->set_intrinsic_id(vmIntrinsics::_compiledLambdaForm);
if (has_annotation(_method_LambdaForm_Hidden)) if (has_annotation(_method_LambdaForm_Hidden))
......
...@@ -126,6 +126,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { ...@@ -126,6 +126,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
_method_CallerSensitive, _method_CallerSensitive,
_method_ForceInline, _method_ForceInline,
_method_DontInline, _method_DontInline,
_method_InjectedProfile,
_method_LambdaForm_Compiled, _method_LambdaForm_Compiled,
_method_LambdaForm_Hidden, _method_LambdaForm_Hidden,
_sun_misc_Contended, _sun_misc_Contended,
......
...@@ -278,6 +278,7 @@ ...@@ -278,6 +278,7 @@
template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \ template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \
template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \ template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \
template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \ template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \
template(java_lang_invoke_InjectedProfile_signature, "Ljava/lang/invoke/InjectedProfile;") \
template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \ template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \ template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \ template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
......
/* /*
* Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
......
/* /*
* Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
......
...@@ -92,6 +92,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) { ...@@ -92,6 +92,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) {
set_force_inline(false); set_force_inline(false);
set_hidden(false); set_hidden(false);
set_dont_inline(false); set_dont_inline(false);
set_has_injected_profile(false);
set_method_data(NULL); set_method_data(NULL);
clear_method_counters(); clear_method_counters();
set_vtable_index(Method::garbage_vtable_index); set_vtable_index(Method::garbage_vtable_index);
......
...@@ -110,12 +110,13 @@ class Method : public Metadata { ...@@ -110,12 +110,13 @@ class Method : public Metadata {
#endif #endif
u2 _method_size; // size of this object u2 _method_size; // size of this object
u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none) u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none)
u1 _jfr_towrite : 1, // Flags u1 _jfr_towrite : 1, // Flags
_caller_sensitive : 1, _caller_sensitive : 1,
_force_inline : 1, _force_inline : 1,
_hidden : 1, _hidden : 1,
_dont_inline : 1, _dont_inline : 1,
: 3; _has_injected_profile : 1,
: 2;
#ifndef PRODUCT #ifndef PRODUCT
int _compiled_invocation_count; // Number of nmethod invocations so far (for perf. debugging) int _compiled_invocation_count; // Number of nmethod invocations so far (for perf. debugging)
...@@ -781,16 +782,19 @@ class Method : public Metadata { ...@@ -781,16 +782,19 @@ class Method : public Metadata {
void init_intrinsic_id(); // updates from _none if a match void init_intrinsic_id(); // updates from _none if a match
static vmSymbols::SID klass_id_for_intrinsics(Klass* holder); static vmSymbols::SID klass_id_for_intrinsics(Klass* holder);
bool jfr_towrite() { return _jfr_towrite; } bool jfr_towrite() { return _jfr_towrite; }
void set_jfr_towrite(bool x) { _jfr_towrite = x; } void set_jfr_towrite(bool x) { _jfr_towrite = x; }
bool caller_sensitive() { return _caller_sensitive; } bool caller_sensitive() { return _caller_sensitive; }
void set_caller_sensitive(bool x) { _caller_sensitive = x; } void set_caller_sensitive(bool x) { _caller_sensitive = x; }
bool force_inline() { return _force_inline; } bool force_inline() { return _force_inline; }
void set_force_inline(bool x) { _force_inline = x; } void set_force_inline(bool x) { _force_inline = x; }
bool dont_inline() { return _dont_inline; } bool dont_inline() { return _dont_inline; }
void set_dont_inline(bool x) { _dont_inline = x; } void set_dont_inline(bool x) { _dont_inline = x; }
bool is_hidden() { return _hidden; } bool is_hidden() { return _hidden; }
void set_hidden(bool x) { _hidden = x; } void set_hidden(bool x) { _hidden = x; }
bool has_injected_profile() { return _has_injected_profile; }
void set_has_injected_profile(bool x) { _has_injected_profile = x; }
ConstMethod::MethodType method_type() const { ConstMethod::MethodType method_type() const {
return _constMethod->method_type(); return _constMethod->method_type();
} }
......
...@@ -3292,9 +3292,6 @@ bool Compile::final_graph_reshaping() { ...@@ -3292,9 +3292,6 @@ bool Compile::final_graph_reshaping() {
bool Compile::too_many_traps(ciMethod* method, bool Compile::too_many_traps(ciMethod* method,
int bci, int bci,
Deoptimization::DeoptReason reason) { Deoptimization::DeoptReason reason) {
if (method->has_injected_profile()) {
return false;
}
ciMethodData* md = method->method_data(); ciMethodData* md = method->method_data();
if (md->is_empty()) { if (md->is_empty()) {
// Assume the trap has not occurred, or that it occurred only // Assume the trap has not occurred, or that it occurred only
...@@ -3344,9 +3341,6 @@ bool Compile::too_many_traps(Deoptimization::DeoptReason reason, ...@@ -3344,9 +3341,6 @@ bool Compile::too_many_traps(Deoptimization::DeoptReason reason,
bool Compile::too_many_recompiles(ciMethod* method, bool Compile::too_many_recompiles(ciMethod* method,
int bci, int bci,
Deoptimization::DeoptReason reason) { Deoptimization::DeoptReason reason) {
if (method->has_injected_profile()) {
return false;
}
ciMethodData* md = method->method_data(); ciMethodData* md = method->method_data();
if (md->is_empty()) { if (md->is_empty()) {
// Assume the trap has not occurred, or that it occurred only // Assume the trap has not occurred, or that it occurred only
......
...@@ -6565,8 +6565,6 @@ bool LibraryCallKit::inline_profileBoolean() { ...@@ -6565,8 +6565,6 @@ bool LibraryCallKit::inline_profileBoolean() {
jint false_cnt = aobj->element_value(0).as_int(); jint false_cnt = aobj->element_value(0).as_int();
jint true_cnt = aobj->element_value(1).as_int(); jint true_cnt = aobj->element_value(1).as_int();
method()->set_injected_profile(true);
if (C->log() != NULL) { if (C->log() != NULL) {
C->log()->elem("observe source='profileBoolean' false='%d' true='%d'", C->log()->elem("observe source='profileBoolean' false='%d' true='%d'",
false_cnt, true_cnt); false_cnt, true_cnt);
......
...@@ -1469,7 +1469,10 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra ...@@ -1469,7 +1469,10 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra
// //
// The other actions cause immediate removal of the present code. // The other actions cause immediate removal of the present code.
bool update_trap_state = true; // Traps caused by injected profile shouldn't pollute trap counts.
bool injected_profile_trap = trap_method->has_injected_profile() &&
(reason == Reason_intrinsic || reason == Reason_unreached);
bool update_trap_state = !injected_profile_trap;
bool make_not_entrant = false; bool make_not_entrant = false;
bool make_not_compilable = false; bool make_not_compilable = false;
bool reprofile = false; bool reprofile = false;
......
/*
* Copyright (c) 2015, 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 8074551
* @library /testlibrary
* @run main PollutedTrapCounts
*/
import java.lang.invoke.*;
import com.oracle.java.testlibrary.*;
public class PollutedTrapCounts {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-XX:+IgnoreUnrecognizedVMOptions",
"-XX:-TieredCompilation", "-Xbatch",
"-XX:PerBytecodeRecompilationCutoff=10", "-XX:PerMethodRecompilationCutoff=10",
"-XX:+PrintCompilation", "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining",
"PollutedTrapCounts$Test");
OutputAnalyzer analyzer = new OutputAnalyzer(pb.start());
analyzer.shouldHaveExitValue(0);
analyzer.shouldNotContain("not compilable (disabled)");
}
static class Test {
public static final MethodHandle test1;
public static final MethodHandle test2;
public static final MethodHandle empty;
static {
try {
Class<?> THIS_CLASS = Test.class;
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
test1 = LOOKUP.findStatic(THIS_CLASS, "test1", MethodType.methodType(boolean.class, boolean.class));
test2 = LOOKUP.findStatic(THIS_CLASS, "test2", MethodType.methodType(boolean.class, boolean.class));
empty = LOOKUP.findStatic(THIS_CLASS, "empty", MethodType.methodType(void.class, boolean.class));
} catch(Throwable e) {
throw new Error(e);
}
}
static boolean test1(boolean b) {
return b;
}
static boolean test2(boolean b) {
return true;
}
static void empty(boolean b) {}
static void test(boolean freqValue, boolean removeInlineBlocker) throws Throwable {
MethodHandle innerGWT = MethodHandles.guardWithTest(test1, empty, empty);
MethodHandle outerGWT = MethodHandles.guardWithTest(test2, innerGWT, innerGWT);
// Trigger compilation
for (int i = 0; i < 20_000; i++) {
outerGWT.invokeExact(freqValue);
}
// Trigger deopt & nmethod invalidation
outerGWT.invokeExact(!freqValue);
// Force inline blocker removal on rare-taken path
if (removeInlineBlocker) {
for (int i = 0; i < 100; i++) {
outerGWT.invokeExact(!freqValue);
}
}
// Trigger recompilation
for (int i = 0; i < 20_000; i++) {
outerGWT.invokeExact(freqValue);
}
}
public static void main(String[] args) throws Throwable {
boolean freqValue = true;
boolean removeInlineBlocker = false;
for (int i = 0; i < 20; i++) {
test(freqValue, removeInlineBlocker);
freqValue = !freqValue;
removeInlineBlocker = !removeInlineBlocker;
}
}
}
}
/* /*
* Copyright (c) 2014, 2015 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
......
#!/bin/sh #!/bin/sh
# Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
......
/* /*
* Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
......
...@@ -122,6 +122,10 @@ public class Platform { ...@@ -122,6 +122,10 @@ public class Platform {
return isArch("(amd64)|(x86_64)"); return isArch("(amd64)|(x86_64)");
} }
public static boolean isAArch64() {
return isArch("aarch64");
}
private static boolean isArch(String archnameRE) { private static boolean isArch(String archnameRE) {
return Pattern.compile(archnameRE, Pattern.CASE_INSENSITIVE) return Pattern.compile(archnameRE, Pattern.CASE_INSENSITIVE)
.matcher(osArch) .matcher(osArch)
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# #
# This code is distributed in the hope that it will be useful, but WITHOUT # This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # 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 # version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code). # accompanied this code).
# #
......
#
# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it 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 under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 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 version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code). accompanied this code).
#
# You should have received a copy of the GNU General Public License version 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, 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 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 or visit www.oracle.com if you need additional information or have any
# questions. questions.
#
#
DESCRIPTION DESCRIPTION
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# #
# This code is distributed in the hope that it will be useful, but WITHOUT # This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # 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 # version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code). # accompanied this code).
# #
......
/* /*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -43,7 +43,7 @@ import java.util.Set; ...@@ -43,7 +43,7 @@ import java.util.Set;
*/ */
public class TestMutuallyExclusivePlatformPredicates { public class TestMutuallyExclusivePlatformPredicates {
private static enum MethodGroup { private static enum MethodGroup {
ARCH("isARM", "isPPC", "isSparc", "isX86", "isX64"), ARCH("isARM", "isPPC", "isSparc", "isX86", "isX64", "isAArch64"),
BITNESS("is32bit", "is64bit"), BITNESS("is32bit", "is64bit"),
OS("isAix", "isLinux", "isSolaris", "isWindows", "isOSX"), OS("isAix", "isLinux", "isSolaris", "isWindows", "isOSX"),
VM_TYPE("isClient", "isServer", "isGraal", "isMinimal"), VM_TYPE("isClient", "isServer", "isGraal", "isMinimal"),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册