This commit is contained in:
Daniel D. Daugherty 2013-04-19 16:51:27 -07:00
commit 46b3969016
2568 changed files with 82956 additions and 16905 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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();
} }
} }

View File

@ -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) {
}
}

View File

@ -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
@ -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=%)"
@ -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"
@ -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

View File

@ -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)

View File

@ -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.
@ -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"; \
) > $@ ) > $@

View File

@ -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
@ -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

View File

@ -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
@ -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

View File

@ -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
@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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.
@ -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"; \
) > $@ ) > $@

View File

@ -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
@ -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

View File

@ -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
@ -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

View File

@ -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
@ -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

View File

@ -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

View File

@ -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)

View File

@ -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.
@ -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"; \
) > $@ ) > $@

View File

@ -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
@ -37,7 +37,11 @@ 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 \
@ -47,12 +51,6 @@ MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
# 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

View File

@ -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
@ -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)

View File

@ -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
@ -123,5 +123,5 @@ MAPFILE = $(GAMMADIR)/make/solaris/makefiles/mapfile-vers \
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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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) {

View File

@ -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.

View File

@ -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 );

View File

@ -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 );

View File

@ -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.

View File

@ -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);
} }
} }

View File

@ -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);
} }
} }
} }

View File

@ -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

View File

@ -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) {

View File

@ -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);

View File

@ -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) {

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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------------------------------------------------

View File

@ -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)

View File

@ -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) \

View File

@ -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) \

View File

@ -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

View File

@ -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;
} }

View File

@ -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
@ -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 \

View File

@ -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) {}

View File

@ -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

View File

@ -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;

View File

@ -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");

View File

@ -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

View File

@ -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 {

View File

@ -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 {}
}; };

View File

@ -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) {

View File

@ -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
}; };

View File

@ -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");

View File

@ -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

View File

@ -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
}; };

View File

@ -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);

View File

@ -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

View File

@ -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;
} }
} }

View File

@ -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++;
} }
} }
} }

View File

@ -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
}; };

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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();
}
}

View File

@ -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; }

View File

@ -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,

View File

@ -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()) {

View File

@ -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");

View File

@ -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

View File

@ -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,

View File

@ -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.

View File

@ -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,

View File

@ -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);
}; };

View File

@ -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;
} }

View File

@ -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)

View File

@ -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;

View File

@ -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;

View File

@ -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");

View File

@ -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

View File

@ -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(); }

View File

@ -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

View 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