Merge
This commit is contained in:
commit
46b3969016
1
.hgtags
1
.hgtags
@ -206,3 +206,4 @@ e41d716405b209d3eddef8bd4240cec2bd34dcca jdk8-b81
|
|||||||
5e8c55025644730385a6f8fa029ecdb2d2c98a07 jdk8-b82
|
5e8c55025644730385a6f8fa029ecdb2d2c98a07 jdk8-b82
|
||||||
bcebd3fdefc91abb9d7fa0c5af6211b3f8720da6 jdk8-b83
|
bcebd3fdefc91abb9d7fa0c5af6211b3f8720da6 jdk8-b83
|
||||||
d7ad0dfaa41151bd3a9ae46725b0aec3730a9cd0 jdk8-b84
|
d7ad0dfaa41151bd3a9ae46725b0aec3730a9cd0 jdk8-b84
|
||||||
|
1872c12529090e1c1dbf567f02ad7ae6231b8f0c jdk8-b85
|
||||||
|
@ -206,3 +206,4 @@ fd1a5574cf68af24bfd52decc37ac6361afb278a jdk8-b78
|
|||||||
29153d0df68f84162ffe8c2cf4f402a3f2245e85 jdk8-b82
|
29153d0df68f84162ffe8c2cf4f402a3f2245e85 jdk8-b82
|
||||||
466685ba01bfb7bc1e1ac61490fd8c0f3cc18763 jdk8-b83
|
466685ba01bfb7bc1e1ac61490fd8c0f3cc18763 jdk8-b83
|
||||||
01f631f89fa392b4e484d0812c40ea8f9d2353aa jdk8-b84
|
01f631f89fa392b4e484d0812c40ea8f9d2353aa jdk8-b84
|
||||||
|
7fc358f5943676b82f1dccd3152b1ac07d92e38b jdk8-b85
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2012, 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
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2012, 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
|
||||||
|
@ -30,7 +30,7 @@ pull_extra_base="$2"
|
|||||||
# Python always buffers stdout significantly, thus we will not see any output from hg clone jdk,
|
# Python always buffers stdout significantly, thus we will not see any output from hg clone jdk,
|
||||||
# until a lot of time has passed! By passing -u to python, we get incremental updates
|
# until a lot of time has passed! By passing -u to python, we get incremental updates
|
||||||
# on stdout. Much nicer.
|
# on stdout. Much nicer.
|
||||||
whichhg="`which hg`"
|
whichhg="`which hg 2> /dev/null | grep -v '^no hg in'`"
|
||||||
|
|
||||||
if [ "${whichhg}" = "" ] ; then
|
if [ "${whichhg}" = "" ] ; then
|
||||||
echo Cannot find hg!
|
echo Cannot find hg!
|
||||||
@ -51,7 +51,7 @@ if [ "#!" = "$has_hash_bang" ] ; then
|
|||||||
bpython="`basename "$python"`"
|
bpython="`basename "$python"`"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "python" = "$bpython" -a -x "$python" ] ; then
|
if [ -x "$python" -a ! -d "$python" -a "`${python} -V 2>&1 | cut -f 1 -d ' '`" = "Python" ] ; then
|
||||||
hg="${python} -u ${whichhg}"
|
hg="${python} -u ${whichhg}"
|
||||||
else
|
else
|
||||||
echo Cannot find python from hg launcher. Running plain hg, which probably has buffered stdout.
|
echo Cannot find python from hg launcher. Running plain hg, which probably has buffered stdout.
|
||||||
|
@ -196,7 +196,7 @@ $(OUTPUT_ROOT)/source_tips: FRC
|
|||||||
|
|
||||||
|
|
||||||
# Remove everything, except the output from configure.
|
# Remove everything, except the output from configure.
|
||||||
clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-nashorn clean-images clean-overlay-images clean-bootcycle-build clean-docs
|
clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-nashorn clean-images clean-overlay-images clean-bootcycle-build clean-docs clean-test
|
||||||
@($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log* build-trace*.log*)
|
@($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log* build-trace*.log*)
|
||||||
@$(ECHO) Cleaned all build artifacts.
|
@$(ECHO) Cleaned all build artifacts.
|
||||||
|
|
||||||
@ -237,6 +237,8 @@ clean-bootcycle-build:
|
|||||||
clean-docs:
|
clean-docs:
|
||||||
$(call CleanComponent,docs)
|
$(call CleanComponent,docs)
|
||||||
$(call CleanComponent,docstemp)
|
$(call CleanComponent,docstemp)
|
||||||
|
clean-test:
|
||||||
|
$(call CleanComponent,testoutput)
|
||||||
|
|
||||||
.PHONY: langtools corba jaxp jaxws hotspot jdk nashorn images overlay-images install
|
.PHONY: langtools corba jaxp jaxws hotspot jdk nashorn images overlay-images install
|
||||||
.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only nashorn-only images-only overlay-images-only install-only
|
.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only nashorn-only images-only overlay-images-only install-only
|
||||||
|
@ -206,3 +206,4 @@ e41fb1aa0329767b2737303c994e38bede1baa07 jdk8-b79
|
|||||||
48e1bc77004d9af575b733c04637b98fd17603c2 jdk8-b82
|
48e1bc77004d9af575b733c04637b98fd17603c2 jdk8-b82
|
||||||
a45bb25a67c7517b45f00c9682e317f46fecbba9 jdk8-b83
|
a45bb25a67c7517b45f00c9682e317f46fecbba9 jdk8-b83
|
||||||
928f8b888deb785cbd7bbd5f951cd6880f11f14e jdk8-b84
|
928f8b888deb785cbd7bbd5f951cd6880f11f14e jdk8-b84
|
||||||
|
9583a6431596bac1959d2d8828f5ea217843dd12 jdk8-b85
|
||||||
|
@ -333,3 +333,5 @@ a947f40fb536e5b9e0aa210cf26abb430f80887a hs25-b26
|
|||||||
42fe530cd478744a4d12a0cbf803f0fc804bab1a jdk8-b85
|
42fe530cd478744a4d12a0cbf803f0fc804bab1a jdk8-b85
|
||||||
09b0d3e9ba6cdf7da07d4010d2d1df14596f6864 hs25-b27
|
09b0d3e9ba6cdf7da07d4010d2d1df14596f6864 hs25-b27
|
||||||
6d88a566d369f6a1f86912cad7d0912686b2fda1 hs25-b28
|
6d88a566d369f6a1f86912cad7d0912686b2fda1 hs25-b28
|
||||||
|
86db4847f195c0ecceea646431f1ff22d56282e8 jdk8-b86
|
||||||
|
01d5f04e64dc2d64625b2db2056f5ed4de918a45 hs25-b29
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 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
|
||||||
@ -49,19 +49,13 @@ public class Method extends Metadata {
|
|||||||
Type type = db.lookupType("Method");
|
Type type = db.lookupType("Method");
|
||||||
constMethod = type.getAddressField("_constMethod");
|
constMethod = type.getAddressField("_constMethod");
|
||||||
methodData = type.getAddressField("_method_data");
|
methodData = type.getAddressField("_method_data");
|
||||||
|
methodCounters = type.getAddressField("_method_counters");
|
||||||
methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
|
methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
|
||||||
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
|
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
|
||||||
code = type.getAddressField("_code");
|
code = type.getAddressField("_code");
|
||||||
vtableIndex = new CIntField(type.getCIntegerField("_vtable_index"), 0);
|
vtableIndex = new CIntField(type.getCIntegerField("_vtable_index"), 0);
|
||||||
if (!VM.getVM().isCore()) {
|
|
||||||
invocationCounter = new CIntField(type.getCIntegerField("_invocation_counter"), 0);
|
|
||||||
backedgeCounter = new CIntField(type.getCIntegerField("_backedge_counter"), 0);
|
|
||||||
}
|
|
||||||
bytecodeOffset = type.getSize();
|
bytecodeOffset = type.getSize();
|
||||||
|
|
||||||
interpreterThrowoutCountField = new CIntField(type.getCIntegerField("_interpreter_throwout_count"), 0);
|
|
||||||
interpreterInvocationCountField = new CIntField(type.getCIntegerField("_interpreter_invocation_count"), 0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
interpreterEntry = type.getAddressField("_interpreter_entry");
|
interpreterEntry = type.getAddressField("_interpreter_entry");
|
||||||
fromCompiledCodeEntryPoint = type.getAddressField("_from_compiled_code_entry_point");
|
fromCompiledCodeEntryPoint = type.getAddressField("_from_compiled_code_entry_point");
|
||||||
@ -80,18 +74,14 @@ public class Method extends Metadata {
|
|||||||
// Fields
|
// Fields
|
||||||
private static AddressField constMethod;
|
private static AddressField constMethod;
|
||||||
private static AddressField methodData;
|
private static AddressField methodData;
|
||||||
|
private static AddressField methodCounters;
|
||||||
private static CIntField methodSize;
|
private static CIntField methodSize;
|
||||||
private static CIntField accessFlags;
|
private static CIntField accessFlags;
|
||||||
private static CIntField vtableIndex;
|
private static CIntField vtableIndex;
|
||||||
private static CIntField invocationCounter;
|
|
||||||
private static CIntField backedgeCounter;
|
|
||||||
private static long bytecodeOffset;
|
private static long bytecodeOffset;
|
||||||
|
|
||||||
private static AddressField code;
|
private static AddressField code;
|
||||||
|
|
||||||
private static CIntField interpreterThrowoutCountField;
|
|
||||||
private static CIntField interpreterInvocationCountField;
|
|
||||||
|
|
||||||
// constant method names - <init>, <clinit>
|
// constant method names - <init>, <clinit>
|
||||||
// Initialized lazily to avoid initialization ordering dependencies between Method and SymbolTable
|
// Initialized lazily to avoid initialization ordering dependencies between Method and SymbolTable
|
||||||
private static Symbol objectInitializerName;
|
private static Symbol objectInitializerName;
|
||||||
@ -127,6 +117,10 @@ public class Method extends Metadata {
|
|||||||
Address addr = methodData.getValue(getAddress());
|
Address addr = methodData.getValue(getAddress());
|
||||||
return (MethodData) VMObjectFactory.newObject(MethodData.class, addr);
|
return (MethodData) VMObjectFactory.newObject(MethodData.class, addr);
|
||||||
}
|
}
|
||||||
|
public MethodCounters getMethodCounters() {
|
||||||
|
Address addr = methodCounters.getValue(getAddress());
|
||||||
|
return (MethodCounters) VMObjectFactory.newObject(MethodCounters.class, addr);
|
||||||
|
}
|
||||||
/** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
|
/** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
|
||||||
public long getMethodSize() { return methodSize.getValue(this); }
|
public long getMethodSize() { return methodSize.getValue(this); }
|
||||||
public long getMaxStack() { return getConstMethod().getMaxStack(); }
|
public long getMaxStack() { return getConstMethod().getMaxStack(); }
|
||||||
@ -139,16 +133,10 @@ public class Method extends Metadata {
|
|||||||
public long getCodeSize() { return getConstMethod().getCodeSize(); }
|
public long getCodeSize() { return getConstMethod().getCodeSize(); }
|
||||||
public long getVtableIndex() { return vtableIndex.getValue(this); }
|
public long getVtableIndex() { return vtableIndex.getValue(this); }
|
||||||
public long getInvocationCounter() {
|
public long getInvocationCounter() {
|
||||||
if (Assert.ASSERTS_ENABLED) {
|
return getMethodCounters().getInvocationCounter();
|
||||||
Assert.that(!VM.getVM().isCore(), "must not be used in core build");
|
|
||||||
}
|
|
||||||
return invocationCounter.getValue(this);
|
|
||||||
}
|
}
|
||||||
public long getBackedgeCounter() {
|
public long getBackedgeCounter() {
|
||||||
if (Assert.ASSERTS_ENABLED) {
|
return getMethodCounters().getBackedgeCounter();
|
||||||
Assert.that(!VM.getVM().isCore(), "must not be used in core build");
|
|
||||||
}
|
|
||||||
return backedgeCounter.getValue(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// get associated compiled native method, if available, else return null.
|
// get associated compiled native method, if available, else return null.
|
||||||
@ -369,10 +357,10 @@ public class Method extends Metadata {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int interpreterThrowoutCount() {
|
public int interpreterThrowoutCount() {
|
||||||
return (int) interpreterThrowoutCountField.getValue(this);
|
return getMethodCounters().interpreterThrowoutCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int interpreterInvocationCount() {
|
public int interpreterInvocationCount() {
|
||||||
return (int) interpreterInvocationCountField.getValue(this);
|
return getMethodCounters().interpreterInvocationCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013, 2013, 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.oops;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
import sun.jvm.hotspot.types.*;
|
||||||
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
|
public class MethodCounters extends Metadata {
|
||||||
|
public MethodCounters(Address addr) {
|
||||||
|
super(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
VM.registerVMInitializedObserver(new Observer() {
|
||||||
|
public void update(Observable o, Object data) {
|
||||||
|
initialize(VM.getVM().getTypeDataBase());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
|
||||||
|
Type type = db.lookupType("MethodCounters");
|
||||||
|
|
||||||
|
interpreterInvocationCountField = new CIntField(type.getCIntegerField("_interpreter_invocation_count"), 0);
|
||||||
|
interpreterThrowoutCountField = new CIntField(type.getCIntegerField("_interpreter_throwout_count"), 0);
|
||||||
|
if (!VM.getVM().isCore()) {
|
||||||
|
invocationCounter = new CIntField(type.getCIntegerField("_invocation_counter"), 0);
|
||||||
|
backedgeCounter = new CIntField(type.getCIntegerField("_backedge_counter"), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CIntField interpreterInvocationCountField;
|
||||||
|
private static CIntField interpreterThrowoutCountField;
|
||||||
|
private static CIntField invocationCounter;
|
||||||
|
private static CIntField backedgeCounter;
|
||||||
|
|
||||||
|
public int interpreterInvocationCount() {
|
||||||
|
return (int) interpreterInvocationCountField.getValue(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int interpreterThrowoutCount() {
|
||||||
|
return (int) interpreterThrowoutCountField.getValue(this);
|
||||||
|
}
|
||||||
|
public long getInvocationCounter() {
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(!VM.getVM().isCore(), "must not be used in core build");
|
||||||
|
}
|
||||||
|
return invocationCounter.getValue(this);
|
||||||
|
}
|
||||||
|
public long getBackedgeCounter() {
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(!VM.getVM().isCore(), "must not be used in core build");
|
||||||
|
}
|
||||||
|
return backedgeCounter.getValue(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printValueOn(PrintStream tty) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Top level gnumake file for hotspot builds
|
# Top level gnumake file for hotspot builds
|
||||||
@ -85,15 +85,15 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Typical C1/C2 targets made available with this Makefile
|
# Typical C1/C2 targets made available with this Makefile
|
||||||
C1_VM_TARGETS=product1 fastdebug1 optimized1 jvmg1
|
C1_VM_TARGETS=product1 fastdebug1 optimized1 debug1
|
||||||
C2_VM_TARGETS=product fastdebug optimized jvmg
|
C2_VM_TARGETS=product fastdebug optimized debug
|
||||||
ZERO_VM_TARGETS=productzero fastdebugzero optimizedzero jvmgzero
|
ZERO_VM_TARGETS=productzero fastdebugzero optimizedzero debugzero
|
||||||
SHARK_VM_TARGETS=productshark fastdebugshark optimizedshark jvmgshark
|
SHARK_VM_TARGETS=productshark fastdebugshark optimizedshark debugshark
|
||||||
MINIMAL1_VM_TARGETS=productminimal1 fastdebugminimal1 jvmgminimal1
|
MINIMAL1_VM_TARGETS=productminimal1 fastdebugminimal1 debugminimal1
|
||||||
|
|
||||||
COMMON_VM_PRODUCT_TARGETS=product product1 docs export_product
|
COMMON_VM_PRODUCT_TARGETS=product product1 docs export_product
|
||||||
COMMON_VM_FASTDEBUG_TARGETS=fastdebug fastdebug1 docs export_fastdebug
|
COMMON_VM_FASTDEBUG_TARGETS=fastdebug fastdebug1 docs export_fastdebug
|
||||||
COMMON_VM_DEBUG_TARGETS=jvmg jvmg1 docs export_debug
|
COMMON_VM_DEBUG_TARGETS=debug debug1 docs export_debug
|
||||||
|
|
||||||
# JDK directory list
|
# JDK directory list
|
||||||
JDK_DIRS=bin include jre lib demo
|
JDK_DIRS=bin include jre lib demo
|
||||||
@ -103,13 +103,13 @@ all: all_product all_fastdebug
|
|||||||
ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
||||||
all_product: productminimal1
|
all_product: productminimal1
|
||||||
all_fastdebug: fastdebugminimal1
|
all_fastdebug: fastdebugminimal1
|
||||||
all_debug: jvmgminimal1
|
all_debug: debugminimal1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef BUILD_CLIENT_ONLY
|
ifdef BUILD_CLIENT_ONLY
|
||||||
all_product: product1 docs export_product
|
all_product: product1 docs export_product
|
||||||
all_fastdebug: fastdebug1 docs export_fastdebug
|
all_fastdebug: fastdebug1 docs export_fastdebug
|
||||||
all_debug: jvmg1 docs export_debug
|
all_debug: debug1 docs export_debug
|
||||||
else
|
else
|
||||||
ifeq ($(MACOSX_UNIVERSAL),true)
|
ifeq ($(MACOSX_UNIVERSAL),true)
|
||||||
all_product: universal_product
|
all_product: universal_product
|
||||||
@ -127,13 +127,13 @@ all_optimized: optimized optimized1 docs export_optimized
|
|||||||
allzero: all_productzero all_fastdebugzero
|
allzero: all_productzero all_fastdebugzero
|
||||||
all_productzero: productzero docs export_product
|
all_productzero: productzero docs export_product
|
||||||
all_fastdebugzero: fastdebugzero docs export_fastdebug
|
all_fastdebugzero: fastdebugzero docs export_fastdebug
|
||||||
all_debugzero: jvmgzero docs export_debug
|
all_debugzero: debugzero docs export_debug
|
||||||
all_optimizedzero: optimizedzero docs export_optimized
|
all_optimizedzero: optimizedzero docs export_optimized
|
||||||
|
|
||||||
allshark: all_productshark all_fastdebugshark
|
allshark: all_productshark all_fastdebugshark
|
||||||
all_productshark: productshark docs export_product
|
all_productshark: productshark docs export_product
|
||||||
all_fastdebugshark: fastdebugshark docs export_fastdebug
|
all_fastdebugshark: fastdebugshark docs export_fastdebug
|
||||||
all_debugshark: jvmgshark docs export_debug
|
all_debugshark: debugshark docs export_debug
|
||||||
all_optimizedshark: optimizedshark docs export_optimized
|
all_optimizedshark: optimizedshark docs export_optimized
|
||||||
|
|
||||||
# Do everything
|
# Do everything
|
||||||
@ -227,7 +227,7 @@ generic_buildshark:
|
|||||||
$(MKDIR) -p $(OUTPUTDIR)
|
$(MKDIR) -p $(OUTPUTDIR)
|
||||||
$(CD) $(OUTPUTDIR); \
|
$(CD) $(OUTPUTDIR); \
|
||||||
$(MAKE) -f $(ABS_OS_MAKEFILE) \
|
$(MAKE) -f $(ABS_OS_MAKEFILE) \
|
||||||
$(MAKE_ARGS) $(VM_TARGET)
|
$(MAKE_ARGS) $(VM_TARGET)
|
||||||
|
|
||||||
generic_buildminimal1:
|
generic_buildminimal1:
|
||||||
ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
||||||
@ -260,7 +260,7 @@ export_fastdebug:
|
|||||||
EXPORT_SUBDIR=/$(@:export_%=%) \
|
EXPORT_SUBDIR=/$(@:export_%=%) \
|
||||||
generic_export
|
generic_export
|
||||||
export_debug:
|
export_debug:
|
||||||
$(MAKE) BUILD_FLAVOR=$(@:export_%=%) VM_SUBDIR=${VM_DEBUG} \
|
$(MAKE) BUILD_FLAVOR=$(@:export_%=%) VM_SUBDIR=$(@:export_%=%) \
|
||||||
EXPORT_SUBDIR=/$(@:export_%=%) \
|
EXPORT_SUBDIR=/$(@:export_%=%) \
|
||||||
generic_export
|
generic_export
|
||||||
export_optimized:
|
export_optimized:
|
||||||
@ -281,192 +281,197 @@ export_fastdebug_jdk::
|
|||||||
ALT_EXPORT_PATH=$(JDK_IMAGE_DIR)/$(@:export_%_jdk=%) \
|
ALT_EXPORT_PATH=$(JDK_IMAGE_DIR)/$(@:export_%_jdk=%) \
|
||||||
generic_export
|
generic_export
|
||||||
export_debug_jdk::
|
export_debug_jdk::
|
||||||
$(MAKE) BUILD_FLAVOR=$(@:export_%_jdk=%) VM_SUBDIR=${VM_DEBUG} \
|
$(MAKE) BUILD_FLAVOR=$(@:export_%_jdk=%) VM_SUBDIR=$(@:export_%_jdk=%) \
|
||||||
ALT_EXPORT_PATH=$(JDK_IMAGE_DIR)/$(@:export_%_jdk=%) \
|
ALT_EXPORT_PATH=$(JDK_IMAGE_DIR)/$(@:export_%_jdk=%) \
|
||||||
generic_export
|
generic_export
|
||||||
|
|
||||||
# Export file copy rules
|
# Export file copy rules
|
||||||
XUSAGE=$(HS_SRC_DIR)/share/vm/Xusage.txt
|
XUSAGE=$(HS_SRC_DIR)/share/vm/Xusage.txt
|
||||||
DOCS_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_docs
|
DOCS_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_docs
|
||||||
C1_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_compiler1
|
C1_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_compiler1/$(VM_SUBDIR)
|
||||||
C2_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_compiler2
|
C2_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_compiler2/$(VM_SUBDIR)
|
||||||
ZERO_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_zero
|
MINIMAL1_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_minimal1/$(VM_SUBDIR)
|
||||||
SHARK_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_shark
|
ZERO_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_zero/$(VM_SUBDIR)
|
||||||
C1_DIR=$(C1_BASE_DIR)/$(VM_SUBDIR)
|
SHARK_DIR =$(OUTPUTDIR)/$(VM_PLATFORM)_shark/$(VM_SUBDIR)
|
||||||
C2_DIR=$(C2_BASE_DIR)/$(VM_SUBDIR)
|
|
||||||
ZERO_DIR=$(ZERO_BASE_DIR)/$(VM_SUBDIR)
|
|
||||||
SHARK_DIR=$(SHARK_BASE_DIR)/$(VM_SUBDIR)
|
|
||||||
MINIMAL1_BASE_DIR=$(OUTPUTDIR)/$(VM_PLATFORM)_minimal1
|
|
||||||
MINIMAL1_DIR=$(MINIMAL1_BASE_DIR)/$(VM_SUBDIR)
|
|
||||||
|
|
||||||
|
# Server (C2)
|
||||||
ifeq ($(JVM_VARIANT_SERVER), true)
|
ifeq ($(JVM_VARIANT_SERVER), true)
|
||||||
MISC_DIR=$(C2_DIR)
|
# Common
|
||||||
GEN_DIR=$(C2_BASE_DIR)/generated
|
$(EXPORT_SERVER_DIR)/%.diz: $(C2_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_LIB_DIR)/%.jar: $(C2_DIR)/../generated/%.jar
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_INCLUDE_DIR)/%: $(C2_DIR)/../generated/jvmtifiles/%
|
||||||
|
$(install-file)
|
||||||
|
# Windows
|
||||||
|
$(EXPORT_SERVER_DIR)/%.dll: $(C2_DIR)/%.dll
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.pdb: $(C2_DIR)/%.pdb
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.map: $(C2_DIR)/%.map
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_LIB_DIR)/%.lib: $(C2_DIR)/%.lib
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.diz: $(C2_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.dll: $(C2_DIR)/%.dll
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.pdb: $(C2_DIR)/%.pdb
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.map: $(C2_DIR)/%.map
|
||||||
|
$(install-file)
|
||||||
|
# Unix
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/64/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(C2_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.debuginfo: $(C2_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/64/%.debuginfo: $(C2_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(C2_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/64/%.diz: $(C2_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Client (C1)
|
||||||
ifeq ($(JVM_VARIANT_CLIENT), true)
|
ifeq ($(JVM_VARIANT_CLIENT), true)
|
||||||
MISC_DIR=$(C1_DIR)
|
# Common
|
||||||
GEN_DIR=$(C1_BASE_DIR)/generated
|
$(EXPORT_CLIENT_DIR)/%.diz: $(C1_DIR)/%.diz
|
||||||
endif
|
$(install-file)
|
||||||
ifeq ($(JVM_VARIANT_ZEROSHARK), true)
|
$(EXPORT_LIB_DIR)/%.jar: $(C1_DIR)/../generated/%.jar
|
||||||
MISC_DIR=$(SHARK_DIR)
|
$(install-file)
|
||||||
GEN_DIR=$(SHARK_BASE_DIR)/generated
|
$(EXPORT_INCLUDE_DIR)/%: $(C1_DIR)/../generated/jvmtifiles/%
|
||||||
endif
|
$(install-file)
|
||||||
ifeq ($(JVM_VARIANT_ZERO), true)
|
# Windows
|
||||||
MISC_DIR=$(ZERO_DIR)
|
$(EXPORT_CLIENT_DIR)/%.dll: $(C1_DIR)/%.dll
|
||||||
GEN_DIR=$(ZERO_BASE_DIR)/generated
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/%.pdb: $(C1_DIR)/%.pdb
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/%.map: $(C1_DIR)/%.map
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_LIB_DIR)/%.lib: $(C1_DIR)/%.lib
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.diz: $(C1_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.dll: $(C1_DIR)/%.dll
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.pdb: $(C1_DIR)/%.pdb
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.map: $(C1_DIR)/%.map
|
||||||
|
$(install-file)
|
||||||
|
# Unix
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/64/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(C1_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/%.debuginfo: $(C1_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/64/%.debuginfo: $(C1_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(C1_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_CLIENT_DIR)/64/%.diz: $(C1_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Minimal1
|
||||||
ifeq ($(JVM_VARIANT_MINIMAL1), true)
|
ifeq ($(JVM_VARIANT_MINIMAL1), true)
|
||||||
MISC_DIR=$(MINIMAL1_DIR)
|
# Common
|
||||||
GEN_DIR=$(MINIMAL1_BASE_DIR)/generated
|
$(EXPORT_MINIMAL_DIR)/%.diz: $(MINIMAL1_DIR)/%.diz
|
||||||
endif
|
|
||||||
|
|
||||||
# Bin files (windows)
|
|
||||||
ifeq ($(OSNAME),windows)
|
|
||||||
|
|
||||||
# Get jvm.lib
|
|
||||||
$(EXPORT_LIB_DIR)/%.lib: $(MISC_DIR)/%.lib
|
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
$(EXPORT_LIB_DIR)/%.jar: $(MINIMAL1_DIR)/../generated/%.jar
|
||||||
# Other libraries (like SA)
|
|
||||||
$(EXPORT_JRE_BIN_DIR)/%.diz: $(MISC_DIR)/%.diz
|
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_JRE_BIN_DIR)/%.dll: $(MISC_DIR)/%.dll
|
$(EXPORT_INCLUDE_DIR)/%: $(MINIMAL1_DIR)/../generated/jvmtifiles/%
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_JRE_BIN_DIR)/%.pdb: $(MISC_DIR)/%.pdb
|
# Windows
|
||||||
|
$(EXPORT_MINIMAL_DIR)/%.dll: $(MINIMAL1_DIR)/%.dll
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_JRE_BIN_DIR)/%.map: $(MISC_DIR)/%.map
|
$(EXPORT_MINIMAL_DIR)/%.pdb: $(MINIMAL1_DIR)/%.pdb
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
$(EXPORT_MINIMAL_DIR)/%.map: $(MINIMAL1_DIR)/%.map
|
||||||
# Client files always come from C1 area
|
|
||||||
$(EXPORT_CLIENT_DIR)/%.diz: $(C1_DIR)/%.diz
|
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_CLIENT_DIR)/%.dll: $(C1_DIR)/%.dll
|
$(EXPORT_LIB_DIR)/%.lib: $(MINIMAL1_DIR)/%.lib
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_CLIENT_DIR)/%.pdb: $(C1_DIR)/%.pdb
|
$(EXPORT_JRE_BIN_DIR)/%.diz: $(MINIMAL1_DIR)/%.diz
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_CLIENT_DIR)/%.map: $(C1_DIR)/%.map
|
$(EXPORT_JRE_BIN_DIR)/%.dll: $(MINIMAL1_DIR)/%.dll
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_BIN_DIR)/%.pdb: $(MINIMAL1_DIR)/%.pdb
|
||||||
# Server files always come from C2 area
|
|
||||||
$(EXPORT_SERVER_DIR)/%.diz: $(C2_DIR)/%.diz
|
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_SERVER_DIR)/%.dll: $(C2_DIR)/%.dll
|
$(EXPORT_JRE_BIN_DIR)/%.map: $(MINIMAL1_DIR)/%.map
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_SERVER_DIR)/%.pdb: $(C2_DIR)/%.pdb
|
# Unix
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_SERVER_DIR)/%.map: $(C2_DIR)/%.map
|
$(EXPORT_MINIMAL_DIR)/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_MINIMAL_DIR)/64/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(MINIMAL1_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_MINIMAL_DIR)/%.debuginfo: $(MINIMAL1_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_MINIMAL_DIR)/64/%.debuginfo: $(MINIMAL1_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(MINIMAL1_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_MINIMAL_DIR)/64/%.diz: $(MINIMAL1_DIR)/%.diz
|
||||||
$(install-file)
|
$(install-file)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Minimal JVM files always come from minimal area
|
# Zero
|
||||||
$(EXPORT_MINIMAL_DIR)/%.diz: $(MINIMAL1_DIR)/%.diz
|
ifeq ($(JVM_VARIANT_ZERO), true)
|
||||||
|
# Common
|
||||||
|
$(EXPORT_LIB_DIR)/%.jar: $(ZERO_DIR)/../generated/%.jar
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_MINIMAL_DIR)/%.dll: $(MINIMAL1_DIR)/%.dll
|
$(EXPORT_INCLUDE_DIR)/%: $(ZERO_DIR)/../generated/jvmtifiles/%
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_MINIMAL_DIR)/%.pdb: $(MINIMAL1_DIR)/%.pdb
|
# Unix
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
$(install-file)
|
$(install-file)
|
||||||
$(EXPORT_MINIMAL_DIR)/%.map: $(MINIMAL1_DIR)/%.map
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(ZERO_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.diz: $(ZERO_DIR)/%.diz
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
|
||||||
# Shared Library
|
|
||||||
ifneq ($(OSNAME),windows)
|
|
||||||
ifeq ($(JVM_VARIANT_SERVER), true)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/64/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(C2_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.debuginfo: $(C2_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/64/%.debuginfo: $(C2_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(C2_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.diz: $(C2_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/64/%.diz: $(C2_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
endif
|
|
||||||
ifeq ($(JVM_VARIANT_CLIENT), true)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_CLIENT_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_CLIENT_DIR)/64/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(C1_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_CLIENT_DIR)/%.debuginfo: $(C1_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_CLIENT_DIR)/64/%.debuginfo: $(C1_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(C1_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_CLIENT_DIR)/%.diz: $(C1_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_CLIENT_DIR)/64/%.diz: $(C1_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
endif
|
|
||||||
ifeq ($(JVM_VARIANT_ZEROSHARK), true)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo): $(SHARK_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(SHARK_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.debuginfo: $(SHARK_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.diz: $(SHARK_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
endif
|
|
||||||
ifeq ($(JVM_VARIANT_ZERO), true)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(ZERO_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_SERVER_DIR)/%.diz: $(ZERO_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
endif
|
|
||||||
ifeq ($(JVM_VARIANT_MINIMAL1), true)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_MINIMAL_DIR)/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_MINIMAL_DIR)/64/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX)
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(MINIMAL1_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_MINIMAL_DIR)/%.debuginfo: $(MINIMAL1_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_MINIMAL_DIR)/64/%.debuginfo: $(MINIMAL1_DIR)/%.debuginfo
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(MINIMAL1_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_MINIMAL_DIR)/%.diz: $(MINIMAL1_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
$(EXPORT_MINIMAL_DIR)/64/%.diz: $(MINIMAL1_DIR)/%.diz
|
|
||||||
$(install-file)
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Jar file (sa-jdi.jar)
|
# Shark
|
||||||
$(EXPORT_LIB_DIR)/%.jar: $(GEN_DIR)/%.jar
|
ifeq ($(JVM_VARIANT_ZEROSHARK), true)
|
||||||
|
# Common
|
||||||
|
$(EXPORT_LIB_DIR)/%.jar: $(SHARK_DIR)/../generated/%.jar
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
$(EXPORT_INCLUDE_DIR)/%: $(SHARK_DIR)/../generated/jvmtifiles/%
|
||||||
# Include files (jvmti.h, jvmticmlr.h, jni.h, $(JDK_INCLUDE_SUBDIR)/jni_md.h, jmm.h, jfr.h)
|
|
||||||
$(EXPORT_INCLUDE_DIR)/%: $(GEN_DIR)/jvmtifiles/%
|
|
||||||
$(install-file)
|
$(install-file)
|
||||||
|
# Unix
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo): $(SHARK_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(SHARK_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.debuginfo: $(SHARK_DIR)/%.debuginfo
|
||||||
|
$(install-file)
|
||||||
|
$(EXPORT_SERVER_DIR)/%.diz: $(SHARK_DIR)/%.diz
|
||||||
|
$(install-file)
|
||||||
|
endif
|
||||||
|
|
||||||
$(EXPORT_INCLUDE_DIR)/%: $(HS_SRC_DIR)/share/vm/code/%
|
$(EXPORT_INCLUDE_DIR)/%: $(HS_SRC_DIR)/share/vm/code/%
|
||||||
$(install-file)
|
$(install-file)
|
||||||
@ -541,11 +546,11 @@ generic_test:
|
|||||||
@$(RUN_JVM) -XXaltjvm=$(ALTJVM_DIR) -showversion -help
|
@$(RUN_JVM) -XXaltjvm=$(ALTJVM_DIR) -showversion -help
|
||||||
|
|
||||||
# C2 test targets
|
# C2 test targets
|
||||||
test_product test_optimized test_fastdebug test_jvmg:
|
test_product test_optimized test_fastdebug test_debug:
|
||||||
@$(MAKE) generic_test ALTJVM_DIR="$(C2_DIR)/$(@:test_%=%)"
|
@$(MAKE) generic_test ALTJVM_DIR="$(C2_DIR)/$(@:test_%=%)"
|
||||||
|
|
||||||
# C1 test targets
|
# C1 test targets
|
||||||
test_product1 test_optimized1 test_fastdebug1 test_jvmg1:
|
test_product1 test_optimized1 test_fastdebug1 test_debug1:
|
||||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||||
@$(MAKE) generic_test ALTJVM_DIR="$(C1_DIR)/$(@:test_%1=%)"
|
@$(MAKE) generic_test ALTJVM_DIR="$(C1_DIR)/$(@:test_%1=%)"
|
||||||
else
|
else
|
||||||
@ -553,15 +558,15 @@ test_product1 test_optimized1 test_fastdebug1 test_jvmg1:
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Zero test targets
|
# Zero test targets
|
||||||
test_productzero test_optimizedzero test_fastdebugzero test_jvmgzero:
|
test_productzero test_optimizedzero test_fastdebugzero test_debugzero:
|
||||||
@$(MAKE) generic_test ALTJVM_DIR="$(ZERO_DIR)/$(@:test_%zero=%)"
|
@$(MAKE) generic_test ALTJVM_DIR="$(ZERO_DIR)/$(@:test_%zero=%)"
|
||||||
|
|
||||||
# Shark test targets
|
# Shark test targets
|
||||||
test_productshark test_optimizedshark test_fastdebugshark test_jvmgshark:
|
test_productshark test_optimizedshark test_fastdebugshark test_debugshark:
|
||||||
@$(MAKE) generic_test ALTJVM_DIR="$(SHARK_DIR)/$(@:test_%shark=%)"
|
@$(MAKE) generic_test ALTJVM_DIR="$(SHARK_DIR)/$(@:test_%shark=%)"
|
||||||
|
|
||||||
# Minimal1 test targets
|
# Minimal1 test targets
|
||||||
test_productminimal1 test_optimizedminimal1 test_fastdebugminimal1 test_jvmgminimal1:
|
test_productminimal1 test_optimizedminimal1 test_fastdebugminimal1 test_debugminimal1:
|
||||||
@$(MAKE) generic_test ALTJVM_DIR="$(MINIMAL1_DIR)/$(@:test_%minimal1=%)"
|
@$(MAKE) generic_test ALTJVM_DIR="$(MINIMAL1_DIR)/$(@:test_%minimal1=%)"
|
||||||
|
|
||||||
|
|
||||||
@ -626,7 +631,7 @@ help: intro_help target_help variable_help notes_help examples_help
|
|||||||
# Intro help message
|
# Intro help message
|
||||||
intro_help:
|
intro_help:
|
||||||
@$(ECHO) \
|
@$(ECHO) \
|
||||||
"Makefile for the Hotspot workspace."
|
"Makefile for the Hotspot workspace."
|
||||||
@$(ECHO) \
|
@$(ECHO) \
|
||||||
"Default behavior is to build and create an export area for the j2se builds."
|
"Default behavior is to build and create an export area for the j2se builds."
|
||||||
|
|
||||||
@ -637,7 +642,7 @@ target_help:
|
|||||||
@$(ECHO) "world: Same as: all create_jdk"
|
@$(ECHO) "world: Same as: all create_jdk"
|
||||||
@$(ECHO) "all_product: Same as: product product1 export_product"
|
@$(ECHO) "all_product: Same as: product product1 export_product"
|
||||||
@$(ECHO) "all_fastdebug: Same as: fastdebug fastdebug1 export_fastdebug"
|
@$(ECHO) "all_fastdebug: Same as: fastdebug fastdebug1 export_fastdebug"
|
||||||
@$(ECHO) "all_debug: Same as: jvmg jvmg1 export_debug"
|
@$(ECHO) "all_debug: Same as: debug debug1 export_debug"
|
||||||
@$(ECHO) "all_optimized: Same as: optimized optimized1 export_optimized"
|
@$(ECHO) "all_optimized: Same as: optimized optimized1 export_optimized"
|
||||||
@$(ECHO) "clean: Clean all areas"
|
@$(ECHO) "clean: Clean all areas"
|
||||||
@$(ECHO) "export_product: Export product files to EXPORT_PATH"
|
@$(ECHO) "export_product: Export product files to EXPORT_PATH"
|
||||||
@ -730,7 +735,7 @@ examples_help:
|
|||||||
@$(ECHO) \
|
@$(ECHO) \
|
||||||
" $(MAKE) world"
|
" $(MAKE) world"
|
||||||
@$(ECHO) \
|
@$(ECHO) \
|
||||||
" $(MAKE) ALT_BOOTDIR=/opt/java/jdk$(PREVIOUS_JDK_VERSION)"
|
" $(MAKE) ALT_BOOTDIR=/opt/java/jdk$(PREVIOUS_JDK_VERSION)"
|
||||||
@$(ECHO) \
|
@$(ECHO) \
|
||||||
" $(MAKE) ALT_JDK_IMPORT_PATH=/opt/java/jdk$(JDK_VERSION)"
|
" $(MAKE) ALT_JDK_IMPORT_PATH=/opt/java/jdk$(JDK_VERSION)"
|
||||||
|
|
||||||
@ -741,6 +746,23 @@ include $(GAMMADIR)/make/$(OSNAME)/makefiles/universal.gmk
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Compatibility for transition to new naming
|
||||||
|
warn_jvmg_deprecated:
|
||||||
|
echo "Warning: The jvmg target has been replaced with debug"
|
||||||
|
echo "Warning: Please update your usage"
|
||||||
|
|
||||||
|
jvmg: warn_jvmg_deprecated debug
|
||||||
|
|
||||||
|
jvmg1: warn_jvmg_deprecated debug1
|
||||||
|
|
||||||
|
jvmgminimal1: warn_jvmg_deprecated debugminimal1
|
||||||
|
|
||||||
|
jvmgcore: warn_jvmg_deprecated debugcore
|
||||||
|
|
||||||
|
jvmgzero: warn_jvmg_deprecated debugzero
|
||||||
|
|
||||||
|
jvmgshark: warn_jvmg_deprecated debugshark
|
||||||
|
|
||||||
# JPRT rule to build this workspace
|
# JPRT rule to build this workspace
|
||||||
include $(GAMMADIR)/make/jprt.gmk
|
include $(GAMMADIR)/make/jprt.gmk
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 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
|
||||||
@ -142,55 +142,43 @@ VARIANTARCH = $(subst i386,i486,$(ZERO_LIBARCH))
|
|||||||
#
|
#
|
||||||
# debug compiler2 <os>_<arch>_compiler2/debug
|
# debug compiler2 <os>_<arch>_compiler2/debug
|
||||||
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
||||||
# jvmg compiler2 <os>_<arch>_compiler2/jvmg
|
|
||||||
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
||||||
# profiled compiler2 <os>_<arch>_compiler2/profiled
|
|
||||||
# product compiler2 <os>_<arch>_compiler2/product
|
# product compiler2 <os>_<arch>_compiler2/product
|
||||||
#
|
#
|
||||||
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
||||||
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
||||||
# jvmg1 compiler1 <os>_<arch>_compiler1/jvmg
|
|
||||||
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
||||||
# profiled1 compiler1 <os>_<arch>_compiler1/profiled
|
|
||||||
# product1 compiler1 <os>_<arch>_compiler1/product
|
# product1 compiler1 <os>_<arch>_compiler1/product
|
||||||
#
|
#
|
||||||
# debugcore core <os>_<arch>_core/debug
|
# debugcore core <os>_<arch>_core/debug
|
||||||
# fastdebugcore core <os>_<arch>_core/fastdebug
|
# fastdebugcore core <os>_<arch>_core/fastdebug
|
||||||
# jvmgcore core <os>_<arch>_core/jvmg
|
|
||||||
# optimizedcore core <os>_<arch>_core/optimized
|
# optimizedcore core <os>_<arch>_core/optimized
|
||||||
# profiledcore core <os>_<arch>_core/profiled
|
|
||||||
# productcore core <os>_<arch>_core/product
|
# productcore core <os>_<arch>_core/product
|
||||||
#
|
#
|
||||||
# debugzero zero <os>_<arch>_zero/debug
|
# debugzero zero <os>_<arch>_zero/debug
|
||||||
# fastdebugzero zero <os>_<arch>_zero/fastdebug
|
# fastdebugzero zero <os>_<arch>_zero/fastdebug
|
||||||
# jvmgzero zero <os>_<arch>_zero/jvmg
|
|
||||||
# optimizedzero zero <os>_<arch>_zero/optimized
|
# optimizedzero zero <os>_<arch>_zero/optimized
|
||||||
# profiledzero zero <os>_<arch>_zero/profiled
|
|
||||||
# productzero zero <os>_<arch>_zero/product
|
# productzero zero <os>_<arch>_zero/product
|
||||||
#
|
#
|
||||||
# debugshark shark <os>_<arch>_shark/debug
|
# debugshark shark <os>_<arch>_shark/debug
|
||||||
# fastdebugshark shark <os>_<arch>_shark/fastdebug
|
# fastdebugshark shark <os>_<arch>_shark/fastdebug
|
||||||
# jvmgshark shark <os>_<arch>_shark/jvmg
|
|
||||||
# optimizedshark shark <os>_<arch>_shark/optimized
|
# optimizedshark shark <os>_<arch>_shark/optimized
|
||||||
# profiledshark shark <os>_<arch>_shark/profiled
|
|
||||||
# productshark shark <os>_<arch>_shark/product
|
# productshark shark <os>_<arch>_shark/product
|
||||||
#
|
#
|
||||||
# fastdebugminimal1 minimal1 <os>_<arch>_minimal1/fastdebug
|
# fastdebugminimal1 minimal1 <os>_<arch>_minimal1/fastdebug
|
||||||
# jvmgminimal1 minimal1 <os>_<arch>_minimal1/jvmg
|
# debugminimal1 minimal1 <os>_<arch>_minimal1/debug
|
||||||
# productminimal1 minimal1 <os>_<arch>_minimal1/product
|
# productminimal1 minimal1 <os>_<arch>_minimal1/product
|
||||||
#
|
#
|
||||||
# What you get with each target:
|
# What you get with each target:
|
||||||
#
|
#
|
||||||
# debug* - "thin" libjvm - debug info linked into the gamma launcher
|
# debug* - debug compile with asserts enabled
|
||||||
# fastdebug* - optimized compile, but with asserts enabled
|
# fastdebug* - optimized compile, but with asserts enabled
|
||||||
# jvmg* - "fat" libjvm - debug info linked into libjvm.so
|
|
||||||
# optimized* - optimized compile, no asserts
|
# optimized* - optimized compile, no asserts
|
||||||
# profiled* - gprof
|
|
||||||
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
||||||
|
|
||||||
# This target list needs to be coordinated with the usage message
|
# This target list needs to be coordinated with the usage message
|
||||||
# in the build.sh script:
|
# in the build.sh script:
|
||||||
TARGETS = debug jvmg fastdebug optimized profiled product
|
TARGETS = debug fastdebug optimized product
|
||||||
|
|
||||||
ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
|
ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
|
||||||
SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs
|
SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs
|
||||||
@ -354,15 +342,29 @@ docs: checks
|
|||||||
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) jvmtidocs
|
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) jvmtidocs
|
||||||
|
|
||||||
# Synonyms for win32-like targets.
|
# Synonyms for win32-like targets.
|
||||||
compiler2: jvmg product
|
compiler2: debug product
|
||||||
|
|
||||||
compiler1: jvmg1 product1
|
compiler1: debug1 product1
|
||||||
|
|
||||||
core: jvmgcore productcore
|
core: debugcore productcore
|
||||||
|
|
||||||
zero: jvmgzero productzero
|
zero: debugzero productzero
|
||||||
|
|
||||||
shark: jvmgshark productshark
|
shark: debugshark productshark
|
||||||
|
|
||||||
|
warn_jvmg_deprecated:
|
||||||
|
echo "Warning: The jvmg target has been replaced with debug"
|
||||||
|
echo "Warning: Please update your usage"
|
||||||
|
|
||||||
|
jvmg: warn_jvmg_deprecated debug
|
||||||
|
|
||||||
|
jvmg1: warn_jvmg_deprecated debug1
|
||||||
|
|
||||||
|
jvmgcore: warn_jvmg_deprecated debugcore
|
||||||
|
|
||||||
|
jvmgzero: warn_jvmg_deprecated debugzero
|
||||||
|
|
||||||
|
jvmgshark: warn_jvmg_deprecated debugshark
|
||||||
|
|
||||||
clean_docs:
|
clean_docs:
|
||||||
rm -rf $(SUBDIR_DOCS)
|
rm -rf $(SUBDIR_DOCS)
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Usage:
|
# Usage:
|
||||||
@ -46,11 +46,11 @@
|
|||||||
# Makefile - for "make foo"
|
# Makefile - for "make foo"
|
||||||
# flags.make - with macro settings
|
# flags.make - with macro settings
|
||||||
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
||||||
# adlc.make -
|
# adlc.make -
|
||||||
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
||||||
# sa.make - generate SA jar file and natives
|
# sa.make - generate SA jar file and natives
|
||||||
# env.[ck]sh - environment settings
|
# env.[ck]sh - environment settings
|
||||||
#
|
#
|
||||||
# The makefiles are split this way so that "make foo" will run faster by not
|
# The makefiles are split this way so that "make foo" will run faster by not
|
||||||
# having to read the dependency files for the vm.
|
# having to read the dependency files for the vm.
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ SIMPLE_DIRS = \
|
|||||||
$(PLATFORM_DIR)/generated/jvmtifiles \
|
$(PLATFORM_DIR)/generated/jvmtifiles \
|
||||||
$(PLATFORM_DIR)/generated/dtracefiles
|
$(PLATFORM_DIR)/generated/dtracefiles
|
||||||
|
|
||||||
TARGETS = debug fastdebug jvmg optimized product profiled
|
TARGETS = debug fastdebug optimized product
|
||||||
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
||||||
|
|
||||||
# For dependencies and recursive makes.
|
# For dependencies and recursive makes.
|
||||||
@ -186,8 +186,8 @@ $(SIMPLE_DIRS):
|
|||||||
$(QUIETLY) mkdir -p $@
|
$(QUIETLY) mkdir -p $@
|
||||||
|
|
||||||
# Convenience macro which takes a source relative path, applies $(1) to the
|
# Convenience macro which takes a source relative path, applies $(1) to the
|
||||||
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
||||||
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
||||||
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
||||||
|
|
||||||
# This bit is needed to enable local rebuilds.
|
# This bit is needed to enable local rebuilds.
|
||||||
@ -279,8 +279,6 @@ flags_vm.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
|
|||||||
$(QUIETLY) ( \
|
$(QUIETLY) ( \
|
||||||
$(BUILDTREE_COMMENT); \
|
$(BUILDTREE_COMMENT); \
|
||||||
echo; \
|
echo; \
|
||||||
[ "$(TARGET)" = profiled ] && \
|
|
||||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/optimized.make"; \
|
|
||||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
@ -381,7 +379,7 @@ jdkpath.sh: $(BUILDTREE_MAKE)
|
|||||||
$(QUIETLY) ( \
|
$(QUIETLY) ( \
|
||||||
$(BUILDTREE_COMMENT); \
|
$(BUILDTREE_COMMENT); \
|
||||||
echo "JDK=${JAVA_HOME}"; \
|
echo "JDK=${JAVA_HOME}"; \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
# Sets make macros for making debug version of VM
|
||||||
@ -27,17 +27,16 @@
|
|||||||
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||||
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
||||||
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
||||||
CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
|
||||||
|
# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
|
||||||
|
CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
|
||||||
|
|
||||||
|
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||||
|
# to inhibit the effect of the previous line on CFLAGS.
|
||||||
|
|
||||||
# Linker mapfile
|
# Linker mapfile
|
||||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
||||||
|
|
||||||
_JUNK_ := $(shell echo -e >&2 ""\
|
|
||||||
"----------------------------------------------------------------------\n" \
|
|
||||||
"WARNING: 'make debug' is deprecated. It will be removed in the future.\n" \
|
|
||||||
"Please use 'make jvmg' to build debug JVM. \n" \
|
|
||||||
"----------------------------------------------------------------------\n")
|
|
||||||
|
|
||||||
VERSION = debug
|
VERSION = debug
|
||||||
SYSDEFS += -DASSERT -DDEBUG
|
SYSDEFS += -DASSERT
|
||||||
PICFLAGS = DEFAULT
|
PICFLAGS = DEFAULT
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2006, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# The common definitions for hotspot bsd builds.
|
# The common definitions for hotspot bsd builds.
|
||||||
@ -86,7 +86,7 @@ ifneq (,$(findstring $(ARCH), amd64 x86_64))
|
|||||||
VM_PLATFORM = bsd_i486
|
VM_PLATFORM = bsd_i486
|
||||||
HS_ARCH = x86
|
HS_ARCH = x86
|
||||||
# We have to reset ARCH to i386 since SRCARCH relies on it
|
# We have to reset ARCH to i386 since SRCARCH relies on it
|
||||||
ARCH = i386
|
ARCH = i386
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -146,9 +146,6 @@ else
|
|||||||
LIBRARY_SUFFIX=so
|
LIBRARY_SUFFIX=so
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
|
||||||
VM_DEBUG=jvmg
|
|
||||||
|
|
||||||
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
||||||
|
|
||||||
# client and server subdirectories have symbolic links to ../libjsig.so
|
# client and server subdirectories have symbolic links to ../libjsig.so
|
||||||
@ -177,7 +174,7 @@ ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
|||||||
else
|
else
|
||||||
EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.debuginfo
|
EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.debuginfo
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Serviceability Binaries
|
# Serviceability Binaries
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2012 Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 2012, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
# Sets make macros for making debug version of VM
|
||||||
@ -59,5 +59,5 @@ CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
|
|||||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
||||||
|
|
||||||
VERSION = optimized
|
VERSION = optimized
|
||||||
SYSDEFS += -DASSERT -DFASTDEBUG
|
SYSDEFS += -DASSERT
|
||||||
PICFLAGS = DEFAULT
|
PICFLAGS = DEFAULT
|
||||||
|
@ -187,7 +187,7 @@ Src_Dirs/ZERO := $(CORE_PATHS)
|
|||||||
Src_Dirs/SHARK := $(CORE_PATHS) $(SHARK_PATHS)
|
Src_Dirs/SHARK := $(CORE_PATHS) $(SHARK_PATHS)
|
||||||
Src_Dirs := $(Src_Dirs/$(TYPE))
|
Src_Dirs := $(Src_Dirs/$(TYPE))
|
||||||
|
|
||||||
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp chaitin\* c2_\* runtime_\*
|
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp c2_\* runtime_\*
|
||||||
COMPILER1_SPECIFIC_FILES := c1_\*
|
COMPILER1_SPECIFIC_FILES := c1_\*
|
||||||
SHARK_SPECIFIC_FILES := shark
|
SHARK_SPECIFIC_FILES := shark
|
||||||
ZERO_SPECIFIC_FILES := zero
|
ZERO_SPECIFIC_FILES := zero
|
||||||
|
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
|
|||||||
|
|
||||||
HS_MAJOR_VER=25
|
HS_MAJOR_VER=25
|
||||||
HS_MINOR_VER=0
|
HS_MINOR_VER=0
|
||||||
HS_BUILD_NUMBER=29
|
HS_BUILD_NUMBER=30
|
||||||
|
|
||||||
JDK_MAJOR_VER=1
|
JDK_MAJOR_VER=1
|
||||||
JDK_MINOR_VER=8
|
JDK_MINOR_VER=8
|
||||||
|
@ -133,15 +133,15 @@ jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}}
|
|||||||
# Standard list of jprt build targets for this source tree
|
# Standard list of jprt build targets for this source tree
|
||||||
|
|
||||||
jprt.build.targets.standard= \
|
jprt.build.targets.standard= \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug|debug}, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug|debug}, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}, \
|
||||||
${jprt.my.solaris.i586}-{product|fastdebug|debug}, \
|
${jprt.my.solaris.i586}-{product|fastdebug}, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug|debug}, \
|
${jprt.my.solaris.x64}-{product|fastdebug}, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug|debug}, \
|
${jprt.my.linux.i586}-{product|fastdebug}, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}, \
|
${jprt.my.linux.x64}-{product|fastdebug}, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug|debug}, \
|
${jprt.my.macosx.x64}-{product|fastdebug}, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug|debug}, \
|
${jprt.my.windows.i586}-{product|fastdebug}, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug|debug}, \
|
${jprt.my.windows.x64}-{product|fastdebug}, \
|
||||||
${jprt.my.linux.armvh}-{product|fastdebug}
|
${jprt.my.linux.armvh}-{product|fastdebug}
|
||||||
|
|
||||||
jprt.build.targets.open= \
|
jprt.build.targets.open= \
|
||||||
@ -150,7 +150,7 @@ jprt.build.targets.open= \
|
|||||||
${jprt.my.linux.x64}-{productOpen}
|
${jprt.my.linux.x64}-{productOpen}
|
||||||
|
|
||||||
jprt.build.targets.embedded= \
|
jprt.build.targets.embedded= \
|
||||||
${jprt.my.linux.i586}-{productEmb|fastdebugEmb|debugEmb}, \
|
${jprt.my.linux.i586}-{productEmb|fastdebugEmb}, \
|
||||||
${jprt.my.linux.ppc}-{productEmb|fastdebugEmb}, \
|
${jprt.my.linux.ppc}-{productEmb|fastdebugEmb}, \
|
||||||
${jprt.my.linux.ppcv2}-{productEmb|fastdebugEmb}, \
|
${jprt.my.linux.ppcv2}-{productEmb|fastdebugEmb}, \
|
||||||
${jprt.my.linux.ppcsflt}-{productEmb|fastdebugEmb}, \
|
${jprt.my.linux.ppcsflt}-{productEmb|fastdebugEmb}, \
|
||||||
@ -174,21 +174,18 @@ jprt.my.solaris.sparc.test.targets= \
|
|||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-scimark, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-scimark, \
|
||||||
${jprt.my.solaris.sparc}-product-{c1|c2}-runThese, \
|
${jprt.my.solaris.sparc}-product-{c1|c2}-runThese, \
|
||||||
${jprt.my.solaris.sparc}-fastdebug-c1-runThese_Xshare, \
|
${jprt.my.solaris.sparc}-fastdebug-c1-runThese_Xshare, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_default, \
|
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_default, \
|
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_SerialGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_SerialGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParallelGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParallelGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParNewGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParNewGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_CMS, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_CMS, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_G1, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_G1, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParOldGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-GCOld_ParOldGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_default, \
|
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_SerialGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_SerialGC, \
|
||||||
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_ParallelGC, \
|
${jprt.my.solaris.sparc}-{product|fastdebug}-{c1|c2}-jbb_ParallelGC, \
|
||||||
@ -201,21 +198,18 @@ jprt.my.solaris.sparcv9.test.targets= \
|
|||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jvm98_nontiered, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jvm98_nontiered, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-scimark, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-scimark, \
|
||||||
${jprt.my.solaris.sparcv9}-product-c2-runThese, \
|
${jprt.my.solaris.sparcv9}-product-c2-runThese, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_default, \
|
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_CMS, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_CMS, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_G1, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_G1, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_default, \
|
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_CMS, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_CMS, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_G1, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_G1, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_default, \
|
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_SerialGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_SerialGC, \
|
||||||
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
${jprt.my.solaris.sparcv9}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
||||||
@ -229,21 +223,18 @@ jprt.my.solaris.x64.test.targets= \
|
|||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-scimark, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-scimark, \
|
||||||
${jprt.my.solaris.x64}-product-c2-runThese, \
|
${jprt.my.solaris.x64}-product-c2-runThese, \
|
||||||
${jprt.my.solaris.x64}-product-c2-runThese_Xcomp, \
|
${jprt.my.solaris.x64}-product-c2-runThese_Xcomp, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_default, \
|
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_default, \
|
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_CMS, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_CMS, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_G1, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_G1, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_default, \
|
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_SerialGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_SerialGC, \
|
||||||
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
${jprt.my.solaris.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
||||||
@ -258,28 +249,24 @@ jprt.my.solaris.i586.test.targets= \
|
|||||||
${jprt.my.solaris.i586}-product-{c1|c2}-runThese_Xcomp, \
|
${jprt.my.solaris.i586}-product-{c1|c2}-runThese_Xcomp, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c1-runThese_Xcomp, \
|
${jprt.my.solaris.i586}-fastdebug-c1-runThese_Xcomp, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c1-runThese_Xshare, \
|
${jprt.my.solaris.i586}-fastdebug-c1-runThese_Xshare, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_default, \
|
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_SerialGC, \
|
${jprt.my.solaris.i586}-product-c1-GCBasher_SerialGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_ParallelGC, \
|
${jprt.my.solaris.i586}-product-c1-GCBasher_ParallelGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_ParNewGC, \
|
${jprt.my.solaris.i586}-product-c1-GCBasher_ParNewGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_CMS, \
|
${jprt.my.solaris.i586}-product-c1-GCBasher_CMS, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_G1, \
|
${jprt.my.solaris.i586}-product-c1-GCBasher_G1, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCBasher_ParOldGC, \
|
${jprt.my.solaris.i586}-product-c1-GCBasher_ParOldGC, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_default, \
|
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_SerialGC, \
|
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_SerialGC, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParallelGC, \
|
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParallelGC, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParNewGC, \
|
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParNewGC, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_CMS, \
|
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_CMS, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_G1, \
|
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_G1, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParOldGC, \
|
${jprt.my.solaris.i586}-fastdebug-c2-GCBasher_ParOldGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_default, \
|
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_SerialGC, \
|
${jprt.my.solaris.i586}-product-c1-GCOld_SerialGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_ParallelGC, \
|
${jprt.my.solaris.i586}-product-c1-GCOld_ParallelGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_ParNewGC, \
|
${jprt.my.solaris.i586}-product-c1-GCOld_ParNewGC, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_CMS, \
|
${jprt.my.solaris.i586}-product-c1-GCOld_CMS, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_G1, \
|
${jprt.my.solaris.i586}-product-c1-GCOld_G1, \
|
||||||
${jprt.my.solaris.i586}-product-c1-GCOld_ParOldGC, \
|
${jprt.my.solaris.i586}-product-c1-GCOld_ParOldGC, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-jbb_default, \
|
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-jbb_default_nontiered, \
|
${jprt.my.solaris.i586}-fastdebug-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-jbb_ParallelGC, \
|
${jprt.my.solaris.i586}-fastdebug-c2-jbb_ParallelGC, \
|
||||||
${jprt.my.solaris.i586}-fastdebug-c2-jbb_CMS, \
|
${jprt.my.solaris.i586}-fastdebug-c2-jbb_CMS, \
|
||||||
@ -293,21 +280,19 @@ jprt.my.linux.i586.test.targets = \
|
|||||||
${jprt.my.linux.i586}-product-c1-runThese_Xcomp, \
|
${jprt.my.linux.i586}-product-c1-runThese_Xcomp, \
|
||||||
${jprt.my.linux.i586}-fastdebug-c1-runThese_Xshare, \
|
${jprt.my.linux.i586}-fastdebug-c1-runThese_Xshare, \
|
||||||
${jprt.my.linux.i586}-fastdebug-c2-runThese_Xcomp, \
|
${jprt.my.linux.i586}-fastdebug-c2-runThese_Xcomp, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_default, \
|
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
|
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
|
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \
|
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
|
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
|
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
|
${jprt.my.linux.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_default, \
|
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_SerialGC, \
|
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_SerialGC, \
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParallelGC, \
|
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParallelGC, \
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParNewGC, \
|
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParNewGC, \
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_CMS, \
|
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_CMS, \
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_G1, \
|
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_G1, \
|
||||||
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParOldGC, \
|
${jprt.my.linux.i586}-product-{c1|c2}-GCOld_ParOldGC, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_default, \
|
${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_SerialGC, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
${jprt.my.linux.i586}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_ParallelGC, \
|
${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_ParallelGC, \
|
||||||
${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_CMS, \
|
${jprt.my.linux.i586}-{product|fastdebug}-c1-jbb_CMS, \
|
||||||
@ -318,21 +303,18 @@ jprt.my.linux.x64.test.targets = \
|
|||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-jvm98, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-jvm98, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-jvm98_nontiered, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-jvm98_nontiered, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-scimark, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-scimark, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_default, \
|
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_default, \
|
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_CMS, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_CMS, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_G1, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_G1, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_default, \
|
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
||||||
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_G1, \
|
${jprt.my.linux.x64}-{product|fastdebug}-c2-jbb_G1, \
|
||||||
@ -342,21 +324,18 @@ jprt.my.macosx.x64.test.targets = \
|
|||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jvm98, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jvm98, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jvm98_nontiered, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jvm98_nontiered, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-scimark, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-scimark, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_default, \
|
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_default, \
|
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_CMS, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_CMS, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_G1, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_G1, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-GCOld_ParOldGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default, \
|
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_default_nontiered, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_ParallelGC, \
|
||||||
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_G1, \
|
${jprt.my.macosx.x64}-{product|fastdebug}-c2-jbb_G1, \
|
||||||
@ -369,14 +348,12 @@ jprt.my.windows.i586.test.targets = \
|
|||||||
${jprt.my.windows.i586}-product-{c1|c2}-runThese, \
|
${jprt.my.windows.i586}-product-{c1|c2}-runThese, \
|
||||||
${jprt.my.windows.i586}-product-{c1|c2}-runThese_Xcomp, \
|
${jprt.my.windows.i586}-product-{c1|c2}-runThese_Xcomp, \
|
||||||
${jprt.my.windows.i586}-fastdebug-c1-runThese_Xshare, \
|
${jprt.my.windows.i586}-fastdebug-c1-runThese_Xshare, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_default, \
|
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
|
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
|
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \
|
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParNewGC, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
|
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
|
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
|
||||||
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
|
${jprt.my.windows.i586}-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
|
||||||
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_default, \
|
|
||||||
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_SerialGC, \
|
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_SerialGC, \
|
||||||
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_ParallelGC, \
|
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_ParallelGC, \
|
||||||
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_ParNewGC, \
|
${jprt.my.windows.i586}-product-{c1|c2}-GCOld_ParNewGC, \
|
||||||
@ -396,14 +373,12 @@ jprt.my.windows.x64.test.targets = \
|
|||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-scimark, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-scimark, \
|
||||||
${jprt.my.windows.x64}-product-c2-runThese, \
|
${jprt.my.windows.x64}-product-c2-runThese, \
|
||||||
${jprt.my.windows.x64}-product-c2-runThese_Xcomp, \
|
${jprt.my.windows.x64}-product-c2-runThese_Xcomp, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_default, \
|
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_SerialGC, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParallelGC, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParNewGC, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_CMS, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_G1, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCBasher_ParOldGC, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_default, \
|
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_SerialGC, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_ParallelGC, \
|
||||||
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
${jprt.my.windows.x64}-{product|fastdebug}-c2-GCOld_ParNewGC, \
|
||||||
@ -419,7 +394,7 @@ jprt.my.windows.x64.test.targets = \
|
|||||||
|
|
||||||
# Some basic "smoke" tests for OpenJDK builds
|
# Some basic "smoke" tests for OpenJDK builds
|
||||||
jprt.test.targets.open = \
|
jprt.test.targets.open = \
|
||||||
${jprt.my.solaris.x64}-{productOpen|debugOpen|fastdebugOpen}-c2-jvm98, \
|
${jprt.my.solaris.x64}-{productOpen|fastdebugOpen}-c2-jvm98, \
|
||||||
${jprt.my.solaris.i586}-{productOpen|fastdebugOpen}-c2-jvm98, \
|
${jprt.my.solaris.i586}-{productOpen|fastdebugOpen}-c2-jvm98, \
|
||||||
${jprt.my.linux.x64}-{productOpen|fastdebugOpen}-c2-jvm98
|
${jprt.my.linux.x64}-{productOpen|fastdebugOpen}-c2-jvm98
|
||||||
|
|
||||||
@ -520,5 +495,5 @@ jprt.make.rule.test.targets.jdk7u8=${jprt.make.rule.test.targets.jdk7}
|
|||||||
jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}}
|
jprt.make.rule.test.targets=${jprt.make.rule.test.targets.${jprt.tools.default.release}}
|
||||||
|
|
||||||
# 7155453: Work-around to prevent popups on OSX from blocking test completion
|
# 7155453: Work-around to prevent popups on OSX from blocking test completion
|
||||||
# but the work-around is added to all platforms to be consistent
|
# but the work-around is added to all platforms to be consistent
|
||||||
jprt.jbb.options=-Djava.awt.headless=true
|
jprt.jbb.options=-Djava.awt.headless=true
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 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
|
||||||
@ -142,55 +142,42 @@ VARIANTARCH = $(subst i386,i486,$(ZERO_LIBARCH))
|
|||||||
#
|
#
|
||||||
# debug compiler2 <os>_<arch>_compiler2/debug
|
# debug compiler2 <os>_<arch>_compiler2/debug
|
||||||
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
||||||
# jvmg compiler2 <os>_<arch>_compiler2/jvmg
|
|
||||||
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
||||||
# profiled compiler2 <os>_<arch>_compiler2/profiled
|
|
||||||
# product compiler2 <os>_<arch>_compiler2/product
|
# product compiler2 <os>_<arch>_compiler2/product
|
||||||
#
|
#
|
||||||
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
||||||
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
||||||
# jvmg1 compiler1 <os>_<arch>_compiler1/jvmg
|
|
||||||
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
||||||
# profiled1 compiler1 <os>_<arch>_compiler1/profiled
|
|
||||||
# product1 compiler1 <os>_<arch>_compiler1/product
|
# product1 compiler1 <os>_<arch>_compiler1/product
|
||||||
#
|
#
|
||||||
# debugcore core <os>_<arch>_core/debug
|
# debugcore core <os>_<arch>_core/debug
|
||||||
# fastdebugcore core <os>_<arch>_core/fastdebug
|
# fastdebugcore core <os>_<arch>_core/fastdebug
|
||||||
# jvmgcore core <os>_<arch>_core/jvmg
|
|
||||||
# optimizedcore core <os>_<arch>_core/optimized
|
# optimizedcore core <os>_<arch>_core/optimized
|
||||||
# profiledcore core <os>_<arch>_core/profiled
|
|
||||||
# productcore core <os>_<arch>_core/product
|
# productcore core <os>_<arch>_core/product
|
||||||
#
|
#
|
||||||
# debugzero zero <os>_<arch>_zero/debug
|
# debugzero zero <os>_<arch>_zero/debug
|
||||||
# fastdebugzero zero <os>_<arch>_zero/fastdebug
|
# fastdebugzero zero <os>_<arch>_zero/fastdebug
|
||||||
# jvmgzero zero <os>_<arch>_zero/jvmg
|
|
||||||
# optimizedzero zero <os>_<arch>_zero/optimized
|
# optimizedzero zero <os>_<arch>_zero/optimized
|
||||||
# profiledzero zero <os>_<arch>_zero/profiled
|
|
||||||
# productzero zero <os>_<arch>_zero/product
|
# productzero zero <os>_<arch>_zero/product
|
||||||
#
|
#
|
||||||
# debugshark shark <os>_<arch>_shark/debug
|
# debugshark shark <os>_<arch>_shark/debug
|
||||||
# fastdebugshark shark <os>_<arch>_shark/fastdebug
|
# fastdebugshark shark <os>_<arch>_shark/fastdebug
|
||||||
# jvmgshark shark <os>_<arch>_shark/jvmg
|
|
||||||
# optimizedshark shark <os>_<arch>_shark/optimized
|
# optimizedshark shark <os>_<arch>_shark/optimized
|
||||||
# profiledshark shark <os>_<arch>_shark/profiled
|
|
||||||
# productshark shark <os>_<arch>_shark/product
|
# productshark shark <os>_<arch>_shark/product
|
||||||
#
|
#
|
||||||
# fastdebugminimal1 minimal1 <os>_<arch>_minimal1/fastdebug
|
# fastdebugminimal1 minimal1 <os>_<arch>_minimal1/fastdebug
|
||||||
# jvmgminimal1 minimal1 <os>_<arch>_minimal1/jvmg
|
|
||||||
# productminimal1 minimal1 <os>_<arch>_minimal1/product
|
# productminimal1 minimal1 <os>_<arch>_minimal1/product
|
||||||
#
|
#
|
||||||
# What you get with each target:
|
# What you get with each target:
|
||||||
#
|
#
|
||||||
# debug* - "thin" libjvm - debug info linked into the gamma launcher
|
# debug* - debug compile with asserts enabled
|
||||||
# fastdebug* - optimized compile, but with asserts enabled
|
# fastdebug* - optimized compile, but with asserts enabled
|
||||||
# jvmg* - "fat" libjvm - debug info linked into libjvm.so
|
|
||||||
# optimized* - optimized compile, no asserts
|
# optimized* - optimized compile, no asserts
|
||||||
# profiled* - gprof
|
|
||||||
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
||||||
|
|
||||||
# This target list needs to be coordinated with the usage message
|
# This target list needs to be coordinated with the usage message
|
||||||
# in the build.sh script:
|
# in the build.sh script:
|
||||||
TARGETS = debug jvmg fastdebug optimized profiled product
|
TARGETS = debug fastdebug optimized product
|
||||||
|
|
||||||
ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
|
ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
|
||||||
SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs
|
SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs
|
||||||
@ -357,15 +344,29 @@ docs: checks
|
|||||||
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) BUILD_FLAVOR=product jvmtidocs
|
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) BUILD_FLAVOR=product jvmtidocs
|
||||||
|
|
||||||
# Synonyms for win32-like targets.
|
# Synonyms for win32-like targets.
|
||||||
compiler2: jvmg product
|
compiler2: debug product
|
||||||
|
|
||||||
compiler1: jvmg1 product1
|
compiler1: debug1 product1
|
||||||
|
|
||||||
core: jvmgcore productcore
|
core: debugcore productcore
|
||||||
|
|
||||||
zero: jvmgzero productzero
|
zero: debugzero productzero
|
||||||
|
|
||||||
shark: jvmgshark productshark
|
shark: debugshark productshark
|
||||||
|
|
||||||
|
warn_jvmg_deprecated:
|
||||||
|
echo "Warning: The jvmg target has been replaced with debug"
|
||||||
|
echo "Warning: Please update your usage"
|
||||||
|
|
||||||
|
jvmg: warn_jvmg_deprecated debug
|
||||||
|
|
||||||
|
jvmg1: warn_jvmg_deprecated debug1
|
||||||
|
|
||||||
|
jvmgcore: warn_jvmg_deprecated debugcore
|
||||||
|
|
||||||
|
jvmgzero: warn_jvmg_deprecated debugzero
|
||||||
|
|
||||||
|
jvmgshark: warn_jvmg_deprecated debugshark
|
||||||
|
|
||||||
clean_docs:
|
clean_docs:
|
||||||
rm -rf $(SUBDIR_DOCS)
|
rm -rf $(SUBDIR_DOCS)
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Usage:
|
# Usage:
|
||||||
@ -46,11 +46,11 @@
|
|||||||
# Makefile - for "make foo"
|
# Makefile - for "make foo"
|
||||||
# flags.make - with macro settings
|
# flags.make - with macro settings
|
||||||
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
||||||
# adlc.make -
|
# adlc.make -
|
||||||
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
||||||
# sa.make - generate SA jar file and natives
|
# sa.make - generate SA jar file and natives
|
||||||
# env.[ck]sh - environment settings
|
# env.[ck]sh - environment settings
|
||||||
#
|
#
|
||||||
# The makefiles are split this way so that "make foo" will run faster by not
|
# The makefiles are split this way so that "make foo" will run faster by not
|
||||||
# having to read the dependency files for the vm.
|
# having to read the dependency files for the vm.
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ SIMPLE_DIRS = \
|
|||||||
$(PLATFORM_DIR)/generated/adfiles \
|
$(PLATFORM_DIR)/generated/adfiles \
|
||||||
$(PLATFORM_DIR)/generated/jvmtifiles
|
$(PLATFORM_DIR)/generated/jvmtifiles
|
||||||
|
|
||||||
TARGETS = debug fastdebug jvmg optimized product profiled
|
TARGETS = debug fastdebug optimized product
|
||||||
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
||||||
|
|
||||||
# For dependencies and recursive makes.
|
# For dependencies and recursive makes.
|
||||||
@ -179,8 +179,8 @@ $(SIMPLE_DIRS):
|
|||||||
$(QUIETLY) mkdir -p $@
|
$(QUIETLY) mkdir -p $@
|
||||||
|
|
||||||
# Convenience macro which takes a source relative path, applies $(1) to the
|
# Convenience macro which takes a source relative path, applies $(1) to the
|
||||||
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
||||||
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
||||||
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
||||||
|
|
||||||
# This bit is needed to enable local rebuilds.
|
# This bit is needed to enable local rebuilds.
|
||||||
@ -284,8 +284,6 @@ flags_vm.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
|
|||||||
$(QUIETLY) ( \
|
$(QUIETLY) ( \
|
||||||
$(BUILDTREE_COMMENT); \
|
$(BUILDTREE_COMMENT); \
|
||||||
echo; \
|
echo; \
|
||||||
[ "$(TARGET)" = profiled ] && \
|
|
||||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/optimized.make"; \
|
|
||||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
@ -376,7 +374,7 @@ jdkpath.sh: $(BUILDTREE_MAKE)
|
|||||||
$(QUIETLY) ( \
|
$(QUIETLY) ( \
|
||||||
$(BUILDTREE_COMMENT); \
|
$(BUILDTREE_COMMENT); \
|
||||||
echo "JDK=${JAVA_HOME}"; \
|
echo "JDK=${JAVA_HOME}"; \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
# Sets make macros for making debug version of VM
|
||||||
@ -27,17 +27,16 @@
|
|||||||
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||||
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
||||||
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
||||||
CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
|
||||||
|
# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
|
||||||
|
CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
|
||||||
|
|
||||||
|
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||||
|
# to inhibit the effect of the previous line on CFLAGS.
|
||||||
|
|
||||||
# Linker mapfile
|
# Linker mapfile
|
||||||
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
|
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
|
||||||
|
|
||||||
_JUNK_ := $(shell echo -e >&2 ""\
|
|
||||||
"----------------------------------------------------------------------\n" \
|
|
||||||
"WARNING: 'make debug' is deprecated. It will be removed in the future.\n" \
|
|
||||||
"Please use 'make jvmg' to build debug JVM. \n" \
|
|
||||||
"----------------------------------------------------------------------\n")
|
|
||||||
|
|
||||||
VERSION = debug
|
VERSION = debug
|
||||||
SYSDEFS += -DASSERT -DDEBUG
|
SYSDEFS += -DASSERT
|
||||||
PICFLAGS = DEFAULT
|
PICFLAGS = DEFAULT
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2006, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# The common definitions for hotspot linux builds.
|
# The common definitions for hotspot linux builds.
|
||||||
@ -92,7 +92,7 @@ ifneq (,$(findstring $(ARCH), amd64 x86_64))
|
|||||||
VM_PLATFORM = linux_i486
|
VM_PLATFORM = linux_i486
|
||||||
HS_ARCH = x86
|
HS_ARCH = x86
|
||||||
# We have to reset ARCH to i686 since SRCARCH relies on it
|
# We have to reset ARCH to i686 since SRCARCH relies on it
|
||||||
ARCH = i686
|
ARCH = i686
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -240,9 +240,6 @@ JDK_INCLUDE_SUBDIR=linux
|
|||||||
# Library suffix
|
# Library suffix
|
||||||
LIBRARY_SUFFIX=so
|
LIBRARY_SUFFIX=so
|
||||||
|
|
||||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
|
||||||
VM_DEBUG=jvmg
|
|
||||||
|
|
||||||
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
||||||
|
|
||||||
# client and server subdirectories have symbolic links to ../libjsig.so
|
# client and server subdirectories have symbolic links to ../libjsig.so
|
||||||
@ -279,7 +276,7 @@ ifeq ($(JVM_VARIANT_CLIENT),true)
|
|||||||
else
|
else
|
||||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.debuginfo
|
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.debuginfo
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
||||||
@ -292,15 +289,15 @@ ifeq ($(JVM_VARIANT_MINIMAL1),true)
|
|||||||
else
|
else
|
||||||
EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.debuginfo
|
EXPORT_LIST += $(EXPORT_MINIMAL_DIR)/libjvm.debuginfo
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Serviceability Binaries
|
# Serviceability Binaries
|
||||||
# No SA Support for PPC, IA64, ARM or zero
|
# No SA Support for PPC, IA64, ARM or zero
|
||||||
ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
||||||
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||||
ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
||||||
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||||
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
||||||
ifeq ($(ZIP_DEBUGINFO_FILES),1)
|
ifeq ($(ZIP_DEBUGINFO_FILES),1)
|
||||||
ADD_SA_BINARIES/x86 += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.diz
|
ADD_SA_BINARIES/x86 += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.diz
|
||||||
@ -310,10 +307,10 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
|||||||
ADD_SA_BINARIES/sparc += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo
|
ADD_SA_BINARIES/sparc += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ADD_SA_BINARIES/ppc =
|
ADD_SA_BINARIES/ppc =
|
||||||
ADD_SA_BINARIES/ia64 =
|
ADD_SA_BINARIES/ia64 =
|
||||||
ADD_SA_BINARIES/arm =
|
ADD_SA_BINARIES/arm =
|
||||||
ADD_SA_BINARIES/zero =
|
ADD_SA_BINARIES/zero =
|
||||||
|
|
||||||
-include $(HS_ALT_MAKE)/linux/makefiles/defs.make
|
-include $(HS_ALT_MAKE)/linux/makefiles/defs.make
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
# Sets make macros for making debug version of VM
|
||||||
@ -59,5 +59,5 @@ CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
|
|||||||
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
|
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
|
||||||
|
|
||||||
VERSION = optimized
|
VERSION = optimized
|
||||||
SYSDEFS += -DASSERT -DFASTDEBUG
|
SYSDEFS += -DASSERT
|
||||||
PICFLAGS = DEFAULT
|
PICFLAGS = DEFAULT
|
||||||
|
@ -189,7 +189,7 @@ Src_Dirs/ZERO := $(CORE_PATHS)
|
|||||||
Src_Dirs/SHARK := $(CORE_PATHS) $(SHARK_PATHS)
|
Src_Dirs/SHARK := $(CORE_PATHS) $(SHARK_PATHS)
|
||||||
Src_Dirs := $(Src_Dirs/$(TYPE))
|
Src_Dirs := $(Src_Dirs/$(TYPE))
|
||||||
|
|
||||||
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp chaitin\* c2_\* runtime_\*
|
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp c2_\* runtime_\*
|
||||||
COMPILER1_SPECIFIC_FILES := c1_\*
|
COMPILER1_SPECIFIC_FILES := c1_\*
|
||||||
SHARK_SPECIFIC_FILES := shark
|
SHARK_SPECIFIC_FILES := shark
|
||||||
ZERO_SPECIFIC_FILES := zero
|
ZERO_SPECIFIC_FILES := zero
|
||||||
|
@ -120,37 +120,29 @@ endif
|
|||||||
#
|
#
|
||||||
# debug compiler2 <os>_<arch>_compiler2/debug
|
# debug compiler2 <os>_<arch>_compiler2/debug
|
||||||
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
||||||
# jvmg compiler2 <os>_<arch>_compiler2/jvmg
|
|
||||||
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
||||||
# profiled compiler2 <os>_<arch>_compiler2/profiled
|
|
||||||
# product compiler2 <os>_<arch>_compiler2/product
|
# product compiler2 <os>_<arch>_compiler2/product
|
||||||
#
|
#
|
||||||
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
||||||
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
||||||
# jvmg1 compiler1 <os>_<arch>_compiler1/jvmg
|
|
||||||
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
||||||
# profiled1 compiler1 <os>_<arch>_compiler1/profiled
|
|
||||||
# product1 compiler1 <os>_<arch>_compiler1/product
|
# product1 compiler1 <os>_<arch>_compiler1/product
|
||||||
#
|
#
|
||||||
# debugcore core <os>_<arch>_core/debug
|
# debugcore core <os>_<arch>_core/debug
|
||||||
# fastdebugcore core <os>_<arch>_core/fastdebug
|
# fastdebugcore core <os>_<arch>_core/fastdebug
|
||||||
# jvmgcore core <os>_<arch>_core/jvmg
|
|
||||||
# optimizedcore core <os>_<arch>_core/optimized
|
# optimizedcore core <os>_<arch>_core/optimized
|
||||||
# profiledcore core <os>_<arch>_core/profiled
|
|
||||||
# productcore core <os>_<arch>_core/product
|
# productcore core <os>_<arch>_core/product
|
||||||
#
|
#
|
||||||
# What you get with each target:
|
# What you get with each target:
|
||||||
#
|
#
|
||||||
# debug* - "thin" libjvm - debug info linked into the gamma launcher
|
# debug* - debug compile with asserts enabled
|
||||||
# fastdebug* - optimized compile, but with asserts enabled
|
# fastdebug* - optimized compile, but with asserts enabled
|
||||||
# jvmg* - "fat" libjvm - debug info linked into libjvm.so
|
|
||||||
# optimized* - optimized compile, no asserts
|
# optimized* - optimized compile, no asserts
|
||||||
# profiled* - gprof
|
|
||||||
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
||||||
|
|
||||||
# This target list needs to be coordinated with the usage message
|
# This target list needs to be coordinated with the usage message
|
||||||
# in the build.sh script:
|
# in the build.sh script:
|
||||||
TARGETS = debug jvmg fastdebug optimized profiled product
|
TARGETS = debug fastdebug optimized product
|
||||||
|
|
||||||
SUBDIR_DOCS = $(OSNAME)_$(BUILDARCH)_docs
|
SUBDIR_DOCS = $(OSNAME)_$(BUILDARCH)_docs
|
||||||
SUBDIRS_C1 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler1/,$(TARGETS))
|
SUBDIRS_C1 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler1/,$(TARGETS))
|
||||||
@ -267,11 +259,21 @@ docs: checks
|
|||||||
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) BUILD_FLAVOR=product jvmtidocs
|
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) BUILD_FLAVOR=product jvmtidocs
|
||||||
|
|
||||||
# Synonyms for win32-like targets.
|
# Synonyms for win32-like targets.
|
||||||
compiler2: jvmg product
|
compiler2: debug product
|
||||||
|
|
||||||
compiler1: jvmg1 product1
|
compiler1: debug1 product1
|
||||||
|
|
||||||
core: jvmgcore productcore
|
core: debugcore productcore
|
||||||
|
|
||||||
|
warn_jvmg_deprecated:
|
||||||
|
echo "Warning: The jvmg target has been replaced with debug"
|
||||||
|
echo "Warning: Please update your usage"
|
||||||
|
|
||||||
|
jvmg: warn_jvmg_deprecated debug
|
||||||
|
|
||||||
|
jvmg1: warn_jvmg_deprecated debug1
|
||||||
|
|
||||||
|
jvmgcore: warn_jvmg_deprecated debugcore
|
||||||
|
|
||||||
clean_docs:
|
clean_docs:
|
||||||
rm -rf $(SUBDIR_DOCS)
|
rm -rf $(SUBDIR_DOCS)
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Usage:
|
# Usage:
|
||||||
@ -46,11 +46,11 @@
|
|||||||
# Makefile - for "make foo"
|
# Makefile - for "make foo"
|
||||||
# flags.make - with macro settings
|
# flags.make - with macro settings
|
||||||
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
||||||
# adlc.make -
|
# adlc.make -
|
||||||
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
||||||
# sa.make - generate SA jar file and natives
|
# sa.make - generate SA jar file and natives
|
||||||
# env.[ck]sh - environment settings
|
# env.[ck]sh - environment settings
|
||||||
#
|
#
|
||||||
# The makefiles are split this way so that "make foo" will run faster by not
|
# The makefiles are split this way so that "make foo" will run faster by not
|
||||||
# having to read the dependency files for the vm.
|
# having to read the dependency files for the vm.
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH).gcc
|
|||||||
GCC_LIB = /usr/local/lib
|
GCC_LIB = /usr/local/lib
|
||||||
else
|
else
|
||||||
PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH)
|
PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH)
|
||||||
GCC_LIB =
|
GCC_LIB =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef FORCE_TIERED
|
ifdef FORCE_TIERED
|
||||||
@ -110,7 +110,7 @@ SIMPLE_DIRS = \
|
|||||||
$(PLATFORM_DIR)/generated/adfiles \
|
$(PLATFORM_DIR)/generated/adfiles \
|
||||||
$(PLATFORM_DIR)/generated/jvmtifiles
|
$(PLATFORM_DIR)/generated/jvmtifiles
|
||||||
|
|
||||||
TARGETS = debug fastdebug jvmg optimized product profiled
|
TARGETS = debug fastdebug optimized product
|
||||||
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
||||||
|
|
||||||
# For dependencies and recursive makes.
|
# For dependencies and recursive makes.
|
||||||
@ -153,7 +153,7 @@ ifndef OPENJDK
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION= JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION)
|
BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION= JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION)
|
||||||
|
|
||||||
BUILDTREE = \
|
BUILDTREE = \
|
||||||
$(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_TARGETS) $(BUILDTREE_VARS)
|
$(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_TARGETS) $(BUILDTREE_VARS)
|
||||||
@ -172,8 +172,8 @@ $(SIMPLE_DIRS):
|
|||||||
$(QUIETLY) mkdir -p $@
|
$(QUIETLY) mkdir -p $@
|
||||||
|
|
||||||
# Convenience macro which takes a source relative path, applies $(1) to the
|
# Convenience macro which takes a source relative path, applies $(1) to the
|
||||||
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
||||||
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
||||||
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
||||||
|
|
||||||
# This bit is needed to enable local rebuilds.
|
# This bit is needed to enable local rebuilds.
|
||||||
@ -274,8 +274,6 @@ flags_vm.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
|
|||||||
$(QUIETLY) ( \
|
$(QUIETLY) ( \
|
||||||
$(BUILDTREE_COMMENT); \
|
$(BUILDTREE_COMMENT); \
|
||||||
echo; \
|
echo; \
|
||||||
[ "$(TARGET)" = profiled ] && \
|
|
||||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/optimized.make"; \
|
|
||||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
@ -366,7 +364,7 @@ jdkpath.sh: $(BUILDTREE_MAKE)
|
|||||||
$(QUIETLY) ( \
|
$(QUIETLY) ( \
|
||||||
$(BUILDTREE_COMMENT); \
|
$(BUILDTREE_COMMENT); \
|
||||||
echo "JDK=${JAVA_HOME}"; \
|
echo "JDK=${JAVA_HOME}"; \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1999, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
# Sets make macros for making debug version of VM
|
||||||
@ -37,22 +37,20 @@ ifeq ($(COMPILER_REV_NUMERIC),508)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
|
||||||
|
CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
|
||||||
|
|
||||||
|
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||||
|
# to inhibit the effect of the previous line on CFLAGS.
|
||||||
|
|
||||||
# Linker mapfiles
|
# Linker mapfiles
|
||||||
MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
||||||
$(GAMMADIR)/make/solaris/makefiles/mapfile-vers-debug
|
$(GAMMADIR)/make/solaris/makefiles/mapfile-vers-debug
|
||||||
|
|
||||||
# This mapfile is only needed when compiling with dtrace support,
|
# This mapfile is only needed when compiling with dtrace support,
|
||||||
# and mustn't be otherwise.
|
# and mustn't be otherwise.
|
||||||
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
||||||
|
|
||||||
_JUNK_ := $(shell echo >&2 ""\
|
|
||||||
"-------------------------------------------------------------------------\n" \
|
|
||||||
"WARNING: 'gnumake debug' is deprecated. It will be removed in the future.\n" \
|
|
||||||
"Please use 'gnumake jvmg' to build debug JVM. \n" \
|
|
||||||
"-------------------------------------------------------------------------\n")
|
|
||||||
|
|
||||||
VERSION = debug
|
VERSION = debug
|
||||||
SYSDEFS += -DASSERT -DDEBUG
|
SYSDEFS += -DASSERT
|
||||||
PICFLAGS = DEFAULT
|
PICFLAGS = DEFAULT
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2006, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# The common definitions for hotspot solaris builds.
|
# The common definitions for hotspot solaris builds.
|
||||||
@ -172,9 +172,6 @@ JDK_INCLUDE_SUBDIR=solaris
|
|||||||
# Library suffix
|
# Library suffix
|
||||||
LIBRARY_SUFFIX=so
|
LIBRARY_SUFFIX=so
|
||||||
|
|
||||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
|
||||||
VM_DEBUG=jvmg
|
|
||||||
|
|
||||||
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
||||||
|
|
||||||
# client and server subdirectories have symbolic links to ../libjsig.$(LIBRARY_SUFFIX)
|
# client and server subdirectories have symbolic links to ../libjsig.$(LIBRARY_SUFFIX)
|
||||||
@ -221,8 +218,8 @@ ifeq ($(JVM_VARIANT_SERVER),true)
|
|||||||
endif
|
endif
|
||||||
ifeq ($(JVM_VARIANT_CLIENT),true)
|
ifeq ($(JVM_VARIANT_CLIENT),true)
|
||||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
|
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
|
||||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_db.$(LIBRARY_SUFFIX)
|
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_db.$(LIBRARY_SUFFIX)
|
||||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_dtrace.$(LIBRARY_SUFFIX)
|
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_dtrace.$(LIBRARY_SUFFIX)
|
||||||
ifeq ($(ARCH_DATA_MODEL),32)
|
ifeq ($(ARCH_DATA_MODEL),32)
|
||||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/64/libjvm_db.$(LIBRARY_SUFFIX)
|
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/64/libjvm_db.$(LIBRARY_SUFFIX)
|
||||||
@ -257,4 +254,4 @@ ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
|
|||||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo
|
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.debuginfo
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
|
EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1998, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
# Sets make macros for making debug version of VM
|
||||||
@ -118,10 +118,10 @@ CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
|||||||
MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
||||||
$(GAMMADIR)/make/solaris/makefiles/mapfile-vers-debug
|
$(GAMMADIR)/make/solaris/makefiles/mapfile-vers-debug
|
||||||
|
|
||||||
# This mapfile is only needed when compiling with dtrace support,
|
# This mapfile is only needed when compiling with dtrace support,
|
||||||
# and mustn't be otherwise.
|
# and mustn't be otherwise.
|
||||||
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
||||||
|
|
||||||
VERSION = optimized
|
VERSION = optimized
|
||||||
SYSDEFS += -DASSERT -DFASTDEBUG -DCHECK_UNHANDLED_OOPS
|
SYSDEFS += -DASSERT -DCHECK_UNHANDLED_OOPS
|
||||||
PICFLAGS = DEFAULT
|
PICFLAGS = DEFAULT
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 1999, 2012, 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.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
# Sets make macros for making debug version of VM
|
|
||||||
|
|
||||||
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
|
||||||
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
|
||||||
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
|
||||||
|
|
||||||
ifeq ("${Platform_compiler}", "sparcWorks")
|
|
||||||
|
|
||||||
ifeq ($(COMPILER_REV_NUMERIC),508)
|
|
||||||
# SS11 SEGV when compiling with -g and -xarch=v8, using different backend
|
|
||||||
DEBUG_CFLAGS/compileBroker.o = $(DEBUG_CFLAGS) -xO0
|
|
||||||
DEBUG_CFLAGS/jvmtiTagMap.o = $(DEBUG_CFLAGS) -xO0
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# _NMT_NOINLINE_ informs NMT that no inlining by Compiler
|
|
||||||
CFLAGS += $(DEBUG_CFLAGS/BYFILE) -D_NMT_NOINLINE_
|
|
||||||
|
|
||||||
# Set the environment variable HOTSPARC_GENERIC to "true"
|
|
||||||
# to inhibit the effect of the previous line on CFLAGS.
|
|
||||||
|
|
||||||
# Linker mapfiles
|
|
||||||
MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
|
|
||||||
$(GAMMADIR)/make/solaris/makefiles/mapfile-vers-debug
|
|
||||||
|
|
||||||
# This mapfile is only needed when compiling with dtrace support,
|
|
||||||
# and mustn't be otherwise.
|
|
||||||
MAPFILE_DTRACE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers-$(TYPE)
|
|
||||||
|
|
||||||
VERSION = debug
|
|
||||||
SYSDEFS += -DASSERT -DDEBUG
|
|
||||||
PICFLAGS = DEFAULT
|
|
@ -202,7 +202,7 @@ Src_Dirs/ZERO := $(CORE_PATHS)
|
|||||||
Src_Dirs/SHARK := $(CORE_PATHS)
|
Src_Dirs/SHARK := $(CORE_PATHS)
|
||||||
Src_Dirs := $(Src_Dirs/$(TYPE))
|
Src_Dirs := $(Src_Dirs/$(TYPE))
|
||||||
|
|
||||||
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp chaitin\* c2_\* runtime_\*
|
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp c2_\* runtime_\*
|
||||||
COMPILER1_SPECIFIC_FILES := c1_\*
|
COMPILER1_SPECIFIC_FILES := c1_\*
|
||||||
SHARK_SPECIFIC_FILES := shark
|
SHARK_SPECIFIC_FILES := shark
|
||||||
ZERO_SPECIFIC_FILES := zero
|
ZERO_SPECIFIC_FILES := zero
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 1998, 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
|
||||||
@ -235,18 +235,14 @@ product release optimized: checks $(variantDir) $(variantDir)\local.make sanity
|
|||||||
cd $(variantDir)
|
cd $(variantDir)
|
||||||
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=product ARCH=$(ARCH)
|
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=product ARCH=$(ARCH)
|
||||||
|
|
||||||
# The debug or jvmg (all the same thing) is an optional build
|
# The debug build is an optional build
|
||||||
debug jvmg: checks $(variantDir) $(variantDir)\local.make sanity
|
debug: checks $(variantDir) $(variantDir)\local.make sanity
|
||||||
cd $(variantDir)
|
cd $(variantDir)
|
||||||
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=debug ARCH=$(ARCH)
|
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=debug ARCH=$(ARCH)
|
||||||
fastdebug: checks $(variantDir) $(variantDir)\local.make sanity
|
fastdebug: checks $(variantDir) $(variantDir)\local.make sanity
|
||||||
cd $(variantDir)
|
cd $(variantDir)
|
||||||
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=fastdebug ARCH=$(ARCH)
|
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=fastdebug ARCH=$(ARCH)
|
||||||
|
|
||||||
develop: checks $(variantDir) $(variantDir)\local.make sanity
|
|
||||||
cd $(variantDir)
|
|
||||||
nmake -nologo -f $(WorkSpace)\make\windows\makefiles\top.make BUILD_FLAVOR=product DEVELOP=1 ARCH=$(ARCH)
|
|
||||||
|
|
||||||
# target to create just the directory structure
|
# target to create just the directory structure
|
||||||
tree: checks $(variantDir) $(variantDir)\local.make sanity
|
tree: checks $(variantDir) $(variantDir)\local.make sanity
|
||||||
mkdir $(variantDir)\product
|
mkdir $(variantDir)\product
|
||||||
|
@ -114,7 +114,7 @@ case "${TYPE}" in
|
|||||||
"shark") Src_Dirs="${CORE_PATHS}" ;;
|
"shark") Src_Dirs="${CORE_PATHS}" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
COMPILER2_SPECIFIC_FILES="opto libadt bcEscapeAnalyzer.cpp chaitin* c2_* runtime_*"
|
COMPILER2_SPECIFIC_FILES="opto libadt bcEscapeAnalyzer.cpp c2_* runtime_*"
|
||||||
COMPILER1_SPECIFIC_FILES="c1_*"
|
COMPILER1_SPECIFIC_FILES="c1_*"
|
||||||
SHARK_SPECIFIC_FILES="shark"
|
SHARK_SPECIFIC_FILES="shark"
|
||||||
ZERO_SPECIFIC_FILES="zero"
|
ZERO_SPECIFIC_FILES="zero"
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# The common definitions for hotspot windows builds.
|
# The common definitions for hotspot windows builds.
|
||||||
@ -209,8 +209,6 @@ endif
|
|||||||
ifneq (,$(findstring MINGW,$(SYSTEM_UNAME)))
|
ifneq (,$(findstring MINGW,$(SYSTEM_UNAME)))
|
||||||
USING_MINGW=true
|
USING_MINGW=true
|
||||||
endif
|
endif
|
||||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
|
||||||
VM_DEBUG=debug
|
|
||||||
|
|
||||||
# Windows wants particular paths due to nmake (must be after macros defined)
|
# Windows wants particular paths due to nmake (must be after macros defined)
|
||||||
# It is important that gnumake invokes nmake with C:\\...\\ formated
|
# It is important that gnumake invokes nmake with C:\\...\\ formated
|
||||||
@ -292,7 +290,7 @@ ifeq ($(BUILD_WIN_SA), 1)
|
|||||||
MAKE_ARGS += BUILD_WIN_SA=1
|
MAKE_ARGS += BUILD_WIN_SA=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Propagate compiler and tools paths from configure to nmake.
|
# Propagate compiler and tools paths from configure to nmake.
|
||||||
# Need to make sure they contain \\ and not /.
|
# Need to make sure they contain \\ and not /.
|
||||||
ifneq ($(SPEC),)
|
ifneq ($(SPEC),)
|
||||||
ifeq ($(USING_CYGWIN), true)
|
ifeq ($(USING_CYGWIN), true)
|
||||||
|
@ -31,11 +31,7 @@ COMMONSRC=$(WorkSpace)\src
|
|||||||
ALTSRC=$(WorkSpace)\src\closed
|
ALTSRC=$(WorkSpace)\src\closed
|
||||||
|
|
||||||
!ifdef RELEASE
|
!ifdef RELEASE
|
||||||
!ifdef DEVELOP
|
|
||||||
CXX_FLAGS=$(CXX_FLAGS) /D "DEBUG"
|
|
||||||
!else
|
|
||||||
CXX_FLAGS=$(CXX_FLAGS) /D "PRODUCT"
|
CXX_FLAGS=$(CXX_FLAGS) /D "PRODUCT"
|
||||||
!endif
|
|
||||||
!else
|
!else
|
||||||
CXX_FLAGS=$(CXX_FLAGS) /D "ASSERT"
|
CXX_FLAGS=$(CXX_FLAGS) /D "ASSERT"
|
||||||
!endif
|
!endif
|
||||||
@ -186,7 +182,7 @@ VM_PATH={$(VM_PATH)}
|
|||||||
|
|
||||||
# Special case files not using precompiled header files.
|
# Special case files not using precompiled header files.
|
||||||
|
|
||||||
c1_RInfo_$(Platform_arch).obj: $(WorkSpace)\src\cpu\$(Platform_arch)\vm\c1_RInfo_$(Platform_arch).cpp
|
c1_RInfo_$(Platform_arch).obj: $(WorkSpace)\src\cpu\$(Platform_arch)\vm\c1_RInfo_$(Platform_arch).cpp
|
||||||
$(CXX) $(CXX_FLAGS) $(CXX_DONT_USE_PCH) /c $(WorkSpace)\src\cpu\$(Platform_arch)\vm\c1_RInfo_$(Platform_arch).cpp
|
$(CXX) $(CXX_FLAGS) $(CXX_DONT_USE_PCH) /c $(WorkSpace)\src\cpu\$(Platform_arch)\vm\c1_RInfo_$(Platform_arch).cpp
|
||||||
|
|
||||||
os_windows.obj: $(WorkSpace)\src\os\windows\vm\os_windows.cpp
|
os_windows.obj: $(WorkSpace)\src\os\windows\vm\os_windows.cpp
|
||||||
|
@ -67,7 +67,7 @@ LINK32=link.exe
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||||
# ADD CPP /nologo /ML /W3 /WX /Gm /GX /Zi /Od /I "." /I "$(HotSpotWorkSpace)\src\share\vm\opto" /I "$(HotSpotWorkSpace)\src\share\vm\prims" /I "$(HotSpotWorkSpace)\src\share\vm\lookup" /I "$(HotSpotWorkSpace)\src\share\vm\interpreter" /I "$(HotSpotWorkSpace)\src\share\vm\asm" /I "$(HotSpotWorkSpace)\src\share\vm\compiler" /I "$(HotSpotWorkSpace)\src\share\vm\utilities" /I "$(HotSpotWorkSpace)\src\share\vm\code" /I "$(HotSpotWorkSpace)\src\share\vm\oops" /I "$(HotSpotWorkSpace)\src\share\vm\runtime" /I "$(HotSpotWorkSpace)\src\share\vm\memory" /I "$(HotSpotWorkSpace)\src\share\vm\libadt" /I "$(HotSpotWorkSpace)\src\cpu\i486\vm" /I "$(HotSpotWorkSpace)\src\os\win32\vm" /D "WIN32" /D "DEBUG" /D "_WINDOWS" /D "ASSERT" /Fr /FD /c
|
# ADD CPP /nologo /ML /W3 /WX /Gm /GX /Zi /Od /I "." /I "$(HotSpotWorkSpace)\src\share\vm\opto" /I "$(HotSpotWorkSpace)\src\share\vm\prims" /I "$(HotSpotWorkSpace)\src\share\vm\lookup" /I "$(HotSpotWorkSpace)\src\share\vm\interpreter" /I "$(HotSpotWorkSpace)\src\share\vm\asm" /I "$(HotSpotWorkSpace)\src\share\vm\compiler" /I "$(HotSpotWorkSpace)\src\share\vm\utilities" /I "$(HotSpotWorkSpace)\src\share\vm\code" /I "$(HotSpotWorkSpace)\src\share\vm\oops" /I "$(HotSpotWorkSpace)\src\share\vm\runtime" /I "$(HotSpotWorkSpace)\src\share\vm\memory" /I "$(HotSpotWorkSpace)\src\share\vm\libadt" /I "$(HotSpotWorkSpace)\src\cpu\i486\vm" /I "$(HotSpotWorkSpace)\src\os\win32\vm" /D "WIN32" /D "_WINDOWS" /D "ASSERT" /Fr /FD /c
|
||||||
# ADD BASE RSC /l 0x409
|
# ADD BASE RSC /l 0x409
|
||||||
# ADD RSC /l 0x409
|
# ADD RSC /l 0x409
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
|
@ -67,7 +67,7 @@ LINK32=link.exe
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||||
# ADD CPP /nologo /ML /W3 /WX /Gm /GX /Zi /Od /I "." /I "$(HotSpotWorkSpace)\src\share\vm\opto" /I "$(HotSpotWorkSpace)\src\share\vm\prims" /I "$(HotSpotWorkSpace)\src\share\vm\lookup" /I "$(HotSpotWorkSpace)\src\share\vm\interpreter" /I "$(HotSpotWorkSpace)\src\share\vm\asm" /I "$(HotSpotWorkSpace)\src\share\vm\compiler" /I "$(HotSpotWorkSpace)\src\share\vm\utilities" /I "$(HotSpotWorkSpace)\src\share\vm\code" /I "$(HotSpotWorkSpace)\src\share\vm\oops" /I "$(HotSpotWorkSpace)\src\share\vm\runtime" /I "$(HotSpotWorkSpace)\src\share\vm\memory" /I "$(HotSpotWorkSpace)\src\share\vm\libadt" /I "$(HotSpotWorkSpace)\src\cpu\i486\vm" /I "$(HotSpotWorkSpace)\src\os\win32\vm" /D "WIN32" /D "DEBUG" /D "_WINDOWS" /D "ASSERT" /Fr /FD /c
|
# ADD CPP /nologo /ML /W3 /WX /Gm /GX /Zi /Od /I "." /I "$(HotSpotWorkSpace)\src\share\vm\opto" /I "$(HotSpotWorkSpace)\src\share\vm\prims" /I "$(HotSpotWorkSpace)\src\share\vm\lookup" /I "$(HotSpotWorkSpace)\src\share\vm\interpreter" /I "$(HotSpotWorkSpace)\src\share\vm\asm" /I "$(HotSpotWorkSpace)\src\share\vm\compiler" /I "$(HotSpotWorkSpace)\src\share\vm\utilities" /I "$(HotSpotWorkSpace)\src\share\vm\code" /I "$(HotSpotWorkSpace)\src\share\vm\oops" /I "$(HotSpotWorkSpace)\src\share\vm\runtime" /I "$(HotSpotWorkSpace)\src\share\vm\memory" /I "$(HotSpotWorkSpace)\src\share\vm\libadt" /I "$(HotSpotWorkSpace)\src\cpu\i486\vm" /I "$(HotSpotWorkSpace)\src\os\win32\vm" /D "WIN32" /D "_WINDOWS" /D "ASSERT" /Fr /FD /c
|
||||||
# ADD BASE RSC /l 0x409
|
# ADD BASE RSC /l 0x409
|
||||||
# ADD RSC /l 0x409
|
# ADD RSC /l 0x409
|
||||||
BSC32=bscmake.exe
|
BSC32=bscmake.exe
|
||||||
|
@ -1000,9 +1000,10 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
|||||||
DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
|
DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
|
||||||
assert(deopt_blob != NULL, "deoptimization blob must have been created");
|
assert(deopt_blob != NULL, "deoptimization blob must have been created");
|
||||||
restore_live_registers(sasm);
|
restore_live_registers(sasm);
|
||||||
__ restore();
|
|
||||||
__ br(Assembler::always, false, Assembler::pt, deopt_blob->unpack_with_reexecution(), relocInfo::runtime_call_type);
|
AddressLiteral dest(deopt_blob->unpack_with_reexecution());
|
||||||
__ delayed()->nop();
|
__ jump_to(dest, O0);
|
||||||
|
__ delayed()->restore();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 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
|
||||||
@ -404,14 +404,20 @@ address CppInterpreter::deopt_entry(TosState state, int length) {
|
|||||||
// ??: invocation counter
|
// ??: invocation counter
|
||||||
//
|
//
|
||||||
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
||||||
|
Label done;
|
||||||
|
const Register Rcounters = G3_scratch;
|
||||||
|
|
||||||
|
__ ld_ptr(STATE(_method), G5_method);
|
||||||
|
__ get_method_counters(G5_method, Rcounters, done);
|
||||||
|
|
||||||
// Update standard invocation counters
|
// Update standard invocation counters
|
||||||
__ increment_invocation_counter(O0, G3_scratch);
|
__ increment_invocation_counter(Rcounters, O0, G4_scratch);
|
||||||
if (ProfileInterpreter) { // %%% Merge this into MethodData*
|
if (ProfileInterpreter) {
|
||||||
__ ld_ptr(STATE(_method), G3_scratch);
|
Address interpreter_invocation_counter(Rcounters, 0,
|
||||||
Address interpreter_invocation_counter(G3_scratch, 0, in_bytes(Method::interpreter_invocation_counter_offset()));
|
in_bytes(MethodCounters::interpreter_invocation_counter_offset()));
|
||||||
__ ld(interpreter_invocation_counter, G3_scratch);
|
__ ld(interpreter_invocation_counter, G4_scratch);
|
||||||
__ inc(G3_scratch);
|
__ inc(G4_scratch);
|
||||||
__ st(G3_scratch, interpreter_invocation_counter);
|
__ st(G4_scratch, interpreter_invocation_counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
Address invocation_limit(G3_scratch, (address)&InvocationCounter::InterpreterInvocationLimit);
|
Address invocation_limit(G3_scratch, (address)&InvocationCounter::InterpreterInvocationLimit);
|
||||||
@ -420,7 +426,7 @@ void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile
|
|||||||
__ cmp(O0, G3_scratch);
|
__ cmp(O0, G3_scratch);
|
||||||
__ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow);
|
__ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow);
|
||||||
__ delayed()->nop();
|
__ delayed()->nop();
|
||||||
|
__ bind(done);
|
||||||
}
|
}
|
||||||
|
|
||||||
address InterpreterGenerator::generate_empty_entry(void) {
|
address InterpreterGenerator::generate_empty_entry(void) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -304,7 +304,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
|
|||||||
|
|
||||||
// The sender should positively be an nmethod or call_stub. On sparc we might in fact see something else.
|
// The sender should positively be an nmethod or call_stub. On sparc we might in fact see something else.
|
||||||
// The cause of this is because at a save instruction the O7 we get is a leftover from an earlier
|
// The cause of this is because at a save instruction the O7 we get is a leftover from an earlier
|
||||||
// window use. So if a runtime stub creates two frames (common in fastdebug/jvmg) then we see the
|
// window use. So if a runtime stub creates two frames (common in fastdebug/debug) then we see the
|
||||||
// stale pc. So if the sender blob is not something we'd expect we have little choice but to declare
|
// stale pc. So if the sender blob is not something we'd expect we have little choice but to declare
|
||||||
// the stack unwalkable. pd_get_top_frame_for_signal_handler tries to recover from this by unwinding
|
// the stack unwalkable. pd_get_top_frame_for_signal_handler tries to recover from this by unwinding
|
||||||
// that initial frame and retrying.
|
// that initial frame and retrying.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -30,6 +30,7 @@
|
|||||||
#include "oops/markOop.hpp"
|
#include "oops/markOop.hpp"
|
||||||
#include "oops/methodData.hpp"
|
#include "oops/methodData.hpp"
|
||||||
#include "oops/method.hpp"
|
#include "oops/method.hpp"
|
||||||
|
#include "oops/methodCounters.hpp"
|
||||||
#include "prims/jvmtiExport.hpp"
|
#include "prims/jvmtiExport.hpp"
|
||||||
#include "prims/jvmtiRedefineClassesTrace.hpp"
|
#include "prims/jvmtiRedefineClassesTrace.hpp"
|
||||||
#include "prims/jvmtiThreadState.hpp"
|
#include "prims/jvmtiThreadState.hpp"
|
||||||
@ -2086,19 +2087,28 @@ void InterpreterMacroAssembler::compute_stack_base( Register Rdest ) {
|
|||||||
|
|
||||||
#endif /* CC_INTERP */
|
#endif /* CC_INTERP */
|
||||||
|
|
||||||
void InterpreterMacroAssembler::increment_invocation_counter( Register Rtmp, Register Rtmp2 ) {
|
void InterpreterMacroAssembler::get_method_counters(Register method,
|
||||||
|
Register Rcounters,
|
||||||
|
Label& skip) {
|
||||||
|
Label has_counters;
|
||||||
|
Address method_counters(method, in_bytes(Method::method_counters_offset()));
|
||||||
|
ld_ptr(method_counters, Rcounters);
|
||||||
|
br_notnull_short(Rcounters, Assembler::pt, has_counters);
|
||||||
|
call_VM(noreg, CAST_FROM_FN_PTR(address,
|
||||||
|
InterpreterRuntime::build_method_counters), method);
|
||||||
|
ld_ptr(method_counters, Rcounters);
|
||||||
|
br_null_short(Rcounters, Assembler::pn, skip); // No MethodCounters, OutOfMemory
|
||||||
|
bind(has_counters);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterpreterMacroAssembler::increment_invocation_counter( Register Rcounters, Register Rtmp, Register Rtmp2 ) {
|
||||||
assert(UseCompiler, "incrementing must be useful");
|
assert(UseCompiler, "incrementing must be useful");
|
||||||
#ifdef CC_INTERP
|
assert_different_registers(Rcounters, Rtmp, Rtmp2);
|
||||||
Address inv_counter(G5_method, Method::invocation_counter_offset() +
|
|
||||||
|
Address inv_counter(Rcounters, MethodCounters::invocation_counter_offset() +
|
||||||
InvocationCounter::counter_offset());
|
InvocationCounter::counter_offset());
|
||||||
Address be_counter (G5_method, Method::backedge_counter_offset() +
|
Address be_counter (Rcounters, MethodCounters::backedge_counter_offset() +
|
||||||
InvocationCounter::counter_offset());
|
InvocationCounter::counter_offset());
|
||||||
#else
|
|
||||||
Address inv_counter(Lmethod, Method::invocation_counter_offset() +
|
|
||||||
InvocationCounter::counter_offset());
|
|
||||||
Address be_counter (Lmethod, Method::backedge_counter_offset() +
|
|
||||||
InvocationCounter::counter_offset());
|
|
||||||
#endif /* CC_INTERP */
|
|
||||||
int delta = InvocationCounter::count_increment;
|
int delta = InvocationCounter::count_increment;
|
||||||
|
|
||||||
// Load each counter in a register
|
// Load each counter in a register
|
||||||
@ -2122,19 +2132,15 @@ void InterpreterMacroAssembler::increment_invocation_counter( Register Rtmp, Reg
|
|||||||
// Note that this macro must leave the backedge_count + invocation_count in Rtmp!
|
// Note that this macro must leave the backedge_count + invocation_count in Rtmp!
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterMacroAssembler::increment_backedge_counter( Register Rtmp, Register Rtmp2 ) {
|
void InterpreterMacroAssembler::increment_backedge_counter( Register Rcounters, Register Rtmp, Register Rtmp2 ) {
|
||||||
assert(UseCompiler, "incrementing must be useful");
|
assert(UseCompiler, "incrementing must be useful");
|
||||||
#ifdef CC_INTERP
|
assert_different_registers(Rcounters, Rtmp, Rtmp2);
|
||||||
Address be_counter (G5_method, Method::backedge_counter_offset() +
|
|
||||||
|
Address be_counter (Rcounters, MethodCounters::backedge_counter_offset() +
|
||||||
InvocationCounter::counter_offset());
|
InvocationCounter::counter_offset());
|
||||||
Address inv_counter(G5_method, Method::invocation_counter_offset() +
|
Address inv_counter(Rcounters, MethodCounters::invocation_counter_offset() +
|
||||||
InvocationCounter::counter_offset());
|
InvocationCounter::counter_offset());
|
||||||
#else
|
|
||||||
Address be_counter (Lmethod, Method::backedge_counter_offset() +
|
|
||||||
InvocationCounter::counter_offset());
|
|
||||||
Address inv_counter(Lmethod, Method::invocation_counter_offset() +
|
|
||||||
InvocationCounter::counter_offset());
|
|
||||||
#endif /* CC_INTERP */
|
|
||||||
int delta = InvocationCounter::count_increment;
|
int delta = InvocationCounter::count_increment;
|
||||||
// Load each counter in a register
|
// Load each counter in a register
|
||||||
ld( be_counter, Rtmp );
|
ld( be_counter, Rtmp );
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -263,8 +263,9 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
void compute_stack_base( Register Rdest );
|
void compute_stack_base( Register Rdest );
|
||||||
|
|
||||||
#endif /* CC_INTERP */
|
#endif /* CC_INTERP */
|
||||||
void increment_invocation_counter( Register Rtmp, Register Rtmp2 );
|
void get_method_counters(Register method, Register Rcounters, Label& skip);
|
||||||
void increment_backedge_counter( Register Rtmp, Register Rtmp2 );
|
void increment_invocation_counter( Register Rcounters, Register Rtmp, Register Rtmp2 );
|
||||||
|
void increment_backedge_counter( Register Rcounters, Register Rtmp, Register Rtmp2 );
|
||||||
#ifndef CC_INTERP
|
#ifndef CC_INTERP
|
||||||
void test_backedge_count_for_osr( Register backedge_count, Register branch_bcp, Register Rtmp );
|
void test_backedge_count_for_osr( Register backedge_count, Register branch_bcp, Register Rtmp );
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 1998, 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
|
||||||
@ -8223,10 +8223,25 @@ instruct cadd_cmpLTMask( iRegI p, iRegI q, iRegI y, iRegI tmp, flagsReg ccr ) %{
|
|||||||
format %{ "SUBcc $p,$q,$p\t! p' = p-q\n\t"
|
format %{ "SUBcc $p,$q,$p\t! p' = p-q\n\t"
|
||||||
"ADD $p,$y,$tmp\t! g3=p-q+y\n\t"
|
"ADD $p,$y,$tmp\t! g3=p-q+y\n\t"
|
||||||
"MOVlt $tmp,$p\t! p' < 0 ? p'+y : p'" %}
|
"MOVlt $tmp,$p\t! p' < 0 ? p'+y : p'" %}
|
||||||
ins_encode( enc_cadd_cmpLTMask(p, q, y, tmp) );
|
ins_encode(enc_cadd_cmpLTMask(p, q, y, tmp));
|
||||||
ins_pipe( cadd_cmpltmask );
|
ins_pipe(cadd_cmpltmask);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
instruct and_cmpLTMask(iRegI p, iRegI q, iRegI y, flagsReg ccr) %{
|
||||||
|
match(Set p (AndI (CmpLTMask p q) y));
|
||||||
|
effect(KILL ccr);
|
||||||
|
ins_cost(DEFAULT_COST*3);
|
||||||
|
|
||||||
|
format %{ "CMP $p,$q\n\t"
|
||||||
|
"MOV $y,$p\n\t"
|
||||||
|
"MOVge G0,$p" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmp($p$$Register, $q$$Register);
|
||||||
|
__ mov($y$$Register, $p$$Register);
|
||||||
|
__ movcc(Assembler::greaterEqual, false, Assembler::icc, G0, $p$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(ialu_reg_reg_ialu);
|
||||||
|
%}
|
||||||
|
|
||||||
//-----------------------------------------------------------------
|
//-----------------------------------------------------------------
|
||||||
// Direct raw moves between float and general registers using VIS3.
|
// Direct raw moves between float and general registers using VIS3.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -292,11 +292,15 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
|
|||||||
// ??: invocation counter
|
// ??: invocation counter
|
||||||
//
|
//
|
||||||
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
||||||
// Note: In tiered we increment either counters in Method* or in MDO depending if we're profiling or not.
|
// Note: In tiered we increment either counters in MethodCounters* or in
|
||||||
|
// MDO depending if we're profiling or not.
|
||||||
|
const Register Rcounters = G3_scratch;
|
||||||
|
Label done;
|
||||||
|
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
const int increment = InvocationCounter::count_increment;
|
const int increment = InvocationCounter::count_increment;
|
||||||
const int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
|
const int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
|
||||||
Label no_mdo, done;
|
Label no_mdo;
|
||||||
if (ProfileInterpreter) {
|
if (ProfileInterpreter) {
|
||||||
// If no method data exists, go to profile_continue.
|
// If no method data exists, go to profile_continue.
|
||||||
__ ld_ptr(Lmethod, Method::method_data_offset(), G4_scratch);
|
__ ld_ptr(Lmethod, Method::method_data_offset(), G4_scratch);
|
||||||
@ -311,23 +315,26 @@ void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile
|
|||||||
__ ba_short(done);
|
__ ba_short(done);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Increment counter in Method*
|
// Increment counter in MethodCounters*
|
||||||
__ bind(no_mdo);
|
__ bind(no_mdo);
|
||||||
Address invocation_counter(Lmethod,
|
Address invocation_counter(Rcounters,
|
||||||
in_bytes(Method::invocation_counter_offset()) +
|
in_bytes(MethodCounters::invocation_counter_offset()) +
|
||||||
in_bytes(InvocationCounter::counter_offset()));
|
in_bytes(InvocationCounter::counter_offset()));
|
||||||
|
__ get_method_counters(Lmethod, Rcounters, done);
|
||||||
__ increment_mask_and_jump(invocation_counter, increment, mask,
|
__ increment_mask_and_jump(invocation_counter, increment, mask,
|
||||||
G3_scratch, Lscratch,
|
G4_scratch, Lscratch,
|
||||||
Assembler::zero, overflow);
|
Assembler::zero, overflow);
|
||||||
__ bind(done);
|
__ bind(done);
|
||||||
} else {
|
} else {
|
||||||
// Update standard invocation counters
|
// Update standard invocation counters
|
||||||
__ increment_invocation_counter(O0, G3_scratch);
|
__ get_method_counters(Lmethod, Rcounters, done);
|
||||||
if (ProfileInterpreter) { // %%% Merge this into MethodData*
|
__ increment_invocation_counter(Rcounters, O0, G4_scratch);
|
||||||
Address interpreter_invocation_counter(Lmethod,in_bytes(Method::interpreter_invocation_counter_offset()));
|
if (ProfileInterpreter) {
|
||||||
__ ld(interpreter_invocation_counter, G3_scratch);
|
Address interpreter_invocation_counter(Rcounters,
|
||||||
__ inc(G3_scratch);
|
in_bytes(MethodCounters::interpreter_invocation_counter_offset()));
|
||||||
__ st(G3_scratch, interpreter_invocation_counter);
|
__ ld(interpreter_invocation_counter, G4_scratch);
|
||||||
|
__ inc(G4_scratch);
|
||||||
|
__ st(G4_scratch, interpreter_invocation_counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ProfileInterpreter && profile_method != NULL) {
|
if (ProfileInterpreter && profile_method != NULL) {
|
||||||
@ -345,6 +352,7 @@ void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile
|
|||||||
__ cmp(O0, G3_scratch);
|
__ cmp(O0, G3_scratch);
|
||||||
__ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow); // Far distance
|
__ br(Assembler::greaterEqualUnsigned, false, Assembler::pn, *overflow); // Far distance
|
||||||
__ delayed()->nop();
|
__ delayed()->nop();
|
||||||
|
__ bind(done);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,13 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||||||
noreg /* pre_val */,
|
noreg /* pre_val */,
|
||||||
tmp, true /*preserve_o_regs*/);
|
tmp, true /*preserve_o_regs*/);
|
||||||
|
|
||||||
|
// G1 barrier needs uncompressed oop for region cross check.
|
||||||
|
Register new_val = val;
|
||||||
|
if (UseCompressedOops && val != G0) {
|
||||||
|
new_val = tmp;
|
||||||
|
__ mov(val, new_val);
|
||||||
|
}
|
||||||
|
|
||||||
if (index == noreg ) {
|
if (index == noreg ) {
|
||||||
assert(Assembler::is_simm13(offset), "fix this code");
|
assert(Assembler::is_simm13(offset), "fix this code");
|
||||||
__ store_heap_oop(val, base, offset);
|
__ store_heap_oop(val, base, offset);
|
||||||
@ -79,7 +86,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||||||
__ add(base, index, base);
|
__ add(base, index, base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__ g1_write_barrier_post(base, val, tmp);
|
__ g1_write_barrier_post(base, new_val, tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1604,9 +1611,8 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
// Normal (non-jsr) branch handling
|
// Normal (non-jsr) branch handling
|
||||||
|
|
||||||
// Save the current Lbcp
|
// Save the current Lbcp
|
||||||
const Register O0_cur_bcp = O0;
|
const Register l_cur_bcp = Lscratch;
|
||||||
__ mov( Lbcp, O0_cur_bcp );
|
__ mov( Lbcp, l_cur_bcp );
|
||||||
|
|
||||||
|
|
||||||
bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter;
|
bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter;
|
||||||
if ( increment_invocation_counter_for_backward_branches ) {
|
if ( increment_invocation_counter_for_backward_branches ) {
|
||||||
@ -1616,6 +1622,9 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
// Bump bytecode pointer by displacement (take the branch)
|
// Bump bytecode pointer by displacement (take the branch)
|
||||||
__ delayed()->add( O1_disp, Lbcp, Lbcp ); // add to bc addr
|
__ delayed()->add( O1_disp, Lbcp, Lbcp ); // add to bc addr
|
||||||
|
|
||||||
|
const Register Rcounters = G3_scratch;
|
||||||
|
__ get_method_counters(Lmethod, Rcounters, Lforward);
|
||||||
|
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
Label Lno_mdo, Loverflow;
|
Label Lno_mdo, Loverflow;
|
||||||
int increment = InvocationCounter::count_increment;
|
int increment = InvocationCounter::count_increment;
|
||||||
@ -1628,21 +1637,22 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
// Increment backedge counter in the MDO
|
// Increment backedge counter in the MDO
|
||||||
Address mdo_backedge_counter(G4_scratch, in_bytes(MethodData::backedge_counter_offset()) +
|
Address mdo_backedge_counter(G4_scratch, in_bytes(MethodData::backedge_counter_offset()) +
|
||||||
in_bytes(InvocationCounter::counter_offset()));
|
in_bytes(InvocationCounter::counter_offset()));
|
||||||
__ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, Lscratch,
|
__ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, O0,
|
||||||
Assembler::notZero, &Lforward);
|
Assembler::notZero, &Lforward);
|
||||||
__ ba_short(Loverflow);
|
__ ba_short(Loverflow);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there's no MDO, increment counter in Method*
|
// If there's no MDO, increment counter in MethodCounters*
|
||||||
__ bind(Lno_mdo);
|
__ bind(Lno_mdo);
|
||||||
Address backedge_counter(Lmethod, in_bytes(Method::backedge_counter_offset()) +
|
Address backedge_counter(Rcounters,
|
||||||
in_bytes(InvocationCounter::counter_offset()));
|
in_bytes(MethodCounters::backedge_counter_offset()) +
|
||||||
__ increment_mask_and_jump(backedge_counter, increment, mask, G3_scratch, Lscratch,
|
in_bytes(InvocationCounter::counter_offset()));
|
||||||
|
__ increment_mask_and_jump(backedge_counter, increment, mask, G4_scratch, O0,
|
||||||
Assembler::notZero, &Lforward);
|
Assembler::notZero, &Lforward);
|
||||||
__ bind(Loverflow);
|
__ bind(Loverflow);
|
||||||
|
|
||||||
// notify point for loop, pass branch bytecode
|
// notify point for loop, pass branch bytecode
|
||||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O0_cur_bcp);
|
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), l_cur_bcp);
|
||||||
|
|
||||||
// Was an OSR adapter generated?
|
// Was an OSR adapter generated?
|
||||||
// O0 = osr nmethod
|
// O0 = osr nmethod
|
||||||
@ -1679,15 +1689,15 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
} else {
|
} else {
|
||||||
// Update Backedge branch separately from invocations
|
// Update Backedge branch separately from invocations
|
||||||
const Register G4_invoke_ctr = G4;
|
const Register G4_invoke_ctr = G4;
|
||||||
__ increment_backedge_counter(G4_invoke_ctr, G1_scratch);
|
__ increment_backedge_counter(Rcounters, G4_invoke_ctr, G1_scratch);
|
||||||
if (ProfileInterpreter) {
|
if (ProfileInterpreter) {
|
||||||
__ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward);
|
__ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward);
|
||||||
if (UseOnStackReplacement) {
|
if (UseOnStackReplacement) {
|
||||||
__ test_backedge_count_for_osr(O2_bumped_count, O0_cur_bcp, G3_scratch);
|
__ test_backedge_count_for_osr(O2_bumped_count, l_cur_bcp, G3_scratch);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (UseOnStackReplacement) {
|
if (UseOnStackReplacement) {
|
||||||
__ test_backedge_count_for_osr(G4_invoke_ctr, O0_cur_bcp, G3_scratch);
|
__ test_backedge_count_for_osr(G4_invoke_ctr, l_cur_bcp, G3_scratch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 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
|
||||||
@ -570,20 +570,28 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
|
|||||||
// rcx: invocation counter
|
// rcx: invocation counter
|
||||||
//
|
//
|
||||||
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
||||||
|
Label done;
|
||||||
|
const Address invocation_counter(rax,
|
||||||
|
MethodCounters::invocation_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
const Address backedge_counter (rax,
|
||||||
|
MethodCounter::backedge_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
|
||||||
const Address invocation_counter(rbx, Method::invocation_counter_offset() + InvocationCounter::counter_offset());
|
__ get_method_counters(rbx, rax, done);
|
||||||
const Address backedge_counter (rbx, Method::backedge_counter_offset() + InvocationCounter::counter_offset());
|
|
||||||
|
|
||||||
if (ProfileInterpreter) { // %%% Merge this into MethodData*
|
if (ProfileInterpreter) {
|
||||||
__ incrementl(Address(rbx,Method::interpreter_invocation_counter_offset()));
|
__ incrementl(Address(rax,
|
||||||
|
MethodCounters::interpreter_invocation_counter_offset()));
|
||||||
}
|
}
|
||||||
// Update standard invocation counters
|
// Update standard invocation counters
|
||||||
__ movl(rax, backedge_counter); // load backedge counter
|
__ movl(rcx, invocation_counter);
|
||||||
|
|
||||||
__ increment(rcx, InvocationCounter::count_increment);
|
__ increment(rcx, InvocationCounter::count_increment);
|
||||||
|
__ movl(invocation_counter, rcx); // save invocation count
|
||||||
|
|
||||||
|
__ movl(rax, backedge_counter); // load backedge counter
|
||||||
__ andl(rax, InvocationCounter::count_mask_value); // mask out the status bits
|
__ andl(rax, InvocationCounter::count_mask_value); // mask out the status bits
|
||||||
|
|
||||||
__ movl(invocation_counter, rcx); // save invocation count
|
|
||||||
__ addl(rcx, rax); // add both counters
|
__ addl(rcx, rax); // add both counters
|
||||||
|
|
||||||
// profile_method is non-null only for interpreted method so
|
// profile_method is non-null only for interpreted method so
|
||||||
@ -593,7 +601,7 @@ void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile
|
|||||||
__ cmp32(rcx,
|
__ cmp32(rcx,
|
||||||
ExternalAddress((address)&InvocationCounter::InterpreterInvocationLimit));
|
ExternalAddress((address)&InvocationCounter::InterpreterInvocationLimit));
|
||||||
__ jcc(Assembler::aboveEqual, *overflow);
|
__ jcc(Assembler::aboveEqual, *overflow);
|
||||||
|
__ bind(done);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterpreterGenerator::generate_counter_overflow(Label* do_continue) {
|
void InterpreterGenerator::generate_counter_overflow(Label* do_continue) {
|
||||||
@ -977,7 +985,6 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
address entry_point = __ pc();
|
address entry_point = __ pc();
|
||||||
|
|
||||||
const Address constMethod (rbx, Method::const_offset());
|
const Address constMethod (rbx, Method::const_offset());
|
||||||
const Address invocation_counter(rbx, Method::invocation_counter_offset() + InvocationCounter::counter_offset());
|
|
||||||
const Address access_flags (rbx, Method::access_flags_offset());
|
const Address access_flags (rbx, Method::access_flags_offset());
|
||||||
const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
|
const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
|
||||||
|
|
||||||
@ -1029,8 +1036,6 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (inc_counter) __ movl(rcx, invocation_counter); // (pre-)fetch invocation count
|
|
||||||
|
|
||||||
const Register unlock_thread = LP64_ONLY(r15_thread) NOT_LP64(rax);
|
const Register unlock_thread = LP64_ONLY(r15_thread) NOT_LP64(rax);
|
||||||
NOT_LP64(__ movptr(unlock_thread, STATE(_thread));) // get thread
|
NOT_LP64(__ movptr(unlock_thread, STATE(_thread));) // get thread
|
||||||
// Since at this point in the method invocation the exception handler
|
// Since at this point in the method invocation the exception handler
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -266,6 +266,20 @@ void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache, R
|
|||||||
addptr(cache, tmp); // construct pointer to cache entry
|
addptr(cache, tmp); // construct pointer to cache entry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterpreterMacroAssembler::get_method_counters(Register method,
|
||||||
|
Register mcs, Label& skip) {
|
||||||
|
Label has_counters;
|
||||||
|
movptr(mcs, Address(method, Method::method_counters_offset()));
|
||||||
|
testptr(mcs, mcs);
|
||||||
|
jcc(Assembler::notZero, has_counters);
|
||||||
|
call_VM(noreg, CAST_FROM_FN_PTR(address,
|
||||||
|
InterpreterRuntime::build_method_counters), method);
|
||||||
|
movptr(mcs, Address(method,Method::method_counters_offset()));
|
||||||
|
testptr(mcs, mcs);
|
||||||
|
jcc(Assembler::zero, skip); // No MethodCounters allocated, OutOfMemory
|
||||||
|
bind(has_counters);
|
||||||
|
}
|
||||||
|
|
||||||
// Load object from cpool->resolved_references(index)
|
// Load object from cpool->resolved_references(index)
|
||||||
void InterpreterMacroAssembler::load_resolved_reference_at_index(
|
void InterpreterMacroAssembler::load_resolved_reference_at_index(
|
||||||
Register result, Register index) {
|
Register result, Register index) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -89,6 +89,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
void get_cache_and_index_and_bytecode_at_bcp(Register cache, Register index, Register bytecode, int byte_no, int bcp_offset, size_t index_size = sizeof(u2));
|
void get_cache_and_index_and_bytecode_at_bcp(Register cache, Register index, Register bytecode, int byte_no, int bcp_offset, size_t index_size = sizeof(u2));
|
||||||
void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
|
void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
|
||||||
void get_cache_index_at_bcp(Register index, int bcp_offset, size_t index_size = sizeof(u2));
|
void get_cache_index_at_bcp(Register index, int bcp_offset, size_t index_size = sizeof(u2));
|
||||||
|
void get_method_counters(Register method, Register mcs, Label& skip);
|
||||||
|
|
||||||
// load cpool->resolved_references(index);
|
// load cpool->resolved_references(index);
|
||||||
void load_resolved_reference_at_index(Register result, Register index);
|
void load_resolved_reference_at_index(Register result, Register index);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -271,6 +271,20 @@ void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
|
|||||||
addptr(cache, tmp); // construct pointer to cache entry
|
addptr(cache, tmp); // construct pointer to cache entry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterpreterMacroAssembler::get_method_counters(Register method,
|
||||||
|
Register mcs, Label& skip) {
|
||||||
|
Label has_counters;
|
||||||
|
movptr(mcs, Address(method, Method::method_counters_offset()));
|
||||||
|
testptr(mcs, mcs);
|
||||||
|
jcc(Assembler::notZero, has_counters);
|
||||||
|
call_VM(noreg, CAST_FROM_FN_PTR(address,
|
||||||
|
InterpreterRuntime::build_method_counters), method);
|
||||||
|
movptr(mcs, Address(method,Method::method_counters_offset()));
|
||||||
|
testptr(mcs, mcs);
|
||||||
|
jcc(Assembler::zero, skip); // No MethodCounters allocated, OutOfMemory
|
||||||
|
bind(has_counters);
|
||||||
|
}
|
||||||
|
|
||||||
// Load object from cpool->resolved_references(index)
|
// Load object from cpool->resolved_references(index)
|
||||||
void InterpreterMacroAssembler::load_resolved_reference_at_index(
|
void InterpreterMacroAssembler::load_resolved_reference_at_index(
|
||||||
Register result, Register index) {
|
Register result, Register index) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -111,6 +111,7 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
void get_cache_and_index_and_bytecode_at_bcp(Register cache, Register index, Register bytecode, int byte_no, int bcp_offset, size_t index_size = sizeof(u2));
|
void get_cache_and_index_and_bytecode_at_bcp(Register cache, Register index, Register bytecode, int byte_no, int bcp_offset, size_t index_size = sizeof(u2));
|
||||||
void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
|
void get_cache_entry_pointer_at_bcp(Register cache, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
|
||||||
void get_cache_index_at_bcp(Register index, int bcp_offset, size_t index_size = sizeof(u2));
|
void get_cache_index_at_bcp(Register index, int bcp_offset, size_t index_size = sizeof(u2));
|
||||||
|
void get_method_counters(Register method, Register mcs, Label& skip);
|
||||||
|
|
||||||
// load cpool->resolved_references(index);
|
// load cpool->resolved_references(index);
|
||||||
void load_resolved_reference_at_index(Register result, Register index);
|
void load_resolved_reference_at_index(Register result, Register index);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -344,13 +344,13 @@ address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state,
|
|||||||
// rcx: invocation counter
|
// rcx: invocation counter
|
||||||
//
|
//
|
||||||
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
|
||||||
const Address invocation_counter(rbx, in_bytes(Method::invocation_counter_offset()) +
|
Label done;
|
||||||
in_bytes(InvocationCounter::counter_offset()));
|
// Note: In tiered we increment either counters in MethodCounters* or in MDO
|
||||||
// Note: In tiered we increment either counters in Method* or in MDO depending if we're profiling or not.
|
// depending if we're profiling or not.
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
int increment = InvocationCounter::count_increment;
|
int increment = InvocationCounter::count_increment;
|
||||||
int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
|
int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
|
||||||
Label no_mdo, done;
|
Label no_mdo;
|
||||||
if (ProfileInterpreter) {
|
if (ProfileInterpreter) {
|
||||||
// Are we profiling?
|
// Are we profiling?
|
||||||
__ movptr(rax, Address(rbx, Method::method_data_offset()));
|
__ movptr(rax, Address(rbx, Method::method_data_offset()));
|
||||||
@ -363,23 +363,38 @@ void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile
|
|||||||
__ jmpb(done);
|
__ jmpb(done);
|
||||||
}
|
}
|
||||||
__ bind(no_mdo);
|
__ bind(no_mdo);
|
||||||
// Increment counter in Method* (we don't need to load it, it's in rcx).
|
// Increment counter in MethodCounters
|
||||||
__ increment_mask_and_jump(invocation_counter, increment, mask, rcx, true, Assembler::zero, overflow);
|
const Address invocation_counter(rax,
|
||||||
|
MethodCounters::invocation_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
|
||||||
|
__ get_method_counters(rbx, rax, done);
|
||||||
|
__ increment_mask_and_jump(invocation_counter, increment, mask,
|
||||||
|
rcx, false, Assembler::zero, overflow);
|
||||||
__ bind(done);
|
__ bind(done);
|
||||||
} else {
|
} else {
|
||||||
const Address backedge_counter (rbx, Method::backedge_counter_offset() +
|
const Address backedge_counter (rax,
|
||||||
InvocationCounter::counter_offset());
|
MethodCounters::backedge_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
const Address invocation_counter(rax,
|
||||||
|
MethodCounters::invocation_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
|
||||||
if (ProfileInterpreter) { // %%% Merge this into MethodData*
|
__ get_method_counters(rbx, rax, done);
|
||||||
__ incrementl(Address(rbx,Method::interpreter_invocation_counter_offset()));
|
|
||||||
|
if (ProfileInterpreter) {
|
||||||
|
__ incrementl(Address(rax,
|
||||||
|
MethodCounters::interpreter_invocation_counter_offset()));
|
||||||
}
|
}
|
||||||
// Update standard invocation counters
|
|
||||||
__ movl(rax, backedge_counter); // load backedge counter
|
|
||||||
|
|
||||||
|
// Update standard invocation counters
|
||||||
|
__ movl(rcx, invocation_counter);
|
||||||
__ incrementl(rcx, InvocationCounter::count_increment);
|
__ incrementl(rcx, InvocationCounter::count_increment);
|
||||||
|
__ movl(invocation_counter, rcx); // save invocation count
|
||||||
|
|
||||||
|
__ movl(rax, backedge_counter); // load backedge counter
|
||||||
__ andl(rax, InvocationCounter::count_mask_value); // mask out the status bits
|
__ andl(rax, InvocationCounter::count_mask_value); // mask out the status bits
|
||||||
|
|
||||||
__ movl(invocation_counter, rcx); // save invocation count
|
|
||||||
__ addl(rcx, rax); // add both counters
|
__ addl(rcx, rax); // add both counters
|
||||||
|
|
||||||
// profile_method is non-null only for interpreted method so
|
// profile_method is non-null only for interpreted method so
|
||||||
@ -399,6 +414,7 @@ void InterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile
|
|||||||
__ cmp32(rcx,
|
__ cmp32(rcx,
|
||||||
ExternalAddress((address)&InvocationCounter::InterpreterInvocationLimit));
|
ExternalAddress((address)&InvocationCounter::InterpreterInvocationLimit));
|
||||||
__ jcc(Assembler::aboveEqual, *overflow);
|
__ jcc(Assembler::aboveEqual, *overflow);
|
||||||
|
__ bind(done);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -868,7 +884,6 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
address entry_point = __ pc();
|
address entry_point = __ pc();
|
||||||
|
|
||||||
const Address constMethod (rbx, Method::const_offset());
|
const Address constMethod (rbx, Method::const_offset());
|
||||||
const Address invocation_counter(rbx, Method::invocation_counter_offset() + InvocationCounter::counter_offset());
|
|
||||||
const Address access_flags (rbx, Method::access_flags_offset());
|
const Address access_flags (rbx, Method::access_flags_offset());
|
||||||
const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
|
const Address size_of_parameters(rcx, ConstMethod::size_of_parameters_offset());
|
||||||
|
|
||||||
@ -897,9 +912,7 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
// NULL oop temp (mirror or jni oop result)
|
// NULL oop temp (mirror or jni oop result)
|
||||||
__ push((int32_t)NULL_WORD);
|
__ push((int32_t)NULL_WORD);
|
||||||
|
|
||||||
if (inc_counter) __ movl(rcx, invocation_counter); // (pre-)fetch invocation count
|
|
||||||
// initialize fixed part of activation frame
|
// initialize fixed part of activation frame
|
||||||
|
|
||||||
generate_fixed_frame(true);
|
generate_fixed_frame(true);
|
||||||
|
|
||||||
// make sure method is native & not abstract
|
// make sure method is native & not abstract
|
||||||
@ -1286,7 +1299,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
|||||||
address entry_point = __ pc();
|
address entry_point = __ pc();
|
||||||
|
|
||||||
const Address constMethod (rbx, Method::const_offset());
|
const Address constMethod (rbx, Method::const_offset());
|
||||||
const Address invocation_counter(rbx, Method::invocation_counter_offset() + InvocationCounter::counter_offset());
|
|
||||||
const Address access_flags (rbx, Method::access_flags_offset());
|
const Address access_flags (rbx, Method::access_flags_offset());
|
||||||
const Address size_of_parameters(rdx, ConstMethod::size_of_parameters_offset());
|
const Address size_of_parameters(rdx, ConstMethod::size_of_parameters_offset());
|
||||||
const Address size_of_locals (rdx, ConstMethod::size_of_locals_offset());
|
const Address size_of_locals (rdx, ConstMethod::size_of_locals_offset());
|
||||||
@ -1326,7 +1338,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
|||||||
__ bind(exit);
|
__ bind(exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inc_counter) __ movl(rcx, invocation_counter); // (pre-)fetch invocation count
|
|
||||||
// initialize fixed part of activation frame
|
// initialize fixed part of activation frame
|
||||||
generate_fixed_frame(false);
|
generate_fixed_frame(false);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -300,13 +300,12 @@ void InterpreterGenerator::generate_counter_incr(
|
|||||||
Label* overflow,
|
Label* overflow,
|
||||||
Label* profile_method,
|
Label* profile_method,
|
||||||
Label* profile_method_continue) {
|
Label* profile_method_continue) {
|
||||||
const Address invocation_counter(rbx, in_bytes(Method::invocation_counter_offset()) +
|
Label done;
|
||||||
in_bytes(InvocationCounter::counter_offset()));
|
|
||||||
// Note: In tiered we increment either counters in Method* or in MDO depending if we're profiling or not.
|
// Note: In tiered we increment either counters in Method* or in MDO depending if we're profiling or not.
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
int increment = InvocationCounter::count_increment;
|
int increment = InvocationCounter::count_increment;
|
||||||
int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
|
int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
|
||||||
Label no_mdo, done;
|
Label no_mdo;
|
||||||
if (ProfileInterpreter) {
|
if (ProfileInterpreter) {
|
||||||
// Are we profiling?
|
// Are we profiling?
|
||||||
__ movptr(rax, Address(rbx, Method::method_data_offset()));
|
__ movptr(rax, Address(rbx, Method::method_data_offset()));
|
||||||
@ -319,25 +318,36 @@ void InterpreterGenerator::generate_counter_incr(
|
|||||||
__ jmpb(done);
|
__ jmpb(done);
|
||||||
}
|
}
|
||||||
__ bind(no_mdo);
|
__ bind(no_mdo);
|
||||||
// Increment counter in Method* (we don't need to load it, it's in ecx).
|
// Increment counter in MethodCounters
|
||||||
__ increment_mask_and_jump(invocation_counter, increment, mask, rcx, true, Assembler::zero, overflow);
|
const Address invocation_counter(rax,
|
||||||
|
MethodCounters::invocation_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
__ get_method_counters(rbx, rax, done);
|
||||||
|
__ increment_mask_and_jump(invocation_counter, increment, mask, rcx,
|
||||||
|
false, Assembler::zero, overflow);
|
||||||
__ bind(done);
|
__ bind(done);
|
||||||
} else {
|
} else {
|
||||||
const Address backedge_counter(rbx,
|
const Address backedge_counter(rax,
|
||||||
Method::backedge_counter_offset() +
|
MethodCounters::backedge_counter_offset() +
|
||||||
InvocationCounter::counter_offset());
|
InvocationCounter::counter_offset());
|
||||||
|
const Address invocation_counter(rax,
|
||||||
|
MethodCounters::invocation_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset());
|
||||||
|
|
||||||
if (ProfileInterpreter) { // %%% Merge this into MethodData*
|
__ get_method_counters(rbx, rax, done);
|
||||||
__ incrementl(Address(rbx,
|
|
||||||
Method::interpreter_invocation_counter_offset()));
|
if (ProfileInterpreter) {
|
||||||
|
__ incrementl(Address(rax,
|
||||||
|
MethodCounters::interpreter_invocation_counter_offset()));
|
||||||
}
|
}
|
||||||
// Update standard invocation counters
|
// Update standard invocation counters
|
||||||
__ movl(rax, backedge_counter); // load backedge counter
|
__ movl(rcx, invocation_counter);
|
||||||
|
|
||||||
__ incrementl(rcx, InvocationCounter::count_increment);
|
__ incrementl(rcx, InvocationCounter::count_increment);
|
||||||
|
__ movl(invocation_counter, rcx); // save invocation count
|
||||||
|
|
||||||
|
__ movl(rax, backedge_counter); // load backedge counter
|
||||||
__ andl(rax, InvocationCounter::count_mask_value); // mask out the status bits
|
__ andl(rax, InvocationCounter::count_mask_value); // mask out the status bits
|
||||||
|
|
||||||
__ movl(invocation_counter, rcx); // save invocation count
|
|
||||||
__ addl(rcx, rax); // add both counters
|
__ addl(rcx, rax); // add both counters
|
||||||
|
|
||||||
// profile_method is non-null only for interpreted method so
|
// profile_method is non-null only for interpreted method so
|
||||||
@ -354,6 +364,7 @@ void InterpreterGenerator::generate_counter_incr(
|
|||||||
|
|
||||||
__ cmp32(rcx, ExternalAddress((address)&InvocationCounter::InterpreterInvocationLimit));
|
__ cmp32(rcx, ExternalAddress((address)&InvocationCounter::InterpreterInvocationLimit));
|
||||||
__ jcc(Assembler::aboveEqual, *overflow);
|
__ jcc(Assembler::aboveEqual, *overflow);
|
||||||
|
__ bind(done);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -843,9 +854,6 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
address entry_point = __ pc();
|
address entry_point = __ pc();
|
||||||
|
|
||||||
const Address constMethod (rbx, Method::const_offset());
|
const Address constMethod (rbx, Method::const_offset());
|
||||||
const Address invocation_counter(rbx, Method::
|
|
||||||
invocation_counter_offset() +
|
|
||||||
InvocationCounter::counter_offset());
|
|
||||||
const Address access_flags (rbx, Method::access_flags_offset());
|
const Address access_flags (rbx, Method::access_flags_offset());
|
||||||
const Address size_of_parameters(rcx, ConstMethod::
|
const Address size_of_parameters(rcx, ConstMethod::
|
||||||
size_of_parameters_offset());
|
size_of_parameters_offset());
|
||||||
@ -876,10 +884,6 @@ address InterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
// (static native method holder mirror/jni oop result)
|
// (static native method holder mirror/jni oop result)
|
||||||
__ push((int) NULL_WORD);
|
__ push((int) NULL_WORD);
|
||||||
|
|
||||||
if (inc_counter) {
|
|
||||||
__ movl(rcx, invocation_counter); // (pre-)fetch invocation count
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize fixed part of activation frame
|
// initialize fixed part of activation frame
|
||||||
generate_fixed_frame(true);
|
generate_fixed_frame(true);
|
||||||
|
|
||||||
@ -1296,9 +1300,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
|||||||
address entry_point = __ pc();
|
address entry_point = __ pc();
|
||||||
|
|
||||||
const Address constMethod(rbx, Method::const_offset());
|
const Address constMethod(rbx, Method::const_offset());
|
||||||
const Address invocation_counter(rbx,
|
|
||||||
Method::invocation_counter_offset() +
|
|
||||||
InvocationCounter::counter_offset());
|
|
||||||
const Address access_flags(rbx, Method::access_flags_offset());
|
const Address access_flags(rbx, Method::access_flags_offset());
|
||||||
const Address size_of_parameters(rdx,
|
const Address size_of_parameters(rdx,
|
||||||
ConstMethod::size_of_parameters_offset());
|
ConstMethod::size_of_parameters_offset());
|
||||||
@ -1343,10 +1344,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
|
|||||||
__ bind(exit);
|
__ bind(exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// (pre-)fetch invocation count
|
|
||||||
if (inc_counter) {
|
|
||||||
__ movl(rcx, invocation_counter);
|
|
||||||
}
|
|
||||||
// initialize fixed part of activation frame
|
// initialize fixed part of activation frame
|
||||||
generate_fixed_frame(false);
|
generate_fixed_frame(false);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -1546,9 +1546,10 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ get_method(rcx); // ECX holds method
|
__ get_method(rcx); // ECX holds method
|
||||||
__ profile_taken_branch(rax,rbx); // EAX holds updated MDP, EBX holds bumped taken count
|
__ profile_taken_branch(rax,rbx); // EAX holds updated MDP, EBX holds bumped taken count
|
||||||
|
|
||||||
const ByteSize be_offset = Method::backedge_counter_offset() + InvocationCounter::counter_offset();
|
const ByteSize be_offset = MethodCounters::backedge_counter_offset() +
|
||||||
const ByteSize inv_offset = Method::invocation_counter_offset() + InvocationCounter::counter_offset();
|
InvocationCounter::counter_offset();
|
||||||
const int method_offset = frame::interpreter_frame_method_offset * wordSize;
|
const ByteSize inv_offset = MethodCounters::invocation_counter_offset() +
|
||||||
|
InvocationCounter::counter_offset();
|
||||||
|
|
||||||
// Load up EDX with the branch displacement
|
// Load up EDX with the branch displacement
|
||||||
__ movl(rdx, at_bcp(1));
|
__ movl(rdx, at_bcp(1));
|
||||||
@ -1596,6 +1597,22 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ testl(rdx, rdx); // check if forward or backward branch
|
__ testl(rdx, rdx); // check if forward or backward branch
|
||||||
__ jcc(Assembler::positive, dispatch); // count only if backward branch
|
__ jcc(Assembler::positive, dispatch); // count only if backward branch
|
||||||
|
|
||||||
|
// check if MethodCounters exists
|
||||||
|
Label has_counters;
|
||||||
|
__ movptr(rax, Address(rcx, Method::method_counters_offset()));
|
||||||
|
__ testptr(rax, rax);
|
||||||
|
__ jcc(Assembler::notZero, has_counters);
|
||||||
|
__ push(rdx);
|
||||||
|
__ push(rcx);
|
||||||
|
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::build_method_counters),
|
||||||
|
rcx);
|
||||||
|
__ pop(rcx);
|
||||||
|
__ pop(rdx);
|
||||||
|
__ movptr(rax, Address(rcx, Method::method_counters_offset()));
|
||||||
|
__ testptr(rax, rax);
|
||||||
|
__ jcc(Assembler::zero, dispatch);
|
||||||
|
__ bind(has_counters);
|
||||||
|
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
Label no_mdo;
|
Label no_mdo;
|
||||||
int increment = InvocationCounter::count_increment;
|
int increment = InvocationCounter::count_increment;
|
||||||
@ -1613,16 +1630,19 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ jmp(dispatch);
|
__ jmp(dispatch);
|
||||||
}
|
}
|
||||||
__ bind(no_mdo);
|
__ bind(no_mdo);
|
||||||
// Increment backedge counter in Method*
|
// Increment backedge counter in MethodCounters*
|
||||||
|
__ movptr(rcx, Address(rcx, Method::method_counters_offset()));
|
||||||
__ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
|
__ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
|
||||||
rax, false, Assembler::zero, &backedge_counter_overflow);
|
rax, false, Assembler::zero, &backedge_counter_overflow);
|
||||||
} else {
|
} else {
|
||||||
// increment counter
|
// increment counter
|
||||||
|
__ movptr(rcx, Address(rcx, Method::method_counters_offset()));
|
||||||
__ movl(rax, Address(rcx, be_offset)); // load backedge counter
|
__ movl(rax, Address(rcx, be_offset)); // load backedge counter
|
||||||
__ incrementl(rax, InvocationCounter::count_increment); // increment counter
|
__ incrementl(rax, InvocationCounter::count_increment); // increment counter
|
||||||
__ movl(Address(rcx, be_offset), rax); // store counter
|
__ movl(Address(rcx, be_offset), rax); // store counter
|
||||||
|
|
||||||
__ movl(rax, Address(rcx, inv_offset)); // load invocation counter
|
__ movl(rax, Address(rcx, inv_offset)); // load invocation counter
|
||||||
|
|
||||||
__ andl(rax, InvocationCounter::count_mask_value); // and the status bits
|
__ andl(rax, InvocationCounter::count_mask_value); // and the status bits
|
||||||
__ addl(rax, Address(rcx, be_offset)); // add both counters
|
__ addl(rax, Address(rcx, be_offset)); // add both counters
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -158,14 +158,19 @@ static void do_oop_store(InterpreterMacroAssembler* _masm,
|
|||||||
if (val == noreg) {
|
if (val == noreg) {
|
||||||
__ store_heap_oop_null(Address(rdx, 0));
|
__ store_heap_oop_null(Address(rdx, 0));
|
||||||
} else {
|
} else {
|
||||||
|
// G1 barrier needs uncompressed oop for region cross check.
|
||||||
|
Register new_val = val;
|
||||||
|
if (UseCompressedOops) {
|
||||||
|
new_val = rbx;
|
||||||
|
__ movptr(new_val, val);
|
||||||
|
}
|
||||||
__ store_heap_oop(Address(rdx, 0), val);
|
__ store_heap_oop(Address(rdx, 0), val);
|
||||||
__ g1_write_barrier_post(rdx /* store_adr */,
|
__ g1_write_barrier_post(rdx /* store_adr */,
|
||||||
val /* new_val */,
|
new_val /* new_val */,
|
||||||
r15_thread /* thread */,
|
r15_thread /* thread */,
|
||||||
r8 /* tmp */,
|
r8 /* tmp */,
|
||||||
rbx /* tmp2 */);
|
rbx /* tmp2 */);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif // INCLUDE_ALL_GCS
|
#endif // INCLUDE_ALL_GCS
|
||||||
@ -1564,11 +1569,10 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
|
__ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
|
||||||
// holds bumped taken count
|
// holds bumped taken count
|
||||||
|
|
||||||
const ByteSize be_offset = Method::backedge_counter_offset() +
|
const ByteSize be_offset = MethodCounters::backedge_counter_offset() +
|
||||||
InvocationCounter::counter_offset();
|
InvocationCounter::counter_offset();
|
||||||
const ByteSize inv_offset = Method::invocation_counter_offset() +
|
const ByteSize inv_offset = MethodCounters::invocation_counter_offset() +
|
||||||
InvocationCounter::counter_offset();
|
InvocationCounter::counter_offset();
|
||||||
const int method_offset = frame::interpreter_frame_method_offset * wordSize;
|
|
||||||
|
|
||||||
// Load up edx with the branch displacement
|
// Load up edx with the branch displacement
|
||||||
__ movl(rdx, at_bcp(1));
|
__ movl(rdx, at_bcp(1));
|
||||||
@ -1618,6 +1622,22 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
// r14: locals pointer
|
// r14: locals pointer
|
||||||
__ testl(rdx, rdx); // check if forward or backward branch
|
__ testl(rdx, rdx); // check if forward or backward branch
|
||||||
__ jcc(Assembler::positive, dispatch); // count only if backward branch
|
__ jcc(Assembler::positive, dispatch); // count only if backward branch
|
||||||
|
|
||||||
|
// check if MethodCounters exists
|
||||||
|
Label has_counters;
|
||||||
|
__ movptr(rax, Address(rcx, Method::method_counters_offset()));
|
||||||
|
__ testptr(rax, rax);
|
||||||
|
__ jcc(Assembler::notZero, has_counters);
|
||||||
|
__ push(rdx);
|
||||||
|
__ push(rcx);
|
||||||
|
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::build_method_counters),
|
||||||
|
rcx);
|
||||||
|
__ pop(rcx);
|
||||||
|
__ pop(rdx);
|
||||||
|
__ movptr(rax, Address(rcx, Method::method_counters_offset()));
|
||||||
|
__ jcc(Assembler::zero, dispatch);
|
||||||
|
__ bind(has_counters);
|
||||||
|
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
Label no_mdo;
|
Label no_mdo;
|
||||||
int increment = InvocationCounter::count_increment;
|
int increment = InvocationCounter::count_increment;
|
||||||
@ -1635,16 +1655,19 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ jmp(dispatch);
|
__ jmp(dispatch);
|
||||||
}
|
}
|
||||||
__ bind(no_mdo);
|
__ bind(no_mdo);
|
||||||
// Increment backedge counter in Method*
|
// Increment backedge counter in MethodCounters*
|
||||||
|
__ movptr(rcx, Address(rcx, Method::method_counters_offset()));
|
||||||
__ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
|
__ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
|
||||||
rax, false, Assembler::zero, &backedge_counter_overflow);
|
rax, false, Assembler::zero, &backedge_counter_overflow);
|
||||||
} else {
|
} else {
|
||||||
// increment counter
|
// increment counter
|
||||||
|
__ movptr(rcx, Address(rcx, Method::method_counters_offset()));
|
||||||
__ movl(rax, Address(rcx, be_offset)); // load backedge counter
|
__ movl(rax, Address(rcx, be_offset)); // load backedge counter
|
||||||
__ incrementl(rax, InvocationCounter::count_increment); // increment counter
|
__ incrementl(rax, InvocationCounter::count_increment); // increment counter
|
||||||
__ movl(Address(rcx, be_offset), rax); // store counter
|
__ movl(Address(rcx, be_offset), rax); // store counter
|
||||||
|
|
||||||
__ movl(rax, Address(rcx, inv_offset)); // load invocation counter
|
__ movl(rax, Address(rcx, inv_offset)); // load invocation counter
|
||||||
|
|
||||||
__ andl(rax, InvocationCounter::count_mask_value); // and the status bits
|
__ andl(rax, InvocationCounter::count_mask_value); // and the status bits
|
||||||
__ addl(rax, Address(rcx, be_offset)); // add both counters
|
__ addl(rax, Address(rcx, be_offset)); // add both counters
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 1997, 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
|
||||||
@ -2317,30 +2317,6 @@ encode %{
|
|||||||
emit_rm(cbuf, 0x3, $p$$reg, tmpReg);
|
emit_rm(cbuf, 0x3, $p$$reg, tmpReg);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
enc_class enc_cmpLTP_mem(rRegI p, rRegI q, memory mem, eCXRegI tmp) %{ // cadd_cmpLT
|
|
||||||
int tmpReg = $tmp$$reg;
|
|
||||||
|
|
||||||
// SUB $p,$q
|
|
||||||
emit_opcode(cbuf,0x2B);
|
|
||||||
emit_rm(cbuf, 0x3, $p$$reg, $q$$reg);
|
|
||||||
// SBB $tmp,$tmp
|
|
||||||
emit_opcode(cbuf,0x1B);
|
|
||||||
emit_rm(cbuf, 0x3, tmpReg, tmpReg);
|
|
||||||
// AND $tmp,$y
|
|
||||||
cbuf.set_insts_mark(); // Mark start of opcode for reloc info in mem operand
|
|
||||||
emit_opcode(cbuf,0x23);
|
|
||||||
int reg_encoding = tmpReg;
|
|
||||||
int base = $mem$$base;
|
|
||||||
int index = $mem$$index;
|
|
||||||
int scale = $mem$$scale;
|
|
||||||
int displace = $mem$$disp;
|
|
||||||
relocInfo::relocType disp_reloc = $mem->disp_reloc();
|
|
||||||
encode_RegMem(cbuf, reg_encoding, base, index, scale, displace, disp_reloc);
|
|
||||||
// ADD $p,$tmp
|
|
||||||
emit_opcode(cbuf,0x03);
|
|
||||||
emit_rm(cbuf, 0x3, $p$$reg, tmpReg);
|
|
||||||
%}
|
|
||||||
|
|
||||||
enc_class shift_left_long( eRegL dst, eCXRegI shift ) %{
|
enc_class shift_left_long( eRegL dst, eCXRegI shift ) %{
|
||||||
// TEST shift,32
|
// TEST shift,32
|
||||||
emit_opcode(cbuf,0xF7);
|
emit_opcode(cbuf,0xF7);
|
||||||
@ -8922,9 +8898,9 @@ instruct convP2B( rRegI dst, eRegP src, eFlagsReg cr ) %{
|
|||||||
%}
|
%}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
instruct cmpLTMask( eCXRegI dst, ncxRegI p, ncxRegI q, eFlagsReg cr ) %{
|
instruct cmpLTMask(eCXRegI dst, ncxRegI p, ncxRegI q, eFlagsReg cr) %{
|
||||||
match(Set dst (CmpLTMask p q));
|
match(Set dst (CmpLTMask p q));
|
||||||
effect( KILL cr );
|
effect(KILL cr);
|
||||||
ins_cost(400);
|
ins_cost(400);
|
||||||
|
|
||||||
// SETlt can only use low byte of EAX,EBX, ECX, or EDX as destination
|
// SETlt can only use low byte of EAX,EBX, ECX, or EDX as destination
|
||||||
@ -8932,50 +8908,83 @@ instruct cmpLTMask( eCXRegI dst, ncxRegI p, ncxRegI q, eFlagsReg cr ) %{
|
|||||||
"CMP $p,$q\n\t"
|
"CMP $p,$q\n\t"
|
||||||
"SETlt $dst\n\t"
|
"SETlt $dst\n\t"
|
||||||
"NEG $dst" %}
|
"NEG $dst" %}
|
||||||
ins_encode( OpcRegReg(0x33,dst,dst),
|
ins_encode %{
|
||||||
OpcRegReg(0x3B,p,q),
|
Register Rp = $p$$Register;
|
||||||
setLT_reg(dst), neg_reg(dst) );
|
Register Rq = $q$$Register;
|
||||||
ins_pipe( pipe_slow );
|
Register Rd = $dst$$Register;
|
||||||
|
Label done;
|
||||||
|
__ xorl(Rd, Rd);
|
||||||
|
__ cmpl(Rp, Rq);
|
||||||
|
__ setb(Assembler::less, Rd);
|
||||||
|
__ negl(Rd);
|
||||||
|
%}
|
||||||
|
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
instruct cmpLTMask0( rRegI dst, immI0 zero, eFlagsReg cr ) %{
|
instruct cmpLTMask0(rRegI dst, immI0 zero, eFlagsReg cr) %{
|
||||||
match(Set dst (CmpLTMask dst zero));
|
match(Set dst (CmpLTMask dst zero));
|
||||||
effect( DEF dst, KILL cr );
|
effect(DEF dst, KILL cr);
|
||||||
ins_cost(100);
|
ins_cost(100);
|
||||||
|
|
||||||
format %{ "SAR $dst,31" %}
|
format %{ "SAR $dst,31\t# cmpLTMask0" %}
|
||||||
opcode(0xC1, 0x7); /* C1 /7 ib */
|
ins_encode %{
|
||||||
ins_encode( RegOpcImm( dst, 0x1F ) );
|
__ sarl($dst$$Register, 31);
|
||||||
ins_pipe( ialu_reg );
|
%}
|
||||||
|
ins_pipe(ialu_reg);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
/* better to save a register than avoid a branch */
|
||||||
instruct cadd_cmpLTMask( ncxRegI p, ncxRegI q, ncxRegI y, eCXRegI tmp, eFlagsReg cr ) %{
|
instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, eFlagsReg cr) %{
|
||||||
match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
|
match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
|
||||||
effect( KILL tmp, KILL cr );
|
effect(KILL cr);
|
||||||
ins_cost(400);
|
ins_cost(400);
|
||||||
// annoyingly, $tmp has no edges so you cant ask for it in
|
format %{ "SUB $p,$q\t# cadd_cmpLTMask\n\t"
|
||||||
// any format or encoding
|
"JGE done\n\t"
|
||||||
format %{ "SUB $p,$q\n\t"
|
"ADD $p,$y\n"
|
||||||
"SBB ECX,ECX\n\t"
|
"done: " %}
|
||||||
"AND ECX,$y\n\t"
|
ins_encode %{
|
||||||
"ADD $p,ECX" %}
|
Register Rp = $p$$Register;
|
||||||
ins_encode( enc_cmpLTP(p,q,y,tmp) );
|
Register Rq = $q$$Register;
|
||||||
ins_pipe( pipe_cmplt );
|
Register Ry = $y$$Register;
|
||||||
|
Label done;
|
||||||
|
__ subl(Rp, Rq);
|
||||||
|
__ jccb(Assembler::greaterEqual, done);
|
||||||
|
__ addl(Rp, Ry);
|
||||||
|
__ bind(done);
|
||||||
|
%}
|
||||||
|
|
||||||
|
ins_pipe(pipe_cmplt);
|
||||||
|
%}
|
||||||
|
|
||||||
|
/* better to save a register than avoid a branch */
|
||||||
|
instruct and_cmpLTMask(rRegI p, rRegI q, rRegI y, eFlagsReg cr) %{
|
||||||
|
match(Set y (AndI (CmpLTMask p q) y));
|
||||||
|
effect(KILL cr);
|
||||||
|
|
||||||
|
ins_cost(300);
|
||||||
|
|
||||||
|
format %{ "CMPL $p, $q\t# and_cmpLTMask\n\t"
|
||||||
|
"JLT done\n\t"
|
||||||
|
"XORL $y, $y\n"
|
||||||
|
"done: " %}
|
||||||
|
ins_encode %{
|
||||||
|
Register Rp = $p$$Register;
|
||||||
|
Register Rq = $q$$Register;
|
||||||
|
Register Ry = $y$$Register;
|
||||||
|
Label done;
|
||||||
|
__ cmpl(Rp, Rq);
|
||||||
|
__ jccb(Assembler::less, done);
|
||||||
|
__ xorl(Ry, Ry);
|
||||||
|
__ bind(done);
|
||||||
|
%}
|
||||||
|
|
||||||
|
ins_pipe(pipe_cmplt);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/* If I enable this, I encourage spilling in the inner loop of compress.
|
/* If I enable this, I encourage spilling in the inner loop of compress.
|
||||||
instruct cadd_cmpLTMask_mem( ncxRegI p, ncxRegI q, memory y, eCXRegI tmp, eFlagsReg cr ) %{
|
instruct cadd_cmpLTMask_mem(ncxRegI p, ncxRegI q, memory y, eCXRegI tmp, eFlagsReg cr) %{
|
||||||
match(Set p (AddI (AndI (CmpLTMask p q) (LoadI y)) (SubI p q)));
|
match(Set p (AddI (AndI (CmpLTMask p q) (LoadI y)) (SubI p q)));
|
||||||
effect( USE_KILL tmp, KILL cr );
|
|
||||||
ins_cost(400);
|
|
||||||
|
|
||||||
format %{ "SUB $p,$q\n\t"
|
|
||||||
"SBB ECX,ECX\n\t"
|
|
||||||
"AND ECX,$y\n\t"
|
|
||||||
"ADD $p,ECX" %}
|
|
||||||
ins_encode( enc_cmpLTP_mem(p,q,y,tmp) );
|
|
||||||
%}
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//----------Long Instructions------------------------------------------------
|
//----------Long Instructions------------------------------------------------
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 2003, 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
|
||||||
@ -9434,7 +9434,7 @@ instruct cmpLTMask(rRegI dst, rRegI p, rRegI q, rFlagsReg cr)
|
|||||||
match(Set dst (CmpLTMask p q));
|
match(Set dst (CmpLTMask p q));
|
||||||
effect(KILL cr);
|
effect(KILL cr);
|
||||||
|
|
||||||
ins_cost(400); // XXX
|
ins_cost(400);
|
||||||
format %{ "cmpl $p, $q\t# cmpLTMask\n\t"
|
format %{ "cmpl $p, $q\t# cmpLTMask\n\t"
|
||||||
"setlt $dst\n\t"
|
"setlt $dst\n\t"
|
||||||
"movzbl $dst, $dst\n\t"
|
"movzbl $dst, $dst\n\t"
|
||||||
@ -9452,37 +9452,63 @@ instruct cmpLTMask0(rRegI dst, immI0 zero, rFlagsReg cr)
|
|||||||
match(Set dst (CmpLTMask dst zero));
|
match(Set dst (CmpLTMask dst zero));
|
||||||
effect(KILL cr);
|
effect(KILL cr);
|
||||||
|
|
||||||
ins_cost(100); // XXX
|
ins_cost(100);
|
||||||
format %{ "sarl $dst, #31\t# cmpLTMask0" %}
|
format %{ "sarl $dst, #31\t# cmpLTMask0" %}
|
||||||
opcode(0xC1, 0x7); /* C1 /7 ib */
|
ins_encode %{
|
||||||
ins_encode(reg_opc_imm(dst, 0x1F));
|
__ sarl($dst$$Register, 31);
|
||||||
|
%}
|
||||||
ins_pipe(ialu_reg);
|
ins_pipe(ialu_reg);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
/* Better to save a register than avoid a branch */
|
||||||
instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rRegI tmp, rFlagsReg cr)
|
instruct cadd_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr)
|
||||||
%{
|
%{
|
||||||
match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
|
match(Set p (AddI (AndI (CmpLTMask p q) y) (SubI p q)));
|
||||||
effect(TEMP tmp, KILL cr);
|
effect(KILL cr);
|
||||||
|
ins_cost(300);
|
||||||
ins_cost(400); // XXX
|
format %{ "subl $p,$q\t# cadd_cmpLTMask\n\t"
|
||||||
format %{ "subl $p, $q\t# cadd_cmpLTMask1\n\t"
|
"jge done\n\t"
|
||||||
"sbbl $tmp, $tmp\n\t"
|
"addl $p,$y\n"
|
||||||
"andl $tmp, $y\n\t"
|
"done: " %}
|
||||||
"addl $p, $tmp" %}
|
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
Register Rp = $p$$Register;
|
Register Rp = $p$$Register;
|
||||||
Register Rq = $q$$Register;
|
Register Rq = $q$$Register;
|
||||||
Register Ry = $y$$Register;
|
Register Ry = $y$$Register;
|
||||||
Register Rt = $tmp$$Register;
|
Label done;
|
||||||
__ subl(Rp, Rq);
|
__ subl(Rp, Rq);
|
||||||
__ sbbl(Rt, Rt);
|
__ jccb(Assembler::greaterEqual, done);
|
||||||
__ andl(Rt, Ry);
|
__ addl(Rp, Ry);
|
||||||
__ addl(Rp, Rt);
|
__ bind(done);
|
||||||
%}
|
%}
|
||||||
ins_pipe(pipe_cmplt);
|
ins_pipe(pipe_cmplt);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
/* Better to save a register than avoid a branch */
|
||||||
|
instruct and_cmpLTMask(rRegI p, rRegI q, rRegI y, rFlagsReg cr)
|
||||||
|
%{
|
||||||
|
match(Set y (AndI (CmpLTMask p q) y));
|
||||||
|
effect(KILL cr);
|
||||||
|
|
||||||
|
ins_cost(300);
|
||||||
|
|
||||||
|
format %{ "cmpl $p, $q\t# and_cmpLTMask\n\t"
|
||||||
|
"jlt done\n\t"
|
||||||
|
"xorl $y, $y\n"
|
||||||
|
"done: " %}
|
||||||
|
ins_encode %{
|
||||||
|
Register Rp = $p$$Register;
|
||||||
|
Register Rq = $q$$Register;
|
||||||
|
Register Ry = $y$$Register;
|
||||||
|
Label done;
|
||||||
|
__ cmpl(Rp, Rq);
|
||||||
|
__ jccb(Assembler::less, done);
|
||||||
|
__ xorl(Ry, Ry);
|
||||||
|
__ bind(done);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_cmplt);
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
//---------- FP Instructions------------------------------------------------
|
//---------- FP Instructions------------------------------------------------
|
||||||
|
|
||||||
instruct cmpF_cc_reg(rFlagsRegU cr, regF src1, regF src2)
|
instruct cmpF_cc_reg(rFlagsRegU cr, regF src1, regF src2)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -60,7 +60,7 @@
|
|||||||
#define PR_MODEL_LP64 2
|
#define PR_MODEL_LP64 2
|
||||||
|
|
||||||
#ifdef COMPILER1
|
#ifdef COMPILER1
|
||||||
#if defined(DEBUG) || defined(FASTDEBUG)
|
#ifdef ASSERT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To avoid the most part of potential link errors
|
* To avoid the most part of potential link errors
|
||||||
@ -84,7 +84,7 @@ address StubRoutines::_call_stub_return_address = NULL;
|
|||||||
|
|
||||||
StubQueue* AbstractInterpreter::_code = NULL;
|
StubQueue* AbstractInterpreter::_code = NULL;
|
||||||
|
|
||||||
#endif /* defined(DEBUG) || defined(FASTDEBUG) */
|
#endif /* ASSERT */
|
||||||
#endif /* COMPILER1 */
|
#endif /* COMPILER1 */
|
||||||
|
|
||||||
#define GEN_OFFS(Type,Name) \
|
#define GEN_OFFS(Type,Name) \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -55,14 +55,14 @@
|
|||||||
#include "utilities/accessFlags.hpp"
|
#include "utilities/accessFlags.hpp"
|
||||||
#include "utilities/globalDefinitions.hpp"
|
#include "utilities/globalDefinitions.hpp"
|
||||||
#ifdef COMPILER1
|
#ifdef COMPILER1
|
||||||
#if defined(DEBUG) || defined(FASTDEBUG)
|
#ifdef ASSERT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* To avoid the most part of potential link errors
|
* To avoid the most part of potential link errors
|
||||||
* we link this program with -z nodefs .
|
* we link this program with -z nodefs .
|
||||||
*
|
*
|
||||||
* But for 'debug1' and 'fastdebug1' we still have to provide
|
* But for 'debug1' and 'fastdebug1' we still have to provide
|
||||||
* a particular workaround for the following symbols bellow.
|
* a particular workaround for the following symbols below.
|
||||||
* It will be good to find out a generic way in the future.
|
* It will be good to find out a generic way in the future.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ address StubRoutines::_call_stub_return_address = NULL;
|
|||||||
|
|
||||||
StubQueue* AbstractInterpreter::_code = NULL;
|
StubQueue* AbstractInterpreter::_code = NULL;
|
||||||
|
|
||||||
#endif /* defined(DEBUG) || defined(FASTDEBUG) */
|
#endif /* ASSERT */
|
||||||
#endif /* COMPILER1 */
|
#endif /* COMPILER1 */
|
||||||
|
|
||||||
#define GEN_OFFS(Type,Name) \
|
#define GEN_OFFS(Type,Name) \
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 1999, 2010, 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
|
||||||
#include "opto/chaitin.hpp"
|
|
||||||
#include "opto/machnode.hpp"
|
|
||||||
|
|
||||||
// Disallow the use of the frame pointer (EBP) for implicit null exceptions
|
|
||||||
// on win95/98. If we do not do this, the OS gets confused and gives a stack
|
|
||||||
// error.
|
|
||||||
void PhaseRegAlloc::pd_preallocate_hook() {
|
|
||||||
#ifndef _WIN64
|
|
||||||
if (ImplicitNullChecks && !os::win32::is_nt()) {
|
|
||||||
for (uint block_num=1; block_num<_cfg._num_blocks; block_num++) {
|
|
||||||
Block *block = _cfg._blocks[block_num];
|
|
||||||
|
|
||||||
Node *block_end = block->end();
|
|
||||||
if (block_end->is_MachNullCheck() &&
|
|
||||||
block_end->as_Mach()->ideal_Opcode() != Op_Con) {
|
|
||||||
// The last instruction in the block is an implicit null check.
|
|
||||||
// Fix its input so that it does not load into the frame pointer.
|
|
||||||
_matcher.pd_implicit_null_fixup(block_end->in(1)->as_Mach(),
|
|
||||||
block_end->as_MachNullCheck()->_vidx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// WIN64==itanium on XP
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ASSERT
|
|
||||||
// Verify that no implicit null check uses the frame pointer (EBP) as
|
|
||||||
// its register on win95/98. Use of the frame pointer in an implicit
|
|
||||||
// null check confuses the OS, yielding a stack error.
|
|
||||||
void PhaseRegAlloc::pd_postallocate_verify_hook() {
|
|
||||||
#ifndef _WIN64
|
|
||||||
if (ImplicitNullChecks && !os::win32::is_nt()) {
|
|
||||||
for (uint block_num=1; block_num<_cfg._num_blocks; block_num++) {
|
|
||||||
Block *block = _cfg._blocks[block_num];
|
|
||||||
|
|
||||||
Node *block_end = block->_nodes[block->_nodes.size()-1];
|
|
||||||
if (block_end->is_MachNullCheck() && block_end->as_Mach()->ideal_Opcode() != Op_Con) {
|
|
||||||
// The last instruction in the block is an implicit
|
|
||||||
// null check. Verify that this instruction does not
|
|
||||||
// use the frame pointer.
|
|
||||||
int reg = get_reg_first(block_end->in(1)->in(block_end->as_MachNullCheck()->_vidx));
|
|
||||||
assert(reg != EBP_num,
|
|
||||||
"implicit null check using frame pointer on win95/98");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// WIN64==itanium on XP
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
@ -4238,9 +4238,6 @@ char * os::native_path(char *path) {
|
|||||||
path[3] = '\0';
|
path[3] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
jio_fprintf(stderr, "sysNativePath: %s\n", path);
|
|
||||||
#endif DEBUG
|
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2008, 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
|
||||||
@ -19,7 +19,7 @@
|
|||||||
# 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.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
# Single gnu makefile for solaris, linux and windows (windows requires cygwin and mingw)
|
# Single gnu makefile for solaris, linux and windows (windows requires cygwin and mingw)
|
||||||
@ -66,7 +66,7 @@ ARCH=i386
|
|||||||
endif
|
endif
|
||||||
CC = $(MINGW)-gcc
|
CC = $(MINGW)-gcc
|
||||||
CONFIGURE_ARGS= --host=$(MINGW) --target=$(MINGW)
|
CONFIGURE_ARGS= --host=$(MINGW) --target=$(MINGW)
|
||||||
else #linux
|
else #linux
|
||||||
CPU = $(shell uname -m)
|
CPU = $(shell uname -m)
|
||||||
ARCH1=$(CPU:x86_64=amd64)
|
ARCH1=$(CPU:x86_64=amd64)
|
||||||
ARCH=$(ARCH1:i686=i386)
|
ARCH=$(ARCH1:i686=i386)
|
||||||
@ -116,7 +116,6 @@ OUTFLAGS += -o $@
|
|||||||
else #Windows
|
else #Windows
|
||||||
OS = windows
|
OS = windows
|
||||||
CC = gcc
|
CC = gcc
|
||||||
#CPPFLAGS += /D"WIN32" /D"_WINDOWS" /D"DEBUG" /D"NDEBUG"
|
|
||||||
CFLAGS += /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi-
|
CFLAGS += /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi-
|
||||||
CFLAGS += LIBARCH=\"$(LIBARCH)\"
|
CFLAGS += LIBARCH=\"$(LIBARCH)\"
|
||||||
DLDFLAGS += /dll /subsystem:windows /incremental:no \
|
DLDFLAGS += /dll /subsystem:windows /incremental:no \
|
||||||
|
@ -938,5 +938,7 @@ void Canonicalizer::do_ProfileCall(ProfileCall* x) {}
|
|||||||
void Canonicalizer::do_ProfileInvoke(ProfileInvoke* x) {}
|
void Canonicalizer::do_ProfileInvoke(ProfileInvoke* x) {}
|
||||||
void Canonicalizer::do_RuntimeCall(RuntimeCall* x) {}
|
void Canonicalizer::do_RuntimeCall(RuntimeCall* x) {}
|
||||||
void Canonicalizer::do_RangeCheckPredicate(RangeCheckPredicate* x) {}
|
void Canonicalizer::do_RangeCheckPredicate(RangeCheckPredicate* x) {}
|
||||||
|
#ifdef ASSERT
|
||||||
void Canonicalizer::do_Assert(Assert* x) {}
|
void Canonicalizer::do_Assert(Assert* x) {}
|
||||||
|
#endif
|
||||||
void Canonicalizer::do_MemBar(MemBar* x) {}
|
void Canonicalizer::do_MemBar(MemBar* x) {}
|
||||||
|
@ -108,7 +108,9 @@ class Canonicalizer: InstructionVisitor {
|
|||||||
virtual void do_RuntimeCall (RuntimeCall* x);
|
virtual void do_RuntimeCall (RuntimeCall* x);
|
||||||
virtual void do_MemBar (MemBar* x);
|
virtual void do_MemBar (MemBar* x);
|
||||||
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
||||||
|
#ifdef ASSERT
|
||||||
virtual void do_Assert (Assert* x);
|
virtual void do_Assert (Assert* x);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SHARE_VM_C1_C1_CANONICALIZER_HPP
|
#endif // SHARE_VM_C1_C1_CANONICALIZER_HPP
|
||||||
|
@ -111,7 +111,9 @@ class ProfileInvoke;
|
|||||||
class RuntimeCall;
|
class RuntimeCall;
|
||||||
class MemBar;
|
class MemBar;
|
||||||
class RangeCheckPredicate;
|
class RangeCheckPredicate;
|
||||||
|
#ifdef ASSERT
|
||||||
class Assert;
|
class Assert;
|
||||||
|
#endif
|
||||||
|
|
||||||
// A Value is a reference to the instruction creating the value
|
// A Value is a reference to the instruction creating the value
|
||||||
typedef Instruction* Value;
|
typedef Instruction* Value;
|
||||||
|
@ -871,12 +871,14 @@ void InstructionPrinter::do_RangeCheckPredicate(RangeCheckPredicate* x) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ASSERT
|
||||||
void InstructionPrinter::do_Assert(Assert* x) {
|
void InstructionPrinter::do_Assert(Assert* x) {
|
||||||
output()->print("assert ");
|
output()->print("assert ");
|
||||||
print_value(x->x());
|
print_value(x->x());
|
||||||
output()->print(" %s ", cond_name(x->cond()));
|
output()->print(" %s ", cond_name(x->cond()));
|
||||||
print_value(x->y());
|
print_value(x->y());
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void InstructionPrinter::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {
|
void InstructionPrinter::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {
|
||||||
print_unsafe_object_op(x, "UnsafePrefetchWrite");
|
print_unsafe_object_op(x, "UnsafePrefetchWrite");
|
||||||
|
@ -136,7 +136,9 @@ class InstructionPrinter: public InstructionVisitor {
|
|||||||
virtual void do_RuntimeCall (RuntimeCall* x);
|
virtual void do_RuntimeCall (RuntimeCall* x);
|
||||||
virtual void do_MemBar (MemBar* x);
|
virtual void do_MemBar (MemBar* x);
|
||||||
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
||||||
|
#ifdef ASSERT
|
||||||
virtual void do_Assert (Assert* x);
|
virtual void do_Assert (Assert* x);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#endif // PRODUCT
|
#endif // PRODUCT
|
||||||
|
|
||||||
|
@ -1778,7 +1778,9 @@ const char * LIR_Op::name() const {
|
|||||||
// LIR_OpProfileCall
|
// LIR_OpProfileCall
|
||||||
case lir_profile_call: s = "profile_call"; break;
|
case lir_profile_call: s = "profile_call"; break;
|
||||||
// LIR_OpAssert
|
// LIR_OpAssert
|
||||||
|
#ifdef ASSERT
|
||||||
case lir_assert: s = "assert"; break;
|
case lir_assert: s = "assert"; break;
|
||||||
|
#endif
|
||||||
case lir_none: ShouldNotReachHere();break;
|
case lir_none: ShouldNotReachHere();break;
|
||||||
default: s = "illegal_op"; break;
|
default: s = "illegal_op"; break;
|
||||||
}
|
}
|
||||||
@ -2025,12 +2027,14 @@ void LIR_OpLock::print_instr(outputStream* out) const {
|
|||||||
out->print("[lbl:0x%x]", stub()->entry());
|
out->print("[lbl:0x%x]", stub()->entry());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ASSERT
|
||||||
void LIR_OpAssert::print_instr(outputStream* out) const {
|
void LIR_OpAssert::print_instr(outputStream* out) const {
|
||||||
print_condition(out, condition()); out->print(" ");
|
print_condition(out, condition()); out->print(" ");
|
||||||
in_opr1()->print(out); out->print(" ");
|
in_opr1()->print(out); out->print(" ");
|
||||||
in_opr2()->print(out); out->print(", \"");
|
in_opr2()->print(out); out->print(", \"");
|
||||||
out->print(msg()); out->print("\"");
|
out->print(msg()); out->print("\"");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void LIR_OpDelay::print_instr(outputStream* out) const {
|
void LIR_OpDelay::print_instr(outputStream* out) const {
|
||||||
|
@ -881,8 +881,9 @@ class LIR_OpLock;
|
|||||||
class LIR_OpTypeCheck;
|
class LIR_OpTypeCheck;
|
||||||
class LIR_OpCompareAndSwap;
|
class LIR_OpCompareAndSwap;
|
||||||
class LIR_OpProfileCall;
|
class LIR_OpProfileCall;
|
||||||
|
#ifdef ASSERT
|
||||||
class LIR_OpAssert;
|
class LIR_OpAssert;
|
||||||
|
#endif
|
||||||
|
|
||||||
// LIR operation codes
|
// LIR operation codes
|
||||||
enum LIR_Code {
|
enum LIR_Code {
|
||||||
@ -1139,7 +1140,9 @@ class LIR_Op: public CompilationResourceObj {
|
|||||||
virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; }
|
virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; }
|
||||||
virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; }
|
virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; }
|
||||||
virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; }
|
virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; }
|
||||||
|
#ifdef ASSERT
|
||||||
virtual LIR_OpAssert* as_OpAssert() { return NULL; }
|
virtual LIR_OpAssert* as_OpAssert() { return NULL; }
|
||||||
|
#endif
|
||||||
|
|
||||||
virtual void verify() const {}
|
virtual void verify() const {}
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 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
|
||||||
@ -3044,21 +3044,20 @@ void LIRGenerator::increment_event_counter_impl(CodeEmitInfo* info,
|
|||||||
assert(level > CompLevel_simple, "Shouldn't be here");
|
assert(level > CompLevel_simple, "Shouldn't be here");
|
||||||
|
|
||||||
int offset = -1;
|
int offset = -1;
|
||||||
LIR_Opr counter_holder = new_register(T_METADATA);
|
LIR_Opr counter_holder;
|
||||||
LIR_Opr meth;
|
|
||||||
if (level == CompLevel_limited_profile) {
|
if (level == CompLevel_limited_profile) {
|
||||||
offset = in_bytes(backedge ? Method::backedge_counter_offset() :
|
address counters_adr = method->ensure_method_counters();
|
||||||
Method::invocation_counter_offset());
|
counter_holder = new_pointer_register();
|
||||||
__ metadata2reg(method->constant_encoding(), counter_holder);
|
__ move(LIR_OprFact::intptrConst(counters_adr), counter_holder);
|
||||||
meth = counter_holder;
|
offset = in_bytes(backedge ? MethodCounters::backedge_counter_offset() :
|
||||||
|
MethodCounters::invocation_counter_offset());
|
||||||
} else if (level == CompLevel_full_profile) {
|
} else if (level == CompLevel_full_profile) {
|
||||||
|
counter_holder = new_register(T_METADATA);
|
||||||
offset = in_bytes(backedge ? MethodData::backedge_counter_offset() :
|
offset = in_bytes(backedge ? MethodData::backedge_counter_offset() :
|
||||||
MethodData::invocation_counter_offset());
|
MethodData::invocation_counter_offset());
|
||||||
ciMethodData* md = method->method_data_or_null();
|
ciMethodData* md = method->method_data_or_null();
|
||||||
assert(md != NULL, "Sanity");
|
assert(md != NULL, "Sanity");
|
||||||
__ metadata2reg(md->constant_encoding(), counter_holder);
|
__ metadata2reg(md->constant_encoding(), counter_holder);
|
||||||
meth = new_register(T_METADATA);
|
|
||||||
__ metadata2reg(method->constant_encoding(), meth);
|
|
||||||
} else {
|
} else {
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
@ -3069,6 +3068,8 @@ void LIRGenerator::increment_event_counter_impl(CodeEmitInfo* info,
|
|||||||
__ store(result, counter);
|
__ store(result, counter);
|
||||||
if (notify) {
|
if (notify) {
|
||||||
LIR_Opr mask = load_immediate(frequency << InvocationCounter::count_shift, T_INT);
|
LIR_Opr mask = load_immediate(frequency << InvocationCounter::count_shift, T_INT);
|
||||||
|
LIR_Opr meth = new_register(T_METADATA);
|
||||||
|
__ metadata2reg(method->constant_encoding(), meth);
|
||||||
__ logical_and(result, mask, result);
|
__ logical_and(result, mask, result);
|
||||||
__ cmp(lir_cond_equal, result, LIR_OprFact::intConst(0));
|
__ cmp(lir_cond_equal, result, LIR_OprFact::intConst(0));
|
||||||
// The bci for info can point to cmp for if's we want the if bci
|
// The bci for info can point to cmp for if's we want the if bci
|
||||||
@ -3103,8 +3104,8 @@ void LIRGenerator::do_RuntimeCall(RuntimeCall* x) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LIRGenerator::do_Assert(Assert *x) {
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
|
void LIRGenerator::do_Assert(Assert *x) {
|
||||||
ValueTag tag = x->x()->type()->tag();
|
ValueTag tag = x->x()->type()->tag();
|
||||||
If::Condition cond = x->cond();
|
If::Condition cond = x->cond();
|
||||||
|
|
||||||
@ -3124,9 +3125,8 @@ void LIRGenerator::do_Assert(Assert *x) {
|
|||||||
LIR_Opr right = yin->result();
|
LIR_Opr right = yin->result();
|
||||||
|
|
||||||
__ lir_assert(lir_cond(x->cond()), left, right, x->message(), true);
|
__ lir_assert(lir_cond(x->cond()), left, right, x->message(), true);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void LIRGenerator::do_RangeCheckPredicate(RangeCheckPredicate *x) {
|
void LIRGenerator::do_RangeCheckPredicate(RangeCheckPredicate *x) {
|
||||||
|
|
||||||
|
@ -537,7 +537,9 @@ class LIRGenerator: public InstructionVisitor, public BlockClosure {
|
|||||||
virtual void do_RuntimeCall (RuntimeCall* x);
|
virtual void do_RuntimeCall (RuntimeCall* x);
|
||||||
virtual void do_MemBar (MemBar* x);
|
virtual void do_MemBar (MemBar* x);
|
||||||
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
||||||
|
#ifdef ASSERT
|
||||||
virtual void do_Assert (Assert* x);
|
virtual void do_Assert (Assert* x);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -535,7 +535,9 @@ public:
|
|||||||
void do_RuntimeCall (RuntimeCall* x);
|
void do_RuntimeCall (RuntimeCall* x);
|
||||||
void do_MemBar (MemBar* x);
|
void do_MemBar (MemBar* x);
|
||||||
void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
void do_RangeCheckPredicate(RangeCheckPredicate* x);
|
||||||
|
#ifdef ASSERT
|
||||||
void do_Assert (Assert* x);
|
void do_Assert (Assert* x);
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -718,8 +720,9 @@ void NullCheckVisitor::do_ProfileInvoke (ProfileInvoke* x) {}
|
|||||||
void NullCheckVisitor::do_RuntimeCall (RuntimeCall* x) {}
|
void NullCheckVisitor::do_RuntimeCall (RuntimeCall* x) {}
|
||||||
void NullCheckVisitor::do_MemBar (MemBar* x) {}
|
void NullCheckVisitor::do_MemBar (MemBar* x) {}
|
||||||
void NullCheckVisitor::do_RangeCheckPredicate(RangeCheckPredicate* x) {}
|
void NullCheckVisitor::do_RangeCheckPredicate(RangeCheckPredicate* x) {}
|
||||||
|
#ifdef ASSERT
|
||||||
void NullCheckVisitor::do_Assert (Assert* x) {}
|
void NullCheckVisitor::do_Assert (Assert* x) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
void NullCheckEliminator::visit(Value* p) {
|
void NullCheckEliminator::visit(Value* p) {
|
||||||
assert(*p != NULL, "should not find NULL instructions");
|
assert(*p != NULL, "should not find NULL instructions");
|
||||||
|
@ -166,7 +166,9 @@ public:
|
|||||||
void do_RuntimeCall (RuntimeCall* x) { /* nothing to do */ };
|
void do_RuntimeCall (RuntimeCall* x) { /* nothing to do */ };
|
||||||
void do_MemBar (MemBar* x) { /* nothing to do */ };
|
void do_MemBar (MemBar* x) { /* nothing to do */ };
|
||||||
void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
|
void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
|
||||||
|
#ifdef ASSERT
|
||||||
void do_Assert (Assert* x) { /* nothing to do */ };
|
void do_Assert (Assert* x) { /* nothing to do */ };
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
|
@ -207,7 +207,9 @@ class ValueNumberingVisitor: public InstructionVisitor {
|
|||||||
void do_RuntimeCall (RuntimeCall* x) { /* nothing to do */ };
|
void do_RuntimeCall (RuntimeCall* x) { /* nothing to do */ };
|
||||||
void do_MemBar (MemBar* x) { /* nothing to do */ };
|
void do_MemBar (MemBar* x) { /* nothing to do */ };
|
||||||
void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
|
void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
|
||||||
|
#ifdef ASSERT
|
||||||
void do_Assert (Assert* x) { /* nothing to do */ };
|
void do_Assert (Assert* x) { /* nothing to do */ };
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 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
|
||||||
@ -904,6 +904,20 @@ ciMethodData* ciMethod::method_data_or_null() {
|
|||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// ciMethod::ensure_method_counters
|
||||||
|
//
|
||||||
|
address ciMethod::ensure_method_counters() {
|
||||||
|
check_is_loaded();
|
||||||
|
VM_ENTRY_MARK;
|
||||||
|
methodHandle mh(THREAD, get_Method());
|
||||||
|
MethodCounters *counter = mh->method_counters();
|
||||||
|
if (counter == NULL) {
|
||||||
|
counter = Method::build_method_counters(mh(), CHECK_AND_CLEAR_NULL);
|
||||||
|
}
|
||||||
|
return (address)counter;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
// ciMethod::should_exclude
|
// ciMethod::should_exclude
|
||||||
//
|
//
|
||||||
@ -1191,13 +1205,14 @@ void ciMethod::dump_replay_data(outputStream* st) {
|
|||||||
ASSERT_IN_VM;
|
ASSERT_IN_VM;
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
Method* method = get_Method();
|
Method* method = get_Method();
|
||||||
|
MethodCounters* mcs = method->method_counters();
|
||||||
Klass* holder = method->method_holder();
|
Klass* holder = method->method_holder();
|
||||||
st->print_cr("ciMethod %s %s %s %d %d %d %d %d",
|
st->print_cr("ciMethod %s %s %s %d %d %d %d %d",
|
||||||
holder->name()->as_quoted_ascii(),
|
holder->name()->as_quoted_ascii(),
|
||||||
method->name()->as_quoted_ascii(),
|
method->name()->as_quoted_ascii(),
|
||||||
method->signature()->as_quoted_ascii(),
|
method->signature()->as_quoted_ascii(),
|
||||||
method->invocation_counter()->raw_counter(),
|
mcs == NULL ? 0 : mcs->invocation_counter()->raw_counter(),
|
||||||
method->backedge_counter()->raw_counter(),
|
mcs == NULL ? 0 : mcs->backedge_counter()->raw_counter(),
|
||||||
interpreter_invocation_count(),
|
interpreter_invocation_count(),
|
||||||
interpreter_throwout_count(),
|
interpreter_throwout_count(),
|
||||||
_instructions_size);
|
_instructions_size);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1999, 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
|
||||||
@ -262,6 +262,7 @@ class ciMethod : public ciMetadata {
|
|||||||
bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
|
bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
|
||||||
bool check_call(int refinfo_index, bool is_static) const;
|
bool check_call(int refinfo_index, bool is_static) const;
|
||||||
bool ensure_method_data(); // make sure it exists in the VM also
|
bool ensure_method_data(); // make sure it exists in the VM also
|
||||||
|
address ensure_method_counters();
|
||||||
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
|
||||||
|
|
||||||
|
@ -920,12 +920,17 @@ void ciReplay::initialize(ciMethod* m) {
|
|||||||
method->print_name(tty);
|
method->print_name(tty);
|
||||||
tty->cr();
|
tty->cr();
|
||||||
} else {
|
} else {
|
||||||
|
EXCEPTION_CONTEXT;
|
||||||
|
MethodCounters* mcs = method->method_counters();
|
||||||
// m->_instructions_size = rec->instructions_size;
|
// m->_instructions_size = rec->instructions_size;
|
||||||
m->_instructions_size = -1;
|
m->_instructions_size = -1;
|
||||||
m->_interpreter_invocation_count = rec->interpreter_invocation_count;
|
m->_interpreter_invocation_count = rec->interpreter_invocation_count;
|
||||||
m->_interpreter_throwout_count = rec->interpreter_throwout_count;
|
m->_interpreter_throwout_count = rec->interpreter_throwout_count;
|
||||||
method->invocation_counter()->_counter = rec->invocation_counter;
|
if (mcs == NULL) {
|
||||||
method->backedge_counter()->_counter = rec->backedge_counter;
|
mcs = Method::build_method_counters(method, CHECK_AND_CLEAR);
|
||||||
|
}
|
||||||
|
mcs->invocation_counter()->_counter = rec->invocation_counter;
|
||||||
|
mcs->backedge_counter()->_counter = rec->backedge_counter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1274,13 +1274,16 @@ void ClassLoader::compile_the_world() {
|
|||||||
Handle system_class_loader (THREAD, SystemDictionary::java_system_loader());
|
Handle system_class_loader (THREAD, SystemDictionary::java_system_loader());
|
||||||
// Iterate over all bootstrap class path entries
|
// Iterate over all bootstrap class path entries
|
||||||
ClassPathEntry* e = _first_entry;
|
ClassPathEntry* e = _first_entry;
|
||||||
|
jlong start = os::javaTimeMillis();
|
||||||
while (e != NULL) {
|
while (e != NULL) {
|
||||||
// We stop at rt.jar, unless it is the first bootstrap path entry
|
// We stop at rt.jar, unless it is the first bootstrap path entry
|
||||||
if (e->is_rt_jar() && e != _first_entry) break;
|
if (e->is_rt_jar() && e != _first_entry) break;
|
||||||
e->compile_the_world(system_class_loader, CATCH);
|
e->compile_the_world(system_class_loader, CATCH);
|
||||||
e = e->next();
|
e = e->next();
|
||||||
}
|
}
|
||||||
tty->print_cr("CompileTheWorld : Done");
|
jlong end = os::javaTimeMillis();
|
||||||
|
tty->print_cr("CompileTheWorld : Done (%d classes, %d methods, %d ms)",
|
||||||
|
_compile_the_world_class_counter, _compile_the_world_method_counter, (end - start));
|
||||||
{
|
{
|
||||||
// Print statistics as if before normal exit:
|
// Print statistics as if before normal exit:
|
||||||
extern void print_statistics();
|
extern void print_statistics();
|
||||||
@ -1289,7 +1292,8 @@ void ClassLoader::compile_the_world() {
|
|||||||
vm_exit(0);
|
vm_exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ClassLoader::_compile_the_world_counter = 0;
|
int ClassLoader::_compile_the_world_class_counter = 0;
|
||||||
|
int ClassLoader::_compile_the_world_method_counter = 0;
|
||||||
static int _codecache_sweep_counter = 0;
|
static int _codecache_sweep_counter = 0;
|
||||||
|
|
||||||
// Filter out all exceptions except OOMs
|
// Filter out all exceptions except OOMs
|
||||||
@ -1311,8 +1315,8 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
|||||||
// If the file has a period after removing .class, it's not really a
|
// If the file has a period after removing .class, it's not really a
|
||||||
// valid class file. The class loader will check everything else.
|
// valid class file. The class loader will check everything else.
|
||||||
if (strchr(buffer, '.') == NULL) {
|
if (strchr(buffer, '.') == NULL) {
|
||||||
_compile_the_world_counter++;
|
_compile_the_world_class_counter++;
|
||||||
if (_compile_the_world_counter > CompileTheWorldStopAt) return;
|
if (_compile_the_world_class_counter > CompileTheWorldStopAt) return;
|
||||||
|
|
||||||
// Construct name without extension
|
// Construct name without extension
|
||||||
TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
|
TempNewSymbol sym = SymbolTable::new_symbol(buffer, CHECK);
|
||||||
@ -1329,16 +1333,16 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
|||||||
if (HAS_PENDING_EXCEPTION) {
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
// If something went wrong in preloading we just ignore it
|
// If something went wrong in preloading we just ignore it
|
||||||
clear_pending_exception_if_not_oom(CHECK);
|
clear_pending_exception_if_not_oom(CHECK);
|
||||||
tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_counter, buffer);
|
tty->print_cr("Preloading failed for (%d) %s", _compile_the_world_class_counter, buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_compile_the_world_counter >= CompileTheWorldStartAt) {
|
if (_compile_the_world_class_counter >= CompileTheWorldStartAt) {
|
||||||
if (k.is_null() || exception_occurred) {
|
if (k.is_null() || exception_occurred) {
|
||||||
// If something went wrong (e.g. ExceptionInInitializerError) we skip this class
|
// If something went wrong (e.g. ExceptionInInitializerError) we skip this class
|
||||||
tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_counter, buffer);
|
tty->print_cr("CompileTheWorld (%d) : Skipping %s", _compile_the_world_class_counter, buffer);
|
||||||
} else {
|
} else {
|
||||||
tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_counter, buffer);
|
tty->print_cr("CompileTheWorld (%d) : %s", _compile_the_world_class_counter, buffer);
|
||||||
// Preload all classes to get around uncommon traps
|
// Preload all classes to get around uncommon traps
|
||||||
// Iterate over all methods in class
|
// Iterate over all methods in class
|
||||||
for (int n = 0; n < k->methods()->length(); n++) {
|
for (int n = 0; n < k->methods()->length(); n++) {
|
||||||
@ -1356,7 +1360,9 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
|||||||
methodHandle(), 0, "CTW", THREAD);
|
methodHandle(), 0, "CTW", THREAD);
|
||||||
if (HAS_PENDING_EXCEPTION) {
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
clear_pending_exception_if_not_oom(CHECK);
|
clear_pending_exception_if_not_oom(CHECK);
|
||||||
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
|
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name()->as_C_string());
|
||||||
|
} else {
|
||||||
|
_compile_the_world_method_counter++;
|
||||||
}
|
}
|
||||||
if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) {
|
if (TieredCompilation && TieredStopAtLevel >= CompLevel_full_optimization) {
|
||||||
// Clobber the first compile and force second tier compilation
|
// Clobber the first compile and force second tier compilation
|
||||||
@ -1370,7 +1376,9 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
|||||||
methodHandle(), 0, "CTW", THREAD);
|
methodHandle(), 0, "CTW", THREAD);
|
||||||
if (HAS_PENDING_EXCEPTION) {
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
clear_pending_exception_if_not_oom(CHECK);
|
clear_pending_exception_if_not_oom(CHECK);
|
||||||
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_counter, m->name()->as_C_string());
|
tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name()->as_C_string());
|
||||||
|
} else {
|
||||||
|
_compile_the_world_method_counter++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -340,11 +340,12 @@ class ClassLoader: AllStatic {
|
|||||||
// Force compilation of all methods in all classes in bootstrap class path (stress test)
|
// Force compilation of all methods in all classes in bootstrap class path (stress test)
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
private:
|
private:
|
||||||
static int _compile_the_world_counter;
|
static int _compile_the_world_class_counter;
|
||||||
|
static int _compile_the_world_method_counter;
|
||||||
public:
|
public:
|
||||||
static void compile_the_world();
|
static void compile_the_world();
|
||||||
static void compile_the_world_in(char* name, Handle loader, TRAPS);
|
static void compile_the_world_in(char* name, Handle loader, TRAPS);
|
||||||
static int compile_the_world_counter() { return _compile_the_world_counter; }
|
static int compile_the_world_counter() { return _compile_the_world_class_counter; }
|
||||||
#endif //PRODUCT
|
#endif //PRODUCT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 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
|
||||||
@ -175,14 +175,14 @@ class StackMapFrame : public ResourceObj {
|
|||||||
ErrorContext* ctx, TRAPS) const;
|
ErrorContext* ctx, TRAPS) const;
|
||||||
|
|
||||||
inline void set_mark() {
|
inline void set_mark() {
|
||||||
#ifdef DEBUG
|
#ifdef ASSERT
|
||||||
// Put bogus type to indicate it's no longer valid.
|
// Put bogus type to indicate it's no longer valid.
|
||||||
if (_stack_mark != -1) {
|
if (_stack_mark != -1) {
|
||||||
for (int i = _stack_mark - 1; i >= _stack_size; --i) {
|
for (int i = _stack_mark - 1; i >= _stack_size; --i) {
|
||||||
_stack[i] = VerificationType::bogus_type();
|
_stack[i] = VerificationType::bogus_type();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // def DEBUG
|
#endif // def ASSERT
|
||||||
_stack_mark = _stack_size;
|
_stack_mark = _stack_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,14 +348,14 @@ RuntimeStub* RuntimeStub::new_runtime_stub(const char* stub_name,
|
|||||||
|
|
||||||
|
|
||||||
void* RuntimeStub::operator new(size_t s, unsigned size) {
|
void* RuntimeStub::operator new(size_t s, unsigned size) {
|
||||||
void* p = CodeCache::allocate(size);
|
void* p = CodeCache::allocate(size, true);
|
||||||
if (!p) fatal("Initial size of CodeCache is too small");
|
if (!p) fatal("Initial size of CodeCache is too small");
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
// operator new shared by all singletons:
|
// operator new shared by all singletons:
|
||||||
void* SingletonBlob::operator new(size_t s, unsigned size) {
|
void* SingletonBlob::operator new(size_t s, unsigned size) {
|
||||||
void* p = CodeCache::allocate(size);
|
void* p = CodeCache::allocate(size, true);
|
||||||
if (!p) fatal("Initial size of CodeCache is too small");
|
if (!p) fatal("Initial size of CodeCache is too small");
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
@ -172,7 +172,7 @@ nmethod* CodeCache::next_nmethod (CodeBlob* cb) {
|
|||||||
|
|
||||||
static size_t maxCodeCacheUsed = 0;
|
static size_t maxCodeCacheUsed = 0;
|
||||||
|
|
||||||
CodeBlob* CodeCache::allocate(int size) {
|
CodeBlob* CodeCache::allocate(int size, bool is_critical) {
|
||||||
// Do not seize the CodeCache lock here--if the caller has not
|
// Do not seize the CodeCache lock here--if the caller has not
|
||||||
// already done so, we are going to lose bigtime, since the code
|
// already done so, we are going to lose bigtime, since the code
|
||||||
// cache will contain a garbage CodeBlob until the caller can
|
// cache will contain a garbage CodeBlob until the caller can
|
||||||
@ -183,7 +183,7 @@ CodeBlob* CodeCache::allocate(int size) {
|
|||||||
CodeBlob* cb = NULL;
|
CodeBlob* cb = NULL;
|
||||||
_number_of_blobs++;
|
_number_of_blobs++;
|
||||||
while (true) {
|
while (true) {
|
||||||
cb = (CodeBlob*)_heap->allocate(size);
|
cb = (CodeBlob*)_heap->allocate(size, is_critical);
|
||||||
if (cb != NULL) break;
|
if (cb != NULL) break;
|
||||||
if (!_heap->expand_by(CodeCacheExpansionSize)) {
|
if (!_heap->expand_by(CodeCacheExpansionSize)) {
|
||||||
// Expansion failed
|
// Expansion failed
|
||||||
@ -192,8 +192,8 @@ CodeBlob* CodeCache::allocate(int size) {
|
|||||||
if (PrintCodeCacheExtension) {
|
if (PrintCodeCacheExtension) {
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
tty->print_cr("code cache extended to [" INTPTR_FORMAT ", " INTPTR_FORMAT "] (%d bytes)",
|
tty->print_cr("code cache extended to [" INTPTR_FORMAT ", " INTPTR_FORMAT "] (%d bytes)",
|
||||||
(intptr_t)_heap->begin(), (intptr_t)_heap->end(),
|
(intptr_t)_heap->low_boundary(), (intptr_t)_heap->high(),
|
||||||
(address)_heap->end() - (address)_heap->begin());
|
(address)_heap->high() - (address)_heap->low_boundary());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
maxCodeCacheUsed = MAX2(maxCodeCacheUsed, ((address)_heap->high_boundary() -
|
maxCodeCacheUsed = MAX2(maxCodeCacheUsed, ((address)_heap->high_boundary() -
|
||||||
@ -608,13 +608,13 @@ void CodeCache::verify_oops() {
|
|||||||
|
|
||||||
address CodeCache::first_address() {
|
address CodeCache::first_address() {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
return (address)_heap->begin();
|
return (address)_heap->low_boundary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
address CodeCache::last_address() {
|
address CodeCache::last_address() {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
return (address)_heap->end();
|
return (address)_heap->high();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -996,10 +996,9 @@ void CodeCache::print() {
|
|||||||
void CodeCache::print_summary(outputStream* st, bool detailed) {
|
void CodeCache::print_summary(outputStream* st, bool detailed) {
|
||||||
size_t total = (_heap->high_boundary() - _heap->low_boundary());
|
size_t total = (_heap->high_boundary() - _heap->low_boundary());
|
||||||
st->print_cr("CodeCache: size=" SIZE_FORMAT "Kb used=" SIZE_FORMAT
|
st->print_cr("CodeCache: size=" SIZE_FORMAT "Kb used=" SIZE_FORMAT
|
||||||
"Kb max_used=" SIZE_FORMAT "Kb free=" SIZE_FORMAT
|
"Kb max_used=" SIZE_FORMAT "Kb free=" SIZE_FORMAT "Kb",
|
||||||
"Kb max_free_chunk=" SIZE_FORMAT "Kb",
|
|
||||||
total/K, (total - unallocated_capacity())/K,
|
total/K, (total - unallocated_capacity())/K,
|
||||||
maxCodeCacheUsed/K, unallocated_capacity()/K, largest_free_block()/K);
|
maxCodeCacheUsed/K, unallocated_capacity()/K);
|
||||||
|
|
||||||
if (detailed) {
|
if (detailed) {
|
||||||
st->print_cr(" bounds [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT "]",
|
st->print_cr(" bounds [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT "]",
|
||||||
@ -1018,19 +1017,8 @@ void CodeCache::print_summary(outputStream* st, bool detailed) {
|
|||||||
|
|
||||||
void CodeCache::log_state(outputStream* st) {
|
void CodeCache::log_state(outputStream* st) {
|
||||||
st->print(" total_blobs='" UINT32_FORMAT "' nmethods='" UINT32_FORMAT "'"
|
st->print(" total_blobs='" UINT32_FORMAT "' nmethods='" UINT32_FORMAT "'"
|
||||||
" adapters='" UINT32_FORMAT "' free_code_cache='" SIZE_FORMAT "'"
|
" adapters='" UINT32_FORMAT "' free_code_cache='" SIZE_FORMAT "'",
|
||||||
" largest_free_block='" SIZE_FORMAT "'",
|
|
||||||
nof_blobs(), nof_nmethods(), nof_adapters(),
|
nof_blobs(), nof_nmethods(), nof_adapters(),
|
||||||
unallocated_capacity(), largest_free_block());
|
unallocated_capacity());
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t CodeCache::largest_free_block() {
|
|
||||||
// This is called both with and without CodeCache_lock held so
|
|
||||||
// handle both cases.
|
|
||||||
if (CodeCache_lock->owned_by_self()) {
|
|
||||||
return _heap->largest_free_block();
|
|
||||||
} else {
|
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
|
||||||
return _heap->largest_free_block();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -70,7 +70,7 @@ class CodeCache : AllStatic {
|
|||||||
static void initialize();
|
static void initialize();
|
||||||
|
|
||||||
// Allocation/administration
|
// Allocation/administration
|
||||||
static CodeBlob* allocate(int size); // allocates a new CodeBlob
|
static CodeBlob* allocate(int size, bool is_critical = false); // allocates a new CodeBlob
|
||||||
static void commit(CodeBlob* cb); // called when the allocated CodeBlob has been filled
|
static void commit(CodeBlob* cb); // called when the allocated CodeBlob has been filled
|
||||||
static int alignment_unit(); // guaranteed alignment of all CodeBlobs
|
static int alignment_unit(); // guaranteed alignment of all CodeBlobs
|
||||||
static int alignment_offset(); // guaranteed offset of first CodeBlob byte within alignment unit (i.e., allocation header)
|
static int alignment_offset(); // guaranteed offset of first CodeBlob byte within alignment unit (i.e., allocation header)
|
||||||
@ -156,19 +156,13 @@ class CodeCache : AllStatic {
|
|||||||
static address low_bound() { return (address) _heap->low_boundary(); }
|
static address low_bound() { return (address) _heap->low_boundary(); }
|
||||||
static address high_bound() { return (address) _heap->high_boundary(); }
|
static address high_bound() { return (address) _heap->high_boundary(); }
|
||||||
|
|
||||||
static bool has_space(int size) {
|
|
||||||
// Always leave some room in the CodeCache for I2C/C2I adapters
|
|
||||||
return largest_free_block() > (CodeCacheMinimumFreeSpace + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Profiling
|
// Profiling
|
||||||
static address first_address(); // first address used for CodeBlobs
|
static address first_address(); // first address used for CodeBlobs
|
||||||
static address last_address(); // last address used for CodeBlobs
|
static address last_address(); // last address used for CodeBlobs
|
||||||
static size_t capacity() { return _heap->capacity(); }
|
static size_t capacity() { return _heap->capacity(); }
|
||||||
static size_t max_capacity() { return _heap->max_capacity(); }
|
static size_t max_capacity() { return _heap->max_capacity(); }
|
||||||
static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
|
static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
|
||||||
static size_t largest_free_block();
|
static bool needs_flushing() { return unallocated_capacity() < CodeCacheFlushingMinimumFreeSpace; }
|
||||||
static bool needs_flushing() { return largest_free_block() < CodeCacheFlushingMinimumFreeSpace; }
|
|
||||||
|
|
||||||
static bool needs_cache_clean() { return _needs_cache_clean; }
|
static bool needs_cache_clean() { return _needs_cache_clean; }
|
||||||
static void set_needs_cache_clean(bool v) { _needs_cache_clean = v; }
|
static void set_needs_cache_clean(bool v) { _needs_cache_clean = v; }
|
||||||
|
@ -501,18 +501,17 @@ nmethod* nmethod::new_native_nmethod(methodHandle method,
|
|||||||
{
|
{
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
int native_nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
|
int native_nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
|
||||||
if (CodeCache::has_space(native_nmethod_size)) {
|
CodeOffsets offsets;
|
||||||
CodeOffsets offsets;
|
offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
|
||||||
offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
|
offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
|
||||||
offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
|
nm = new (native_nmethod_size) nmethod(method(), native_nmethod_size,
|
||||||
nm = new (native_nmethod_size) nmethod(method(), native_nmethod_size,
|
compile_id, &offsets,
|
||||||
compile_id, &offsets,
|
code_buffer, frame_size,
|
||||||
code_buffer, frame_size,
|
basic_lock_owner_sp_offset,
|
||||||
basic_lock_owner_sp_offset,
|
basic_lock_sp_offset, oop_maps);
|
||||||
basic_lock_sp_offset, oop_maps);
|
NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_native_nmethod(nm));
|
||||||
NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_native_nmethod(nm));
|
if (PrintAssembly && nm != NULL) {
|
||||||
if (PrintAssembly && nm != NULL)
|
Disassembler::decode(nm);
|
||||||
Disassembler::decode(nm);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// verify nmethod
|
// verify nmethod
|
||||||
@ -538,18 +537,17 @@ nmethod* nmethod::new_dtrace_nmethod(methodHandle method,
|
|||||||
{
|
{
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
int nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
|
int nmethod_size = allocation_size(code_buffer, sizeof(nmethod));
|
||||||
if (CodeCache::has_space(nmethod_size)) {
|
CodeOffsets offsets;
|
||||||
CodeOffsets offsets;
|
offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
|
||||||
offsets.set_value(CodeOffsets::Verified_Entry, vep_offset);
|
offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset);
|
||||||
offsets.set_value(CodeOffsets::Dtrace_trap, trap_offset);
|
offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
|
||||||
offsets.set_value(CodeOffsets::Frame_Complete, frame_complete);
|
|
||||||
|
|
||||||
nm = new (nmethod_size) nmethod(method(), nmethod_size,
|
nm = new (nmethod_size) nmethod(method(), nmethod_size,
|
||||||
&offsets, code_buffer, frame_size);
|
&offsets, code_buffer, frame_size);
|
||||||
|
|
||||||
NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
|
NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
|
||||||
if (PrintAssembly && nm != NULL)
|
if (PrintAssembly && nm != NULL) {
|
||||||
Disassembler::decode(nm);
|
Disassembler::decode(nm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// verify nmethod
|
// verify nmethod
|
||||||
@ -591,16 +589,16 @@ nmethod* nmethod::new_nmethod(methodHandle method,
|
|||||||
+ round_to(handler_table->size_in_bytes(), oopSize)
|
+ round_to(handler_table->size_in_bytes(), oopSize)
|
||||||
+ round_to(nul_chk_table->size_in_bytes(), oopSize)
|
+ round_to(nul_chk_table->size_in_bytes(), oopSize)
|
||||||
+ round_to(debug_info->data_size() , oopSize);
|
+ round_to(debug_info->data_size() , oopSize);
|
||||||
if (CodeCache::has_space(nmethod_size)) {
|
|
||||||
nm = new (nmethod_size)
|
nm = new (nmethod_size)
|
||||||
nmethod(method(), nmethod_size, compile_id, entry_bci, offsets,
|
nmethod(method(), nmethod_size, compile_id, entry_bci, offsets,
|
||||||
orig_pc_offset, debug_info, dependencies, code_buffer, frame_size,
|
orig_pc_offset, debug_info, dependencies, code_buffer, frame_size,
|
||||||
oop_maps,
|
oop_maps,
|
||||||
handler_table,
|
handler_table,
|
||||||
nul_chk_table,
|
nul_chk_table,
|
||||||
compiler,
|
compiler,
|
||||||
comp_level);
|
comp_level);
|
||||||
}
|
|
||||||
if (nm != NULL) {
|
if (nm != NULL) {
|
||||||
// To make dependency checking during class loading fast, record
|
// To make dependency checking during class loading fast, record
|
||||||
// the nmethod dependencies in the classes it is dependent on.
|
// the nmethod dependencies in the classes it is dependent on.
|
||||||
@ -612,15 +610,18 @@ nmethod* nmethod::new_nmethod(methodHandle method,
|
|||||||
// classes the slow way is too slow.
|
// classes the slow way is too slow.
|
||||||
for (Dependencies::DepStream deps(nm); deps.next(); ) {
|
for (Dependencies::DepStream deps(nm); deps.next(); ) {
|
||||||
Klass* klass = deps.context_type();
|
Klass* klass = deps.context_type();
|
||||||
if (klass == NULL) continue; // ignore things like evol_method
|
if (klass == NULL) {
|
||||||
|
continue; // ignore things like evol_method
|
||||||
|
}
|
||||||
|
|
||||||
// record this nmethod as dependent on this klass
|
// record this nmethod as dependent on this klass
|
||||||
InstanceKlass::cast(klass)->add_dependent_nmethod(nm);
|
InstanceKlass::cast(klass)->add_dependent_nmethod(nm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
|
NOT_PRODUCT(if (nm != NULL) nmethod_stats.note_nmethod(nm));
|
||||||
if (PrintAssembly && nm != NULL)
|
if (PrintAssembly && nm != NULL) {
|
||||||
Disassembler::decode(nm);
|
Disassembler::decode(nm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify nmethod
|
// verify nmethod
|
||||||
@ -798,13 +799,11 @@ nmethod::nmethod(
|
|||||||
}
|
}
|
||||||
#endif // def HAVE_DTRACE_H
|
#endif // def HAVE_DTRACE_H
|
||||||
|
|
||||||
void* nmethod::operator new(size_t size, int nmethod_size) {
|
void* nmethod::operator new(size_t size, int nmethod_size) throw () {
|
||||||
void* alloc = CodeCache::allocate(nmethod_size);
|
// Not critical, may return null if there is too little continuous memory
|
||||||
guarantee(alloc != NULL, "CodeCache should have enough space");
|
return CodeCache::allocate(nmethod_size);
|
||||||
return alloc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
nmethod::nmethod(
|
nmethod::nmethod(
|
||||||
Method* method,
|
Method* method,
|
||||||
int nmethod_size,
|
int nmethod_size,
|
||||||
|
@ -1581,7 +1581,7 @@ void CompileBroker::compiler_thread_loop() {
|
|||||||
// We need this HandleMark to avoid leaking VM handles.
|
// We need this HandleMark to avoid leaking VM handles.
|
||||||
HandleMark hm(thread);
|
HandleMark hm(thread);
|
||||||
|
|
||||||
if (CodeCache::largest_free_block() < CodeCacheMinimumFreeSpace) {
|
if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) {
|
||||||
// the code cache is really full
|
// the code cache is really full
|
||||||
handle_full_code_cache();
|
handle_full_code_cache();
|
||||||
} else if (UseCodeCacheFlushing && CodeCache::needs_flushing()) {
|
} else if (UseCodeCacheFlushing && CodeCache::needs_flushing()) {
|
||||||
|
@ -6921,7 +6921,7 @@ size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m(
|
|||||||
size = CompactibleFreeListSpace::adjustObjectSize(
|
size = CompactibleFreeListSpace::adjustObjectSize(
|
||||||
p->oop_iterate(_scanningClosure));
|
p->oop_iterate(_scanningClosure));
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef ASSERT
|
||||||
size_t direct_size =
|
size_t direct_size =
|
||||||
CompactibleFreeListSpace::adjustObjectSize(p->size());
|
CompactibleFreeListSpace::adjustObjectSize(p->size());
|
||||||
assert(size == direct_size, "Inconsistency in size");
|
assert(size == direct_size, "Inconsistency in size");
|
||||||
@ -6933,7 +6933,7 @@ size_t ScanMarkedObjectsAgainCarefullyClosure::do_object_careful_m(
|
|||||||
assert(_bitMap->isMarked(addr+size-1),
|
assert(_bitMap->isMarked(addr+size-1),
|
||||||
"inconsistent Printezis mark");
|
"inconsistent Printezis mark");
|
||||||
}
|
}
|
||||||
#endif // DEBUG
|
#endif // ASSERT
|
||||||
} else {
|
} else {
|
||||||
// an unitialized object
|
// an unitialized object
|
||||||
assert(_bitMap->isMarked(addr+1), "missing Printezis mark?");
|
assert(_bitMap->isMarked(addr+1), "missing Printezis mark?");
|
||||||
@ -7075,14 +7075,14 @@ bool ScanMarkedObjectsAgainClosure::do_object_bm(oop p, MemRegion mr) {
|
|||||||
HeapWord* addr = (HeapWord*)p;
|
HeapWord* addr = (HeapWord*)p;
|
||||||
assert(_span.contains(addr), "we are scanning the CMS generation");
|
assert(_span.contains(addr), "we are scanning the CMS generation");
|
||||||
bool is_obj_array = false;
|
bool is_obj_array = false;
|
||||||
#ifdef DEBUG
|
#ifdef ASSERT
|
||||||
if (!_parallel) {
|
if (!_parallel) {
|
||||||
assert(_mark_stack->isEmpty(), "pre-condition (eager drainage)");
|
assert(_mark_stack->isEmpty(), "pre-condition (eager drainage)");
|
||||||
assert(_collector->overflow_list_is_empty(),
|
assert(_collector->overflow_list_is_empty(),
|
||||||
"overflow list should be empty");
|
"overflow list should be empty");
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // DEBUG
|
#endif // ASSERT
|
||||||
if (_bit_map->isMarked(addr)) {
|
if (_bit_map->isMarked(addr)) {
|
||||||
// Obj arrays are precisely marked, non-arrays are not;
|
// Obj arrays are precisely marked, non-arrays are not;
|
||||||
// so we scan objArrays precisely and non-arrays in their
|
// so we scan objArrays precisely and non-arrays in their
|
||||||
@ -7102,14 +7102,14 @@ bool ScanMarkedObjectsAgainClosure::do_object_bm(oop p, MemRegion mr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef ASSERT
|
||||||
if (!_parallel) {
|
if (!_parallel) {
|
||||||
assert(_mark_stack->isEmpty(), "post-condition (eager drainage)");
|
assert(_mark_stack->isEmpty(), "post-condition (eager drainage)");
|
||||||
assert(_collector->overflow_list_is_empty(),
|
assert(_collector->overflow_list_is_empty(),
|
||||||
"overflow list should be empty");
|
"overflow list should be empty");
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif // DEBUG
|
#endif // ASSERT
|
||||||
return is_obj_array;
|
return is_obj_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8320,7 +8320,7 @@ size_t SweepClosure::do_live_chunk(FreeChunk* fc) {
|
|||||||
assert(size == CompactibleFreeListSpace::adjustObjectSize(size),
|
assert(size == CompactibleFreeListSpace::adjustObjectSize(size),
|
||||||
"alignment problem");
|
"alignment problem");
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef ASSERT
|
||||||
if (oop(addr)->klass_or_null() != NULL) {
|
if (oop(addr)->klass_or_null() != NULL) {
|
||||||
// Ignore mark word because we are running concurrent with mutators
|
// Ignore mark word because we are running concurrent with mutators
|
||||||
assert(oop(addr)->is_oop(true), "live block should be an oop");
|
assert(oop(addr)->is_oop(true), "live block should be an oop");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 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
|
||||||
@ -1322,234 +1322,240 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
|
|||||||
gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
|
gclog_or_tty->date_stamp(G1Log::fine() && PrintGCDateStamps);
|
||||||
TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
|
TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
|
||||||
|
|
||||||
TraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, gclog_or_tty);
|
|
||||||
TraceCollectorStats tcs(g1mm()->full_collection_counters());
|
|
||||||
TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
|
|
||||||
|
|
||||||
double start = os::elapsedTime();
|
|
||||||
g1_policy()->record_full_collection_start();
|
|
||||||
|
|
||||||
// Note: When we have a more flexible GC logging framework that
|
|
||||||
// allows us to add optional attributes to a GC log record we
|
|
||||||
// could consider timing and reporting how long we wait in the
|
|
||||||
// following two methods.
|
|
||||||
wait_while_free_regions_coming();
|
|
||||||
// If we start the compaction before the CM threads finish
|
|
||||||
// scanning the root regions we might trip them over as we'll
|
|
||||||
// be moving objects / updating references. So let's wait until
|
|
||||||
// they are done. By telling them to abort, they should complete
|
|
||||||
// early.
|
|
||||||
_cm->root_regions()->abort();
|
|
||||||
_cm->root_regions()->wait_until_scan_finished();
|
|
||||||
append_secondary_free_list_if_not_empty_with_lock();
|
|
||||||
|
|
||||||
gc_prologue(true);
|
|
||||||
increment_total_collections(true /* full gc */);
|
|
||||||
increment_old_marking_cycles_started();
|
|
||||||
|
|
||||||
size_t g1h_prev_used = used();
|
|
||||||
assert(used() == recalculate_used(), "Should be equal");
|
|
||||||
|
|
||||||
verify_before_gc();
|
|
||||||
|
|
||||||
pre_full_gc_dump();
|
|
||||||
|
|
||||||
COMPILER2_PRESENT(DerivedPointerTable::clear());
|
|
||||||
|
|
||||||
// Disable discovery and empty the discovered lists
|
|
||||||
// for the CM ref processor.
|
|
||||||
ref_processor_cm()->disable_discovery();
|
|
||||||
ref_processor_cm()->abandon_partial_discovery();
|
|
||||||
ref_processor_cm()->verify_no_references_recorded();
|
|
||||||
|
|
||||||
// Abandon current iterations of concurrent marking and concurrent
|
|
||||||
// refinement, if any are in progress. We have to do this before
|
|
||||||
// wait_until_scan_finished() below.
|
|
||||||
concurrent_mark()->abort();
|
|
||||||
|
|
||||||
// Make sure we'll choose a new allocation region afterwards.
|
|
||||||
release_mutator_alloc_region();
|
|
||||||
abandon_gc_alloc_regions();
|
|
||||||
g1_rem_set()->cleanupHRRS();
|
|
||||||
|
|
||||||
// We should call this after we retire any currently active alloc
|
|
||||||
// regions so that all the ALLOC / RETIRE events are generated
|
|
||||||
// before the start GC event.
|
|
||||||
_hr_printer.start_gc(true /* full */, (size_t) total_collections());
|
|
||||||
|
|
||||||
// We may have added regions to the current incremental collection
|
|
||||||
// set between the last GC or pause and now. We need to clear the
|
|
||||||
// incremental collection set and then start rebuilding it afresh
|
|
||||||
// after this full GC.
|
|
||||||
abandon_collection_set(g1_policy()->inc_cset_head());
|
|
||||||
g1_policy()->clear_incremental_cset();
|
|
||||||
g1_policy()->stop_incremental_cset_building();
|
|
||||||
|
|
||||||
tear_down_region_sets(false /* free_list_only */);
|
|
||||||
g1_policy()->set_gcs_are_young(true);
|
|
||||||
|
|
||||||
// See the comments in g1CollectedHeap.hpp and
|
|
||||||
// G1CollectedHeap::ref_processing_init() about
|
|
||||||
// how reference processing currently works in G1.
|
|
||||||
|
|
||||||
// Temporarily make discovery by the STW ref processor single threaded (non-MT).
|
|
||||||
ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
|
|
||||||
|
|
||||||
// Temporarily clear the STW ref processor's _is_alive_non_header field.
|
|
||||||
ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
|
|
||||||
|
|
||||||
ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
|
|
||||||
ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
|
|
||||||
|
|
||||||
// Do collection work
|
|
||||||
{
|
{
|
||||||
HandleMark hm; // Discard invalid handles created during gc
|
TraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, gclog_or_tty);
|
||||||
G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
|
TraceCollectorStats tcs(g1mm()->full_collection_counters());
|
||||||
}
|
TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
|
||||||
|
|
||||||
assert(free_regions() == 0, "we should not have added any free regions");
|
double start = os::elapsedTime();
|
||||||
rebuild_region_sets(false /* free_list_only */);
|
g1_policy()->record_full_collection_start();
|
||||||
|
|
||||||
// Enqueue any discovered reference objects that have
|
// Note: When we have a more flexible GC logging framework that
|
||||||
// not been removed from the discovered lists.
|
// allows us to add optional attributes to a GC log record we
|
||||||
ref_processor_stw()->enqueue_discovered_references();
|
// could consider timing and reporting how long we wait in the
|
||||||
|
// following two methods.
|
||||||
|
wait_while_free_regions_coming();
|
||||||
|
// If we start the compaction before the CM threads finish
|
||||||
|
// scanning the root regions we might trip them over as we'll
|
||||||
|
// be moving objects / updating references. So let's wait until
|
||||||
|
// they are done. By telling them to abort, they should complete
|
||||||
|
// early.
|
||||||
|
_cm->root_regions()->abort();
|
||||||
|
_cm->root_regions()->wait_until_scan_finished();
|
||||||
|
append_secondary_free_list_if_not_empty_with_lock();
|
||||||
|
|
||||||
COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
|
gc_prologue(true);
|
||||||
|
increment_total_collections(true /* full gc */);
|
||||||
|
increment_old_marking_cycles_started();
|
||||||
|
|
||||||
MemoryService::track_memory_usage();
|
assert(used() == recalculate_used(), "Should be equal");
|
||||||
|
|
||||||
verify_after_gc();
|
verify_before_gc();
|
||||||
|
|
||||||
assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
|
pre_full_gc_dump();
|
||||||
ref_processor_stw()->verify_no_references_recorded();
|
|
||||||
|
|
||||||
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
|
COMPILER2_PRESENT(DerivedPointerTable::clear());
|
||||||
ClassLoaderDataGraph::purge();
|
|
||||||
|
|
||||||
// Note: since we've just done a full GC, concurrent
|
// Disable discovery and empty the discovered lists
|
||||||
// marking is no longer active. Therefore we need not
|
// for the CM ref processor.
|
||||||
// re-enable reference discovery for the CM ref processor.
|
ref_processor_cm()->disable_discovery();
|
||||||
// That will be done at the start of the next marking cycle.
|
ref_processor_cm()->abandon_partial_discovery();
|
||||||
assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
|
ref_processor_cm()->verify_no_references_recorded();
|
||||||
ref_processor_cm()->verify_no_references_recorded();
|
|
||||||
|
|
||||||
reset_gc_time_stamp();
|
// Abandon current iterations of concurrent marking and concurrent
|
||||||
// Since everything potentially moved, we will clear all remembered
|
// refinement, if any are in progress. We have to do this before
|
||||||
// sets, and clear all cards. Later we will rebuild remebered
|
// wait_until_scan_finished() below.
|
||||||
// sets. We will also reset the GC time stamps of the regions.
|
concurrent_mark()->abort();
|
||||||
clear_rsets_post_compaction();
|
|
||||||
check_gc_time_stamps();
|
|
||||||
|
|
||||||
// Resize the heap if necessary.
|
// Make sure we'll choose a new allocation region afterwards.
|
||||||
resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
|
release_mutator_alloc_region();
|
||||||
|
abandon_gc_alloc_regions();
|
||||||
|
g1_rem_set()->cleanupHRRS();
|
||||||
|
|
||||||
if (_hr_printer.is_active()) {
|
// We should call this after we retire any currently active alloc
|
||||||
// We should do this after we potentially resize the heap so
|
// regions so that all the ALLOC / RETIRE events are generated
|
||||||
// that all the COMMIT / UNCOMMIT events are generated before
|
// before the start GC event.
|
||||||
// the end GC event.
|
_hr_printer.start_gc(true /* full */, (size_t) total_collections());
|
||||||
|
|
||||||
print_hrs_post_compaction();
|
// We may have added regions to the current incremental collection
|
||||||
_hr_printer.end_gc(true /* full */, (size_t) total_collections());
|
// set between the last GC or pause and now. We need to clear the
|
||||||
}
|
// incremental collection set and then start rebuilding it afresh
|
||||||
|
// after this full GC.
|
||||||
|
abandon_collection_set(g1_policy()->inc_cset_head());
|
||||||
|
g1_policy()->clear_incremental_cset();
|
||||||
|
g1_policy()->stop_incremental_cset_building();
|
||||||
|
|
||||||
if (_cg1r->use_cache()) {
|
tear_down_region_sets(false /* free_list_only */);
|
||||||
_cg1r->clear_and_record_card_counts();
|
g1_policy()->set_gcs_are_young(true);
|
||||||
_cg1r->clear_hot_cache();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rebuild remembered sets of all regions.
|
// See the comments in g1CollectedHeap.hpp and
|
||||||
if (G1CollectedHeap::use_parallel_gc_threads()) {
|
// G1CollectedHeap::ref_processing_init() about
|
||||||
uint n_workers =
|
// how reference processing currently works in G1.
|
||||||
AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
|
|
||||||
workers()->active_workers(),
|
|
||||||
Threads::number_of_non_daemon_threads());
|
|
||||||
assert(UseDynamicNumberOfGCThreads ||
|
|
||||||
n_workers == workers()->total_workers(),
|
|
||||||
"If not dynamic should be using all the workers");
|
|
||||||
workers()->set_active_workers(n_workers);
|
|
||||||
// Set parallel threads in the heap (_n_par_threads) only
|
|
||||||
// before a parallel phase and always reset it to 0 after
|
|
||||||
// the phase so that the number of parallel threads does
|
|
||||||
// no get carried forward to a serial phase where there
|
|
||||||
// may be code that is "possibly_parallel".
|
|
||||||
set_par_threads(n_workers);
|
|
||||||
|
|
||||||
ParRebuildRSTask rebuild_rs_task(this);
|
// Temporarily make discovery by the STW ref processor single threaded (non-MT).
|
||||||
assert(check_heap_region_claim_values(
|
ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
|
||||||
HeapRegion::InitialClaimValue), "sanity check");
|
|
||||||
assert(UseDynamicNumberOfGCThreads ||
|
|
||||||
workers()->active_workers() == workers()->total_workers(),
|
|
||||||
"Unless dynamic should use total workers");
|
|
||||||
// Use the most recent number of active workers
|
|
||||||
assert(workers()->active_workers() > 0,
|
|
||||||
"Active workers not properly set");
|
|
||||||
set_par_threads(workers()->active_workers());
|
|
||||||
workers()->run_task(&rebuild_rs_task);
|
|
||||||
set_par_threads(0);
|
|
||||||
assert(check_heap_region_claim_values(
|
|
||||||
HeapRegion::RebuildRSClaimValue), "sanity check");
|
|
||||||
reset_heap_region_claim_values();
|
|
||||||
} else {
|
|
||||||
RebuildRSOutOfRegionClosure rebuild_rs(this);
|
|
||||||
heap_region_iterate(&rebuild_rs);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (G1Log::fine()) {
|
// Temporarily clear the STW ref processor's _is_alive_non_header field.
|
||||||
print_size_transition(gclog_or_tty, g1h_prev_used, used(), capacity());
|
ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
|
||||||
}
|
|
||||||
|
|
||||||
if (true) { // FIXME
|
ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
|
||||||
MetaspaceGC::compute_new_size();
|
ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
|
||||||
}
|
|
||||||
|
|
||||||
// Start a new incremental collection set for the next pause
|
// Do collection work
|
||||||
assert(g1_policy()->collection_set() == NULL, "must be");
|
{
|
||||||
g1_policy()->start_incremental_cset_building();
|
HandleMark hm; // Discard invalid handles created during gc
|
||||||
|
G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
|
||||||
|
}
|
||||||
|
|
||||||
// Clear the _cset_fast_test bitmap in anticipation of adding
|
assert(free_regions() == 0, "we should not have added any free regions");
|
||||||
// regions to the incremental collection set for the next
|
rebuild_region_sets(false /* free_list_only */);
|
||||||
// evacuation pause.
|
|
||||||
clear_cset_fast_test();
|
|
||||||
|
|
||||||
init_mutator_alloc_region();
|
// Enqueue any discovered reference objects that have
|
||||||
|
// not been removed from the discovered lists.
|
||||||
|
ref_processor_stw()->enqueue_discovered_references();
|
||||||
|
|
||||||
double end = os::elapsedTime();
|
COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
|
||||||
g1_policy()->record_full_collection_end();
|
|
||||||
|
MemoryService::track_memory_usage();
|
||||||
|
|
||||||
|
verify_after_gc();
|
||||||
|
|
||||||
|
assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
|
||||||
|
ref_processor_stw()->verify_no_references_recorded();
|
||||||
|
|
||||||
|
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
|
||||||
|
ClassLoaderDataGraph::purge();
|
||||||
|
|
||||||
|
// Note: since we've just done a full GC, concurrent
|
||||||
|
// marking is no longer active. Therefore we need not
|
||||||
|
// re-enable reference discovery for the CM ref processor.
|
||||||
|
// That will be done at the start of the next marking cycle.
|
||||||
|
assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
|
||||||
|
ref_processor_cm()->verify_no_references_recorded();
|
||||||
|
|
||||||
|
reset_gc_time_stamp();
|
||||||
|
// Since everything potentially moved, we will clear all remembered
|
||||||
|
// sets, and clear all cards. Later we will rebuild remebered
|
||||||
|
// sets. We will also reset the GC time stamps of the regions.
|
||||||
|
clear_rsets_post_compaction();
|
||||||
|
check_gc_time_stamps();
|
||||||
|
|
||||||
|
// Resize the heap if necessary.
|
||||||
|
resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
|
||||||
|
|
||||||
|
if (_hr_printer.is_active()) {
|
||||||
|
// We should do this after we potentially resize the heap so
|
||||||
|
// that all the COMMIT / UNCOMMIT events are generated before
|
||||||
|
// the end GC event.
|
||||||
|
|
||||||
|
print_hrs_post_compaction();
|
||||||
|
_hr_printer.end_gc(true /* full */, (size_t) total_collections());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_cg1r->use_cache()) {
|
||||||
|
_cg1r->clear_and_record_card_counts();
|
||||||
|
_cg1r->clear_hot_cache();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rebuild remembered sets of all regions.
|
||||||
|
if (G1CollectedHeap::use_parallel_gc_threads()) {
|
||||||
|
uint n_workers =
|
||||||
|
AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
|
||||||
|
workers()->active_workers(),
|
||||||
|
Threads::number_of_non_daemon_threads());
|
||||||
|
assert(UseDynamicNumberOfGCThreads ||
|
||||||
|
n_workers == workers()->total_workers(),
|
||||||
|
"If not dynamic should be using all the workers");
|
||||||
|
workers()->set_active_workers(n_workers);
|
||||||
|
// Set parallel threads in the heap (_n_par_threads) only
|
||||||
|
// before a parallel phase and always reset it to 0 after
|
||||||
|
// the phase so that the number of parallel threads does
|
||||||
|
// no get carried forward to a serial phase where there
|
||||||
|
// may be code that is "possibly_parallel".
|
||||||
|
set_par_threads(n_workers);
|
||||||
|
|
||||||
|
ParRebuildRSTask rebuild_rs_task(this);
|
||||||
|
assert(check_heap_region_claim_values(
|
||||||
|
HeapRegion::InitialClaimValue), "sanity check");
|
||||||
|
assert(UseDynamicNumberOfGCThreads ||
|
||||||
|
workers()->active_workers() == workers()->total_workers(),
|
||||||
|
"Unless dynamic should use total workers");
|
||||||
|
// Use the most recent number of active workers
|
||||||
|
assert(workers()->active_workers() > 0,
|
||||||
|
"Active workers not properly set");
|
||||||
|
set_par_threads(workers()->active_workers());
|
||||||
|
workers()->run_task(&rebuild_rs_task);
|
||||||
|
set_par_threads(0);
|
||||||
|
assert(check_heap_region_claim_values(
|
||||||
|
HeapRegion::RebuildRSClaimValue), "sanity check");
|
||||||
|
reset_heap_region_claim_values();
|
||||||
|
} else {
|
||||||
|
RebuildRSOutOfRegionClosure rebuild_rs(this);
|
||||||
|
heap_region_iterate(&rebuild_rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (true) { // FIXME
|
||||||
|
MetaspaceGC::compute_new_size();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TRACESPINNING
|
#ifdef TRACESPINNING
|
||||||
ParallelTaskTerminator::print_termination_counts();
|
ParallelTaskTerminator::print_termination_counts();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
gc_epilogue(true);
|
// Discard all rset updates
|
||||||
|
JavaThread::dirty_card_queue_set().abandon_logs();
|
||||||
|
assert(!G1DeferredRSUpdate
|
||||||
|
|| (G1DeferredRSUpdate &&
|
||||||
|
(dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
|
||||||
|
|
||||||
// Discard all rset updates
|
_young_list->reset_sampled_info();
|
||||||
JavaThread::dirty_card_queue_set().abandon_logs();
|
// At this point there should be no regions in the
|
||||||
assert(!G1DeferredRSUpdate
|
// entire heap tagged as young.
|
||||||
|| (G1DeferredRSUpdate && (dirty_card_queue_set().completed_buffers_num() == 0)), "Should not be any");
|
assert(check_young_list_empty(true /* check_heap */),
|
||||||
|
"young list should be empty at this point");
|
||||||
|
|
||||||
_young_list->reset_sampled_info();
|
// Update the number of full collections that have been completed.
|
||||||
// At this point there should be no regions in the
|
increment_old_marking_cycles_completed(false /* concurrent */);
|
||||||
// entire heap tagged as young.
|
|
||||||
assert( check_young_list_empty(true /* check_heap */),
|
|
||||||
"young list should be empty at this point");
|
|
||||||
|
|
||||||
// Update the number of full collections that have been completed.
|
_hrs.verify_optional();
|
||||||
increment_old_marking_cycles_completed(false /* concurrent */);
|
verify_region_sets_optional();
|
||||||
|
|
||||||
_hrs.verify_optional();
|
// Start a new incremental collection set for the next pause
|
||||||
verify_region_sets_optional();
|
assert(g1_policy()->collection_set() == NULL, "must be");
|
||||||
|
g1_policy()->start_incremental_cset_building();
|
||||||
|
|
||||||
|
// Clear the _cset_fast_test bitmap in anticipation of adding
|
||||||
|
// regions to the incremental collection set for the next
|
||||||
|
// evacuation pause.
|
||||||
|
clear_cset_fast_test();
|
||||||
|
|
||||||
|
init_mutator_alloc_region();
|
||||||
|
|
||||||
|
double end = os::elapsedTime();
|
||||||
|
g1_policy()->record_full_collection_end();
|
||||||
|
|
||||||
|
if (G1Log::fine()) {
|
||||||
|
g1_policy()->print_heap_transition();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We must call G1MonitoringSupport::update_sizes() in the same scoping level
|
||||||
|
// as an active TraceMemoryManagerStats object (i.e. before the destructor for the
|
||||||
|
// TraceMemoryManagerStats is called) so that the G1 memory pools are updated
|
||||||
|
// before any GC notifications are raised.
|
||||||
|
g1mm()->update_sizes();
|
||||||
|
|
||||||
|
gc_epilogue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (G1Log::finer()) {
|
||||||
|
g1_policy()->print_detailed_heap_transition();
|
||||||
|
}
|
||||||
|
|
||||||
print_heap_after_gc();
|
print_heap_after_gc();
|
||||||
|
|
||||||
// We must call G1MonitoringSupport::update_sizes() in the same scoping level
|
post_full_gc_dump();
|
||||||
// as an active TraceMemoryManagerStats object (i.e. before the destructor for the
|
|
||||||
// TraceMemoryManagerStats is called) so that the G1 memory pools are updated
|
|
||||||
// before any GC notifications are raised.
|
|
||||||
g1mm()->update_sizes();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
post_full_gc_dump();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3838,7 +3844,6 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
|
|||||||
// The elapsed time induced by the start time below deliberately elides
|
// The elapsed time induced by the start time below deliberately elides
|
||||||
// the possible verification above.
|
// the possible verification above.
|
||||||
double sample_start_time_sec = os::elapsedTime();
|
double sample_start_time_sec = os::elapsedTime();
|
||||||
size_t start_used_bytes = used();
|
|
||||||
|
|
||||||
#if YOUNG_LIST_VERBOSE
|
#if YOUNG_LIST_VERBOSE
|
||||||
gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
|
gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
|
||||||
@ -3846,8 +3851,7 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
|
|||||||
g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
|
g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
|
||||||
#endif // YOUNG_LIST_VERBOSE
|
#endif // YOUNG_LIST_VERBOSE
|
||||||
|
|
||||||
g1_policy()->record_collection_pause_start(sample_start_time_sec,
|
g1_policy()->record_collection_pause_start(sample_start_time_sec);
|
||||||
start_used_bytes);
|
|
||||||
|
|
||||||
double scan_wait_start = os::elapsedTime();
|
double scan_wait_start = os::elapsedTime();
|
||||||
// We have to wait until the CM threads finish scanning the
|
// We have to wait until the CM threads finish scanning the
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 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
|
||||||
@ -406,7 +406,6 @@ void G1CollectorPolicy::init() {
|
|||||||
}
|
}
|
||||||
_free_regions_at_end_of_collection = _g1->free_regions();
|
_free_regions_at_end_of_collection = _g1->free_regions();
|
||||||
update_young_list_target_length();
|
update_young_list_target_length();
|
||||||
_prev_eden_capacity = _young_list_target_length * HeapRegion::GrainBytes;
|
|
||||||
|
|
||||||
// We may immediately start allocating regions and placing them on the
|
// We may immediately start allocating regions and placing them on the
|
||||||
// collection set list. Initialize the per-collection set info
|
// collection set list. Initialize the per-collection set info
|
||||||
@ -746,6 +745,7 @@ G1CollectorPolicy::verify_young_ages(HeapRegion* head,
|
|||||||
|
|
||||||
void G1CollectorPolicy::record_full_collection_start() {
|
void G1CollectorPolicy::record_full_collection_start() {
|
||||||
_full_collection_start_sec = os::elapsedTime();
|
_full_collection_start_sec = os::elapsedTime();
|
||||||
|
record_heap_size_info_at_start();
|
||||||
// Release the future to-space so that it is available for compaction into.
|
// Release the future to-space so that it is available for compaction into.
|
||||||
_g1->set_full_collection();
|
_g1->set_full_collection();
|
||||||
}
|
}
|
||||||
@ -788,8 +788,7 @@ void G1CollectorPolicy::record_stop_world_start() {
|
|||||||
_stop_world_start = os::elapsedTime();
|
_stop_world_start = os::elapsedTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
|
void G1CollectorPolicy::record_collection_pause_start(double start_time_sec) {
|
||||||
size_t start_used) {
|
|
||||||
// We only need to do this here as the policy will only be applied
|
// We only need to do this here as the policy will only be applied
|
||||||
// to the GC we're about to start. so, no point is calculating this
|
// to the GC we're about to start. so, no point is calculating this
|
||||||
// every time we calculate / recalculate the target young length.
|
// every time we calculate / recalculate the target young length.
|
||||||
@ -803,19 +802,14 @@ void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
|
|||||||
_trace_gen0_time_data.record_start_collection(s_w_t_ms);
|
_trace_gen0_time_data.record_start_collection(s_w_t_ms);
|
||||||
_stop_world_start = 0.0;
|
_stop_world_start = 0.0;
|
||||||
|
|
||||||
|
record_heap_size_info_at_start();
|
||||||
|
|
||||||
phase_times()->record_cur_collection_start_sec(start_time_sec);
|
phase_times()->record_cur_collection_start_sec(start_time_sec);
|
||||||
_cur_collection_pause_used_at_start_bytes = start_used;
|
|
||||||
_cur_collection_pause_used_regions_at_start = _g1->used_regions();
|
|
||||||
_pending_cards = _g1->pending_card_num();
|
_pending_cards = _g1->pending_card_num();
|
||||||
|
|
||||||
_collection_set_bytes_used_before = 0;
|
_collection_set_bytes_used_before = 0;
|
||||||
_bytes_copied_during_gc = 0;
|
_bytes_copied_during_gc = 0;
|
||||||
|
|
||||||
YoungList* young_list = _g1->young_list();
|
|
||||||
_eden_bytes_before_gc = young_list->eden_used_bytes();
|
|
||||||
_survivor_bytes_before_gc = young_list->survivor_used_bytes();
|
|
||||||
_capacity_before_gc = _g1->capacity();
|
|
||||||
|
|
||||||
_last_gc_was_young = false;
|
_last_gc_was_young = false;
|
||||||
|
|
||||||
// do that for any other surv rate groups
|
// do that for any other surv rate groups
|
||||||
@ -1153,6 +1147,21 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms) {
|
|||||||
byte_size_in_proper_unit((double)(bytes)), \
|
byte_size_in_proper_unit((double)(bytes)), \
|
||||||
proper_unit_for_byte_size((bytes))
|
proper_unit_for_byte_size((bytes))
|
||||||
|
|
||||||
|
void G1CollectorPolicy::record_heap_size_info_at_start() {
|
||||||
|
YoungList* young_list = _g1->young_list();
|
||||||
|
_eden_bytes_before_gc = young_list->eden_used_bytes();
|
||||||
|
_survivor_bytes_before_gc = young_list->survivor_used_bytes();
|
||||||
|
_capacity_before_gc = _g1->capacity();
|
||||||
|
|
||||||
|
_cur_collection_pause_used_at_start_bytes = _g1->used();
|
||||||
|
_cur_collection_pause_used_regions_at_start = _g1->used_regions();
|
||||||
|
|
||||||
|
size_t eden_capacity_before_gc =
|
||||||
|
(_young_list_target_length * HeapRegion::GrainBytes) - _survivor_bytes_before_gc;
|
||||||
|
|
||||||
|
_prev_eden_capacity = eden_capacity_before_gc;
|
||||||
|
}
|
||||||
|
|
||||||
void G1CollectorPolicy::print_heap_transition() {
|
void G1CollectorPolicy::print_heap_transition() {
|
||||||
_g1->print_size_transition(gclog_or_tty,
|
_g1->print_size_transition(gclog_or_tty,
|
||||||
_cur_collection_pause_used_at_start_bytes, _g1->used(), _g1->capacity());
|
_cur_collection_pause_used_at_start_bytes, _g1->used(), _g1->capacity());
|
||||||
@ -1183,8 +1192,6 @@ void G1CollectorPolicy::print_detailed_heap_transition() {
|
|||||||
EXT_SIZE_PARAMS(_capacity_before_gc),
|
EXT_SIZE_PARAMS(_capacity_before_gc),
|
||||||
EXT_SIZE_PARAMS(used),
|
EXT_SIZE_PARAMS(used),
|
||||||
EXT_SIZE_PARAMS(capacity));
|
EXT_SIZE_PARAMS(capacity));
|
||||||
|
|
||||||
_prev_eden_capacity = eden_capacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
|
void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2001, 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
|
||||||
@ -671,34 +671,36 @@ public:
|
|||||||
|
|
||||||
bool need_to_start_conc_mark(const char* source, size_t alloc_word_size = 0);
|
bool need_to_start_conc_mark(const char* source, size_t alloc_word_size = 0);
|
||||||
|
|
||||||
// Update the heuristic info to record a collection pause of the given
|
// Record the start and end of an evacuation pause.
|
||||||
// start time, where the given number of bytes were used at the start.
|
void record_collection_pause_start(double start_time_sec);
|
||||||
// This may involve changing the desired size of a collection set.
|
void record_collection_pause_end(double pause_time_ms);
|
||||||
|
|
||||||
void record_stop_world_start();
|
// Record the start and end of a full collection.
|
||||||
|
void record_full_collection_start();
|
||||||
void record_collection_pause_start(double start_time_sec, size_t start_used);
|
void record_full_collection_end();
|
||||||
|
|
||||||
// Must currently be called while the world is stopped.
|
// Must currently be called while the world is stopped.
|
||||||
void record_concurrent_mark_init_end(double
|
void record_concurrent_mark_init_end(double mark_init_elapsed_time_ms);
|
||||||
mark_init_elapsed_time_ms);
|
|
||||||
|
|
||||||
|
// Record start and end of remark.
|
||||||
void record_concurrent_mark_remark_start();
|
void record_concurrent_mark_remark_start();
|
||||||
void record_concurrent_mark_remark_end();
|
void record_concurrent_mark_remark_end();
|
||||||
|
|
||||||
|
// Record start, end, and completion of cleanup.
|
||||||
void record_concurrent_mark_cleanup_start();
|
void record_concurrent_mark_cleanup_start();
|
||||||
void record_concurrent_mark_cleanup_end(int no_of_gc_threads);
|
void record_concurrent_mark_cleanup_end(int no_of_gc_threads);
|
||||||
void record_concurrent_mark_cleanup_completed();
|
void record_concurrent_mark_cleanup_completed();
|
||||||
|
|
||||||
void record_concurrent_pause();
|
// Records the information about the heap size for reporting in
|
||||||
|
// print_detailed_heap_transition
|
||||||
|
void record_heap_size_info_at_start();
|
||||||
|
|
||||||
void record_collection_pause_end(double pause_time);
|
// Print heap sizing transition (with less and more detail).
|
||||||
void print_heap_transition();
|
void print_heap_transition();
|
||||||
void print_detailed_heap_transition();
|
void print_detailed_heap_transition();
|
||||||
|
|
||||||
// Record the fact that a full collection occurred.
|
void record_stop_world_start();
|
||||||
void record_full_collection_start();
|
void record_concurrent_pause();
|
||||||
void record_full_collection_end();
|
|
||||||
|
|
||||||
// Record how much space we copied during a GC. This is typically
|
// Record how much space we copied during a GC. This is typically
|
||||||
// called when a GC alloc region is being retired.
|
// called when a GC alloc region is being retired.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -454,7 +454,7 @@ IRT_ENTRY(address, InterpreterRuntime::exception_handler_for_exception(JavaThrea
|
|||||||
continuation = Interpreter::remove_activation_entry();
|
continuation = Interpreter::remove_activation_entry();
|
||||||
#endif
|
#endif
|
||||||
// Count this for compilation purposes
|
// Count this for compilation purposes
|
||||||
h_method->interpreter_throwout_increment();
|
h_method->interpreter_throwout_increment(THREAD);
|
||||||
} else {
|
} else {
|
||||||
// handler in this method => change bci/bcp to handler bci/bcp and continue there
|
// handler in this method => change bci/bcp to handler bci/bcp and continue there
|
||||||
handler_pc = h_method->code_base() + handler_bci;
|
handler_pc = h_method->code_base() + handler_bci;
|
||||||
@ -903,6 +903,15 @@ IRT_ENTRY(void, InterpreterRuntime::update_mdp_for_ret(JavaThread* thread, int r
|
|||||||
fr.interpreter_frame_set_mdp(new_mdp);
|
fr.interpreter_frame_set_mdp(new_mdp);
|
||||||
IRT_END
|
IRT_END
|
||||||
|
|
||||||
|
IRT_ENTRY(MethodCounters*, InterpreterRuntime::build_method_counters(JavaThread* thread, Method* m))
|
||||||
|
MethodCounters* mcs = Method::build_method_counters(m, thread);
|
||||||
|
if (HAS_PENDING_EXCEPTION) {
|
||||||
|
assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
|
||||||
|
CLEAR_PENDING_EXCEPTION;
|
||||||
|
}
|
||||||
|
return mcs;
|
||||||
|
IRT_END
|
||||||
|
|
||||||
|
|
||||||
IRT_ENTRY(void, InterpreterRuntime::at_safepoint(JavaThread* thread))
|
IRT_ENTRY(void, InterpreterRuntime::at_safepoint(JavaThread* thread))
|
||||||
// We used to need an explict preserve_arguments here for invoke bytecodes. However,
|
// We used to need an explict preserve_arguments here for invoke bytecodes. However,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -169,6 +169,7 @@ class InterpreterRuntime: AllStatic {
|
|||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
static void verify_mdp(Method* method, address bcp, address mdp);
|
static void verify_mdp(Method* method, address bcp, address mdp);
|
||||||
#endif // ASSERT
|
#endif // ASSERT
|
||||||
|
static MethodCounters* build_method_counters(JavaThread* thread, Method* m);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 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
|
||||||
@ -104,15 +104,19 @@ const char* InvocationCounter::state_as_short_string(State state) {
|
|||||||
|
|
||||||
static address do_nothing(methodHandle method, TRAPS) {
|
static address do_nothing(methodHandle method, TRAPS) {
|
||||||
// dummy action for inactive invocation counters
|
// dummy action for inactive invocation counters
|
||||||
method->invocation_counter()->set_carry();
|
MethodCounters* mcs = method->method_counters();
|
||||||
method->invocation_counter()->set_state(InvocationCounter::wait_for_nothing);
|
assert(mcs != NULL, "");
|
||||||
|
mcs->invocation_counter()->set_carry();
|
||||||
|
mcs->invocation_counter()->set_state(InvocationCounter::wait_for_nothing);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static address do_decay(methodHandle method, TRAPS) {
|
static address do_decay(methodHandle method, TRAPS) {
|
||||||
// decay invocation counters so compilation gets delayed
|
// decay invocation counters so compilation gets delayed
|
||||||
method->invocation_counter()->decay();
|
MethodCounters* mcs = method->method_counters();
|
||||||
|
assert(mcs != NULL, "");
|
||||||
|
mcs->invocation_counter()->decay();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ const bool NMT_track_callsite = false;
|
|||||||
#endif // INCLUDE_NMT
|
#endif // INCLUDE_NMT
|
||||||
|
|
||||||
// debug build does not inline
|
// debug build does not inline
|
||||||
#if defined(_DEBUG_)
|
#if defined(_NMT_NOINLINE_)
|
||||||
#define CURRENT_PC (NMT_track_callsite ? os::get_caller_pc(1) : 0)
|
#define CURRENT_PC (NMT_track_callsite ? os::get_caller_pc(1) : 0)
|
||||||
#define CALLER_PC (NMT_track_callsite ? os::get_caller_pc(2) : 0)
|
#define CALLER_PC (NMT_track_callsite ? os::get_caller_pc(2) : 0)
|
||||||
#define CALLER_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(3) : 0)
|
#define CALLER_CALLER_PC (NMT_track_callsite ? os::get_caller_pc(3) : 0)
|
||||||
|
@ -42,7 +42,7 @@ CodeHeap::CodeHeap() {
|
|||||||
_log2_segment_size = 0;
|
_log2_segment_size = 0;
|
||||||
_next_segment = 0;
|
_next_segment = 0;
|
||||||
_freelist = NULL;
|
_freelist = NULL;
|
||||||
_free_segments = 0;
|
_freelist_segments = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -115,8 +115,8 @@ bool CodeHeap::reserve(size_t reserved_size, size_t committed_size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
on_code_mapping(_memory.low(), _memory.committed_size());
|
on_code_mapping(_memory.low(), _memory.committed_size());
|
||||||
_number_of_committed_segments = number_of_segments(_memory.committed_size());
|
_number_of_committed_segments = size_to_segments(_memory.committed_size());
|
||||||
_number_of_reserved_segments = number_of_segments(_memory.reserved_size());
|
_number_of_reserved_segments = size_to_segments(_memory.reserved_size());
|
||||||
assert(_number_of_reserved_segments >= _number_of_committed_segments, "just checking");
|
assert(_number_of_reserved_segments >= _number_of_committed_segments, "just checking");
|
||||||
|
|
||||||
// reserve space for _segmap
|
// reserve space for _segmap
|
||||||
@ -149,8 +149,8 @@ bool CodeHeap::expand_by(size_t size) {
|
|||||||
if (!_memory.expand_by(dm)) return false;
|
if (!_memory.expand_by(dm)) return false;
|
||||||
on_code_mapping(base, dm);
|
on_code_mapping(base, dm);
|
||||||
size_t i = _number_of_committed_segments;
|
size_t i = _number_of_committed_segments;
|
||||||
_number_of_committed_segments = number_of_segments(_memory.committed_size());
|
_number_of_committed_segments = size_to_segments(_memory.committed_size());
|
||||||
assert(_number_of_reserved_segments == number_of_segments(_memory.reserved_size()), "number of reserved segments should not change");
|
assert(_number_of_reserved_segments == size_to_segments(_memory.reserved_size()), "number of reserved segments should not change");
|
||||||
assert(_number_of_reserved_segments >= _number_of_committed_segments, "just checking");
|
assert(_number_of_reserved_segments >= _number_of_committed_segments, "just checking");
|
||||||
// expand _segmap space
|
// expand _segmap space
|
||||||
size_t ds = align_to_page_size(_number_of_committed_segments) - _segmap.committed_size();
|
size_t ds = align_to_page_size(_number_of_committed_segments) - _segmap.committed_size();
|
||||||
@ -176,33 +176,44 @@ void CodeHeap::clear() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void* CodeHeap::allocate(size_t size) {
|
void* CodeHeap::allocate(size_t instance_size, bool is_critical) {
|
||||||
size_t length = number_of_segments(size + sizeof(HeapBlock));
|
size_t number_of_segments = size_to_segments(instance_size + sizeof(HeapBlock));
|
||||||
assert(length *_segment_size >= sizeof(FreeBlock), "not enough room for FreeList");
|
assert(segments_to_size(number_of_segments) >= sizeof(FreeBlock), "not enough room for FreeList");
|
||||||
|
|
||||||
// First check if we can satify request from freelist
|
// First check if we can satify request from freelist
|
||||||
debug_only(verify());
|
debug_only(verify());
|
||||||
HeapBlock* block = search_freelist(length);
|
HeapBlock* block = search_freelist(number_of_segments, is_critical);
|
||||||
debug_only(if (VerifyCodeCacheOften) verify());
|
debug_only(if (VerifyCodeCacheOften) verify());
|
||||||
if (block != NULL) {
|
if (block != NULL) {
|
||||||
assert(block->length() >= length && block->length() < length + CodeCacheMinBlockLength, "sanity check");
|
assert(block->length() >= number_of_segments && block->length() < number_of_segments + CodeCacheMinBlockLength, "sanity check");
|
||||||
assert(!block->free(), "must be marked free");
|
assert(!block->free(), "must be marked free");
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
memset((void *)block->allocated_space(), badCodeHeapNewVal, size);
|
memset((void *)block->allocated_space(), badCodeHeapNewVal, instance_size);
|
||||||
#endif
|
#endif
|
||||||
return block->allocated_space();
|
return block->allocated_space();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (length < CodeCacheMinBlockLength) {
|
// Ensure minimum size for allocation to the heap.
|
||||||
length = CodeCacheMinBlockLength;
|
if (number_of_segments < CodeCacheMinBlockLength) {
|
||||||
|
number_of_segments = CodeCacheMinBlockLength;
|
||||||
}
|
}
|
||||||
if (_next_segment + length <= _number_of_committed_segments) {
|
|
||||||
mark_segmap_as_used(_next_segment, _next_segment + length);
|
if (!is_critical) {
|
||||||
|
// Make sure the allocation fits in the unallocated heap without using
|
||||||
|
// the CodeCacheMimimumFreeSpace that is reserved for critical allocations.
|
||||||
|
if (segments_to_size(number_of_segments) > (heap_unallocated_capacity() - CodeCacheMinimumFreeSpace)) {
|
||||||
|
// Fail allocation
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_next_segment + number_of_segments <= _number_of_committed_segments) {
|
||||||
|
mark_segmap_as_used(_next_segment, _next_segment + number_of_segments);
|
||||||
HeapBlock* b = block_at(_next_segment);
|
HeapBlock* b = block_at(_next_segment);
|
||||||
b->initialize(length);
|
b->initialize(number_of_segments);
|
||||||
_next_segment += length;
|
_next_segment += number_of_segments;
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
memset((void *)b->allocated_space(), badCodeHeapNewVal, size);
|
memset((void *)b->allocated_space(), badCodeHeapNewVal, instance_size);
|
||||||
#endif
|
#endif
|
||||||
return b->allocated_space();
|
return b->allocated_space();
|
||||||
} else {
|
} else {
|
||||||
@ -219,7 +230,7 @@ void CodeHeap::deallocate(void* p) {
|
|||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
memset((void *)b->allocated_space(),
|
memset((void *)b->allocated_space(),
|
||||||
badCodeHeapFreeVal,
|
badCodeHeapFreeVal,
|
||||||
size(b->length()) - sizeof(HeapBlock));
|
segments_to_size(b->length()) - sizeof(HeapBlock));
|
||||||
#endif
|
#endif
|
||||||
add_to_freelist(b);
|
add_to_freelist(b);
|
||||||
|
|
||||||
@ -299,32 +310,14 @@ size_t CodeHeap::max_capacity() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t CodeHeap::allocated_capacity() const {
|
size_t CodeHeap::allocated_capacity() const {
|
||||||
// Start with the committed size in _memory;
|
// size of used heap - size on freelist
|
||||||
size_t l = _memory.committed_size();
|
return segments_to_size(_next_segment - _freelist_segments);
|
||||||
|
|
||||||
// Subtract the committed, but unused, segments
|
|
||||||
l -= size(_number_of_committed_segments - _next_segment);
|
|
||||||
|
|
||||||
// Subtract the size of the freelist
|
|
||||||
l -= size(_free_segments);
|
|
||||||
|
|
||||||
return l;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t CodeHeap::largest_free_block() const {
|
// Returns size of the unallocated heap block
|
||||||
// First check unused space excluding free blocks.
|
size_t CodeHeap::heap_unallocated_capacity() const {
|
||||||
size_t free_sz = size(_free_segments);
|
// Total number of segments - number currently used
|
||||||
size_t unused = max_capacity() - allocated_capacity() - free_sz;
|
return segments_to_size(_number_of_reserved_segments - _next_segment);
|
||||||
if (unused >= free_sz)
|
|
||||||
return unused;
|
|
||||||
|
|
||||||
// Now check largest free block.
|
|
||||||
size_t len = 0;
|
|
||||||
for (FreeBlock* b = _freelist; b != NULL; b = b->link()) {
|
|
||||||
if (b->length() > len)
|
|
||||||
len = b->length();
|
|
||||||
}
|
|
||||||
return MAX2(unused, size(len));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free list management
|
// Free list management
|
||||||
@ -365,7 +358,7 @@ void CodeHeap::add_to_freelist(HeapBlock *a) {
|
|||||||
assert(b != _freelist, "cannot be removed twice");
|
assert(b != _freelist, "cannot be removed twice");
|
||||||
|
|
||||||
// Mark as free and update free space count
|
// Mark as free and update free space count
|
||||||
_free_segments += b->length();
|
_freelist_segments += b->length();
|
||||||
b->set_free();
|
b->set_free();
|
||||||
|
|
||||||
// First element in list?
|
// First element in list?
|
||||||
@ -400,7 +393,7 @@ void CodeHeap::add_to_freelist(HeapBlock *a) {
|
|||||||
|
|
||||||
// Search freelist for an entry on the list with the best fit
|
// Search freelist for an entry on the list with the best fit
|
||||||
// Return NULL if no one was found
|
// Return NULL if no one was found
|
||||||
FreeBlock* CodeHeap::search_freelist(size_t length) {
|
FreeBlock* CodeHeap::search_freelist(size_t length, bool is_critical) {
|
||||||
FreeBlock *best_block = NULL;
|
FreeBlock *best_block = NULL;
|
||||||
FreeBlock *best_prev = NULL;
|
FreeBlock *best_prev = NULL;
|
||||||
size_t best_length = 0;
|
size_t best_length = 0;
|
||||||
@ -411,6 +404,16 @@ FreeBlock* CodeHeap::search_freelist(size_t length) {
|
|||||||
while(cur != NULL) {
|
while(cur != NULL) {
|
||||||
size_t l = cur->length();
|
size_t l = cur->length();
|
||||||
if (l >= length && (best_block == NULL || best_length > l)) {
|
if (l >= length && (best_block == NULL || best_length > l)) {
|
||||||
|
|
||||||
|
// Non critical allocations are not allowed to use the last part of the code heap.
|
||||||
|
if (!is_critical) {
|
||||||
|
// Make sure the end of the allocation doesn't cross into the last part of the code heap
|
||||||
|
if (((size_t)cur + length) > ((size_t)high_boundary() - CodeCacheMinimumFreeSpace)) {
|
||||||
|
// the freelist is sorted by address - if one fails, all consecutive will also fail.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Remember best block, its previous element, and its length
|
// Remember best block, its previous element, and its length
|
||||||
best_block = cur;
|
best_block = cur;
|
||||||
best_prev = prev;
|
best_prev = prev;
|
||||||
@ -452,7 +455,7 @@ FreeBlock* CodeHeap::search_freelist(size_t length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
best_block->set_used();
|
best_block->set_used();
|
||||||
_free_segments -= length;
|
_freelist_segments -= length;
|
||||||
return best_block;
|
return best_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -478,7 +481,7 @@ void CodeHeap::verify() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Verify that freelist contains the right amount of free space
|
// Verify that freelist contains the right amount of free space
|
||||||
// guarantee(len == _free_segments, "wrong freelist");
|
// guarantee(len == _freelist_segments, "wrong freelist");
|
||||||
|
|
||||||
// Verify that the number of free blocks is not out of hand.
|
// Verify that the number of free blocks is not out of hand.
|
||||||
static int free_block_threshold = 10000;
|
static int free_block_threshold = 10000;
|
||||||
|
@ -91,11 +91,11 @@ class CodeHeap : public CHeapObj<mtCode> {
|
|||||||
size_t _next_segment;
|
size_t _next_segment;
|
||||||
|
|
||||||
FreeBlock* _freelist;
|
FreeBlock* _freelist;
|
||||||
size_t _free_segments; // No. of segments in freelist
|
size_t _freelist_segments; // No. of segments in freelist
|
||||||
|
|
||||||
// Helper functions
|
// Helper functions
|
||||||
size_t number_of_segments(size_t size) const { return (size + _segment_size - 1) >> _log2_segment_size; }
|
size_t size_to_segments(size_t size) const { return (size + _segment_size - 1) >> _log2_segment_size; }
|
||||||
size_t size(size_t number_of_segments) const { return number_of_segments << _log2_segment_size; }
|
size_t segments_to_size(size_t number_of_segments) const { return number_of_segments << _log2_segment_size; }
|
||||||
|
|
||||||
size_t segment_for(void* p) const { return ((char*)p - _memory.low()) >> _log2_segment_size; }
|
size_t segment_for(void* p) const { return ((char*)p - _memory.low()) >> _log2_segment_size; }
|
||||||
HeapBlock* block_at(size_t i) const { return (HeapBlock*)(_memory.low() + (i << _log2_segment_size)); }
|
HeapBlock* block_at(size_t i) const { return (HeapBlock*)(_memory.low() + (i << _log2_segment_size)); }
|
||||||
@ -110,7 +110,7 @@ class CodeHeap : public CHeapObj<mtCode> {
|
|||||||
|
|
||||||
// Toplevel freelist management
|
// Toplevel freelist management
|
||||||
void add_to_freelist(HeapBlock *b);
|
void add_to_freelist(HeapBlock *b);
|
||||||
FreeBlock* search_freelist(size_t length);
|
FreeBlock* search_freelist(size_t length, bool is_critical);
|
||||||
|
|
||||||
// Iteration helpers
|
// Iteration helpers
|
||||||
void* next_free(HeapBlock* b) const;
|
void* next_free(HeapBlock* b) const;
|
||||||
@ -132,22 +132,19 @@ class CodeHeap : public CHeapObj<mtCode> {
|
|||||||
void clear(); // clears all heap contents
|
void clear(); // clears all heap contents
|
||||||
|
|
||||||
// Memory allocation
|
// Memory allocation
|
||||||
void* allocate (size_t size); // allocates a block of size or returns NULL
|
void* allocate (size_t size, bool is_critical); // allocates a block of size or returns NULL
|
||||||
void deallocate(void* p); // deallocates a block
|
void deallocate(void* p); // deallocates a block
|
||||||
|
|
||||||
// Attributes
|
// Attributes
|
||||||
void* begin() const { return _memory.low (); }
|
char* low_boundary() const { return _memory.low_boundary (); }
|
||||||
void* end() const { return _memory.high(); }
|
char* high() const { return _memory.high(); }
|
||||||
bool contains(void* p) const { return begin() <= p && p < end(); }
|
char* high_boundary() const { return _memory.high_boundary(); }
|
||||||
void* find_start(void* p) const; // returns the block containing p or NULL
|
|
||||||
size_t alignment_unit() const; // alignment of any block
|
|
||||||
size_t alignment_offset() const; // offset of first byte of any block, within the enclosing alignment unit
|
|
||||||
static size_t header_size(); // returns the header size for each heap block
|
|
||||||
|
|
||||||
// Returns reserved area high and low addresses
|
bool contains(const void* p) const { return low_boundary() <= p && p < high(); }
|
||||||
char *low_boundary() const { return _memory.low_boundary (); }
|
void* find_start(void* p) const; // returns the block containing p or NULL
|
||||||
char *high() const { return _memory.high(); }
|
size_t alignment_unit() const; // alignment of any block
|
||||||
char *high_boundary() const { return _memory.high_boundary(); }
|
size_t alignment_offset() const; // offset of first byte of any block, within the enclosing alignment unit
|
||||||
|
static size_t header_size(); // returns the header size for each heap block
|
||||||
|
|
||||||
// Iteration
|
// Iteration
|
||||||
|
|
||||||
@ -161,8 +158,11 @@ class CodeHeap : public CHeapObj<mtCode> {
|
|||||||
size_t max_capacity() const;
|
size_t max_capacity() const;
|
||||||
size_t allocated_capacity() const;
|
size_t allocated_capacity() const;
|
||||||
size_t unallocated_capacity() const { return max_capacity() - allocated_capacity(); }
|
size_t unallocated_capacity() const { return max_capacity() - allocated_capacity(); }
|
||||||
size_t largest_free_block() const;
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_t heap_unallocated_capacity() const;
|
||||||
|
|
||||||
|
public:
|
||||||
// Debugging
|
// Debugging
|
||||||
void verify();
|
void verify();
|
||||||
void print() PRODUCT_RETURN;
|
void print() PRODUCT_RETURN;
|
||||||
|
@ -103,27 +103,7 @@ bool MetaspaceGC::_should_concurrent_collect = false;
|
|||||||
// a chunk is placed on the free list of blocks (BlockFreelist) and
|
// a chunk is placed on the free list of blocks (BlockFreelist) and
|
||||||
// reused from there.
|
// reused from there.
|
||||||
|
|
||||||
// Pointer to list of Metachunks.
|
typedef class FreeList<Metachunk> ChunkList;
|
||||||
class ChunkList VALUE_OBJ_CLASS_SPEC {
|
|
||||||
// List of free chunks
|
|
||||||
Metachunk* _head;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// Constructor
|
|
||||||
ChunkList() : _head(NULL) {}
|
|
||||||
|
|
||||||
// Accessors
|
|
||||||
Metachunk* head() { return _head; }
|
|
||||||
void set_head(Metachunk* v) { _head = v; }
|
|
||||||
|
|
||||||
// Link at head of the list
|
|
||||||
void add_at_head(Metachunk* head, Metachunk* tail);
|
|
||||||
void add_at_head(Metachunk* head);
|
|
||||||
|
|
||||||
size_t sum_list_size();
|
|
||||||
size_t sum_list_count();
|
|
||||||
size_t sum_list_capacity();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Manages the global free lists of chunks.
|
// Manages the global free lists of chunks.
|
||||||
// Has three lists of free chunks, and a total size and
|
// Has three lists of free chunks, and a total size and
|
||||||
@ -185,6 +165,10 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC {
|
|||||||
// for special, small, medium, and humongous chunks.
|
// for special, small, medium, and humongous chunks.
|
||||||
static ChunkIndex list_index(size_t size);
|
static ChunkIndex list_index(size_t size);
|
||||||
|
|
||||||
|
// Add the simple linked list of chunks to the freelist of chunks
|
||||||
|
// of type index.
|
||||||
|
void return_chunks(ChunkIndex index, Metachunk* chunks);
|
||||||
|
|
||||||
// Total of the space in the free chunks list
|
// Total of the space in the free chunks list
|
||||||
size_t free_chunks_total();
|
size_t free_chunks_total();
|
||||||
size_t free_chunks_total_in_bytes();
|
size_t free_chunks_total_in_bytes();
|
||||||
@ -899,6 +883,9 @@ VirtualSpaceList::VirtualSpaceList(size_t word_size ) :
|
|||||||
Mutex::_no_safepoint_check_flag);
|
Mutex::_no_safepoint_check_flag);
|
||||||
bool initialization_succeeded = grow_vs(word_size);
|
bool initialization_succeeded = grow_vs(word_size);
|
||||||
|
|
||||||
|
_chunk_manager.free_chunks(SpecializedIndex)->set_size(SpecializedChunk);
|
||||||
|
_chunk_manager.free_chunks(SmallIndex)->set_size(SmallChunk);
|
||||||
|
_chunk_manager.free_chunks(MediumIndex)->set_size(MediumChunk);
|
||||||
assert(initialization_succeeded,
|
assert(initialization_succeeded,
|
||||||
" VirtualSpaceList initialization should not fail");
|
" VirtualSpaceList initialization should not fail");
|
||||||
}
|
}
|
||||||
@ -913,6 +900,9 @@ VirtualSpaceList::VirtualSpaceList(ReservedSpace rs) :
|
|||||||
Mutex::_no_safepoint_check_flag);
|
Mutex::_no_safepoint_check_flag);
|
||||||
VirtualSpaceNode* class_entry = new VirtualSpaceNode(rs);
|
VirtualSpaceNode* class_entry = new VirtualSpaceNode(rs);
|
||||||
bool succeeded = class_entry->initialize();
|
bool succeeded = class_entry->initialize();
|
||||||
|
_chunk_manager.free_chunks(SpecializedIndex)->set_size(SpecializedChunk);
|
||||||
|
_chunk_manager.free_chunks(SmallIndex)->set_size(ClassSmallChunk);
|
||||||
|
_chunk_manager.free_chunks(MediumIndex)->set_size(ClassMediumChunk);
|
||||||
assert(succeeded, " VirtualSpaceList initialization should not fail");
|
assert(succeeded, " VirtualSpaceList initialization should not fail");
|
||||||
link_vs(class_entry, rs.size()/BytesPerWord);
|
link_vs(class_entry, rs.size()/BytesPerWord);
|
||||||
}
|
}
|
||||||
@ -1380,76 +1370,6 @@ bool Metadebug::test_metadata_failure() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ChunkList methods
|
|
||||||
|
|
||||||
size_t ChunkList::sum_list_size() {
|
|
||||||
size_t result = 0;
|
|
||||||
Metachunk* cur = head();
|
|
||||||
while (cur != NULL) {
|
|
||||||
result += cur->word_size();
|
|
||||||
cur = cur->next();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ChunkList::sum_list_count() {
|
|
||||||
size_t result = 0;
|
|
||||||
Metachunk* cur = head();
|
|
||||||
while (cur != NULL) {
|
|
||||||
result++;
|
|
||||||
cur = cur->next();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ChunkList::sum_list_capacity() {
|
|
||||||
size_t result = 0;
|
|
||||||
Metachunk* cur = head();
|
|
||||||
while (cur != NULL) {
|
|
||||||
result += cur->capacity_word_size();
|
|
||||||
cur = cur->next();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChunkList::add_at_head(Metachunk* head, Metachunk* tail) {
|
|
||||||
assert_lock_strong(SpaceManager::expand_lock());
|
|
||||||
assert(head == tail || tail->next() == NULL,
|
|
||||||
"Not the tail or the head has already been added to a list");
|
|
||||||
|
|
||||||
if (TraceMetadataChunkAllocation && Verbose) {
|
|
||||||
gclog_or_tty->print("ChunkList::add_at_head(head, tail): ");
|
|
||||||
Metachunk* cur = head;
|
|
||||||
while (cur != NULL) {
|
|
||||||
gclog_or_tty->print(PTR_FORMAT " (" SIZE_FORMAT ") ", cur, cur->word_size());
|
|
||||||
cur = cur->next();
|
|
||||||
}
|
|
||||||
gclog_or_tty->print_cr("");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tail != NULL) {
|
|
||||||
tail->set_next(_head);
|
|
||||||
}
|
|
||||||
set_head(head);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ChunkList::add_at_head(Metachunk* list) {
|
|
||||||
if (list == NULL) {
|
|
||||||
// Nothing to add
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
assert_lock_strong(SpaceManager::expand_lock());
|
|
||||||
Metachunk* head = list;
|
|
||||||
Metachunk* tail = list;
|
|
||||||
Metachunk* cur = head->next();
|
|
||||||
// Search for the tail since it is not passed.
|
|
||||||
while (cur != NULL) {
|
|
||||||
tail = cur;
|
|
||||||
cur = cur->next();
|
|
||||||
}
|
|
||||||
add_at_head(head, tail);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ChunkManager methods
|
// ChunkManager methods
|
||||||
|
|
||||||
// Verification of _free_chunks_total and _free_chunks_count does not
|
// Verification of _free_chunks_total and _free_chunks_count does not
|
||||||
@ -1553,7 +1473,7 @@ size_t ChunkManager::sum_free_chunks() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
result = result + list->sum_list_capacity();
|
result = result + list->count() * list->size();
|
||||||
}
|
}
|
||||||
result = result + humongous_dictionary()->total_size();
|
result = result + humongous_dictionary()->total_size();
|
||||||
return result;
|
return result;
|
||||||
@ -1567,7 +1487,7 @@ size_t ChunkManager::sum_free_chunks_count() {
|
|||||||
if (list == NULL) {
|
if (list == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
count = count + list->sum_list_count();
|
count = count + list->count();
|
||||||
}
|
}
|
||||||
count = count + humongous_dictionary()->total_free_blocks();
|
count = count + humongous_dictionary()->total_free_blocks();
|
||||||
return count;
|
return count;
|
||||||
@ -1622,7 +1542,7 @@ Metachunk* ChunkManager::free_chunks_get(size_t word_size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove the chunk as the head of the list.
|
// Remove the chunk as the head of the list.
|
||||||
free_list->set_head(chunk->next());
|
free_list->remove_chunk(chunk);
|
||||||
|
|
||||||
// Chunk is being removed from the chunks free list.
|
// Chunk is being removed from the chunks free list.
|
||||||
dec_free_chunks_total(chunk->capacity_word_size());
|
dec_free_chunks_total(chunk->capacity_word_size());
|
||||||
@ -1679,7 +1599,7 @@ Metachunk* ChunkManager::chunk_freelist_allocate(size_t word_size) {
|
|||||||
size_t list_count;
|
size_t list_count;
|
||||||
if (list_index(word_size) < HumongousIndex) {
|
if (list_index(word_size) < HumongousIndex) {
|
||||||
ChunkList* list = find_free_chunks_list(word_size);
|
ChunkList* list = find_free_chunks_list(word_size);
|
||||||
list_count = list->sum_list_count();
|
list_count = list->count();
|
||||||
} else {
|
} else {
|
||||||
list_count = humongous_dictionary()->total_count();
|
list_count = humongous_dictionary()->total_count();
|
||||||
}
|
}
|
||||||
@ -1958,6 +1878,29 @@ void SpaceManager::initialize() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ChunkManager::return_chunks(ChunkIndex index, Metachunk* chunks) {
|
||||||
|
if (chunks == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ChunkList* list = free_chunks(index);
|
||||||
|
assert(list->size() == chunks->word_size(), "Mismatch in chunk sizes");
|
||||||
|
assert_lock_strong(SpaceManager::expand_lock());
|
||||||
|
Metachunk* cur = chunks;
|
||||||
|
|
||||||
|
// This return chunks one at a time. If a new
|
||||||
|
// class List can be created that is a base class
|
||||||
|
// of FreeList then something like FreeList::prepend()
|
||||||
|
// can be used in place of this loop
|
||||||
|
while (cur != NULL) {
|
||||||
|
// Capture the next link before it is changed
|
||||||
|
// by the call to return_chunk_at_head();
|
||||||
|
Metachunk* next = cur->next();
|
||||||
|
cur->set_is_free(true);
|
||||||
|
list->return_chunk_at_head(cur);
|
||||||
|
cur = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SpaceManager::~SpaceManager() {
|
SpaceManager::~SpaceManager() {
|
||||||
// This call this->_lock which can't be done while holding expand_lock()
|
// This call this->_lock which can't be done while holding expand_lock()
|
||||||
const size_t in_use_before = sum_capacity_in_chunks_in_use();
|
const size_t in_use_before = sum_capacity_in_chunks_in_use();
|
||||||
@ -1995,11 +1938,11 @@ SpaceManager::~SpaceManager() {
|
|||||||
chunk_size_name(i));
|
chunk_size_name(i));
|
||||||
}
|
}
|
||||||
Metachunk* chunks = chunks_in_use(i);
|
Metachunk* chunks = chunks_in_use(i);
|
||||||
chunk_manager->free_chunks(i)->add_at_head(chunks);
|
chunk_manager->return_chunks(i, chunks);
|
||||||
set_chunks_in_use(i, NULL);
|
set_chunks_in_use(i, NULL);
|
||||||
if (TraceMetadataChunkAllocation && Verbose) {
|
if (TraceMetadataChunkAllocation && Verbose) {
|
||||||
gclog_or_tty->print_cr("updated freelist count %d %s",
|
gclog_or_tty->print_cr("updated freelist count %d %s",
|
||||||
chunk_manager->free_chunks(i)->sum_list_count(),
|
chunk_manager->free_chunks(i)->count(),
|
||||||
chunk_size_name(i));
|
chunk_size_name(i));
|
||||||
}
|
}
|
||||||
assert(i != HumongousIndex, "Humongous chunks are handled explicitly later");
|
assert(i != HumongousIndex, "Humongous chunks are handled explicitly later");
|
||||||
|
@ -91,7 +91,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) {
|
|||||||
set_hidden(false);
|
set_hidden(false);
|
||||||
set_dont_inline(false);
|
set_dont_inline(false);
|
||||||
set_method_data(NULL);
|
set_method_data(NULL);
|
||||||
set_interpreter_throwout_count(0);
|
set_method_counters(NULL);
|
||||||
set_vtable_index(Method::garbage_vtable_index);
|
set_vtable_index(Method::garbage_vtable_index);
|
||||||
|
|
||||||
// Fix and bury in Method*
|
// Fix and bury in Method*
|
||||||
@ -105,16 +105,6 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
NOT_PRODUCT(set_compiled_invocation_count(0);)
|
NOT_PRODUCT(set_compiled_invocation_count(0);)
|
||||||
set_interpreter_invocation_count(0);
|
|
||||||
invocation_counter()->init();
|
|
||||||
backedge_counter()->init();
|
|
||||||
clear_number_of_breakpoints();
|
|
||||||
|
|
||||||
#ifdef TIERED
|
|
||||||
set_rate(0);
|
|
||||||
set_prev_event_count(0);
|
|
||||||
set_prev_time(0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Release Method*. The nmethod will be gone when we get here because
|
// Release Method*. The nmethod will be gone when we get here because
|
||||||
@ -124,6 +114,8 @@ void Method::deallocate_contents(ClassLoaderData* loader_data) {
|
|||||||
set_constMethod(NULL);
|
set_constMethod(NULL);
|
||||||
MetadataFactory::free_metadata(loader_data, method_data());
|
MetadataFactory::free_metadata(loader_data, method_data());
|
||||||
set_method_data(NULL);
|
set_method_data(NULL);
|
||||||
|
MetadataFactory::free_metadata(loader_data, method_counters());
|
||||||
|
set_method_counters(NULL);
|
||||||
// The nmethod will be gone when we get here.
|
// The nmethod will be gone when we get here.
|
||||||
if (code() != NULL) _code = NULL;
|
if (code() != NULL) _code = NULL;
|
||||||
}
|
}
|
||||||
@ -323,7 +315,10 @@ bool Method::was_executed_more_than(int n) {
|
|||||||
// compiler does not bump invocation counter of compiled methods
|
// compiler does not bump invocation counter of compiled methods
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (_invocation_counter.carry() || (method_data() != NULL && method_data()->invocation_counter()->carry())) {
|
else if ((method_counters() != NULL &&
|
||||||
|
method_counters()->invocation_counter()->carry()) ||
|
||||||
|
(method_data() != NULL &&
|
||||||
|
method_data()->invocation_counter()->carry())) {
|
||||||
// The carry bit is set when the counter overflows and causes
|
// The carry bit is set when the counter overflows and causes
|
||||||
// a compilation to occur. We don't know how many times
|
// a compilation to occur. We don't know how many times
|
||||||
// the counter has been reset, so we simply assume it has
|
// the counter has been reset, so we simply assume it has
|
||||||
@ -387,6 +382,18 @@ void Method::build_interpreter_method_data(methodHandle method, TRAPS) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MethodCounters* Method::build_method_counters(Method* m, TRAPS) {
|
||||||
|
methodHandle mh(m);
|
||||||
|
ClassLoaderData* loader_data = mh->method_holder()->class_loader_data();
|
||||||
|
MethodCounters* counters = MethodCounters::allocate(loader_data, CHECK_NULL);
|
||||||
|
if (mh->method_counters() == NULL) {
|
||||||
|
mh->set_method_counters(counters);
|
||||||
|
} else {
|
||||||
|
MetadataFactory::free_metadata(loader_data, counters);
|
||||||
|
}
|
||||||
|
return mh->method_counters();
|
||||||
|
}
|
||||||
|
|
||||||
void Method::cleanup_inline_caches() {
|
void Method::cleanup_inline_caches() {
|
||||||
// The current system doesn't use inline caches in the interpreter
|
// The current system doesn't use inline caches in the interpreter
|
||||||
// => nothing to do (keep this method around for future use)
|
// => nothing to do (keep this method around for future use)
|
||||||
@ -794,8 +801,6 @@ void Method::unlink_method() {
|
|||||||
set_signature_handler(NULL);
|
set_signature_handler(NULL);
|
||||||
}
|
}
|
||||||
NOT_PRODUCT(set_compiled_invocation_count(0);)
|
NOT_PRODUCT(set_compiled_invocation_count(0);)
|
||||||
invocation_counter()->reset();
|
|
||||||
backedge_counter()->reset();
|
|
||||||
_adapter = NULL;
|
_adapter = NULL;
|
||||||
_from_compiled_entry = NULL;
|
_from_compiled_entry = NULL;
|
||||||
|
|
||||||
@ -808,8 +813,7 @@ void Method::unlink_method() {
|
|||||||
assert(!DumpSharedSpaces || _method_data == NULL, "unexpected method data?");
|
assert(!DumpSharedSpaces || _method_data == NULL, "unexpected method data?");
|
||||||
|
|
||||||
set_method_data(NULL);
|
set_method_data(NULL);
|
||||||
set_interpreter_throwout_count(0);
|
set_method_counters(NULL);
|
||||||
set_interpreter_invocation_count(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called when the method_holder is getting linked. Setup entrypoints so the method
|
// Called when the method_holder is getting linked. Setup entrypoints so the method
|
||||||
@ -1545,28 +1549,34 @@ void Method::clear_all_breakpoints() {
|
|||||||
|
|
||||||
|
|
||||||
int Method::invocation_count() {
|
int Method::invocation_count() {
|
||||||
|
MethodCounters *mcs = method_counters();
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
MethodData* const mdo = method_data();
|
MethodData* const mdo = method_data();
|
||||||
if (invocation_counter()->carry() || ((mdo != NULL) ? mdo->invocation_counter()->carry() : false)) {
|
if (((mcs != NULL) ? mcs->invocation_counter()->carry() : false) ||
|
||||||
|
((mdo != NULL) ? mdo->invocation_counter()->carry() : false)) {
|
||||||
return InvocationCounter::count_limit;
|
return InvocationCounter::count_limit;
|
||||||
} else {
|
} else {
|
||||||
return invocation_counter()->count() + ((mdo != NULL) ? mdo->invocation_counter()->count() : 0);
|
return ((mcs != NULL) ? mcs->invocation_counter()->count() : 0) +
|
||||||
|
((mdo != NULL) ? mdo->invocation_counter()->count() : 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return invocation_counter()->count();
|
return (mcs == NULL) ? 0 : mcs->invocation_counter()->count();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int Method::backedge_count() {
|
int Method::backedge_count() {
|
||||||
|
MethodCounters *mcs = method_counters();
|
||||||
if (TieredCompilation) {
|
if (TieredCompilation) {
|
||||||
MethodData* const mdo = method_data();
|
MethodData* const mdo = method_data();
|
||||||
if (backedge_counter()->carry() || ((mdo != NULL) ? mdo->backedge_counter()->carry() : false)) {
|
if (((mcs != NULL) ? mcs->backedge_counter()->carry() : false) ||
|
||||||
|
((mdo != NULL) ? mdo->backedge_counter()->carry() : false)) {
|
||||||
return InvocationCounter::count_limit;
|
return InvocationCounter::count_limit;
|
||||||
} else {
|
} else {
|
||||||
return backedge_counter()->count() + ((mdo != NULL) ? mdo->backedge_counter()->count() : 0);
|
return ((mcs != NULL) ? mcs->backedge_counter()->count() : 0) +
|
||||||
|
((mdo != NULL) ? mdo->backedge_counter()->count() : 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return backedge_counter()->count();
|
return (mcs == NULL) ? 0 : mcs->backedge_counter()->count();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1621,12 +1631,12 @@ void BreakpointInfo::set(Method* method) {
|
|||||||
assert(orig_bytecode() == code, "original bytecode must be the same");
|
assert(orig_bytecode() == code, "original bytecode must be the same");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Thread *thread = Thread::current();
|
||||||
*method->bcp_from(_bci) = Bytecodes::_breakpoint;
|
*method->bcp_from(_bci) = Bytecodes::_breakpoint;
|
||||||
method->incr_number_of_breakpoints();
|
method->incr_number_of_breakpoints(thread);
|
||||||
SystemDictionary::notice_modification();
|
SystemDictionary::notice_modification();
|
||||||
{
|
{
|
||||||
// Deoptimize all dependents on this method
|
// Deoptimize all dependents on this method
|
||||||
Thread *thread = Thread::current();
|
|
||||||
HandleMark hm(thread);
|
HandleMark hm(thread);
|
||||||
methodHandle mh(thread, method);
|
methodHandle mh(thread, method);
|
||||||
Universe::flush_dependents_on_method(mh);
|
Universe::flush_dependents_on_method(mh);
|
||||||
@ -1636,7 +1646,7 @@ void BreakpointInfo::set(Method* method) {
|
|||||||
void BreakpointInfo::clear(Method* method) {
|
void BreakpointInfo::clear(Method* method) {
|
||||||
*method->bcp_from(_bci) = orig_bytecode();
|
*method->bcp_from(_bci) = orig_bytecode();
|
||||||
assert(method->number_of_breakpoints() > 0, "must not go negative");
|
assert(method->number_of_breakpoints() > 0, "must not go negative");
|
||||||
method->decr_number_of_breakpoints();
|
method->decr_number_of_breakpoints(Thread::current());
|
||||||
}
|
}
|
||||||
|
|
||||||
// jmethodID handling
|
// jmethodID handling
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "interpreter/invocationCounter.hpp"
|
#include "interpreter/invocationCounter.hpp"
|
||||||
#include "oops/annotations.hpp"
|
#include "oops/annotations.hpp"
|
||||||
#include "oops/constantPool.hpp"
|
#include "oops/constantPool.hpp"
|
||||||
|
#include "oops/methodCounters.hpp"
|
||||||
#include "oops/instanceKlass.hpp"
|
#include "oops/instanceKlass.hpp"
|
||||||
#include "oops/oop.hpp"
|
#include "oops/oop.hpp"
|
||||||
#include "oops/typeArrayOop.hpp"
|
#include "oops/typeArrayOop.hpp"
|
||||||
@ -100,6 +101,7 @@ class CheckedExceptionElement;
|
|||||||
class LocalVariableTableElement;
|
class LocalVariableTableElement;
|
||||||
class AdapterHandlerEntry;
|
class AdapterHandlerEntry;
|
||||||
class MethodData;
|
class MethodData;
|
||||||
|
class MethodCounters;
|
||||||
class ConstMethod;
|
class ConstMethod;
|
||||||
class InlineTableSizes;
|
class InlineTableSizes;
|
||||||
class KlassSizeStats;
|
class KlassSizeStats;
|
||||||
@ -109,7 +111,7 @@ class Method : public Metadata {
|
|||||||
private:
|
private:
|
||||||
ConstMethod* _constMethod; // Method read-only data.
|
ConstMethod* _constMethod; // Method read-only data.
|
||||||
MethodData* _method_data;
|
MethodData* _method_data;
|
||||||
int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered)
|
MethodCounters* _method_counters;
|
||||||
AccessFlags _access_flags; // Access flags
|
AccessFlags _access_flags; // Access flags
|
||||||
int _vtable_index; // vtable index of this method (see VtableIndexFlag)
|
int _vtable_index; // vtable index of this method (see VtableIndexFlag)
|
||||||
// note: can have vtables with >2**16 elements (because of inheritance)
|
// note: can have vtables with >2**16 elements (because of inheritance)
|
||||||
@ -124,15 +126,6 @@ class Method : public Metadata {
|
|||||||
_hidden : 1,
|
_hidden : 1,
|
||||||
_dont_inline : 1,
|
_dont_inline : 1,
|
||||||
: 3;
|
: 3;
|
||||||
u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting
|
|
||||||
u2 _number_of_breakpoints; // fullspeed debugging support
|
|
||||||
InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations
|
|
||||||
InvocationCounter _backedge_counter; // Incremented before each backedge taken - used to trigger frequencey-based optimizations
|
|
||||||
|
|
||||||
#ifdef TIERED
|
|
||||||
float _rate; // Events (invocation and backedge counter increments) per millisecond
|
|
||||||
jlong _prev_time; // Previous time the rate was acquired
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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)
|
||||||
@ -247,11 +240,31 @@ class Method : public Metadata {
|
|||||||
void clear_all_breakpoints();
|
void clear_all_breakpoints();
|
||||||
// Tracking number of breakpoints, for fullspeed debugging.
|
// Tracking number of breakpoints, for fullspeed debugging.
|
||||||
// Only mutated by VM thread.
|
// Only mutated by VM thread.
|
||||||
u2 number_of_breakpoints() const { return _number_of_breakpoints; }
|
u2 number_of_breakpoints() const {
|
||||||
void incr_number_of_breakpoints() { ++_number_of_breakpoints; }
|
if (method_counters() == NULL) {
|
||||||
void decr_number_of_breakpoints() { --_number_of_breakpoints; }
|
return 0;
|
||||||
|
} else {
|
||||||
|
return method_counters()->number_of_breakpoints();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void incr_number_of_breakpoints(TRAPS) {
|
||||||
|
MethodCounters* mcs = get_method_counters(CHECK);
|
||||||
|
if (mcs != NULL) {
|
||||||
|
mcs->incr_number_of_breakpoints();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void decr_number_of_breakpoints(TRAPS) {
|
||||||
|
MethodCounters* mcs = get_method_counters(CHECK);
|
||||||
|
if (mcs != NULL) {
|
||||||
|
mcs->decr_number_of_breakpoints();
|
||||||
|
}
|
||||||
|
}
|
||||||
// Initialization only
|
// Initialization only
|
||||||
void clear_number_of_breakpoints() { _number_of_breakpoints = 0; }
|
void clear_number_of_breakpoints() {
|
||||||
|
if (method_counters() != NULL) {
|
||||||
|
method_counters()->clear_number_of_breakpoints();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// index into InstanceKlass methods() array
|
// index into InstanceKlass methods() array
|
||||||
// note: also used by jfr
|
// note: also used by jfr
|
||||||
@ -288,14 +301,20 @@ class Method : public Metadata {
|
|||||||
void set_highest_osr_comp_level(int level);
|
void set_highest_osr_comp_level(int level);
|
||||||
|
|
||||||
// Count of times method was exited via exception while interpreting
|
// Count of times method was exited via exception while interpreting
|
||||||
void interpreter_throwout_increment() {
|
void interpreter_throwout_increment(TRAPS) {
|
||||||
if (_interpreter_throwout_count < 65534) {
|
MethodCounters* mcs = get_method_counters(CHECK);
|
||||||
_interpreter_throwout_count++;
|
if (mcs != NULL) {
|
||||||
|
mcs->interpreter_throwout_increment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int interpreter_throwout_count() const { return _interpreter_throwout_count; }
|
int interpreter_throwout_count() const {
|
||||||
void set_interpreter_throwout_count(int count) { _interpreter_throwout_count = count; }
|
if (method_counters() == NULL) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return method_counters()->interpreter_throwout_count();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// size of parameters
|
// size of parameters
|
||||||
int size_of_parameters() const { return constMethod()->size_of_parameters(); }
|
int size_of_parameters() const { return constMethod()->size_of_parameters(); }
|
||||||
@ -339,23 +358,54 @@ class Method : public Metadata {
|
|||||||
MethodData* method_data() const {
|
MethodData* method_data() const {
|
||||||
return _method_data;
|
return _method_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_method_data(MethodData* data) {
|
void set_method_data(MethodData* data) {
|
||||||
_method_data = data;
|
_method_data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// invocation counter
|
MethodCounters* method_counters() const {
|
||||||
InvocationCounter* invocation_counter() { return &_invocation_counter; }
|
return _method_counters;
|
||||||
InvocationCounter* backedge_counter() { return &_backedge_counter; }
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void set_method_counters(MethodCounters* counters) {
|
||||||
|
_method_counters = counters;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TIERED
|
#ifdef TIERED
|
||||||
// We are reusing interpreter_invocation_count as a holder for the previous event count!
|
// We are reusing interpreter_invocation_count as a holder for the previous event count!
|
||||||
// We can do that since interpreter_invocation_count is not used in tiered.
|
// We can do that since interpreter_invocation_count is not used in tiered.
|
||||||
int prev_event_count() const { return _interpreter_invocation_count; }
|
int prev_event_count() const {
|
||||||
void set_prev_event_count(int count) { _interpreter_invocation_count = count; }
|
if (method_counters() == NULL) {
|
||||||
jlong prev_time() const { return _prev_time; }
|
return 0;
|
||||||
void set_prev_time(jlong time) { _prev_time = time; }
|
} else {
|
||||||
float rate() const { return _rate; }
|
return method_counters()->interpreter_invocation_count();
|
||||||
void set_rate(float rate) { _rate = rate; }
|
}
|
||||||
|
}
|
||||||
|
void set_prev_event_count(int count, TRAPS) {
|
||||||
|
MethodCounters* mcs = get_method_counters(CHECK);
|
||||||
|
if (mcs != NULL) {
|
||||||
|
mcs->set_interpreter_invocation_count(count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jlong prev_time() const {
|
||||||
|
return method_counters() == NULL ? 0 : method_counters()->prev_time();
|
||||||
|
}
|
||||||
|
void set_prev_time(jlong time, TRAPS) {
|
||||||
|
MethodCounters* mcs = get_method_counters(CHECK);
|
||||||
|
if (mcs != NULL) {
|
||||||
|
mcs->set_prev_time(time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
float rate() const {
|
||||||
|
return method_counters() == NULL ? 0 : method_counters()->rate();
|
||||||
|
}
|
||||||
|
void set_rate(float rate, TRAPS) {
|
||||||
|
MethodCounters* mcs = get_method_counters(CHECK);
|
||||||
|
if (mcs != NULL) {
|
||||||
|
mcs->set_rate(rate);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int invocation_count();
|
int invocation_count();
|
||||||
@ -366,14 +416,17 @@ class Method : public Metadata {
|
|||||||
|
|
||||||
static void build_interpreter_method_data(methodHandle method, TRAPS);
|
static void build_interpreter_method_data(methodHandle method, TRAPS);
|
||||||
|
|
||||||
|
static MethodCounters* build_method_counters(Method* m, TRAPS);
|
||||||
|
|
||||||
int interpreter_invocation_count() {
|
int interpreter_invocation_count() {
|
||||||
if (TieredCompilation) return invocation_count();
|
if (TieredCompilation) return invocation_count();
|
||||||
else return _interpreter_invocation_count;
|
else return (method_counters() == NULL) ? 0 :
|
||||||
|
method_counters()->interpreter_invocation_count();
|
||||||
}
|
}
|
||||||
void set_interpreter_invocation_count(int count) { _interpreter_invocation_count = count; }
|
int increment_interpreter_invocation_count(TRAPS) {
|
||||||
int increment_interpreter_invocation_count() {
|
|
||||||
if (TieredCompilation) ShouldNotReachHere();
|
if (TieredCompilation) ShouldNotReachHere();
|
||||||
return ++_interpreter_invocation_count;
|
MethodCounters* mcs = get_method_counters(CHECK_0);
|
||||||
|
return (mcs == NULL) ? 0 : mcs->increment_interpreter_invocation_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
@ -582,12 +635,12 @@ class Method : public Metadata {
|
|||||||
#endif /* CC_INTERP */
|
#endif /* CC_INTERP */
|
||||||
static ByteSize from_compiled_offset() { return byte_offset_of(Method, _from_compiled_entry); }
|
static ByteSize from_compiled_offset() { return byte_offset_of(Method, _from_compiled_entry); }
|
||||||
static ByteSize code_offset() { return byte_offset_of(Method, _code); }
|
static ByteSize code_offset() { return byte_offset_of(Method, _code); }
|
||||||
static ByteSize invocation_counter_offset() { return byte_offset_of(Method, _invocation_counter); }
|
|
||||||
static ByteSize backedge_counter_offset() { return byte_offset_of(Method, _backedge_counter); }
|
|
||||||
static ByteSize method_data_offset() {
|
static ByteSize method_data_offset() {
|
||||||
return byte_offset_of(Method, _method_data);
|
return byte_offset_of(Method, _method_data);
|
||||||
}
|
}
|
||||||
static ByteSize interpreter_invocation_counter_offset() { return byte_offset_of(Method, _interpreter_invocation_count); }
|
static ByteSize method_counters_offset() {
|
||||||
|
return byte_offset_of(Method, _method_counters);
|
||||||
|
}
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(Method, _compiled_invocation_count); }
|
static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(Method, _compiled_invocation_count); }
|
||||||
#endif // not PRODUCT
|
#endif // not PRODUCT
|
||||||
@ -598,8 +651,6 @@ class Method : public Metadata {
|
|||||||
|
|
||||||
// for code generation
|
// for code generation
|
||||||
static int method_data_offset_in_bytes() { return offset_of(Method, _method_data); }
|
static int method_data_offset_in_bytes() { return offset_of(Method, _method_data); }
|
||||||
static int interpreter_invocation_counter_offset_in_bytes()
|
|
||||||
{ return offset_of(Method, _interpreter_invocation_count); }
|
|
||||||
static int intrinsic_id_offset_in_bytes() { return offset_of(Method, _intrinsic_id); }
|
static int intrinsic_id_offset_in_bytes() { return offset_of(Method, _intrinsic_id); }
|
||||||
static int intrinsic_id_size_in_bytes() { return sizeof(u1); }
|
static int intrinsic_id_size_in_bytes() { return sizeof(u1); }
|
||||||
|
|
||||||
@ -757,6 +808,13 @@ class Method : public Metadata {
|
|||||||
private:
|
private:
|
||||||
void print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason);
|
void print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason);
|
||||||
|
|
||||||
|
MethodCounters* get_method_counters(TRAPS) {
|
||||||
|
if (_method_counters == NULL) {
|
||||||
|
build_method_counters(this, CHECK_AND_CLEAR_NULL);
|
||||||
|
}
|
||||||
|
return _method_counters;
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
|
bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
|
||||||
void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
|
void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1999, 2010, 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
|
||||||
@ -21,26 +21,17 @@
|
|||||||
* questions.
|
* questions.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "opto/chaitin.hpp"
|
#include "oops/methodCounters.hpp"
|
||||||
#include "opto/machnode.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
void PhaseRegAlloc::pd_preallocate_hook() {
|
MethodCounters* MethodCounters::allocate(ClassLoaderData* loader_data, TRAPS) {
|
||||||
// no action
|
return new(loader_data, size(), false, THREAD) MethodCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ASSERT
|
void MethodCounters::clear_counters() {
|
||||||
void PhaseRegAlloc::pd_postallocate_verify_hook() {
|
invocation_counter()->reset();
|
||||||
// no action
|
backedge_counter()->reset();
|
||||||
|
set_interpreter_throwout_count(0);
|
||||||
|
set_interpreter_invocation_count(0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//Reconciliation History
|
|
||||||
// 1.1 99/02/12 15:35:26 chaitin_win32.cpp
|
|
||||||
// 1.2 99/02/18 15:38:56 chaitin_win32.cpp
|
|
||||||
// 1.4 99/03/09 10:37:48 chaitin_win32.cpp
|
|
||||||
// 1.6 99/03/25 11:07:44 chaitin_win32.cpp
|
|
||||||
// 1.8 99/06/22 16:38:58 chaitin_win32.cpp
|
|
||||||
//End
|
|
124
hotspot/src/share/vm/oops/methodCounters.hpp
Normal file
124
hotspot/src/share/vm/oops/methodCounters.hpp
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2013, 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SHARE_VM_OOPS_METHODCOUNTERS_HPP
|
||||||
|
#define SHARE_VM_OOPS_METHODCOUNTERS_HPP
|
||||||
|
|
||||||
|
#include "oops/metadata.hpp"
|
||||||
|
#include "interpreter/invocationCounter.hpp"
|
||||||
|
|
||||||
|
class MethodCounters: public MetaspaceObj {
|
||||||
|
friend class VMStructs;
|
||||||
|
private:
|
||||||
|
int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered)
|
||||||
|
u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting
|
||||||
|
u2 _number_of_breakpoints; // fullspeed debugging support
|
||||||
|
InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations
|
||||||
|
InvocationCounter _backedge_counter; // Incremented before each backedge taken - used to trigger frequencey-based optimizations
|
||||||
|
|
||||||
|
#ifdef TIERED
|
||||||
|
float _rate; // Events (invocation and backedge counter increments) per millisecond
|
||||||
|
jlong _prev_time; // Previous time the rate was acquired
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MethodCounters() : _interpreter_invocation_count(0),
|
||||||
|
_interpreter_throwout_count(0),
|
||||||
|
_number_of_breakpoints(0)
|
||||||
|
#ifdef TIERED
|
||||||
|
, _rate(0),
|
||||||
|
_prev_time(0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
invocation_counter()->init();
|
||||||
|
backedge_counter()->init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
static MethodCounters* allocate(ClassLoaderData* loader_data, TRAPS);
|
||||||
|
|
||||||
|
void deallocate_contents(ClassLoaderData* loader_data) {}
|
||||||
|
DEBUG_ONLY(bool on_stack() { return false; }) // for template
|
||||||
|
|
||||||
|
static int size() { return sizeof(MethodCounters) / wordSize; }
|
||||||
|
|
||||||
|
bool is_klass() const { return false; }
|
||||||
|
|
||||||
|
void clear_counters();
|
||||||
|
|
||||||
|
int interpreter_invocation_count() {
|
||||||
|
return _interpreter_invocation_count;
|
||||||
|
}
|
||||||
|
void set_interpreter_invocation_count(int count) {
|
||||||
|
_interpreter_invocation_count = count;
|
||||||
|
}
|
||||||
|
int increment_interpreter_invocation_count() {
|
||||||
|
return ++_interpreter_invocation_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void interpreter_throwout_increment() {
|
||||||
|
if (_interpreter_throwout_count < 65534) {
|
||||||
|
_interpreter_throwout_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int interpreter_throwout_count() const {
|
||||||
|
return _interpreter_throwout_count;
|
||||||
|
}
|
||||||
|
void set_interpreter_throwout_count(int count) {
|
||||||
|
_interpreter_throwout_count = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
u2 number_of_breakpoints() const { return _number_of_breakpoints; }
|
||||||
|
void incr_number_of_breakpoints() { ++_number_of_breakpoints; }
|
||||||
|
void decr_number_of_breakpoints() { --_number_of_breakpoints; }
|
||||||
|
void clear_number_of_breakpoints() { _number_of_breakpoints = 0; }
|
||||||
|
|
||||||
|
#ifdef TIERED
|
||||||
|
jlong prev_time() const { return _prev_time; }
|
||||||
|
void set_prev_time(jlong time) { _prev_time = time; }
|
||||||
|
float rate() const { return _rate; }
|
||||||
|
void set_rate(float rate) { _rate = rate; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// invocation counter
|
||||||
|
InvocationCounter* invocation_counter() { return &_invocation_counter; }
|
||||||
|
InvocationCounter* backedge_counter() { return &_backedge_counter; }
|
||||||
|
|
||||||
|
static ByteSize interpreter_invocation_counter_offset() {
|
||||||
|
return byte_offset_of(MethodCounters, _interpreter_invocation_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ByteSize invocation_counter_offset() {
|
||||||
|
return byte_offset_of(MethodCounters, _invocation_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ByteSize backedge_counter_offset() {
|
||||||
|
return byte_offset_of(MethodCounters, _backedge_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int interpreter_invocation_counter_offset_in_bytes() {
|
||||||
|
return offset_of(MethodCounters, _interpreter_invocation_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif //SHARE_VM_OOPS_METHODCOUNTERS_HPP
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user