提交 8c0b891f 编写于 作者: A asaha

Merge

...@@ -676,3 +676,5 @@ e01a710549a962cee94728271248a7d89fb56c49 hs25.60-b20 ...@@ -676,3 +676,5 @@ e01a710549a962cee94728271248a7d89fb56c49 hs25.60-b20
3b6c97747ccc61d189bca64b4afa3ffc13680810 jdk8u60-b20 3b6c97747ccc61d189bca64b4afa3ffc13680810 jdk8u60-b20
4b6687a4f2fe84211b8b3b5afb34b5186afbddf6 hs25.60-b21 4b6687a4f2fe84211b8b3b5afb34b5186afbddf6 hs25.60-b21
e0d75c284bd1c09fd7d9ef09627d8a99b88d468d jdk8u60-b21 e0d75c284bd1c09fd7d9ef09627d8a99b88d468d jdk8u60-b21
ff8fdeb2fb6d6f3348597339c53412f8f6202c3f hs25.60-b22
878cb0df27c22c6b1e9f4add1eb3da3edc8ab51d jdk8u60-b22
...@@ -1140,37 +1140,6 @@ included with JRE 8, JDK 8, and OpenJDK 8. ...@@ -1140,37 +1140,6 @@ included with JRE 8, JDK 8, and OpenJDK 8.
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
%% This notice is provided with respect to JSON, which may be included
with JRE 8 & JDK 8.
--- begin of LICENSE ---
Copyright (c) 2002 JSON.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
The Software shall be used for Good, not Evil.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
--- end of LICENSE ---
-------------------------------------------------------------------------------
%% This notice is provided with respect to Kerberos functionality, which %% This notice is provided with respect to Kerberos functionality, which
which may be included with JRE 8, JDK 8, and OpenJDK 8. which may be included with JRE 8, JDK 8, and OpenJDK 8.
...@@ -1250,7 +1219,7 @@ included with JDK 8 and OpenJDK 8 source distributions. ...@@ -1250,7 +1219,7 @@ included with JDK 8 and OpenJDK 8 source distributions.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
%% This notice is provided with respect to libpng 1.6.16, which may be %% This notice is provided with respect to libpng 1.6.16, which may be
included with JRE 8, JDK 8, and OpenJDK 8. included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE --- --- begin of LICENSE ---
...@@ -1370,7 +1339,7 @@ December 22, 2014 ...@@ -1370,7 +1339,7 @@ December 22, 2014
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
%% This notice is provided with respect to libungif 4.1.3, which may be %% This notice is provided with respect to GIFLIB 5.1.1 & libungif 4.1.3, which may be
included with JRE 8, JDK 8, and OpenJDK 8. included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE --- --- begin of LICENSE ---
...@@ -1399,13 +1368,13 @@ THE SOFTWARE. ...@@ -1399,13 +1368,13 @@ THE SOFTWARE.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
%% This notice is provided with respect to Little CMS 2.5, which may be %% This notice is provided with respect to Little CMS 2.7, which may be
included with JRE 8, JDK 8, and OpenJDK 8. included with JRE 8, JDK 8, and OpenJDK 8.
--- begin of LICENSE --- --- begin of LICENSE ---
Little CMS Little CMS
Copyright (c) 1998-2011 Marti Maria Saguer Copyright (c) 1998-2015 Marti Maria Saguer
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
......
...@@ -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.
先完成此消息的编辑!
想要评论请 注册