Merge
This commit is contained in:
commit
243a756a0c
2
.hgtags
2
.hgtags
@ -224,3 +224,5 @@ ea73f01b9053e7165e7ba80f242bafecbc6af712 jdk8-b96
|
|||||||
3d34036aae4ea90b2ca59712d5a69db3221f0875 jdk8-b100
|
3d34036aae4ea90b2ca59712d5a69db3221f0875 jdk8-b100
|
||||||
edb01c460d4cab21ff0ff13512df7b746efaa0e7 jdk8-b101
|
edb01c460d4cab21ff0ff13512df7b746efaa0e7 jdk8-b101
|
||||||
bbe43d712fe08e650808d774861b256ccb34e500 jdk8-b102
|
bbe43d712fe08e650808d774861b256ccb34e500 jdk8-b102
|
||||||
|
30a1d677a20c6a95f98043d8f20ce570304e3818 jdk8-b103
|
||||||
|
b5ed503c26ad38869c247c5e32debec217fd056b jdk8-b104
|
||||||
|
@ -224,3 +224,5 @@ a1c1e8bf71f354f3aec0214cf13d6668811e021d jdk8-b97
|
|||||||
d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100
|
d2dcb110e9dbaf9903c05b211df800e78e4b394e jdk8-b100
|
||||||
9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101
|
9f74a220677dc265a724515d8e2617548cef62f1 jdk8-b101
|
||||||
5eb3c1dc348f72a7f84f7d9d07834e8bbe09a799 jdk8-b102
|
5eb3c1dc348f72a7f84f7d9d07834e8bbe09a799 jdk8-b102
|
||||||
|
b7e64be81c8a7690703df5711f4fc2375da8a9cb jdk8-b103
|
||||||
|
96c1b9b7524b52c3fcefc90ffad4c767396727c8 jdk8-b104
|
||||||
|
@ -154,7 +154,7 @@
|
|||||||
</code>
|
</code>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
Once you have all the repositories, keep in mind that each
|
Once you have all the repositories, keep in mind that each
|
||||||
repository is it's own independent repository.
|
repository is its own independent repository.
|
||||||
You can also re-run <code>./get_source.sh</code> anytime to
|
You can also re-run <code>./get_source.sh</code> anytime to
|
||||||
pull over all the latest changesets in all the repositories.
|
pull over all the latest changesets in all the repositories.
|
||||||
This set of nested repositories has been given the term
|
This set of nested repositories has been given the term
|
||||||
@ -241,6 +241,14 @@
|
|||||||
source code for the OpenJDK Corba functionality
|
source code for the OpenJDK Corba functionality
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
nashorn
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
source code for the OpenJDK JavaScript implementation
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
@ -386,7 +394,7 @@
|
|||||||
<code>--with-boot-jdk</code>.
|
<code>--with-boot-jdk</code>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
Insure that GNU make, the Bootstrap JDK,
|
Ensure that GNU make, the Bootstrap JDK,
|
||||||
and the compilers are all
|
and the compilers are all
|
||||||
in your PATH environment variable
|
in your PATH environment variable
|
||||||
</li>
|
</li>
|
||||||
@ -1307,9 +1315,9 @@
|
|||||||
you will need to modify the makefiles. But for normal file
|
you will need to modify the makefiles. But for normal file
|
||||||
additions or removals, no changes are needed. There are certan
|
additions or removals, no changes are needed. There are certan
|
||||||
exceptions for some native libraries where the source files are spread
|
exceptions for some native libraries where the source files are spread
|
||||||
over many directories which also contain courses for other
|
over many directories which also contain sources for other
|
||||||
libraries. In these cases it was simply easier to create include lists
|
libraries. In these cases it was simply easier to create include lists
|
||||||
rather thane excludes.
|
rather than excludes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@ -1327,14 +1335,14 @@
|
|||||||
<p>
|
<p>
|
||||||
<b>Q:</b>
|
<b>Q:</b>
|
||||||
<code>configure</code> provides OpenJDK-specific features such as
|
<code>configure</code> provides OpenJDK-specific features such as
|
||||||
<code>--enable-jigsaw</code> or <code>--with-builddeps-server</code>
|
<code>--with-builddeps-server</code> that are not
|
||||||
that are not described in this document. What about those?
|
described in this document. What about those?
|
||||||
<br>
|
<br>
|
||||||
<b>A:</b>
|
<b>A:</b>
|
||||||
Try them out if you like! But be aware that most of these are
|
Try them out if you like! But be aware that most of these are
|
||||||
experimental features.
|
experimental features.
|
||||||
Many of them don't do anything at all at the moment; the option
|
Many of them don't do anything at all at the moment; the option
|
||||||
is just a placeholder. Other depends on
|
is just a placeholder. Others depend on
|
||||||
pieces of code or infrastructure that is currently
|
pieces of code or infrastructure that is currently
|
||||||
not ready for prime time.
|
not ready for prime time.
|
||||||
</p>
|
</p>
|
||||||
@ -1385,24 +1393,6 @@
|
|||||||
system and some will need to wait until after.
|
system and some will need to wait until after.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
|
||||||
<b>Q:</b> What is @GenerateNativeHeaders?
|
|
||||||
<br>
|
|
||||||
<b>A:</b>
|
|
||||||
To speed up compilation, we added a flag to javac which makes it
|
|
||||||
do the job of javah as well, as a by-product; that is, generating
|
|
||||||
native .h header files. These files are only generated
|
|
||||||
if a class contains native methods. However, sometimes
|
|
||||||
a class contains no native method,
|
|
||||||
but still contains constants that native code needs to use.
|
|
||||||
The new GenerateNativeHeaders annotation tells javac to
|
|
||||||
force generation of a
|
|
||||||
header file in these cases. (We don't want to generate
|
|
||||||
native headers for all classes that contains constants
|
|
||||||
but no native methods, since
|
|
||||||
that would slow down the compilation process needlessly.)
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<b>Q:</b>
|
<b>Q:</b>
|
||||||
Is anything able to use the results of the new build's default make target?
|
Is anything able to use the results of the new build's default make target?
|
||||||
@ -1429,10 +1419,9 @@
|
|||||||
What should I do?
|
What should I do?
|
||||||
<br>
|
<br>
|
||||||
<b>A:</b>
|
<b>A:</b>
|
||||||
It might very well be that we have missed to add support for
|
It might very well be that we have neglected to add support for
|
||||||
an option that was actually used from outside the build system.
|
an option that was actually used from outside the build system.
|
||||||
Email us and we will
|
Email us and we will add support for it!
|
||||||
add support for it!
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -412,17 +412,16 @@ AC_DEFUN([PLATFORM_SET_COMPILER_TARGET_BITS_FLAGS],
|
|||||||
[
|
[
|
||||||
# keep track of c/cxx flags that we added outselves...
|
# keep track of c/cxx flags that we added outselves...
|
||||||
# to prevent emitting warning...
|
# to prevent emitting warning...
|
||||||
ADDED_CFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}"
|
TARGET_BITS_FLAG="-m${OPENJDK_TARGET_CPU_BITS}"
|
||||||
ADDED_CXXFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}"
|
AC_SUBST(TARGET_BITS_FLAG)
|
||||||
ADDED_LDFLAGS=" -m${OPENJDK_TARGET_CPU_BITS}"
|
|
||||||
|
|
||||||
CFLAGS="${CFLAGS}${ADDED_CFLAGS}"
|
CFLAGS="${CFLAGS} ${TARGET_BITS_FLAG}"
|
||||||
CXXFLAGS="${CXXFLAGS}${ADDED_CXXFLAGS}"
|
CXXFLAGS="${CXXFLAGS} ${TARGET_BITS_FLAG}"
|
||||||
LDFLAGS="${LDFLAGS}${ADDED_LDFLAGS}"
|
LDFLAGS="${LDFLAGS} ${TARGET_BITS_FLAG}"
|
||||||
|
|
||||||
CFLAGS_JDK="${CFLAGS_JDK}${ADDED_CFLAGS}"
|
CFLAGS_JDK="${CFLAGS_JDK} ${TARGET_BITS_FLAG}"
|
||||||
CXXFLAGS_JDK="${CXXFLAGS_JDK}${ADDED_CXXFLAGS}"
|
CXXFLAGS_JDK="${CXXFLAGS_JDK} ${TARGET_BITS_FLAG}"
|
||||||
LDFLAGS_JDK="${LDFLAGS_JDK}${ADDED_LDFLAGS}"
|
LDFLAGS_JDK="${LDFLAGS_JDK} ${TARGET_BITS_FLAG}"
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_TARGET_BITS],
|
AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_TARGET_BITS],
|
||||||
|
@ -304,6 +304,7 @@ MACOSX_VERSION_MIN=@MACOSX_VERSION_MIN@
|
|||||||
COMPILER_TYPE:=@COMPILER_TYPE@
|
COMPILER_TYPE:=@COMPILER_TYPE@
|
||||||
COMPILER_NAME:=@COMPILER_NAME@
|
COMPILER_NAME:=@COMPILER_NAME@
|
||||||
|
|
||||||
|
TARGET_BITS_FLAG=@TARGET_BITS_FLAG@
|
||||||
COMPILER_SUPPORTS_TARGET_BITS_FLAG=@COMPILER_SUPPORTS_TARGET_BITS_FLAG@
|
COMPILER_SUPPORTS_TARGET_BITS_FLAG=@COMPILER_SUPPORTS_TARGET_BITS_FLAG@
|
||||||
|
|
||||||
CC_OUT_OPTION:=@CC_OUT_OPTION@
|
CC_OUT_OPTION:=@CC_OUT_OPTION@
|
||||||
|
@ -905,7 +905,7 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then
|
|||||||
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DSOLARIS"
|
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DSOLARIS"
|
||||||
fi
|
fi
|
||||||
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
||||||
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
|
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE -D_DARWIN_UNLIMITED_SELECT"
|
||||||
# Setting these parameters makes it an error to link to macosx APIs that are
|
# Setting these parameters makes it an error to link to macosx APIs that are
|
||||||
# newer than the given OS version and makes the linked binaries compatible even
|
# newer than the given OS version and makes the linked binaries compatible even
|
||||||
# if built on a newer version of the OS.
|
# if built on a newer version of the OS.
|
||||||
|
@ -83,9 +83,6 @@ $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NE
|
|||||||
$(call LogSetupMacroEntry,SetupIdlCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
|
$(call LogSetupMacroEntry,SetupIdlCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15))
|
||||||
$(if $(16),$(error Internal makefile error: Too many arguments to SetupIdlCompilation, please update IdlCompilation.gmk))
|
$(if $(16),$(error Internal makefile error: Too many arguments to SetupIdlCompilation, please update IdlCompilation.gmk))
|
||||||
|
|
||||||
# Remove any relative addressing in the paths.
|
|
||||||
$1_SRC := $$(abspath $$($1_SRC))
|
|
||||||
$1_BIN := $$(abspath $$($1_BIN))
|
|
||||||
# Find all existing java files and existing class files.
|
# Find all existing java files and existing class files.
|
||||||
$$(eval $$(call MakeDir,$$($1_BIN)))
|
$$(eval $$(call MakeDir,$$($1_BIN)))
|
||||||
$1_SRCS := $$(shell find $$($1_SRC) -name "*.idl")
|
$1_SRCS := $$(shell find $$($1_SRC) -name "*.idl")
|
||||||
|
@ -204,7 +204,7 @@ clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jd
|
|||||||
# If the output directory was created by configure and now becomes empty, remove it as well.
|
# If the output directory was created by configure and now becomes empty, remove it as well.
|
||||||
# FIXME: tmp should not be here, fix ResetTimers instead. And remove spec.sh!
|
# FIXME: tmp should not be here, fix ResetTimers instead. And remove spec.sh!
|
||||||
dist-clean: clean
|
dist-clean: clean
|
||||||
@($(CD) $(OUTPUT_ROOT) && $(RM) -r *spec.gmk config.* configure-arguments Makefile compare.sh spec.sh tmp)
|
@($(CD) $(OUTPUT_ROOT) && $(RM) -r *spec.gmk config.* configure-arguments Makefile compare.sh spec.sh tmp javacservers)
|
||||||
@$(if $(filter $(CONF_NAME),$(notdir $(OUTPUT_ROOT))), \
|
@$(if $(filter $(CONF_NAME),$(notdir $(OUTPUT_ROOT))), \
|
||||||
if test "x`$(LS) $(OUTPUT_ROOT)`" != x; then \
|
if test "x`$(LS) $(OUTPUT_ROOT)`" != x; then \
|
||||||
$(ECHO) "Warning: Not removing non-empty configuration directory for '$(CONF_NAME)'" ;\
|
$(ECHO) "Warning: Not removing non-empty configuration directory for '$(CONF_NAME)'" ;\
|
||||||
|
@ -224,3 +224,5 @@ c8286839d0df04aba819ec4bef12b86babccf30e jdk8-b90
|
|||||||
8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100
|
8d492f1dfd1b131a4c7886ee6b59528609f7e4fe jdk8-b100
|
||||||
a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101
|
a013024b07475782f1fa8e196e950b34b4077663 jdk8-b101
|
||||||
528c7e76eaeee022817ee085668459bc97cf5665 jdk8-b102
|
528c7e76eaeee022817ee085668459bc97cf5665 jdk8-b102
|
||||||
|
49c4a777fdfd648d4c3fffc940fdb97a23108ca8 jdk8-b103
|
||||||
|
d411c60a8c2fe8fdc572af907775e90f7eefd513 jdk8-b104
|
||||||
|
@ -367,3 +367,7 @@ f6921c876db192bba389cec062855a66372da01c jdk8-b101
|
|||||||
530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44
|
530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44
|
||||||
c4697c1c448416108743b59118b4a2498b339d0c jdk8-b102
|
c4697c1c448416108743b59118b4a2498b339d0c jdk8-b102
|
||||||
7f55137d6aa81efc6eb0035813709f2cb6a26b8b hs25-b45
|
7f55137d6aa81efc6eb0035813709f2cb6a26b8b hs25-b45
|
||||||
|
6f9be7f87b9653e94fd8fb3070891a0cc91b15bf jdk8-b103
|
||||||
|
580430d131ccd475e2f2ad4006531b8c4813d102 hs25-b46
|
||||||
|
104743074675359cfbf7f4dcd9ab2a5974a16627 jdk8-b104
|
||||||
|
c1604d5885a6f2adc0bcea2fa142a8f6bafad2f0 hs25-b47
|
||||||
|
@ -75,19 +75,19 @@ public class InstanceKlass extends Klass {
|
|||||||
javaFieldsCount = new CIntField(type.getCIntegerField("_java_fields_count"), 0);
|
javaFieldsCount = new CIntField(type.getCIntegerField("_java_fields_count"), 0);
|
||||||
constants = new MetadataField(type.getAddressField("_constants"), 0);
|
constants = new MetadataField(type.getAddressField("_constants"), 0);
|
||||||
classLoaderData = type.getAddressField("_class_loader_data");
|
classLoaderData = type.getAddressField("_class_loader_data");
|
||||||
sourceFileName = type.getAddressField("_source_file_name");
|
|
||||||
sourceDebugExtension = type.getAddressField("_source_debug_extension");
|
sourceDebugExtension = type.getAddressField("_source_debug_extension");
|
||||||
innerClasses = type.getAddressField("_inner_classes");
|
innerClasses = type.getAddressField("_inner_classes");
|
||||||
|
sourceFileNameIndex = new CIntField(type.getCIntegerField("_source_file_name_index"), 0);
|
||||||
nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), 0);
|
nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), 0);
|
||||||
staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), 0);
|
staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), 0);
|
||||||
staticOopFieldCount = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
|
staticOopFieldCount = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
|
||||||
nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
|
nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
|
||||||
isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), 0);
|
isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), 0);
|
||||||
initState = new CIntField(type.getCIntegerField("_init_state"), 0);
|
initState = new CIntField(type.getCIntegerField("_init_state"), 0);
|
||||||
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
|
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
|
||||||
itableLen = new CIntField(type.getCIntegerField("_itable_len"), 0);
|
itableLen = new CIntField(type.getCIntegerField("_itable_len"), 0);
|
||||||
breakpoints = type.getAddressField("_breakpoints");
|
breakpoints = type.getAddressField("_breakpoints");
|
||||||
genericSignature = type.getAddressField("_generic_signature");
|
genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"), 0);
|
||||||
majorVersion = new CIntField(type.getCIntegerField("_major_version"), 0);
|
majorVersion = new CIntField(type.getCIntegerField("_major_version"), 0);
|
||||||
minorVersion = new CIntField(type.getCIntegerField("_minor_version"), 0);
|
minorVersion = new CIntField(type.getCIntegerField("_minor_version"), 0);
|
||||||
headerSize = Oop.alignObjectOffset(type.getSize());
|
headerSize = Oop.alignObjectOffset(type.getSize());
|
||||||
@ -134,9 +134,9 @@ public class InstanceKlass extends Klass {
|
|||||||
private static CIntField javaFieldsCount;
|
private static CIntField javaFieldsCount;
|
||||||
private static MetadataField constants;
|
private static MetadataField constants;
|
||||||
private static AddressField classLoaderData;
|
private static AddressField classLoaderData;
|
||||||
private static AddressField sourceFileName;
|
|
||||||
private static AddressField sourceDebugExtension;
|
private static AddressField sourceDebugExtension;
|
||||||
private static AddressField innerClasses;
|
private static AddressField innerClasses;
|
||||||
|
private static CIntField sourceFileNameIndex;
|
||||||
private static CIntField nonstaticFieldSize;
|
private static CIntField nonstaticFieldSize;
|
||||||
private static CIntField staticFieldSize;
|
private static CIntField staticFieldSize;
|
||||||
private static CIntField staticOopFieldCount;
|
private static CIntField staticOopFieldCount;
|
||||||
@ -146,7 +146,7 @@ public class InstanceKlass extends Klass {
|
|||||||
private static CIntField vtableLen;
|
private static CIntField vtableLen;
|
||||||
private static CIntField itableLen;
|
private static CIntField itableLen;
|
||||||
private static AddressField breakpoints;
|
private static AddressField breakpoints;
|
||||||
private static AddressField genericSignature;
|
private static CIntField genericSignatureIndex;
|
||||||
private static CIntField majorVersion;
|
private static CIntField majorVersion;
|
||||||
private static CIntField minorVersion;
|
private static CIntField minorVersion;
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ public class InstanceKlass extends Klass {
|
|||||||
public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
|
public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
|
||||||
public ClassLoaderData getClassLoaderData() { return ClassLoaderData.instantiateWrapperFor(classLoaderData.getValue(getAddress())); }
|
public ClassLoaderData getClassLoaderData() { return ClassLoaderData.instantiateWrapperFor(classLoaderData.getValue(getAddress())); }
|
||||||
public Oop getClassLoader() { return getClassLoaderData().getClassLoader(); }
|
public Oop getClassLoader() { return getClassLoaderData().getClassLoader(); }
|
||||||
public Symbol getSourceFileName() { return getSymbol(sourceFileName); }
|
public Symbol getSourceFileName() { return getConstants().getSymbolAt(sourceFileNameIndex.getValue(this)); }
|
||||||
public String getSourceDebugExtension(){ return CStringUtilities.getString(sourceDebugExtension.getValue(getAddress())); }
|
public String getSourceDebugExtension(){ return CStringUtilities.getString(sourceDebugExtension.getValue(getAddress())); }
|
||||||
public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
|
public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
|
||||||
public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); }
|
public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); }
|
||||||
@ -354,7 +354,7 @@ public class InstanceKlass extends Klass {
|
|||||||
public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
|
public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
|
||||||
public long getVtableLen() { return vtableLen.getValue(this); }
|
public long getVtableLen() { return vtableLen.getValue(this); }
|
||||||
public long getItableLen() { return itableLen.getValue(this); }
|
public long getItableLen() { return itableLen.getValue(this); }
|
||||||
public Symbol getGenericSignature() { return getSymbol(genericSignature); }
|
public Symbol getGenericSignature() { return getConstants().getSymbolAt(genericSignatureIndex.getValue(this)); }
|
||||||
public long majorVersion() { return majorVersion.getValue(this); }
|
public long majorVersion() { return majorVersion.getValue(this); }
|
||||||
public long minorVersion() { return minorVersion.getValue(this); }
|
public long minorVersion() { return minorVersion.getValue(this); }
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ public class PhaseCFG extends Phase {
|
|||||||
Type type = db.lookupType("PhaseCFG");
|
Type type = db.lookupType("PhaseCFG");
|
||||||
numBlocksField = new CIntField(type.getCIntegerField("_num_blocks"), 0);
|
numBlocksField = new CIntField(type.getCIntegerField("_num_blocks"), 0);
|
||||||
blocksField = type.getAddressField("_blocks");
|
blocksField = type.getAddressField("_blocks");
|
||||||
bbsField = type.getAddressField("_bbs");
|
bbsField = type.getAddressField("_node_to_block_mapping");
|
||||||
brootField = type.getAddressField("_broot");
|
brootField = type.getAddressField("_broot");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,8 +92,13 @@ public class ClassDump extends Tool {
|
|||||||
System.err.println("Warning: Can not create class filter!");
|
System.err.println("Warning: Can not create class filter!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String outputDirectory = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", ".");
|
|
||||||
setOutputDirectory(outputDirectory);
|
// outputDirectory and jarStream are alternatives: setting one closes the other.
|
||||||
|
// If neither is set, use outputDirectory from the System property:
|
||||||
|
if (outputDirectory == null && jarStream == null) {
|
||||||
|
String dirName = System.getProperty("sun.jvm.hotspot.tools.jcore.outputDir", ".");
|
||||||
|
setOutputDirectory(dirName);
|
||||||
|
}
|
||||||
|
|
||||||
// walk through the system dictionary
|
// walk through the system dictionary
|
||||||
SystemDictionary dict = VM.getVM().getSystemDictionary();
|
SystemDictionary dict = VM.getVM().getSystemDictionary();
|
||||||
|
@ -41,13 +41,11 @@ SOURCE.AD = $(OUTDIR)/$(OS)_$(Platform_arch_model).ad
|
|||||||
|
|
||||||
ifeq ("${Platform_arch_model}", "${Platform_arch}")
|
ifeq ("${Platform_arch_model}", "${Platform_arch}")
|
||||||
SOURCES.AD = \
|
SOURCES.AD = \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad)
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
|
||||||
else
|
else
|
||||||
SOURCES.AD = \
|
SOURCES.AD = \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad)
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXEC = $(OUTDIR)/adlc
|
EXEC = $(OUTDIR)/adlc
|
||||||
|
@ -247,7 +247,7 @@ ifeq ($(USE_CLANG), true)
|
|||||||
# Not yet supported by clang in Xcode 4.6.2
|
# Not yet supported by clang in Xcode 4.6.2
|
||||||
# WARNINGS_ARE_ERRORS += -Wno-tautological-constant-out-of-range-compare
|
# WARNINGS_ARE_ERRORS += -Wno-tautological-constant-out-of-range-compare
|
||||||
WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
|
WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
|
||||||
WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
|
WARNINGS_ARE_ERRORS += -Wno-empty-body
|
||||||
endif
|
endif
|
||||||
|
|
||||||
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
|
WARNING_FLAGS = -Wpointer-arith -Wsign-compare -Wundef
|
||||||
|
@ -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=45
|
HS_BUILD_NUMBER=47
|
||||||
|
|
||||||
JDK_MAJOR_VER=1
|
JDK_MAJOR_VER=1
|
||||||
JDK_MINOR_VER=8
|
JDK_MINOR_VER=8
|
||||||
|
@ -41,13 +41,11 @@ SOURCE.AD = $(OUTDIR)/$(OS)_$(Platform_arch_model).ad
|
|||||||
|
|
||||||
ifeq ("${Platform_arch_model}", "${Platform_arch}")
|
ifeq ("${Platform_arch_model}", "${Platform_arch}")
|
||||||
SOURCES.AD = \
|
SOURCES.AD = \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad)
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
|
||||||
else
|
else
|
||||||
SOURCES.AD = \
|
SOURCES.AD = \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad)
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXEC = $(OUTDIR)/adlc
|
EXEC = $(OUTDIR)/adlc
|
||||||
|
@ -42,13 +42,11 @@ SOURCE.AD = $(OUTDIR)/$(OS)_$(Platform_arch_model).ad
|
|||||||
|
|
||||||
ifeq ("${Platform_arch_model}", "${Platform_arch}")
|
ifeq ("${Platform_arch_model}", "${Platform_arch}")
|
||||||
SOURCES.AD = \
|
SOURCES.AD = \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad)
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
|
||||||
else
|
else
|
||||||
SOURCES.AD = \
|
SOURCES.AD = \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad) \
|
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch).ad)
|
||||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
EXEC = $(OUTDIR)/adlc
|
EXEC = $(OUTDIR)/adlc
|
||||||
|
@ -283,9 +283,9 @@ $(DTRACE.o): $(DTRACE).d $(JVMOFFS).h $(JVMOFFS)Index.h $(DTraced_Files)
|
|||||||
$(QUIETLY) $(DTRACE_PROG) $(DTRACE_OPTS) -C -I. -G -xlazyload -o $@ -s $(DTRACE).d \
|
$(QUIETLY) $(DTRACE_PROG) $(DTRACE_OPTS) -C -I. -G -xlazyload -o $@ -s $(DTRACE).d \
|
||||||
$(DTraced_Files) ||\
|
$(DTraced_Files) ||\
|
||||||
STATUS=$$?;\
|
STATUS=$$?;\
|
||||||
if [ x"$$STATUS" = x"1" -a \
|
if [ x"$$STATUS" = x"1" ]; then \
|
||||||
x`uname -r` = x"5.10" -a \
|
if [ x`uname -r` = x"5.10" -a \
|
||||||
x`uname -p` = x"sparc" ]; then\
|
x`uname -p` = x"sparc" ]; then\
|
||||||
echo "*****************************************************************";\
|
echo "*****************************************************************";\
|
||||||
echo "* If you are building server compiler, and the error message is ";\
|
echo "* If you are building server compiler, and the error message is ";\
|
||||||
echo "* \"incorrect ELF machine type...\", you have run into solaris bug ";\
|
echo "* \"incorrect ELF machine type...\", you have run into solaris bug ";\
|
||||||
@ -294,6 +294,20 @@ $(DTRACE.o): $(DTRACE).d $(JVMOFFS).h $(JVMOFFS)Index.h $(DTraced_Files)
|
|||||||
echo "* environment variable HOTSPOT_DISABLE_DTRACE_PROBES to disable ";\
|
echo "* environment variable HOTSPOT_DISABLE_DTRACE_PROBES to disable ";\
|
||||||
echo "* dtrace probes for this build.";\
|
echo "* dtrace probes for this build.";\
|
||||||
echo "*****************************************************************";\
|
echo "*****************************************************************";\
|
||||||
|
elif [ x`uname -r` = x"5.10" ]; then\
|
||||||
|
echo "*****************************************************************";\
|
||||||
|
echo "* If you are seeing 'syntax error near \"umpiconninfo_t\"' on Solaris";\
|
||||||
|
echo "* 10, try doing 'cd /usr/lib/dtrace && gzip mpi.d' as root, ";\
|
||||||
|
echo "* or set the environment variable HOTSPOT_DISABLE_DTRACE_PROBES";\
|
||||||
|
echo "* to disable dtrace probes for this build.";\
|
||||||
|
echo "*****************************************************************";\
|
||||||
|
else \
|
||||||
|
echo "*****************************************************************";\
|
||||||
|
echo "* If you cannot fix dtrace build issues, try to ";\
|
||||||
|
echo "* set the environment variable HOTSPOT_DISABLE_DTRACE_PROBES";\
|
||||||
|
echo "* to disable dtrace probes for this build.";\
|
||||||
|
echo "*****************************************************************";\
|
||||||
|
fi; \
|
||||||
fi;\
|
fi;\
|
||||||
exit $$STATUS
|
exit $$STATUS
|
||||||
# Since some DTraced_Files are in LIBJVM.o and they are touched by this
|
# Since some DTraced_Files are in LIBJVM.o and they are touched by this
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
@echo off
|
@echo off
|
||||||
REM
|
REM
|
||||||
REM Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
REM Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
REM DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
REM
|
REM
|
||||||
REM This code is free software; you can redistribute it and/or modify it
|
REM This code is free software; you can redistribute it and/or modify it
|
||||||
@ -148,7 +148,7 @@ echo HotSpotJDKDist=%HotSpotJDKDist%
|
|||||||
|
|
||||||
REM This is now safe to do.
|
REM This is now safe to do.
|
||||||
:copyfiles
|
:copyfiles
|
||||||
for /D %%i in (compiler1, compiler2, tiered, core) do (
|
for /D %%i in (compiler1, compiler2, tiered ) do (
|
||||||
if NOT EXIST %HotSpotBuildSpace%\%%i\generated mkdir %HotSpotBuildSpace%\%%i\generated
|
if NOT EXIST %HotSpotBuildSpace%\%%i\generated mkdir %HotSpotBuildSpace%\%%i\generated
|
||||||
copy %HotSpotWorkSpace%\make\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\generated > NUL
|
copy %HotSpotWorkSpace%\make\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\generated > NUL
|
||||||
)
|
)
|
||||||
@ -156,7 +156,7 @@ copy %HotSpotWorkSpace%\make\windows\projectfiles\%%i\* %HotSpotBuildSpace%\%%i\
|
|||||||
REM force regneration of ProjectFile
|
REM force regneration of ProjectFile
|
||||||
if exist %ProjectFile% del %ProjectFile%
|
if exist %ProjectFile% del %ProjectFile%
|
||||||
|
|
||||||
for /D %%i in (compiler1, compiler2, tiered, core) do (
|
for /D %%i in (compiler1, compiler2, tiered ) do (
|
||||||
echo -- %%i --
|
echo -- %%i --
|
||||||
echo # Generated file! > %HotSpotBuildSpace%\%%i\local.make
|
echo # Generated file! > %HotSpotBuildSpace%\%%i\local.make
|
||||||
echo # Changing a variable below and then deleting %ProjectFile% will cause >> %HotSpotBuildSpace%\%%i\local.make
|
echo # Changing a variable below and then deleting %ProjectFile% will cause >> %HotSpotBuildSpace%\%%i\local.make
|
||||||
|
@ -73,19 +73,17 @@ done
|
|||||||
|
|
||||||
BASE_PATHS="${BASE_PATHS} ${GENERATED}/jvmtifiles ${GENERATED}/tracefiles"
|
BASE_PATHS="${BASE_PATHS} ${GENERATED}/jvmtifiles ${GENERATED}/tracefiles"
|
||||||
|
|
||||||
if [ -d "${ALTSRC}/share/vm/jfr" ]; then
|
if [ -d "${ALTSRC}/share/vm/jfr/buffers" ]; then
|
||||||
BASE_PATHS="${BASE_PATHS} ${ALTSRC}/share/vm/jfr"
|
|
||||||
BASE_PATHS="${BASE_PATHS} ${ALTSRC}/share/vm/jfr/buffers"
|
BASE_PATHS="${BASE_PATHS} ${ALTSRC}/share/vm/jfr/buffers"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
BASE_PATHS="${BASE_PATHS} ${COMMONSRC}/share/vm/prims/wbtestmethods"
|
BASE_PATHS="${BASE_PATHS} ${COMMONSRC}/share/vm/prims/wbtestmethods"
|
||||||
|
|
||||||
CORE_PATHS="${BASE_PATHS}"
|
|
||||||
# shared is already in BASE_PATHS. Should add vm/memory but that one is also in BASE_PATHS.
|
# shared is already in BASE_PATHS. Should add vm/memory but that one is also in BASE_PATHS.
|
||||||
if [ -d "${ALTSRC}/share/vm/gc_implementation" ]; then
|
if [ -d "${ALTSRC}/share/vm/gc_implementation" ]; then
|
||||||
CORE_PATHS="${CORE_PATHS} `$FIND ${ALTSRC}/share/vm/gc_implementation ! -name gc_implementation -prune -type d \! -name shared`"
|
BASE_PATHS="${BASE_PATHS} `$FIND ${ALTSRC}/share/vm/gc_implementation ! -name gc_implementation -prune -type d \! -name shared`"
|
||||||
fi
|
fi
|
||||||
CORE_PATHS="${CORE_PATHS} `$FIND ${COMMONSRC}/share/vm/gc_implementation ! -name gc_implementation -prune -type d \! -name shared`"
|
BASE_PATHS="${BASE_PATHS} `$FIND ${COMMONSRC}/share/vm/gc_implementation ! -name gc_implementation -prune -type d \! -name shared`"
|
||||||
|
|
||||||
if [ -d "${ALTSRC}/share/vm/c1" ]; then
|
if [ -d "${ALTSRC}/share/vm/c1" ]; then
|
||||||
COMPILER1_PATHS="${ALTSRC}/share/vm/c1"
|
COMPILER1_PATHS="${ALTSRC}/share/vm/c1"
|
||||||
@ -104,12 +102,11 @@ COMPILER2_PATHS="${COMPILER2_PATHS} ${GENERATED}/adfiles"
|
|||||||
|
|
||||||
# Include dirs per type.
|
# Include dirs per type.
|
||||||
case "${TYPE}" in
|
case "${TYPE}" in
|
||||||
"core") Src_Dirs="${CORE_PATHS}" ;;
|
"compiler1") Src_Dirs="${BASE_PATHS} ${COMPILER1_PATHS}" ;;
|
||||||
"compiler1") Src_Dirs="${CORE_PATHS} ${COMPILER1_PATHS}" ;;
|
"compiler2") Src_Dirs="${BASE_PATHS} ${COMPILER2_PATHS}" ;;
|
||||||
"compiler2") Src_Dirs="${CORE_PATHS} ${COMPILER2_PATHS}" ;;
|
"tiered") Src_Dirs="${BASE_PATHS} ${COMPILER1_PATHS} ${COMPILER2_PATHS}" ;;
|
||||||
"tiered") Src_Dirs="${CORE_PATHS} ${COMPILER1_PATHS} ${COMPILER2_PATHS}" ;;
|
"zero") Src_Dirs="${BASE_PATHS}" ;;
|
||||||
"zero") Src_Dirs="${CORE_PATHS}" ;;
|
"shark") Src_Dirs="${BASE_PATHS}" ;;
|
||||||
"shark") Src_Dirs="${CORE_PATHS}" ;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
COMPILER2_SPECIFIC_FILES="opto libadt bcEscapeAnalyzer.cpp c2_* runtime_*"
|
COMPILER2_SPECIFIC_FILES="opto libadt bcEscapeAnalyzer.cpp c2_* runtime_*"
|
||||||
@ -122,7 +119,6 @@ Src_Files_EXCLUDE="jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp"
|
|||||||
|
|
||||||
# Exclude per type.
|
# Exclude per type.
|
||||||
case "${TYPE}" in
|
case "${TYPE}" in
|
||||||
"core") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${COMPILER1_SPECIFIC_FILES} ${COMPILER2_SPECIFIC_FILES} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES} ciTypeFlow.cpp" ;;
|
|
||||||
"compiler1") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${COMPILER2_SPECIFIC_FILES} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES} ciTypeFlow.cpp" ;;
|
"compiler1") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${COMPILER2_SPECIFIC_FILES} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES} ciTypeFlow.cpp" ;;
|
||||||
"compiler2") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${COMPILER1_SPECIFIC_FILES} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES}" ;;
|
"compiler2") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${COMPILER1_SPECIFIC_FILES} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES}" ;;
|
||||||
"tiered") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES}" ;;
|
"tiered") Src_Files_EXCLUDE="${Src_Files_EXCLUDE} ${ZERO_SPECIFIC_FILES} ${SHARK_SPECIFIC_FILES}" ;;
|
||||||
@ -149,9 +145,17 @@ for e in ${Src_Dirs}; do
|
|||||||
Src_Files="${Src_Files}`findsrc ${e}` "
|
Src_Files="${Src_Files}`findsrc ${e}` "
|
||||||
done
|
done
|
||||||
|
|
||||||
Obj_Files=
|
Obj_Files=" "
|
||||||
for e in ${Src_Files}; do
|
for e in ${Src_Files}; do
|
||||||
Obj_Files="${Obj_Files}${e%\.[!.]*}.obj "
|
o="${e%\.[!.]*}.obj"
|
||||||
|
set +e
|
||||||
|
chk=`expr "${Obj_Files}" : ".* $o"`
|
||||||
|
set -e
|
||||||
|
if [ "$chk" != 0 ]; then
|
||||||
|
echo "# INFO: skipping duplicate $o"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
Obj_Files="${Obj_Files}$o "
|
||||||
done
|
done
|
||||||
|
|
||||||
echo Obj_Files=${Obj_Files}
|
echo Obj_Files=${Obj_Files}
|
||||||
|
@ -55,13 +55,11 @@ CXX_INCLUDE_DIRS=\
|
|||||||
|
|
||||||
!if "$(Platform_arch_model)" == "$(Platform_arch)"
|
!if "$(Platform_arch_model)" == "$(Platform_arch)"
|
||||||
SOURCES_AD=\
|
SOURCES_AD=\
|
||||||
$(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad \
|
$(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad
|
||||||
$(WorkSpace)/src/os_cpu/windows_$(Platform_arch)/vm/windows_$(Platform_arch_model).ad
|
|
||||||
!else
|
!else
|
||||||
SOURCES_AD=\
|
SOURCES_AD=\
|
||||||
$(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad \
|
$(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad \
|
||||||
$(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch).ad \
|
$(WorkSpace)/src/cpu/$(Platform_arch)/vm/$(Platform_arch).ad
|
||||||
$(WorkSpace)/src/os_cpu/windows_$(Platform_arch)/vm/windows_$(Platform_arch_model).ad
|
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
# NOTE! If you add any files here, you must also update GENERATED_NAMES_IN_DIR
|
# NOTE! If you add any files here, you must also update GENERATED_NAMES_IN_DIR
|
||||||
|
@ -44,10 +44,11 @@ ProjectCreatorSources=\
|
|||||||
|
|
||||||
# This is only used internally
|
# This is only used internally
|
||||||
ProjectCreatorIncludesPRIVATE=\
|
ProjectCreatorIncludesPRIVATE=\
|
||||||
-relativeInclude src\closed\share\vm \
|
-relativeAltSrcInclude src\closed \
|
||||||
-relativeInclude src\closed\os\windows\vm \
|
-altRelativeInclude share\vm \
|
||||||
-relativeInclude src\closed\os_cpu\windows_$(Platform_arch)\vm \
|
-altRelativeInclude os\windows\vm \
|
||||||
-relativeInclude src\closed\cpu\$(Platform_arch)\vm \
|
-altRelativeInclude os_cpu\windows_$(Platform_arch)\vm \
|
||||||
|
-altRelativeInclude cpu\$(Platform_arch)\vm \
|
||||||
-relativeInclude src\share\vm \
|
-relativeInclude src\share\vm \
|
||||||
-relativeInclude src\share\vm\precompiled \
|
-relativeInclude src\share\vm\precompiled \
|
||||||
-relativeInclude src\share\vm\prims\wbtestmethods \
|
-relativeInclude src\share\vm\prims\wbtestmethods \
|
||||||
@ -91,7 +92,7 @@ ProjectCreatorIDEOptions = \
|
|||||||
-disablePch getThread_windows_$(Platform_arch).cpp \
|
-disablePch getThread_windows_$(Platform_arch).cpp \
|
||||||
-disablePch_compiler2 opcodes.cpp
|
-disablePch_compiler2 opcodes.cpp
|
||||||
|
|
||||||
# Common options for the IDE builds for core, c1, and c2
|
# Common options for the IDE builds for c1, and c2
|
||||||
ProjectCreatorIDEOptions=\
|
ProjectCreatorIDEOptions=\
|
||||||
$(ProjectCreatorIDEOptions) \
|
$(ProjectCreatorIDEOptions) \
|
||||||
-sourceBase $(HOTSPOTWORKSPACE) \
|
-sourceBase $(HOTSPOTWORKSPACE) \
|
||||||
@ -157,19 +158,11 @@ ProjectCreatorIDEOptionsIgnoreCompiler2=\
|
|||||||
-ignoreFile_TARGET ciTypeFlow.hpp \
|
-ignoreFile_TARGET ciTypeFlow.hpp \
|
||||||
-ignoreFile_TARGET $(Platform_arch_model).ad
|
-ignoreFile_TARGET $(Platform_arch_model).ad
|
||||||
|
|
||||||
##################################################
|
|
||||||
# Without compiler(core) specific options
|
|
||||||
##################################################
|
|
||||||
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
|
|
||||||
$(ProjectCreatorIDEOptionsIgnoreCompiler1:TARGET=core) \
|
|
||||||
$(ProjectCreatorIDEOptionsIgnoreCompiler2:TARGET=core)
|
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Client(C1) compiler specific options
|
# Client(C1) compiler specific options
|
||||||
##################################################
|
##################################################
|
||||||
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
|
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
|
||||||
-define_compiler1 COMPILER1 \
|
-define_compiler1 COMPILER1 \
|
||||||
-ignorePath_compiler1 core \
|
|
||||||
$(ProjectCreatorIDEOptionsIgnoreCompiler2:TARGET=compiler1)
|
$(ProjectCreatorIDEOptionsIgnoreCompiler2:TARGET=compiler1)
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
@ -178,7 +171,6 @@ $(ProjectCreatorIDEOptionsIgnoreCompiler2:TARGET=compiler1)
|
|||||||
#NOTE! This list must be kept in sync with GENERATED_NAMES in adlc.make.
|
#NOTE! This list must be kept in sync with GENERATED_NAMES in adlc.make.
|
||||||
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
|
ProjectCreatorIDEOptions=$(ProjectCreatorIDEOptions) \
|
||||||
-define_compiler2 COMPILER2 \
|
-define_compiler2 COMPILER2 \
|
||||||
-ignorePath_compiler2 core \
|
|
||||||
-additionalFile_compiler2 $(Platform_arch_model).ad \
|
-additionalFile_compiler2 $(Platform_arch_model).ad \
|
||||||
-additionalFile_compiler2 ad_$(Platform_arch_model).cpp \
|
-additionalFile_compiler2 ad_$(Platform_arch_model).cpp \
|
||||||
-additionalFile_compiler2 ad_$(Platform_arch_model).hpp \
|
-additionalFile_compiler2 ad_$(Platform_arch_model).hpp \
|
||||||
|
@ -90,25 +90,25 @@ $(TraceOutDir)/traceTypes.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceType
|
|||||||
!if "$(OPENJDK)" == "true"
|
!if "$(OPENJDK)" == "true"
|
||||||
|
|
||||||
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
||||||
@echo Generating $@
|
@echo Generating OpenJDK $@
|
||||||
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp
|
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp
|
||||||
|
|
||||||
!else
|
!else
|
||||||
|
|
||||||
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
$(TraceOutDir)/traceEventClasses.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventClasses.xsl $(XML_DEPS)
|
||||||
@echo Generating $@
|
@echo Generating AltSrc $@
|
||||||
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp
|
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventClasses.xsl -OUT $(TraceOutDir)/traceEventClasses.hpp
|
||||||
|
|
||||||
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
|
$(TraceOutDir)/traceProducer.cpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceProducer.xsl $(XML_DEPS)
|
||||||
@echo Generating $@
|
@echo Generating AltSrc $@
|
||||||
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceProducer.xsl -OUT $(TraceOutDir)/traceProducer.cpp
|
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceProducer.xsl -OUT $(TraceOutDir)/traceProducer.cpp
|
||||||
|
|
||||||
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
|
$(TraceOutDir)/traceRequestables.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceRequestables.xsl $(XML_DEPS)
|
||||||
@echo Generating $@
|
@echo Generating AltSrc $@
|
||||||
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceRequestables.xsl -OUT $(TraceOutDir)/traceRequestables.hpp
|
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceRequestables.xsl -OUT $(TraceOutDir)/traceRequestables.hpp
|
||||||
|
|
||||||
$(TraceOutDir)/traceEventControl.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventControl.xsl $(XML_DEPS)
|
$(TraceOutDir)/traceEventControl.hpp: $(TraceSrcDir)/trace.xml $(TraceAltSrcDir)/traceEventControl.xsl $(XML_DEPS)
|
||||||
@echo Generating $@
|
@echo Generating AltSrc $@
|
||||||
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventControl.xsl -OUT $(TraceOutDir)/traceEventControl.hpp
|
@$(XSLT) -IN $(TraceSrcDir)/trace.xml -XSL $(TraceAltSrcDir)/traceEventControl.xsl -OUT $(TraceOutDir)/traceEventControl.hpp
|
||||||
|
|
||||||
!endif
|
!endif
|
||||||
|
@ -36,10 +36,6 @@ CXX_FLAGS=$(CXX_FLAGS) /D "PRODUCT"
|
|||||||
CXX_FLAGS=$(CXX_FLAGS) /D "ASSERT"
|
CXX_FLAGS=$(CXX_FLAGS) /D "ASSERT"
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
!if "$(Variant)" == "core"
|
|
||||||
# No need to define anything, CORE is defined as !COMPILER1 && !COMPILER2
|
|
||||||
!endif
|
|
||||||
|
|
||||||
!if "$(Variant)" == "compiler1"
|
!if "$(Variant)" == "compiler1"
|
||||||
CXX_FLAGS=$(CXX_FLAGS) /D "COMPILER1"
|
CXX_FLAGS=$(CXX_FLAGS) /D "COMPILER1"
|
||||||
!endif
|
!endif
|
||||||
|
@ -112,6 +112,7 @@ ReleaseOptions = -define HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) -def
|
|||||||
ProjectCreatorIDEOptions = $(ProjectCreatorIDEOptions) $(ReleaseOptions)
|
ProjectCreatorIDEOptions = $(ProjectCreatorIDEOptions) $(ReleaseOptions)
|
||||||
|
|
||||||
$(HOTSPOTBUILDSPACE)/$(ProjectFile): $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
|
$(HOTSPOTBUILDSPACE)/$(ProjectFile): $(HOTSPOTBUILDSPACE)/classes/ProjectCreator.class
|
||||||
|
@if "$(MSC_VER)"=="1500" echo Make sure you have VS2008 SP1 or later, or you may see 'expanded command line too long'
|
||||||
@$(RUN_JAVA) -Djava.class.path="$(HOTSPOTBUILDSPACE)/classes" ProjectCreator WinGammaPlatform$(VcVersion) $(ProjectCreatorIDEOptions)
|
@$(RUN_JAVA) -Djava.class.path="$(HOTSPOTBUILDSPACE)/classes" ProjectCreator WinGammaPlatform$(VcVersion) $(ProjectCreatorIDEOptions)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -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
|
||||||
@ -29,6 +29,7 @@
|
|||||||
#include "interpreter/interpreter.hpp"
|
#include "interpreter/interpreter.hpp"
|
||||||
#include "memory/cardTableModRefBS.hpp"
|
#include "memory/cardTableModRefBS.hpp"
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
|
#include "memory/universe.hpp"
|
||||||
#include "prims/methodHandles.hpp"
|
#include "prims/methodHandles.hpp"
|
||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
@ -1145,7 +1146,7 @@ void MacroAssembler::set_narrow_klass(Klass* k, Register d) {
|
|||||||
assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
assert(oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
||||||
int klass_index = oop_recorder()->find_index(k);
|
int klass_index = oop_recorder()->find_index(k);
|
||||||
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
||||||
narrowOop encoded_k = oopDesc::encode_klass(k);
|
narrowOop encoded_k = Klass::encode_klass(k);
|
||||||
|
|
||||||
assert_not_delayed();
|
assert_not_delayed();
|
||||||
// Relocation with special format (see relocInfo_sparc.hpp).
|
// Relocation with special format (see relocInfo_sparc.hpp).
|
||||||
@ -1419,7 +1420,6 @@ void MacroAssembler::verify_oop_subroutine() {
|
|||||||
load_klass(O0_obj, O0_obj);
|
load_klass(O0_obj, O0_obj);
|
||||||
// assert((klass != NULL)
|
// assert((klass != NULL)
|
||||||
br_null_short(O0_obj, pn, fail);
|
br_null_short(O0_obj, pn, fail);
|
||||||
// TODO: Future assert that klass is lower 4g memory for UseCompressedKlassPointers
|
|
||||||
|
|
||||||
wrccr( O5_save_flags ); // Restore CCR's
|
wrccr( O5_save_flags ); // Restore CCR's
|
||||||
|
|
||||||
@ -4089,52 +4089,91 @@ void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::encode_klass_not_null(Register r) {
|
void MacroAssembler::encode_klass_not_null(Register r) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
|
||||||
assert (UseCompressedKlassPointers, "must be compressed");
|
assert (UseCompressedKlassPointers, "must be compressed");
|
||||||
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
|
||||||
if (Universe::narrow_klass_base() != NULL)
|
assert(r != G6_heapbase, "bad register choice");
|
||||||
sub(r, G6_heapbase, r);
|
set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
|
||||||
srlx(r, LogKlassAlignmentInBytes, r);
|
sub(r, G6_heapbase, r);
|
||||||
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
|
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
||||||
|
srlx(r, LogKlassAlignmentInBytes, r);
|
||||||
|
}
|
||||||
|
reinit_heapbase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
|
void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
if (src == dst) {
|
||||||
assert (UseCompressedKlassPointers, "must be compressed");
|
encode_klass_not_null(src);
|
||||||
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
|
||||||
if (Universe::narrow_klass_base() == NULL) {
|
|
||||||
srlx(src, LogKlassAlignmentInBytes, dst);
|
|
||||||
} else {
|
} else {
|
||||||
sub(src, G6_heapbase, dst);
|
assert (UseCompressedKlassPointers, "must be compressed");
|
||||||
srlx(dst, LogKlassAlignmentInBytes, dst);
|
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
|
||||||
|
set((intptr_t)Universe::narrow_klass_base(), dst);
|
||||||
|
sub(src, dst, dst);
|
||||||
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
|
srlx(dst, LogKlassAlignmentInBytes, dst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function instr_size_for_decode_klass_not_null() counts the instructions
|
||||||
|
// generated by decode_klass_not_null() and reinit_heapbase(). Hence, if
|
||||||
|
// the instructions they generate change, then this method needs to be updated.
|
||||||
|
int MacroAssembler::instr_size_for_decode_klass_not_null() {
|
||||||
|
assert (UseCompressedKlassPointers, "only for compressed klass ptrs");
|
||||||
|
// set + add + set
|
||||||
|
int num_instrs = insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) + 1 +
|
||||||
|
insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base());
|
||||||
|
if (Universe::narrow_klass_shift() == 0) {
|
||||||
|
return num_instrs * BytesPerInstWord;
|
||||||
|
} else { // sllx
|
||||||
|
return (num_instrs + 1) * BytesPerInstWord;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// !!! If the instructions that get generated here change then function
|
||||||
|
// instr_size_for_decode_klass_not_null() needs to get updated.
|
||||||
void MacroAssembler::decode_klass_not_null(Register r) {
|
void MacroAssembler::decode_klass_not_null(Register r) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
|
||||||
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
|
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
|
||||||
// pd_code_size_limit.
|
// pd_code_size_limit.
|
||||||
assert (UseCompressedKlassPointers, "must be compressed");
|
assert (UseCompressedKlassPointers, "must be compressed");
|
||||||
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
|
||||||
sllx(r, LogKlassAlignmentInBytes, r);
|
assert(r != G6_heapbase, "bad register choice");
|
||||||
if (Universe::narrow_klass_base() != NULL)
|
set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
|
||||||
add(r, G6_heapbase, r);
|
if (Universe::narrow_klass_shift() != 0)
|
||||||
|
sllx(r, LogKlassAlignmentInBytes, r);
|
||||||
|
add(r, G6_heapbase, r);
|
||||||
|
reinit_heapbase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::decode_klass_not_null(Register src, Register dst) {
|
void MacroAssembler::decode_klass_not_null(Register src, Register dst) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
if (src == dst) {
|
||||||
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
|
decode_klass_not_null(src);
|
||||||
// pd_code_size_limit.
|
} else {
|
||||||
assert (UseCompressedKlassPointers, "must be compressed");
|
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
|
||||||
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
// pd_code_size_limit.
|
||||||
sllx(src, LogKlassAlignmentInBytes, dst);
|
assert (UseCompressedKlassPointers, "must be compressed");
|
||||||
if (Universe::narrow_klass_base() != NULL)
|
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
|
||||||
add(dst, G6_heapbase, dst);
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
|
assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice");
|
||||||
|
set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
|
||||||
|
sllx(src, LogKlassAlignmentInBytes, dst);
|
||||||
|
add(dst, G6_heapbase, dst);
|
||||||
|
reinit_heapbase();
|
||||||
|
} else {
|
||||||
|
set((intptr_t)Universe::narrow_klass_base(), dst);
|
||||||
|
add(src, dst, dst);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::reinit_heapbase() {
|
void MacroAssembler::reinit_heapbase() {
|
||||||
if (UseCompressedOops || UseCompressedKlassPointers) {
|
if (UseCompressedOops || UseCompressedKlassPointers) {
|
||||||
AddressLiteral base(Universe::narrow_ptrs_base_addr());
|
if (Universe::heap() != NULL) {
|
||||||
load_ptr_contents(base, G6_heapbase);
|
set((intptr_t)Universe::narrow_ptrs_base(), G6_heapbase);
|
||||||
|
} else {
|
||||||
|
AddressLiteral base(Universe::narrow_ptrs_base_addr());
|
||||||
|
load_ptr_contents(base, G6_heapbase);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1177,6 +1177,9 @@ public:
|
|||||||
void push_CPU_state();
|
void push_CPU_state();
|
||||||
void pop_CPU_state();
|
void pop_CPU_state();
|
||||||
|
|
||||||
|
// Returns the byte size of the instructions generated by decode_klass_not_null().
|
||||||
|
static int instr_size_for_decode_klass_not_null();
|
||||||
|
|
||||||
// if heap base register is used - reinit it with the correct value
|
// if heap base register is used - reinit it with the correct value
|
||||||
void reinit_heapbase();
|
void reinit_heapbase();
|
||||||
|
|
||||||
|
@ -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
|
||||||
@ -97,7 +97,7 @@ void Relocation::pd_set_data_value(address x, intptr_t o, bool verify_only) {
|
|||||||
guarantee(Assembler::inv_op2(inst)==Assembler::sethi_op2, "must be sethi");
|
guarantee(Assembler::inv_op2(inst)==Assembler::sethi_op2, "must be sethi");
|
||||||
if (format() != 0) {
|
if (format() != 0) {
|
||||||
assert(type() == relocInfo::oop_type || type() == relocInfo::metadata_type, "only narrow oops or klasses case");
|
assert(type() == relocInfo::oop_type || type() == relocInfo::metadata_type, "only narrow oops or klasses case");
|
||||||
jint np = type() == relocInfo::oop_type ? oopDesc::encode_heap_oop((oop)x) : oopDesc::encode_klass((Klass*)x);
|
jint np = type() == relocInfo::oop_type ? oopDesc::encode_heap_oop((oop)x) : Klass::encode_klass((Klass*)x);
|
||||||
inst &= ~Assembler::hi22(-1);
|
inst &= ~Assembler::hi22(-1);
|
||||||
inst |= Assembler::hi22((intptr_t)np);
|
inst |= Assembler::hi22((intptr_t)np);
|
||||||
if (verify_only) {
|
if (verify_only) {
|
||||||
|
@ -559,10 +559,7 @@ int MachCallDynamicJavaNode::ret_addr_offset() {
|
|||||||
int klass_load_size;
|
int klass_load_size;
|
||||||
if (UseCompressedKlassPointers) {
|
if (UseCompressedKlassPointers) {
|
||||||
assert(Universe::heap() != NULL, "java heap should be initialized");
|
assert(Universe::heap() != NULL, "java heap should be initialized");
|
||||||
if (Universe::narrow_klass_base() == NULL)
|
klass_load_size = MacroAssembler::instr_size_for_decode_klass_not_null() + 1*BytesPerInstWord;
|
||||||
klass_load_size = 2*BytesPerInstWord; // see MacroAssembler::load_klass()
|
|
||||||
else
|
|
||||||
klass_load_size = 3*BytesPerInstWord;
|
|
||||||
} else {
|
} else {
|
||||||
klass_load_size = 1*BytesPerInstWord;
|
klass_load_size = 1*BytesPerInstWord;
|
||||||
}
|
}
|
||||||
@ -1663,9 +1660,12 @@ void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
|
|||||||
if (UseCompressedKlassPointers) {
|
if (UseCompressedKlassPointers) {
|
||||||
assert(Universe::heap() != NULL, "java heap should be initialized");
|
assert(Universe::heap() != NULL, "java heap should be initialized");
|
||||||
st->print_cr("\tLDUW [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check - compressed klass");
|
st->print_cr("\tLDUW [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check - compressed klass");
|
||||||
st->print_cr("\tSLL R_G5,3,R_G5");
|
st->print_cr("\tSET Universe::narrow_klass_base,R_G6_heap_base");
|
||||||
if (Universe::narrow_klass_base() != NULL)
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
st->print_cr("\tADD R_G5,R_G6_heap_base,R_G5");
|
st->print_cr("\tSLL R_G5,3,R_G5");
|
||||||
|
}
|
||||||
|
st->print_cr("\tADD R_G5,R_G6_heap_base,R_G5");
|
||||||
|
st->print_cr("\tSET Universe::narrow_ptrs_base,R_G6_heap_base");
|
||||||
} else {
|
} else {
|
||||||
st->print_cr("\tLDX [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check");
|
st->print_cr("\tLDX [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check");
|
||||||
}
|
}
|
||||||
@ -2563,10 +2563,7 @@ encode %{
|
|||||||
int klass_load_size;
|
int klass_load_size;
|
||||||
if (UseCompressedKlassPointers) {
|
if (UseCompressedKlassPointers) {
|
||||||
assert(Universe::heap() != NULL, "java heap should be initialized");
|
assert(Universe::heap() != NULL, "java heap should be initialized");
|
||||||
if (Universe::narrow_klass_base() == NULL)
|
klass_load_size = MacroAssembler::instr_size_for_decode_klass_not_null() + 1*BytesPerInstWord;
|
||||||
klass_load_size = 2*BytesPerInstWord;
|
|
||||||
else
|
|
||||||
klass_load_size = 3*BytesPerInstWord;
|
|
||||||
} else {
|
} else {
|
||||||
klass_load_size = 1*BytesPerInstWord;
|
klass_load_size = 1*BytesPerInstWord;
|
||||||
}
|
}
|
||||||
|
@ -1887,6 +1887,27 @@ void TemplateInterpreterGenerator::generate_throw_exception() {
|
|||||||
if (ProfileInterpreter) {
|
if (ProfileInterpreter) {
|
||||||
__ set_method_data_pointer_for_bcp();
|
__ set_method_data_pointer_for_bcp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if INCLUDE_JVMTI
|
||||||
|
if (EnableInvokeDynamic) {
|
||||||
|
Label L_done;
|
||||||
|
|
||||||
|
__ ldub(Address(Lbcp, 0), G1_scratch); // Load current bytecode
|
||||||
|
__ cmp_and_br_short(G1_scratch, Bytecodes::_invokestatic, Assembler::notEqual, Assembler::pn, L_done);
|
||||||
|
|
||||||
|
// The member name argument must be restored if _invokestatic is re-executed after a PopFrame call.
|
||||||
|
// Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL.
|
||||||
|
|
||||||
|
__ call_VM(G1_scratch, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), I0, Lmethod, Lbcp);
|
||||||
|
|
||||||
|
__ br_null(G1_scratch, false, Assembler::pn, L_done);
|
||||||
|
__ delayed()->nop();
|
||||||
|
|
||||||
|
__ st_ptr(G1_scratch, Lesp, wordSize);
|
||||||
|
__ bind(L_done);
|
||||||
|
}
|
||||||
|
#endif // INCLUDE_JVMTI
|
||||||
|
|
||||||
// Resume bytecode interpretation at the current bcp
|
// Resume bytecode interpretation at the current bcp
|
||||||
__ dispatch_next(vtos);
|
__ dispatch_next(vtos);
|
||||||
// end of JVMTI PopFrame support
|
// end of JVMTI PopFrame support
|
||||||
|
@ -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
|
||||||
@ -219,13 +219,13 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
|||||||
const int basic = 5*BytesPerInstWord +
|
const int basic = 5*BytesPerInstWord +
|
||||||
// shift;add for load_klass (only shift with zero heap based)
|
// shift;add for load_klass (only shift with zero heap based)
|
||||||
(UseCompressedKlassPointers ?
|
(UseCompressedKlassPointers ?
|
||||||
((Universe::narrow_klass_base() == NULL) ? BytesPerInstWord : 2*BytesPerInstWord) : 0);
|
MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
|
||||||
return basic + slop;
|
return basic + slop;
|
||||||
} else {
|
} else {
|
||||||
const int basic = (28 LP64_ONLY(+ 6)) * BytesPerInstWord +
|
const int basic = (28 LP64_ONLY(+ 6)) * BytesPerInstWord +
|
||||||
// shift;add for load_klass (only shift with zero heap based)
|
// shift;add for load_klass (only shift with zero heap based)
|
||||||
(UseCompressedKlassPointers ?
|
(UseCompressedKlassPointers ?
|
||||||
((Universe::narrow_klass_base() == NULL) ? BytesPerInstWord : 2*BytesPerInstWord) : 0);
|
MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
|
||||||
return (basic + slop);
|
return (basic + slop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "interpreter/interpreter.hpp"
|
#include "interpreter/interpreter.hpp"
|
||||||
#include "memory/cardTableModRefBS.hpp"
|
#include "memory/cardTableModRefBS.hpp"
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
|
#include "memory/universe.hpp"
|
||||||
#include "prims/methodHandles.hpp"
|
#include "prims/methodHandles.hpp"
|
||||||
#include "runtime/biasedLocking.hpp"
|
#include "runtime/biasedLocking.hpp"
|
||||||
#include "runtime/interfaceSupport.hpp"
|
#include "runtime/interfaceSupport.hpp"
|
||||||
@ -4810,23 +4811,8 @@ void MacroAssembler::load_klass(Register dst, Register src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::load_prototype_header(Register dst, Register src) {
|
void MacroAssembler::load_prototype_header(Register dst, Register src) {
|
||||||
#ifdef _LP64
|
load_klass(dst, src);
|
||||||
if (UseCompressedKlassPointers) {
|
movptr(dst, Address(dst, Klass::prototype_header_offset()));
|
||||||
assert (Universe::heap() != NULL, "java heap should be initialized");
|
|
||||||
movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
|
|
||||||
if (Universe::narrow_klass_shift() != 0) {
|
|
||||||
assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
|
||||||
assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
|
|
||||||
movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset()));
|
|
||||||
} else {
|
|
||||||
movq(dst, Address(dst, Klass::prototype_header_offset()));
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
|
|
||||||
movptr(dst, Address(dst, Klass::prototype_header_offset()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::store_klass(Register dst, Register src) {
|
void MacroAssembler::store_klass(Register dst, Register src) {
|
||||||
@ -4914,7 +4900,7 @@ void MacroAssembler::store_klass_gap(Register dst, Register src) {
|
|||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
void MacroAssembler::verify_heapbase(const char* msg) {
|
void MacroAssembler::verify_heapbase(const char* msg) {
|
||||||
assert (UseCompressedOops || UseCompressedKlassPointers, "should be compressed");
|
assert (UseCompressedOops, "should be compressed");
|
||||||
assert (Universe::heap() != NULL, "java heap should be initialized");
|
assert (Universe::heap() != NULL, "java heap should be initialized");
|
||||||
if (CheckCompressedOops) {
|
if (CheckCompressedOops) {
|
||||||
Label ok;
|
Label ok;
|
||||||
@ -5058,69 +5044,80 @@ void MacroAssembler::decode_heap_oop_not_null(Register dst, Register src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::encode_klass_not_null(Register r) {
|
void MacroAssembler::encode_klass_not_null(Register r) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
|
||||||
#ifdef ASSERT
|
// Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
|
||||||
verify_heapbase("MacroAssembler::encode_klass_not_null: heap base corrupted?");
|
assert(r != r12_heapbase, "Encoding a klass in r12");
|
||||||
#endif
|
mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
|
||||||
if (Universe::narrow_klass_base() != NULL) {
|
subq(r, r12_heapbase);
|
||||||
subq(r, r12_heapbase);
|
|
||||||
}
|
|
||||||
if (Universe::narrow_klass_shift() != 0) {
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
||||||
shrq(r, LogKlassAlignmentInBytes);
|
shrq(r, LogKlassAlignmentInBytes);
|
||||||
}
|
}
|
||||||
|
reinit_heapbase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
|
void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
if (dst == src) {
|
||||||
#ifdef ASSERT
|
encode_klass_not_null(src);
|
||||||
verify_heapbase("MacroAssembler::encode_klass_not_null2: heap base corrupted?");
|
} else {
|
||||||
#endif
|
mov64(dst, (int64_t)Universe::narrow_klass_base());
|
||||||
if (dst != src) {
|
negq(dst);
|
||||||
movq(dst, src);
|
addq(dst, src);
|
||||||
}
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
if (Universe::narrow_klass_base() != NULL) {
|
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
||||||
subq(dst, r12_heapbase);
|
shrq(dst, LogKlassAlignmentInBytes);
|
||||||
}
|
}
|
||||||
if (Universe::narrow_klass_shift() != 0) {
|
|
||||||
assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
|
||||||
shrq(dst, LogKlassAlignmentInBytes);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function instr_size_for_decode_klass_not_null() counts the instructions
|
||||||
|
// generated by decode_klass_not_null(register r) and reinit_heapbase(),
|
||||||
|
// when (Universe::heap() != NULL). Hence, if the instructions they
|
||||||
|
// generate change, then this method needs to be updated.
|
||||||
|
int MacroAssembler::instr_size_for_decode_klass_not_null() {
|
||||||
|
assert (UseCompressedKlassPointers, "only for compressed klass ptrs");
|
||||||
|
// mov64 + addq + shlq? + mov64 (for reinit_heapbase()).
|
||||||
|
return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
// !!! If the instructions that get generated here change then function
|
||||||
|
// instr_size_for_decode_klass_not_null() needs to get updated.
|
||||||
void MacroAssembler::decode_klass_not_null(Register r) {
|
void MacroAssembler::decode_klass_not_null(Register r) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
|
||||||
// Note: it will change flags
|
// Note: it will change flags
|
||||||
|
assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
|
||||||
assert (UseCompressedKlassPointers, "should only be used for compressed headers");
|
assert (UseCompressedKlassPointers, "should only be used for compressed headers");
|
||||||
|
assert(r != r12_heapbase, "Decoding a klass in r12");
|
||||||
// Cannot assert, unverified entry point counts instructions (see .ad file)
|
// Cannot assert, unverified entry point counts instructions (see .ad file)
|
||||||
// vtableStubs also counts instructions in pd_code_size_limit.
|
// vtableStubs also counts instructions in pd_code_size_limit.
|
||||||
// Also do not verify_oop as this is called by verify_oop.
|
// Also do not verify_oop as this is called by verify_oop.
|
||||||
if (Universe::narrow_klass_shift() != 0) {
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
||||||
shlq(r, LogKlassAlignmentInBytes);
|
shlq(r, LogKlassAlignmentInBytes);
|
||||||
if (Universe::narrow_klass_base() != NULL) {
|
|
||||||
addq(r, r12_heapbase);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
assert (Universe::narrow_klass_base() == NULL, "sanity");
|
|
||||||
}
|
}
|
||||||
|
// Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
|
||||||
|
mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
|
||||||
|
addq(r, r12_heapbase);
|
||||||
|
reinit_heapbase();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
|
void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
|
||||||
assert(Metaspace::is_initialized(), "metaspace should be initialized");
|
|
||||||
// Note: it will change flags
|
// Note: it will change flags
|
||||||
|
assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
|
||||||
assert (UseCompressedKlassPointers, "should only be used for compressed headers");
|
assert (UseCompressedKlassPointers, "should only be used for compressed headers");
|
||||||
// Cannot assert, unverified entry point counts instructions (see .ad file)
|
if (dst == src) {
|
||||||
// vtableStubs also counts instructions in pd_code_size_limit.
|
decode_klass_not_null(dst);
|
||||||
// Also do not verify_oop as this is called by verify_oop.
|
|
||||||
if (Universe::narrow_klass_shift() != 0) {
|
|
||||||
assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
|
||||||
assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
|
|
||||||
leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
|
|
||||||
} else {
|
} else {
|
||||||
assert (Universe::narrow_klass_base() == NULL, "sanity");
|
// Cannot assert, unverified entry point counts instructions (see .ad file)
|
||||||
if (dst != src) {
|
// vtableStubs also counts instructions in pd_code_size_limit.
|
||||||
movq(dst, src);
|
// Also do not verify_oop as this is called by verify_oop.
|
||||||
|
|
||||||
|
mov64(dst, (int64_t)Universe::narrow_klass_base());
|
||||||
|
if (Universe::narrow_klass_shift() != 0) {
|
||||||
|
assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
|
||||||
|
assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
|
||||||
|
leaq(dst, Address(dst, src, Address::times_8, 0));
|
||||||
|
} else {
|
||||||
|
addq(dst, src);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5148,7 +5145,7 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
|
|||||||
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
||||||
int klass_index = oop_recorder()->find_index(k);
|
int klass_index = oop_recorder()->find_index(k);
|
||||||
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
||||||
mov_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
|
mov_narrow_oop(dst, Klass::encode_klass(k), rspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
|
void MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
|
||||||
@ -5156,7 +5153,7 @@ void MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
|
|||||||
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
||||||
int klass_index = oop_recorder()->find_index(k);
|
int klass_index = oop_recorder()->find_index(k);
|
||||||
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
||||||
mov_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
|
mov_narrow_oop(dst, Klass::encode_klass(k), rspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::cmp_narrow_oop(Register dst, jobject obj) {
|
void MacroAssembler::cmp_narrow_oop(Register dst, jobject obj) {
|
||||||
@ -5182,7 +5179,7 @@ void MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) {
|
|||||||
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
||||||
int klass_index = oop_recorder()->find_index(k);
|
int klass_index = oop_recorder()->find_index(k);
|
||||||
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
||||||
Assembler::cmp_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
|
Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
|
void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
|
||||||
@ -5190,14 +5187,23 @@ void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
|
|||||||
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
|
||||||
int klass_index = oop_recorder()->find_index(k);
|
int klass_index = oop_recorder()->find_index(k);
|
||||||
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
|
||||||
Assembler::cmp_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
|
Assembler::cmp_narrow_oop(dst, Klass::encode_klass(k), rspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::reinit_heapbase() {
|
void MacroAssembler::reinit_heapbase() {
|
||||||
if (UseCompressedOops || UseCompressedKlassPointers) {
|
if (UseCompressedOops || UseCompressedKlassPointers) {
|
||||||
movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
|
if (Universe::heap() != NULL) {
|
||||||
|
if (Universe::narrow_oop_base() == NULL) {
|
||||||
|
MacroAssembler::xorptr(r12_heapbase, r12_heapbase);
|
||||||
|
} else {
|
||||||
|
mov64(r12_heapbase, (int64_t)Universe::narrow_ptrs_base());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _LP64
|
#endif // _LP64
|
||||||
|
|
||||||
|
|
||||||
|
@ -371,6 +371,10 @@ class MacroAssembler: public Assembler {
|
|||||||
void cmp_narrow_klass(Register dst, Klass* k);
|
void cmp_narrow_klass(Register dst, Klass* k);
|
||||||
void cmp_narrow_klass(Address dst, Klass* k);
|
void cmp_narrow_klass(Address dst, Klass* k);
|
||||||
|
|
||||||
|
// Returns the byte size of the instructions generated by decode_klass_not_null()
|
||||||
|
// when compressed klass pointers are being used.
|
||||||
|
static int instr_size_for_decode_klass_not_null();
|
||||||
|
|
||||||
// if heap base register is used - reinit it with the correct value
|
// if heap base register is used - reinit it with the correct value
|
||||||
void reinit_heapbase();
|
void reinit_heapbase();
|
||||||
|
|
||||||
|
@ -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
|
||||||
@ -55,9 +55,9 @@ void Relocation::pd_set_data_value(address x, intptr_t o, bool verify_only) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (verify_only) {
|
if (verify_only) {
|
||||||
assert(*(uint32_t*) disp == oopDesc::encode_klass((Klass*)x), "instructions must match");
|
assert(*(uint32_t*) disp == Klass::encode_klass((Klass*)x), "instructions must match");
|
||||||
} else {
|
} else {
|
||||||
*(int32_t*) disp = oopDesc::encode_klass((Klass*)x);
|
*(int32_t*) disp = Klass::encode_klass((Klass*)x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -675,7 +675,6 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ movptr(rax, Address(rax, oopDesc::klass_offset_in_bytes())); // get klass
|
__ movptr(rax, Address(rax, oopDesc::klass_offset_in_bytes())); // get klass
|
||||||
__ testptr(rax, rax);
|
__ testptr(rax, rax);
|
||||||
__ jcc(Assembler::zero, error); // if klass is NULL it is broken
|
__ jcc(Assembler::zero, error); // if klass is NULL it is broken
|
||||||
// TODO: Future assert that klass is lower 4g memory for UseCompressedKlassPointers
|
|
||||||
|
|
||||||
// return if everything seems ok
|
// return if everything seems ok
|
||||||
__ bind(exit);
|
__ bind(exit);
|
||||||
|
@ -1021,7 +1021,6 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
__ load_klass(rax, rax); // get klass
|
__ load_klass(rax, rax); // get klass
|
||||||
__ testptr(rax, rax);
|
__ testptr(rax, rax);
|
||||||
__ jcc(Assembler::zero, error); // if klass is NULL it is broken
|
__ jcc(Assembler::zero, error); // if klass is NULL it is broken
|
||||||
// TODO: Future assert that klass is lower 4g memory for UseCompressedKlassPointers
|
|
||||||
|
|
||||||
// return if everything seems ok
|
// return if everything seems ok
|
||||||
__ bind(exit);
|
__ bind(exit);
|
||||||
|
@ -1920,6 +1920,29 @@ void TemplateInterpreterGenerator::generate_throw_exception() {
|
|||||||
__ get_thread(thread);
|
__ get_thread(thread);
|
||||||
__ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive);
|
__ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive);
|
||||||
|
|
||||||
|
#if INCLUDE_JVMTI
|
||||||
|
if (EnableInvokeDynamic) {
|
||||||
|
Label L_done;
|
||||||
|
const Register local0 = rdi;
|
||||||
|
|
||||||
|
__ cmpb(Address(rsi, 0), Bytecodes::_invokestatic);
|
||||||
|
__ jcc(Assembler::notEqual, L_done);
|
||||||
|
|
||||||
|
// The member name argument must be restored if _invokestatic is re-executed after a PopFrame call.
|
||||||
|
// Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL.
|
||||||
|
|
||||||
|
__ get_method(rdx);
|
||||||
|
__ movptr(rax, Address(local0, 0));
|
||||||
|
__ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), rax, rdx, rsi);
|
||||||
|
|
||||||
|
__ testptr(rax, rax);
|
||||||
|
__ jcc(Assembler::zero, L_done);
|
||||||
|
|
||||||
|
__ movptr(Address(rbx, 0), rax);
|
||||||
|
__ bind(L_done);
|
||||||
|
}
|
||||||
|
#endif // INCLUDE_JVMTI
|
||||||
|
|
||||||
__ dispatch_next(vtos);
|
__ dispatch_next(vtos);
|
||||||
// end of PopFrame support
|
// end of PopFrame support
|
||||||
|
|
||||||
|
@ -849,9 +849,9 @@ address InterpreterGenerator::generate_CRC32_update_entry() {
|
|||||||
address entry = __ pc();
|
address entry = __ pc();
|
||||||
|
|
||||||
// rbx,: Method*
|
// rbx,: Method*
|
||||||
// rsi: senderSP must preserved for slow path, set SP to it on fast path
|
// r13: senderSP must preserved for slow path, set SP to it on fast path
|
||||||
// rdx: scratch
|
// c_rarg0: scratch (rdi on non-Win64, rcx on Win64)
|
||||||
// rdi: scratch
|
// c_rarg1: scratch (rsi on non-Win64, rdx on Win64)
|
||||||
|
|
||||||
Label slow_path;
|
Label slow_path;
|
||||||
// If we need a safepoint check, generate full interpreter entry.
|
// If we need a safepoint check, generate full interpreter entry.
|
||||||
@ -865,8 +865,8 @@ address InterpreterGenerator::generate_CRC32_update_entry() {
|
|||||||
|
|
||||||
// Load parameters
|
// Load parameters
|
||||||
const Register crc = rax; // crc
|
const Register crc = rax; // crc
|
||||||
const Register val = rdx; // source java byte value
|
const Register val = c_rarg0; // source java byte value
|
||||||
const Register tbl = rdi; // scratch
|
const Register tbl = c_rarg1; // scratch
|
||||||
|
|
||||||
// Arguments are reversed on java expression stack
|
// Arguments are reversed on java expression stack
|
||||||
__ movl(val, Address(rsp, wordSize)); // byte value
|
__ movl(val, Address(rsp, wordSize)); // byte value
|
||||||
@ -880,7 +880,7 @@ address InterpreterGenerator::generate_CRC32_update_entry() {
|
|||||||
|
|
||||||
// _areturn
|
// _areturn
|
||||||
__ pop(rdi); // get return address
|
__ pop(rdi); // get return address
|
||||||
__ mov(rsp, rsi); // set sp to sender sp
|
__ mov(rsp, r13); // set sp to sender sp
|
||||||
__ jmp(rdi);
|
__ jmp(rdi);
|
||||||
|
|
||||||
// generate a vanilla native entry as the slow path
|
// generate a vanilla native entry as the slow path
|
||||||
@ -919,20 +919,24 @@ address InterpreterGenerator::generate_CRC32_updateBytes_entry(AbstractInterpret
|
|||||||
const Register crc = c_rarg0; // crc
|
const Register crc = c_rarg0; // crc
|
||||||
const Register buf = c_rarg1; // source java byte array address
|
const Register buf = c_rarg1; // source java byte array address
|
||||||
const Register len = c_rarg2; // length
|
const Register len = c_rarg2; // length
|
||||||
|
const Register off = len; // offset (never overlaps with 'len')
|
||||||
|
|
||||||
// Arguments are reversed on java expression stack
|
// Arguments are reversed on java expression stack
|
||||||
__ movl(len, Address(rsp, wordSize)); // Length
|
|
||||||
// Calculate address of start element
|
// Calculate address of start element
|
||||||
if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) {
|
if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) {
|
||||||
__ movptr(buf, Address(rsp, 3*wordSize)); // long buf
|
__ movptr(buf, Address(rsp, 3*wordSize)); // long buf
|
||||||
__ addptr(buf, Address(rsp, 2*wordSize)); // + offset
|
__ movl2ptr(off, Address(rsp, 2*wordSize)); // offset
|
||||||
|
__ addq(buf, off); // + offset
|
||||||
__ movl(crc, Address(rsp, 5*wordSize)); // Initial CRC
|
__ movl(crc, Address(rsp, 5*wordSize)); // Initial CRC
|
||||||
} else {
|
} else {
|
||||||
__ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array
|
__ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array
|
||||||
__ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size
|
__ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size
|
||||||
__ addptr(buf, Address(rsp, 2*wordSize)); // + offset
|
__ movl2ptr(off, Address(rsp, 2*wordSize)); // offset
|
||||||
|
__ addq(buf, off); // + offset
|
||||||
__ movl(crc, Address(rsp, 4*wordSize)); // Initial CRC
|
__ movl(crc, Address(rsp, 4*wordSize)); // Initial CRC
|
||||||
}
|
}
|
||||||
|
// Can now load 'len' since we're finished with 'off'
|
||||||
|
__ movl(len, Address(rsp, wordSize)); // Length
|
||||||
|
|
||||||
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, StubRoutines::updateBytesCRC32()), crc, buf, len);
|
__ super_call_VM_leaf(CAST_FROM_FN_PTR(address, StubRoutines::updateBytesCRC32()), crc, buf, len);
|
||||||
// result in rax
|
// result in rax
|
||||||
@ -1929,6 +1933,29 @@ void TemplateInterpreterGenerator::generate_throw_exception() {
|
|||||||
__ movl(Address(r15_thread, JavaThread::popframe_condition_offset()),
|
__ movl(Address(r15_thread, JavaThread::popframe_condition_offset()),
|
||||||
JavaThread::popframe_inactive);
|
JavaThread::popframe_inactive);
|
||||||
|
|
||||||
|
#if INCLUDE_JVMTI
|
||||||
|
if (EnableInvokeDynamic) {
|
||||||
|
Label L_done;
|
||||||
|
const Register local0 = r14;
|
||||||
|
|
||||||
|
__ cmpb(Address(r13, 0), Bytecodes::_invokestatic);
|
||||||
|
__ jcc(Assembler::notEqual, L_done);
|
||||||
|
|
||||||
|
// The member name argument must be restored if _invokestatic is re-executed after a PopFrame call.
|
||||||
|
// Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL.
|
||||||
|
|
||||||
|
__ get_method(rdx);
|
||||||
|
__ movptr(rax, Address(local0, 0));
|
||||||
|
__ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), rax, rdx, r13);
|
||||||
|
|
||||||
|
__ testptr(rax, rax);
|
||||||
|
__ jcc(Assembler::zero, L_done);
|
||||||
|
|
||||||
|
__ movptr(Address(rbx, 0), rax);
|
||||||
|
__ bind(L_done);
|
||||||
|
}
|
||||||
|
#endif // INCLUDE_JVMTI
|
||||||
|
|
||||||
__ dispatch_next(vtos);
|
__ dispatch_next(vtos);
|
||||||
// end of PopFrame support
|
// end of PopFrame support
|
||||||
|
|
||||||
|
@ -211,11 +211,11 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
|||||||
if (is_vtable_stub) {
|
if (is_vtable_stub) {
|
||||||
// Vtable stub size
|
// Vtable stub size
|
||||||
return (DebugVtables ? 512 : 24) + (CountCompiledCalls ? 13 : 0) +
|
return (DebugVtables ? 512 : 24) + (CountCompiledCalls ? 13 : 0) +
|
||||||
(UseCompressedKlassPointers ? 16 : 0); // 1 leaq can be 3 bytes + 1 long
|
(UseCompressedKlassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
|
||||||
} else {
|
} else {
|
||||||
// Itable stub size
|
// Itable stub size
|
||||||
return (DebugVtables ? 512 : 74) + (CountCompiledCalls ? 13 : 0) +
|
return (DebugVtables ? 512 : 74) + (CountCompiledCalls ? 13 : 0) +
|
||||||
(UseCompressedKlassPointers ? 32 : 0); // 2 leaqs
|
(UseCompressedKlassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
|
||||||
}
|
}
|
||||||
// In order to tune these parameters, run the JVM with VM options
|
// In order to tune these parameters, run the JVM with VM options
|
||||||
// +PrintMiscellaneous and +WizardMode to see information about
|
// +PrintMiscellaneous and +WizardMode to see information about
|
||||||
|
@ -1393,9 +1393,7 @@ void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
|
|||||||
{
|
{
|
||||||
if (UseCompressedKlassPointers) {
|
if (UseCompressedKlassPointers) {
|
||||||
st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
|
st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
|
||||||
if (Universe::narrow_klass_shift() != 0) {
|
st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
|
||||||
st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
|
|
||||||
}
|
|
||||||
st->print_cr("\tcmpq rax, rscratch1\t # Inline cache check");
|
st->print_cr("\tcmpq rax, rscratch1\t # Inline cache check");
|
||||||
} else {
|
} else {
|
||||||
st->print_cr("\tcmpq rax, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t"
|
st->print_cr("\tcmpq rax, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t"
|
||||||
@ -4035,146 +4033,6 @@ operand indPosIndexScaleOffsetNarrow(rRegN reg, immL32 off, rRegI idx, immI2 sca
|
|||||||
%}
|
%}
|
||||||
%}
|
%}
|
||||||
|
|
||||||
operand indirectNarrowKlass(rRegN reg)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(DecodeNKlass reg);
|
|
||||||
|
|
||||||
format %{ "[$reg]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index(0x4);
|
|
||||||
scale(0x0);
|
|
||||||
disp(0x0);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indOffset8NarrowKlass(rRegN reg, immL8 off)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (DecodeNKlass reg) off);
|
|
||||||
|
|
||||||
format %{ "[$reg + $off (8-bit)]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index(0x4);
|
|
||||||
scale(0x0);
|
|
||||||
disp($off);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indOffset32NarrowKlass(rRegN reg, immL32 off)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (DecodeNKlass reg) off);
|
|
||||||
|
|
||||||
format %{ "[$reg + $off (32-bit)]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index(0x4);
|
|
||||||
scale(0x0);
|
|
||||||
disp($off);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indIndexOffsetNarrowKlass(rRegN reg, rRegL lreg, immL32 off)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (AddP (DecodeNKlass reg) lreg) off);
|
|
||||||
|
|
||||||
op_cost(10);
|
|
||||||
format %{"[$reg + $off + $lreg]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index($lreg);
|
|
||||||
scale(0x0);
|
|
||||||
disp($off);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indIndexNarrowKlass(rRegN reg, rRegL lreg)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (DecodeNKlass reg) lreg);
|
|
||||||
|
|
||||||
op_cost(10);
|
|
||||||
format %{"[$reg + $lreg]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index($lreg);
|
|
||||||
scale(0x0);
|
|
||||||
disp(0x0);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indIndexScaleNarrowKlass(rRegN reg, rRegL lreg, immI2 scale)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (DecodeNKlass reg) (LShiftL lreg scale));
|
|
||||||
|
|
||||||
op_cost(10);
|
|
||||||
format %{"[$reg + $lreg << $scale]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index($lreg);
|
|
||||||
scale($scale);
|
|
||||||
disp(0x0);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indIndexScaleOffsetNarrowKlass(rRegN reg, immL32 off, rRegL lreg, immI2 scale)
|
|
||||||
%{
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0);
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (AddP (DecodeNKlass reg) (LShiftL lreg scale)) off);
|
|
||||||
|
|
||||||
op_cost(10);
|
|
||||||
format %{"[$reg + $off + $lreg << $scale]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index($lreg);
|
|
||||||
scale($scale);
|
|
||||||
disp($off);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indCompressedKlassOffset(rRegN reg, immL32 off) %{
|
|
||||||
predicate(UseCompressedKlassPointers && (Universe::narrow_klass_shift() == Address::times_8));
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
match(AddP (DecodeNKlass reg) off);
|
|
||||||
|
|
||||||
op_cost(10);
|
|
||||||
format %{"[R12 + $reg << 3 + $off] (compressed klass addressing)" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base(0xc); // R12
|
|
||||||
index($reg);
|
|
||||||
scale(0x3);
|
|
||||||
disp($off);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
operand indPosIndexScaleOffsetNarrowKlass(rRegN reg, immL32 off, rRegI idx, immI2 scale)
|
|
||||||
%{
|
|
||||||
constraint(ALLOC_IN_RC(ptr_reg));
|
|
||||||
predicate(Universe::narrow_klass_shift() == 0 && n->in(2)->in(3)->in(1)->as_Type()->type()->is_long()->_lo >= 0);
|
|
||||||
match(AddP (AddP (DecodeNKlass reg) (LShiftL (ConvI2L idx) scale)) off);
|
|
||||||
|
|
||||||
op_cost(10);
|
|
||||||
format %{"[$reg + $off + $idx << $scale]" %}
|
|
||||||
interface(MEMORY_INTER) %{
|
|
||||||
base($reg);
|
|
||||||
index($idx);
|
|
||||||
scale($scale);
|
|
||||||
disp($off);
|
|
||||||
%}
|
|
||||||
%}
|
|
||||||
|
|
||||||
//----------Special Memory Operands--------------------------------------------
|
//----------Special Memory Operands--------------------------------------------
|
||||||
// Stack Slot Operand - This operand is used for loading and storing temporary
|
// Stack Slot Operand - This operand is used for loading and storing temporary
|
||||||
// values on the stack where a match requires a value to
|
// values on the stack where a match requires a value to
|
||||||
@ -4345,11 +4203,7 @@ opclass memory(indirect, indOffset8, indOffset32, indIndexOffset, indIndex,
|
|||||||
indCompressedOopOffset,
|
indCompressedOopOffset,
|
||||||
indirectNarrow, indOffset8Narrow, indOffset32Narrow,
|
indirectNarrow, indOffset8Narrow, indOffset32Narrow,
|
||||||
indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow,
|
indIndexOffsetNarrow, indIndexNarrow, indIndexScaleNarrow,
|
||||||
indIndexScaleOffsetNarrow, indPosIndexScaleOffsetNarrow,
|
indIndexScaleOffsetNarrow, indPosIndexScaleOffsetNarrow);
|
||||||
indCompressedKlassOffset,
|
|
||||||
indirectNarrowKlass, indOffset8NarrowKlass, indOffset32NarrowKlass,
|
|
||||||
indIndexOffsetNarrowKlass, indIndexNarrowKlass, indIndexScaleNarrowKlass,
|
|
||||||
indIndexScaleOffsetNarrowKlass, indPosIndexScaleOffsetNarrowKlass);
|
|
||||||
|
|
||||||
//----------PIPELINE-----------------------------------------------------------
|
//----------PIPELINE-----------------------------------------------------------
|
||||||
// Rules which define the behavior of the target architectures pipeline.
|
// Rules which define the behavior of the target architectures pipeline.
|
||||||
@ -6665,7 +6519,7 @@ instruct decodeHeapOop_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{
|
|||||||
instruct encodeKlass_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
|
instruct encodeKlass_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
|
||||||
match(Set dst (EncodePKlass src));
|
match(Set dst (EncodePKlass src));
|
||||||
effect(KILL cr);
|
effect(KILL cr);
|
||||||
format %{ "encode_heap_oop_not_null $dst,$src" %}
|
format %{ "encode_klass_not_null $dst,$src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
__ encode_klass_not_null($dst$$Register, $src$$Register);
|
__ encode_klass_not_null($dst$$Register, $src$$Register);
|
||||||
%}
|
%}
|
||||||
@ -6675,7 +6529,7 @@ instruct encodeKlass_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
|
|||||||
instruct decodeKlass_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{
|
instruct decodeKlass_not_null(rRegP dst, rRegN src, rFlagsReg cr) %{
|
||||||
match(Set dst (DecodeNKlass src));
|
match(Set dst (DecodeNKlass src));
|
||||||
effect(KILL cr);
|
effect(KILL cr);
|
||||||
format %{ "decode_heap_oop_not_null $dst,$src" %}
|
format %{ "decode_klass_not_null $dst,$src" %}
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
Register s = $src$$Register;
|
Register s = $src$$Register;
|
||||||
Register d = $dst$$Register;
|
Register d = $dst$$Register;
|
||||||
|
@ -50,6 +50,7 @@ int AbstractAssembler::code_fill_byte() {
|
|||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
bool AbstractAssembler::pd_check_instruction_mark() {
|
bool AbstractAssembler::pd_check_instruction_mark() {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -73,6 +74,7 @@ void MacroAssembler::advance(int bytes) {
|
|||||||
RegisterOrConstant MacroAssembler::delayed_value_impl(
|
RegisterOrConstant MacroAssembler::delayed_value_impl(
|
||||||
intptr_t* delayed_value_addr, Register tmpl, int offset) {
|
intptr_t* delayed_value_addr, Register tmpl, int offset) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return RegisterOrConstant();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::store_oop(jobject obj) {
|
void MacroAssembler::store_oop(jobject obj) {
|
||||||
|
@ -1008,6 +1008,7 @@ void BytecodeInterpreter::layout_interpreterState(interpreterState istate,
|
|||||||
|
|
||||||
address CppInterpreter::return_entry(TosState state, int length) {
|
address CppInterpreter::return_entry(TosState state, int length) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
address CppInterpreter::deopt_entry(TosState state, int length) {
|
address CppInterpreter::deopt_entry(TosState state, int length) {
|
||||||
|
@ -58,8 +58,8 @@ class EntryFrame : public ZeroFrame {
|
|||||||
JavaCallWrapper* call_wrapper,
|
JavaCallWrapper* call_wrapper,
|
||||||
TRAPS);
|
TRAPS);
|
||||||
public:
|
public:
|
||||||
JavaCallWrapper *call_wrapper() const {
|
JavaCallWrapper **call_wrapper() const {
|
||||||
return (JavaCallWrapper *) value_of_word(call_wrapper_off);
|
return (JavaCallWrapper **) addr_of_word(call_wrapper_off);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -116,6 +116,7 @@ void frame::patch_pc(Thread* thread, address pc) {
|
|||||||
|
|
||||||
bool frame::safe_for_sender(JavaThread *thread) {
|
bool frame::safe_for_sender(JavaThread *thread) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void frame::pd_gc_epilog() {
|
void frame::pd_gc_epilog() {
|
||||||
@ -123,6 +124,7 @@ void frame::pd_gc_epilog() {
|
|||||||
|
|
||||||
bool frame::is_interpreted_frame_valid(JavaThread *thread) const {
|
bool frame::is_interpreted_frame_valid(JavaThread *thread) const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BasicType frame::interpreter_frame_result(oop* oop_result,
|
BasicType frame::interpreter_frame_result(oop* oop_result,
|
||||||
@ -184,9 +186,8 @@ BasicType frame::interpreter_frame_result(oop* oop_result,
|
|||||||
int frame::frame_size(RegisterMap* map) const {
|
int frame::frame_size(RegisterMap* map) const {
|
||||||
#ifdef PRODUCT
|
#ifdef PRODUCT
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
#else
|
|
||||||
return 0; // make javaVFrame::print_value work
|
|
||||||
#endif // PRODUCT
|
#endif // PRODUCT
|
||||||
|
return 0; // make javaVFrame::print_value work
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
|
intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
|
||||||
|
@ -36,7 +36,7 @@ inline frame::frame() {
|
|||||||
_deopt_state = unknown;
|
_deopt_state = unknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline address frame::sender_pc() const { ShouldNotCallThis(); }
|
inline address frame::sender_pc() const { ShouldNotCallThis(); return NULL; }
|
||||||
|
|
||||||
inline frame::frame(ZeroFrame* zf, intptr_t* sp) {
|
inline frame::frame(ZeroFrame* zf, intptr_t* sp) {
|
||||||
_zeroframe = zf;
|
_zeroframe = zf;
|
||||||
@ -89,6 +89,7 @@ inline intptr_t* frame::real_fp() const {
|
|||||||
|
|
||||||
inline intptr_t* frame::link() const {
|
inline intptr_t* frame::link() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CC_INTERP
|
#ifdef CC_INTERP
|
||||||
@ -141,7 +142,7 @@ inline intptr_t* frame::id() const {
|
|||||||
return fp();
|
return fp();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline JavaCallWrapper* frame::entry_frame_call_wrapper() const {
|
inline JavaCallWrapper** frame::entry_frame_call_wrapper_addr() const {
|
||||||
return zero_entryframe()->call_wrapper();
|
return zero_entryframe()->call_wrapper();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,14 +152,17 @@ inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) {
|
|||||||
|
|
||||||
inline oop frame::saved_oop_result(RegisterMap* map) const {
|
inline oop frame::saved_oop_result(RegisterMap* map) const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool frame::is_older(intptr_t* id) const {
|
inline bool frame::is_older(intptr_t* id) const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline intptr_t* frame::entry_frame_argument_at(int offset) const {
|
inline intptr_t* frame::entry_frame_argument_at(int offset) const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline intptr_t* frame::unextended_sp() const {
|
inline intptr_t* frame::unextended_sp() const {
|
||||||
|
@ -49,8 +49,10 @@ void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin,
|
|||||||
address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) {
|
address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) {
|
||||||
// NB ic_stub_code_size() must return the size of the code we generate
|
// NB ic_stub_code_size() must return the size of the code we generate
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) {
|
void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ class InterpreterMacroAssembler : public MacroAssembler {
|
|||||||
Register tmp,
|
Register tmp,
|
||||||
int offset) {
|
int offset) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return RegisterOrConstant();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -64,6 +64,7 @@ address InterpreterGenerator::generate_math_entry(
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Unimplemented();
|
Unimplemented();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
address InterpreterGenerator::generate_abstract_entry() {
|
address InterpreterGenerator::generate_abstract_entry() {
|
||||||
|
@ -51,15 +51,18 @@ class NativeInstruction VALUE_OBJ_CLASS_SPEC {
|
|||||||
public:
|
public:
|
||||||
bool is_jump() {
|
bool is_jump() {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_safepoint_poll() {
|
bool is_safepoint_poll() {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline NativeInstruction* nativeInstruction_at(address address) {
|
inline NativeInstruction* nativeInstruction_at(address address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
class NativeCall : public NativeInstruction {
|
class NativeCall : public NativeInstruction {
|
||||||
@ -70,18 +73,22 @@ class NativeCall : public NativeInstruction {
|
|||||||
|
|
||||||
address instruction_address() const {
|
address instruction_address() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
address next_instruction_address() const {
|
address next_instruction_address() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
address return_address() const {
|
address return_address() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
address destination() const {
|
address destination() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_destination_mt_safe(address dest) {
|
void set_destination_mt_safe(address dest) {
|
||||||
@ -98,25 +105,30 @@ class NativeCall : public NativeInstruction {
|
|||||||
|
|
||||||
static bool is_call_before(address return_address) {
|
static bool is_call_before(address return_address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline NativeCall* nativeCall_before(address return_address) {
|
inline NativeCall* nativeCall_before(address return_address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline NativeCall* nativeCall_at(address address) {
|
inline NativeCall* nativeCall_at(address address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
class NativeMovConstReg : public NativeInstruction {
|
class NativeMovConstReg : public NativeInstruction {
|
||||||
public:
|
public:
|
||||||
address next_instruction_address() const {
|
address next_instruction_address() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t data() const {
|
intptr_t data() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_data(intptr_t x) {
|
void set_data(intptr_t x) {
|
||||||
@ -126,12 +138,14 @@ class NativeMovConstReg : public NativeInstruction {
|
|||||||
|
|
||||||
inline NativeMovConstReg* nativeMovConstReg_at(address address) {
|
inline NativeMovConstReg* nativeMovConstReg_at(address address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
class NativeMovRegMem : public NativeInstruction {
|
class NativeMovRegMem : public NativeInstruction {
|
||||||
public:
|
public:
|
||||||
int offset() const {
|
int offset() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_offset(intptr_t x) {
|
void set_offset(intptr_t x) {
|
||||||
@ -145,6 +159,7 @@ class NativeMovRegMem : public NativeInstruction {
|
|||||||
|
|
||||||
inline NativeMovRegMem* nativeMovRegMem_at(address address) {
|
inline NativeMovRegMem* nativeMovRegMem_at(address address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
class NativeJump : public NativeInstruction {
|
class NativeJump : public NativeInstruction {
|
||||||
@ -155,6 +170,7 @@ class NativeJump : public NativeInstruction {
|
|||||||
|
|
||||||
address jump_destination() const {
|
address jump_destination() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_jump_destination(address dest) {
|
void set_jump_destination(address dest) {
|
||||||
@ -172,12 +188,14 @@ class NativeJump : public NativeInstruction {
|
|||||||
|
|
||||||
inline NativeJump* nativeJump_at(address address) {
|
inline NativeJump* nativeJump_at(address address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
class NativeGeneralJump : public NativeInstruction {
|
class NativeGeneralJump : public NativeInstruction {
|
||||||
public:
|
public:
|
||||||
address jump_destination() const {
|
address jump_destination() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void insert_unconditional(address code_pos, address entry) {
|
static void insert_unconditional(address code_pos, address entry) {
|
||||||
@ -191,6 +209,7 @@ class NativeGeneralJump : public NativeInstruction {
|
|||||||
|
|
||||||
inline NativeGeneralJump* nativeGeneralJump_at(address address) {
|
inline NativeGeneralJump* nativeGeneralJump_at(address address) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // CPU_ZERO_VM_NATIVEINST_ZERO_HPP
|
#endif // CPU_ZERO_VM_NATIVEINST_ZERO_HPP
|
||||||
|
@ -32,8 +32,10 @@ const int ConcreteRegisterImpl::max_fpr =
|
|||||||
|
|
||||||
const char* RegisterImpl::name() const {
|
const char* RegisterImpl::name() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* FloatRegisterImpl::name() const {
|
const char* FloatRegisterImpl::name() const {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ void Relocation::pd_set_data_value(address x, intptr_t o, bool verify_only) {
|
|||||||
|
|
||||||
address Relocation::pd_call_destination(address orig_addr) {
|
address Relocation::pd_call_destination(address orig_addr) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relocation::pd_set_call_destination(address x) {
|
void Relocation::pd_set_call_destination(address x) {
|
||||||
@ -45,6 +46,7 @@ void Relocation::pd_set_call_destination(address x) {
|
|||||||
|
|
||||||
address Relocation::pd_get_address_from_code() {
|
address Relocation::pd_get_address_from_code() {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
address* Relocation::pd_address_in_code() {
|
address* Relocation::pd_address_in_code() {
|
||||||
|
@ -89,6 +89,7 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
|||||||
ret_type);
|
ret_type);
|
||||||
#else
|
#else
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
#endif // SHARK
|
#endif // SHARK
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,6 +100,7 @@ int Deoptimization::last_frame_adjust(int callee_parameters,
|
|||||||
|
|
||||||
uint SharedRuntime::out_preserve_stack_slots() {
|
uint SharedRuntime::out_preserve_stack_slots() {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
JRT_LEAF(void, zero_stub())
|
JRT_LEAF(void, zero_stub())
|
||||||
@ -135,4 +137,5 @@ int SharedRuntime::c_calling_convention(const BasicType *sig_bt,
|
|||||||
VMRegPair *regs,
|
VMRegPair *regs,
|
||||||
int total_args_passed) {
|
int total_args_passed) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -176,6 +176,19 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
StubRoutines::_oop_arraycopy;
|
StubRoutines::_oop_arraycopy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int SafeFetch32(int *adr, int errValue) {
|
||||||
|
int value = errValue;
|
||||||
|
value = *adr;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static intptr_t SafeFetchN(intptr_t *adr, intptr_t errValue) {
|
||||||
|
intptr_t value = errValue;
|
||||||
|
value = *adr;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void generate_initial() {
|
void generate_initial() {
|
||||||
// Generates all stubs and initializes the entry points
|
// Generates all stubs and initializes the entry points
|
||||||
|
|
||||||
@ -225,6 +238,15 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
|
|
||||||
// arraycopy stubs used by compilers
|
// arraycopy stubs used by compilers
|
||||||
generate_arraycopy_stubs();
|
generate_arraycopy_stubs();
|
||||||
|
|
||||||
|
// Safefetch stubs.
|
||||||
|
StubRoutines::_safefetch32_entry = CAST_FROM_FN_PTR(address, StubGenerator::SafeFetch32);
|
||||||
|
StubRoutines::_safefetch32_fault_pc = NULL;
|
||||||
|
StubRoutines::_safefetch32_continuation_pc = NULL;
|
||||||
|
|
||||||
|
StubRoutines::_safefetchN_entry = CAST_FROM_FN_PTR(address, StubGenerator::SafeFetchN);
|
||||||
|
StubRoutines::_safefetchN_fault_pc = NULL;
|
||||||
|
StubRoutines::_safefetchN_continuation_pc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -39,16 +39,20 @@
|
|||||||
|
|
||||||
VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int VtableStub::pd_code_alignment() {
|
int VtableStub::pd_code_alignment() {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -445,14 +445,14 @@ AttachOperation* AttachListener::dequeue() {
|
|||||||
|
|
||||||
void AttachListener::vm_start() {
|
void AttachListener::vm_start() {
|
||||||
char fn[UNIX_PATH_MAX];
|
char fn[UNIX_PATH_MAX];
|
||||||
struct stat64 st;
|
struct stat st;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
int n = snprintf(fn, UNIX_PATH_MAX, "%s/.java_pid%d",
|
int n = snprintf(fn, UNIX_PATH_MAX, "%s/.java_pid%d",
|
||||||
os::get_temp_directory(), os::current_process_id());
|
os::get_temp_directory(), os::current_process_id());
|
||||||
assert(n < (int)UNIX_PATH_MAX, "java_pid file name buffer overflow");
|
assert(n < (int)UNIX_PATH_MAX, "java_pid file name buffer overflow");
|
||||||
|
|
||||||
RESTARTABLE(::stat64(fn, &st), ret);
|
RESTARTABLE(::stat(fn, &st), ret);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
ret = ::unlink(fn);
|
ret = ::unlink(fn);
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
|
@ -1642,6 +1642,8 @@ void os::print_os_info(outputStream* st) {
|
|||||||
|
|
||||||
void os::win32::print_windows_version(outputStream* st) {
|
void os::win32::print_windows_version(outputStream* st) {
|
||||||
OSVERSIONINFOEX osvi;
|
OSVERSIONINFOEX osvi;
|
||||||
|
SYSTEM_INFO si;
|
||||||
|
|
||||||
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
|
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
|
||||||
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
||||||
|
|
||||||
@ -1651,6 +1653,18 @@ void os::win32::print_windows_version(outputStream* st) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
|
int os_vers = osvi.dwMajorVersion * 1000 + osvi.dwMinorVersion;
|
||||||
|
|
||||||
|
ZeroMemory(&si, sizeof(SYSTEM_INFO));
|
||||||
|
if (os_vers >= 5002) {
|
||||||
|
// Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
|
||||||
|
// find out whether we are running on 64 bit processor or not.
|
||||||
|
if (os::Kernel32Dll::GetNativeSystemInfoAvailable()) {
|
||||||
|
os::Kernel32Dll::GetNativeSystemInfo(&si);
|
||||||
|
} else {
|
||||||
|
GetSystemInfo(&si);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
|
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
|
||||||
switch (os_vers) {
|
switch (os_vers) {
|
||||||
case 3051: st->print(" Windows NT 3.51"); break;
|
case 3051: st->print(" Windows NT 3.51"); break;
|
||||||
@ -1658,57 +1672,48 @@ void os::win32::print_windows_version(outputStream* st) {
|
|||||||
case 5000: st->print(" Windows 2000"); break;
|
case 5000: st->print(" Windows 2000"); break;
|
||||||
case 5001: st->print(" Windows XP"); break;
|
case 5001: st->print(" Windows XP"); break;
|
||||||
case 5002:
|
case 5002:
|
||||||
case 6000:
|
if (osvi.wProductType == VER_NT_WORKSTATION &&
|
||||||
case 6001:
|
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
|
||||||
case 6002: {
|
st->print(" Windows XP x64 Edition");
|
||||||
// Retrieve SYSTEM_INFO from GetNativeSystemInfo call so that we could
|
|
||||||
// find out whether we are running on 64 bit processor or not.
|
|
||||||
SYSTEM_INFO si;
|
|
||||||
ZeroMemory(&si, sizeof(SYSTEM_INFO));
|
|
||||||
if (!os::Kernel32Dll::GetNativeSystemInfoAvailable()){
|
|
||||||
GetSystemInfo(&si);
|
|
||||||
} else {
|
} else {
|
||||||
os::Kernel32Dll::GetNativeSystemInfo(&si);
|
st->print(" Windows Server 2003 family");
|
||||||
}
|
|
||||||
if (os_vers == 5002) {
|
|
||||||
if (osvi.wProductType == VER_NT_WORKSTATION &&
|
|
||||||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
|
||||||
st->print(" Windows XP x64 Edition");
|
|
||||||
else
|
|
||||||
st->print(" Windows Server 2003 family");
|
|
||||||
} else if (os_vers == 6000) {
|
|
||||||
if (osvi.wProductType == VER_NT_WORKSTATION)
|
|
||||||
st->print(" Windows Vista");
|
|
||||||
else
|
|
||||||
st->print(" Windows Server 2008");
|
|
||||||
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
|
||||||
st->print(" , 64 bit");
|
|
||||||
} else if (os_vers == 6001) {
|
|
||||||
if (osvi.wProductType == VER_NT_WORKSTATION) {
|
|
||||||
st->print(" Windows 7");
|
|
||||||
} else {
|
|
||||||
// Unrecognized windows, print out its major and minor versions
|
|
||||||
st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
|
|
||||||
}
|
|
||||||
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
|
||||||
st->print(" , 64 bit");
|
|
||||||
} else if (os_vers == 6002) {
|
|
||||||
if (osvi.wProductType == VER_NT_WORKSTATION) {
|
|
||||||
st->print(" Windows 8");
|
|
||||||
} else {
|
|
||||||
st->print(" Windows Server 2012");
|
|
||||||
}
|
|
||||||
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
|
||||||
st->print(" , 64 bit");
|
|
||||||
} else { // future os
|
|
||||||
// Unrecognized windows, print out its major and minor versions
|
|
||||||
st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
|
|
||||||
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
|
|
||||||
st->print(" , 64 bit");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default: // future windows, print out its major and minor versions
|
case 6000:
|
||||||
|
if (osvi.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
st->print(" Windows Vista");
|
||||||
|
} else {
|
||||||
|
st->print(" Windows Server 2008");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6001:
|
||||||
|
if (osvi.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
st->print(" Windows 7");
|
||||||
|
} else {
|
||||||
|
st->print(" Windows Server 2008 R2");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6002:
|
||||||
|
if (osvi.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
st->print(" Windows 8");
|
||||||
|
} else {
|
||||||
|
st->print(" Windows Server 2012");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6003:
|
||||||
|
if (osvi.wProductType == VER_NT_WORKSTATION) {
|
||||||
|
st->print(" Windows 8.1");
|
||||||
|
} else {
|
||||||
|
st->print(" Windows Server 2012 R2");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: // future os
|
||||||
|
// Unrecognized windows, print out its major and minor versions
|
||||||
st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
|
st->print(" Windows NT %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1720,6 +1725,11 @@ void os::win32::print_windows_version(outputStream* st) {
|
|||||||
st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
|
st->print(" Windows %d.%d", osvi.dwMajorVersion, osvi.dwMinorVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (os_vers >= 6000 && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
|
||||||
|
st->print(" , 64 bit");
|
||||||
|
}
|
||||||
|
|
||||||
st->print(" Build %d", osvi.dwBuildNumber);
|
st->print(" Build %d", osvi.dwBuildNumber);
|
||||||
st->print(" %s", osvi.szCSDVersion); // service pack
|
st->print(" %s", osvi.szCSDVersion); // service pack
|
||||||
st->cr();
|
st->cr();
|
||||||
|
@ -1,26 +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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// X86 Bsd Architecture Description File
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2003, 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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// AMD64 Bsd Architecture Description File
|
|
||||||
|
|
||||||
//----------OS-DEPENDENT ENCODING BLOCK----------------------------------------
|
|
||||||
// This block specifies the encoding classes used by the compiler to
|
|
||||||
// output byte streams. Encoding classes generate functions which are
|
|
||||||
// called by Machine Instruction Nodes in order to generate the bit
|
|
||||||
// encoding of the instruction. Operands specify their base encoding
|
|
||||||
// interface with the interface keyword. There are currently
|
|
||||||
// supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, &
|
|
||||||
// COND_INTER. REG_INTER causes an operand to generate a function
|
|
||||||
// which returns its register number when queried. CONST_INTER causes
|
|
||||||
// an operand to generate a function which returns the value of the
|
|
||||||
// constant when queried. MEMORY_INTER causes an operand to generate
|
|
||||||
// four functions which return the Base Register, the Index Register,
|
|
||||||
// the Scale Value, and the Offset Value of the operand when queried.
|
|
||||||
// COND_INTER causes an operand to generate six functions which return
|
|
||||||
// the encoding code (ie - encoding bits for the instruction)
|
|
||||||
// associated with each basic boolean condition for a conditional
|
|
||||||
// instruction. Instructions specify two basic values for encoding.
|
|
||||||
// They use the ins_encode keyword to specify their encoding class
|
|
||||||
// (which must be one of the class names specified in the encoding
|
|
||||||
// block), and they use the opcode keyword to specify, in order, their
|
|
||||||
// primary, secondary, and tertiary opcode. Only the opcode sections
|
|
||||||
// which a particular instruction needs for encoding need to be
|
|
||||||
// specified.
|
|
||||||
encode %{
|
|
||||||
// Build emit functions for each basic byte or larger field in the intel
|
|
||||||
// encoding scheme (opcode, rm, sib, immediate), and call them from C++
|
|
||||||
// code in the enc_class source block. Emit functions will live in the
|
|
||||||
// main source block for now. In future, we can generalize this by
|
|
||||||
// adding a syntax that specifies the sizes of fields in an order,
|
|
||||||
// so that the adlc can build the emit functions automagically
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
// Platform dependent source
|
|
||||||
|
|
||||||
source %{
|
|
||||||
|
|
||||||
%}
|
|
@ -190,7 +190,7 @@ inline void OrderAccess::release_store_fence(volatile juint* p, juint v)
|
|||||||
inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); }
|
inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); }
|
||||||
|
|
||||||
inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); }
|
inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); }
|
||||||
inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jdouble_cast(v)); }
|
inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); }
|
||||||
|
|
||||||
inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) {
|
inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) {
|
||||||
#ifdef AMD64
|
#ifdef AMD64
|
||||||
|
@ -715,6 +715,7 @@ JVM_handle_bsd_signal(int sig,
|
|||||||
err.report_and_die();
|
err.report_and_die();
|
||||||
|
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// From solaris_i486.s ported to bsd_i486.s
|
// From solaris_i486.s ported to bsd_i486.s
|
||||||
|
@ -66,6 +66,7 @@ address os::current_stack_pointer() {
|
|||||||
|
|
||||||
frame os::get_sender_for_C_frame(frame* fr) {
|
frame os::get_sender_for_C_frame(frame* fr) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
frame os::current_frame() {
|
frame os::current_frame() {
|
||||||
@ -103,16 +104,19 @@ void os::initialize_thread(Thread* thr) {
|
|||||||
|
|
||||||
address os::Bsd::ucontext_get_pc(ucontext_t* uc) {
|
address os::Bsd::ucontext_get_pc(ucontext_t* uc) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtendedPC os::fetch_frame_from_context(void* ucVoid,
|
ExtendedPC os::fetch_frame_from_context(void* ucVoid,
|
||||||
intptr_t** ret_sp,
|
intptr_t** ret_sp,
|
||||||
intptr_t** ret_fp) {
|
intptr_t** ret_fp) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return ExtendedPC();
|
||||||
}
|
}
|
||||||
|
|
||||||
frame os::fetch_frame_from_context(void* ucVoid) {
|
frame os::fetch_frame_from_context(void* ucVoid) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" JNIEXPORT int
|
extern "C" JNIEXPORT int
|
||||||
@ -240,6 +244,7 @@ JVM_handle_bsd_signal(int sig,
|
|||||||
|
|
||||||
sprintf(buf, fmt, sig, info->si_addr);
|
sprintf(buf, fmt, sig, info->si_addr);
|
||||||
fatal(buf);
|
fatal(buf);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void os::Bsd::init_thread_fpu_state(void) {
|
void os::Bsd::init_thread_fpu_state(void) {
|
||||||
@ -373,17 +378,7 @@ void os::print_register_info(outputStream *st, void *context) {
|
|||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
int SpinPause() {
|
int SpinPause() {
|
||||||
}
|
return 1;
|
||||||
|
|
||||||
int SafeFetch32(int *adr, int errValue) {
|
|
||||||
int value = errValue;
|
|
||||||
value = *adr;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
intptr_t SafeFetchN(intptr_t *adr, intptr_t errValue) {
|
|
||||||
intptr_t value = errValue;
|
|
||||||
value = *adr;
|
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
|
void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
|
||||||
|
@ -110,6 +110,7 @@
|
|||||||
void* ucontext,
|
void* ucontext,
|
||||||
bool isInJava) {
|
bool isInJava) {
|
||||||
ShouldNotCallThis();
|
ShouldNotCallThis();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// These routines are only used on cpu architectures that
|
// These routines are only used on cpu architectures that
|
||||||
|
@ -1,26 +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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// X86 Linux Architecture Description File
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2003, 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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// AMD64 Linux Architecture Description File
|
|
||||||
|
|
||||||
//----------OS-DEPENDENT ENCODING BLOCK----------------------------------------
|
|
||||||
// This block specifies the encoding classes used by the compiler to
|
|
||||||
// output byte streams. Encoding classes generate functions which are
|
|
||||||
// called by Machine Instruction Nodes in order to generate the bit
|
|
||||||
// encoding of the instruction. Operands specify their base encoding
|
|
||||||
// interface with the interface keyword. There are currently
|
|
||||||
// supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, &
|
|
||||||
// COND_INTER. REG_INTER causes an operand to generate a function
|
|
||||||
// which returns its register number when queried. CONST_INTER causes
|
|
||||||
// an operand to generate a function which returns the value of the
|
|
||||||
// constant when queried. MEMORY_INTER causes an operand to generate
|
|
||||||
// four functions which return the Base Register, the Index Register,
|
|
||||||
// the Scale Value, and the Offset Value of the operand when queried.
|
|
||||||
// COND_INTER causes an operand to generate six functions which return
|
|
||||||
// the encoding code (ie - encoding bits for the instruction)
|
|
||||||
// associated with each basic boolean condition for a conditional
|
|
||||||
// instruction. Instructions specify two basic values for encoding.
|
|
||||||
// They use the ins_encode keyword to specify their encoding class
|
|
||||||
// (which must be one of the class names specified in the encoding
|
|
||||||
// block), and they use the opcode keyword to specify, in order, their
|
|
||||||
// primary, secondary, and tertiary opcode. Only the opcode sections
|
|
||||||
// which a particular instruction needs for encoding need to be
|
|
||||||
// specified.
|
|
||||||
encode %{
|
|
||||||
// Build emit functions for each basic byte or larger field in the intel
|
|
||||||
// encoding scheme (opcode, rm, sib, immediate), and call them from C++
|
|
||||||
// code in the enc_class source block. Emit functions will live in the
|
|
||||||
// main source block for now. In future, we can generalize this by
|
|
||||||
// adding a syntax that specifies the sizes of fields in an order,
|
|
||||||
// so that the adlc can build the emit functions automagically
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
// Platform dependent source
|
|
||||||
|
|
||||||
source %{
|
|
||||||
|
|
||||||
%}
|
|
@ -410,16 +410,6 @@ extern "C" {
|
|||||||
int SpinPause() {
|
int SpinPause() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int SafeFetch32(int *adr, int errValue) {
|
|
||||||
int value = errValue;
|
|
||||||
value = *adr;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
intptr_t SafeFetchN(intptr_t *adr, intptr_t errValue) {
|
|
||||||
intptr_t value = errValue;
|
|
||||||
value = *adr;
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
|
void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
|
||||||
if (from > to) {
|
if (from > to) {
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 1999, 2007, 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.
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// SPARC Solaris Architecture Description File
|
|
@ -1,26 +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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// X86 Solaris Architecture Description File
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2004, 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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// AMD64 Solaris Architecture Description File
|
|
||||||
|
|
||||||
//----------OS-DEPENDENT ENCODING BLOCK----------------------------------------
|
|
||||||
// This block specifies the encoding classes used by the compiler to
|
|
||||||
// output byte streams. Encoding classes generate functions which are
|
|
||||||
// called by Machine Instruction Nodes in order to generate the bit
|
|
||||||
// encoding of the instruction. Operands specify their base encoding
|
|
||||||
// interface with the interface keyword. There are currently
|
|
||||||
// supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, &
|
|
||||||
// COND_INTER. REG_INTER causes an operand to generate a function
|
|
||||||
// which returns its register number when queried. CONST_INTER causes
|
|
||||||
// an operand to generate a function which returns the value of the
|
|
||||||
// constant when queried. MEMORY_INTER causes an operand to generate
|
|
||||||
// four functions which return the Base Register, the Index Register,
|
|
||||||
// the Scale Value, and the Offset Value of the operand when queried.
|
|
||||||
// COND_INTER causes an operand to generate six functions which return
|
|
||||||
// the encoding code (ie - encoding bits for the instruction)
|
|
||||||
// associated with each basic boolean condition for a conditional
|
|
||||||
// instruction. Instructions specify two basic values for encoding.
|
|
||||||
// They use the ins_encode keyword to specify their encoding class
|
|
||||||
// (which must be one of the class names specified in the encoding
|
|
||||||
// block), and they use the opcode keyword to specify, in order, their
|
|
||||||
// primary, secondary, and tertiary opcode. Only the opcode sections
|
|
||||||
// which a particular instruction needs for encoding need to be
|
|
||||||
// specified.
|
|
||||||
encode %{
|
|
||||||
// Build emit functions for each basic byte or larger field in the intel
|
|
||||||
// encoding scheme (opcode, rm, sib, immediate), and call them from C++
|
|
||||||
// code in the enc_class source block. Emit functions will live in the
|
|
||||||
// main source block for now. In future, we can generalize this by
|
|
||||||
// adding a syntax that specifies the sizes of fields in an order,
|
|
||||||
// so that the adlc can build the emit functions automagically
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
// Platform dependent source
|
|
||||||
|
|
||||||
source %{
|
|
||||||
%}
|
|
@ -1,26 +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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// X86 Win32 Architecture Description File
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2003, 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.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// AMD64 Win32 Architecture Description File
|
|
||||||
|
|
||||||
//----------OS-DEPENDENT ENCODING BLOCK-----------------------------------------------------
|
|
||||||
// This block specifies the encoding classes used by the compiler to output
|
|
||||||
// byte streams. Encoding classes generate functions which are called by
|
|
||||||
// Machine Instruction Nodes in order to generate the bit encoding of the
|
|
||||||
// instruction. Operands specify their base encoding interface with the
|
|
||||||
// interface keyword. There are currently supported four interfaces,
|
|
||||||
// REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an
|
|
||||||
// operand to generate a function which returns its register number when
|
|
||||||
// queried. CONST_INTER causes an operand to generate a function which
|
|
||||||
// returns the value of the constant when queried. MEMORY_INTER causes an
|
|
||||||
// operand to generate four functions which return the Base Register, the
|
|
||||||
// Index Register, the Scale Value, and the Offset Value of the operand when
|
|
||||||
// queried. COND_INTER causes an operand to generate six functions which
|
|
||||||
// return the encoding code (ie - encoding bits for the instruction)
|
|
||||||
// associated with each basic boolean condition for a conditional instruction.
|
|
||||||
// Instructions specify two basic values for encoding. They use the
|
|
||||||
// ins_encode keyword to specify their encoding class (which must be one of
|
|
||||||
// the class names specified in the encoding block), and they use the
|
|
||||||
// opcode keyword to specify, in order, their primary, secondary, and
|
|
||||||
// tertiary opcode. Only the opcode sections which a particular instruction
|
|
||||||
// needs for encoding need to be specified.
|
|
||||||
encode %{
|
|
||||||
// Build emit functions for each basic byte or larger field in the intel
|
|
||||||
// encoding scheme (opcode, rm, sib, immediate), and call them from C++
|
|
||||||
// code in the enc_class source block. Emit functions will live in the
|
|
||||||
// main source block for now. In future, we can generalize this by
|
|
||||||
// adding a syntax that specifies the sizes of fields in an order,
|
|
||||||
// so that the adlc can build the emit functions automagically
|
|
||||||
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
// Platform dependent source
|
|
||||||
|
|
||||||
source %{
|
|
||||||
|
|
||||||
%}
|
|
@ -142,6 +142,69 @@ class BuildConfig {
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns true if the specified path refers to a relative alternate
|
||||||
|
// source file. RelativeAltSrcInclude is usually "src\closed".
|
||||||
|
public static boolean matchesRelativeAltSrcInclude(String path) {
|
||||||
|
String relativeAltSrcInclude =
|
||||||
|
getFieldString(null, "RelativeAltSrcInclude");
|
||||||
|
Vector<String> v = getFieldVector(null, "AltRelativeInclude");
|
||||||
|
for (String pathPart : v) {
|
||||||
|
if (path.contains(relativeAltSrcInclude + Util.sep + pathPart)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the relative alternate source file for the specified path.
|
||||||
|
// Null is returned if the specified path does not have a matching
|
||||||
|
// alternate source file.
|
||||||
|
public static String getMatchingRelativeAltSrcFile(String path) {
|
||||||
|
Vector<String> v = getFieldVector(null, "RelativeAltSrcFileList");
|
||||||
|
if (v == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (String pathPart : v) {
|
||||||
|
if (path.endsWith(pathPart)) {
|
||||||
|
String relativeAltSrcInclude =
|
||||||
|
getFieldString(null, "RelativeAltSrcInclude");
|
||||||
|
return relativeAltSrcInclude + Util.sep + pathPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if the specified path has a matching alternate
|
||||||
|
// source file.
|
||||||
|
public static boolean matchesRelativeAltSrcFile(String path) {
|
||||||
|
return getMatchingRelativeAltSrcFile(path) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Track the specified alternate source file. The source file is
|
||||||
|
// tracked without the leading .*<sep><RelativeAltSrcFileList><sep>
|
||||||
|
// part to make matching regular source files easier.
|
||||||
|
public static void trackRelativeAltSrcFile(String path) {
|
||||||
|
String pattern = getFieldString(null, "RelativeAltSrcInclude") +
|
||||||
|
Util.sep;
|
||||||
|
int altSrcInd = path.indexOf(pattern);
|
||||||
|
if (altSrcInd == -1) {
|
||||||
|
// not an AltSrc path
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
altSrcInd += pattern.length();
|
||||||
|
if (altSrcInd >= path.length()) {
|
||||||
|
// not a valid AltSrc path
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String altSrcFile = path.substring(altSrcInd);
|
||||||
|
Vector v = getFieldVector(null, "RelativeAltSrcFileList");
|
||||||
|
if (v == null || !v.contains(altSrcFile)) {
|
||||||
|
addFieldVector(null, "RelativeAltSrcFileList", altSrcFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void addTo(Hashtable ht, String key, String value) {
|
void addTo(Hashtable ht, String key, String value) {
|
||||||
ht.put(expandFormat(key), expandFormat(value));
|
ht.put(expandFormat(key), expandFormat(value));
|
||||||
}
|
}
|
||||||
@ -272,8 +335,19 @@ class BuildConfig {
|
|||||||
|
|
||||||
private Vector getSourceIncludes() {
|
private Vector getSourceIncludes() {
|
||||||
Vector<String> rv = new Vector<String>();
|
Vector<String> rv = new Vector<String>();
|
||||||
Vector<String> ri = new Vector<String>();
|
|
||||||
String sourceBase = getFieldString(null, "SourceBase");
|
String sourceBase = getFieldString(null, "SourceBase");
|
||||||
|
|
||||||
|
// add relative alternate source include values:
|
||||||
|
String relativeAltSrcInclude =
|
||||||
|
getFieldString(null, "RelativeAltSrcInclude");
|
||||||
|
Vector<String> asri = new Vector<String>();
|
||||||
|
collectRelevantVectors(asri, "AltRelativeInclude");
|
||||||
|
for (String f : asri) {
|
||||||
|
rv.add(sourceBase + Util.sep + relativeAltSrcInclude +
|
||||||
|
Util.sep + f);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<String> ri = new Vector<String>();
|
||||||
collectRelevantVectors(ri, "RelativeInclude");
|
collectRelevantVectors(ri, "RelativeInclude");
|
||||||
for (String f : ri) {
|
for (String f : ri) {
|
||||||
rv.add(sourceBase + Util.sep + f);
|
rv.add(sourceBase + Util.sep + f);
|
||||||
@ -541,35 +615,6 @@ class TieredProductConfig extends ProductConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CoreDebugConfig extends GenericDebugNonKernelConfig {
|
|
||||||
String getOptFlag() {
|
|
||||||
return getCI().getNoOptFlag();
|
|
||||||
}
|
|
||||||
|
|
||||||
CoreDebugConfig() {
|
|
||||||
initNames("core", "debug", "jvm.dll");
|
|
||||||
init(getIncludes(), getDefines());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CoreFastDebugConfig extends GenericDebugNonKernelConfig {
|
|
||||||
String getOptFlag() {
|
|
||||||
return getCI().getOptFlag();
|
|
||||||
}
|
|
||||||
|
|
||||||
CoreFastDebugConfig() {
|
|
||||||
initNames("core", "fastdebug", "jvm.dll");
|
|
||||||
init(getIncludes(), getDefines());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CoreProductConfig extends ProductConfig {
|
|
||||||
CoreProductConfig() {
|
|
||||||
initNames("core", "product", "jvm.dll");
|
|
||||||
init(getIncludes(), getDefines());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
abstract class CompilerInterface {
|
abstract class CompilerInterface {
|
||||||
abstract Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir);
|
abstract Vector getBaseCompilerFlags(Vector defines, Vector includes, String outDir);
|
||||||
|
@ -12,11 +12,15 @@ public class FileTreeCreator extends SimpleFileVisitor<Path>
|
|||||||
final int startDirLength;
|
final int startDirLength;
|
||||||
Stack<DirAttributes> attributes = new Stack<DirAttributes>();
|
Stack<DirAttributes> attributes = new Stack<DirAttributes>();
|
||||||
Vector<BuildConfig> allConfigs;
|
Vector<BuildConfig> allConfigs;
|
||||||
WinGammaPlatformVC10 wg;
|
WinGammaPlatform wg;
|
||||||
|
WinGammaPlatformVC10 wg10;
|
||||||
|
|
||||||
public FileTreeCreator(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatformVC10 wg) {
|
public FileTreeCreator(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
|
||||||
super();
|
super();
|
||||||
this.wg = wg;
|
this.wg = wg;
|
||||||
|
if (wg instanceof WinGammaPlatformVC10) {
|
||||||
|
wg10 = (WinGammaPlatformVC10)wg;
|
||||||
|
}
|
||||||
this.allConfigs = allConfigs;
|
this.allConfigs = allConfigs;
|
||||||
this.startDir = startDir;
|
this.startDir = startDir;
|
||||||
startDirLength = startDir.toAbsolutePath().toString().length();
|
startDirLength = startDir.toAbsolutePath().toString().length();
|
||||||
|
@ -1,3 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2012, 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
import static java.nio.file.FileVisitResult.CONTINUE;
|
import static java.nio.file.FileVisitResult.CONTINUE;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -21,6 +45,8 @@ public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|||||||
boolean usePch = false;
|
boolean usePch = false;
|
||||||
boolean disablePch = false;
|
boolean disablePch = false;
|
||||||
boolean useIgnore = false;
|
boolean useIgnore = false;
|
||||||
|
boolean isAltSrc = false; // only needed as a debugging crumb
|
||||||
|
boolean isReplacedByAltSrc = false;
|
||||||
String fileName = file.getFileName().toString();
|
String fileName = file.getFileName().toString();
|
||||||
|
|
||||||
// TODO hideFile
|
// TODO hideFile
|
||||||
@ -30,6 +56,26 @@ public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|||||||
usePch = true;
|
usePch = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String fileLoc = vcProjLocation.relativize(file).toString();
|
||||||
|
|
||||||
|
// isAltSrc and isReplacedByAltSrc applies to all configs for a file
|
||||||
|
if (BuildConfig.matchesRelativeAltSrcInclude(
|
||||||
|
file.toAbsolutePath().toString())) {
|
||||||
|
// current file is an alternate source file so track it
|
||||||
|
isAltSrc = true;
|
||||||
|
BuildConfig.trackRelativeAltSrcFile(
|
||||||
|
file.toAbsolutePath().toString());
|
||||||
|
} else if (BuildConfig.matchesRelativeAltSrcFile(
|
||||||
|
file.toAbsolutePath().toString())) {
|
||||||
|
// current file is a regular file that matches an alternate
|
||||||
|
// source file so yack about replacing the regular file
|
||||||
|
isReplacedByAltSrc = true;
|
||||||
|
System.out.println("INFO: alternate source file '" +
|
||||||
|
BuildConfig.getMatchingRelativeAltSrcFile(
|
||||||
|
file.toAbsolutePath().toString()) +
|
||||||
|
"' replaces '" + fileLoc + "'");
|
||||||
|
}
|
||||||
|
|
||||||
for (BuildConfig cfg : allConfigs) {
|
for (BuildConfig cfg : allConfigs) {
|
||||||
if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
|
if (cfg.lookupHashFieldInContext("IgnoreFile", fileName) != null) {
|
||||||
useIgnore = true;
|
useIgnore = true;
|
||||||
@ -57,10 +103,9 @@ public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String tagName = wg.getFileTagFromSuffix(fileName);
|
String tagName = wg10.getFileTagFromSuffix(fileName);
|
||||||
String fileLoc = vcProjLocation.relativize(file).toString();
|
|
||||||
|
|
||||||
if (!useIgnore && !disablePch && !usePch) {
|
if (!useIgnore && !disablePch && !usePch && !isReplacedByAltSrc) {
|
||||||
wg.tag(tagName, new String[] { "Include", fileLoc});
|
wg.tag(tagName, new String[] { "Include", fileLoc});
|
||||||
} else {
|
} else {
|
||||||
wg.startTag(
|
wg.startTag(
|
||||||
@ -78,12 +123,17 @@ public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|||||||
if (disablePch) {
|
if (disablePch) {
|
||||||
wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
|
wg.tag("PrecompiledHeader", "Condition", "'$(Configuration)|$(Platform)'=='" + cfg.get("Name") + "'");
|
||||||
}
|
}
|
||||||
|
if (isReplacedByAltSrc) {
|
||||||
|
wg.tagData("ExcludedFromBuild", "true", "Condition",
|
||||||
|
"'$(Configuration)|$(Platform)'=='" +
|
||||||
|
cfg.get("Name") + "'");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
wg.endTag();
|
wg.endTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
|
String filter = startDir.relativize(file.getParent().toAbsolutePath()).toString();
|
||||||
wg.addFilterDependency(fileLoc, filter);
|
wg10.addFilterDependency(fileLoc, filter);
|
||||||
|
|
||||||
return CONTINUE;
|
return CONTINUE;
|
||||||
}
|
}
|
||||||
@ -112,7 +162,7 @@ public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|||||||
if (!hide) {
|
if (!hide) {
|
||||||
String name = startDir.relativize(path.toAbsolutePath()).toString();
|
String name = startDir.relativize(path.toAbsolutePath()).toString();
|
||||||
if (!"".equals(name)) {
|
if (!"".equals(name)) {
|
||||||
wg.addFilter(name);
|
wg10.addFilter(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
attributes.push(newAttr);
|
attributes.push(newAttr);
|
||||||
@ -137,6 +187,4 @@ public class FileTreeCreatorVC10 extends FileTreeCreator {
|
|||||||
public void writeFileTree() throws IOException {
|
public void writeFileTree() throws IOException {
|
||||||
Files.walkFileTree(this.startDir, this);
|
Files.walkFileTree(this.startDir, this);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -12,7 +12,7 @@ import java.util.Vector;
|
|||||||
public class FileTreeCreatorVC7 extends FileTreeCreator {
|
public class FileTreeCreatorVC7 extends FileTreeCreator {
|
||||||
|
|
||||||
public FileTreeCreatorVC7(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
|
public FileTreeCreatorVC7(Path startDir, Vector<BuildConfig> allConfigs, WinGammaPlatform wg) {
|
||||||
super(startDir, allConfigs, null);
|
super(startDir, allConfigs, wg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -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
|
||||||
@ -39,10 +39,15 @@ public class ProjectCreator {
|
|||||||
+ "jvm.dll; no trailing slash>");
|
+ "jvm.dll; no trailing slash>");
|
||||||
System.err.println(" If any of the above are specified, "
|
System.err.println(" If any of the above are specified, "
|
||||||
+ "they must all be.");
|
+ "they must all be.");
|
||||||
|
System.err.println(" Note: if '-altRelativeInclude' option below is "
|
||||||
|
+ "used, then the '-relativeAltSrcInclude' option must be used "
|
||||||
|
+ "to specify the alternate source dir, e.g., 'src\\closed'");
|
||||||
System.err.println(" Additional, optional arguments, which can be "
|
System.err.println(" Additional, optional arguments, which can be "
|
||||||
+ "specified multiple times:");
|
+ "specified multiple times:");
|
||||||
System.err.println(" -absoluteInclude <string containing absolute "
|
System.err.println(" -absoluteInclude <string containing absolute "
|
||||||
+ "path to include directory>");
|
+ "path to include directory>");
|
||||||
|
System.err.println(" -altRelativeInclude <string containing "
|
||||||
|
+ "alternate include directory relative to -envVar>");
|
||||||
System.err.println(" -relativeInclude <string containing include "
|
System.err.println(" -relativeInclude <string containing include "
|
||||||
+ "directory relative to -envVar>");
|
+ "directory relative to -envVar>");
|
||||||
System.err.println(" -define <preprocessor flag to be #defined "
|
System.err.println(" -define <preprocessor flag to be #defined "
|
||||||
|
@ -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
|
||||||
@ -140,10 +140,17 @@ public abstract class WinGammaPlatform {
|
|||||||
"already exist>");
|
"already exist>");
|
||||||
System.err.println(" If any of the above are specified, "+
|
System.err.println(" If any of the above are specified, "+
|
||||||
"they must all be.");
|
"they must all be.");
|
||||||
|
System.err.println(" Note: if '-altRelativeInclude' option below " +
|
||||||
|
"is used, then the '-relativeAltSrcInclude' " +
|
||||||
|
"option must be used to specify the alternate " +
|
||||||
|
"source dir, e.g., 'src\\closed'");
|
||||||
System.err.println(" Additional, optional arguments, which can be " +
|
System.err.println(" Additional, optional arguments, which can be " +
|
||||||
"specified multiple times:");
|
"specified multiple times:");
|
||||||
System.err.println(" -absoluteInclude <string containing absolute " +
|
System.err.println(" -absoluteInclude <string containing absolute " +
|
||||||
"path to include directory>");
|
"path to include directory>");
|
||||||
|
System.err.println(" -altRelativeInclude <string containing " +
|
||||||
|
"alternate include directory relative to " +
|
||||||
|
"-sourceBase>");
|
||||||
System.err.println(" -relativeInclude <string containing include " +
|
System.err.println(" -relativeInclude <string containing include " +
|
||||||
"directory relative to -sourceBase>");
|
"directory relative to -sourceBase>");
|
||||||
System.err.println(" -define <preprocessor flag to be #defined " +
|
System.err.println(" -define <preprocessor flag to be #defined " +
|
||||||
@ -343,6 +350,12 @@ public abstract class WinGammaPlatform {
|
|||||||
HsArgHandler.VECTOR
|
HsArgHandler.VECTOR
|
||||||
),
|
),
|
||||||
|
|
||||||
|
new HsArgRule("-altRelativeInclude",
|
||||||
|
"AltRelativeInclude",
|
||||||
|
null,
|
||||||
|
HsArgHandler.VECTOR
|
||||||
|
),
|
||||||
|
|
||||||
new HsArgRule("-relativeInclude",
|
new HsArgRule("-relativeInclude",
|
||||||
"RelativeInclude",
|
"RelativeInclude",
|
||||||
null,
|
null,
|
||||||
@ -355,6 +368,12 @@ public abstract class WinGammaPlatform {
|
|||||||
HsArgHandler.VECTOR
|
HsArgHandler.VECTOR
|
||||||
),
|
),
|
||||||
|
|
||||||
|
new HsArgRule("-relativeAltSrcInclude",
|
||||||
|
"RelativeAltSrcInclude",
|
||||||
|
null,
|
||||||
|
HsArgHandler.STRING
|
||||||
|
),
|
||||||
|
|
||||||
new HsArgRule("-relativeSrcInclude",
|
new HsArgRule("-relativeSrcInclude",
|
||||||
"RelativeSrcInclude",
|
"RelativeSrcInclude",
|
||||||
null,
|
null,
|
||||||
@ -560,10 +579,6 @@ public abstract class WinGammaPlatform {
|
|||||||
allConfigs.add(new TieredFastDebugConfig());
|
allConfigs.add(new TieredFastDebugConfig());
|
||||||
allConfigs.add(new TieredProductConfig());
|
allConfigs.add(new TieredProductConfig());
|
||||||
|
|
||||||
allConfigs.add(new CoreDebugConfig());
|
|
||||||
allConfigs.add(new CoreFastDebugConfig());
|
|
||||||
allConfigs.add(new CoreProductConfig());
|
|
||||||
|
|
||||||
return allConfigs;
|
return allConfigs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2011, 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -24,7 +48,7 @@ public class WinGammaPlatformVC10 extends WinGammaPlatformVC7 {
|
|||||||
public void writeProjectFile(String projectFileName, String projectName,
|
public void writeProjectFile(String projectFileName, String projectName,
|
||||||
Vector<BuildConfig> allConfigs) throws IOException {
|
Vector<BuildConfig> allConfigs) throws IOException {
|
||||||
System.out.println();
|
System.out.println();
|
||||||
System.out.print(" Writing .vcxproj file: " + projectFileName);
|
System.out.println(" Writing .vcxproj file: " + projectFileName);
|
||||||
|
|
||||||
String projDir = Util.normalize(new File(projectFileName).getParent());
|
String projDir = Util.normalize(new File(projectFileName).getParent());
|
||||||
|
|
||||||
@ -114,7 +138,7 @@ public class WinGammaPlatformVC10 extends WinGammaPlatformVC7 {
|
|||||||
|
|
||||||
endTag();
|
endTag();
|
||||||
printWriter.close();
|
printWriter.close();
|
||||||
System.out.println(" Done.");
|
System.out.println(" Done writing .vcxproj file.");
|
||||||
|
|
||||||
writeFilterFile(projectFileName, projectName, allConfigs, projDir);
|
writeFilterFile(projectFileName, projectName, allConfigs, projDir);
|
||||||
writeUserFile(projectFileName, allConfigs);
|
writeUserFile(projectFileName, allConfigs);
|
||||||
|
@ -139,19 +139,22 @@ public class WinGammaPlatformVC7 extends WinGammaPlatform {
|
|||||||
|
|
||||||
tagV("Tool", cfg.getV("LinkerFlags"));
|
tagV("Tool", cfg.getV("LinkerFlags"));
|
||||||
|
|
||||||
tag("Tool",
|
String postBuildCmd = BuildConfig.getFieldString(null,
|
||||||
new String[] {
|
"PostbuildCommand");
|
||||||
"Name",
|
if (postBuildCmd != null) {
|
||||||
"VCPostBuildEventTool",
|
tag("Tool",
|
||||||
"Description",
|
new String[] {
|
||||||
BuildConfig
|
"Name",
|
||||||
.getFieldString(null, "PostbuildDescription"),
|
"VCPostBuildEventTool",
|
||||||
// Caution: String.replace(String,String) is available
|
"Description",
|
||||||
// from JDK5 onwards only
|
BuildConfig
|
||||||
"CommandLine",
|
.getFieldString(null, "PostbuildDescription"),
|
||||||
cfg.expandFormat(BuildConfig.getFieldString(null,
|
// Caution: String.replace(String,String) is available
|
||||||
"PostbuildCommand").replace("\t",
|
// from JDK5 onwards only
|
||||||
"
")) });
|
"CommandLine",
|
||||||
|
cfg.expandFormat(postBuildCmd.replace("\t",
|
||||||
|
"
")) });
|
||||||
|
}
|
||||||
|
|
||||||
tag("Tool", new String[] { "Name", "VCPreBuildEventTool" });
|
tag("Tool", new String[] { "Name", "VCPreBuildEventTool" });
|
||||||
|
|
||||||
|
@ -915,16 +915,6 @@ JRT_ENTRY(void, Runtime1::patch_code(JavaThread* thread, Runtime1::StubID stub_i
|
|||||||
// Return to the now deoptimized frame.
|
// Return to the now deoptimized frame.
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are patching in a non-perm oop, make sure the nmethod
|
|
||||||
// is on the right list.
|
|
||||||
if (ScavengeRootsInCode && mirror.not_null() && mirror()->is_scavengable()) {
|
|
||||||
MutexLockerEx ml_code (CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
|
||||||
nmethod* nm = CodeCache::find_nmethod(caller_frame.pc());
|
|
||||||
guarantee(nm != NULL, "only nmethods can contain non-perm oops");
|
|
||||||
if (!nm->on_scavenge_root_list())
|
|
||||||
CodeCache::add_scavenge_root_nmethod(nm);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now copy code back
|
// Now copy code back
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -1125,6 +1115,21 @@ JRT_ENTRY(void, Runtime1::patch_code(JavaThread* thread, Runtime1::StubID stub_i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we are patching in a non-perm oop, make sure the nmethod
|
||||||
|
// is on the right list.
|
||||||
|
if (ScavengeRootsInCode && mirror.not_null() && mirror()->is_scavengable()) {
|
||||||
|
MutexLockerEx ml_code (CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
nmethod* nm = CodeCache::find_nmethod(caller_frame.pc());
|
||||||
|
guarantee(nm != NULL, "only nmethods can contain non-perm oops");
|
||||||
|
if (!nm->on_scavenge_root_list()) {
|
||||||
|
CodeCache::add_scavenge_root_nmethod(nm);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since we've patched some oops in the nmethod,
|
||||||
|
// (re)register it with the heap.
|
||||||
|
Universe::heap()->register_nmethod(nm);
|
||||||
|
}
|
||||||
JRT_END
|
JRT_END
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -2590,7 +2590,7 @@ void ClassFileParser::parse_classfile_sourcefile_attribute(TRAPS) {
|
|||||||
valid_symbol_at(sourcefile_index),
|
valid_symbol_at(sourcefile_index),
|
||||||
"Invalid SourceFile attribute at constant pool index %u in class file %s",
|
"Invalid SourceFile attribute at constant pool index %u in class file %s",
|
||||||
sourcefile_index, CHECK);
|
sourcefile_index, CHECK);
|
||||||
set_class_sourcefile(_cp->symbol_at(sourcefile_index));
|
set_class_sourcefile_index(sourcefile_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2728,7 +2728,7 @@ void ClassFileParser::parse_classfile_signature_attribute(TRAPS) {
|
|||||||
valid_symbol_at(signature_index),
|
valid_symbol_at(signature_index),
|
||||||
"Invalid constant pool index %u in Signature attribute in class file %s",
|
"Invalid constant pool index %u in Signature attribute in class file %s",
|
||||||
signature_index, CHECK);
|
signature_index, CHECK);
|
||||||
set_class_generic_signature(_cp->symbol_at(signature_index));
|
set_class_generic_signature_index(signature_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClassFileParser::parse_classfile_bootstrap_methods_attribute(u4 attribute_byte_length, TRAPS) {
|
void ClassFileParser::parse_classfile_bootstrap_methods_attribute(u4 attribute_byte_length, TRAPS) {
|
||||||
@ -2975,13 +2975,11 @@ void ClassFileParser::parse_classfile_attributes(ClassFileParser::ClassAnnotatio
|
|||||||
void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) {
|
void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) {
|
||||||
if (_synthetic_flag)
|
if (_synthetic_flag)
|
||||||
k->set_is_synthetic();
|
k->set_is_synthetic();
|
||||||
if (_sourcefile != NULL) {
|
if (_sourcefile_index != 0) {
|
||||||
_sourcefile->increment_refcount();
|
k->set_source_file_name_index(_sourcefile_index);
|
||||||
k->set_source_file_name(_sourcefile);
|
|
||||||
}
|
}
|
||||||
if (_generic_signature != NULL) {
|
if (_generic_signature_index != 0) {
|
||||||
_generic_signature->increment_refcount();
|
k->set_generic_signature_index(_generic_signature_index);
|
||||||
k->set_generic_signature(_generic_signature);
|
|
||||||
}
|
}
|
||||||
if (_sde_buffer != NULL) {
|
if (_sde_buffer != NULL) {
|
||||||
k->set_source_debug_extension(_sde_buffer, _sde_length);
|
k->set_source_debug_extension(_sde_buffer, _sde_length);
|
||||||
|
@ -62,8 +62,8 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
bool _synthetic_flag;
|
bool _synthetic_flag;
|
||||||
int _sde_length;
|
int _sde_length;
|
||||||
char* _sde_buffer;
|
char* _sde_buffer;
|
||||||
Symbol* _sourcefile;
|
u2 _sourcefile_index;
|
||||||
Symbol* _generic_signature;
|
u2 _generic_signature_index;
|
||||||
|
|
||||||
// Metadata created before the instance klass is created. Must be deallocated
|
// Metadata created before the instance klass is created. Must be deallocated
|
||||||
// if not transferred to the InstanceKlass upon successful class loading
|
// if not transferred to the InstanceKlass upon successful class loading
|
||||||
@ -81,16 +81,16 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
Array<AnnotationArray*>* _fields_type_annotations;
|
Array<AnnotationArray*>* _fields_type_annotations;
|
||||||
InstanceKlass* _klass; // InstanceKlass once created.
|
InstanceKlass* _klass; // InstanceKlass once created.
|
||||||
|
|
||||||
void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
|
void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
|
||||||
void set_class_sourcefile(Symbol* x) { _sourcefile = x; }
|
void set_class_sourcefile_index(u2 x) { _sourcefile_index = x; }
|
||||||
void set_class_generic_signature(Symbol* x) { _generic_signature = x; }
|
void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; }
|
||||||
void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
|
void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
|
||||||
|
|
||||||
void init_parsed_class_attributes(ClassLoaderData* loader_data) {
|
void init_parsed_class_attributes(ClassLoaderData* loader_data) {
|
||||||
_loader_data = loader_data;
|
_loader_data = loader_data;
|
||||||
_synthetic_flag = false;
|
_synthetic_flag = false;
|
||||||
_sourcefile = NULL;
|
_sourcefile_index = 0;
|
||||||
_generic_signature = NULL;
|
_generic_signature_index = 0;
|
||||||
_sde_buffer = NULL;
|
_sde_buffer = NULL;
|
||||||
_sde_length = 0;
|
_sde_length = 0;
|
||||||
// initialize the other flags too:
|
// initialize the other flags too:
|
||||||
|
@ -2557,6 +2557,26 @@ void java_lang_ref_SoftReference::set_clock(jlong value) {
|
|||||||
*offset = value;
|
*offset = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Support for java_lang_invoke_DirectMethodHandle
|
||||||
|
|
||||||
|
int java_lang_invoke_DirectMethodHandle::_member_offset;
|
||||||
|
|
||||||
|
oop java_lang_invoke_DirectMethodHandle::member(oop dmh) {
|
||||||
|
oop member_name = NULL;
|
||||||
|
bool is_dmh = dmh->is_oop() && java_lang_invoke_DirectMethodHandle::is_instance(dmh);
|
||||||
|
assert(is_dmh, "a DirectMethodHandle oop is expected");
|
||||||
|
if (is_dmh) {
|
||||||
|
member_name = dmh->obj_field(member_offset_in_bytes());
|
||||||
|
}
|
||||||
|
return member_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void java_lang_invoke_DirectMethodHandle::compute_offsets() {
|
||||||
|
Klass* klass_oop = SystemDictionary::DirectMethodHandle_klass();
|
||||||
|
if (klass_oop != NULL && EnableInvokeDynamic) {
|
||||||
|
compute_offset(_member_offset, klass_oop, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Support for java_lang_invoke_MethodHandle
|
// Support for java_lang_invoke_MethodHandle
|
||||||
|
|
||||||
@ -3205,6 +3225,7 @@ void JavaClasses::compute_offsets() {
|
|||||||
java_lang_ThreadGroup::compute_offsets();
|
java_lang_ThreadGroup::compute_offsets();
|
||||||
if (EnableInvokeDynamic) {
|
if (EnableInvokeDynamic) {
|
||||||
java_lang_invoke_MethodHandle::compute_offsets();
|
java_lang_invoke_MethodHandle::compute_offsets();
|
||||||
|
java_lang_invoke_DirectMethodHandle::compute_offsets();
|
||||||
java_lang_invoke_MemberName::compute_offsets();
|
java_lang_invoke_MemberName::compute_offsets();
|
||||||
java_lang_invoke_LambdaForm::compute_offsets();
|
java_lang_invoke_LambdaForm::compute_offsets();
|
||||||
java_lang_invoke_MethodType::compute_offsets();
|
java_lang_invoke_MethodType::compute_offsets();
|
||||||
|
@ -976,6 +976,32 @@ class java_lang_invoke_MethodHandle: AllStatic {
|
|||||||
static int form_offset_in_bytes() { return _form_offset; }
|
static int form_offset_in_bytes() { return _form_offset; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Interface to java.lang.invoke.DirectMethodHandle objects
|
||||||
|
|
||||||
|
class java_lang_invoke_DirectMethodHandle: AllStatic {
|
||||||
|
friend class JavaClasses;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static int _member_offset; // the MemberName of this DMH
|
||||||
|
|
||||||
|
static void compute_offsets();
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Accessors
|
||||||
|
static oop member(oop mh);
|
||||||
|
|
||||||
|
// Testers
|
||||||
|
static bool is_subclass(Klass* klass) {
|
||||||
|
return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_klass());
|
||||||
|
}
|
||||||
|
static bool is_instance(oop obj) {
|
||||||
|
return obj != NULL && is_subclass(obj->klass());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors for code generation:
|
||||||
|
static int member_offset_in_bytes() { return _member_offset; }
|
||||||
|
};
|
||||||
|
|
||||||
// Interface to java.lang.invoke.LambdaForm objects
|
// Interface to java.lang.invoke.LambdaForm objects
|
||||||
// (These are a private interface for managing adapter code generation.)
|
// (These are a private interface for managing adapter code generation.)
|
||||||
|
|
||||||
|
@ -151,6 +151,7 @@ class SymbolPropertyTable;
|
|||||||
do_klass(reflect_CallerSensitive_klass, sun_reflect_CallerSensitive, Opt ) \
|
do_klass(reflect_CallerSensitive_klass, sun_reflect_CallerSensitive, Opt ) \
|
||||||
\
|
\
|
||||||
/* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
|
/* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
|
||||||
|
do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle, Opt ) \
|
||||||
do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292 ) \
|
do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292 ) \
|
||||||
do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292 ) \
|
do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292 ) \
|
||||||
do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292 ) \
|
do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292 ) \
|
||||||
|
@ -255,6 +255,7 @@
|
|||||||
/* Support for JSR 292 & invokedynamic (JDK 1.7 and above) */ \
|
/* Support for JSR 292 & invokedynamic (JDK 1.7 and above) */ \
|
||||||
template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
|
template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
|
||||||
template(java_lang_invoke_ConstantCallSite, "java/lang/invoke/ConstantCallSite") \
|
template(java_lang_invoke_ConstantCallSite, "java/lang/invoke/ConstantCallSite") \
|
||||||
|
template(java_lang_invoke_DirectMethodHandle, "java/lang/invoke/DirectMethodHandle") \
|
||||||
template(java_lang_invoke_MutableCallSite, "java/lang/invoke/MutableCallSite") \
|
template(java_lang_invoke_MutableCallSite, "java/lang/invoke/MutableCallSite") \
|
||||||
template(java_lang_invoke_VolatileCallSite, "java/lang/invoke/VolatileCallSite") \
|
template(java_lang_invoke_VolatileCallSite, "java/lang/invoke/VolatileCallSite") \
|
||||||
template(java_lang_invoke_MethodHandle, "java/lang/invoke/MethodHandle") \
|
template(java_lang_invoke_MethodHandle, "java/lang/invoke/MethodHandle") \
|
||||||
@ -352,6 +353,7 @@
|
|||||||
template(thread_id_name, "tid") \
|
template(thread_id_name, "tid") \
|
||||||
template(newInstance0_name, "newInstance0") \
|
template(newInstance0_name, "newInstance0") \
|
||||||
template(limit_name, "limit") \
|
template(limit_name, "limit") \
|
||||||
|
template(member_name, "member") \
|
||||||
template(forName_name, "forName") \
|
template(forName_name, "forName") \
|
||||||
template(forName0_name, "forName0") \
|
template(forName0_name, "forName0") \
|
||||||
template(isJavaIdentifierStart_name, "isJavaIdentifierStart") \
|
template(isJavaIdentifierStart_name, "isJavaIdentifierStart") \
|
||||||
|
@ -687,6 +687,7 @@ nmethod::nmethod(
|
|||||||
code_buffer->copy_values_to(this);
|
code_buffer->copy_values_to(this);
|
||||||
if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
|
if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
|
||||||
CodeCache::add_scavenge_root_nmethod(this);
|
CodeCache::add_scavenge_root_nmethod(this);
|
||||||
|
Universe::heap()->register_nmethod(this);
|
||||||
}
|
}
|
||||||
debug_only(verify_scavenge_root_oops());
|
debug_only(verify_scavenge_root_oops());
|
||||||
CodeCache::commit(this);
|
CodeCache::commit(this);
|
||||||
@ -881,6 +882,7 @@ nmethod::nmethod(
|
|||||||
dependencies->copy_to(this);
|
dependencies->copy_to(this);
|
||||||
if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
|
if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
|
||||||
CodeCache::add_scavenge_root_nmethod(this);
|
CodeCache::add_scavenge_root_nmethod(this);
|
||||||
|
Universe::heap()->register_nmethod(this);
|
||||||
}
|
}
|
||||||
debug_only(verify_scavenge_root_oops());
|
debug_only(verify_scavenge_root_oops());
|
||||||
|
|
||||||
@ -1300,6 +1302,13 @@ bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
|
|||||||
methodHandle the_method(method());
|
methodHandle the_method(method());
|
||||||
No_Safepoint_Verifier nsv;
|
No_Safepoint_Verifier nsv;
|
||||||
|
|
||||||
|
// during patching, depending on the nmethod state we must notify the GC that
|
||||||
|
// code has been unloaded, unregistering it. We cannot do this right while
|
||||||
|
// holding the Patching_lock because we need to use the CodeCache_lock. This
|
||||||
|
// would be prone to deadlocks.
|
||||||
|
// This flag is used to remember whether we need to later lock and unregister.
|
||||||
|
bool nmethod_needs_unregister = false;
|
||||||
|
|
||||||
{
|
{
|
||||||
// invalidate osr nmethod before acquiring the patching lock since
|
// invalidate osr nmethod before acquiring the patching lock since
|
||||||
// they both acquire leaf locks and we don't want a deadlock.
|
// they both acquire leaf locks and we don't want a deadlock.
|
||||||
@ -1332,6 +1341,13 @@ bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
|
|||||||
inc_decompile_count();
|
inc_decompile_count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the state is becoming a zombie, signal to unregister the nmethod with
|
||||||
|
// the heap.
|
||||||
|
// This nmethod may have already been unloaded during a full GC.
|
||||||
|
if ((state == zombie) && !is_unloaded()) {
|
||||||
|
nmethod_needs_unregister = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Change state
|
// Change state
|
||||||
_state = state;
|
_state = state;
|
||||||
|
|
||||||
@ -1367,6 +1383,9 @@ bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
|
|||||||
// safepoint can sneak in, otherwise the oops used by the
|
// safepoint can sneak in, otherwise the oops used by the
|
||||||
// dependency logic could have become stale.
|
// dependency logic could have become stale.
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
if (nmethod_needs_unregister) {
|
||||||
|
Universe::heap()->unregister_nmethod(this);
|
||||||
|
}
|
||||||
flush_dependencies(NULL);
|
flush_dependencies(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1817,21 +1836,10 @@ void nmethod::metadata_do(void f(Metadata*)) {
|
|||||||
if (_method != NULL) f(_method);
|
if (_method != NULL) f(_method);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nmethod::oops_do(OopClosure* f, bool allow_zombie) {
|
||||||
// This method is called twice during GC -- once while
|
|
||||||
// tracing the "active" nmethods on thread stacks during
|
|
||||||
// the (strong) marking phase, and then again when walking
|
|
||||||
// the code cache contents during the weak roots processing
|
|
||||||
// phase. The two uses are distinguished by means of the
|
|
||||||
// 'do_strong_roots_only' flag, which is true in the first
|
|
||||||
// case. We want to walk the weak roots in the nmethod
|
|
||||||
// only in the second case. The weak roots in the nmethod
|
|
||||||
// are the oops in the ExceptionCache and the InlineCache
|
|
||||||
// oops.
|
|
||||||
void nmethod::oops_do(OopClosure* f, bool do_strong_roots_only) {
|
|
||||||
// make sure the oops ready to receive visitors
|
// make sure the oops ready to receive visitors
|
||||||
assert(!is_zombie() && !is_unloaded(),
|
assert(allow_zombie || !is_zombie(), "should not call follow on zombie nmethod");
|
||||||
"should not call follow on zombie or unloaded nmethod");
|
assert(!is_unloaded(), "should not call follow on unloaded nmethod");
|
||||||
|
|
||||||
// If the method is not entrant or zombie then a JMP is plastered over the
|
// If the method is not entrant or zombie then a JMP is plastered over the
|
||||||
// first few bytes. If an oop in the old code was there, that oop
|
// first few bytes. If an oop in the old code was there, that oop
|
||||||
|
@ -566,7 +566,7 @@ public:
|
|||||||
void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
|
void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
|
||||||
OopClosure* f);
|
OopClosure* f);
|
||||||
void oops_do(OopClosure* f) { oops_do(f, false); }
|
void oops_do(OopClosure* f) { oops_do(f, false); }
|
||||||
void oops_do(OopClosure* f, bool do_strong_roots_only);
|
void oops_do(OopClosure* f, bool allow_zombie);
|
||||||
bool detect_scavenge_root_oops();
|
bool detect_scavenge_root_oops();
|
||||||
void verify_scavenge_root_oops() PRODUCT_RETURN;
|
void verify_scavenge_root_oops() PRODUCT_RETURN;
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@
|
|||||||
#include "memory/genMarkSweep.hpp"
|
#include "memory/genMarkSweep.hpp"
|
||||||
#include "memory/genOopClosures.inline.hpp"
|
#include "memory/genOopClosures.inline.hpp"
|
||||||
#include "memory/iterator.hpp"
|
#include "memory/iterator.hpp"
|
||||||
|
#include "memory/padded.hpp"
|
||||||
#include "memory/referencePolicy.hpp"
|
#include "memory/referencePolicy.hpp"
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
#include "memory/tenuredGeneration.hpp"
|
#include "memory/tenuredGeneration.hpp"
|
||||||
@ -5477,40 +5478,42 @@ CMSParMarkTask::do_young_space_rescan(uint worker_id,
|
|||||||
HandleMark hm;
|
HandleMark hm;
|
||||||
|
|
||||||
SequentialSubTasksDone* pst = space->par_seq_tasks();
|
SequentialSubTasksDone* pst = space->par_seq_tasks();
|
||||||
assert(pst->valid(), "Uninitialized use?");
|
|
||||||
|
|
||||||
uint nth_task = 0;
|
uint nth_task = 0;
|
||||||
uint n_tasks = pst->n_tasks();
|
uint n_tasks = pst->n_tasks();
|
||||||
|
|
||||||
HeapWord *start, *end;
|
if (n_tasks > 0) {
|
||||||
while (!pst->is_task_claimed(/* reference */ nth_task)) {
|
assert(pst->valid(), "Uninitialized use?");
|
||||||
// We claimed task # nth_task; compute its boundaries.
|
HeapWord *start, *end;
|
||||||
if (chunk_top == 0) { // no samples were taken
|
while (!pst->is_task_claimed(/* reference */ nth_task)) {
|
||||||
assert(nth_task == 0 && n_tasks == 1, "Can have only 1 EdenSpace task");
|
// We claimed task # nth_task; compute its boundaries.
|
||||||
start = space->bottom();
|
if (chunk_top == 0) { // no samples were taken
|
||||||
end = space->top();
|
assert(nth_task == 0 && n_tasks == 1, "Can have only 1 EdenSpace task");
|
||||||
} else if (nth_task == 0) {
|
start = space->bottom();
|
||||||
start = space->bottom();
|
end = space->top();
|
||||||
end = chunk_array[nth_task];
|
} else if (nth_task == 0) {
|
||||||
} else if (nth_task < (uint)chunk_top) {
|
start = space->bottom();
|
||||||
assert(nth_task >= 1, "Control point invariant");
|
end = chunk_array[nth_task];
|
||||||
start = chunk_array[nth_task - 1];
|
} else if (nth_task < (uint)chunk_top) {
|
||||||
end = chunk_array[nth_task];
|
assert(nth_task >= 1, "Control point invariant");
|
||||||
} else {
|
start = chunk_array[nth_task - 1];
|
||||||
assert(nth_task == (uint)chunk_top, "Control point invariant");
|
end = chunk_array[nth_task];
|
||||||
start = chunk_array[chunk_top - 1];
|
} else {
|
||||||
end = space->top();
|
assert(nth_task == (uint)chunk_top, "Control point invariant");
|
||||||
|
start = chunk_array[chunk_top - 1];
|
||||||
|
end = space->top();
|
||||||
|
}
|
||||||
|
MemRegion mr(start, end);
|
||||||
|
// Verify that mr is in space
|
||||||
|
assert(mr.is_empty() || space->used_region().contains(mr),
|
||||||
|
"Should be in space");
|
||||||
|
// Verify that "start" is an object boundary
|
||||||
|
assert(mr.is_empty() || oop(mr.start())->is_oop(),
|
||||||
|
"Should be an oop");
|
||||||
|
space->par_oop_iterate(mr, cl);
|
||||||
}
|
}
|
||||||
MemRegion mr(start, end);
|
pst->all_tasks_completed();
|
||||||
// Verify that mr is in space
|
|
||||||
assert(mr.is_empty() || space->used_region().contains(mr),
|
|
||||||
"Should be in space");
|
|
||||||
// Verify that "start" is an object boundary
|
|
||||||
assert(mr.is_empty() || oop(mr.start())->is_oop(),
|
|
||||||
"Should be an oop");
|
|
||||||
space->par_oop_iterate(mr, cl);
|
|
||||||
}
|
}
|
||||||
pst->all_tasks_completed();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -5787,7 +5790,7 @@ initialize_sequential_subtasks_for_young_gen_rescan(int n_threads) {
|
|||||||
DefNewGeneration* dng = (DefNewGeneration*)_young_gen;
|
DefNewGeneration* dng = (DefNewGeneration*)_young_gen;
|
||||||
|
|
||||||
// Eden space
|
// Eden space
|
||||||
{
|
if (!dng->eden()->is_empty()) {
|
||||||
SequentialSubTasksDone* pst = dng->eden()->par_seq_tasks();
|
SequentialSubTasksDone* pst = dng->eden()->par_seq_tasks();
|
||||||
assert(!pst->valid(), "Clobbering existing data?");
|
assert(!pst->valid(), "Clobbering existing data?");
|
||||||
// Each valid entry in [0, _eden_chunk_index) represents a task.
|
// Each valid entry in [0, _eden_chunk_index) represents a task.
|
||||||
|
@ -4529,7 +4529,7 @@ G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name)
|
|||||||
_total_prev_live_bytes(0), _total_next_live_bytes(0),
|
_total_prev_live_bytes(0), _total_next_live_bytes(0),
|
||||||
_hum_used_bytes(0), _hum_capacity_bytes(0),
|
_hum_used_bytes(0), _hum_capacity_bytes(0),
|
||||||
_hum_prev_live_bytes(0), _hum_next_live_bytes(0),
|
_hum_prev_live_bytes(0), _hum_next_live_bytes(0),
|
||||||
_total_remset_bytes(0) {
|
_total_remset_bytes(0), _total_strong_code_roots_bytes(0) {
|
||||||
G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
||||||
MemRegion g1_committed = g1h->g1_committed();
|
MemRegion g1_committed = g1h->g1_committed();
|
||||||
MemRegion g1_reserved = g1h->g1_reserved();
|
MemRegion g1_reserved = g1h->g1_reserved();
|
||||||
@ -4553,9 +4553,11 @@ G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name)
|
|||||||
G1PPRL_BYTE_H_FORMAT
|
G1PPRL_BYTE_H_FORMAT
|
||||||
G1PPRL_BYTE_H_FORMAT
|
G1PPRL_BYTE_H_FORMAT
|
||||||
G1PPRL_DOUBLE_H_FORMAT
|
G1PPRL_DOUBLE_H_FORMAT
|
||||||
|
G1PPRL_BYTE_H_FORMAT
|
||||||
G1PPRL_BYTE_H_FORMAT,
|
G1PPRL_BYTE_H_FORMAT,
|
||||||
"type", "address-range",
|
"type", "address-range",
|
||||||
"used", "prev-live", "next-live", "gc-eff", "remset");
|
"used", "prev-live", "next-live", "gc-eff",
|
||||||
|
"remset", "code-roots");
|
||||||
_out->print_cr(G1PPRL_LINE_PREFIX
|
_out->print_cr(G1PPRL_LINE_PREFIX
|
||||||
G1PPRL_TYPE_H_FORMAT
|
G1PPRL_TYPE_H_FORMAT
|
||||||
G1PPRL_ADDR_BASE_H_FORMAT
|
G1PPRL_ADDR_BASE_H_FORMAT
|
||||||
@ -4563,9 +4565,11 @@ G1PrintRegionLivenessInfoClosure(outputStream* out, const char* phase_name)
|
|||||||
G1PPRL_BYTE_H_FORMAT
|
G1PPRL_BYTE_H_FORMAT
|
||||||
G1PPRL_BYTE_H_FORMAT
|
G1PPRL_BYTE_H_FORMAT
|
||||||
G1PPRL_DOUBLE_H_FORMAT
|
G1PPRL_DOUBLE_H_FORMAT
|
||||||
|
G1PPRL_BYTE_H_FORMAT
|
||||||
G1PPRL_BYTE_H_FORMAT,
|
G1PPRL_BYTE_H_FORMAT,
|
||||||
"", "",
|
"", "",
|
||||||
"(bytes)", "(bytes)", "(bytes)", "(bytes/ms)", "(bytes)");
|
"(bytes)", "(bytes)", "(bytes)", "(bytes/ms)",
|
||||||
|
"(bytes)", "(bytes)");
|
||||||
}
|
}
|
||||||
|
|
||||||
// It takes as a parameter a reference to one of the _hum_* fields, it
|
// It takes as a parameter a reference to one of the _hum_* fields, it
|
||||||
@ -4608,6 +4612,8 @@ bool G1PrintRegionLivenessInfoClosure::doHeapRegion(HeapRegion* r) {
|
|||||||
size_t next_live_bytes = r->next_live_bytes();
|
size_t next_live_bytes = r->next_live_bytes();
|
||||||
double gc_eff = r->gc_efficiency();
|
double gc_eff = r->gc_efficiency();
|
||||||
size_t remset_bytes = r->rem_set()->mem_size();
|
size_t remset_bytes = r->rem_set()->mem_size();
|
||||||
|
size_t strong_code_roots_bytes = r->rem_set()->strong_code_roots_mem_size();
|
||||||
|
|
||||||
if (r->used() == 0) {
|
if (r->used() == 0) {
|
||||||
type = "FREE";
|
type = "FREE";
|
||||||
} else if (r->is_survivor()) {
|
} else if (r->is_survivor()) {
|
||||||
@ -4642,6 +4648,7 @@ bool G1PrintRegionLivenessInfoClosure::doHeapRegion(HeapRegion* r) {
|
|||||||
_total_prev_live_bytes += prev_live_bytes;
|
_total_prev_live_bytes += prev_live_bytes;
|
||||||
_total_next_live_bytes += next_live_bytes;
|
_total_next_live_bytes += next_live_bytes;
|
||||||
_total_remset_bytes += remset_bytes;
|
_total_remset_bytes += remset_bytes;
|
||||||
|
_total_strong_code_roots_bytes += strong_code_roots_bytes;
|
||||||
|
|
||||||
// Print a line for this particular region.
|
// Print a line for this particular region.
|
||||||
_out->print_cr(G1PPRL_LINE_PREFIX
|
_out->print_cr(G1PPRL_LINE_PREFIX
|
||||||
@ -4651,9 +4658,11 @@ bool G1PrintRegionLivenessInfoClosure::doHeapRegion(HeapRegion* r) {
|
|||||||
G1PPRL_BYTE_FORMAT
|
G1PPRL_BYTE_FORMAT
|
||||||
G1PPRL_BYTE_FORMAT
|
G1PPRL_BYTE_FORMAT
|
||||||
G1PPRL_DOUBLE_FORMAT
|
G1PPRL_DOUBLE_FORMAT
|
||||||
|
G1PPRL_BYTE_FORMAT
|
||||||
G1PPRL_BYTE_FORMAT,
|
G1PPRL_BYTE_FORMAT,
|
||||||
type, bottom, end,
|
type, bottom, end,
|
||||||
used_bytes, prev_live_bytes, next_live_bytes, gc_eff , remset_bytes);
|
used_bytes, prev_live_bytes, next_live_bytes, gc_eff,
|
||||||
|
remset_bytes, strong_code_roots_bytes);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -4669,7 +4678,8 @@ G1PrintRegionLivenessInfoClosure::~G1PrintRegionLivenessInfoClosure() {
|
|||||||
G1PPRL_SUM_MB_PERC_FORMAT("used")
|
G1PPRL_SUM_MB_PERC_FORMAT("used")
|
||||||
G1PPRL_SUM_MB_PERC_FORMAT("prev-live")
|
G1PPRL_SUM_MB_PERC_FORMAT("prev-live")
|
||||||
G1PPRL_SUM_MB_PERC_FORMAT("next-live")
|
G1PPRL_SUM_MB_PERC_FORMAT("next-live")
|
||||||
G1PPRL_SUM_MB_FORMAT("remset"),
|
G1PPRL_SUM_MB_FORMAT("remset")
|
||||||
|
G1PPRL_SUM_MB_FORMAT("code-roots"),
|
||||||
bytes_to_mb(_total_capacity_bytes),
|
bytes_to_mb(_total_capacity_bytes),
|
||||||
bytes_to_mb(_total_used_bytes),
|
bytes_to_mb(_total_used_bytes),
|
||||||
perc(_total_used_bytes, _total_capacity_bytes),
|
perc(_total_used_bytes, _total_capacity_bytes),
|
||||||
@ -4677,6 +4687,7 @@ G1PrintRegionLivenessInfoClosure::~G1PrintRegionLivenessInfoClosure() {
|
|||||||
perc(_total_prev_live_bytes, _total_capacity_bytes),
|
perc(_total_prev_live_bytes, _total_capacity_bytes),
|
||||||
bytes_to_mb(_total_next_live_bytes),
|
bytes_to_mb(_total_next_live_bytes),
|
||||||
perc(_total_next_live_bytes, _total_capacity_bytes),
|
perc(_total_next_live_bytes, _total_capacity_bytes),
|
||||||
bytes_to_mb(_total_remset_bytes));
|
bytes_to_mb(_total_remset_bytes),
|
||||||
|
bytes_to_mb(_total_strong_code_roots_bytes));
|
||||||
_out->cr();
|
_out->cr();
|
||||||
}
|
}
|
||||||
|
@ -1257,6 +1257,9 @@ private:
|
|||||||
// Accumulator for the remembered set size
|
// Accumulator for the remembered set size
|
||||||
size_t _total_remset_bytes;
|
size_t _total_remset_bytes;
|
||||||
|
|
||||||
|
// Accumulator for strong code roots memory size
|
||||||
|
size_t _total_strong_code_roots_bytes;
|
||||||
|
|
||||||
static double perc(size_t val, size_t total) {
|
static double perc(size_t val, size_t total) {
|
||||||
if (total == 0) {
|
if (total == 0) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
|
#include "code/codeCache.hpp"
|
||||||
#include "code/icBuffer.hpp"
|
#include "code/icBuffer.hpp"
|
||||||
#include "gc_implementation/g1/bufferingOopClosure.hpp"
|
#include "gc_implementation/g1/bufferingOopClosure.hpp"
|
||||||
#include "gc_implementation/g1/concurrentG1Refine.hpp"
|
#include "gc_implementation/g1/concurrentG1Refine.hpp"
|
||||||
@ -1176,20 +1177,27 @@ class PostMCRemSetClearClosure: public HeapRegionClosure {
|
|||||||
ModRefBarrierSet* _mr_bs;
|
ModRefBarrierSet* _mr_bs;
|
||||||
public:
|
public:
|
||||||
PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
|
PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
|
||||||
_g1h(g1h), _mr_bs(mr_bs) { }
|
_g1h(g1h), _mr_bs(mr_bs) {}
|
||||||
|
|
||||||
bool doHeapRegion(HeapRegion* r) {
|
bool doHeapRegion(HeapRegion* r) {
|
||||||
|
HeapRegionRemSet* hrrs = r->rem_set();
|
||||||
|
|
||||||
if (r->continuesHumongous()) {
|
if (r->continuesHumongous()) {
|
||||||
|
// We'll assert that the strong code root list and RSet is empty
|
||||||
|
assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
|
||||||
|
assert(hrrs->occupied() == 0, "RSet should be empty");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_g1h->reset_gc_time_stamps(r);
|
_g1h->reset_gc_time_stamps(r);
|
||||||
HeapRegionRemSet* hrrs = r->rem_set();
|
hrrs->clear();
|
||||||
if (hrrs != NULL) hrrs->clear();
|
|
||||||
// You might think here that we could clear just the cards
|
// You might think here that we could clear just the cards
|
||||||
// corresponding to the used region. But no: if we leave a dirty card
|
// corresponding to the used region. But no: if we leave a dirty card
|
||||||
// in a region we might allocate into, then it would prevent that card
|
// in a region we might allocate into, then it would prevent that card
|
||||||
// from being enqueued, and cause it to be missed.
|
// from being enqueued, and cause it to be missed.
|
||||||
// Re: the performance cost: we shouldn't be doing full GC anyway!
|
// Re: the performance cost: we shouldn't be doing full GC anyway!
|
||||||
_mr_bs->clear(MemRegion(r->bottom(), r->end()));
|
_mr_bs->clear(MemRegion(r->bottom(), r->end()));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -1269,30 +1277,6 @@ void G1CollectedHeap::print_hrs_post_compaction() {
|
|||||||
heap_region_iterate(&cl);
|
heap_region_iterate(&cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
double G1CollectedHeap::verify(bool guard, const char* msg) {
|
|
||||||
double verify_time_ms = 0.0;
|
|
||||||
|
|
||||||
if (guard && total_collections() >= VerifyGCStartAt) {
|
|
||||||
double verify_start = os::elapsedTime();
|
|
||||||
HandleMark hm; // Discard invalid handles created during verification
|
|
||||||
prepare_for_verify();
|
|
||||||
Universe::verify(VerifyOption_G1UsePrevMarking, msg);
|
|
||||||
verify_time_ms = (os::elapsedTime() - verify_start) * 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
return verify_time_ms;
|
|
||||||
}
|
|
||||||
|
|
||||||
void G1CollectedHeap::verify_before_gc() {
|
|
||||||
double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:");
|
|
||||||
g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
void G1CollectedHeap::verify_after_gc() {
|
|
||||||
double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:");
|
|
||||||
g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool G1CollectedHeap::do_collection(bool explicit_gc,
|
bool G1CollectedHeap::do_collection(bool explicit_gc,
|
||||||
bool clear_all_soft_refs,
|
bool clear_all_soft_refs,
|
||||||
size_t word_size) {
|
size_t word_size) {
|
||||||
@ -1433,7 +1417,7 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
|
|||||||
|
|
||||||
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
|
// Delete metaspaces for unloaded class loaders and clean up loader_data graph
|
||||||
ClassLoaderDataGraph::purge();
|
ClassLoaderDataGraph::purge();
|
||||||
MetaspaceAux::verify_metrics();
|
MetaspaceAux::verify_metrics();
|
||||||
|
|
||||||
// Note: since we've just done a full GC, concurrent
|
// Note: since we've just done a full GC, concurrent
|
||||||
// marking is no longer active. Therefore we need not
|
// marking is no longer active. Therefore we need not
|
||||||
@ -1504,6 +1488,9 @@ bool G1CollectedHeap::do_collection(bool explicit_gc,
|
|||||||
heap_region_iterate(&rebuild_rs);
|
heap_region_iterate(&rebuild_rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rebuild the strong code root lists for each region
|
||||||
|
rebuild_strong_code_roots();
|
||||||
|
|
||||||
if (true) { // FIXME
|
if (true) { // FIXME
|
||||||
MetaspaceGC::compute_new_size();
|
MetaspaceGC::compute_new_size();
|
||||||
}
|
}
|
||||||
@ -3109,6 +3096,145 @@ const char* G1CollectedHeap::top_at_mark_start_str(VerifyOption vo) {
|
|||||||
return NULL; // keep some compilers happy
|
return NULL; // keep some compilers happy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: VerifyRootsClosure extends OopsInGenClosure so that we can
|
||||||
|
// pass it as the perm_blk to SharedHeap::process_strong_roots.
|
||||||
|
// When process_strong_roots stop calling perm_blk->younger_refs_iterate
|
||||||
|
// we can change this closure to extend the simpler OopClosure.
|
||||||
|
class VerifyRootsClosure: public OopsInGenClosure {
|
||||||
|
private:
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
VerifyOption _vo;
|
||||||
|
bool _failures;
|
||||||
|
public:
|
||||||
|
// _vo == UsePrevMarking -> use "prev" marking information,
|
||||||
|
// _vo == UseNextMarking -> use "next" marking information,
|
||||||
|
// _vo == UseMarkWord -> use mark word from object header.
|
||||||
|
VerifyRootsClosure(VerifyOption vo) :
|
||||||
|
_g1h(G1CollectedHeap::heap()),
|
||||||
|
_vo(vo),
|
||||||
|
_failures(false) { }
|
||||||
|
|
||||||
|
bool failures() { return _failures; }
|
||||||
|
|
||||||
|
template <class T> void do_oop_nv(T* p) {
|
||||||
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
|
if (_g1h->is_obj_dead_cond(obj, _vo)) {
|
||||||
|
gclog_or_tty->print_cr("Root location "PTR_FORMAT" "
|
||||||
|
"points to dead obj "PTR_FORMAT, p, (void*) obj);
|
||||||
|
if (_vo == VerifyOption_G1UseMarkWord) {
|
||||||
|
gclog_or_tty->print_cr(" Mark word: "PTR_FORMAT, (void*)(obj->mark()));
|
||||||
|
}
|
||||||
|
obj->print_on(gclog_or_tty);
|
||||||
|
_failures = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_oop(oop* p) { do_oop_nv(p); }
|
||||||
|
void do_oop(narrowOop* p) { do_oop_nv(p); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class G1VerifyCodeRootOopClosure: public OopsInGenClosure {
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
OopClosure* _root_cl;
|
||||||
|
nmethod* _nm;
|
||||||
|
VerifyOption _vo;
|
||||||
|
bool _failures;
|
||||||
|
|
||||||
|
template <class T> void do_oop_work(T* p) {
|
||||||
|
// First verify that this root is live
|
||||||
|
_root_cl->do_oop(p);
|
||||||
|
|
||||||
|
if (!G1VerifyHeapRegionCodeRoots) {
|
||||||
|
// We're not verifying the code roots attached to heap region.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't check the code roots during marking verification in a full GC
|
||||||
|
if (_vo == VerifyOption_G1UseMarkWord) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now verify that the current nmethod (which contains p) is
|
||||||
|
// in the code root list of the heap region containing the
|
||||||
|
// object referenced by p.
|
||||||
|
|
||||||
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
|
|
||||||
|
// Now fetch the region containing the object
|
||||||
|
HeapRegion* hr = _g1h->heap_region_containing(obj);
|
||||||
|
HeapRegionRemSet* hrrs = hr->rem_set();
|
||||||
|
// Verify that the strong code root list for this region
|
||||||
|
// contains the nmethod
|
||||||
|
if (!hrrs->strong_code_roots_list_contains(_nm)) {
|
||||||
|
gclog_or_tty->print_cr("Code root location "PTR_FORMAT" "
|
||||||
|
"from nmethod "PTR_FORMAT" not in strong "
|
||||||
|
"code roots for region ["PTR_FORMAT","PTR_FORMAT")",
|
||||||
|
p, _nm, hr->bottom(), hr->end());
|
||||||
|
_failures = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
G1VerifyCodeRootOopClosure(G1CollectedHeap* g1h, OopClosure* root_cl, VerifyOption vo):
|
||||||
|
_g1h(g1h), _root_cl(root_cl), _vo(vo), _nm(NULL), _failures(false) {}
|
||||||
|
|
||||||
|
void do_oop(oop* p) { do_oop_work(p); }
|
||||||
|
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||||
|
|
||||||
|
void set_nmethod(nmethod* nm) { _nm = nm; }
|
||||||
|
bool failures() { return _failures; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class G1VerifyCodeRootBlobClosure: public CodeBlobClosure {
|
||||||
|
G1VerifyCodeRootOopClosure* _oop_cl;
|
||||||
|
|
||||||
|
public:
|
||||||
|
G1VerifyCodeRootBlobClosure(G1VerifyCodeRootOopClosure* oop_cl):
|
||||||
|
_oop_cl(oop_cl) {}
|
||||||
|
|
||||||
|
void do_code_blob(CodeBlob* cb) {
|
||||||
|
nmethod* nm = cb->as_nmethod_or_null();
|
||||||
|
if (nm != NULL) {
|
||||||
|
_oop_cl->set_nmethod(nm);
|
||||||
|
nm->oops_do(_oop_cl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class YoungRefCounterClosure : public OopClosure {
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
int _count;
|
||||||
|
public:
|
||||||
|
YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {}
|
||||||
|
void do_oop(oop* p) { if (_g1h->is_in_young(*p)) { _count++; } }
|
||||||
|
void do_oop(narrowOop* p) { ShouldNotReachHere(); }
|
||||||
|
|
||||||
|
int count() { return _count; }
|
||||||
|
void reset_count() { _count = 0; };
|
||||||
|
};
|
||||||
|
|
||||||
|
class VerifyKlassClosure: public KlassClosure {
|
||||||
|
YoungRefCounterClosure _young_ref_counter_closure;
|
||||||
|
OopClosure *_oop_closure;
|
||||||
|
public:
|
||||||
|
VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {}
|
||||||
|
void do_klass(Klass* k) {
|
||||||
|
k->oops_do(_oop_closure);
|
||||||
|
|
||||||
|
_young_ref_counter_closure.reset_count();
|
||||||
|
k->oops_do(&_young_ref_counter_closure);
|
||||||
|
if (_young_ref_counter_closure.count() > 0) {
|
||||||
|
guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class VerifyLivenessOopClosure: public OopClosure {
|
class VerifyLivenessOopClosure: public OopClosure {
|
||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
VerifyOption _vo;
|
VerifyOption _vo;
|
||||||
@ -3242,75 +3368,7 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class YoungRefCounterClosure : public OopClosure {
|
// This is the task used for parallel verification of the heap regions
|
||||||
G1CollectedHeap* _g1h;
|
|
||||||
int _count;
|
|
||||||
public:
|
|
||||||
YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {}
|
|
||||||
void do_oop(oop* p) { if (_g1h->is_in_young(*p)) { _count++; } }
|
|
||||||
void do_oop(narrowOop* p) { ShouldNotReachHere(); }
|
|
||||||
|
|
||||||
int count() { return _count; }
|
|
||||||
void reset_count() { _count = 0; };
|
|
||||||
};
|
|
||||||
|
|
||||||
class VerifyKlassClosure: public KlassClosure {
|
|
||||||
YoungRefCounterClosure _young_ref_counter_closure;
|
|
||||||
OopClosure *_oop_closure;
|
|
||||||
public:
|
|
||||||
VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {}
|
|
||||||
void do_klass(Klass* k) {
|
|
||||||
k->oops_do(_oop_closure);
|
|
||||||
|
|
||||||
_young_ref_counter_closure.reset_count();
|
|
||||||
k->oops_do(&_young_ref_counter_closure);
|
|
||||||
if (_young_ref_counter_closure.count() > 0) {
|
|
||||||
guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: VerifyRootsClosure extends OopsInGenClosure so that we can
|
|
||||||
// pass it as the perm_blk to SharedHeap::process_strong_roots.
|
|
||||||
// When process_strong_roots stop calling perm_blk->younger_refs_iterate
|
|
||||||
// we can change this closure to extend the simpler OopClosure.
|
|
||||||
class VerifyRootsClosure: public OopsInGenClosure {
|
|
||||||
private:
|
|
||||||
G1CollectedHeap* _g1h;
|
|
||||||
VerifyOption _vo;
|
|
||||||
bool _failures;
|
|
||||||
public:
|
|
||||||
// _vo == UsePrevMarking -> use "prev" marking information,
|
|
||||||
// _vo == UseNextMarking -> use "next" marking information,
|
|
||||||
// _vo == UseMarkWord -> use mark word from object header.
|
|
||||||
VerifyRootsClosure(VerifyOption vo) :
|
|
||||||
_g1h(G1CollectedHeap::heap()),
|
|
||||||
_vo(vo),
|
|
||||||
_failures(false) { }
|
|
||||||
|
|
||||||
bool failures() { return _failures; }
|
|
||||||
|
|
||||||
template <class T> void do_oop_nv(T* p) {
|
|
||||||
T heap_oop = oopDesc::load_heap_oop(p);
|
|
||||||
if (!oopDesc::is_null(heap_oop)) {
|
|
||||||
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
|
||||||
if (_g1h->is_obj_dead_cond(obj, _vo)) {
|
|
||||||
gclog_or_tty->print_cr("Root location "PTR_FORMAT" "
|
|
||||||
"points to dead obj "PTR_FORMAT, p, (void*) obj);
|
|
||||||
if (_vo == VerifyOption_G1UseMarkWord) {
|
|
||||||
gclog_or_tty->print_cr(" Mark word: "PTR_FORMAT, (void*)(obj->mark()));
|
|
||||||
}
|
|
||||||
obj->print_on(gclog_or_tty);
|
|
||||||
_failures = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_oop(oop* p) { do_oop_nv(p); }
|
|
||||||
void do_oop(narrowOop* p) { do_oop_nv(p); }
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is the task used for parallel heap verification.
|
|
||||||
|
|
||||||
class G1ParVerifyTask: public AbstractGangTask {
|
class G1ParVerifyTask: public AbstractGangTask {
|
||||||
private:
|
private:
|
||||||
@ -3344,20 +3402,15 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void G1CollectedHeap::verify(bool silent) {
|
void G1CollectedHeap::verify(bool silent, VerifyOption vo) {
|
||||||
verify(silent, VerifyOption_G1UsePrevMarking);
|
|
||||||
}
|
|
||||||
|
|
||||||
void G1CollectedHeap::verify(bool silent,
|
|
||||||
VerifyOption vo) {
|
|
||||||
if (SafepointSynchronize::is_at_safepoint()) {
|
if (SafepointSynchronize::is_at_safepoint()) {
|
||||||
if (!silent) { gclog_or_tty->print("Roots "); }
|
|
||||||
VerifyRootsClosure rootsCl(vo);
|
|
||||||
|
|
||||||
assert(Thread::current()->is_VM_thread(),
|
assert(Thread::current()->is_VM_thread(),
|
||||||
"Expected to be executed serially by the VM thread at this point");
|
"Expected to be executed serially by the VM thread at this point");
|
||||||
|
|
||||||
CodeBlobToOopClosure blobsCl(&rootsCl, /*do_marking=*/ false);
|
if (!silent) { gclog_or_tty->print("Roots "); }
|
||||||
|
VerifyRootsClosure rootsCl(vo);
|
||||||
|
G1VerifyCodeRootOopClosure codeRootsCl(this, &rootsCl, vo);
|
||||||
|
G1VerifyCodeRootBlobClosure blobsCl(&codeRootsCl);
|
||||||
VerifyKlassClosure klassCl(this, &rootsCl);
|
VerifyKlassClosure klassCl(this, &rootsCl);
|
||||||
|
|
||||||
// We apply the relevant closures to all the oops in the
|
// We apply the relevant closures to all the oops in the
|
||||||
@ -3376,7 +3429,7 @@ void G1CollectedHeap::verify(bool silent,
|
|||||||
&klassCl
|
&klassCl
|
||||||
);
|
);
|
||||||
|
|
||||||
bool failures = rootsCl.failures();
|
bool failures = rootsCl.failures() || codeRootsCl.failures();
|
||||||
|
|
||||||
if (vo != VerifyOption_G1UseMarkWord) {
|
if (vo != VerifyOption_G1UseMarkWord) {
|
||||||
// If we're verifying during a full GC then the region sets
|
// If we're verifying during a full GC then the region sets
|
||||||
@ -3445,6 +3498,34 @@ void G1CollectedHeap::verify(bool silent,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void G1CollectedHeap::verify(bool silent) {
|
||||||
|
verify(silent, VerifyOption_G1UsePrevMarking);
|
||||||
|
}
|
||||||
|
|
||||||
|
double G1CollectedHeap::verify(bool guard, const char* msg) {
|
||||||
|
double verify_time_ms = 0.0;
|
||||||
|
|
||||||
|
if (guard && total_collections() >= VerifyGCStartAt) {
|
||||||
|
double verify_start = os::elapsedTime();
|
||||||
|
HandleMark hm; // Discard invalid handles created during verification
|
||||||
|
prepare_for_verify();
|
||||||
|
Universe::verify(VerifyOption_G1UsePrevMarking, msg);
|
||||||
|
verify_time_ms = (os::elapsedTime() - verify_start) * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
return verify_time_ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
void G1CollectedHeap::verify_before_gc() {
|
||||||
|
double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:");
|
||||||
|
g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void G1CollectedHeap::verify_after_gc() {
|
||||||
|
double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:");
|
||||||
|
g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms);
|
||||||
|
}
|
||||||
|
|
||||||
class PrintRegionClosure: public HeapRegionClosure {
|
class PrintRegionClosure: public HeapRegionClosure {
|
||||||
outputStream* _st;
|
outputStream* _st;
|
||||||
public:
|
public:
|
||||||
@ -3866,8 +3947,9 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
|
|||||||
append_secondary_free_list_if_not_empty_with_lock();
|
append_secondary_free_list_if_not_empty_with_lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(check_young_list_well_formed(),
|
assert(check_young_list_well_formed(), "young list should be well formed");
|
||||||
"young list should be well formed");
|
assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
|
||||||
|
"sanity check");
|
||||||
|
|
||||||
// Don't dynamically change the number of GC threads this early. A value of
|
// Don't dynamically change the number of GC threads this early. A value of
|
||||||
// 0 is used to indicate serial work. When parallel work is done,
|
// 0 is used to indicate serial work. When parallel work is done,
|
||||||
@ -4987,7 +5069,11 @@ public:
|
|||||||
|
|
||||||
G1ParPushHeapRSClosure push_heap_rs_cl(_g1h, &pss);
|
G1ParPushHeapRSClosure push_heap_rs_cl(_g1h, &pss);
|
||||||
|
|
||||||
int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings | SharedHeap::SO_CodeCache;
|
// Don't scan the scavengable methods in the code cache as part
|
||||||
|
// of strong root scanning. The code roots that point into a
|
||||||
|
// region in the collection set are scanned when we scan the
|
||||||
|
// region's RSet.
|
||||||
|
int so = SharedHeap::SO_AllClasses | SharedHeap::SO_Strings;
|
||||||
|
|
||||||
pss.start_strong_roots();
|
pss.start_strong_roots();
|
||||||
_g1h->g1_process_strong_roots(/* is scavenging */ true,
|
_g1h->g1_process_strong_roots(/* is scavenging */ true,
|
||||||
@ -5029,67 +5115,6 @@ public:
|
|||||||
|
|
||||||
// *** Common G1 Evacuation Stuff
|
// *** Common G1 Evacuation Stuff
|
||||||
|
|
||||||
// Closures that support the filtering of CodeBlobs scanned during
|
|
||||||
// external root scanning.
|
|
||||||
|
|
||||||
// Closure applied to reference fields in code blobs (specifically nmethods)
|
|
||||||
// to determine whether an nmethod contains references that point into
|
|
||||||
// the collection set. Used as a predicate when walking code roots so
|
|
||||||
// that only nmethods that point into the collection set are added to the
|
|
||||||
// 'marked' list.
|
|
||||||
|
|
||||||
class G1FilteredCodeBlobToOopClosure : public CodeBlobToOopClosure {
|
|
||||||
|
|
||||||
class G1PointsIntoCSOopClosure : public OopClosure {
|
|
||||||
G1CollectedHeap* _g1;
|
|
||||||
bool _points_into_cs;
|
|
||||||
public:
|
|
||||||
G1PointsIntoCSOopClosure(G1CollectedHeap* g1) :
|
|
||||||
_g1(g1), _points_into_cs(false) { }
|
|
||||||
|
|
||||||
bool points_into_cs() const { return _points_into_cs; }
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
void do_oop_nv(T* p) {
|
|
||||||
if (!_points_into_cs) {
|
|
||||||
T heap_oop = oopDesc::load_heap_oop(p);
|
|
||||||
if (!oopDesc::is_null(heap_oop) &&
|
|
||||||
_g1->in_cset_fast_test(oopDesc::decode_heap_oop_not_null(heap_oop))) {
|
|
||||||
_points_into_cs = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void do_oop(oop* p) { do_oop_nv(p); }
|
|
||||||
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
|
|
||||||
};
|
|
||||||
|
|
||||||
G1CollectedHeap* _g1;
|
|
||||||
|
|
||||||
public:
|
|
||||||
G1FilteredCodeBlobToOopClosure(G1CollectedHeap* g1, OopClosure* cl) :
|
|
||||||
CodeBlobToOopClosure(cl, true), _g1(g1) { }
|
|
||||||
|
|
||||||
virtual void do_code_blob(CodeBlob* cb) {
|
|
||||||
nmethod* nm = cb->as_nmethod_or_null();
|
|
||||||
if (nm != NULL && !(nm->test_oops_do_mark())) {
|
|
||||||
G1PointsIntoCSOopClosure predicate_cl(_g1);
|
|
||||||
nm->oops_do(&predicate_cl);
|
|
||||||
|
|
||||||
if (predicate_cl.points_into_cs()) {
|
|
||||||
// At least one of the reference fields or the oop relocations
|
|
||||||
// in the nmethod points into the collection set. We have to
|
|
||||||
// 'mark' this nmethod.
|
|
||||||
// Note: Revisit the following if CodeBlobToOopClosure::do_code_blob()
|
|
||||||
// or MarkingCodeBlobClosure::do_code_blob() change.
|
|
||||||
if (!nm->test_set_oops_do_mark()) {
|
|
||||||
do_newly_marked_nmethod(nm);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// This method is run in a GC worker.
|
// This method is run in a GC worker.
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -5107,9 +5132,10 @@ g1_process_strong_roots(bool is_scavenging,
|
|||||||
|
|
||||||
BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
|
BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
|
||||||
|
|
||||||
// Walk the code cache w/o buffering, because StarTask cannot handle
|
assert(so & SO_CodeCache || scan_rs != NULL, "must scan code roots somehow");
|
||||||
// unaligned oop locations.
|
// Walk the code cache/strong code roots w/o buffering, because StarTask
|
||||||
G1FilteredCodeBlobToOopClosure eager_scan_code_roots(this, scan_non_heap_roots);
|
// cannot handle unaligned oop locations.
|
||||||
|
CodeBlobToOopClosure eager_scan_code_roots(scan_non_heap_roots, true /* do_marking */);
|
||||||
|
|
||||||
process_strong_roots(false, // no scoping; this is parallel code
|
process_strong_roots(false, // no scoping; this is parallel code
|
||||||
is_scavenging, so,
|
is_scavenging, so,
|
||||||
@ -5154,9 +5180,22 @@ g1_process_strong_roots(bool is_scavenging,
|
|||||||
}
|
}
|
||||||
g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms);
|
g1_policy()->phase_times()->record_satb_filtering_time(worker_i, satb_filtering_ms);
|
||||||
|
|
||||||
|
// If this is an initial mark pause, and we're not scanning
|
||||||
|
// the entire code cache, we need to mark the oops in the
|
||||||
|
// strong code root lists for the regions that are not in
|
||||||
|
// the collection set.
|
||||||
|
// Note all threads participate in this set of root tasks.
|
||||||
|
double mark_strong_code_roots_ms = 0.0;
|
||||||
|
if (g1_policy()->during_initial_mark_pause() && !(so & SO_CodeCache)) {
|
||||||
|
double mark_strong_roots_start = os::elapsedTime();
|
||||||
|
mark_strong_code_roots(worker_i);
|
||||||
|
mark_strong_code_roots_ms = (os::elapsedTime() - mark_strong_roots_start) * 1000.0;
|
||||||
|
}
|
||||||
|
g1_policy()->phase_times()->record_strong_code_root_mark_time(worker_i, mark_strong_code_roots_ms);
|
||||||
|
|
||||||
// Now scan the complement of the collection set.
|
// Now scan the complement of the collection set.
|
||||||
if (scan_rs != NULL) {
|
if (scan_rs != NULL) {
|
||||||
g1_rem_set()->oops_into_collection_set_do(scan_rs, worker_i);
|
g1_rem_set()->oops_into_collection_set_do(scan_rs, &eager_scan_code_roots, worker_i);
|
||||||
}
|
}
|
||||||
_process_strong_tasks->all_tasks_completed();
|
_process_strong_tasks->all_tasks_completed();
|
||||||
}
|
}
|
||||||
@ -5774,9 +5813,6 @@ void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) {
|
|||||||
process_discovered_references(n_workers);
|
process_discovered_references(n_workers);
|
||||||
|
|
||||||
// Weak root processing.
|
// Weak root processing.
|
||||||
// Note: when JSR 292 is enabled and code blobs can contain
|
|
||||||
// non-perm oops then we will need to process the code blobs
|
|
||||||
// here too.
|
|
||||||
{
|
{
|
||||||
G1STWIsAliveClosure is_alive(this);
|
G1STWIsAliveClosure is_alive(this);
|
||||||
G1KeepAliveClosure keep_alive(this);
|
G1KeepAliveClosure keep_alive(this);
|
||||||
@ -5792,6 +5828,17 @@ void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) {
|
|||||||
hot_card_cache->reset_hot_cache();
|
hot_card_cache->reset_hot_cache();
|
||||||
hot_card_cache->set_use_cache(true);
|
hot_card_cache->set_use_cache(true);
|
||||||
|
|
||||||
|
// Migrate the strong code roots attached to each region in
|
||||||
|
// the collection set. Ideally we would like to do this
|
||||||
|
// after we have finished the scanning/evacuation of the
|
||||||
|
// strong code roots for a particular heap region.
|
||||||
|
migrate_strong_code_roots();
|
||||||
|
|
||||||
|
if (g1_policy()->during_initial_mark_pause()) {
|
||||||
|
// Reset the claim values set during marking the strong code roots
|
||||||
|
reset_heap_region_claim_values();
|
||||||
|
}
|
||||||
|
|
||||||
finalize_for_evac_failure();
|
finalize_for_evac_failure();
|
||||||
|
|
||||||
if (evacuation_failed()) {
|
if (evacuation_failed()) {
|
||||||
@ -6588,3 +6635,208 @@ void G1CollectedHeap::verify_region_sets() {
|
|||||||
_humongous_set.verify_end();
|
_humongous_set.verify_end();
|
||||||
_free_list.verify_end();
|
_free_list.verify_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Optimized nmethod scanning
|
||||||
|
|
||||||
|
class RegisterNMethodOopClosure: public OopClosure {
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
nmethod* _nm;
|
||||||
|
|
||||||
|
template <class T> void do_oop_work(T* p) {
|
||||||
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
|
HeapRegion* hr = _g1h->heap_region_containing(obj);
|
||||||
|
assert(!hr->isHumongous(), "code root in humongous region?");
|
||||||
|
|
||||||
|
// HeapRegion::add_strong_code_root() avoids adding duplicate
|
||||||
|
// entries but having duplicates is OK since we "mark" nmethods
|
||||||
|
// as visited when we scan the strong code root lists during the GC.
|
||||||
|
hr->add_strong_code_root(_nm);
|
||||||
|
assert(hr->rem_set()->strong_code_roots_list_contains(_nm), "add failed?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
|
||||||
|
_g1h(g1h), _nm(nm) {}
|
||||||
|
|
||||||
|
void do_oop(oop* p) { do_oop_work(p); }
|
||||||
|
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||||
|
};
|
||||||
|
|
||||||
|
class UnregisterNMethodOopClosure: public OopClosure {
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
nmethod* _nm;
|
||||||
|
|
||||||
|
template <class T> void do_oop_work(T* p) {
|
||||||
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
|
HeapRegion* hr = _g1h->heap_region_containing(obj);
|
||||||
|
assert(!hr->isHumongous(), "code root in humongous region?");
|
||||||
|
hr->remove_strong_code_root(_nm);
|
||||||
|
assert(!hr->rem_set()->strong_code_roots_list_contains(_nm), "remove failed?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
|
||||||
|
_g1h(g1h), _nm(nm) {}
|
||||||
|
|
||||||
|
void do_oop(oop* p) { do_oop_work(p); }
|
||||||
|
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||||
|
};
|
||||||
|
|
||||||
|
void G1CollectedHeap::register_nmethod(nmethod* nm) {
|
||||||
|
CollectedHeap::register_nmethod(nm);
|
||||||
|
|
||||||
|
guarantee(nm != NULL, "sanity");
|
||||||
|
RegisterNMethodOopClosure reg_cl(this, nm);
|
||||||
|
nm->oops_do(®_cl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void G1CollectedHeap::unregister_nmethod(nmethod* nm) {
|
||||||
|
CollectedHeap::unregister_nmethod(nm);
|
||||||
|
|
||||||
|
guarantee(nm != NULL, "sanity");
|
||||||
|
UnregisterNMethodOopClosure reg_cl(this, nm);
|
||||||
|
nm->oops_do(®_cl, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
class MigrateCodeRootsHeapRegionClosure: public HeapRegionClosure {
|
||||||
|
public:
|
||||||
|
bool doHeapRegion(HeapRegion *hr) {
|
||||||
|
assert(!hr->isHumongous(), "humongous region in collection set?");
|
||||||
|
hr->migrate_strong_code_roots();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void G1CollectedHeap::migrate_strong_code_roots() {
|
||||||
|
MigrateCodeRootsHeapRegionClosure cl;
|
||||||
|
double migrate_start = os::elapsedTime();
|
||||||
|
collection_set_iterate(&cl);
|
||||||
|
double migration_time_ms = (os::elapsedTime() - migrate_start) * 1000.0;
|
||||||
|
g1_policy()->phase_times()->record_strong_code_root_migration_time(migration_time_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark all the code roots that point into regions *not* in the
|
||||||
|
// collection set.
|
||||||
|
//
|
||||||
|
// Note we do not want to use a "marking" CodeBlobToOopClosure while
|
||||||
|
// walking the the code roots lists of regions not in the collection
|
||||||
|
// set. Suppose we have an nmethod (M) that points to objects in two
|
||||||
|
// separate regions - one in the collection set (R1) and one not (R2).
|
||||||
|
// Using a "marking" CodeBlobToOopClosure here would result in "marking"
|
||||||
|
// nmethod M when walking the code roots for R1. When we come to scan
|
||||||
|
// the code roots for R2, we would see that M is already marked and it
|
||||||
|
// would be skipped and the objects in R2 that are referenced from M
|
||||||
|
// would not be evacuated.
|
||||||
|
|
||||||
|
class MarkStrongCodeRootCodeBlobClosure: public CodeBlobClosure {
|
||||||
|
|
||||||
|
class MarkStrongCodeRootOopClosure: public OopClosure {
|
||||||
|
ConcurrentMark* _cm;
|
||||||
|
HeapRegion* _hr;
|
||||||
|
uint _worker_id;
|
||||||
|
|
||||||
|
template <class T> void do_oop_work(T* p) {
|
||||||
|
T heap_oop = oopDesc::load_heap_oop(p);
|
||||||
|
if (!oopDesc::is_null(heap_oop)) {
|
||||||
|
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
|
||||||
|
// Only mark objects in the region (which is assumed
|
||||||
|
// to be not in the collection set).
|
||||||
|
if (_hr->is_in(obj)) {
|
||||||
|
_cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
MarkStrongCodeRootOopClosure(ConcurrentMark* cm, HeapRegion* hr, uint worker_id) :
|
||||||
|
_cm(cm), _hr(hr), _worker_id(worker_id) {
|
||||||
|
assert(!_hr->in_collection_set(), "sanity");
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||||
|
void do_oop(oop* p) { do_oop_work(p); }
|
||||||
|
};
|
||||||
|
|
||||||
|
MarkStrongCodeRootOopClosure _oop_cl;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MarkStrongCodeRootCodeBlobClosure(ConcurrentMark* cm, HeapRegion* hr, uint worker_id):
|
||||||
|
_oop_cl(cm, hr, worker_id) {}
|
||||||
|
|
||||||
|
void do_code_blob(CodeBlob* cb) {
|
||||||
|
nmethod* nm = (cb == NULL) ? NULL : cb->as_nmethod_or_null();
|
||||||
|
if (nm != NULL) {
|
||||||
|
nm->oops_do(&_oop_cl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MarkStrongCodeRootsHRClosure: public HeapRegionClosure {
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
uint _worker_id;
|
||||||
|
|
||||||
|
public:
|
||||||
|
MarkStrongCodeRootsHRClosure(G1CollectedHeap* g1h, uint worker_id) :
|
||||||
|
_g1h(g1h), _worker_id(worker_id) {}
|
||||||
|
|
||||||
|
bool doHeapRegion(HeapRegion *hr) {
|
||||||
|
HeapRegionRemSet* hrrs = hr->rem_set();
|
||||||
|
if (hr->isHumongous()) {
|
||||||
|
// Code roots should never be attached to a humongous region
|
||||||
|
assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hr->in_collection_set()) {
|
||||||
|
// Don't mark code roots into regions in the collection set here.
|
||||||
|
// They will be marked when we scan them.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MarkStrongCodeRootCodeBlobClosure cb_cl(_g1h->concurrent_mark(), hr, _worker_id);
|
||||||
|
hr->strong_code_roots_do(&cb_cl);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void G1CollectedHeap::mark_strong_code_roots(uint worker_id) {
|
||||||
|
MarkStrongCodeRootsHRClosure cl(this, worker_id);
|
||||||
|
if (G1CollectedHeap::use_parallel_gc_threads()) {
|
||||||
|
heap_region_par_iterate_chunked(&cl,
|
||||||
|
worker_id,
|
||||||
|
workers()->active_workers(),
|
||||||
|
HeapRegion::ParMarkRootClaimValue);
|
||||||
|
} else {
|
||||||
|
heap_region_iterate(&cl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RebuildStrongCodeRootClosure: public CodeBlobClosure {
|
||||||
|
G1CollectedHeap* _g1h;
|
||||||
|
|
||||||
|
public:
|
||||||
|
RebuildStrongCodeRootClosure(G1CollectedHeap* g1h) :
|
||||||
|
_g1h(g1h) {}
|
||||||
|
|
||||||
|
void do_code_blob(CodeBlob* cb) {
|
||||||
|
nmethod* nm = (cb != NULL) ? cb->as_nmethod_or_null() : NULL;
|
||||||
|
if (nm == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ScavengeRootsInCode && nm->detect_scavenge_root_oops()) {
|
||||||
|
_g1h->register_nmethod(nm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void G1CollectedHeap::rebuild_strong_code_roots() {
|
||||||
|
RebuildStrongCodeRootClosure blob_cl(this);
|
||||||
|
CodeCache::blobs_do(&blob_cl);
|
||||||
|
}
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
// may combine concurrent marking with parallel, incremental compaction of
|
// may combine concurrent marking with parallel, incremental compaction of
|
||||||
// heap subsets that will yield large amounts of garbage.
|
// heap subsets that will yield large amounts of garbage.
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
class HeapRegion;
|
class HeapRegion;
|
||||||
class HRRSCleanupTask;
|
class HRRSCleanupTask;
|
||||||
class GenerationSpec;
|
class GenerationSpec;
|
||||||
@ -69,6 +70,7 @@ class STWGCTimer;
|
|||||||
class G1NewTracer;
|
class G1NewTracer;
|
||||||
class G1OldTracer;
|
class G1OldTracer;
|
||||||
class EvacuationFailedInfo;
|
class EvacuationFailedInfo;
|
||||||
|
class nmethod;
|
||||||
|
|
||||||
typedef OverflowTaskQueue<StarTask, mtGC> RefToScanQueue;
|
typedef OverflowTaskQueue<StarTask, mtGC> RefToScanQueue;
|
||||||
typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet;
|
typedef GenericTaskQueueSet<RefToScanQueue, mtGC> RefToScanQueueSet;
|
||||||
@ -163,18 +165,6 @@ public:
|
|||||||
: G1AllocRegion("Mutator Alloc Region", false /* bot_updates */) { }
|
: G1AllocRegion("Mutator Alloc Region", false /* bot_updates */) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
// The G1 STW is alive closure.
|
|
||||||
// An instance is embedded into the G1CH and used as the
|
|
||||||
// (optional) _is_alive_non_header closure in the STW
|
|
||||||
// reference processor. It is also extensively used during
|
|
||||||
// reference processing during STW evacuation pauses.
|
|
||||||
class G1STWIsAliveClosure: public BoolObjectClosure {
|
|
||||||
G1CollectedHeap* _g1;
|
|
||||||
public:
|
|
||||||
G1STWIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
|
|
||||||
bool do_object_b(oop p);
|
|
||||||
};
|
|
||||||
|
|
||||||
class SurvivorGCAllocRegion : public G1AllocRegion {
|
class SurvivorGCAllocRegion : public G1AllocRegion {
|
||||||
protected:
|
protected:
|
||||||
virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
|
virtual HeapRegion* allocate_new_region(size_t word_size, bool force);
|
||||||
@ -193,6 +183,18 @@ public:
|
|||||||
: G1AllocRegion("Old GC Alloc Region", true /* bot_updates */) { }
|
: G1AllocRegion("Old GC Alloc Region", true /* bot_updates */) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// The G1 STW is alive closure.
|
||||||
|
// An instance is embedded into the G1CH and used as the
|
||||||
|
// (optional) _is_alive_non_header closure in the STW
|
||||||
|
// reference processor. It is also extensively used during
|
||||||
|
// reference processing during STW evacuation pauses.
|
||||||
|
class G1STWIsAliveClosure: public BoolObjectClosure {
|
||||||
|
G1CollectedHeap* _g1;
|
||||||
|
public:
|
||||||
|
G1STWIsAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
|
||||||
|
bool do_object_b(oop p);
|
||||||
|
};
|
||||||
|
|
||||||
class RefineCardTableEntryClosure;
|
class RefineCardTableEntryClosure;
|
||||||
|
|
||||||
class G1CollectedHeap : public SharedHeap {
|
class G1CollectedHeap : public SharedHeap {
|
||||||
@ -1549,42 +1551,6 @@ public:
|
|||||||
|
|
||||||
virtual jlong millis_since_last_gc();
|
virtual jlong millis_since_last_gc();
|
||||||
|
|
||||||
// Perform any cleanup actions necessary before allowing a verification.
|
|
||||||
virtual void prepare_for_verify();
|
|
||||||
|
|
||||||
// Perform verification.
|
|
||||||
|
|
||||||
// vo == UsePrevMarking -> use "prev" marking information,
|
|
||||||
// vo == UseNextMarking -> use "next" marking information
|
|
||||||
// vo == UseMarkWord -> use the mark word in the object header
|
|
||||||
//
|
|
||||||
// NOTE: Only the "prev" marking information is guaranteed to be
|
|
||||||
// consistent most of the time, so most calls to this should use
|
|
||||||
// vo == UsePrevMarking.
|
|
||||||
// Currently, there is only one case where this is called with
|
|
||||||
// vo == UseNextMarking, which is to verify the "next" marking
|
|
||||||
// information at the end of remark.
|
|
||||||
// Currently there is only one place where this is called with
|
|
||||||
// vo == UseMarkWord, which is to verify the marking during a
|
|
||||||
// full GC.
|
|
||||||
void verify(bool silent, VerifyOption vo);
|
|
||||||
|
|
||||||
// Override; it uses the "prev" marking information
|
|
||||||
virtual void verify(bool silent);
|
|
||||||
|
|
||||||
virtual void print_on(outputStream* st) const;
|
|
||||||
virtual void print_extended_on(outputStream* st) const;
|
|
||||||
virtual void print_on_error(outputStream* st) const;
|
|
||||||
|
|
||||||
virtual void print_gc_threads_on(outputStream* st) const;
|
|
||||||
virtual void gc_threads_do(ThreadClosure* tc) const;
|
|
||||||
|
|
||||||
// Override
|
|
||||||
void print_tracing_info() const;
|
|
||||||
|
|
||||||
// The following two methods are helpful for debugging RSet issues.
|
|
||||||
void print_cset_rsets() PRODUCT_RETURN;
|
|
||||||
void print_all_rsets() PRODUCT_RETURN;
|
|
||||||
|
|
||||||
// Convenience function to be used in situations where the heap type can be
|
// Convenience function to be used in situations where the heap type can be
|
||||||
// asserted to be this type.
|
// asserted to be this type.
|
||||||
@ -1661,13 +1627,86 @@ public:
|
|||||||
else return is_obj_ill(obj, hr);
|
else return is_obj_ill(obj, hr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool allocated_since_marking(oop obj, HeapRegion* hr, VerifyOption vo);
|
||||||
|
HeapWord* top_at_mark_start(HeapRegion* hr, VerifyOption vo);
|
||||||
|
bool is_marked(oop obj, VerifyOption vo);
|
||||||
|
const char* top_at_mark_start_str(VerifyOption vo);
|
||||||
|
|
||||||
|
ConcurrentMark* concurrent_mark() const { return _cm; }
|
||||||
|
|
||||||
|
// Refinement
|
||||||
|
|
||||||
|
ConcurrentG1Refine* concurrent_g1_refine() const { return _cg1r; }
|
||||||
|
|
||||||
|
// The dirty cards region list is used to record a subset of regions
|
||||||
|
// whose cards need clearing. The list if populated during the
|
||||||
|
// remembered set scanning and drained during the card table
|
||||||
|
// cleanup. Although the methods are reentrant, population/draining
|
||||||
|
// phases must not overlap. For synchronization purposes the last
|
||||||
|
// element on the list points to itself.
|
||||||
|
HeapRegion* _dirty_cards_region_list;
|
||||||
|
void push_dirty_cards_region(HeapRegion* hr);
|
||||||
|
HeapRegion* pop_dirty_cards_region();
|
||||||
|
|
||||||
|
// Optimized nmethod scanning support routines
|
||||||
|
|
||||||
|
// Register the given nmethod with the G1 heap
|
||||||
|
virtual void register_nmethod(nmethod* nm);
|
||||||
|
|
||||||
|
// Unregister the given nmethod from the G1 heap
|
||||||
|
virtual void unregister_nmethod(nmethod* nm);
|
||||||
|
|
||||||
|
// Migrate the nmethods in the code root lists of the regions
|
||||||
|
// in the collection set to regions in to-space. In the event
|
||||||
|
// of an evacuation failure, nmethods that reference objects
|
||||||
|
// that were not successfullly evacuated are not migrated.
|
||||||
|
void migrate_strong_code_roots();
|
||||||
|
|
||||||
|
// During an initial mark pause, mark all the code roots that
|
||||||
|
// point into regions *not* in the collection set.
|
||||||
|
void mark_strong_code_roots(uint worker_id);
|
||||||
|
|
||||||
|
// Rebuild the stong code root lists for each region
|
||||||
|
// after a full GC
|
||||||
|
void rebuild_strong_code_roots();
|
||||||
|
|
||||||
|
// Verification
|
||||||
|
|
||||||
|
// The following is just to alert the verification code
|
||||||
|
// that a full collection has occurred and that the
|
||||||
|
// remembered sets are no longer up to date.
|
||||||
|
bool _full_collection;
|
||||||
|
void set_full_collection() { _full_collection = true;}
|
||||||
|
void clear_full_collection() {_full_collection = false;}
|
||||||
|
bool full_collection() {return _full_collection;}
|
||||||
|
|
||||||
|
// Perform any cleanup actions necessary before allowing a verification.
|
||||||
|
virtual void prepare_for_verify();
|
||||||
|
|
||||||
|
// Perform verification.
|
||||||
|
|
||||||
|
// vo == UsePrevMarking -> use "prev" marking information,
|
||||||
|
// vo == UseNextMarking -> use "next" marking information
|
||||||
|
// vo == UseMarkWord -> use the mark word in the object header
|
||||||
|
//
|
||||||
|
// NOTE: Only the "prev" marking information is guaranteed to be
|
||||||
|
// consistent most of the time, so most calls to this should use
|
||||||
|
// vo == UsePrevMarking.
|
||||||
|
// Currently, there is only one case where this is called with
|
||||||
|
// vo == UseNextMarking, which is to verify the "next" marking
|
||||||
|
// information at the end of remark.
|
||||||
|
// Currently there is only one place where this is called with
|
||||||
|
// vo == UseMarkWord, which is to verify the marking during a
|
||||||
|
// full GC.
|
||||||
|
void verify(bool silent, VerifyOption vo);
|
||||||
|
|
||||||
|
// Override; it uses the "prev" marking information
|
||||||
|
virtual void verify(bool silent);
|
||||||
|
|
||||||
// The methods below are here for convenience and dispatch the
|
// The methods below are here for convenience and dispatch the
|
||||||
// appropriate method depending on value of the given VerifyOption
|
// appropriate method depending on value of the given VerifyOption
|
||||||
// parameter. The options for that parameter are:
|
// parameter. The values for that parameter, and their meanings,
|
||||||
//
|
// are the same as those above.
|
||||||
// vo == UsePrevMarking -> use "prev" marking information,
|
|
||||||
// vo == UseNextMarking -> use "next" marking information,
|
|
||||||
// vo == UseMarkWord -> use mark word from object header
|
|
||||||
|
|
||||||
bool is_obj_dead_cond(const oop obj,
|
bool is_obj_dead_cond(const oop obj,
|
||||||
const HeapRegion* hr,
|
const HeapRegion* hr,
|
||||||
@ -1692,31 +1731,21 @@ public:
|
|||||||
return false; // keep some compilers happy
|
return false; // keep some compilers happy
|
||||||
}
|
}
|
||||||
|
|
||||||
bool allocated_since_marking(oop obj, HeapRegion* hr, VerifyOption vo);
|
// Printing
|
||||||
HeapWord* top_at_mark_start(HeapRegion* hr, VerifyOption vo);
|
|
||||||
bool is_marked(oop obj, VerifyOption vo);
|
|
||||||
const char* top_at_mark_start_str(VerifyOption vo);
|
|
||||||
|
|
||||||
// The following is just to alert the verification code
|
virtual void print_on(outputStream* st) const;
|
||||||
// that a full collection has occurred and that the
|
virtual void print_extended_on(outputStream* st) const;
|
||||||
// remembered sets are no longer up to date.
|
virtual void print_on_error(outputStream* st) const;
|
||||||
bool _full_collection;
|
|
||||||
void set_full_collection() { _full_collection = true;}
|
|
||||||
void clear_full_collection() {_full_collection = false;}
|
|
||||||
bool full_collection() {return _full_collection;}
|
|
||||||
|
|
||||||
ConcurrentMark* concurrent_mark() const { return _cm; }
|
virtual void print_gc_threads_on(outputStream* st) const;
|
||||||
ConcurrentG1Refine* concurrent_g1_refine() const { return _cg1r; }
|
virtual void gc_threads_do(ThreadClosure* tc) const;
|
||||||
|
|
||||||
// The dirty cards region list is used to record a subset of regions
|
// Override
|
||||||
// whose cards need clearing. The list if populated during the
|
void print_tracing_info() const;
|
||||||
// remembered set scanning and drained during the card table
|
|
||||||
// cleanup. Although the methods are reentrant, population/draining
|
// The following two methods are helpful for debugging RSet issues.
|
||||||
// phases must not overlap. For synchronization purposes the last
|
void print_cset_rsets() PRODUCT_RETURN;
|
||||||
// element on the list points to itself.
|
void print_all_rsets() PRODUCT_RETURN;
|
||||||
HeapRegion* _dirty_cards_region_list;
|
|
||||||
void push_dirty_cards_region(HeapRegion* hr);
|
|
||||||
HeapRegion* pop_dirty_cards_region();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void stop_conc_gc_threads();
|
void stop_conc_gc_threads();
|
||||||
|
@ -161,6 +161,8 @@ G1GCPhaseTimes::G1GCPhaseTimes(uint max_gc_threads) :
|
|||||||
_last_update_rs_times_ms(_max_gc_threads, "%.1lf"),
|
_last_update_rs_times_ms(_max_gc_threads, "%.1lf"),
|
||||||
_last_update_rs_processed_buffers(_max_gc_threads, "%d"),
|
_last_update_rs_processed_buffers(_max_gc_threads, "%d"),
|
||||||
_last_scan_rs_times_ms(_max_gc_threads, "%.1lf"),
|
_last_scan_rs_times_ms(_max_gc_threads, "%.1lf"),
|
||||||
|
_last_strong_code_root_scan_times_ms(_max_gc_threads, "%.1lf"),
|
||||||
|
_last_strong_code_root_mark_times_ms(_max_gc_threads, "%.1lf"),
|
||||||
_last_obj_copy_times_ms(_max_gc_threads, "%.1lf"),
|
_last_obj_copy_times_ms(_max_gc_threads, "%.1lf"),
|
||||||
_last_termination_times_ms(_max_gc_threads, "%.1lf"),
|
_last_termination_times_ms(_max_gc_threads, "%.1lf"),
|
||||||
_last_termination_attempts(_max_gc_threads, SIZE_FORMAT),
|
_last_termination_attempts(_max_gc_threads, SIZE_FORMAT),
|
||||||
@ -182,6 +184,8 @@ void G1GCPhaseTimes::note_gc_start(uint active_gc_threads) {
|
|||||||
_last_update_rs_times_ms.reset();
|
_last_update_rs_times_ms.reset();
|
||||||
_last_update_rs_processed_buffers.reset();
|
_last_update_rs_processed_buffers.reset();
|
||||||
_last_scan_rs_times_ms.reset();
|
_last_scan_rs_times_ms.reset();
|
||||||
|
_last_strong_code_root_scan_times_ms.reset();
|
||||||
|
_last_strong_code_root_mark_times_ms.reset();
|
||||||
_last_obj_copy_times_ms.reset();
|
_last_obj_copy_times_ms.reset();
|
||||||
_last_termination_times_ms.reset();
|
_last_termination_times_ms.reset();
|
||||||
_last_termination_attempts.reset();
|
_last_termination_attempts.reset();
|
||||||
@ -197,6 +201,8 @@ void G1GCPhaseTimes::note_gc_end() {
|
|||||||
_last_update_rs_times_ms.verify();
|
_last_update_rs_times_ms.verify();
|
||||||
_last_update_rs_processed_buffers.verify();
|
_last_update_rs_processed_buffers.verify();
|
||||||
_last_scan_rs_times_ms.verify();
|
_last_scan_rs_times_ms.verify();
|
||||||
|
_last_strong_code_root_scan_times_ms.verify();
|
||||||
|
_last_strong_code_root_mark_times_ms.verify();
|
||||||
_last_obj_copy_times_ms.verify();
|
_last_obj_copy_times_ms.verify();
|
||||||
_last_termination_times_ms.verify();
|
_last_termination_times_ms.verify();
|
||||||
_last_termination_attempts.verify();
|
_last_termination_attempts.verify();
|
||||||
@ -210,6 +216,8 @@ void G1GCPhaseTimes::note_gc_end() {
|
|||||||
_last_satb_filtering_times_ms.get(i) +
|
_last_satb_filtering_times_ms.get(i) +
|
||||||
_last_update_rs_times_ms.get(i) +
|
_last_update_rs_times_ms.get(i) +
|
||||||
_last_scan_rs_times_ms.get(i) +
|
_last_scan_rs_times_ms.get(i) +
|
||||||
|
_last_strong_code_root_scan_times_ms.get(i) +
|
||||||
|
_last_strong_code_root_mark_times_ms.get(i) +
|
||||||
_last_obj_copy_times_ms.get(i) +
|
_last_obj_copy_times_ms.get(i) +
|
||||||
_last_termination_times_ms.get(i);
|
_last_termination_times_ms.get(i);
|
||||||
|
|
||||||
@ -239,6 +247,9 @@ double G1GCPhaseTimes::accounted_time_ms() {
|
|||||||
// Now subtract the time taken to fix up roots in generated code
|
// Now subtract the time taken to fix up roots in generated code
|
||||||
misc_time_ms += _cur_collection_code_root_fixup_time_ms;
|
misc_time_ms += _cur_collection_code_root_fixup_time_ms;
|
||||||
|
|
||||||
|
// Strong code root migration time
|
||||||
|
misc_time_ms += _cur_strong_code_root_migration_time_ms;
|
||||||
|
|
||||||
// Subtract the time taken to clean the card table from the
|
// Subtract the time taken to clean the card table from the
|
||||||
// current value of "other time"
|
// current value of "other time"
|
||||||
misc_time_ms += _cur_clear_ct_time_ms;
|
misc_time_ms += _cur_clear_ct_time_ms;
|
||||||
@ -257,9 +268,13 @@ void G1GCPhaseTimes::print(double pause_time_sec) {
|
|||||||
if (_last_satb_filtering_times_ms.sum() > 0.0) {
|
if (_last_satb_filtering_times_ms.sum() > 0.0) {
|
||||||
_last_satb_filtering_times_ms.print(2, "SATB Filtering (ms)");
|
_last_satb_filtering_times_ms.print(2, "SATB Filtering (ms)");
|
||||||
}
|
}
|
||||||
|
if (_last_strong_code_root_mark_times_ms.sum() > 0.0) {
|
||||||
|
_last_strong_code_root_mark_times_ms.print(2, "Code Root Marking (ms)");
|
||||||
|
}
|
||||||
_last_update_rs_times_ms.print(2, "Update RS (ms)");
|
_last_update_rs_times_ms.print(2, "Update RS (ms)");
|
||||||
_last_update_rs_processed_buffers.print(3, "Processed Buffers");
|
_last_update_rs_processed_buffers.print(3, "Processed Buffers");
|
||||||
_last_scan_rs_times_ms.print(2, "Scan RS (ms)");
|
_last_scan_rs_times_ms.print(2, "Scan RS (ms)");
|
||||||
|
_last_strong_code_root_scan_times_ms.print(2, "Code Root Scanning (ms)");
|
||||||
_last_obj_copy_times_ms.print(2, "Object Copy (ms)");
|
_last_obj_copy_times_ms.print(2, "Object Copy (ms)");
|
||||||
_last_termination_times_ms.print(2, "Termination (ms)");
|
_last_termination_times_ms.print(2, "Termination (ms)");
|
||||||
if (G1Log::finest()) {
|
if (G1Log::finest()) {
|
||||||
@ -273,12 +288,17 @@ void G1GCPhaseTimes::print(double pause_time_sec) {
|
|||||||
if (_last_satb_filtering_times_ms.sum() > 0.0) {
|
if (_last_satb_filtering_times_ms.sum() > 0.0) {
|
||||||
_last_satb_filtering_times_ms.print(1, "SATB Filtering (ms)");
|
_last_satb_filtering_times_ms.print(1, "SATB Filtering (ms)");
|
||||||
}
|
}
|
||||||
|
if (_last_strong_code_root_mark_times_ms.sum() > 0.0) {
|
||||||
|
_last_strong_code_root_mark_times_ms.print(1, "Code Root Marking (ms)");
|
||||||
|
}
|
||||||
_last_update_rs_times_ms.print(1, "Update RS (ms)");
|
_last_update_rs_times_ms.print(1, "Update RS (ms)");
|
||||||
_last_update_rs_processed_buffers.print(2, "Processed Buffers");
|
_last_update_rs_processed_buffers.print(2, "Processed Buffers");
|
||||||
_last_scan_rs_times_ms.print(1, "Scan RS (ms)");
|
_last_scan_rs_times_ms.print(1, "Scan RS (ms)");
|
||||||
|
_last_strong_code_root_scan_times_ms.print(1, "Code Root Scanning (ms)");
|
||||||
_last_obj_copy_times_ms.print(1, "Object Copy (ms)");
|
_last_obj_copy_times_ms.print(1, "Object Copy (ms)");
|
||||||
}
|
}
|
||||||
print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms);
|
print_stats(1, "Code Root Fixup", _cur_collection_code_root_fixup_time_ms);
|
||||||
|
print_stats(1, "Code Root Migration", _cur_strong_code_root_migration_time_ms);
|
||||||
print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
|
print_stats(1, "Clear CT", _cur_clear_ct_time_ms);
|
||||||
double misc_time_ms = pause_time_sec * MILLIUNITS - accounted_time_ms();
|
double misc_time_ms = pause_time_sec * MILLIUNITS - accounted_time_ms();
|
||||||
print_stats(1, "Other", misc_time_ms);
|
print_stats(1, "Other", misc_time_ms);
|
||||||
|
@ -119,6 +119,8 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
|
|||||||
WorkerDataArray<double> _last_update_rs_times_ms;
|
WorkerDataArray<double> _last_update_rs_times_ms;
|
||||||
WorkerDataArray<int> _last_update_rs_processed_buffers;
|
WorkerDataArray<int> _last_update_rs_processed_buffers;
|
||||||
WorkerDataArray<double> _last_scan_rs_times_ms;
|
WorkerDataArray<double> _last_scan_rs_times_ms;
|
||||||
|
WorkerDataArray<double> _last_strong_code_root_scan_times_ms;
|
||||||
|
WorkerDataArray<double> _last_strong_code_root_mark_times_ms;
|
||||||
WorkerDataArray<double> _last_obj_copy_times_ms;
|
WorkerDataArray<double> _last_obj_copy_times_ms;
|
||||||
WorkerDataArray<double> _last_termination_times_ms;
|
WorkerDataArray<double> _last_termination_times_ms;
|
||||||
WorkerDataArray<size_t> _last_termination_attempts;
|
WorkerDataArray<size_t> _last_termination_attempts;
|
||||||
@ -128,6 +130,7 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
|
|||||||
|
|
||||||
double _cur_collection_par_time_ms;
|
double _cur_collection_par_time_ms;
|
||||||
double _cur_collection_code_root_fixup_time_ms;
|
double _cur_collection_code_root_fixup_time_ms;
|
||||||
|
double _cur_strong_code_root_migration_time_ms;
|
||||||
|
|
||||||
double _cur_clear_ct_time_ms;
|
double _cur_clear_ct_time_ms;
|
||||||
double _cur_ref_proc_time_ms;
|
double _cur_ref_proc_time_ms;
|
||||||
@ -179,6 +182,14 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
|
|||||||
_last_scan_rs_times_ms.set(worker_i, ms);
|
_last_scan_rs_times_ms.set(worker_i, ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void record_strong_code_root_scan_time(uint worker_i, double ms) {
|
||||||
|
_last_strong_code_root_scan_times_ms.set(worker_i, ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
void record_strong_code_root_mark_time(uint worker_i, double ms) {
|
||||||
|
_last_strong_code_root_mark_times_ms.set(worker_i, ms);
|
||||||
|
}
|
||||||
|
|
||||||
void record_obj_copy_time(uint worker_i, double ms) {
|
void record_obj_copy_time(uint worker_i, double ms) {
|
||||||
_last_obj_copy_times_ms.set(worker_i, ms);
|
_last_obj_copy_times_ms.set(worker_i, ms);
|
||||||
}
|
}
|
||||||
@ -208,6 +219,10 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
|
|||||||
_cur_collection_code_root_fixup_time_ms = ms;
|
_cur_collection_code_root_fixup_time_ms = ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void record_strong_code_root_migration_time(double ms) {
|
||||||
|
_cur_strong_code_root_migration_time_ms = ms;
|
||||||
|
}
|
||||||
|
|
||||||
void record_ref_proc_time(double ms) {
|
void record_ref_proc_time(double ms) {
|
||||||
_cur_ref_proc_time_ms = ms;
|
_cur_ref_proc_time_ms = ms;
|
||||||
}
|
}
|
||||||
@ -294,6 +309,14 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
|
|||||||
return _last_scan_rs_times_ms.average();
|
return _last_scan_rs_times_ms.average();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double average_last_strong_code_root_scan_time(){
|
||||||
|
return _last_strong_code_root_scan_times_ms.average();
|
||||||
|
}
|
||||||
|
|
||||||
|
double average_last_strong_code_root_mark_time(){
|
||||||
|
return _last_strong_code_root_mark_times_ms.average();
|
||||||
|
}
|
||||||
|
|
||||||
double average_last_obj_copy_time() {
|
double average_last_obj_copy_time() {
|
||||||
return _last_obj_copy_times_ms.average();
|
return _last_obj_copy_times_ms.average();
|
||||||
}
|
}
|
||||||
|
@ -262,6 +262,7 @@ void G1MonitoringSupport::update_sizes() {
|
|||||||
old_collection_counters()->update_all();
|
old_collection_counters()->update_all();
|
||||||
young_collection_counters()->update_all();
|
young_collection_counters()->update_all();
|
||||||
MetaspaceCounters::update_performance_counters();
|
MetaspaceCounters::update_performance_counters();
|
||||||
|
CompressedClassSpaceCounters::update_performance_counters();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,15 +104,25 @@ void CountNonCleanMemRegionClosure::do_MemRegion(MemRegion mr) {
|
|||||||
class ScanRSClosure : public HeapRegionClosure {
|
class ScanRSClosure : public HeapRegionClosure {
|
||||||
size_t _cards_done, _cards;
|
size_t _cards_done, _cards;
|
||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
|
|
||||||
OopsInHeapRegionClosure* _oc;
|
OopsInHeapRegionClosure* _oc;
|
||||||
|
CodeBlobToOopClosure* _code_root_cl;
|
||||||
|
|
||||||
G1BlockOffsetSharedArray* _bot_shared;
|
G1BlockOffsetSharedArray* _bot_shared;
|
||||||
CardTableModRefBS *_ct_bs;
|
CardTableModRefBS *_ct_bs;
|
||||||
int _worker_i;
|
|
||||||
int _block_size;
|
double _strong_code_root_scan_time_sec;
|
||||||
bool _try_claimed;
|
int _worker_i;
|
||||||
|
int _block_size;
|
||||||
|
bool _try_claimed;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ScanRSClosure(OopsInHeapRegionClosure* oc, int worker_i) :
|
ScanRSClosure(OopsInHeapRegionClosure* oc,
|
||||||
|
CodeBlobToOopClosure* code_root_cl,
|
||||||
|
int worker_i) :
|
||||||
_oc(oc),
|
_oc(oc),
|
||||||
|
_code_root_cl(code_root_cl),
|
||||||
|
_strong_code_root_scan_time_sec(0.0),
|
||||||
_cards(0),
|
_cards(0),
|
||||||
_cards_done(0),
|
_cards_done(0),
|
||||||
_worker_i(worker_i),
|
_worker_i(worker_i),
|
||||||
@ -160,6 +170,12 @@ public:
|
|||||||
card_start, card_start + G1BlockOffsetSharedArray::N_words);
|
card_start, card_start + G1BlockOffsetSharedArray::N_words);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scan_strong_code_roots(HeapRegion* r) {
|
||||||
|
double scan_start = os::elapsedTime();
|
||||||
|
r->strong_code_roots_do(_code_root_cl);
|
||||||
|
_strong_code_root_scan_time_sec += (os::elapsedTime() - scan_start);
|
||||||
|
}
|
||||||
|
|
||||||
bool doHeapRegion(HeapRegion* r) {
|
bool doHeapRegion(HeapRegion* r) {
|
||||||
assert(r->in_collection_set(), "should only be called on elements of CS.");
|
assert(r->in_collection_set(), "should only be called on elements of CS.");
|
||||||
HeapRegionRemSet* hrrs = r->rem_set();
|
HeapRegionRemSet* hrrs = r->rem_set();
|
||||||
@ -173,6 +189,7 @@ public:
|
|||||||
// _try_claimed || r->claim_iter()
|
// _try_claimed || r->claim_iter()
|
||||||
// is true: either we're supposed to work on claimed-but-not-complete
|
// is true: either we're supposed to work on claimed-but-not-complete
|
||||||
// regions, or we successfully claimed the region.
|
// regions, or we successfully claimed the region.
|
||||||
|
|
||||||
HeapRegionRemSetIterator iter(hrrs);
|
HeapRegionRemSetIterator iter(hrrs);
|
||||||
size_t card_index;
|
size_t card_index;
|
||||||
|
|
||||||
@ -205,30 +222,43 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!_try_claimed) {
|
if (!_try_claimed) {
|
||||||
|
// Scan the strong code root list attached to the current region
|
||||||
|
scan_strong_code_roots(r);
|
||||||
|
|
||||||
hrrs->set_iter_complete();
|
hrrs->set_iter_complete();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double strong_code_root_scan_time_sec() {
|
||||||
|
return _strong_code_root_scan_time_sec;
|
||||||
|
}
|
||||||
|
|
||||||
size_t cards_done() { return _cards_done;}
|
size_t cards_done() { return _cards_done;}
|
||||||
size_t cards_looked_up() { return _cards;}
|
size_t cards_looked_up() { return _cards;}
|
||||||
};
|
};
|
||||||
|
|
||||||
void G1RemSet::scanRS(OopsInHeapRegionClosure* oc, int worker_i) {
|
void G1RemSet::scanRS(OopsInHeapRegionClosure* oc,
|
||||||
|
CodeBlobToOopClosure* code_root_cl,
|
||||||
|
int worker_i) {
|
||||||
double rs_time_start = os::elapsedTime();
|
double rs_time_start = os::elapsedTime();
|
||||||
HeapRegion *startRegion = _g1->start_cset_region_for_worker(worker_i);
|
HeapRegion *startRegion = _g1->start_cset_region_for_worker(worker_i);
|
||||||
|
|
||||||
ScanRSClosure scanRScl(oc, worker_i);
|
ScanRSClosure scanRScl(oc, code_root_cl, worker_i);
|
||||||
|
|
||||||
_g1->collection_set_iterate_from(startRegion, &scanRScl);
|
_g1->collection_set_iterate_from(startRegion, &scanRScl);
|
||||||
scanRScl.set_try_claimed();
|
scanRScl.set_try_claimed();
|
||||||
_g1->collection_set_iterate_from(startRegion, &scanRScl);
|
_g1->collection_set_iterate_from(startRegion, &scanRScl);
|
||||||
|
|
||||||
double scan_rs_time_sec = os::elapsedTime() - rs_time_start;
|
double scan_rs_time_sec = (os::elapsedTime() - rs_time_start)
|
||||||
|
- scanRScl.strong_code_root_scan_time_sec();
|
||||||
|
|
||||||
assert( _cards_scanned != NULL, "invariant" );
|
assert(_cards_scanned != NULL, "invariant");
|
||||||
_cards_scanned[worker_i] = scanRScl.cards_done();
|
_cards_scanned[worker_i] = scanRScl.cards_done();
|
||||||
|
|
||||||
_g1p->phase_times()->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0);
|
_g1p->phase_times()->record_scan_rs_time(worker_i, scan_rs_time_sec * 1000.0);
|
||||||
|
_g1p->phase_times()->record_strong_code_root_scan_time(worker_i,
|
||||||
|
scanRScl.strong_code_root_scan_time_sec() * 1000.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closure used for updating RSets and recording references that
|
// Closure used for updating RSets and recording references that
|
||||||
@ -288,7 +318,8 @@ void G1RemSet::cleanupHRRS() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
|
void G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
|
||||||
int worker_i) {
|
CodeBlobToOopClosure* code_root_cl,
|
||||||
|
int worker_i) {
|
||||||
#if CARD_REPEAT_HISTO
|
#if CARD_REPEAT_HISTO
|
||||||
ct_freq_update_histo_and_reset();
|
ct_freq_update_histo_and_reset();
|
||||||
#endif
|
#endif
|
||||||
@ -328,7 +359,7 @@ void G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
|
|||||||
_g1p->phase_times()->record_update_rs_time(worker_i, 0.0);
|
_g1p->phase_times()->record_update_rs_time(worker_i, 0.0);
|
||||||
}
|
}
|
||||||
if (G1UseParallelRSetScanning || (worker_i == 0)) {
|
if (G1UseParallelRSetScanning || (worker_i == 0)) {
|
||||||
scanRS(oc, worker_i);
|
scanRS(oc, code_root_cl, worker_i);
|
||||||
} else {
|
} else {
|
||||||
_g1p->phase_times()->record_scan_rs_time(worker_i, 0.0);
|
_g1p->phase_times()->record_scan_rs_time(worker_i, 0.0);
|
||||||
}
|
}
|
||||||
|
@ -81,14 +81,23 @@ public:
|
|||||||
G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
|
G1RemSet(G1CollectedHeap* g1, CardTableModRefBS* ct_bs);
|
||||||
~G1RemSet();
|
~G1RemSet();
|
||||||
|
|
||||||
// Invoke "blk->do_oop" on all pointers into the CS in objects in regions
|
// Invoke "blk->do_oop" on all pointers into the collection set
|
||||||
// outside the CS (having invoked "blk->set_region" to set the "from"
|
// from objects in regions outside the collection set (having
|
||||||
// region correctly beforehand.) The "worker_i" param is for the
|
// invoked "blk->set_region" to set the "from" region correctly
|
||||||
// parallel case where the number of the worker thread calling this
|
// beforehand.)
|
||||||
// function can be helpful in partitioning the work to be done. It
|
//
|
||||||
// should be the same as the "i" passed to the calling thread's
|
// Invoke code_root_cl->do_code_blob on the unmarked nmethods
|
||||||
// work(i) function. In the sequential case this param will be ingored.
|
// on the strong code roots list for each region in the
|
||||||
void oops_into_collection_set_do(OopsInHeapRegionClosure* blk, int worker_i);
|
// collection set.
|
||||||
|
//
|
||||||
|
// The "worker_i" param is for the parallel case where the id
|
||||||
|
// of the worker thread calling this function can be helpful in
|
||||||
|
// partitioning the work to be done. It should be the same as
|
||||||
|
// the "i" passed to the calling thread's work(i) function.
|
||||||
|
// In the sequential case this param will be ignored.
|
||||||
|
void oops_into_collection_set_do(OopsInHeapRegionClosure* blk,
|
||||||
|
CodeBlobToOopClosure* code_root_cl,
|
||||||
|
int worker_i);
|
||||||
|
|
||||||
// Prepare for and cleanup after an oops_into_collection_set_do
|
// Prepare for and cleanup after an oops_into_collection_set_do
|
||||||
// call. Must call each of these once before and after (in sequential
|
// call. Must call each of these once before and after (in sequential
|
||||||
@ -98,7 +107,10 @@ public:
|
|||||||
void prepare_for_oops_into_collection_set_do();
|
void prepare_for_oops_into_collection_set_do();
|
||||||
void cleanup_after_oops_into_collection_set_do();
|
void cleanup_after_oops_into_collection_set_do();
|
||||||
|
|
||||||
void scanRS(OopsInHeapRegionClosure* oc, int worker_i);
|
void scanRS(OopsInHeapRegionClosure* oc,
|
||||||
|
CodeBlobToOopClosure* code_root_cl,
|
||||||
|
int worker_i);
|
||||||
|
|
||||||
void updateRS(DirtyCardQueue* into_cset_dcq, int worker_i);
|
void updateRS(DirtyCardQueue* into_cset_dcq, int worker_i);
|
||||||
|
|
||||||
CardTableModRefBS* ct_bs() { return _ct_bs; }
|
CardTableModRefBS* ct_bs() { return _ct_bs; }
|
||||||
|
@ -127,32 +127,55 @@ void G1RemSetSummary::subtract_from(G1RemSetSummary* other) {
|
|||||||
|
|
||||||
class HRRSStatsIter: public HeapRegionClosure {
|
class HRRSStatsIter: public HeapRegionClosure {
|
||||||
size_t _occupied;
|
size_t _occupied;
|
||||||
size_t _total_mem_sz;
|
|
||||||
size_t _max_mem_sz;
|
size_t _total_rs_mem_sz;
|
||||||
HeapRegion* _max_mem_sz_region;
|
size_t _max_rs_mem_sz;
|
||||||
|
HeapRegion* _max_rs_mem_sz_region;
|
||||||
|
|
||||||
|
size_t _total_code_root_mem_sz;
|
||||||
|
size_t _max_code_root_mem_sz;
|
||||||
|
HeapRegion* _max_code_root_mem_sz_region;
|
||||||
public:
|
public:
|
||||||
HRRSStatsIter() :
|
HRRSStatsIter() :
|
||||||
_occupied(0),
|
_occupied(0),
|
||||||
_total_mem_sz(0),
|
_total_rs_mem_sz(0),
|
||||||
_max_mem_sz(0),
|
_max_rs_mem_sz(0),
|
||||||
_max_mem_sz_region(NULL)
|
_max_rs_mem_sz_region(NULL),
|
||||||
|
_total_code_root_mem_sz(0),
|
||||||
|
_max_code_root_mem_sz(0),
|
||||||
|
_max_code_root_mem_sz_region(NULL)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
bool doHeapRegion(HeapRegion* r) {
|
bool doHeapRegion(HeapRegion* r) {
|
||||||
size_t mem_sz = r->rem_set()->mem_size();
|
HeapRegionRemSet* hrrs = r->rem_set();
|
||||||
if (mem_sz > _max_mem_sz) {
|
|
||||||
_max_mem_sz = mem_sz;
|
// HeapRegionRemSet::mem_size() includes the
|
||||||
_max_mem_sz_region = r;
|
// size of the strong code roots
|
||||||
|
size_t rs_mem_sz = hrrs->mem_size();
|
||||||
|
if (rs_mem_sz > _max_rs_mem_sz) {
|
||||||
|
_max_rs_mem_sz = rs_mem_sz;
|
||||||
|
_max_rs_mem_sz_region = r;
|
||||||
}
|
}
|
||||||
_total_mem_sz += mem_sz;
|
_total_rs_mem_sz += rs_mem_sz;
|
||||||
size_t occ = r->rem_set()->occupied();
|
|
||||||
|
size_t code_root_mem_sz = hrrs->strong_code_roots_mem_size();
|
||||||
|
if (code_root_mem_sz > _max_code_root_mem_sz) {
|
||||||
|
_max_code_root_mem_sz = code_root_mem_sz;
|
||||||
|
_max_code_root_mem_sz_region = r;
|
||||||
|
}
|
||||||
|
_total_code_root_mem_sz += code_root_mem_sz;
|
||||||
|
|
||||||
|
size_t occ = hrrs->occupied();
|
||||||
_occupied += occ;
|
_occupied += occ;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
size_t total_mem_sz() { return _total_mem_sz; }
|
size_t total_rs_mem_sz() { return _total_rs_mem_sz; }
|
||||||
size_t max_mem_sz() { return _max_mem_sz; }
|
size_t max_rs_mem_sz() { return _max_rs_mem_sz; }
|
||||||
|
HeapRegion* max_rs_mem_sz_region() { return _max_rs_mem_sz_region; }
|
||||||
|
size_t total_code_root_mem_sz() { return _total_code_root_mem_sz; }
|
||||||
|
size_t max_code_root_mem_sz() { return _max_code_root_mem_sz; }
|
||||||
|
HeapRegion* max_code_root_mem_sz_region() { return _max_code_root_mem_sz_region; }
|
||||||
size_t occupied() { return _occupied; }
|
size_t occupied() { return _occupied; }
|
||||||
HeapRegion* max_mem_sz_region() { return _max_mem_sz_region; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
double calc_percentage(size_t numerator, size_t denominator) {
|
double calc_percentage(size_t numerator, size_t denominator) {
|
||||||
@ -184,22 +207,33 @@ void G1RemSetSummary::print_on(outputStream* out) {
|
|||||||
|
|
||||||
HRRSStatsIter blk;
|
HRRSStatsIter blk;
|
||||||
G1CollectedHeap::heap()->heap_region_iterate(&blk);
|
G1CollectedHeap::heap()->heap_region_iterate(&blk);
|
||||||
|
// RemSet stats
|
||||||
out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K."
|
out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K."
|
||||||
" Max = "SIZE_FORMAT"K.",
|
" Max = "SIZE_FORMAT"K.",
|
||||||
blk.total_mem_sz()/K, blk.max_mem_sz()/K);
|
blk.total_rs_mem_sz()/K, blk.max_rs_mem_sz()/K);
|
||||||
out->print_cr(" Static structures = "SIZE_FORMAT"K,"
|
out->print_cr(" Static structures = "SIZE_FORMAT"K,"
|
||||||
" free_lists = "SIZE_FORMAT"K.",
|
" free_lists = "SIZE_FORMAT"K.",
|
||||||
HeapRegionRemSet::static_mem_size() / K,
|
HeapRegionRemSet::static_mem_size() / K,
|
||||||
HeapRegionRemSet::fl_mem_size() / K);
|
HeapRegionRemSet::fl_mem_size() / K);
|
||||||
out->print_cr(" "SIZE_FORMAT" occupied cards represented.",
|
out->print_cr(" "SIZE_FORMAT" occupied cards represented.",
|
||||||
blk.occupied());
|
blk.occupied());
|
||||||
HeapRegion* max_mem_sz_region = blk.max_mem_sz_region();
|
HeapRegion* max_rs_mem_sz_region = blk.max_rs_mem_sz_region();
|
||||||
HeapRegionRemSet* rem_set = max_mem_sz_region->rem_set();
|
HeapRegionRemSet* max_rs_rem_set = max_rs_mem_sz_region->rem_set();
|
||||||
out->print_cr(" Max size region = "HR_FORMAT", "
|
out->print_cr(" Max size region = "HR_FORMAT", "
|
||||||
"size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
|
"size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
|
||||||
HR_FORMAT_PARAMS(max_mem_sz_region),
|
HR_FORMAT_PARAMS(max_rs_mem_sz_region),
|
||||||
(rem_set->mem_size() + K - 1)/K,
|
(max_rs_rem_set->mem_size() + K - 1)/K,
|
||||||
(rem_set->occupied() + K - 1)/K);
|
(max_rs_rem_set->occupied() + K - 1)/K);
|
||||||
|
|
||||||
out->print_cr(" Did %d coarsenings.", num_coarsenings());
|
out->print_cr(" Did %d coarsenings.", num_coarsenings());
|
||||||
|
// Strong code root stats
|
||||||
|
out->print_cr(" Total heap region code-root set sizes = "SIZE_FORMAT"K."
|
||||||
|
" Max = "SIZE_FORMAT"K.",
|
||||||
|
blk.total_code_root_mem_sz()/K, blk.max_code_root_mem_sz()/K);
|
||||||
|
HeapRegion* max_code_root_mem_sz_region = blk.max_code_root_mem_sz_region();
|
||||||
|
HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region->rem_set();
|
||||||
|
out->print_cr(" Max size region = "HR_FORMAT", "
|
||||||
|
"size = "SIZE_FORMAT "K, num_elems = "SIZE_FORMAT".",
|
||||||
|
HR_FORMAT_PARAMS(max_code_root_mem_sz_region),
|
||||||
|
(max_code_root_rem_set->strong_code_roots_mem_size() + K - 1)/K,
|
||||||
|
(max_code_root_rem_set->strong_code_roots_list_length()));
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user