Merge
This commit is contained in:
commit
aaeb3f1066
5
.hgtags
5
.hgtags
@ -399,3 +399,8 @@ d7034ff7f8e257e81c9f95c7785dd4eaaa3c2afc jdk-9+153
|
|||||||
8c70d170e62c0c58b5bc3ba666bd140399b98c9c jdk-10+0
|
8c70d170e62c0c58b5bc3ba666bd140399b98c9c jdk-10+0
|
||||||
45b751afd11e6c05991cf4913c5a0ac3304fcc4e jdk-9+154
|
45b751afd11e6c05991cf4913c5a0ac3304fcc4e jdk-9+154
|
||||||
f4aff695ffe05cfdb69d8af25a4ddc6a029754ea jdk-9+155
|
f4aff695ffe05cfdb69d8af25a4ddc6a029754ea jdk-9+155
|
||||||
|
06bce0388880b5ff8e040e4a9d72a3ea11dac321 jdk-9+156
|
||||||
|
fa3e76b477829afc4476f0b725cfaa440a6fd917 jdk-9+157
|
||||||
|
b5015f742ba648184bb7fc547197bd33ebfde30d jdk-9+158
|
||||||
|
fd1497902bbe3aa24b21f270ecdcb8de5f7aa9ac jdk-9+159
|
||||||
|
6aa8be0c4e054fe8b3ab016ae00d16d680f92145 jdk-9+160
|
||||||
|
@ -398,3 +398,7 @@ ff8cb43c07c069b1debdee44cb88ca22db1ec757 jdk-9+152
|
|||||||
68a8e8658511093b322a46ed04b2a321e1da2a43 jdk-9+153
|
68a8e8658511093b322a46ed04b2a321e1da2a43 jdk-9+153
|
||||||
078ebe23b584466dc8346e620d7821d91751e5a9 jdk-9+154
|
078ebe23b584466dc8346e620d7821d91751e5a9 jdk-9+154
|
||||||
a545f54babfa31aa7eb611f36031609acd617cbc jdk-9+155
|
a545f54babfa31aa7eb611f36031609acd617cbc jdk-9+155
|
||||||
|
907c26240cd481579e919bfd23740797ff8ce1c8 jdk-9+156
|
||||||
|
9383da04b385cca46b7ca67f3a39ac1b673e09fe jdk-9+157
|
||||||
|
de6bdf38935fa753183ca288bed5c06a23c0bb12 jdk-9+158
|
||||||
|
6feea77d2083c99e44aa3e272d07b7fb3b801683 jdk-9+159
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API.
|
* Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API.
|
||||||
|
*
|
||||||
|
* @since 9
|
||||||
*/
|
*/
|
||||||
@Deprecated(since="9", forRemoval=true)
|
@Deprecated(since="9", forRemoval=true)
|
||||||
module java.corba {
|
module java.corba {
|
||||||
|
@ -106,13 +106,13 @@ import java.security.PrivilegedAction;
|
|||||||
*
|
*
|
||||||
* <LI>check in properties parameter, if any
|
* <LI>check in properties parameter, if any
|
||||||
*
|
*
|
||||||
* <LI>check in the System properties
|
* <LI>check in the System properties, if any
|
||||||
*
|
*
|
||||||
* <LI>check in the orb.properties file located in the user.home
|
* <LI>check in the orb.properties file located in the user.home
|
||||||
* directory (if any)
|
* directory, if any
|
||||||
*
|
*
|
||||||
* <LI>check in the orb.properties file located in the java.home/lib
|
* <LI>check in the orb.properties file located in the run-time image,
|
||||||
* directory (if any)
|
* if any
|
||||||
*
|
*
|
||||||
* <LI>fall back on a hardcoded default behavior (use the Java IDL
|
* <LI>fall back on a hardcoded default behavior (use the Java IDL
|
||||||
* implementation)
|
* implementation)
|
||||||
@ -170,9 +170,15 @@ import java.security.PrivilegedAction;
|
|||||||
* Thus, where appropriate, it is necessary that
|
* Thus, where appropriate, it is necessary that
|
||||||
* the classes for this alternative ORBSingleton are available on the application's class path.
|
* the classes for this alternative ORBSingleton are available on the application's class path.
|
||||||
* It should be noted that the singleton ORB is system wide.
|
* It should be noted that the singleton ORB is system wide.
|
||||||
*
|
* <P>
|
||||||
* When a per-application ORB is created via the 2-arg init methods,
|
* When a per-application ORB is created via the 2-arg init methods,
|
||||||
* then it will be located using the thread context class loader.
|
* then it will be located using the thread context class loader.
|
||||||
|
* <P>
|
||||||
|
* The IDL to Java Language OMG specification documents the ${java.home}/lib directory as the location,
|
||||||
|
* in the Java run-time image, to search for orb.properties.
|
||||||
|
* This location is not intended for user editable configuration files.
|
||||||
|
* Therefore, the implementation first checks the ${java.home}/conf directory for orb.properties,
|
||||||
|
* and thereafter the ${java.home}/lib directory.
|
||||||
*
|
*
|
||||||
* @since JDK1.2
|
* @since JDK1.2
|
||||||
*/
|
*/
|
||||||
@ -271,14 +277,25 @@ abstract public class ORB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String javaHome = System.getProperty("java.home");
|
String javaHome = System.getProperty("java.home");
|
||||||
fileName = javaHome + File.separator
|
|
||||||
+ "lib" + File.separator + "orb.properties";
|
fileName = javaHome + File.separator + "conf"
|
||||||
props = getFileProperties( fileName ) ;
|
+ File.separator + "orb.properties";
|
||||||
|
props = getFileProperties(fileName);
|
||||||
|
|
||||||
|
if (props != null) {
|
||||||
|
String value = props.getProperty(name);
|
||||||
|
if (value != null)
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
fileName = javaHome + File.separator + "lib"
|
||||||
|
+ File.separator + "orb.properties";
|
||||||
|
props = getFileProperties(fileName);
|
||||||
|
|
||||||
if (props == null)
|
if (props == null)
|
||||||
return null ;
|
return null;
|
||||||
else
|
else
|
||||||
return props.getProperty( name ) ;
|
return props.getProperty(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
^\.mx.jvmci/hotspot/eclipse/.*
|
^\.mx.jvmci/hotspot/eclipse/.*
|
||||||
^\.idea/
|
^\.idea/
|
||||||
^workingsets.xml
|
^workingsets.xml
|
||||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/.*\.xml
|
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/.*\.xml
|
||||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/.*\.iml
|
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/.*\.iml
|
||||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/nbproject
|
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/nbproject
|
||||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/\..*
|
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/\..*
|
||||||
^test/compiler/jvmci/\w[\w\.]*/.*\.xml
|
^test/compiler/jvmci/\w[\w\.]*/.*\.xml
|
||||||
^test/compiler/jvmci/\w[\w\.]*/.*\.iml
|
^test/compiler/jvmci/\w[\w\.]*/.*\.iml
|
||||||
^test/compiler/jvmci/\w[\w\.]*/nbproject
|
^test/compiler/jvmci/\w[\w\.]*/nbproject
|
||||||
@ -27,15 +27,15 @@
|
|||||||
^test/compiler/aot/\w[\w\.]*/.*\.iml
|
^test/compiler/aot/\w[\w\.]*/.*\.iml
|
||||||
^test/compiler/aot/\w[\w\.]*/nbproject
|
^test/compiler/aot/\w[\w\.]*/nbproject
|
||||||
^test/compiler/aot/\w[\w\.]*/\..*
|
^test/compiler/aot/\w[\w\.]*/\..*
|
||||||
^src/jdk.vm.compiler/\.mx.graal/env
|
^src/jdk.internal.vm.compiler/\.mx.graal/env
|
||||||
^src/jdk.vm.compiler/\.mx.graal/.*\.pyc
|
^src/jdk.internal.vm.compiler/\.mx.graal/.*\.pyc
|
||||||
^src/jdk.vm.compiler/\.mx.graal/eclipse-launches/.*
|
^src/jdk.internal.vm.compiler/\.mx.graal/eclipse-launches/.*
|
||||||
^src/jdk.aot/share/classes/\w[\w\.]*/.*\.xml
|
^src/jdk.aot/share/classes/\w[\w\.]*/.*\.xml
|
||||||
^src/jdk.aot/share/classes/\w[\w\.]*/.*\.iml
|
^src/jdk.aot/share/classes/\w[\w\.]*/.*\.iml
|
||||||
^src/jdk.aot/share/classes/\w[\w\.]*/nbproject
|
^src/jdk.aot/share/classes/\w[\w\.]*/nbproject
|
||||||
^src/jdk.aot/share/classes/\w[\w\.]*/\..*
|
^src/jdk.aot/share/classes/\w[\w\.]*/\..*
|
||||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/.*\.xml
|
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/.*\.xml
|
||||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/.*\.iml
|
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/.*\.iml
|
||||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/nbproject
|
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/nbproject
|
||||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/\..*
|
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/\..*
|
||||||
|
|
||||||
|
@ -558,3 +558,7 @@ a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146
|
|||||||
217ba81b9a4ce8698200370175aa2db86a39f66c jdk-9+153
|
217ba81b9a4ce8698200370175aa2db86a39f66c jdk-9+153
|
||||||
a9fdfd55835ef9dccb7f317b07249bd66653b874 jdk-9+154
|
a9fdfd55835ef9dccb7f317b07249bd66653b874 jdk-9+154
|
||||||
f3b3d77a1751897413aae43ac340a130b6fa2ae1 jdk-9+155
|
f3b3d77a1751897413aae43ac340a130b6fa2ae1 jdk-9+155
|
||||||
|
43139c588ea48b6504e52b6c3dec530b17b1fdb4 jdk-9+156
|
||||||
|
b2d0a906afd73dcf27f572217eb1be0f196ec16c jdk-9+157
|
||||||
|
4e78f30935229f13ce7c43089621cf7169f5abac jdk-9+158
|
||||||
|
9211c2e89c1cd11ec2d5752b0f97131a7d7525c7 jdk-9+159
|
||||||
|
@ -158,8 +158,8 @@ To build hotspot and import it into the JDK: "mx make hotspot import-hotspot"
|
|||||||
# JDK9 must be bootstrapped with a JDK8
|
# JDK9 must be bootstrapped with a JDK8
|
||||||
compliance = mx.JavaCompliance('8')
|
compliance = mx.JavaCompliance('8')
|
||||||
jdk8 = mx.get_jdk(compliance.exactMatch, versionDescription=compliance.value)
|
jdk8 = mx.get_jdk(compliance.exactMatch, versionDescription=compliance.value)
|
||||||
cmd = ['sh', 'configure', '--with-debug-level=' + _vm.debugLevel, '--with-native-debug-symbols=external', '--disable-precompiled-headers',
|
cmd = ['sh', 'configure', '--with-debug-level=' + _vm.debugLevel, '--with-native-debug-symbols=external', '--disable-precompiled-headers', '--with-jvm-features=graal',
|
||||||
'--with-jvm-variants=' + _vm.jvmVariant, '--disable-warnings-as-errors', '--with-boot-jdk=' + jdk8.home]
|
'--with-jvm-variants=' + _vm.jvmVariant, '--disable-warnings-as-errors', '--with-boot-jdk=' + jdk8.home, '--with-jvm-features=graal']
|
||||||
mx.run(cmd, cwd=_jdkSourceRoot)
|
mx.run(cmd, cwd=_jdkSourceRoot)
|
||||||
cmd = [mx.gmake_cmd(), 'CONF=' + _vm.debugLevel]
|
cmd = [mx.gmake_cmd(), 'CONF=' + _vm.debugLevel]
|
||||||
if mx.get_opts().verbose:
|
if mx.get_opts().verbose:
|
||||||
@ -176,66 +176,6 @@ To build hotspot and import it into the JDK: "mx make hotspot import-hotspot"
|
|||||||
|
|
||||||
mx.run(cmd, cwd=_jdkSourceRoot)
|
mx.run(cmd, cwd=_jdkSourceRoot)
|
||||||
|
|
||||||
if 'images' in cmd:
|
|
||||||
jdkImageDir = join(jdkBuildDir, 'images', 'jdk')
|
|
||||||
|
|
||||||
# The OpenJDK build creates an empty cacerts file so copy one from
|
|
||||||
# the default JDK (which is assumed to be an OracleJDK)
|
|
||||||
srcCerts = join(mx.get_jdk(tag='default').home, 'lib', 'security', 'cacerts')
|
|
||||||
if not exists(srcCerts):
|
|
||||||
# Might be building with JDK8 which has cacerts under jre/
|
|
||||||
srcCerts = join(mx.get_jdk(tag='default').home, 'jre', 'lib', 'security', 'cacerts')
|
|
||||||
dstCerts = join(jdkImageDir, 'lib', 'security', 'cacerts')
|
|
||||||
if srcCerts != dstCerts:
|
|
||||||
shutil.copyfile(srcCerts, dstCerts)
|
|
||||||
|
|
||||||
_create_jdk_bundle(jdkBuildDir, _vm.debugLevel, jdkImageDir)
|
|
||||||
|
|
||||||
def _get_jdk_bundle_arches():
|
|
||||||
"""
|
|
||||||
Gets a list of names that will be the part of a JDK bundle's file name denoting the architecture.
|
|
||||||
The first element in the list is the canonical name. Symlinks should be created for the
|
|
||||||
remaining names.
|
|
||||||
"""
|
|
||||||
cpu = mx.get_arch()
|
|
||||||
if cpu == 'amd64':
|
|
||||||
return ['x64', 'x86_64', 'amd64']
|
|
||||||
elif cpu == 'sparcv9':
|
|
||||||
return ['sparcv9']
|
|
||||||
mx.abort('Unsupported JDK bundle arch: ' + cpu)
|
|
||||||
|
|
||||||
def _create_jdk_bundle(jdkBuildDir, debugLevel, jdkImageDir):
|
|
||||||
"""
|
|
||||||
Creates a tar.gz JDK archive, an accompanying tar.gz.sha1 file with its
|
|
||||||
SHA1 signature plus symlinks to the archive for non-canonical architecture names.
|
|
||||||
"""
|
|
||||||
|
|
||||||
arches = _get_jdk_bundle_arches()
|
|
||||||
jdkTgzPath = join(_suite.get_output_root(), 'jdk-bundles', 'jdk9-{}-{}-{}.tar.gz'.format(debugLevel, _get_openjdk_os(), arches[0]))
|
|
||||||
with mx.Archiver(jdkTgzPath, kind='tgz') as arc:
|
|
||||||
mx.log('Creating ' + jdkTgzPath)
|
|
||||||
for root, _, filenames in os.walk(jdkImageDir):
|
|
||||||
for name in filenames:
|
|
||||||
f = join(root, name)
|
|
||||||
arcname = 'jdk1.9.0/' + os.path.relpath(f, jdkImageDir)
|
|
||||||
arc.zf.add(name=f, arcname=arcname, recursive=False)
|
|
||||||
|
|
||||||
with open(jdkTgzPath + '.sha1', 'w') as fp:
|
|
||||||
mx.log('Creating ' + jdkTgzPath + '.sha1')
|
|
||||||
fp.write(mx.sha1OfFile(jdkTgzPath))
|
|
||||||
|
|
||||||
def _create_link(source, link_name):
|
|
||||||
if exists(link_name):
|
|
||||||
os.remove(link_name)
|
|
||||||
mx.log('Creating ' + link_name + ' -> ' + source)
|
|
||||||
os.symlink(source, link_name)
|
|
||||||
|
|
||||||
for arch in arches[1:]:
|
|
||||||
link_name = join(_suite.get_output_root(), 'jdk-bundles', 'jdk9-{}-{}-{}.tar.gz'.format(debugLevel, _get_openjdk_os(), arch))
|
|
||||||
jdkTgzName = os.path.basename(jdkTgzPath)
|
|
||||||
_create_link(jdkTgzName, link_name)
|
|
||||||
_create_link(jdkTgzName + '.sha1', link_name + '.sha1')
|
|
||||||
|
|
||||||
def _runmultimake(args):
|
def _runmultimake(args):
|
||||||
"""run the JDK make process for one or more configurations"""
|
"""run the JDK make process for one or more configurations"""
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ suite = {
|
|||||||
# ------------- JVMCI:Service -------------
|
# ------------- JVMCI:Service -------------
|
||||||
|
|
||||||
"jdk.vm.ci.services" : {
|
"jdk.vm.ci.services" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"javaCompliance" : "9",
|
"javaCompliance" : "9",
|
||||||
"workingSets" : "API,JVMCI",
|
"workingSets" : "API,JVMCI",
|
||||||
@ -52,7 +52,7 @@ suite = {
|
|||||||
# ------------- JVMCI:API -------------
|
# ------------- JVMCI:API -------------
|
||||||
|
|
||||||
"jdk.vm.ci.common" : {
|
"jdk.vm.ci.common" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"checkstyle" : "jdk.vm.ci.services",
|
"checkstyle" : "jdk.vm.ci.services",
|
||||||
"javaCompliance" : "9",
|
"javaCompliance" : "9",
|
||||||
@ -60,7 +60,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.meta" : {
|
"jdk.vm.ci.meta" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"checkstyle" : "jdk.vm.ci.services",
|
"checkstyle" : "jdk.vm.ci.services",
|
||||||
"javaCompliance" : "9",
|
"javaCompliance" : "9",
|
||||||
@ -68,7 +68,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.code" : {
|
"jdk.vm.ci.code" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : ["jdk.vm.ci.meta"],
|
"dependencies" : ["jdk.vm.ci.meta"],
|
||||||
"checkstyle" : "jdk.vm.ci.services",
|
"checkstyle" : "jdk.vm.ci.services",
|
||||||
@ -92,7 +92,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.runtime" : {
|
"jdk.vm.ci.runtime" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.code",
|
"jdk.vm.ci.code",
|
||||||
@ -119,7 +119,7 @@ suite = {
|
|||||||
# ------------- JVMCI:HotSpot -------------
|
# ------------- JVMCI:HotSpot -------------
|
||||||
|
|
||||||
"jdk.vm.ci.aarch64" : {
|
"jdk.vm.ci.aarch64" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : ["jdk.vm.ci.code"],
|
"dependencies" : ["jdk.vm.ci.code"],
|
||||||
"checkstyle" : "jdk.vm.ci.services",
|
"checkstyle" : "jdk.vm.ci.services",
|
||||||
@ -128,7 +128,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.amd64" : {
|
"jdk.vm.ci.amd64" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : ["jdk.vm.ci.code"],
|
"dependencies" : ["jdk.vm.ci.code"],
|
||||||
"checkstyle" : "jdk.vm.ci.services",
|
"checkstyle" : "jdk.vm.ci.services",
|
||||||
@ -137,7 +137,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.sparc" : {
|
"jdk.vm.ci.sparc" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : ["jdk.vm.ci.code"],
|
"dependencies" : ["jdk.vm.ci.code"],
|
||||||
"checkstyle" : "jdk.vm.ci.services",
|
"checkstyle" : "jdk.vm.ci.services",
|
||||||
@ -146,7 +146,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.hotspot" : {
|
"jdk.vm.ci.hotspot" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.common",
|
"jdk.vm.ci.common",
|
||||||
@ -175,7 +175,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.hotspot.aarch64" : {
|
"jdk.vm.ci.hotspot.aarch64" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.aarch64",
|
"jdk.vm.ci.aarch64",
|
||||||
@ -187,7 +187,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.hotspot.amd64" : {
|
"jdk.vm.ci.hotspot.amd64" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.amd64",
|
"jdk.vm.ci.amd64",
|
||||||
@ -199,7 +199,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"jdk.vm.ci.hotspot.sparc" : {
|
"jdk.vm.ci.hotspot.sparc" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"sourceDirs" : ["src"],
|
"sourceDirs" : ["src"],
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.sparc",
|
"jdk.vm.ci.sparc",
|
||||||
@ -221,12 +221,12 @@ suite = {
|
|||||||
# ------------- Distributions -------------
|
# ------------- Distributions -------------
|
||||||
|
|
||||||
"JVMCI_SERVICES" : {
|
"JVMCI_SERVICES" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"dependencies" : ["jdk.vm.ci.services"],
|
"dependencies" : ["jdk.vm.ci.services"],
|
||||||
},
|
},
|
||||||
|
|
||||||
"JVMCI_API" : {
|
"JVMCI_API" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.runtime",
|
"jdk.vm.ci.runtime",
|
||||||
"jdk.vm.ci.common",
|
"jdk.vm.ci.common",
|
||||||
@ -240,7 +240,7 @@ suite = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
"JVMCI_HOTSPOT" : {
|
"JVMCI_HOTSPOT" : {
|
||||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||||
"dependencies" : [
|
"dependencies" : [
|
||||||
"jdk.vm.ci.hotspot.aarch64",
|
"jdk.vm.ci.hotspot.aarch64",
|
||||||
"jdk.vm.ci.hotspot.amd64",
|
"jdk.vm.ci.hotspot.amd64",
|
||||||
|
@ -38,9 +38,9 @@ TARGETS :=
|
|||||||
$(eval $(call IncludeCustomExtension, hotspot, CompileTools.gmk))
|
$(eval $(call IncludeCustomExtension, hotspot, CompileTools.gmk))
|
||||||
|
|
||||||
ifeq ($(INCLUDE_GRAAL), true)
|
ifeq ($(INCLUDE_GRAAL), true)
|
||||||
VM_CI_SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.vm.ci/share/classes
|
VM_CI_SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.internal.vm.ci/share/classes
|
||||||
|
|
||||||
SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.vm.compiler/share/classes
|
SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.internal.vm.compiler/share/classes
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Compile the annotation processors
|
# Compile the annotation processors
|
||||||
|
@ -28,7 +28,7 @@ default: all
|
|||||||
include $(SPEC)
|
include $(SPEC)
|
||||||
include MakeBase.gmk
|
include MakeBase.gmk
|
||||||
|
|
||||||
$(eval $(call IncludeCustomExtension, hotspot, gensrc/Gensrc-jdk.vm.compiler.gmk))
|
$(eval $(call IncludeCustomExtension, hotspot, gensrc/Gensrc-jdk.internal.vm.compiler.gmk))
|
||||||
|
|
||||||
GENSRC_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)
|
GENSRC_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)
|
||||||
SRC_DIR := $(HOTSPOT_TOPDIR)/src/$(MODULE)/share/classes
|
SRC_DIR := $(HOTSPOT_TOPDIR)/src/$(MODULE)/share/classes
|
||||||
@ -81,23 +81,23 @@ PROCESSOR_JARS := \
|
|||||||
PROCESSOR_PATH := $(call PathList, $(PROCESSOR_JARS))
|
PROCESSOR_PATH := $(call PathList, $(PROCESSOR_JARS))
|
||||||
|
|
||||||
ADD_EXPORTS := \
|
ADD_EXPORTS := \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.code.stack=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.code.stack=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.common=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.common=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.aarch64=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.aarch64=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.amd64=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.amd64=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.events=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.events=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.sparc=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.sparc=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspotvmconfig=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspotvmconfig=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.inittimer=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.inittimer=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.services=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.services=ALL-UNNAMED \
|
||||||
--add-exports jdk.vm.ci/jdk.vm.ci.sparc=ALL-UNNAMED \
|
--add-exports jdk.internal.vm.ci/jdk.vm.ci.sparc=ALL-UNNAMED \
|
||||||
#
|
#
|
||||||
|
|
||||||
$(GENSRC_DIR)/_gensrc_proc_done: $(PROC_SRCS) $(PROCESSOR_JARS)
|
$(GENSRC_DIR)/_gensrc_proc_done: $(PROC_SRCS) $(PROCESSOR_JARS)
|
||||||
@ -138,7 +138,7 @@ $(GENSRC_DIR)/module-info.java.extra: $(GENSRC_DIR)/_gensrc_proc_done
|
|||||||
$(ECHO) "uses org.graalvm.compiler.options.OptionDescriptors;" >> $@; \
|
$(ECHO) "uses org.graalvm.compiler.options.OptionDescriptors;" >> $@; \
|
||||||
$(ECHO) "provides org.graalvm.compiler.options.OptionDescriptors with" >> $@; \
|
$(ECHO) "provides org.graalvm.compiler.options.OptionDescriptors with" >> $@; \
|
||||||
for i in $$($(FIND) $(GENSRC_DIR) -name '*_OptionDescriptors.java'); do \
|
for i in $$($(FIND) $(GENSRC_DIR) -name '*_OptionDescriptors.java'); do \
|
||||||
c=$$($(ECHO) $$i | $(SED) 's:.*/jdk\.vm\.compiler/\(.*\)\.java:\1:' | $(TR) '/' '.'); \
|
c=$$($(ECHO) $$i | $(SED) 's:.*/jdk\.internal\.vm\.compiler/\(.*\)\.java:\1:' | $(TR) '/' '.'); \
|
||||||
$(ECHO) " $$c," >> $@; \
|
$(ECHO) " $$c," >> $@; \
|
||||||
done; \
|
done; \
|
||||||
$(ECHO) " ;" >> $@;
|
$(ECHO) " ;" >> $@;
|
@ -112,8 +112,10 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
|||||||
-relativeSrcInclude src \
|
-relativeSrcInclude src \
|
||||||
-hidePath .hg \
|
-hidePath .hg \
|
||||||
-hidePath .jcheck \
|
-hidePath .jcheck \
|
||||||
|
-hidePath jdk.aot \
|
||||||
-hidePath jdk.hotspot.agent \
|
-hidePath jdk.hotspot.agent \
|
||||||
-hidePath jdk.vm.ci \
|
-hidePath jdk.internal.vm.ci \
|
||||||
|
-hidePath jdk.internal.vm.compiler \
|
||||||
-hidePath jdk.jfr \
|
-hidePath jdk.jfr \
|
||||||
-compiler VC10 \
|
-compiler VC10 \
|
||||||
-jdkTargetRoot $(call FixPath, $(JDK_OUTPUTDIR)) \
|
-jdkTargetRoot $(call FixPath, $(JDK_OUTPUTDIR)) \
|
||||||
|
@ -1922,12 +1922,17 @@ void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (opr2->is_constant()) {
|
if (opr2->is_constant()) {
|
||||||
|
bool is_32bit = false; // width of register operand
|
||||||
jlong imm;
|
jlong imm;
|
||||||
|
|
||||||
switch(opr2->type()) {
|
switch(opr2->type()) {
|
||||||
|
case T_INT:
|
||||||
|
imm = opr2->as_constant_ptr()->as_jint();
|
||||||
|
is_32bit = true;
|
||||||
|
break;
|
||||||
case T_LONG:
|
case T_LONG:
|
||||||
imm = opr2->as_constant_ptr()->as_jlong();
|
imm = opr2->as_constant_ptr()->as_jlong();
|
||||||
break;
|
break;
|
||||||
case T_INT:
|
|
||||||
case T_ADDRESS:
|
case T_ADDRESS:
|
||||||
imm = opr2->as_constant_ptr()->as_jint();
|
imm = opr2->as_constant_ptr()->as_jint();
|
||||||
break;
|
break;
|
||||||
@ -1942,14 +1947,14 @@ void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Assembler::operand_valid_for_add_sub_immediate(imm)) {
|
if (Assembler::operand_valid_for_add_sub_immediate(imm)) {
|
||||||
if (type2aelembytes(opr1->type()) <= 4)
|
if (is_32bit)
|
||||||
__ cmpw(reg1, imm);
|
__ cmpw(reg1, imm);
|
||||||
else
|
else
|
||||||
__ cmp(reg1, imm);
|
__ cmp(reg1, imm);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
__ mov(rscratch1, imm);
|
__ mov(rscratch1, imm);
|
||||||
if (type2aelembytes(opr1->type()) <= 4)
|
if (is_32bit)
|
||||||
__ cmpw(reg1, rscratch1);
|
__ cmpw(reg1, rscratch1);
|
||||||
else
|
else
|
||||||
__ cmp(reg1, rscratch1);
|
__ cmp(reg1, rscratch1);
|
||||||
|
@ -85,17 +85,17 @@ address CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf, address mark)
|
|||||||
}
|
}
|
||||||
#undef __
|
#undef __
|
||||||
|
|
||||||
// size of C2 call stub, compiled java to interpretor
|
|
||||||
int CompiledStaticCall::to_interp_stub_size() {
|
|
||||||
return 8 * NativeInstruction::instruction_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Relocation entries for call stub, compiled java to interpreter.
|
// Relocation entries for call stub, compiled java to interpreter.
|
||||||
int CompiledStaticCall::reloc_to_interp_stub() {
|
int CompiledStaticCall::reloc_to_interp_stub() {
|
||||||
return 10; // 4 in emit_to_interp_stub + 1 in Java_Static_Call
|
return 10; // 4 in emit_to_interp_stub + 1 in Java_Static_Call
|
||||||
}
|
}
|
||||||
#endif // COMPILER2 || JVMCI
|
#endif // COMPILER2 || JVMCI
|
||||||
|
|
||||||
|
// size of C2 call stub, compiled java to interpretor
|
||||||
|
int CompiledStaticCall::to_interp_stub_size() {
|
||||||
|
return 8 * NativeInstruction::instruction_size;
|
||||||
|
}
|
||||||
|
|
||||||
void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, address entry) {
|
void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, address entry) {
|
||||||
address stub = find_stub(/*is_aot*/ false);
|
address stub = find_stub(/*is_aot*/ false);
|
||||||
guarantee(stub != NULL, "stub not found");
|
guarantee(stub != NULL, "stub not found");
|
||||||
@ -125,6 +125,8 @@ void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, ad
|
|||||||
method_holder->set_data((intptr_t)callee());
|
method_holder->set_data((intptr_t)callee());
|
||||||
jump->set_jump_destination(entry);
|
jump->set_jump_destination(entry);
|
||||||
|
|
||||||
|
ICache::invalidate_range(stub, to_interp_stub_size());
|
||||||
|
|
||||||
// Update jump to call.
|
// Update jump to call.
|
||||||
set_destination_mt_safe(stub);
|
set_destination_mt_safe(stub);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2017, 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
|
||||||
@ -2210,7 +2210,6 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
// Out-of-line code to allocate method data oop.
|
// Out-of-line code to allocate method data oop.
|
||||||
__ bind(profile_method);
|
__ bind(profile_method);
|
||||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||||
__ load_unsigned_byte(rbx, Address(rbcp, 0)); // restore target bytecode
|
|
||||||
__ set_method_data_pointer_for_bcp();
|
__ set_method_data_pointer_for_bcp();
|
||||||
__ jmp(dispatch);
|
__ jmp(dispatch);
|
||||||
}
|
}
|
||||||
@ -2225,10 +2224,8 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
CAST_FROM_FN_PTR(address,
|
CAST_FROM_FN_PTR(address,
|
||||||
InterpreterRuntime::frequency_counter_overflow),
|
InterpreterRuntime::frequency_counter_overflow),
|
||||||
rdx);
|
rdx);
|
||||||
__ load_unsigned_byte(rbx, Address(rbcp, 0)); // restore target bytecode
|
|
||||||
|
|
||||||
// rax: osr nmethod (osr ok) or NULL (osr not possible)
|
// rax: osr nmethod (osr ok) or NULL (osr not possible)
|
||||||
// rbx: target bytecode
|
|
||||||
// rdx: scratch
|
// rdx: scratch
|
||||||
// r14: locals pointer
|
// r14: locals pointer
|
||||||
// r13: bcp
|
// r13: bcp
|
||||||
@ -2238,12 +2235,13 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ cmpb(Address(rax, nmethod::state_offset()), nmethod::in_use);
|
__ cmpb(Address(rax, nmethod::state_offset()), nmethod::in_use);
|
||||||
__ jcc(Assembler::notEqual, dispatch);
|
__ jcc(Assembler::notEqual, dispatch);
|
||||||
|
|
||||||
// We have the address of an on stack replacement routine in rax
|
// We have the address of an on stack replacement routine in rax.
|
||||||
// We need to prepare to execute the OSR method. First we must
|
// In preparation of invoking it, first we must migrate the locals
|
||||||
// migrate the locals and monitors off of the stack.
|
// and monitors from off the interpreter frame on the stack.
|
||||||
|
// Ensure to save the osr nmethod over the migration call,
|
||||||
|
// it will be preserved in rbx.
|
||||||
|
__ mov(rbx, rax);
|
||||||
|
|
||||||
LP64_ONLY(__ mov(r13, rax)); // save the nmethod
|
|
||||||
NOT_LP64(__ mov(rbx, rax)); // save the nmethod
|
|
||||||
NOT_LP64(__ get_thread(rcx));
|
NOT_LP64(__ get_thread(rcx));
|
||||||
|
|
||||||
call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
|
call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
|
||||||
@ -2258,7 +2256,6 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
const Register retaddr = LP64_ONLY(j_rarg2) NOT_LP64(rdi);
|
const Register retaddr = LP64_ONLY(j_rarg2) NOT_LP64(rdi);
|
||||||
const Register sender_sp = LP64_ONLY(j_rarg1) NOT_LP64(rdx);
|
const Register sender_sp = LP64_ONLY(j_rarg1) NOT_LP64(rdx);
|
||||||
|
|
||||||
|
|
||||||
// pop the interpreter frame
|
// pop the interpreter frame
|
||||||
__ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
|
__ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
|
||||||
__ leave(); // remove frame anchor
|
__ leave(); // remove frame anchor
|
||||||
@ -2274,8 +2271,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
|||||||
__ push(retaddr);
|
__ push(retaddr);
|
||||||
|
|
||||||
// and begin the OSR nmethod
|
// and begin the OSR nmethod
|
||||||
LP64_ONLY(__ jmp(Address(r13, nmethod::osr_entry_point_offset())));
|
__ jmp(Address(rbx, nmethod::osr_entry_point_offset()));
|
||||||
NOT_LP64(__ jmp(Address(rbx, nmethod::osr_entry_point_offset())));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -850,6 +850,12 @@ void VM_Version::get_processor_features() {
|
|||||||
|
|
||||||
#if INCLUDE_RTM_OPT
|
#if INCLUDE_RTM_OPT
|
||||||
if (UseRTMLocking) {
|
if (UseRTMLocking) {
|
||||||
|
if (is_client_compilation_mode_vm()) {
|
||||||
|
// Only C2 does RTM locking optimization.
|
||||||
|
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
|
||||||
|
// setting during arguments processing. See use_biased_locking().
|
||||||
|
vm_exit_during_initialization("RTM locking optimization is not supported in emulated client VM");
|
||||||
|
}
|
||||||
if (is_intel_family_core()) {
|
if (is_intel_family_core()) {
|
||||||
if ((_model == CPU_MODEL_HASWELL_E3) ||
|
if ((_model == CPU_MODEL_HASWELL_E3) ||
|
||||||
(_model == CPU_MODEL_HASWELL_E7 && _stepping < 3) ||
|
(_model == CPU_MODEL_HASWELL_E7 && _stepping < 3) ||
|
||||||
|
@ -25,6 +25,7 @@ package jdk.tools.jaotc;
|
|||||||
|
|
||||||
import org.graalvm.compiler.code.CompilationResult;
|
import org.graalvm.compiler.code.CompilationResult;
|
||||||
import org.graalvm.compiler.core.target.Backend;
|
import org.graalvm.compiler.core.target.Backend;
|
||||||
|
import org.graalvm.compiler.hotspot.HotSpotCompiledCodeBuilder;
|
||||||
import org.graalvm.compiler.hotspot.stubs.Stub;
|
import org.graalvm.compiler.hotspot.stubs.Stub;
|
||||||
|
|
||||||
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
|
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
|
||||||
@ -48,7 +49,7 @@ public class AOTStub implements JavaMethodInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public HotSpotCompiledCode compiledCode(CompilationResult result) {
|
public HotSpotCompiledCode compiledCode(CompilationResult result) {
|
||||||
return stub.getCompiledCode(backend);
|
return HotSpotCompiledCodeBuilder.createCompiledCode(null, null, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -59,12 +59,6 @@ abstract class CallSiteRelocationSymbol {
|
|||||||
addExternalPltToGotRelocation(binaryContainer, symbol, relocationOffset);
|
addExternalPltToGotRelocation(binaryContainer, symbol, relocationOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static void addMetaspaceGotRelocation(BinaryContainer binaryContainer, String symbolName, int symbolOffset, int relocationOffset) {
|
|
||||||
ByteContainer container = binaryContainer.getMetaspaceGotContainer();
|
|
||||||
Symbol symbol = container.createGotSymbol(symbolOffset, symbolName);
|
|
||||||
addExternalPltToGotRelocation(binaryContainer, symbol, relocationOffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an {@link RelocType#EXTERNAL_GOT_TO_PLT} relocation to the
|
* Add an {@link RelocType#EXTERNAL_GOT_TO_PLT} relocation to the
|
||||||
* {@link BinaryContainer#getExtLinkageGOTContainer()}.
|
* {@link BinaryContainer#getExtLinkageGOTContainer()}.
|
||||||
|
@ -70,8 +70,8 @@ class DataBuilder {
|
|||||||
*/
|
*/
|
||||||
private void fillVMAddresses(HotSpotVMConfigStore config) {
|
private void fillVMAddresses(HotSpotVMConfigStore config) {
|
||||||
for (VMField vmField : config.getFields().values()) {
|
for (VMField vmField : config.getFields().values()) {
|
||||||
if (vmField.value != null) {
|
if (vmField.value != null && vmField.value instanceof Long) {
|
||||||
final long address = vmField.value;
|
final long address = (Long) vmField.value;
|
||||||
String value = vmField.name;
|
String value = vmField.name;
|
||||||
/*
|
/*
|
||||||
* Some fields don't contain addresses but integer values. At least don't add zero
|
* Some fields don't contain addresses but integer values. At least don't add zero
|
||||||
|
@ -37,6 +37,7 @@ import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
|
|||||||
final class JavaCallSiteRelocationSymbol extends CallSiteRelocationSymbol {
|
final class JavaCallSiteRelocationSymbol extends CallSiteRelocationSymbol {
|
||||||
|
|
||||||
private static final byte[] zeroSlot = new byte[8];
|
private static final byte[] zeroSlot = new byte[8];
|
||||||
|
// -1 represents Universe::non_oop_word() value
|
||||||
private static final byte[] minusOneSlot = {-1, -1, -1, -1, -1, -1, -1, -1};
|
private static final byte[] minusOneSlot = {-1, -1, -1, -1, -1, -1, -1, -1};
|
||||||
|
|
||||||
public JavaCallSiteRelocationSymbol(CompiledMethodInfo mi, Call call, CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
|
public JavaCallSiteRelocationSymbol(CompiledMethodInfo mi, Call call, CallSiteRelocationInfo callSiteRelocation, BinaryContainer binaryContainer) {
|
||||||
@ -79,30 +80,39 @@ final class JavaCallSiteRelocationSymbol extends CallSiteRelocationSymbol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add relocation to GOT cell for call resolution jump.
|
// Add relocation to GOT cell for call resolution jump.
|
||||||
|
// This GOT cell will be initialized during JVM startup with address
|
||||||
|
// of JVM runtime call resolution function.
|
||||||
String gotSymbolName = "got." + getResolveSymbolName(binaryContainer, mi, call);
|
String gotSymbolName = "got." + getResolveSymbolName(binaryContainer, mi, call);
|
||||||
Symbol gotSymbol = binaryContainer.getGotSymbol(gotSymbolName);
|
Symbol gotSymbol = binaryContainer.getGotSymbol(gotSymbolName);
|
||||||
addExternalPltToGotRelocation(binaryContainer, gotSymbol, stub.getResolveJumpOffset());
|
addExternalPltToGotRelocation(binaryContainer, gotSymbol, stub.getResolveJumpOffset());
|
||||||
|
|
||||||
// Add relocation to resolve call jump instruction address for GOT cell.
|
// Add relocation to resolve call jump instruction address for GOT cell.
|
||||||
|
// This GOT cell will be initialized with address of resolution jump instruction and
|
||||||
|
// will be updated with call destination address by JVM runtime call resolution code.
|
||||||
String pltJmpSymbolName = relocationSymbolName("plt.jmp", mi, call, callSiteRelocation);
|
String pltJmpSymbolName = relocationSymbolName("plt.jmp", mi, call, callSiteRelocation);
|
||||||
addCodeContainerRelocation(binaryContainer, pltJmpSymbolName, stub.getResolveJumpStart(), gotStartOffset);
|
addCodeContainerRelocation(binaryContainer, pltJmpSymbolName, stub.getResolveJumpStart(), gotStartOffset);
|
||||||
|
|
||||||
// Add relocation to GOT cell for dispatch jump.
|
// Add relocation to GOT cell for dispatch jump.
|
||||||
|
// The dispatch jump loads destination address from this GOT cell.
|
||||||
String gotEntrySymbolName = relocationSymbolName("got.entry", mi, call, callSiteRelocation);
|
String gotEntrySymbolName = relocationSymbolName("got.entry", mi, call, callSiteRelocation);
|
||||||
addExtLinkageGotContainerRelocation(binaryContainer, gotEntrySymbolName, gotStartOffset, stub.getDispatchJumpOffset());
|
addExtLinkageGotContainerRelocation(binaryContainer, gotEntrySymbolName, gotStartOffset, stub.getDispatchJumpOffset());
|
||||||
|
|
||||||
// Virtual call needs initial -1 value.
|
// Virtual call needs initial -1 value for Klass pointer.
|
||||||
|
// Non virtual call needs initial 0 value for Method pointer to call c2i adapter.
|
||||||
byte[] slot = isVirtualCall ? minusOneSlot : zeroSlot;
|
byte[] slot = isVirtualCall ? minusOneSlot : zeroSlot;
|
||||||
final int gotMetaOffset = binaryContainer.appendMetaspaceGotBytes(slot, 0, slot.length);
|
final int gotMetaOffset = binaryContainer.appendExtLinkageGotBytes(slot, 0, slot.length);
|
||||||
|
|
||||||
// Add relocation to GOT cell for move instruction (Klass* for virtual, Method* otherwise).
|
// Add relocation to GOT cell for move instruction (Klass* for virtual, Method* otherwise).
|
||||||
String gotMoveSymbolName = relocationSymbolName("got.move", mi, call, callSiteRelocation);
|
String gotMoveSymbolName = relocationSymbolName("got.move", mi, call, callSiteRelocation);
|
||||||
addMetaspaceGotRelocation(binaryContainer, gotMoveSymbolName, gotMetaOffset, stub.getMovOffset());
|
addExtLinkageGotContainerRelocation(binaryContainer, gotMoveSymbolName, gotMetaOffset, stub.getMovOffset());
|
||||||
|
|
||||||
if (isVirtualCall) {
|
if (isVirtualCall) {
|
||||||
// Nothing.
|
// Nothing.
|
||||||
} else {
|
} else {
|
||||||
// Add relocation to GOT cell for c2i adapter jump.
|
// Add relocation to GOT cell for c2i adapter jump.
|
||||||
|
// The c2i jump instruction loads destination address from this GOT cell.
|
||||||
|
// This GOT cell is initialized with -1 and will be updated
|
||||||
|
// by JVM runtime call resolution code.
|
||||||
String gotC2ISymbolName = relocationSymbolName("got.c2i", mi, call, callSiteRelocation);
|
String gotC2ISymbolName = relocationSymbolName("got.c2i", mi, call, callSiteRelocation);
|
||||||
addExtLinkageGotContainerRelocation(binaryContainer, gotC2ISymbolName, gotStartOffset + 8, stub.getC2IJumpOffset());
|
addExtLinkageGotContainerRelocation(binaryContainer, gotC2ISymbolName, gotStartOffset + 8, stub.getC2IJumpOffset());
|
||||||
}
|
}
|
||||||
|
@ -625,7 +625,9 @@ public class Main implements LogPrinter {
|
|||||||
|
|
||||||
private void reportError(Throwable e) {
|
private void reportError(Throwable e) {
|
||||||
log.println("Error: " + e.getMessage());
|
log.println("Error: " + e.getMessage());
|
||||||
e.printStackTrace(log);
|
if (options.info) {
|
||||||
|
e.printStackTrace(log);
|
||||||
|
}
|
||||||
log.flush();
|
log.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ public class ClassSearch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (found == null) {
|
if (found == null) {
|
||||||
throw new InternalError("Failed to find: " + searchFor.toString());
|
throw new InternalError("Failed to find " + searchFor.getType() + " file: " + searchFor.getName());
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ public class SearchFor {
|
|||||||
private final String type;
|
private final String type;
|
||||||
|
|
||||||
public SearchFor(String name) {
|
public SearchFor(String name) {
|
||||||
this(name, "unknown");
|
this(name, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public SearchFor(String name, String type) {
|
public SearchFor(String name, String type) {
|
||||||
@ -36,7 +36,7 @@ public class SearchFor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isUnknown() {
|
public boolean isUnknown() {
|
||||||
return "unknown".equals(type);
|
return "".equals(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getType() {
|
public String getType() {
|
||||||
@ -49,6 +49,6 @@ public class SearchFor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return type + ":" + name;
|
return type + ": " + name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ import java.nio.file.Path;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
public class ClassNameSourceProvider implements SourceProvider {
|
public class ClassNameSourceProvider implements SourceProvider {
|
||||||
public final static String TYPE = "classname";
|
public final static String TYPE = "class";
|
||||||
private final ClassLoader classLoader;
|
private final ClassLoader classLoader;
|
||||||
|
|
||||||
public ClassNameSourceProvider(FileSupport fileSupport) {
|
public ClassNameSourceProvider(FileSupport fileSupport) {
|
||||||
@ -47,6 +47,10 @@ public class ClassNameSourceProvider implements SourceProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ClassSource findSource(String name, SearchPath searchPath) {
|
public ClassSource findSource(String name, SearchPath searchPath) {
|
||||||
|
Path path = Paths.get(name);
|
||||||
|
if (ClassSource.pathIsClassFile(path)) {
|
||||||
|
name = ClassSource.makeClassName(path);
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
classLoader.loadClass(name);
|
classLoader.loadClass(name);
|
||||||
return new ClassNameSource(name, classLoader);
|
return new ClassNameSource(name, classLoader);
|
||||||
|
@ -25,6 +25,6 @@
|
|||||||
|
|
||||||
module jdk.aot {
|
module jdk.aot {
|
||||||
requires jdk.management;
|
requires jdk.management;
|
||||||
requires jdk.vm.ci;
|
requires jdk.internal.vm.ci;
|
||||||
requires jdk.vm.compiler;
|
requires jdk.internal.vm.compiler;
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#define ELF_NHDR Elf64_Nhdr
|
#define ELF_NHDR Elf64_Nhdr
|
||||||
#define ELF_DYN Elf64_Dyn
|
#define ELF_DYN Elf64_Dyn
|
||||||
#define ELF_ADDR Elf64_Addr
|
#define ELF_ADDR Elf64_Addr
|
||||||
|
#define ELF_AUXV Elf64_auxv_t
|
||||||
|
|
||||||
#define ELF_ST_TYPE ELF64_ST_TYPE
|
#define ELF_ST_TYPE ELF64_ST_TYPE
|
||||||
|
|
||||||
@ -45,6 +46,7 @@
|
|||||||
#define ELF_NHDR Elf32_Nhdr
|
#define ELF_NHDR Elf32_Nhdr
|
||||||
#define ELF_DYN Elf32_Dyn
|
#define ELF_DYN Elf32_Dyn
|
||||||
#define ELF_ADDR Elf32_Addr
|
#define ELF_ADDR Elf32_Addr
|
||||||
|
#define ELF_AUXV Elf32_auxv_t
|
||||||
|
|
||||||
#define ELF_ST_TYPE ELF32_ST_TYPE
|
#define ELF_ST_TYPE ELF32_ST_TYPE
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2017, 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
|
||||||
@ -50,7 +50,7 @@ int pathmap_open(const char* name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (strlen(alt_root) + strlen(name) < PATH_MAX) {
|
if (strlen(alt_root) + strlen(name) > PATH_MAX) {
|
||||||
// Buffer too small.
|
// Buffer too small.
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -642,6 +642,18 @@ static bool core_handle_note(struct ps_prochandle* ph, ELF_PHDR* note_phdr) {
|
|||||||
if (core_handle_prstatus(ph, descdata, notep->n_descsz) != true) {
|
if (core_handle_prstatus(ph, descdata, notep->n_descsz) != true) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (notep->n_type == NT_AUXV) {
|
||||||
|
// Get first segment from entry point
|
||||||
|
ELF_AUXV *auxv = (ELF_AUXV *)descdata;
|
||||||
|
while (auxv->a_type != AT_NULL) {
|
||||||
|
if (auxv->a_type == AT_ENTRY) {
|
||||||
|
// Set entry point address to address of dynamic section.
|
||||||
|
// We will adjust it in read_exec_segments().
|
||||||
|
ph->core->dynamic_addr = auxv->a_un.a_val;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
auxv++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
p = descdata + ROUNDUP(notep->n_descsz, 4);
|
p = descdata + ROUNDUP(notep->n_descsz, 4);
|
||||||
}
|
}
|
||||||
@ -832,7 +844,13 @@ static bool read_exec_segments(struct ps_prochandle* ph, ELF_EHDR* exec_ehdr) {
|
|||||||
|
|
||||||
// from PT_DYNAMIC we want to read address of first link_map addr
|
// from PT_DYNAMIC we want to read address of first link_map addr
|
||||||
case PT_DYNAMIC: {
|
case PT_DYNAMIC: {
|
||||||
ph->core->dynamic_addr = exec_php->p_vaddr;
|
if (exec_ehdr->e_type == ET_EXEC) {
|
||||||
|
ph->core->dynamic_addr = exec_php->p_vaddr;
|
||||||
|
} else { // ET_DYN
|
||||||
|
// dynamic_addr has entry point of executable.
|
||||||
|
// Thus we should substract it.
|
||||||
|
ph->core->dynamic_addr += exec_php->p_vaddr - exec_ehdr->e_entry;
|
||||||
|
}
|
||||||
print_debug("address of _DYNAMIC is 0x%lx\n", ph->core->dynamic_addr);
|
print_debug("address of _DYNAMIC is 0x%lx\n", ph->core->dynamic_addr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1030,8 +1048,9 @@ struct ps_prochandle* Pgrab_core(const char* exec_file, const char* core_file) {
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (read_elf_header(ph->core->exec_fd, &exec_ehdr) != true || exec_ehdr.e_type != ET_EXEC) {
|
if (read_elf_header(ph->core->exec_fd, &exec_ehdr) != true ||
|
||||||
print_debug("executable file is not a valid ELF ET_EXEC file\n");
|
((exec_ehdr.e_type != ET_EXEC) && (exec_ehdr.e_type != ET_DYN))) {
|
||||||
|
print_debug("executable file is not a valid ELF file\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2004, 2017, 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
|
||||||
@ -114,6 +114,8 @@ public abstract class AbstractHeapGraphWriter implements HeapGraphWriter {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
writeHeapRecordPrologue();
|
||||||
|
|
||||||
// write JavaThreads
|
// write JavaThreads
|
||||||
writeJavaThreads();
|
writeJavaThreads();
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2004, 2017, 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
|
||||||
@ -45,8 +45,8 @@ import sun.jvm.hotspot.classfile.*;
|
|||||||
* WARNING: This format is still under development, and is subject to
|
* WARNING: This format is still under development, and is subject to
|
||||||
* change without notice.
|
* change without notice.
|
||||||
*
|
*
|
||||||
* header "JAVA PROFILE 1.0.1" or "JAVA PROFILE 1.0.2" (0-terminated)
|
* header "JAVA PROFILE 1.0.2" (0-terminated)
|
||||||
* u4 size of identifiers. Identifiers are used to represent
|
* u4 size of identifiers. Identifiers are used to represent
|
||||||
* UTF8 strings, objects, stack traces, etc. They usually
|
* UTF8 strings, objects, stack traces, etc. They usually
|
||||||
* have the same size as host pointers. For example, on
|
* have the same size as host pointers. For example, on
|
||||||
* Solaris and Win32, the size is 4.
|
* Solaris and Win32, the size is 4.
|
||||||
@ -294,10 +294,9 @@ import sun.jvm.hotspot.classfile.*;
|
|||||||
* u2 stack trace depth
|
* u2 stack trace depth
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* When the header is "JAVA PROFILE 1.0.2" a heap dump can optionally
|
* A heap dump can optionally be generated as a sequence of heap dump
|
||||||
* be generated as a sequence of heap dump segments. This sequence is
|
* segments. This sequence is terminated by an end record. The additional
|
||||||
* terminated by an end record. The additional tags allowed by format
|
* tags allowed by format "JAVA PROFILE 1.0.2" are:
|
||||||
* "JAVA PROFILE 1.0.2" are:
|
|
||||||
*
|
*
|
||||||
* HPROF_HEAP_DUMP_SEGMENT denote a heap dump segment
|
* HPROF_HEAP_DUMP_SEGMENT denote a heap dump segment
|
||||||
*
|
*
|
||||||
@ -310,8 +309,6 @@ import sun.jvm.hotspot.classfile.*;
|
|||||||
|
|
||||||
public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
||||||
|
|
||||||
// The heap size threshold used to determine if segmented format
|
|
||||||
// ("JAVA PROFILE 1.0.2") should be used.
|
|
||||||
private static final long HPROF_SEGMENTED_HEAP_DUMP_THRESHOLD = 2L * 0x40000000;
|
private static final long HPROF_SEGMENTED_HEAP_DUMP_THRESHOLD = 2L * 0x40000000;
|
||||||
|
|
||||||
// The approximate size of a heap segment. Used to calculate when to create
|
// The approximate size of a heap segment. Used to calculate when to create
|
||||||
@ -319,7 +316,6 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
private static final long HPROF_SEGMENTED_HEAP_DUMP_SEGMENT_SIZE = 1L * 0x40000000;
|
private static final long HPROF_SEGMENTED_HEAP_DUMP_SEGMENT_SIZE = 1L * 0x40000000;
|
||||||
|
|
||||||
// hprof binary file header
|
// hprof binary file header
|
||||||
private static final String HPROF_HEADER_1_0_1 = "JAVA PROFILE 1.0.1";
|
|
||||||
private static final String HPROF_HEADER_1_0_2 = "JAVA PROFILE 1.0.2";
|
private static final String HPROF_HEADER_1_0_2 = "JAVA PROFILE 1.0.2";
|
||||||
|
|
||||||
// constants in enum HprofTag
|
// constants in enum HprofTag
|
||||||
@ -380,6 +376,7 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
private static final int JVM_SIGNATURE_ARRAY = '[';
|
private static final int JVM_SIGNATURE_ARRAY = '[';
|
||||||
private static final int JVM_SIGNATURE_CLASS = 'L';
|
private static final int JVM_SIGNATURE_CLASS = 'L';
|
||||||
|
|
||||||
|
private static final long MAX_U4_VALUE = 0xFFFFFFFFL;
|
||||||
int serialNum = 1;
|
int serialNum = 1;
|
||||||
|
|
||||||
public synchronized void write(String fileName) throws IOException {
|
public synchronized void write(String fileName) throws IOException {
|
||||||
@ -469,7 +466,6 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
// length later - hprof format requires length.
|
// length later - hprof format requires length.
|
||||||
out.flush();
|
out.flush();
|
||||||
currentSegmentStart = fos.getChannel().position();
|
currentSegmentStart = fos.getChannel().position();
|
||||||
|
|
||||||
// write dummy length of 0 and we'll fix it later.
|
// write dummy length of 0 and we'll fix it later.
|
||||||
out.writeInt(0);
|
out.writeInt(0);
|
||||||
}
|
}
|
||||||
@ -479,7 +475,7 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
protected void writeHeapRecordEpilogue() throws IOException {
|
protected void writeHeapRecordEpilogue() throws IOException {
|
||||||
if (useSegmentedHeapDump) {
|
if (useSegmentedHeapDump) {
|
||||||
out.flush();
|
out.flush();
|
||||||
if ((fos.getChannel().position() - currentSegmentStart - 4) >= HPROF_SEGMENTED_HEAP_DUMP_SEGMENT_SIZE) {
|
if ((fos.getChannel().position() - currentSegmentStart - 4L) >= HPROF_SEGMENTED_HEAP_DUMP_SEGMENT_SIZE) {
|
||||||
fillInHeapRecordLength();
|
fillInHeapRecordLength();
|
||||||
currentSegmentStart = 0;
|
currentSegmentStart = 0;
|
||||||
}
|
}
|
||||||
@ -488,14 +484,14 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
|
|
||||||
private void fillInHeapRecordLength() throws IOException {
|
private void fillInHeapRecordLength() throws IOException {
|
||||||
|
|
||||||
// now get current position to calculate length
|
// now get the current position to calculate length
|
||||||
long dumpEnd = fos.getChannel().position();
|
long dumpEnd = fos.getChannel().position();
|
||||||
|
|
||||||
// calculate length of heap data
|
// calculate the length of heap data
|
||||||
long dumpLenLong = (dumpEnd - currentSegmentStart - 4L);
|
long dumpLenLong = (dumpEnd - currentSegmentStart - 4L);
|
||||||
|
|
||||||
// Check length boundary, overflow could happen but is _very_ unlikely
|
// Check length boundary, overflow could happen but is _very_ unlikely
|
||||||
if(dumpLenLong >= (4L * 0x40000000)){
|
if (dumpLenLong >= (4L * 0x40000000)) {
|
||||||
throw new RuntimeException("Heap segment size overflow.");
|
throw new RuntimeException("Heap segment size overflow.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,6 +513,71 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
fos.getChannel().position(currentPosition);
|
fos.getChannel().position(currentPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get the size in bytes for the requested type
|
||||||
|
private long getSizeForType(int type) throws IOException {
|
||||||
|
switch (type) {
|
||||||
|
case TypeArrayKlass.T_BOOLEAN:
|
||||||
|
return BOOLEAN_SIZE;
|
||||||
|
case TypeArrayKlass.T_INT:
|
||||||
|
return INT_SIZE;
|
||||||
|
case TypeArrayKlass.T_CHAR:
|
||||||
|
return CHAR_SIZE;
|
||||||
|
case TypeArrayKlass.T_SHORT:
|
||||||
|
return SHORT_SIZE;
|
||||||
|
case TypeArrayKlass.T_BYTE:
|
||||||
|
return BYTE_SIZE;
|
||||||
|
case TypeArrayKlass.T_LONG:
|
||||||
|
return LONG_SIZE;
|
||||||
|
case TypeArrayKlass.T_FLOAT:
|
||||||
|
return FLOAT_SIZE;
|
||||||
|
case TypeArrayKlass.T_DOUBLE:
|
||||||
|
return DOUBLE_SIZE;
|
||||||
|
default:
|
||||||
|
throw new RuntimeException(
|
||||||
|
"Should not reach here: Unknown type: " + type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getArrayHeaderSize(boolean isObjectAarray) {
|
||||||
|
return isObjectAarray?
|
||||||
|
((int) BYTE_SIZE + 2 * (int) INT_SIZE + 2 * (int) OBJ_ID_SIZE):
|
||||||
|
(2 * (int) BYTE_SIZE + 2 * (int) INT_SIZE + (int) OBJ_ID_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we need to truncate an array
|
||||||
|
private int calculateArrayMaxLength(long originalArrayLength,
|
||||||
|
int headerSize,
|
||||||
|
long typeSize,
|
||||||
|
String typeName) throws IOException {
|
||||||
|
|
||||||
|
long length = originalArrayLength;
|
||||||
|
|
||||||
|
// now get the current position to calculate length
|
||||||
|
long dumpEnd = fos.getChannel().position();
|
||||||
|
long originalLengthInBytes = originalArrayLength * typeSize;
|
||||||
|
|
||||||
|
// calculate the length of heap data
|
||||||
|
long currentRecordLength = (dumpEnd - currentSegmentStart - 4L);
|
||||||
|
if (currentRecordLength > 0 &&
|
||||||
|
(currentRecordLength + headerSize + originalLengthInBytes) > MAX_U4_VALUE) {
|
||||||
|
fillInHeapRecordLength();
|
||||||
|
currentSegmentStart = 0;
|
||||||
|
writeHeapRecordPrologue();
|
||||||
|
currentRecordLength = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the max bytes we can use.
|
||||||
|
long maxBytes = (MAX_U4_VALUE - (headerSize + currentRecordLength));
|
||||||
|
|
||||||
|
if (originalLengthInBytes > maxBytes) {
|
||||||
|
length = maxBytes/typeSize;
|
||||||
|
System.err.println("WARNING: Cannot dump array of type " + typeName
|
||||||
|
+ " with length " + originalArrayLength
|
||||||
|
+ "; truncating to length " + length);
|
||||||
|
}
|
||||||
|
return (int) length;
|
||||||
|
}
|
||||||
|
|
||||||
private void writeClassDumpRecords() throws IOException {
|
private void writeClassDumpRecords() throws IOException {
|
||||||
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
|
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
|
||||||
ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
|
ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
|
||||||
@ -694,12 +755,16 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void writeObjectArray(ObjArray array) throws IOException {
|
protected void writeObjectArray(ObjArray array) throws IOException {
|
||||||
|
int headerSize = getArrayHeaderSize(true);
|
||||||
|
final int length = calculateArrayMaxLength(array.getLength(),
|
||||||
|
headerSize,
|
||||||
|
OBJ_ID_SIZE,
|
||||||
|
"Object");
|
||||||
out.writeByte((byte) HPROF_GC_OBJ_ARRAY_DUMP);
|
out.writeByte((byte) HPROF_GC_OBJ_ARRAY_DUMP);
|
||||||
writeObjectID(array);
|
writeObjectID(array);
|
||||||
out.writeInt(DUMMY_STACK_TRACE_ID);
|
out.writeInt(DUMMY_STACK_TRACE_ID);
|
||||||
out.writeInt((int) array.getLength());
|
out.writeInt(length);
|
||||||
writeObjectID(array.getKlass().getJavaMirror());
|
writeObjectID(array.getKlass().getJavaMirror());
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
OopHandle handle = array.getOopHandleAt(index);
|
OopHandle handle = array.getOopHandleAt(index);
|
||||||
writeObjectID(getAddressValue(handle));
|
writeObjectID(getAddressValue(handle));
|
||||||
@ -707,101 +772,101 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void writePrimitiveArray(TypeArray array) throws IOException {
|
protected void writePrimitiveArray(TypeArray array) throws IOException {
|
||||||
|
int headerSize = getArrayHeaderSize(false);
|
||||||
|
TypeArrayKlass tak = (TypeArrayKlass) array.getKlass();
|
||||||
|
final int type = (int) tak.getElementType();
|
||||||
|
final String typeName = tak.getElementTypeName();
|
||||||
|
final long typeSize = getSizeForType(type);
|
||||||
|
final int length = calculateArrayMaxLength(array.getLength(),
|
||||||
|
headerSize,
|
||||||
|
typeSize,
|
||||||
|
typeName);
|
||||||
out.writeByte((byte) HPROF_GC_PRIM_ARRAY_DUMP);
|
out.writeByte((byte) HPROF_GC_PRIM_ARRAY_DUMP);
|
||||||
writeObjectID(array);
|
writeObjectID(array);
|
||||||
out.writeInt(DUMMY_STACK_TRACE_ID);
|
out.writeInt(DUMMY_STACK_TRACE_ID);
|
||||||
out.writeInt((int) array.getLength());
|
out.writeInt(length);
|
||||||
TypeArrayKlass tak = (TypeArrayKlass) array.getKlass();
|
|
||||||
final int type = (int) tak.getElementType();
|
|
||||||
out.writeByte((byte) type);
|
out.writeByte((byte) type);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TypeArrayKlass.T_BOOLEAN:
|
case TypeArrayKlass.T_BOOLEAN:
|
||||||
writeBooleanArray(array);
|
writeBooleanArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_CHAR:
|
case TypeArrayKlass.T_CHAR:
|
||||||
writeCharArray(array);
|
writeCharArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_FLOAT:
|
case TypeArrayKlass.T_FLOAT:
|
||||||
writeFloatArray(array);
|
writeFloatArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_DOUBLE:
|
case TypeArrayKlass.T_DOUBLE:
|
||||||
writeDoubleArray(array);
|
writeDoubleArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_BYTE:
|
case TypeArrayKlass.T_BYTE:
|
||||||
writeByteArray(array);
|
writeByteArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_SHORT:
|
case TypeArrayKlass.T_SHORT:
|
||||||
writeShortArray(array);
|
writeShortArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_INT:
|
case TypeArrayKlass.T_INT:
|
||||||
writeIntArray(array);
|
writeIntArray(array, length);
|
||||||
break;
|
break;
|
||||||
case TypeArrayKlass.T_LONG:
|
case TypeArrayKlass.T_LONG:
|
||||||
writeLongArray(array);
|
writeLongArray(array, length);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new RuntimeException("should not reach here");
|
throw new RuntimeException(
|
||||||
|
"Should not reach here: Unknown type: " + type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeBooleanArray(TypeArray array) throws IOException {
|
private void writeBooleanArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = BOOLEAN_BASE_OFFSET + index * BOOLEAN_SIZE;
|
long offset = BOOLEAN_BASE_OFFSET + index * BOOLEAN_SIZE;
|
||||||
out.writeBoolean(array.getHandle().getJBooleanAt(offset));
|
out.writeBoolean(array.getHandle().getJBooleanAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeByteArray(TypeArray array) throws IOException {
|
private void writeByteArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = BYTE_BASE_OFFSET + index * BYTE_SIZE;
|
long offset = BYTE_BASE_OFFSET + index * BYTE_SIZE;
|
||||||
out.writeByte(array.getHandle().getJByteAt(offset));
|
out.writeByte(array.getHandle().getJByteAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeShortArray(TypeArray array) throws IOException {
|
private void writeShortArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = SHORT_BASE_OFFSET + index * SHORT_SIZE;
|
long offset = SHORT_BASE_OFFSET + index * SHORT_SIZE;
|
||||||
out.writeShort(array.getHandle().getJShortAt(offset));
|
out.writeShort(array.getHandle().getJShortAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeIntArray(TypeArray array) throws IOException {
|
private void writeIntArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = INT_BASE_OFFSET + index * INT_SIZE;
|
long offset = INT_BASE_OFFSET + index * INT_SIZE;
|
||||||
out.writeInt(array.getHandle().getJIntAt(offset));
|
out.writeInt(array.getHandle().getJIntAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeLongArray(TypeArray array) throws IOException {
|
private void writeLongArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = LONG_BASE_OFFSET + index * LONG_SIZE;
|
long offset = LONG_BASE_OFFSET + index * LONG_SIZE;
|
||||||
out.writeLong(array.getHandle().getJLongAt(offset));
|
out.writeLong(array.getHandle().getJLongAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeCharArray(TypeArray array) throws IOException {
|
private void writeCharArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = CHAR_BASE_OFFSET + index * CHAR_SIZE;
|
long offset = CHAR_BASE_OFFSET + index * CHAR_SIZE;
|
||||||
out.writeChar(array.getHandle().getJCharAt(offset));
|
out.writeChar(array.getHandle().getJCharAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeFloatArray(TypeArray array) throws IOException {
|
private void writeFloatArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = FLOAT_BASE_OFFSET + index * FLOAT_SIZE;
|
long offset = FLOAT_BASE_OFFSET + index * FLOAT_SIZE;
|
||||||
out.writeFloat(array.getHandle().getJFloatAt(offset));
|
out.writeFloat(array.getHandle().getJFloatAt(offset));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeDoubleArray(TypeArray array) throws IOException {
|
private void writeDoubleArray(TypeArray array, int length) throws IOException {
|
||||||
final int length = (int) array.getLength();
|
|
||||||
for (int index = 0; index < length; index++) {
|
for (int index = 0; index < length; index++) {
|
||||||
long offset = DOUBLE_BASE_OFFSET + index * DOUBLE_SIZE;
|
long offset = DOUBLE_BASE_OFFSET + index * DOUBLE_SIZE;
|
||||||
out.writeDouble(array.getHandle().getJDoubleAt(offset));
|
out.writeDouble(array.getHandle().getJDoubleAt(offset));
|
||||||
@ -996,12 +1061,7 @@ public class HeapHprofBinWriter extends AbstractHeapGraphWriter {
|
|||||||
// writes hprof binary file header
|
// writes hprof binary file header
|
||||||
private void writeFileHeader() throws IOException {
|
private void writeFileHeader() throws IOException {
|
||||||
// version string
|
// version string
|
||||||
if(useSegmentedHeapDump) {
|
out.writeBytes(HPROF_HEADER_1_0_2);
|
||||||
out.writeBytes(HPROF_HEADER_1_0_2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
out.writeBytes(HPROF_HEADER_1_0_1);
|
|
||||||
}
|
|
||||||
out.writeByte((byte)'\0');
|
out.writeByte((byte)'\0');
|
||||||
|
|
||||||
// write identifier size. we use pointers as identifiers.
|
// write identifier size. we use pointers as identifiers.
|
||||||
|
@ -278,8 +278,10 @@ final class CompilerToVM {
|
|||||||
* {@code info} are:
|
* {@code info} are:
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* [(int) flags, // only valid if field is resolved
|
* [ flags, // fieldDescriptor::access_flags()
|
||||||
* (int) offset] // only valid if field is resolved
|
* offset, // fieldDescriptor::offset()
|
||||||
|
* index // fieldDescriptor::index()
|
||||||
|
* ]
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* The behavior of this method is undefined if {@code cpi} does not denote a
|
* The behavior of this method is undefined if {@code cpi} does not denote a
|
||||||
@ -288,7 +290,7 @@ final class CompilerToVM {
|
|||||||
* @param info an array in which the details of the field are returned
|
* @param info an array in which the details of the field are returned
|
||||||
* @return the type defining the field if resolution is successful, 0 otherwise
|
* @return the type defining the field if resolution is successful, 0 otherwise
|
||||||
*/
|
*/
|
||||||
native HotSpotResolvedObjectTypeImpl resolveFieldInPool(HotSpotConstantPool constantPool, int cpi, HotSpotResolvedJavaMethodImpl method, byte opcode, long[] info);
|
native HotSpotResolvedObjectTypeImpl resolveFieldInPool(HotSpotConstantPool constantPool, int cpi, HotSpotResolvedJavaMethodImpl method, byte opcode, int[] info);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts {@code cpci} from an index into the cache for {@code constantPool} to an index
|
* Converts {@code cpci} from an index into the cache for {@code constantPool} to an index
|
||||||
@ -631,4 +633,15 @@ final class CompilerToVM {
|
|||||||
* {@code lambdaForm} (which must be a {@code java.lang.invoke.LambdaForm} instance).
|
* {@code lambdaForm} (which must be a {@code java.lang.invoke.LambdaForm} instance).
|
||||||
*/
|
*/
|
||||||
native void compileToBytecode(Object lambdaForm);
|
native void compileToBytecode(Object lambdaForm);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the VM flag named {@code name}.
|
||||||
|
*
|
||||||
|
* @param name name of a VM option
|
||||||
|
* @return {@code this} if the named VM option doesn't exist, a {@link String} or {@code null}
|
||||||
|
* if its type is {@code ccstr} or {@code ccstrlist}, a {@link Double} if its type is
|
||||||
|
* {@code double}, a {@link Boolean} if its type is {@code bool} otherwise a
|
||||||
|
* {@link Long}
|
||||||
|
*/
|
||||||
|
native Object getFlagValue(String name);
|
||||||
}
|
}
|
@ -76,7 +76,7 @@ public class HotSpotCodeCacheProvider implements CodeCacheProvider {
|
|||||||
HotSpotVMConfigStore store = runtime.getConfigStore();
|
HotSpotVMConfigStore store = runtime.getConfigStore();
|
||||||
for (Map.Entry<String, VMField> e : store.getFields().entrySet()) {
|
for (Map.Entry<String, VMField> e : store.getFields().entrySet()) {
|
||||||
VMField field = e.getValue();
|
VMField field = e.getValue();
|
||||||
if (field.isStatic() && field.value != null && field.value == address) {
|
if (field.isStatic() && field.value != null && field.value instanceof Long && ((Long) field.value) == address) {
|
||||||
return e.getValue() + ":0x" + Long.toHexString(address);
|
return e.getValue() + ":0x" + Long.toHexString(address);
|
||||||
}
|
}
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user