This commit is contained in:
Prasanta Sadhukhan 2018-11-26 10:49:53 +05:30
commit 01267bb7ca
1213 changed files with 51678 additions and 7759 deletions

View File

@ -522,3 +522,5 @@ f8626bcc169813a4b2a15880386b952719d1d6d1 jdk-12+15
eefa65e142af305923d2adcd596fab9c639723a1 jdk-12+17
e38473506688e0995e701fc7f77d5a91b438ef93 jdk-12+18
dc1f9dec2018a37fedba47d8a2aedef99faaec64 jdk-12+19
40098289d5804c3b5e7074bc75501a81e70d9b0d jdk-12+20
f8fb0c86f2b3d24294d39c5685a628e1beb14ba7 jdk-12+21

View File

@ -69,6 +69,7 @@
</ul></li>
<li><a href="#running-tests">Running Tests</a></li>
<li><a href="#cross-compiling">Cross-compiling</a><ul>
<li><a href="#cross-compiling-the-easy-way-with-openjdk-devkits">Cross compiling the easy way with OpenJDK devkits</a></li>
<li><a href="#boot-jdk-and-build-jdk">Boot JDK and Build JDK</a></li>
<li><a href="#specifying-the-target-platform">Specifying the Target Platform</a></li>
<li><a href="#toolchain-considerations">Toolchain Considerations</a></li>
@ -93,7 +94,7 @@
<li><a href="#getting-help">Getting Help</a></li>
</ul></li>
<li><a href="#hints-and-suggestions-for-advanced-users">Hints and Suggestions for Advanced Users</a><ul>
<li><a href="#setting-up-a-forest-for-pushing-changes-defpath">Setting Up a Forest for Pushing Changes (defpath)</a></li>
<li><a href="#setting-up-a-repository-for-pushing-changes-defpath">Setting Up a Repository for Pushing Changes (defpath)</a></li>
<li><a href="#bash-completion">Bash Completion</a></li>
<li><a href="#using-multiple-configurations">Using Multiple Configurations</a></li>
<li><a href="#handling-reconfigurations">Handling Reconfigurations</a></li>
@ -131,7 +132,7 @@
<p>The JDK is a complex software project. Building it requires a certain amount of technical expertise, a fair number of dependencies on external software, and reasonably powerful hardware.</p>
<p>If you just want to use the JDK and not build it yourself, this document is not for you. See for instance <a href="http://openjdk.java.net/install">OpenJDK installation</a> for some methods of installing a prebuilt JDK.</p>
<h2 id="getting-the-source-code">Getting the Source Code</h2>
<p>Make sure you are getting the correct version. As of JDK 10, the source is no longer split into separate repositories so you only need to clone one single repository. At the <a href="http://hg.openjdk.java.net/">OpenJDK Mercurial server</a> you can see a list of all available forests. If you want to build an older version, e.g. JDK 8, it is recommended that you get the <code>jdk8u</code> forest, which contains incremental updates, instead of the <code>jdk8</code> forest, which was frozen at JDK 8 GA.</p>
<p>Make sure you are getting the correct version. As of JDK 10, the source is no longer split into separate repositories so you only need to clone one single repository. At the <a href="http://hg.openjdk.java.net/">OpenJDK Mercurial server</a> you can see a list of all available repositories. If you want to build an older version, e.g. JDK 8, it is recommended that you get the <code>jdk8u</code> forest, which contains incremental updates, instead of the <code>jdk8</code> forest, which was frozen at JDK 8 GA.</p>
<p>If you are new to Mercurial, a good place to start is the <a href="http://www.mercurial-scm.org/guide">Mercurial Beginner's Guide</a>. The rest of this document assumes a working knowledge of Mercurial.</p>
<h3 id="special-considerations">Special Considerations</h3>
<p>For a smooth building experience, it is recommended that you follow these rules on where and how to check out the source code.</p>
@ -570,6 +571,47 @@ CC: Sun C++ 5.13 SunOS_i386 151846-10 2015/10/30</code></pre>
<p>This requires a more complex setup and build procedure. This section assumes you are familiar with cross-compiling in general, and will only deal with the particularities of cross-compiling the JDK. If you are new to cross-compiling, please see the <a href="https://en.wikipedia.org/wiki/Cross_compiler#External_links">external links at Wikipedia</a> for a good start on reading materials.</p>
<p>Cross-compiling the JDK requires you to be able to build both for the build platform and for the target platform. The reason for the former is that we need to build and execute tools during the build process, both native tools and Java tools.</p>
<p>If all you want to do is to compile a 32-bit version, for the same OS, on a 64-bit machine, consider using <code>--with-target-bits=32</code> instead of doing a full-blown cross-compilation. (While this surely is possible, it's a lot more work and will take much longer to build.)</p>
<h3 id="cross-compiling-the-easy-way-with-openjdk-devkits">Cross compiling the easy way with OpenJDK devkits</h3>
<p>The OpenJDK build system provides out-of-the box support for creating and using so called devkits. A <code>devkit</code> is basically a collection of a cross-compiling toolchain and a sysroot environment which can easily be used together with the <code>--with-devkit</code> configure option to cross compile the OpenJDK. On Linux/x86_64, the following command:</p>
<pre><code>bash configure --with-devkit=&lt;devkit-path&gt; --openjdk-target=ppc64-linux-gnu &amp;&amp; make</code></pre>
<p>will configure and build OpenJDK for Linux/ppc64 assuming that <code>&lt;devkit-path&gt;</code> points to a Linux/x86_64 to Linux/ppc64 devkit.</p>
<p>Devkits can be created from the <code>make/devkit</code> directory by executing:</p>
<pre><code>make [ TARGETS=&quot;&lt;TARGET_TRIPLET&gt;+&quot; ] [ BASE_OS=&lt;OS&gt; ] [ BASE_OS_VERSION=&lt;VER&gt; ]</code></pre>
<p>where <code>TARGETS</code> contains one or more <code>TARGET_TRIPLET</code>s of the form described in <a href="https://sourceware.org/autobook/autobook/autobook_17.html">section 3.4 of the GNU Autobook</a>. If no targets are given, a native toolchain for the current platform will be created. Currently, at least the following targets are known to work:</p>
<table>
<thead>
<tr class="header">
<th style="text-align: left;">Supported devkit targets</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">x86_64-linux-gnu</td>
</tr>
<tr class="even">
<td style="text-align: left;">aarch64-linux-gnu</td>
</tr>
<tr class="odd">
<td style="text-align: left;">arm-linux-gnueabihf</td>
</tr>
<tr class="even">
<td style="text-align: left;">ppc64-linux-gnu</td>
</tr>
<tr class="odd">
<td style="text-align: left;">ppc64le-linux-gnu</td>
</tr>
<tr class="even">
<td style="text-align: left;">s390x-linux-gnu</td>
</tr>
</tbody>
</table>
<p><code>BASE_OS</code> must be one of &quot;OEL6&quot; for Oracle Enterprise Linux 6 or &quot;Fedora&quot; (if not specified &quot;OEL6&quot; will be the default). If the base OS is &quot;Fedora&quot; the corresponding Fedora release can be specified with the help of the <code>BASE_OS_VERSION</code> option (with &quot;27&quot; as default version). If the build is successful, the new devkits can be found in the <code>build/devkit/result</code> subdirectory:</p>
<pre><code>cd make/devkit
make TARGETS=&quot;ppc64le-linux-gnu aarch64-linux-gnu&quot; BASE_OS=Fedora BASE_OS_VERSION=21
ls -1 ../../build/devkit/result/
x86_64-linux-gnu-to-aarch64-linux-gnu
x86_64-linux-gnu-to-ppc64le-linux-gnu</code></pre>
<p>Notice that devkits are not only useful for targeting different build platforms. Because they contain the full build dependencies for a system (i.e. compiler and root file system), they can easily be used to build well-known, reliable and reproducible build environments. You can for example create and use a devkit with GCC 7.3 and a Fedora 12 sysroot environment (with glibc 2.11) on Ubuntu 14.04 (which doesn't have GCC 7.3 by default) to produce OpenJDK binaries which will run on all Linux systems with runtime libraries newer than the ones from Fedora 12 (e.g. Ubuntu 16.04, SLES 11 or RHEL 6).</p>
<h3 id="boot-jdk-and-build-jdk">Boot JDK and Build JDK</h3>
<p>When cross-compiling, make sure you use a boot JDK that runs on the <em>build</em> system, and not on the <em>target</em> system.</p>
<p>To be able to build, we need a &quot;Build JDK&quot;, which is a JDK built from the current sources (that is, the same as the end result of the entire build process), but able to run on the <em>build</em> system, and not the <em>target</em> system. (In contrast, the Boot JDK should be from an older release, e.g. JDK 8 when building JDK 9.)</p>
@ -662,8 +704,8 @@ ls build/linux-aarch64-normal-server-release/</code></pre></li>
<th style="text-align: left;">Target</th>
<th style="text-align: left;"><code>CC</code></th>
<th style="text-align: left;"><code>CXX</code></th>
<th><code>--arch=...</code></th>
<th><code>--openjdk-target=...</code></th>
<th style="text-align: left;"><code>--arch=...</code></th>
<th style="text-align: left;"><code>--openjdk-target=...</code></th>
</tr>
</thead>
<tbody>
@ -671,36 +713,36 @@ ls build/linux-aarch64-normal-server-release/</code></pre></li>
<td style="text-align: left;">x86</td>
<td style="text-align: left;">default</td>
<td style="text-align: left;">default</td>
<td>i386</td>
<td>i386-linux-gnu</td>
<td style="text-align: left;">i386</td>
<td style="text-align: left;">i386-linux-gnu</td>
</tr>
<tr class="even">
<td style="text-align: left;">armhf</td>
<td style="text-align: left;">gcc-arm-linux-gnueabihf</td>
<td style="text-align: left;">g++-arm-linux-gnueabihf</td>
<td>armhf</td>
<td>arm-linux-gnueabihf</td>
<td style="text-align: left;">armhf</td>
<td style="text-align: left;">arm-linux-gnueabihf</td>
</tr>
<tr class="odd">
<td style="text-align: left;">aarch64</td>
<td style="text-align: left;">gcc-aarch64-linux-gnu</td>
<td style="text-align: left;">g++-aarch64-linux-gnu</td>
<td>arm64</td>
<td>aarch64-linux-gnu</td>
<td style="text-align: left;">arm64</td>
<td style="text-align: left;">aarch64-linux-gnu</td>
</tr>
<tr class="even">
<td style="text-align: left;">ppc64el</td>
<td style="text-align: left;">gcc-powerpc64le-linux-gnu</td>
<td style="text-align: left;">g++-powerpc64le-linux-gnu</td>
<td>ppc64el</td>
<td>powerpc64le-linux-gnu</td>
<td style="text-align: left;">ppc64el</td>
<td style="text-align: left;">powerpc64le-linux-gnu</td>
</tr>
<tr class="odd">
<td style="text-align: left;">s390x</td>
<td style="text-align: left;">gcc-s390x-linux-gnu</td>
<td style="text-align: left;">g++-s390x-linux-gnu</td>
<td>s390x</td>
<td>s390x-linux-gnu</td>
<td style="text-align: left;">s390x</td>
<td style="text-align: left;">s390x-linux-gnu</td>
</tr>
</tbody>
</table>
@ -780,11 +822,11 @@ Hint: If caused by a warning, try configure --disable-warnings-as-errors.</code>
<p>Verify that the summary at the end looks correct. Are you indeed using the Boot JDK and native toolchain that you expect?</p>
<p>By default, the JDK has a strict approach where warnings from the compiler is considered errors which fail the build. For very new or very old compiler versions, this can trigger new classes of warnings, which thus fails the build. Run <code>configure</code> with <code>--disable-warnings-as-errors</code> to turn of this behavior. (The warnings will still show, but not make the build fail.)</p>
<h4 id="problems-with-incremental-rebuilds">Problems with Incremental Rebuilds</h4>
<p>Incremental rebuilds mean that when you modify part of the product, only the affected parts get rebuilt. While this works great in most cases, and significantly speed up the development process, from time to time complex interdependencies will result in an incorrect build result. This is the most common cause for unexpected build problems, together with inconsistencies between the different Mercurial repositories in the forest.</p>
<p>Incremental rebuilds mean that when you modify part of the product, only the affected parts get rebuilt. While this works great in most cases, and significantly speed up the development process, from time to time complex interdependencies will result in an incorrect build result. This is the most common cause for unexpected build problems.</p>
<p>Here are a suggested list of things to try if you are having unexpected build problems. Each step requires more time than the one before, so try them in order. Most issues will be solved at step 1 or 2.</p>
<ol type="1">
<li><p>Make sure your forest is up-to-date</p>
<p>Run <code>bash get_source.sh</code> to make sure you have the latest version of all repositories.</p></li>
<li><p>Make sure your repository is up-to-date</p>
<p>Run <code>hg pull -u</code> to make sure you have the latest changes.</p></li>
<li><p>Clean build results</p>
<p>The simplest way to fix incremental rebuild issues is to run <code>make clean</code>. This will remove all build results, but not the configuration or any build system support artifacts. In most cases, this will solve build errors resulting from incremental build mismatches.</p></li>
<li><p>Completely clean the build directory.</p>
@ -793,8 +835,8 @@ Hint: If caused by a warning, try configure --disable-warnings-as-errors.</code>
make dist-clean
bash configure $(cat current-configuration)
make</code></pre></li>
<li><p>Re-clone the Mercurial forest</p>
<p>Sometimes the Mercurial repositories themselves gets in a state that causes the product to be un-buildable. In such a case, the simplest solution is often the &quot;sledgehammer approach&quot;: delete the entire forest, and re-clone it. If you have local changes, save them first to a different location using <code>hg export</code>.</p></li>
<li><p>Re-clone the Mercurial repository</p>
<p>Sometimes the Mercurial repository gets in a state that causes the product to be un-buildable. In such a case, the simplest solution is often the &quot;sledgehammer approach&quot;: delete the entire repository, and re-clone it. If you have local changes, save them first to a different location using <code>hg export</code>.</p></li>
</ol>
<h3 id="specific-build-issues">Specific Build Issues</h3>
<h4 id="clock-skew">Clock Skew</h4>
@ -813,10 +855,15 @@ cannot create ... Permission denied
spawn failed</code></pre>
<p>This can be a sign of a Cygwin problem. See the information about solving problems in the <a href="#cygwin">Cygwin</a> section. Rebooting the computer might help temporarily.</p>
<h3 id="getting-help">Getting Help</h3>
<p>If none of the suggestions in this document helps you, or if you find what you believe is a bug in the build system, please contact the Build Group by sending a mail to <a href="mailto:build-dev@openjdk.java.net">build-dev@openjdk.java.net</a>. Please include the relevant parts of the configure and/or build log.</p>
<p>If none of the suggestions in this document helps you, or if you find what you believe is a bug in the build system, please contact the Build Group by sending a mail to <script type="text/javascript">
<!--
h='&#x6f;&#112;&#x65;&#110;&#106;&#100;&#x6b;&#46;&#106;&#x61;&#118;&#x61;&#46;&#110;&#x65;&#116;';a='&#64;';n='&#98;&#x75;&#x69;&#108;&#100;&#x2d;&#100;&#x65;&#118;';e=n+a+h;
document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'" clas'+'s="em' + 'ail">'+e+'<\/'+'a'+'>');
// -->
</script><noscript>&#98;&#x75;&#x69;&#108;&#100;&#x2d;&#100;&#x65;&#118;&#32;&#x61;&#116;&#32;&#x6f;&#112;&#x65;&#110;&#106;&#100;&#x6b;&#32;&#100;&#x6f;&#116;&#32;&#106;&#x61;&#118;&#x61;&#32;&#100;&#x6f;&#116;&#32;&#110;&#x65;&#116;</noscript>. Please include the relevant parts of the configure and/or build log.</p>
<p>If you need general help or advice about developing for the JDK, you can also contact the Adoption Group. See the section on <a href="#contributing-to-openjdk">Contributing to OpenJDK</a> for more information.</p>
<h2 id="hints-and-suggestions-for-advanced-users">Hints and Suggestions for Advanced Users</h2>
<h3 id="setting-up-a-forest-for-pushing-changes-defpath">Setting Up a Forest for Pushing Changes (defpath)</h3>
<h3 id="setting-up-a-repository-for-pushing-changes-defpath">Setting Up a Repository for Pushing Changes (defpath)</h3>
<p>To help you prepare a proper push path for a Mercurial repository, there exists a useful tool known as <a href="http://openjdk.java.net/projects/code-tools/defpath">defpath</a>. It will help you setup a proper push path for pushing changes to the JDK.</p>
<p>Install the extension by cloning <code>http://hg.openjdk.java.net/code-tools/defpath</code> and updating your <code>.hgrc</code> file. Here's one way to do this:</p>
<pre><code>cd ~
@ -829,7 +876,6 @@ defpath=~/hg-ext/defpath/defpath.py
EOT</code></pre>
<p>You can now setup a proper push path using:</p>
<pre><code>hg defpath -d -u &lt;your OpenJDK username&gt;</code></pre>
<p>If you also have the <code>trees</code> extension installed in Mercurial, you will automatically get a <code>tdefpath</code> command, which is even more useful. By running <code>hg tdefpath -du &lt;username&gt;</code> in the top repository of your forest, all repos will get setup automatically. This is the recommended usage.</p>
<h3 id="bash-completion">Bash Completion</h3>
<p>The <code>configure</code> and <code>make</code> commands tries to play nice with bash command-line completion (using <code>&lt;tab&gt;</code> or <code>&lt;tab&gt;&lt;tab&gt;</code>). To use this functionality, make sure you enable completion in your <code>~/.bashrc</code> (see instructions for bash in your operating system).</p>
<p>Make completion will work out of the box, and will complete valid make targets. For instance, typing <code>make jdk-i&lt;tab&gt;</code> will complete to <code>make jdk-image</code>.</p>
@ -847,10 +893,10 @@ chmod +x /tmp/configure
sudo mv /tmp/configure /usr/local/bin</code></pre>
<p>Now <code>configure --en&lt;tab&gt;-dt&lt;tab&gt;</code> will result in <code>configure --enable-dtrace</code>.</p>
<h3 id="using-multiple-configurations">Using Multiple Configurations</h3>
<p>You can have multiple configurations for a single source forest. When you create a new configuration, run <code>configure --with-conf-name=&lt;name&gt;</code> to create a configuration with the name <code>&lt;name&gt;</code>. Alternatively, you can create a directory under <code>build</code> and run <code>configure</code> from there, e.g. <code>mkdir build/&lt;name&gt; &amp;&amp; cd build/&lt;name&gt; &amp;&amp; bash ../../configure</code>.</p>
<p>You can have multiple configurations for a single source repository. When you create a new configuration, run <code>configure --with-conf-name=&lt;name&gt;</code> to create a configuration with the name <code>&lt;name&gt;</code>. Alternatively, you can create a directory under <code>build</code> and run <code>configure</code> from there, e.g. <code>mkdir build/&lt;name&gt; &amp;&amp; cd build/&lt;name&gt; &amp;&amp; bash ../../configure</code>.</p>
<p>Then you can build that configuration using <code>make CONF_NAME=&lt;name&gt;</code> or <code>make CONF=&lt;pattern&gt;</code>, where <code>&lt;pattern&gt;</code> is a substring matching one or several configurations, e.g. <code>CONF=debug</code>. The special empty pattern (<code>CONF=</code>) will match <em>all</em> available configuration, so <code>make CONF= hotspot</code> will build the <code>hotspot</code> target for all configurations. Alternatively, you can execute <code>make</code> in the configuration directory, e.g. <code>cd build/&lt;name&gt; &amp;&amp; make</code>.</p>
<h3 id="handling-reconfigurations">Handling Reconfigurations</h3>
<p>If you update the forest and part of the configure script has changed, the build system will force you to re-run <code>configure</code>.</p>
<p>If you update the repository and part of the configure script has changed, the build system will force you to re-run <code>configure</code>.</p>
<p>Most of the time, you will be fine by running <code>configure</code> again with the same arguments as the last time, which can easily be performed by <code>make reconfigure</code>. To simplify this, you can use the <code>CONF_CHECK</code> make control variable, either as <code>make CONF_CHECK=auto</code>, or by setting an environment variable. For instance, if you add <code>export CONF_CHECK=auto</code> to your <code>.bashrc</code> file, <code>make</code> will always run <code>reconfigure</code> automatically whenever the configure script has changed.</p>
<p>You can also use <code>CONF_CHECK=ignore</code> to skip the check for a needed configure update. This might speed up the build, but comes at the risk of an incorrect build result. This is only recommended if you know what you're doing.</p>
<p>From time to time, you will also need to modify the command line to <code>configure</code> due to changes. Use <code>make print-configure</code> to show the command line used for your current configuration.</p>

View File

@ -48,7 +48,7 @@ JDK.
Make sure you are getting the correct version. As of JDK 10, the source is no
longer split into separate repositories so you only need to clone one single
repository. At the [OpenJDK Mercurial server](http://hg.openjdk.java.net/) you
can see a list of all available forests. If you want to build an older version,
can see a list of all available repositories. If you want to build an older version,
e.g. JDK 8, it is recommended that you get the `jdk8u` forest, which contains
incremental updates, instead of the `jdk8` forest, which was frozen at JDK 8 GA.
@ -884,6 +884,64 @@ If all you want to do is to compile a 32-bit version, for the same OS, on a
full-blown cross-compilation. (While this surely is possible, it's a lot more
work and will take much longer to build.)
### Cross compiling the easy way with OpenJDK devkits
The OpenJDK build system provides out-of-the box support for creating and using
so called devkits. A `devkit` is basically a collection of a cross-compiling
toolchain and a sysroot environment which can easily be used together with the
`--with-devkit` configure option to cross compile the OpenJDK. On Linux/x86_64,
the following command:
```
bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64-linux-gnu && make
```
will configure and build OpenJDK for Linux/ppc64 assuming that `<devkit-path>`
points to a Linux/x86_64 to Linux/ppc64 devkit.
Devkits can be created from the `make/devkit` directory by executing:
```
make [ TARGETS="<TARGET_TRIPLET>+" ] [ BASE_OS=<OS> ] [ BASE_OS_VERSION=<VER> ]
```
where `TARGETS` contains one or more `TARGET_TRIPLET`s of the form
described in [section 3.4 of the GNU Autobook](
https://sourceware.org/autobook/autobook/autobook_17.html). If no
targets are given, a native toolchain for the current platform will be
created. Currently, at least the following targets are known to work:
Supported devkit targets
------------------------
x86_64-linux-gnu
aarch64-linux-gnu
arm-linux-gnueabihf
ppc64-linux-gnu
ppc64le-linux-gnu
s390x-linux-gnu
`BASE_OS` must be one of "OEL6" for Oracle Enterprise Linux 6 or
"Fedora" (if not specified "OEL6" will be the default). If the base OS
is "Fedora" the corresponding Fedora release can be specified with the
help of the `BASE_OS_VERSION` option (with "27" as default version).
If the build is successful, the new devkits can be found in the
`build/devkit/result` subdirectory:
```
cd make/devkit
make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21
ls -1 ../../build/devkit/result/
x86_64-linux-gnu-to-aarch64-linux-gnu
x86_64-linux-gnu-to-ppc64le-linux-gnu
```
Notice that devkits are not only useful for targeting different build
platforms. Because they contain the full build dependencies for a
system (i.e. compiler and root file system), they can easily be used
to build well-known, reliable and reproducible build environments. You
can for example create and use a devkit with GCC 7.3 and a Fedora 12
sysroot environment (with glibc 2.11) on Ubuntu 14.04 (which doesn't
have GCC 7.3 by default) to produce OpenJDK binaries which will run on
all Linux systems with runtime libraries newer than the ones from
Fedora 12 (e.g. Ubuntu 16.04, SLES 11 or RHEL 6).
### Boot JDK and Build JDK
When cross-compiling, make sure you use a boot JDK that runs on the *build*
@ -1301,17 +1359,15 @@ Incremental rebuilds mean that when you modify part of the product, only the
affected parts get rebuilt. While this works great in most cases, and
significantly speed up the development process, from time to time complex
interdependencies will result in an incorrect build result. This is the most
common cause for unexpected build problems, together with inconsistencies
between the different Mercurial repositories in the forest.
common cause for unexpected build problems.
Here are a suggested list of things to try if you are having unexpected build
problems. Each step requires more time than the one before, so try them in
order. Most issues will be solved at step 1 or 2.
1. Make sure your forest is up-to-date
1. Make sure your repository is up-to-date
Run `bash get_source.sh` to make sure you have the latest version of all
repositories.
Run `hg pull -u` to make sure you have the latest changes.
2. Clean build results
@ -1336,13 +1392,13 @@ order. Most issues will be solved at step 1 or 2.
make
```
4. Re-clone the Mercurial forest
4. Re-clone the Mercurial repository
Sometimes the Mercurial repositories themselves gets in a state that causes
the product to be un-buildable. In such a case, the simplest solution is
often the "sledgehammer approach": delete the entire forest, and re-clone
it. If you have local changes, save them first to a different location
using `hg export`.
Sometimes the Mercurial repository gets in a state that causes the product
to be un-buildable. In such a case, the simplest solution is often the
"sledgehammer approach": delete the entire repository, and re-clone it.
If you have local changes, save them first to a different location using
`hg export`.
### Specific Build Issues
@ -1393,7 +1449,7 @@ contact the Adoption Group. See the section on [Contributing to OpenJDK](
## Hints and Suggestions for Advanced Users
### Setting Up a Forest for Pushing Changes (defpath)
### Setting Up a Repository for Pushing Changes (defpath)
To help you prepare a proper push path for a Mercurial repository, there exists
a useful tool known as [defpath](
@ -1420,11 +1476,6 @@ You can now setup a proper push path using:
hg defpath -d -u <your OpenJDK username>
```
If you also have the `trees` extension installed in Mercurial, you will
automatically get a `tdefpath` command, which is even more useful. By running
`hg tdefpath -du <username>` in the top repository of your forest, all repos
will get setup automatically. This is the recommended usage.
### Bash Completion
The `configure` and `make` commands tries to play nice with bash command-line
@ -1459,7 +1510,7 @@ Now `configure --en<tab>-dt<tab>` will result in `configure --enable-dtrace`.
### Using Multiple Configurations
You can have multiple configurations for a single source forest. When you
You can have multiple configurations for a single source repository. When you
create a new configuration, run `configure --with-conf-name=<name>` to create a
configuration with the name `<name>`. Alternatively, you can create a directory
under `build` and run `configure` from there, e.g. `mkdir build/<name> && cd
@ -1474,7 +1525,7 @@ in the configuration directory, e.g. `cd build/<name> && make`.
### Handling Reconfigurations
If you update the forest and part of the configure script has changed, the
If you update the repository and part of the configure script has changed, the
build system will force you to re-run `configure`.
Most of the time, you will be fine by running `configure` again with the same

View File

@ -24,12 +24,14 @@
<li><a href="#test-selection">Test selection</a><ul>
<li><a href="#jtreg">JTReg</a></li>
<li><a href="#gtest">Gtest</a></li>
<li><a href="#microbenchmarks">Microbenchmarks</a></li>
<li><a href="#special-tests">Special tests</a></li>
</ul></li>
<li><a href="#test-results-and-summary">Test results and summary</a></li>
<li><a href="#test-suite-control">Test suite control</a><ul>
<li><a href="#jtreg-keywords">JTReg keywords</a></li>
<li><a href="#gtest-keywords">Gtest keywords</a></li>
<li><a href="#microbenchmark-keywords">Microbenchmark keywords</a></li>
</ul></li>
</ul>
</nav>
@ -44,9 +46,11 @@ $ make test TEST=jdk_lang
$ make test-only TEST=&quot;gtest:LogTagSet gtest:LogTagSetDescriptions&quot; GTEST=&quot;REPEAT=-1&quot;
$ make test TEST=&quot;hotspot:hotspot_gc&quot; JTREG=&quot;JOBS=1;TIMEOUT=8;VM_OPTIONS=-XshowSettings -Xlog:gc+ref=debug&quot;
$ make test TEST=&quot;jtreg:test/hotspot:hotspot_gc test/hotspot/jtreg/native_sanity/JniVersion.java&quot;
$ make test TEST=&quot;micro:java.lang.reflect&quot; MICRO=&quot;FORK=1;WARMUP_ITER=2&quot;
$ make exploded-test TEST=tier2</code></pre>
<h3 id="configuration">Configuration</h3>
<p>To be able to run JTReg tests, <code>configure</code> needs to know where to find the JTReg test framework. If it is not picked up automatically by configure, use the <code>--with-jtreg=&lt;path to jtreg home&gt;</code> option to point to the JTReg framework. Note that this option should point to the JTReg home, i.e. the top directory, containing <code>lib/jtreg.jar</code> etc. (An alternative is to set the <code>JT_HOME</code> environment variable to point to the JTReg home before running <code>configure</code>.)</p>
<p>To be able to run microbenchmarks, <code>configure</code> needs to know where to find the JMH dependency. Use <code>--with-jmh=&lt;path to JMH jars&gt;</code> to point to a directory containing the core JMH and transitive dependencies. The recommended dependencies can be retrieved by running <code>sh make/devkit/createJMHBundle.sh</code>, after which <code>--with-jmh=build/jmh/jars</code> should work.</p>
<h2 id="test-selection">Test selection</h2>
<p>All functionality is available using the <code>test</code> make target. In this use case, the test or tests to be executed is controlled using the <code>TEST</code> variable. To speed up subsequent test runs with no source code changes, <code>test-only</code> can be used instead, which do not depend on the source and test image build.</p>
<p>For some common top-level tests, direct make targets have been generated. This includes all JTReg test groups, the hotspot gtest, and custom tests (if present). This means that <code>make test-tier1</code> is equivalent to <code>make test TEST=&quot;tier1&quot;</code>, but the latter is more tab-completion friendly. For more complex test runs, the <code>test TEST=&quot;x&quot;</code> solution needs to be used.</p>
@ -61,6 +65,9 @@ $ make exploded-test TEST=tier2</code></pre>
<p>Since the Hotspot Gtest suite is so quick, the default is to run all tests. This is specified by just <code>gtest</code>, or as a fully qualified test descriptor <code>gtest:all</code>.</p>
<p>If you want, you can single out an individual test or a group of tests, for instance <code>gtest:LogDecorations</code> or <code>gtest:LogDecorations.level_test_vm</code>. This can be particularly useful if you want to run a shaky test repeatedly.</p>
<p>For Gtest, there is a separate test suite for each JVM variant. The JVM variant is defined by adding <code>/&lt;variant&gt;</code> to the test descriptor, e.g. <code>gtest:Log/client</code>. If you specify no variant, gtest will run once for each JVM variant present (e.g. server, client). So if you only have the server JVM present, then <code>gtest:all</code> will be equivalent to <code>gtest:all/server</code>.</p>
<h3 id="microbenchmarks">Microbenchmarks</h3>
<p>Which microbenchmarks to run is selected using a regular expression following the <code>micro:</code> test descriptor, e.g., <code>micro:java.lang.reflect</code>. This delegates the test selection to JMH, meaning package name, class name and even benchmark method names can be used to select tests.</p>
<p>Using special characters like <code>|</code> in the regular expression is possible, but needs to be escaped multiple times: <code>micro:ArrayCopy\\\\\|reflect</code>.</p>
<h3 id="special-tests">Special tests</h3>
<p>A handful of odd tests that are not covered by any other testing framework are accessible using the <code>special:</code> test descriptor. Currently, this includes <code>failure-handler</code> and <code>make</code>.</p>
<ul>
@ -127,5 +134,22 @@ TEST FAILURE</code></pre>
<h4 id="options-1">OPTIONS</h4>
<p>Additional options to the Gtest test framework.</p>
<p>Use <code>GTEST=&quot;OPTIONS=--help&quot;</code> to see all available Gtest options.</p>
<h3 id="microbenchmark-keywords">Microbenchmark keywords</h3>
<h4 id="fork">FORK</h4>
<p>Override the number of benchmark forks to spawn. Same as specifying <code>-f &lt;num&gt;</code>.</p>
<h4 id="iter">ITER</h4>
<p>Number of measurement iterations per fork. Same as specifying <code>-i &lt;num&gt;</code>.</p>
<h4 id="time">TIME</h4>
<p>Amount of time to spend in each measurement iteration, in seconds. Same as specifying <code>-r &lt;num&gt;</code></p>
<h4 id="warmup_iter">WARMUP_ITER</h4>
<p>Number of warmup iterations to run before the measurement phase in each fork. Same as specifying <code>-wi &lt;num&gt;</code>.</p>
<h4 id="warmup_time">WARMUP_TIME</h4>
<p>Amount of time to spend in each warmup iteration. Same as specifying <code>-w &lt;num&gt;</code>.</p>
<h4 id="results_format">RESULTS_FORMAT</h4>
<p>Specify to have the test run save a log of the values. Accepts the same values as <code>-rff</code>, i.e., <code>text</code>, <code>csv</code>, <code>scsv</code>, <code>json</code>, or <code>latex</code>.</p>
<h4 id="vm_options-1">VM_OPTIONS</h4>
<p>Additional VM arguments to provide to forked off VMs. Same as <code>-jvmArgs &lt;args&gt;</code></p>
<h4 id="options-2">OPTIONS</h4>
<p>Additional arguments to send to JMH.</p>
</body>
</html>

View File

@ -26,6 +26,7 @@ Some example command-lines:
$ make test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
$ make test TEST="hotspot:hotspot_gc" JTREG="JOBS=1;TIMEOUT=8;VM_OPTIONS=-XshowSettings -Xlog:gc+ref=debug"
$ make test TEST="jtreg:test/hotspot:hotspot_gc test/hotspot/jtreg/native_sanity/JniVersion.java"
$ make test TEST="micro:java.lang.reflect" MICRO="FORK=1;WARMUP_ITER=2"
$ make exploded-test TEST=tier2
### Configuration
@ -37,6 +38,12 @@ Note that this option should point to the JTReg home, i.e. the top directory,
containing `lib/jtreg.jar` etc. (An alternative is to set the `JT_HOME`
environment variable to point to the JTReg home before running `configure`.)
To be able to run microbenchmarks, `configure` needs to know where to find
the JMH dependency. Use `--with-jmh=<path to JMH jars>` to point to a directory
containing the core JMH and transitive dependencies. The recommended dependencies
can be retrieved by running `sh make/devkit/createJMHBundle.sh`, after which
`--with-jmh=build/jmh/jars` should work.
## Test selection
All functionality is available using the `test` make target. In this use case,
@ -104,6 +111,16 @@ is defined by adding `/<variant>` to the test descriptor, e.g.
variant present (e.g. server, client). So if you only have the server JVM
present, then `gtest:all` will be equivalent to `gtest:all/server`.
### Microbenchmarks
Which microbenchmarks to run is selected using a regular expression
following the `micro:` test descriptor, e.g., `micro:java.lang.reflect`. This
delegates the test selection to JMH, meaning package name, class name and even
benchmark method names can be used to select tests.
Using special characters like `|` in the regular expression is possible, but
needs to be escaped multiple times: `micro:ArrayCopy\\\\\|reflect`.
### Special tests
A handful of odd tests that are not covered by any other testing framework are
@ -253,6 +270,35 @@ Additional options to the Gtest test framework.
Use `GTEST="OPTIONS=--help"` to see all available Gtest options.
### Microbenchmark keywords
#### FORK
Override the number of benchmark forks to spawn. Same as specifying `-f <num>`.
#### ITER
Number of measurement iterations per fork. Same as specifying `-i <num>`.
#### TIME
Amount of time to spend in each measurement iteration, in seconds. Same as
specifying `-r <num>`
#### WARMUP_ITER
Number of warmup iterations to run before the measurement phase in each fork.
Same as specifying `-wi <num>`.
#### WARMUP_TIME
Amount of time to spend in each warmup iteration. Same as specifying `-w <num>`.
#### RESULTS_FORMAT
Specify to have the test run save a log of the values. Accepts the same values
as `-rff`, i.e., `text`, `csv`, `scsv`, `json`, or `latex`.
#### VM_OPTIONS
Additional VM arguments to provide to forked off VMs. Same as `-jvmArgs <args>`
#### OPTIONS
Additional arguments to send to JMH.
---
# Override some definitions in the global css file that are not optimal for
# this document.

View File

@ -450,21 +450,17 @@ jdk.internal.vm.compiler_ADD_JAVAC_FLAGS += -parameters -XDstringConcat=inline \
jdk.internal.vm.compiler_EXCLUDES += \
jdk.internal.vm.compiler.collections.test \
org.graalvm.compiler.processor \
org.graalvm.compiler.core.match.processor \
org.graalvm.compiler.nodeinfo.processor \
org.graalvm.compiler.options.processor \
org.graalvm.compiler.serviceprovider.processor \
org.graalvm.compiler.replacements.processor \
org.graalvm.compiler.replacements.jdk9.test \
jdk.tools.jaotc.test \
org.graalvm.compiler.api.directives.test \
org.graalvm.compiler.api.test \
org.graalvm.compiler.asm.aarch64.test \
org.graalvm.compiler.asm.amd64.test \
org.graalvm.compiler.asm.sparc.test \
org.graalvm.compiler.asm.test \
org.graalvm.compiler.core.aarch64.test \
org.graalvm.compiler.core.amd64.test \
org.graalvm.compiler.core.sparc.test \
org.graalvm.compiler.core.jdk9.test \
org.graalvm.compiler.core.match.processor \
org.graalvm.compiler.core.test \
org.graalvm.compiler.debug.test \
org.graalvm.compiler.graph.test \
@ -477,10 +473,18 @@ jdk.internal.vm.compiler_EXCLUDES += \
org.graalvm.compiler.lir.test \
org.graalvm.compiler.loop.test \
org.graalvm.compiler.microbenchmarks \
org.graalvm.compiler.nodeinfo.processor \
org.graalvm.compiler.nodes.test \
org.graalvm.compiler.options.processor \
org.graalvm.compiler.options.test \
org.graalvm.compiler.phases.common.test \
org.graalvm.compiler.processor \
org.graalvm.compiler.replacements.jdk12.test \
org.graalvm.compiler.replacements.jdk9.test \
org.graalvm.compiler.replacements.jdk9_11.test \
org.graalvm.compiler.replacements.processor \
org.graalvm.compiler.replacements.test \
org.graalvm.compiler.serviceprovider.processor \
org.graalvm.compiler.test \
org.graalvm.compiler.virtual.bench \
org.graalvm.micro.benchmarks \

View File

@ -103,6 +103,7 @@ help:
$(info $(_) # make test TEST="jdk_lang gtest:all")
$(info $(_) JTREG="OPT1=x;OPT2=y" # Control the JTREG test harness)
$(info $(_) GTEST="OPT1=x;OPT2=y" # Control the GTEST test harness)
$(info $(_) MICRO="OPT1=x;OPT2=y" # Control the MICRO test harness)
$(info $(_) TEST_OPTS="OPT1=x;..." # Generic control of all test harnesses)
$(info $(_) TEST_VM_OPTS="ARG ..." # Same as setting TEST_OPTS to VM_OPTIONS="ARG ...")
$(info )

View File

@ -50,7 +50,7 @@ ifeq ($(HAS_SPEC),)
# Make control variables, handled by Init.gmk
INIT_CONTROL_VARIABLES += LOG CONF CONF_NAME SPEC JOBS TEST_JOBS CONF_CHECK \
COMPARE_BUILD JTREG GTEST TEST_OPTS TEST_VM_OPTS
COMPARE_BUILD JTREG GTEST MICRO TEST_OPTS TEST_VM_OPTS
# All known make control variables
MAKE_CONTROL_VARIABLES := $(INIT_CONTROL_VARIABLES) TEST JDK_FILTER
@ -264,9 +264,13 @@ ifeq ($(HAS_SPEC),)
endif
endif
# The --no-print-directory is needed to make the call from
# FindTest.gmk to Test.gmk work with LOG=debug/trace. See
# JDK-8213736
$$(main_targets_file):
@( cd $$(topdir) && \
$$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/Main.gmk \
$$(MAKE) $$(MAKE_LOG_FLAGS) -r -R --no-print-directory \
-f $$(topdir)/make/Main.gmk \
-I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \
$$(MAKE_LOG_VARS) \
create-main-targets-include )

View File

@ -493,7 +493,7 @@ ALL_EXPLODED_TEST_TARGETS := $(addprefix exploded-test-, $(ALL_EXPLODED_TESTS))
ALL_TARGETS += $(ALL_TEST_TARGETS) $(ALL_EXPLODED_TEST_TARGETS)
################################################################################
# Build tests
# Build tests and microbenchmarks
#
prepare-test-image:
@ -543,11 +543,15 @@ ifeq ($(BUILD_FAILURE_HANDLER), true)
-f BuildFailureHandler.gmk images)
endif
build-microbenchmark:
+($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f test/BuildMicrobenchmark.gmk)
ALL_TARGETS += prepare-test-image build-test-hotspot-jtreg-native \
test-image-hotspot-jtreg-native build-test-jdk-jtreg-native \
test-image-jdk-jtreg-native build-test-lib build-test-failure-handler \
test-failure-handler test-image-failure-handler test-image-hotspot-gtest \
test-image-hotspot-jtreg-graal build-test-hotspot-jtreg-graal
test-image-hotspot-jtreg-graal build-test-hotspot-jtreg-graal \
build-microbenchmark
################################################################################
# Run tests
@ -789,6 +793,8 @@ else
jrtfs-jar: interim-langtools
build-microbenchmark: interim-langtools exploded-image
ifeq ($(ENABLE_GENERATE_CLASSLIST), true)
ifeq ($(CREATE_BUILDJDK), true)
# If creating a buildjdk, the interim image needs to be based on that.
@ -1023,6 +1029,10 @@ test-image: prepare-test-image \
test-image-jdk-jtreg-native test-image-failure-handler \
test-image-demos-jdk $(JVM_TEST_IMAGE_TARGETS)
ifneq ($(JMH_CORE_JAR), )
test-image: build-microbenchmark
endif
################################################################################
# all-images builds all our deliverables as images.

View File

@ -203,11 +203,23 @@ TEST_JOBS_FACTOR_JDL ?= 1
TEST_JOBS_FACTOR_MACHINE ?= 1
ifeq ($(TEST_JOBS), 0)
# Concurrency based on min(cores / 2, 12) * TEST_JOBS_FACTOR
CORES_DIVIDER := 2
ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
# For smaller SPARC machines we see reasonable scaling of throughput up to
# cpus/4 without affecting test reliability. On the bigger machines, cpus/4
# causes intermittent timeouts.
ifeq ($(shell $(EXPR) $(NUM_CORES) \> 16), 1)
CORES_DIVIDER := 5
else
CORES_DIVIDER := 4
endif
endif
MEMORY_DIVIDER := 2048
TEST_JOBS := $(shell $(AWK) \
'BEGIN { \
c = $(NUM_CORES) / 2; \
if (c > 12) c = 12; \
c = $(NUM_CORES) / $(CORES_DIVIDER); \
m = $(MEMORY_SIZE) / $(MEMORY_DIVIDER); \
if (c > m) c = m; \
c = c * $(TEST_JOBS_FACTOR); \
c = c * $(TEST_JOBS_FACTOR_JDL); \
c = c * $(TEST_JOBS_FACTOR_MACHINE); \
@ -225,13 +237,11 @@ ifneq ($(TEST_OPTS), )
$(info Running tests using TEST_OPTS control variable '$(TEST_OPTS)')
endif
### Jtreg
$(eval $(call SetTestOpt,VM_OPTIONS,JTREG))
$(eval $(call SetTestOpt,JAVA_OPTIONS,JTREG))
$(eval $(call SetTestOpt,VM_OPTIONS,GTEST))
$(eval $(call SetTestOpt,JAVA_OPTIONS,GTEST))
$(eval $(call SetTestOpt,AOT_MODULES,JTREG))
$(eval $(call SetTestOpt,AOT_MODULES,GTEST))
$(eval $(call SetTestOpt,JOBS,JTREG))
$(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG))
@ -247,6 +257,12 @@ ifneq ($(JTREG), )
$(info Running tests using JTREG control variable '$(JTREG)')
endif
### Gtest
$(eval $(call SetTestOpt,VM_OPTIONS,GTEST))
$(eval $(call SetTestOpt,JAVA_OPTIONS,GTEST))
$(eval $(call SetTestOpt,AOT_MODULES,GTEST))
$(eval $(call ParseKeywordVariable, GTEST, \
SINGLE_KEYWORDS := REPEAT AOT_MODULES, \
STRING_KEYWORDS := OPTIONS VM_OPTIONS JAVA_OPTIONS, \
@ -257,6 +273,21 @@ ifneq ($(GTEST), )
$(info Running tests using GTEST control variable '$(GTEST)')
endif
### Microbenchmarks
$(eval $(call SetTestOpt,VM_OPTIONS,MICRO))
$(eval $(call SetTestOpt,JAVA_OPTIONS,MICRO))
$(eval $(call ParseKeywordVariable, MICRO, \
SINGLE_KEYWORDS := ITER FORK TIME WARMUP_ITER WARMUP_TIME, \
STRING_KEYWORDS := OPTIONS JAVA_OPTIONS VM_OPTIONS RESULTS_FORMAT TEST_JDK BENCHMARKS_JAR, \
))
ifneq ($(MICRO), )
# Inform the user
$(info Running tests using MICRO control variable '$(MICRO)')
endif
################################################################################
# Component-specific Jtreg settings
@ -313,6 +344,24 @@ define ParseGtestTestSelection
)
endef
# Helper function to determine if a test specification is a microbenchmark test
#
# It is a microbenchmark test if it is either "micro", or "micro:" followed by an optional
# test filter string.
define ParseMicroTestSelection
$(if $(filter micro%, $1), \
$(if $(filter micro, $1), \
micro:all \
, \
$(if $(filter micro:, $1), \
micro:all \
, \
$1 \
) \
) \
)
endef
# Helper function that removes the TOPDIR part
CleanupJtregPath = \
$(strip $(patsubst %/, %, $(subst $(JTREG_TOPDIR)/,, $1)))
@ -425,6 +474,9 @@ $(foreach test, $(TEST), \
$(if $(strip $(PARSED_TESTS)), , \
$(eval PARSED_TESTS += $(call ParseGtestTestSelection, $(test))) \
) \
$(if $(strip $(PARSED_TESTS)), , \
$(eval PARSED_TESTS += $(call ParseMicroTestSelection, $(test))) \
) \
$(if $(strip $(PARSED_TESTS)), , \
$(eval PARSED_TESTS += $(call ParseJtregTestSelection, $(test))) \
) \
@ -548,6 +600,113 @@ endef
################################################################################
### Rules for Microbenchmarks
# Helper function for SetupRunMicroTest. Set a MICRO_* variable from, in order:
# 1) Specified by user on command line
# 2) Generic default
#
# Note: No spaces are allowed around the arguments.
# Arg $1 The test ID (i.e. $1 in SetupRunMicroTest)
# Arg $2 Base variable, e.g. MICRO_TEST_JDK
# Arg $3 The default value (optional)
define SetMicroValue
ifneq ($$($2), )
$1_$2 := $$($2)
else
ifneq ($3, )
$1_$2 := $3
endif
endif
endef
SetupRunMicroTest = $(NamedParamsMacroTemplate)
define SetupRunMicroTestBody
$1_TEST_RESULTS_DIR := $$(TEST_RESULTS_DIR)/$1
$1_TEST_SUPPORT_DIR := $$(TEST_SUPPORT_DIR)/$1
$1_EXITCODE := $$($1_TEST_RESULTS_DIR)/exitcode.txt
$1_TEST_NAME := $$(strip $$(patsubst micro:%, %, $$($1_TEST)))
$$(eval $$(call SetMicroValue,$1,MICRO_BENCHMARKS_JAR,$$(TEST_IMAGE_DIR)/micro/benchmarks.jar))
$$(eval $$(call SetMicroValue,$1,MICRO_TEST_JDK,$$(JDK_IMAGE_DIR)))
$$(eval $$(call SetMicroValue,$1,MICRO_JAVA_OPTIONS))
# Current tests needs to open java.io
$1_MICRO_JAVA_OPTIONS += --add-opens=java.base/java.io=ALL-UNNAMED
# Save output as JSON or CSV file
ifneq ($$(MICRO_RESULTS_FORMAT), )
$1_MICRO_BASIC_OPTIONS += -rf $$(MICRO_RESULTS_FORMAT) -rff $$($1_TEST_RESULTS_DIR)/jmh-result.$(MICRO_RESULTS_FORMAT)
endif
ifneq ($$(MICRO_VM_OPTIONS)$$(MICRO_JAVA_OPTIONS), )
$1_MICRO_VM_OPTIONS := -jvmArgs $$(MICRO_VM_OPTIONS) $$(MICRO_JAVA_OPTIONS)
endif
ifneq ($$(MICRO_ITER), )
$1_MICRO_ITER := -i $$(MICRO_ITER)
endif
ifneq ($$(MICRO_FORK), )
$1_MICRO_FORK := -f $$(MICRO_FORK)
endif
ifneq ($$(MICRO_TIME), )
$1_MICRO_TIME := -r $$(MICRO_TIME)
endif
ifneq ($$(MICRO_WARMUP_ITER), )
$1_MICRO_WARMUP_ITER := -wi $$(MICRO_WARMUP_ITER)
endif
ifneq ($$(MICRO_WARMUP_TIME), )
$1_MICRO_WARMUP_TIME := -w $$(MICRO_WARMUP_TIME)
endif
run-test-$1:
$$(call LogWarn)
$$(call LogWarn, Running test '$$($1_TEST)')
$$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR))
$$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/micro, \
$$($1_MICRO_TEST_JDK)/bin/java $$($1_MICRO_JAVA_OPTIONS) -jar $$($1_MICRO_BENCHMARKS_JAR) \
$$($1_MICRO_ITER) $$($1_MICRO_FORK) $$($1_MICRO_TIME) \
$$($1_MICRO_WARMUP_ITER) $$($1_MICRO_WARMUP_TIME) \
$$($1_MICRO_VM_OPTIONS) $$($1_MICRO_BASIC_OPTIONS) $$(MICRO_OPTIONS) \
$$($1_TEST_NAME) \
> >($(TEE) $$($1_TEST_RESULTS_DIR)/micro.txt) \
&& $$(ECHO) $$$$? > $$($1_EXITCODE) \
|| $$(ECHO) $$$$? > $$($1_EXITCODE) \
)
$1_RESULT_FILE := $$($1_TEST_RESULTS_DIR)/micro.txt
parse-test-$1: run-test-$1
$$(call LogWarn, Finished running test '$$($1_TEST)')
$$(call LogWarn, Test report is stored in $$(strip \
$$(subst $$(TOPDIR)/, , $$($1_TEST_RESULTS_DIR))))
$$(if $$(wildcard $$($1_EXITCODE)), \
$$(eval $1_EXIT_CODE := $$(shell $$(CAT) $$($1_EXITCODE))) \
$$(if $$(filter 0, $$($1_EXIT_CODE)), \
$$(eval $1_PASSED := 1) \
$$(eval $1_ERROR := 0) \
, \
$$(eval $1_PASSED := 0) \
$$(eval $1_ERROR := 1) \
) \
$$(eval $1_FAILED := 0) \
$$(eval $1_TOTAL := $$(shell \
$$(EXPR) $$($1_PASSED) + $$($1_ERROR))) \
, \
$$(eval $1_PASSED := 0) \
$$(eval $1_FAILED := 0) \
$$(eval $1_ERROR := 1) \
$$(eval $1_TOTAL := 1) \
)
$1: run-test-$1 parse-test-$1
TARGETS += $1
endef
################################################################################
### Rules for Jtreg
# Helper function for SetupRunJtregTest. Set a JTREG_* variable from, in order:
@ -621,7 +780,12 @@ define SetupRunJtregTestBody
# we may end up with a lot of JVM's
$1_JTREG_MAX_RAM_PERCENTAGE := $$(shell $$(EXPR) 25 / $$($1_JTREG_JOBS))
JTREG_TIMEOUT_FACTOR ?= 4
# SPARC is in general slower per core so need to scale up timeouts a bit.
ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
JTREG_TIMEOUT_FACTOR ?= 8
else
JTREG_TIMEOUT_FACTOR ?= 4
endif
JTREG_VERBOSE ?= fail,error,summary
JTREG_RETAIN ?= fail,error
@ -832,6 +996,9 @@ endef
UseGtestTestHandler = \
$(if $(filter gtest:%, $1), true)
UseMicroTestHandler = \
$(if $(filter micro:%, $1), true)
UseJtregTestHandler = \
$(if $(filter jtreg:%, $1), true)
@ -853,6 +1020,11 @@ $(foreach test, $(TESTS_TO_RUN), \
TEST := $(test), \
)) \
) \
$(if $(call UseMicroTestHandler, $(test)), \
$(eval $(call SetupRunMicroTest, $(TEST_ID), \
TEST := $(test), \
)) \
) \
$(if $(call UseJtregTestHandler, $(test)), \
$(eval $(call SetupRunJtregTest, $(TEST_ID), \
TEST := $(test), \

View File

@ -95,12 +95,12 @@ endef
# $1: The output file name
# $2..$N: The lines to output to the file
define CreateNewSpec
$(if $(strip $(30)), \
$(if $(strip $(31)), \
$(error Internal makefile error: \
Too many arguments to macro, please update CreateNewSpec in RunTestsPrebuilt.gmk) \
) \
$(shell $(RM) $1) \
$(foreach i, $(call sequence, 2, 29), \
$(foreach i, $(call sequence, 2, 30), \
$(if $(strip $($i)), \
$(call AppendFile, $(strip $($i)), $1) \
) \
@ -220,20 +220,35 @@ else
PATH_SEP:=:
endif
# Check number of cores
# Check number of cores and memory in MB
ifeq ($(OPENJDK_TARGET_OS), linux)
NUM_CORES := $(shell $(CAT) /proc/cpuinfo | $(GREP) -c processor)
MEMORY_SIZE := $(shell \
$(EXPR) `$(CAT) /proc/meminfo | $(GREP) MemTotal | $(AWK) '{print $$2}'` / 1024 \
)
else ifeq ($(OPENJDK_TARGET_OS), macosx)
NUM_CORES := $(shell /usr/sbin/sysctl -n hw.ncpu)
MEMORY_SIZE := $(shell $(EXPR) `/usr/sbin/sysctl -n hw.memsize` / 1024 / 1024)
else ifeq ($(OPENJDK_TARGET_OS), solaris)
NUM_CORES := $(shell LC_MESSAGES=C /usr/sbin/psrinfo -v | $(GREP) -c on-line)
MEMORY_SIZE := $(shell \
/usr/sbin/prtconf 2> /dev/null | $(GREP) "^Memory [Ss]ize" | $(AWK) '{print $$3}' \
)
else ifeq ($(OPENJDK_TARGET_OS), windows)
NUM_CORES := $(NUMBER_OF_PROCESSORS)
MEMORY_SIZE := $(shell \
$(EXPR) `wmic computersystem get totalphysicalmemory -value | $(GREP) = \
| $(CUT) -d "=" -f 2-` / 1024 / 1024 \
)
endif
ifeq ($(NUM_CORES), )
$(warn Could not find number of CPUs, assuming 1)
NUM_CORES := 1
endif
ifeq ($(MEMORY_SIZE), )
$(warn Could not find memory size, assuming 1024 MB)
MEMORY_SIZE := 1024
endif
# Setup LD for AOT support
ifneq ($(DEVKIT_HOME), )
@ -298,6 +313,7 @@ $(call CreateNewSpec, $(NEW_SPEC), \
OPENJDK_TARGET_CPU_BITS := $(OPENJDK_TARGET_CPU_BITS), \
OPENJDK_TARGET_CPU_ENDIAN := $(OPENJDK_TARGET_CPU_ENDIAN), \
NUM_CORES := $(NUM_CORES), \
MEMORY_SIZE := $(MEMORY_SIZE), \
LD := $(LD), \
LIBRARY_PREFIX := $(LIBRARY_PREFIX), \
SHARED_LIBRARY_SUFFIX := $(SHARED_LIBRARY_SUFFIX), \

View File

@ -180,6 +180,9 @@ TOOLCHAIN_MISC_CHECKS
# Setup the JTReg Regression Test Harness.
TOOLCHAIN_SETUP_JTREG
# Setup the Java Microbenchmark Harness (JMH)
LIB_TESTS_SETUP_JMH
# Setup Jib dependency tool
TOOLCHAIN_SETUP_JIB

View File

@ -102,7 +102,7 @@ apt_help() {
ffi)
PKGHANDLER_COMMAND="sudo apt-get install libffi-dev" ;;
x11)
PKGHANDLER_COMMAND="sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev" ;;
PKGHANDLER_COMMAND="sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev" ;;
ccache)
PKGHANDLER_COMMAND="sudo apt-get install ccache" ;;
dtrace)
@ -125,7 +125,7 @@ yum_help() {
freetype)
PKGHANDLER_COMMAND="sudo yum install freetype-devel" ;;
x11)
PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel libXi-devel" ;;
PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel" ;;
ccache)
PKGHANDLER_COMMAND="sudo yum install ccache" ;;
esac

View File

@ -55,3 +55,65 @@ AC_DEFUN_ONCE([LIB_TESTS_SETUP_GRAALUNIT],
AC_SUBST(GRAALUNIT_LIB)
])
###############################################################################
#
# Setup and check the Java Microbenchmark Harness
#
AC_DEFUN_ONCE([LIB_TESTS_SETUP_JMH],
[
AC_ARG_WITH(jmh, [AS_HELP_STRING([--with-jmh],
[Java Microbenchmark Harness for building the OpenJDK Microbenchmark Suite])])
AC_MSG_CHECKING([for jmh (Java Microbenchmark Harness)])
if test "x$with_jmh" = xno || test "x$with_jmh" = x; then
AC_MSG_RESULT([no, disabled])
elif test "x$with_jmh" = xyes; then
AC_MSG_RESULT([no, error])
AC_MSG_ERROR([--with-jmh requires a directory containing all jars needed by JMH])
else
# Path specified
JMH_HOME="$with_jmh"
if test ! -d [$JMH_HOME]; then
AC_MSG_RESULT([no, error])
AC_MSG_ERROR([$JMH_HOME does not exist or is not a directory])
fi
BASIC_FIXUP_PATH([JMH_HOME])
jar_names="jmh-core jmh-generator-annprocess jopt-simple commons-math3"
for jar in $jar_names; do
found_jar_files=$($ECHO $(ls $JMH_HOME/$jar-*.jar 2> /dev/null))
if test "x$found_jar_files" = x; then
AC_MSG_RESULT([no])
AC_MSG_ERROR([--with-jmh does not contain $jar-*.jar])
elif ! test -e "$found_jar_files"; then
AC_MSG_RESULT([no])
AC_MSG_ERROR([--with-jmh contain multiple $jar-*.jar: $found_jar_files])
fi
found_jar_var_name=found_${jar//-/_}
eval $found_jar_var_name='"'$found_jar_files'"'
done
AC_MSG_RESULT([yes])
JMH_CORE_JAR=$found_jmh_core
JMH_GENERATOR_JAR=$found_jmh_generator_annprocess
JMH_JOPT_SIMPLE_JAR=$found_jopt_simple
JMH_COMMONS_MATH_JAR=$found_commons_math3
if [ [[ "$JMH_CORE_JAR" =~ jmh-core-(.*)\.jar$ ]] ] ; then
JMH_VERSION=${BASH_REMATCH[[1]]}
else
JMH_VERSION=unknown
fi
AC_MSG_NOTICE([JMH core version: $JMH_VERSION])
fi
AC_SUBST(JMH_CORE_JAR)
AC_SUBST(JMH_GENERATOR_JAR)
AC_SUBST(JMH_JOPT_SIMPLE_JAR)
AC_SUBST(JMH_COMMONS_MATH_JAR)
AC_SUBST(JMH_VERSION)
])

View File

@ -1,5 +1,5 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2011, 2018, 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
@ -99,8 +99,14 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $SYSROOT_CFLAGS $X_CFLAGS"
HEADERS_TO_CHECK="X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h"
# There is no Xrandr extension on AIX
if test "x$OPENJDK_TARGET_OS" != xaix; then
HEADERS_TO_CHECK="$HEADERS_TO_CHECK X11/extensions/Xrandr.h"
fi
# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10
AC_CHECK_HEADERS([X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h],
AC_CHECK_HEADERS([$HEADERS_TO_CHECK],
[X11_HEADERS_OK=yes],
[X11_HEADERS_OK=no; break],
[
@ -111,7 +117,7 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
if test "x$X11_HEADERS_OK" = xno; then
HELP_MSG_MISSING_DEPENDENCY([x11])
AC_MSG_ERROR([Could not find all X11 headers (shape.h Xrender.h XTest.h Intrinsic.h). $HELP_MSG])
AC_MSG_ERROR([Could not find all X11 headers (shape.h Xrender.h Xrander.h XTest.h Intrinsic.h). $HELP_MSG])
fi
# If XLinearGradient isn't available in Xrender.h, signal that it needs to be

View File

@ -355,6 +355,12 @@ ENABLE_LIBFFI_BUNDLING:=@ENABLE_LIBFFI_BUNDLING@
LIBFFI_LIB_FILE:=@LIBFFI_LIB_FILE@
GRAALUNIT_LIB := @GRAALUNIT_LIB@
JMH_CORE_JAR := @JMH_CORE_JAR@
JMH_GENERATOR_JAR := @JMH_GENERATOR_JAR@
JMH_JOPT_SIMPLE_JAR := @JMH_JOPT_SIMPLE_JAR@
JMH_COMMONS_MATH_JAR := @JMH_COMMONS_MATH_JAR@
JMH_VERSION := @JMH_VERSION@
# Source file for cacerts
CACERTS_FILE=@CACERTS_FILE@

View File

@ -72,6 +72,9 @@ ALL_NAMED_TESTS += $(JTREG_TEST_GROUPS)
# Add Gtest
ALL_NAMED_TESTS += gtest
# Add microbenchmarks
ALL_NAMED_TESTS += micro
# Find make test targets
MAKE_TEST_TARGETS := $(shell $(MAKE) -s --no-print-directory $(MAKE_ARGS) \
SPEC=$(SPEC) -f $(TOPDIR)/test/make/TestMake.gmk print-targets)

View File

@ -43,6 +43,7 @@ FALSE_FIND_PATTERN:=-name FILE_NAME_THAT_DOESNT_EXIST
# For this to work, the source files must exist when the makefile is
# parsed.
# SRCS:=List of directories in where to find files to add to archive
# BIN:=Directory where to store build control files
# SUFFIXES:=File suffixes to include in jar
# INCLUDES:=List of directories/packages in SRCS that should be included
# EXCLUDES:=List of directories/packages in SRCS that should be excluded
@ -62,10 +63,11 @@ define SetupJarArchiveBody
$1_JARMAIN:=$(strip $$($1_JARMAIN))
$1_JARNAME:=$$(notdir $$($1_JAR))
$1_MANIFEST_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_manifest
$1_DELETESS_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletess
$1_DELETES_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletes
$1_BIN:=$$(dir $$($1_JAR))
$1_JAR_OUTPUT_DIR := $$(patsubst %/, %, $$(dir $$($1_JAR)))
$$(call SetIfEmpty, $1_BIN, $$($1_JAR_OUTPUT_DIR))
$1_MANIFEST_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_manifest
$1_DELETESS_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_deletess
$1_DELETES_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_deletes
$$(call SetIfEmpty, $1_JAR_CMD, $$(JAR))
ifeq (,$$($1_SUFFIXES))
@ -231,11 +233,12 @@ define SetupJarArchiveBody
$1_VARDEPS := $$($1_JAR_CMD) $$($1_JAR_CREATE_OPTIONS) $$($1_MANIFEST) \
$$($1_JARMAIN) $$($1_EXTRA_MANIFEST_ATTR) $$($1_ORIG_DEPS) $$($1_SRCS) \
$$($1_INCLUDES) $$($1_EXCLUDES) $$($1_EXCLUDE_FILES) $$($1_EXTRA_FILES)
$1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, $$(dir $$($1_JAR))_the.$$($1_JARNAME).vardeps)
$1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, $$($1_BIN)/_the.$$($1_JARNAME).vardeps)
# Here is the rule that creates/updates the jar file.
$$($1_JAR) : $$($1_DEPENDENCIES) $$($1_MANIFEST) $$($1_VARDEPS_FILE)
$$(call MakeTargetDir)
$$(call MakeDir, $$($1_BIN))
$$($1_GREP_INCLUDE_OUTPUT)
$$($1_GREP_EXCLUDE_OUTPUT)
# If the vardeps file is part of the newer prereq list, it means that

View File

@ -243,7 +243,7 @@ var getJibProfilesCommon = function (input, data) {
// These are the base setttings for all the main build profiles.
common.main_profile_base = {
dependencies: ["boot_jdk", "gnumake", "jtreg", "jib", "autoconf"],
dependencies: ["boot_jdk", "gnumake", "jtreg", "jib", "autoconf", "jmh"],
default_make_targets: ["product-bundles", "test-bundles"],
configure_args: concat(["--enable-jtreg-failure-handler"],
"--with-exclude-translations=de,es,fr,it,ko,pt_BR,sv,ca,tr,cs,sk,ja_JP_A,ja_JP_HA,ja_JP_HI,ja_JP_I,zh_TW,zh_HK",
@ -830,8 +830,8 @@ var getJibProfilesDependencies = function (input, common) {
solaris_x64: "SS12u4-Solaris11u1+1.0",
solaris_sparcv9: "SS12u6-Solaris11u3+1.0",
windows_x64: "VS2017-15.5.5+1.0",
linux_aarch64: "gcc7.3.0-Fedora27+1.0",
linux_arm: "gcc7.3.0-Fedora27+1.0"
linux_aarch64: "gcc7.3.0-Fedora27+1.1",
linux_arm: "gcc7.3.0-Fedora27+1.1"
};
var devkit_platform = (input.target_cpu == "x86"
@ -892,6 +892,12 @@ var getJibProfilesDependencies = function (input, common) {
environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
},
jmh: {
organization: common.organization,
ext: "tar.gz",
revision: "1.21+1.0"
},
gnumake: {
organization: common.organization,
ext: "tar.gz",

View File

@ -265,6 +265,54 @@ class CharacterData00 extends CharacterData {
case 0x13ED: mapChar = 0xABBD; break;
case 0x13EE: mapChar = 0xABBE; break;
case 0x13EF: mapChar = 0xABBF; break;
case 0x1C90: mapChar = 0x10D0; break;
case 0x1C91: mapChar = 0x10D1; break;
case 0x1C92: mapChar = 0x10D2; break;
case 0x1C93: mapChar = 0x10D3; break;
case 0x1C94: mapChar = 0x10D4; break;
case 0x1C95: mapChar = 0x10D5; break;
case 0x1C96: mapChar = 0x10D6; break;
case 0x1C97: mapChar = 0x10D7; break;
case 0x1C98: mapChar = 0x10D8; break;
case 0x1C99: mapChar = 0x10D9; break;
case 0x1C9A: mapChar = 0x10DA; break;
case 0x1C9B: mapChar = 0x10DB; break;
case 0x1C9C: mapChar = 0x10DC; break;
case 0x1C9D: mapChar = 0x10DD; break;
case 0x1C9E: mapChar = 0x10DE; break;
case 0x1C9F: mapChar = 0x10DF; break;
case 0x1CA0: mapChar = 0x10E0; break;
case 0x1CA1: mapChar = 0x10E1; break;
case 0x1CA2: mapChar = 0x10E2; break;
case 0x1CA3: mapChar = 0x10E3; break;
case 0x1CA4: mapChar = 0x10E4; break;
case 0x1CA5: mapChar = 0x10E5; break;
case 0x1CA6: mapChar = 0x10E6; break;
case 0x1CA7: mapChar = 0x10E7; break;
case 0x1CA8: mapChar = 0x10E8; break;
case 0x1CA9: mapChar = 0x10E9; break;
case 0x1CAA: mapChar = 0x10EA; break;
case 0x1CAB: mapChar = 0x10EB; break;
case 0x1CAC: mapChar = 0x10EC; break;
case 0x1CAD: mapChar = 0x10ED; break;
case 0x1CAE: mapChar = 0x10EE; break;
case 0x1CAF: mapChar = 0x10EF; break;
case 0x1CB0: mapChar = 0x10F0; break;
case 0x1CB1: mapChar = 0x10F1; break;
case 0x1CB2: mapChar = 0x10F2; break;
case 0x1CB3: mapChar = 0x10F3; break;
case 0x1CB4: mapChar = 0x10F4; break;
case 0x1CB5: mapChar = 0x10F5; break;
case 0x1CB6: mapChar = 0x10F6; break;
case 0x1CB7: mapChar = 0x10F7; break;
case 0x1CB8: mapChar = 0x10F8; break;
case 0x1CB9: mapChar = 0x10F9; break;
case 0x1CBA: mapChar = 0x10FA; break;
case 0x1CBB: mapChar = 0x10FB; break;
case 0x1CBC: mapChar = 0x10FC; break;
case 0x1CBD: mapChar = 0x10FD; break;
case 0x1CBE: mapChar = 0x10FE; break;
case 0x1CBF: mapChar = 0x10FF; break;
case 0x1E9E: mapChar = 0x00DF; break;
case 0x1F88: mapChar = 0x1F80; break;
case 0x1F89: mapChar = 0x1F81; break;
@ -355,6 +403,52 @@ class CharacterData00 extends CharacterData {
case 0x0287: mapChar = 0xA7B1; break;
case 0x029D: mapChar = 0xA7B2; break;
case 0x029E: mapChar = 0xA7B0; break;
case 0x10D0: mapChar = 0x1C90; break;
case 0x10D1: mapChar = 0x1C91; break;
case 0x10D2: mapChar = 0x1C92; break;
case 0x10D3: mapChar = 0x1C93; break;
case 0x10D4: mapChar = 0x1C94; break;
case 0x10D5: mapChar = 0x1C95; break;
case 0x10D6: mapChar = 0x1C96; break;
case 0x10D7: mapChar = 0x1C97; break;
case 0x10D8: mapChar = 0x1C98; break;
case 0x10D9: mapChar = 0x1C99; break;
case 0x10DA: mapChar = 0x1C9A; break;
case 0x10DB: mapChar = 0x1C9B; break;
case 0x10DC: mapChar = 0x1C9C; break;
case 0x10DD: mapChar = 0x1C9D; break;
case 0x10DE: mapChar = 0x1C9E; break;
case 0x10DF: mapChar = 0x1C9F; break;
case 0x10E0: mapChar = 0x1CA0; break;
case 0x10E1: mapChar = 0x1CA1; break;
case 0x10E2: mapChar = 0x1CA2; break;
case 0x10E3: mapChar = 0x1CA3; break;
case 0x10E4: mapChar = 0x1CA4; break;
case 0x10E5: mapChar = 0x1CA5; break;
case 0x10E6: mapChar = 0x1CA6; break;
case 0x10E7: mapChar = 0x1CA7; break;
case 0x10E8: mapChar = 0x1CA8; break;
case 0x10E9: mapChar = 0x1CA9; break;
case 0x10EA: mapChar = 0x1CAA; break;
case 0x10EB: mapChar = 0x1CAB; break;
case 0x10EC: mapChar = 0x1CAC; break;
case 0x10ED: mapChar = 0x1CAD; break;
case 0x10EE: mapChar = 0x1CAE; break;
case 0x10EF: mapChar = 0x1CAF; break;
case 0x10F0: mapChar = 0x1CB0; break;
case 0x10F1: mapChar = 0x1CB1; break;
case 0x10F2: mapChar = 0x1CB2; break;
case 0x10F3: mapChar = 0x1CB3; break;
case 0x10F4: mapChar = 0x1CB4; break;
case 0x10F5: mapChar = 0x1CB5; break;
case 0x10F6: mapChar = 0x1CB6; break;
case 0x10F7: mapChar = 0x1CB7; break;
case 0x10F8: mapChar = 0x1CB8; break;
case 0x10F9: mapChar = 0x1CB9; break;
case 0x10FA: mapChar = 0x1CBA; break;
case 0x10FD: mapChar = 0x1CBD; break;
case 0x10FE: mapChar = 0x1CBE; break;
case 0x10FF: mapChar = 0x1CBF; break;
case 0x1C80: mapChar = 0x0412; break;
case 0x1C81: mapChar = 0x0414; break;
case 0x1C82: mapChar = 0x041E; break;
@ -544,9 +638,16 @@ class CharacterData00 extends CharacterData {
mapChar = ch + 1;
}
else if ((val & $$maskLowerCase) == 0) {
// The character does not have a lowercase equivalent, so it must
// already be lowercase; so subtract 1 to get the titlecase form.
mapChar = ch - 1;
// For some Georgian letters, titlecase form is
// same as this character.
if(ch >= 0x10D0 && ch <= 0x10FF) {
mapChar = ch;
}
else {
// The character does not have a lowercase equivalent, so it must
// already be lowercase; so subtract 1 to get the titlecase form.
mapChar = ch - 1;
}
}
// else {
// The character has both an uppercase equivalent and a lowercase
@ -741,6 +842,52 @@ class CharacterData00 extends CharacterData {
case 0x0287: mapChar = 0xA7B1; break;
case 0x029D: mapChar = 0xA7B2; break;
case 0x029E: mapChar = 0xA7B0; break;
case 0x10D0: mapChar = 0x1C90; break;
case 0x10D1: mapChar = 0x1C91; break;
case 0x10D2: mapChar = 0x1C92; break;
case 0x10D3: mapChar = 0x1C93; break;
case 0x10D4: mapChar = 0x1C94; break;
case 0x10D5: mapChar = 0x1C95; break;
case 0x10D6: mapChar = 0x1C96; break;
case 0x10D7: mapChar = 0x1C97; break;
case 0x10D8: mapChar = 0x1C98; break;
case 0x10D9: mapChar = 0x1C99; break;
case 0x10DA: mapChar = 0x1C9A; break;
case 0x10DB: mapChar = 0x1C9B; break;
case 0x10DC: mapChar = 0x1C9C; break;
case 0x10DD: mapChar = 0x1C9D; break;
case 0x10DE: mapChar = 0x1C9E; break;
case 0x10DF: mapChar = 0x1C9F; break;
case 0x10E0: mapChar = 0x1CA0; break;
case 0x10E1: mapChar = 0x1CA1; break;
case 0x10E2: mapChar = 0x1CA2; break;
case 0x10E3: mapChar = 0x1CA3; break;
case 0x10E4: mapChar = 0x1CA4; break;
case 0x10E5: mapChar = 0x1CA5; break;
case 0x10E6: mapChar = 0x1CA6; break;
case 0x10E7: mapChar = 0x1CA7; break;
case 0x10E8: mapChar = 0x1CA8; break;
case 0x10E9: mapChar = 0x1CA9; break;
case 0x10EA: mapChar = 0x1CAA; break;
case 0x10EB: mapChar = 0x1CAB; break;
case 0x10EC: mapChar = 0x1CAC; break;
case 0x10ED: mapChar = 0x1CAD; break;
case 0x10EE: mapChar = 0x1CAE; break;
case 0x10EF: mapChar = 0x1CAF; break;
case 0x10F0: mapChar = 0x1CB0; break;
case 0x10F1: mapChar = 0x1CB1; break;
case 0x10F2: mapChar = 0x1CB2; break;
case 0x10F3: mapChar = 0x1CB3; break;
case 0x10F4: mapChar = 0x1CB4; break;
case 0x10F5: mapChar = 0x1CB5; break;
case 0x10F6: mapChar = 0x1CB6; break;
case 0x10F7: mapChar = 0x1CB7; break;
case 0x10F8: mapChar = 0x1CB8; break;
case 0x10F9: mapChar = 0x1CB9; break;
case 0x10FA: mapChar = 0x1CBA; break;
case 0x10FD: mapChar = 0x1CBD; break;
case 0x10FE: mapChar = 0x1CBE; break;
case 0x10FF: mapChar = 0x1CBF; break;
case 0x1C80: mapChar = 0x0412; break;
case 0x1C81: mapChar = 0x0414; break;
case 0x1C82: mapChar = 0x041E; break;

View File

@ -364,6 +364,8 @@ class CharacterData01 extends CharacterData {
case 0x10E78: retval = 700; break; // RUMI NUMBER SEVEN HUNDRED
case 0x10E79: retval = 800; break; // RUMI NUMBER EIGHT HUNDRED
case 0x10E7A: retval = 900; break; // RUMI NUMBER NINE HUNDRED
case 0x10F25: retval = 100; break; // OLD SOGDIAN NUMBER ONE HUNDRED
case 0x10F54: retval = 100; break; // SOGDIAN NUMBER ONE HUNDRED
case 0x1105E: retval = 40; break; // BRAHMI NUMBER FORTY
case 0x1105F: retval = 50; break; // BRAHMI NUMBER FIFTY
case 0x11060: retval = 60; break; // BRAHMI NUMBER SIXTY
@ -407,6 +409,46 @@ class CharacterData01 extends CharacterData {
case 0x1D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN
case 0x1D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT
case 0x1D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE
case 0x1EC7D: retval = 40; break; // INDIC SIYAQ NUMBER FORTY
case 0x1EC7E: retval = 50; break; // INDIC SIYAQ NUMBER FIFTY
case 0x1EC7F: retval = 60; break; // INDIC SIYAQ NUMBER SIXTY
case 0X1EC80: retval = 70; break; // INDIC SIYAQ NUMBER SEVENTY
case 0X1EC81: retval = 80; break; // INDIC SIYAQ NUMBER EIGHTY
case 0X1EC82: retval = 90; break; // INDIC SIYAQ NUMBER NINETY
case 0X1EC83: retval = 100; break; // INDIC SIYAQ NUMBER ONE HUNDRED
case 0X1EC84: retval = 200; break; // INDIC SIYAQ NUMBER TWO HUNDRED
case 0X1EC85: retval = 300; break; // INDIC SIYAQ NUMBER THREE HUNDRED
case 0X1EC86: retval = 400; break; // INDIC SIYAQ NUMBER FOUR HUNDRED
case 0X1EC87: retval = 500; break; // INDIC SIYAQ NUMBER FIVE HUNDRED
case 0X1EC88: retval = 600; break; // INDIC SIYAQ NUMBER SIX HUNDRED
case 0X1EC89: retval = 700; break; // INDIC SIYAQ NUMBER SEVEN HUNDRED
case 0X1EC8A: retval = 800; break; // INDIC SIYAQ NUMBER EIGHT HUNDRED
case 0X1EC8B: retval = 900; break; // INDIC SIYAQ NUMBER NINE HUNDRED
case 0X1EC8C: retval = 1000; break; // INDIC SIYAQ NUMBER ONE THOUSAND
case 0X1EC8D: retval = 2000; break; // INDIC SIYAQ NUMBER TWO THOUSAND
case 0X1EC8E: retval = 3000; break; // INDIC SIYAQ NUMBER THREE THOUSAND
case 0X1EC8F: retval = 4000; break; // INDIC SIYAQ NUMBER FOUR THOUSAND
case 0X1EC90: retval = 5000; break; // INDIC SIYAQ NUMBER FIVE THOUSAND
case 0X1EC91: retval = 6000; break; // INDIC SIYAQ NUMBER SIX THOUSAND
case 0X1EC92: retval = 7000; break; // INDIC SIYAQ NUMBER SEVEN THOUSAND
case 0X1EC93: retval = 8000; break; // INDIC SIYAQ NUMBER EIGHT THOUSAND
case 0X1EC94: retval = 9000; break; // INDIC SIYAQ NUMBER NINE THOUSAND
case 0X1EC95: retval = 10000; break; // INDIC SIYAQ NUMBER TEN THOUSAND
case 0X1EC96: retval = 20000; break; // INDIC SIYAQ NUMBER TWENTY THOUSAND
case 0X1EC97: retval = 30000; break; // INDIC SIYAQ NUMBER THIRTY THOUSAND
case 0X1EC98: retval = 40000; break; // INDIC SIYAQ NUMBER FORTY THOUSAND
case 0X1EC99: retval = 50000; break; // INDIC SIYAQ NUMBER FIFTY THOUSAND
case 0X1EC9A: retval = 60000; break; // INDIC SIYAQ NUMBER SIXTY THOUSAND
case 0X1EC9B: retval = 70000; break; // INDIC SIYAQ NUMBER SEVENTY THOUSAND
case 0X1EC9C: retval = 80000; break; // INDIC SIYAQ NUMBER EIGHTY THOUSAND
case 0X1EC9D: retval = 90000; break; // INDIC SIYAQ NUMBER NINETY THOUSAND
case 0X1EC9E: retval = 100000; break; // INDIC SIYAQ NUMBER LAKH
case 0X1EC9F: retval = 200000; break; // INDIC SIYAQ NUMBER LAKHAN
case 0X1ECA0: retval = 100000; break; // INDIC SIYAQ LAKH MARK
case 0X1ECA1: retval = 10000000; break; // INDIC SIYAQ NUMBER KAROR
case 0X1ECA2: retval = 20000000; break; // INDIC SIYAQ NUMBER KARORAN
case 0X1ECB3: retval = 10000; break; // INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND
case 0X1ECB4: retval = 100000; break; // INDIC SIYAQ NUMBER ALTERNATE LAKH MARK
default: retval = -2; break;
}

View File

@ -1,6 +1,6 @@
# PropList-10.0.0.txt
# Date: 2017-03-10, 08:25:30 GMT
# Copyright (c) 2017 Unicode, Inc.
# PropList-11.0.0.txt
# Date: 2018-03-15, 04:28:35 GMT
# Copyright (c) 2018 Unicode, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@ -125,7 +125,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
060C ; Terminal_Punctuation # Po ARABIC COMMA
061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK
061E..061F ; Terminal_Punctuation # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
@ -156,6 +156,8 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK
2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP
2E41 ; Terminal_Punctuation # Po REVERSED COMMA
2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA
2E4E ; Terminal_Punctuation # Po PUNCTUS ELEVATUS MARK
3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK
@ -185,6 +187,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
10AF0..10AF5 ; Terminal_Punctuation # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS
10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION
10B99..10B9C ; Terminal_Punctuation # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
10F55..10F59 ; Terminal_Punctuation # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
@ -204,15 +207,17 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
11AA1..11AA2 ; Terminal_Punctuation # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2
11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR
11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD
11EF7..11EF8 ; Terminal_Punctuation # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA
16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP
16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM
16B44 ; Terminal_Punctuation # Po PAHAWH HMONG SIGN XAUS
16E97..16E98 ; Terminal_Punctuation # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP
1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON
# Total code points: 252
# Total code points: 264
# ================================================
@ -661,6 +666,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
10D24..10D27 ; Other_Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU
11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA
11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA
@ -673,6 +679,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E
1112D..11132 ; Other_Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK
11145..11146 ; Other_Alphabetic # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
11180..11181 ; Other_Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA
111B3..111B5 ; Other_Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
@ -730,9 +737,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E
11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM
11A01..11A06 ; Other_Alphabetic # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
11A07..11A08 ; Other_Alphabetic # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
11A09..11A0A ; Other_Alphabetic # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
1182C..1182E ; Other_Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
1182F..11837 ; Other_Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
11838 ; Other_Alphabetic # Mc DOGRA SIGN VISARGA
11A01..11A0A ; Other_Alphabetic # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA
11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA
11A3B..11A3E ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
@ -758,6 +766,13 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA
11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA
11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA
11D8A..11D8E ; Other_Alphabetic # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
11D90..11D91 ; Other_Alphabetic # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
11D93..11D94 ; Other_Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
11D95 ; Other_Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA
11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA
11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
16B30..16B36 ; Other_Alphabetic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
16F51..16F7E ; Other_Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK
@ -771,7 +786,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
# Total code points: 1300
# Total code points: 1334
# ================================================
@ -780,10 +795,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
4E00..9FEA ; Ideographic # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
4E00..9FEF ; Ideographic # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
17000..187EC ; Ideographic # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
17000..187F1 ; Ideographic # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1
18800..18AF2 ; Ideographic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
@ -793,7 +808,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
# Total code points: 96174
# Total code points: 96184
# ================================================
@ -953,6 +968,9 @@ FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFW
FFE3 ; Diacritic # Sk FULLWIDTH MACRON
102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK
10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA
10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA
11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA
@ -973,12 +991,14 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA
116B7 ; Diacritic # Mn TAKRI SIGN NUKTA
1172B ; Diacritic # Mn AHOM SIGN KILLER
11839..1183A ; Diacritic # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA
11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER
11A99 ; Diacritic # Mn SOYOMBO SUBJOINER
11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA
11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA
11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
11D97 ; Diacritic # Mn GUNJALA GONDI VIRAMA
16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8
@ -991,7 +1011,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA
# Total code points: 798
# Total code points: 818
# ================================================
@ -1137,7 +1157,7 @@ E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG
# ================================================
3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
4E00..9FEA ; Unified_Ideograph # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
4E00..9FEF ; Unified_Ideograph # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
@ -1151,7 +1171,7 @@ FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..C
2B820..2CEA1 ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
# Total code points: 87882
# Total code points: 87887
# ================================================
@ -1255,10 +1275,13 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET
002E ; Sentence_Terminal # Po FULL STOP
003F ; Sentence_Terminal # Po QUESTION MARK
0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP
061F ; Sentence_Terminal # Po ARABIC QUESTION MARK
061E..061F ; Sentence_Terminal # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
06D4 ; Sentence_Terminal # Po ARABIC FULL STOP
0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK
0837 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION MELODIC QITSA
0839 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION QITSA
083D..083E ; Sentence_Terminal # Po [2] SAMARITAN PUNCTUATION SOF MASHFAAT..SAMARITAN PUNCTUATION ANNAAU
0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP
@ -1296,6 +1319,7 @@ FF0E ; Sentence_Terminal # Po FULLWIDTH FULL STOP
FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK
FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA
10F55..10F59 ; Sentence_Terminal # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA
110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
@ -1313,14 +1337,16 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
11A42..11A43 ; Sentence_Terminal # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD
11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD
11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA
11EF7..11EF8 ; Sentence_Terminal # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA
16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP
16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB
16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS
16E98 ; Sentence_Terminal # Po MEDEFAIDRIN FULL STOP
1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP
# Total code points: 128
# Total code points: 141
# ================================================
@ -1521,14 +1547,10 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
2B74..2B75 ; Pattern_Syntax # Cn [2] <reserved-2B74>..<reserved-2B75>
2B76..2B95 ; Pattern_Syntax # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
2B96..2B97 ; Pattern_Syntax # Cn [2] <reserved-2B96>..<reserved-2B97>
2B98..2BB9 ; Pattern_Syntax # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
2BBA..2BBC ; Pattern_Syntax # Cn [3] <reserved-2BBA>..<reserved-2BBC>
2BBD..2BC8 ; Pattern_Syntax # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
2B98..2BC8 ; Pattern_Syntax # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
2BC9 ; Pattern_Syntax # Cn <reserved-2BC9>
2BCA..2BD2 ; Pattern_Syntax # So [9] TOP HALF BLACK CIRCLE..GROUP MARK
2BD3..2BEB ; Pattern_Syntax # Cn [25] <reserved-2BD3>..<reserved-2BEB>
2BEC..2BEF ; Pattern_Syntax # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
2BF0..2BFF ; Pattern_Syntax # Cn [16] <reserved-2BF0>..<reserved-2BFF>
2BCA..2BFE ; Pattern_Syntax # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
2BFF ; Pattern_Syntax # Cn <reserved-2BFF>
2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET
@ -1566,8 +1588,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN
2E41 ; Pattern_Syntax # Po REVERSED COMMA
2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
2E43..2E49 ; Pattern_Syntax # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
2E4A..2E7F ; Pattern_Syntax # Cn [54] <reserved-2E4A>..<reserved-2E7F>
2E43..2E4E ; Pattern_Syntax # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
2E4F..2E7F ; Pattern_Syntax # Cn [49] <reserved-2E4F>..<reserved-2E7F>
3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET
@ -1606,8 +1628,9 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT
070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK
08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH
110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN
110CD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN ABOVE
# Total code points: 10
# Total code points: 11
# ================================================

View File

@ -1,6 +1,6 @@
# Scripts-10.0.0.txt
# Date: 2017-03-11, 06:40:37 GMT
# Copyright (c) 2017 Unicode, Inc.
# Scripts-11.0.0.txt
# Date: 2018-02-21, 05:34:31 GMT
# Copyright (c) 2018 Unicode, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@ -308,10 +308,8 @@
2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
2B4D..2B73 ; Common # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR
2B76..2B95 ; Common # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
2B98..2BB9 ; Common # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
2BBD..2BC8 ; Common # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
2BCA..2BD2 ; Common # So [9] TOP HALF BLACK CIRCLE..GROUP MARK
2BEC..2BEF ; Common # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
2B98..2BC8 ; Common # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
2BCA..2BFE ; Common # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET
2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET
@ -349,7 +347,7 @@
2E40 ; Common # Pd DOUBLE HYPHEN
2E41 ; Common # Po REVERSED COMMA
2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
2E43..2E49 ; Common # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
2E43..2E4E ; Common # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
3000 ; Common # Zs IDEOGRAPHIC SPACE
3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
@ -522,8 +520,9 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
1D1AE..1D1E8 ; Common # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN
1D2E0..1D2F3 ; Common # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
1D360..1D371 ; Common # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
1D360..1D378 ; Common # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
@ -565,6 +564,11 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
1EC71..1ECAB ; Common # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE
1ECAC ; Common # So INDIC SIYAQ PLACEHOLDER
1ECAD..1ECAF ; Common # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS
1ECB0 ; Common # Sc INDIC SIYAQ RUPEE MARK
1ECB1..1ECB4 ; Common # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK
1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
1F0A0..1F0AE ; Common # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES
@ -572,8 +576,7 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
1F0C1..1F0CF ; Common # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER
1F0D1..1F0F5 ; Common # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21
1F100..1F10C ; Common # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
1F110..1F12E ; Common # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ
1F130..1F16B ; Common # So [60] SQUARED LATIN CAPITAL LETTER A..RAISED MD SIGN
1F110..1F16B ; Common # So [92] PARENTHESIZED LATIN CAPITAL LETTER A..RAISED MD SIGN
1F170..1F1AC ; Common # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD
1F1E6..1F1FF ; Common # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
1F201..1F202 ; Common # So [2] SQUARED KATAKANA KOKO..SQUARED KATAKANA SA
@ -585,9 +588,9 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
1F400..1F6D4 ; Common # So [725] RAT..PAGODA
1F6E0..1F6EC ; Common # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING
1F6F0..1F6F8 ; Common # So [9] SATELLITE..FLYING SAUCER
1F6F0..1F6F9 ; Common # So [10] SATELLITE..SKATEBOARD
1F700..1F773 ; Common # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
1F780..1F7D4 ; Common # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
1F780..1F7D8 ; Common # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
1F810..1F847 ; Common # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW
@ -595,15 +598,18 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS
1F900..1F90B ; Common # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
1F910..1F93E ; Common # So [47] ZIPPER-MOUTH FACE..HANDBALL
1F940..1F94C ; Common # So [13] WILTED FLOWER..CURLING STONE
1F950..1F96B ; Common # So [28] CROISSANT..CANNED FOOD
1F980..1F997 ; Common # So [24] CRAB..CRICKET
1F9C0 ; Common # So CHEESE WEDGE
1F9D0..1F9E6 ; Common # So [23] FACE WITH MONOCLE..SOCKS
1F940..1F970 ; Common # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS
1F973..1F976 ; Common # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE
1F97A ; Common # So FACE WITH PLEADING EYES
1F97C..1F9A2 ; Common # So [39] LAB COAT..SWAN
1F9B0..1F9B9 ; Common # So [10] EMOJI COMPONENT RED HAIR..SUPERVILLAIN
1F9C0..1F9C2 ; Common # So [3] CHEESE WEDGE..SALT SHAKER
1F9D0..1F9FF ; Common # So [48] FACE WITH MONOCLE..NAZAR AMULET
1FA60..1FA6D ; Common # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
E0001 ; Common # Cf LANGUAGE TAG
E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG
# Total code points: 7363
# Total code points: 7591
# ================================================
@ -646,8 +652,7 @@ A770 ; Latin # Lm MODIFIER LETTER US
A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
A78B..A78E ; Latin # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT
A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT
A790..A7AE ; Latin # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I
A7B0..A7B7 ; Latin # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA
A790..A7B9 ; Latin # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE
A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I
A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
A7FA ; Latin # L& LATIN LETTER SMALL CAPITAL TURNED M
@ -659,7 +664,7 @@ FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE S
FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
# Total code points: 1350
# Total code points: 1353
# ================================================
@ -753,13 +758,13 @@ FE2E..FE2F ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBININ
0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
0560..0588 ; Armenian # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE
058A ; Armenian # Pd ARMENIAN HYPHEN
058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
058F ; Armenian # Sc ARMENIAN DRAM SIGN
FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
# Total code points: 93
# Total code points: 95
# ================================================
@ -773,7 +778,7 @@ FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SM
05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA
05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN
05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
05EF..05F2 ; Hebrew # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD
05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ
FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA
@ -786,7 +791,7 @@ FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER S
FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
# Total code points: 133
# Total code points: 134
# ================================================
@ -823,7 +828,7 @@ FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU
0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
08A0..08B4 ; Arabic # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW
08B6..08BD ; Arabic # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON
08D4..08E1 ; Arabic # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
08D3..08E1 ; Arabic # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA
08E3..08FF ; Arabic # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA
FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
FBB2..FBC1 ; Arabic # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW
@ -871,7 +876,7 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
# Total code points: 1280
# Total code points: 1281
# ================================================
@ -921,9 +926,10 @@ A8F2..A8F7 ; Devanagari # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVAN
A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE
A8FC ; Devanagari # Po DEVANAGARI SIGN SIDDHAM
A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
A8FD..A8FE ; Devanagari # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY
A8FF ; Devanagari # Mn DEVANAGARI VOWEL SIGN AY
# Total code points: 154
# Total code points: 156
# ================================================
@ -956,8 +962,9 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
09FB ; Bengali # Sc BENGALI GANDA MARK
09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA
09FD ; Bengali # Po BENGALI ABBREVIATION SIGN
09FE ; Bengali # Mn BENGALI SANDHI MARK
# Total code points: 95
# Total code points: 96
# ================================================
@ -982,8 +989,9 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH
0A76 ; Gurmukhi # Po GURMUKHI ABBREVIATION SIGN
# Total code points: 79
# Total code points: 80
# ================================================
@ -1078,6 +1086,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
0C00 ; Telugu # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
0C04 ; Telugu # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE
0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
@ -1095,13 +1104,14 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
0C7F ; Telugu # So TELUGU SIGN TUUMU
# Total code points: 96
# Total code points: 97
# ================================================
0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU
0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU
0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
0C84 ; Kannada # Po KANNADA SIGN SIDDHAM
0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
@ -1123,7 +1133,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
# Total code points: 88
# Total code points: 89
# ================================================
@ -1317,14 +1327,16 @@ AA7E..AA7F ; Myanmar # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETT
10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN
10CD ; Georgian # L& GEORGIAN CAPITAL LETTER AEN
10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
10D0..10FA ; Georgian # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR
10FD..10FF ; Georgian # Lo [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
10FD..10FF ; Georgian # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
1C90..1CBA ; Georgian # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN
1CBD..1CBF ; Georgian # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN
2D2D ; Georgian # L& GEORGIAN SMALL LETTER AEN
# Total code points: 127
# Total code points: 173
# ================================================
@ -1453,7 +1465,7 @@ AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT
1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
1844..1878 ; Mongolian # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS
1880..1884 ; Mongolian # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
1885..1886 ; Mongolian # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
1887..18A8 ; Mongolian # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA
@ -1461,7 +1473,7 @@ AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT
18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
11660..1166C ; Mongolian # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT
# Total code points: 166
# Total code points: 167
# ================================================
@ -1490,10 +1502,10 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK
# ================================================
02EA..02EB ; Bopomofo # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK
3105..312E ; Bopomofo # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE
3105..312F ; Bopomofo # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN
31A0..31BA ; Bopomofo # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY
# Total code points: 71
# Total code points: 72
# ================================================
@ -1506,7 +1518,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK
3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
4E00..9FEA ; Han # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
4E00..9FEF ; Han # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
F900..FA6D ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
@ -1516,7 +1528,7 @@ FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILI
2CEB0..2EBE0 ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
# Total code points: 89228
# Total code points: 89233
# ================================================
@ -1579,13 +1591,14 @@ FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON BELOW
101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
102E0 ; Inherited # Mn COPTIC EPACT THOUSANDS MARK
1133B ; Inherited # Mn COMBINING BINDU BELOW
1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
# Total code points: 568
# Total code points: 569
# ================================================
@ -1778,13 +1791,13 @@ A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI
10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
10A19..10A35 ; Kharoshthi # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA
10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA
10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
10A40..10A48 ; Kharoshthi # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF
10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
# Total code points: 65
# Total code points: 68
# ================================================
@ -1841,8 +1854,10 @@ A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOU
07F6 ; Nko # So NKO SYMBOL OO DENNEN
07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
07FA ; Nko # Lm NKO LAJANYALAN
07FD ; Nko # Mn NKO DANTAYALAN
07FE..07FF ; Nko # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN
# Total code points: 59
# Total code points: 62
# ================================================
@ -2137,8 +2152,9 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
110BD ; Kaithi # Cf KAITHI NUMBER SIGN
110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
110CD ; Kaithi # Cf KAITHI NUMBER SIGN ABOVE
# Total code points: 66
# Total code points: 67
# ================================================
@ -2186,8 +2202,10 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
1112D..11134 ; Chakma # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
11140..11143 ; Chakma # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK
11144 ; Chakma # Lo CHAKMA LETTER LHAA
11145..11146 ; Chakma # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
# Total code points: 67
# Total code points: 70
# ================================================
@ -2224,8 +2242,8 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
111B6..111BE ; Sharada # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
111BF..111C0 ; Sharada # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM
111C5..111C9 ; Sharada # Po [5] SHARADA DANDA..SHARADA SANDHI MARK
111CA..111CC ; Sharada # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
111C5..111C8 ; Sharada # Po [4] SHARADA DANDA..SHARADA SEPARATOR
111C9..111CC ; Sharada # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
111CD ; Sharada # Po SHARADA SUTRA MARK
111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
111DA ; Sharada # Lo SHARADA EKAM
@ -2502,7 +2520,7 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
# ================================================
11700..11719 ; Ahom # Lo [26] AHOM LETTER KA..AHOM LETTER JHA
11700..1171A ; Ahom # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA
1171D..1171F ; Ahom # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
11720..11721 ; Ahom # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
11722..11725 ; Ahom # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
@ -2513,7 +2531,7 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
1173C..1173E ; Ahom # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI
1173F ; Ahom # So AHOM SYMBOL VI
# Total code points: 57
# Total code points: 58
# ================================================
@ -2618,8 +2636,9 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE
1145B ; Newa # Po NEWA PLACEHOLDER MARK
1145D ; Newa # Po NEWA INSERTION SIGN
1145E ; Newa # Mn NEWA SANDHI MARK
# Total code points: 92
# Total code points: 93
# ================================================
@ -2631,10 +2650,10 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
# ================================================
16FE0 ; Tangut # Lm TANGUT ITERATION MARK
17000..187EC ; Tangut # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
17000..187F1 ; Tangut # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1
18800..18AF2 ; Tangut # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
# Total code points: 6881
# Total code points: 6886
# ================================================
@ -2670,16 +2689,15 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA
11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
11A9D ; Soyombo # Lo SOYOMBO MARK PLUTA
11A9E..11AA2 ; Soyombo # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
# Total code points: 80
# Total code points: 81
# ================================================
11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A
11A01..11A06 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
11A07..11A08 ; Zanabazar_Square # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
11A09..11A0A ; Zanabazar_Square # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
11A01..11A0A ; Zanabazar_Square # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA
11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA
@ -2690,4 +2708,73 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
# Total code points: 72
# ================================================
11800..1182B ; Dogra # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA
1182C..1182E ; Dogra # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
1182F..11837 ; Dogra # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
11838 ; Dogra # Mc DOGRA SIGN VISARGA
11839..1183A ; Dogra # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
1183B ; Dogra # Po DOGRA ABBREVIATION SIGN
# Total code points: 60
# ================================================
11D60..11D65 ; Gunjala_Gondi # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU
11D67..11D68 ; Gunjala_Gondi # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI
11D6A..11D89 ; Gunjala_Gondi # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
11D8A..11D8E ; Gunjala_Gondi # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
11D90..11D91 ; Gunjala_Gondi # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
11D93..11D94 ; Gunjala_Gondi # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
11D95 ; Gunjala_Gondi # Mn GUNJALA GONDI SIGN ANUSVARA
11D96 ; Gunjala_Gondi # Mc GUNJALA GONDI SIGN VISARGA
11D97 ; Gunjala_Gondi # Mn GUNJALA GONDI VIRAMA
11D98 ; Gunjala_Gondi # Lo GUNJALA GONDI OM
11DA0..11DA9 ; Gunjala_Gondi # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
# Total code points: 63
# ================================================
11EE0..11EF2 ; Makasar # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA
11EF3..11EF4 ; Makasar # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
11EF5..11EF6 ; Makasar # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
11EF7..11EF8 ; Makasar # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
# Total code points: 25
# ================================================
16E40..16E7F ; Medefaidrin # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y
16E80..16E96 ; Medefaidrin # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM
16E97..16E9A ; Medefaidrin # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH
# Total code points: 91
# ================================================
10D00..10D23 ; Hanifi_Rohingya # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA
10D24..10D27 ; Hanifi_Rohingya # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
10D30..10D39 ; Hanifi_Rohingya # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE
# Total code points: 50
# ================================================
10F30..10F45 ; Sogdian # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN
10F46..10F50 ; Sogdian # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
10F51..10F54 ; Sogdian # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED
10F55..10F59 ; Sogdian # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
# Total code points: 42
# ================================================
10F00..10F1C ; Old_Sogdian # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
10F1D..10F26 ; Old_Sogdian # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
10F27 ; Old_Sogdian # Lo OLD SOGDIAN LIGATURE AYIN-DALETH
# Total code points: 40
# EOF

View File

@ -1,6 +1,6 @@
# SpecialCasing-10.0.0.txt
# Date: 2017-04-14, 05:40:43 GMT
# Copyright (c) 2017 Unicode, Inc.
# SpecialCasing-11.0.0.txt
# Date: 2018-02-22, 06:16:47 GMT
# Copyright (c) 2018 Unicode, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@ -121,7 +121,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
# The following cases are already in the UnicodeData.txt file, so are only commented here.
# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI
# 0345; 0345; 0399; 0399; # COMBINING GREEK YPOGEGRAMMENI
# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
# have special uppercases.

File diff suppressed because it is too large Load Diff

View File

@ -1 +1 @@
10.0.0
11.0.0

View File

@ -41,9 +41,12 @@
# To build the full set of crosstools for additional platforms, use a command
# line looking like this:
#
# make cross_compile_target="aarch64-linux-gnu" BASE_OS=Fedora27
# make TARGETS="aarch64-linux-gnu" BASE_OS=Fedora
# or
# make cross_compile_target="arm-linux-gnueabihf" BASE_OS=Fedora27
# make TARGETS="arm-linux-gnueabihf ppc64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=17
#
# to build several devkits for a specific OS version at once.
# You can find the final results under ../../build/devkit/result/<host>-to-<target>
#
# This is the makefile which iterates over all host and target platforms.
#
@ -52,18 +55,18 @@ os := $(shell uname -o)
cpu := $(shell uname -p)
# Figure out what platform this is building on.
me := $(cpu)-$(if $(findstring Linux,$(os)),unknown-linux-gnu)
me := $(cpu)-$(if $(findstring Linux,$(os)),linux-gnu)
$(info Building on platform $(me))
#
# By default just build for the current platform, which is assumed to be Linux
#
ifeq ($(cross_compile_target), )
ifeq ($(TARGETS), )
platforms := $(me)
host_platforms := $(platforms)
else
platforms := $(cross_compile_target)
platforms := $(TARGETS)
host_platforms := $(me)
endif
target_platforms := $(platforms)
@ -79,37 +82,37 @@ endif
OUTPUT_ROOT = $(abspath ../../build/devkit)
RESULT = $(OUTPUT_ROOT)/result
submakevars = HOST=$@ BUILD=$(me) \
RESULT=$(RESULT) PREFIX=$(RESULT)/$@ \
OUTPUT_ROOT=$(OUTPUT_ROOT)
submakevars = HOST=$@ BUILD=$(me) RESULT=$(RESULT) OUTPUT_ROOT=$(OUTPUT_ROOT)
$(host_platforms) :
@echo 'Building compilers for $@'
@echo 'Targets: $(target_platforms)'
for p in $(filter $@, $(target_platforms)) $(filter-out $@, $(target_platforms)); do \
$(MAKE) -f Tools.gmk download-rpms $(submakevars) TARGET=$$p && \
$(MAKE) -f Tools.gmk download-rpms $(submakevars) \
TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \
$(MAKE) -f Tools.gmk all $(submakevars) \
TARGET=$$p || exit 1 ; \
TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \
$(MAKE) -f Tools.gmk ccache $(submakevars) \
TARGET=$@ PREFIX=$(RESULT)/$@-to-$$p BUILDDIR=$(OUTPUT_ROOT)/$@/$$p || exit 1 ; \
done
@echo 'Building ccache program for $@'
$(MAKE) -f Tools.gmk ccache $(submakevars) TARGET=$@
@echo 'All done"'
today := $(shell date +%Y%m%d)
define Mktar
$(1)_tar = $$(RESULT)/sdk-$(1)-$$(today).tar.gz
$$($(1)_tar) : PLATFORM = $(1)
TARFILES += $$($(1)_tar)
$$($(1)_tar) : $(1) $$(shell find $$(RESULT)/$(1))
$(1)-to-$(2)_tar = $$(RESULT)/sdk-$(1)-to-$(2)-$$(today).tar.gz
$$($(1)-to-$(2)_tar) : PLATFORM = $(1)-to-$(2)
TARFILES += $$($(1)-to-$(2)_tar)
$$($(1)-to-$(2)_tar) : $$(shell find $$(RESULT)/$(1)-to-$(2) -type f)
endef
$(foreach p,$(host_platforms),$(eval $(call Mktar,$(p))))
$(foreach p,$(host_platforms),$(foreach t,$(target_platforms),$(eval $(call Mktar,$(p),$(t)))))
tars : all $(TARFILES)
onlytars : $(TARFILES)
%.tar.gz :
@echo 'Creating compiler package $@'
cd $(RESULT)/$(PLATFORM) && tar -czf $@ *
cd $(RESULT) && tar -czf $@ $(PLATFORM)/*
touch $@
clean :

View File

@ -52,16 +52,25 @@ endif
$(info ARCH=$(ARCH))
ifeq ($(BASE_OS), OEL6)
OEL_URL := http://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/
BASE_URL := http://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/
LINUX_VERSION := OEL6.4
else ifeq ($(BASE_OS), Fedora27)
ifeq ($(ARCH), aarch64)
FEDORA_TYPE=fedora-secondary
else
FEDORA_TYPE=fedora/linux
else ifeq ($(BASE_OS), Fedora)
DEFAULT_OS_VERSION := 27
ifeq ($(BASE_OS_VERSION), )
BASE_OS_VERSION := $(DEFAULT_OS_VERSION)
endif
OEL_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/27/Everything/$(ARCH)/os/Packages/
LINUX_VERSION := Fedora 27
ifeq ($(filter x86_64 armhfp, $(ARCH)), )
FEDORA_TYPE := fedora-secondary
else
FEDORA_TYPE := fedora/linux
endif
ARCHIVED := $(shell [ $(BASE_OS_VERSION) -lt $(DEFAULT_OS_VERSION) ] && echo true)
ifeq ($(ARCHIVED),true)
BASE_URL := https://archives.fedoraproject.org/pub/archive/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/
else
BASE_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/
endif
LINUX_VERSION := Fedora_$(BASE_OS_VERSION)
else
$(error Unknown base OS $(BASE_OS))
endif
@ -137,13 +146,11 @@ else
endif
# Define directories
RESULT := $(OUTPUT_ROOT)/result
BUILDDIR := $(OUTPUT_ROOT)/$(HOST)/$(TARGET)
PREFIX := $(RESULT)/$(HOST)
TARGETDIR := $(PREFIX)/$(TARGET)
SYSROOT := $(TARGETDIR)/sysroot
DOWNLOAD := $(OUTPUT_ROOT)/download
DOWNLOAD_RPMS := $(DOWNLOAD)/rpms
DOWNLOAD_RPMS := $(DOWNLOAD)/rpms/$(TARGET)-$(LINUX_VERSION)
SRCDIR := $(OUTPUT_ROOT)/src
# Marker file for unpacking rpms
@ -159,7 +166,7 @@ download-rpms:
# Only run this if rpm dir is empty.
ifeq ($(wildcard $(DOWNLOAD_RPMS)/*.rpm), )
cd $(DOWNLOAD_RPMS) && \
wget -r -np -nd $(patsubst %, -A "*%*.rpm", $(RPM_LIST)) $(OEL_URL)
wget -r -np -nd $(patsubst %, -A "*%*.rpm", $(RPM_LIST)) $(BASE_URL)
endif
##########################################################################################
@ -190,8 +197,8 @@ $(foreach p,GCC BINUTILS CCACHE MPFR GMP MPC GDB,$(eval $(call Download,$(p))))
##########################################################################################
# Unpack RPMS
RPM_ARCHS := $(ARCH) noarch
ifeq ($(ARCH),x86_64)
RPM_ARCHS := x86_64 noarch
ifeq ($(BUILD),$(HOST))
ifeq ($(TARGET),$(HOST))
# When building the native compiler for x86_64, enable mixed mode.
@ -199,11 +206,9 @@ ifeq ($(ARCH),x86_64)
endif
endif
else ifeq ($(ARCH),i686)
RPM_ARCHS := i386 i686 noarch
RPM_ARCHS += i386
else ifeq ($(ARCH), armhfp)
RPM_ARCHS := $(ARCH) armv7hl noarch
else
RPM_ARCHS := $(ARCH) noarch
RPM_ARCHS += armv7hl
endif
RPM_FILE_LIST := $(sort $(foreach a, $(RPM_ARCHS), \
@ -277,7 +282,7 @@ CONFIG = --target=$(TARGET) \
--host=$(HOST) --build=$(BUILD) \
--prefix=$(PREFIX)
PATHEXT = $(RESULT)/$(BUILD)/bin:
PATHEXT = $(PREFIX)/bin:
PATHPRE = PATH=$(PATHEXT)$(PATH)
NUM_CORES := $(shell cat /proc/cpuinfo | grep -c processor)
@ -427,6 +432,11 @@ ifeq ($(ARCH), armhfp)
$(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard
endif
ifneq ($(filter ppc64 ppc64le s390x, $(ARCH)), )
# We only support 64-bit on these platforms anyway
CONFIG += --disable-multilib
endif
# Want:
# c,c++
# shared libs
@ -552,7 +562,7 @@ $(TARGETDIR)/%.done : $(BUILDDIR)/%/Makefile
##########################################################################################
$(PREFIX)/devkit.info: FRC
$(PREFIX)/devkit.info:
@echo 'Creating devkit.info in the root of the kit'
rm -f $@
touch $@
@ -611,7 +621,4 @@ all : binutils gcc bfdlib $(PREFIX)/devkit.info $(missing-links) $(SYSROOT_LINKS
# this is only built for host. so separate.
ccache : $(ccache)
# Force target
FRC:
.PHONY : gcc all binutils bfdlib link_libs rpms libs sysroot

View File

@ -0,0 +1,50 @@
#!/bin/bash -e
#
# Copyright (c) 2018, 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. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# 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.
#
# Create a bundle in the build directory, containing what's needed to
# build and run JMH microbenchmarks from the OpenJDK build.
JMH_VERSION=1.21
COMMONS_MATH3_VERSION=3.2
JOPT_SIMPLE_VERSION=4.6
BUNDLE_NAME=jmh-$JMH_VERSION.tar.gz
SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)"
BUILD_DIR="${SCRIPT_DIR}/../../build/jmh"
JAR_DIR="$BUILD_DIR/jars"
mkdir -p $BUILD_DIR $JAR_DIR
cd $JAR_DIR
rm -f *
wget http://central.maven.org/maven2/org/apache/commons/commons-math3/$COMMONS_MATH3_VERSION/commons-math3-$COMMONS_MATH3_VERSION.jar
wget http://central.maven.org/maven2/net/sf/jopt-simple/jopt-simple/$JOPT_SIMPLE_VERSION/jopt-simple-$JOPT_SIMPLE_VERSION.jar
wget http://central.maven.org/maven2/org/openjdk/jmh/jmh-core/$JMH_VERSION/jmh-core-$JMH_VERSION.jar
wget http://central.maven.org/maven2/org/openjdk/jmh/jmh-generator-annprocess/$JMH_VERSION/jmh-generator-annprocess-$JMH_VERSION.jar
tar -cvzf ../$BUNDLE_NAME *
echo "Created $BUILD_DIR/$BUNDLE_NAME"

View File

@ -280,7 +280,7 @@ ifeq ($(findstring $(OPENJDK_TARGET_OS), windows macosx), )
common/font \
#
LIBAWT_XAWT_EXCLUDES := medialib
LIBAWT_XAWT_EXCLUDES := medialib debug
LIBAWT_XAWT_EXTRA_HEADER_DIRS := \
$(LIBAWT_DEFAULT_HEADER_DIRS) \

View File

@ -0,0 +1,113 @@
#
# Copyright (c) 2018, 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. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# 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.
#
# This must be the first rule
default: all
include $(SPEC)
include MakeBase.gmk
include JavaCompilation.gmk
include SetupJavaCompilers.gmk
ifeq ($(JMH_CORE_JAR), )
$(info Error: JMH is missing. Please use configure --with-jmh.)
$(error Cannot continue)
endif
#### Variables
MICROBENCHMARK_SRC := $(TOPDIR)/test/micro
MICROBENCHMARK_JAR := $(IMAGES_OUTPUTDIR)/test/micro/benchmarks.jar
MICROBENCHMARK_OUTPUT := $(SUPPORT_OUTPUTDIR)/test/micro
MICROBENCHMARK_CLASSES := $(MICROBENCHMARK_OUTPUT)/classes
MICROBENCHMARK_JAR_BIN := $(MICROBENCHMARK_OUTPUT)/jar
JMH_UNPACKED_DIR := $(MICROBENCHMARK_OUTPUT)/jmh_jars
JMH_UNPACKED_JARS_DONE := $(JMH_UNPACKED_DIR)/_unpacked.marker
# External dependencies
JMH_COMPILE_JARS := $(JMH_CORE_JAR) $(JMH_GENERATOR_JAR)
JMH_RUNTIME_JARS := $(JMH_CORE_JAR) $(JMH_COMMONS_MATH_JAR) $(JMH_JOPT_SIMPLE_JAR)
MICROBENCHMARK_CLASSPATH := $(call PathList, $(JMH_COMPILE_JARS))
###
# Need double \n to get new lines and no trailing spaces
MICROBENCHMARK_MANIFEST := Build: $(FULL_VERSION)\n\
\nJMH-Version: $(JMH_VERSION)\n\
\nName: OpenJDK Microbenchmark Suite
#### Compile Targets
# Building microbenchmark requires the jdk.unsupported and java.management modules,
# and to have sjavac disabled.
$(eval $(call SetupJavaCompiler, MICROBENCHMARK_JAVA_COMPILER, \
JVM := $(JAVA) --add-modules jdk.unsupported --limit-modules java.management, \
JAVAC := $(NEW_JAVAC), \
DISABLE_SJAVAC := true, \
FLAGS := --upgrade-module-path $(JDK_OUTPUTDIR)/modules --system none $(DISABLE_WARNINGS), \
SERVER_DIR := $(SJAVAC_SERVER_DIR), \
SERVER_JVM := $(SJAVAC_SERVER_JAVA), \
))
# Build microbenchmark suite for the current JDK
$(eval $(call SetupJavaCompilation, BUILD_JDK_MICROBENCHMARK, \
SETUP := MICROBENCHMARK_JAVA_COMPILER, \
ADD_JAVAC_FLAGS := -cp $(MICROBENCHMARK_CLASSPATH) -Xlint -Werror, \
SRC := $(MICROBENCHMARK_SRC), \
BIN := $(MICROBENCHMARK_CLASSES), \
))
$(BUILD_JDK_MICROBENCHMARK): $(JMH_COMPILE_JARS)
# Unpacking dependencies for inclusion in the benchmark JARs
$(JMH_UNPACKED_JARS_DONE): $(JMH_RUNTIME_JARS)
$(RM) -r $(JMH_UNPACKED_DIR)
$(MKDIR) -p $(JMH_UNPACKED_DIR)
$(foreach jar, $(JMH_RUNTIME_JARS), \
$$($(UNZIP) -oq $(jar) -d $(JMH_UNPACKED_DIR)))
$(RM) -r $(JMH_UNPACKED_DIR)/META-INF
$(RM) $(JMH_UNPACKED_DIR)/*.xml
$(TOUCH) $@
# Create benchmarks JAR file with benchmarks for both the old and new JDK
$(eval $(call SetupJarArchive, BUILD_JDK_JAR, \
DEPENDENCIES := $(BUILD_JDK_MICROBENCHMARK) $(JMH_UNPACKED_JARS_DONE), \
SRCS := $(MICROBENCHMARK_CLASSES) $(JMH_UNPACKED_DIR), \
BIN := $(MICROBENCHMARK_JAR_BIN), \
SUFFIXES := .*, \
EXCLUDE_FILES:= _the.BUILD_JDK_MICROBENCHMARK_batch \
_the.BUILD_JDK_MICROBENCHMARK.vardeps _unpacked.marker, \
EXTRA_MANIFEST_ATTR := $(MICROBENCHMARK_MANIFEST), \
JARMAIN := org.openjdk.jmh.Main, \
JAR := $(MICROBENCHMARK_JAR), \
))
all: $(MICROBENCHMARK_JAR)
.PHONY: all

View File

@ -59,6 +59,7 @@ ifeq ($(INCLUDE_GRAAL), true)
-Xlint:none \
-processorpath $(BUILDTOOLS_OUTPUTDIR)/jdk.vm.compiler.replacements.verifier.jar \
--add-exports jdk.unsupported/sun.misc=ALL-UNNAMED \
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
### Copy 3rd party libs
$(eval $(call SetupCopyFiles, COPY_GRAALUNIT_LIBS, \
@ -81,6 +82,7 @@ ifeq ($(INCLUDE_GRAAL), true)
$(SRC_DIR)/org.graalvm.compiler.asm.test/src \
$(SRC_DIR)/org.graalvm.compiler.core.amd64.test/src \
$(SRC_DIR)/org.graalvm.compiler.core.test/src \
$(SRC_DIR)/org.graalvm.compiler.core.jdk9.test/src \
$(SRC_DIR)/org.graalvm.compiler.debug.test/src \
$(SRC_DIR)/org.graalvm.compiler.graph.test/src \
$(SRC_DIR)/org.graalvm.compiler.hotspot.amd64.test/src \
@ -92,6 +94,9 @@ ifeq ($(INCLUDE_GRAAL), true)
$(SRC_DIR)/org.graalvm.compiler.nodes.test/src \
$(SRC_DIR)/org.graalvm.compiler.options.test/src \
$(SRC_DIR)/org.graalvm.compiler.phases.common.test/src \
$(SRC_DIR)/org.graalvm.compiler.replacements.jdk12.test/src \
$(SRC_DIR)/org.graalvm.compiler.replacements.jdk9.test/src \
$(SRC_DIR)/org.graalvm.compiler.replacements.jdk9_11.test/src \
$(SRC_DIR)/org.graalvm.compiler.replacements.test/src \
$(SRC_DIR)/org.graalvm.compiler.test/src \
$(SRC_DIR)/org.graalvm.util.test/src \

View File

@ -317,29 +317,6 @@ namespace ext
enum operation { uxtb, uxth, uxtw, uxtx, sxtb, sxth, sxtw, sxtx };
};
// abs methods which cannot overflow and so are well-defined across
// the entire domain of integer types.
static inline unsigned int uabs(unsigned int n) {
union {
unsigned int result;
int value;
};
result = n;
if (value < 0) result = -result;
return result;
}
static inline unsigned long uabs(unsigned long n) {
union {
unsigned long result;
long value;
};
result = n;
if (value < 0) result = -result;
return result;
}
static inline unsigned long uabs(long n) { return uabs((unsigned long)n); }
static inline unsigned long uabs(int n) { return uabs((unsigned int)n); }
// Addressing modes
class Address {
public:

View File

@ -82,11 +82,12 @@ uint64_t InterpreterRuntime::normalize_fast_native_fingerprint(uint64_t fingerpr
// For ARM, the fast signature handler only needs to know whether
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
// be distinguished from each other and all other return values
// behave like integers with respect to the handler.
// behave like integers with respect to the handler except T_BOOLEAN
// which must be mapped to the range 0..1.
bool unbox = (ret_type == T_OBJECT) || (ret_type == T_ARRAY);
if (unbox) {
ret_type = T_OBJECT;
} else {
} else if (ret_type != T_BOOLEAN) {
ret_type = T_INT;
}
result |= ((uint64_t) ret_type) << shift;
@ -226,9 +227,6 @@ void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprin
address result_handler = Interpreter::result_handler(result_type);
// Check that result handlers are not real handler on ARM (0 or -1).
// This ensures the signature handlers do not need symbolic information.
assert((result_handler == NULL)||(result_handler==(address)0xffffffff),"");
__ mov_slow(R0, (intptr_t)result_handler);
__ ret();

View File

@ -941,6 +941,12 @@ void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* f
bind(done);
}
void MacroAssembler::c2bool(Register x)
{
tst(x, 0xff); // Only look at the lowest byte
mov(x, 1, ne);
}
void MacroAssembler::null_check(Register reg, Register tmp, int offset) {
if (needs_explicit_null_check(offset)) {
assert_different_registers(reg, tmp);

View File

@ -853,6 +853,8 @@ public:
sub(dst, r1, AsmOperand(r2, lsl, shift));
}
// C 'boolean' to Java boolean: x == 0 ? 0 : 1
void c2bool(Register x);
// klass oop manipulations if compressed

View File

@ -1211,6 +1211,11 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
__ restore_default_fp_mode();
}
// Ensure a Boolean result is mapped to 0..1
if (ret_type == T_BOOLEAN) {
__ c2bool(R0);
}
// Do a safepoint check while thread is in transition state
InlinedAddress safepoint_state(SafepointSynchronize::address_of_state());
Label call_safepoint_runtime, return_to_java;

View File

@ -316,13 +316,27 @@ address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, i
}
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
// Result handlers are not used on 32-bit ARM
// since the returned value is already in appropriate format.
__ should_not_reach_here(); // to avoid empty code block
address entry = __ pc();
// The result handler non-zero indicates an object is returned and this is
// used in the native entry code.
return type == T_OBJECT ? (address)(-1) : NULL;
switch (type) {
case T_CHAR : /* Nothing to do */ break;
case T_BYTE : /* Nothing to do */ break;
case T_SHORT : /* Nothing to do */ break;
case T_INT : /* Nothing to do */ break;
case T_LONG : /* Nothing to do */ break;
case T_VOID : /* Nothing to do */ break;
case T_DOUBLE : /* Nothing to do */ break;
case T_FLOAT : /* Nothing to do */ break;
case T_BOOLEAN : __ c2bool(R0); break;
case T_OBJECT :
__ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize));
__ verify_oop(R0);
break;
default : __ should_not_reach_here(); break;
}
__ ret();
return entry;
}
address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
@ -985,8 +999,9 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
// Unbox oop result, e.g. JNIHandles::resolve result if it's an oop.
{
Label Lnot_oop;
// For ARM32, Rresult_handler is -1 for oop result, 0 otherwise.
__ cbz(Rresult_handler, Lnot_oop);
__ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT));
__ cmp(Rtemp, Rresult_handler);
__ b(Lnot_oop, ne);
Register value = Rsaved_result_lo;
__ resolve_jobject(value, // value
Rtemp, // tmp1
@ -1028,10 +1043,9 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
// not properly paired (was bug - gri 11/22/99).
__ notify_method_exit(vtos, InterpreterMacroAssembler::NotifyJVMTI, true, Rsaved_result_lo, Rsaved_result_hi, saved_result_fp);
// Restore the result. Oop result is restored from the stack.
__ cmp(Rresult_handler, 0);
__ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne);
__ mov(R0, Rsaved_result_lo, eq);
// Restore the result. Oop result is restored from the stack by the
// result handler.
__ mov(R0, Rsaved_result_lo);
__ mov(R1, Rsaved_result_hi);
#ifdef __ABI_HARD__
@ -1039,15 +1053,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
__ fcpyd(D0, D8);
#endif // __ABI_HARD__
#ifdef ASSERT
if (VerifyOops) {
Label L;
__ cmp(Rresult_handler, 0);
__ b(L, eq);
__ verify_oop(R0);
__ bind(L);
}
#endif // ASSERT
__ blx(Rresult_handler);
// Restore FP/LR, sender_sp and return
__ mov(Rtemp, FP);

View File

@ -260,6 +260,8 @@ void VM_Version::initialize() {
if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
FLAG_SET_DEFAULT(UsePopCountInstruction, true);
}
} else {
FLAG_SET_DEFAULT(UsePopCountInstruction, false);
}
if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
@ -294,6 +296,9 @@ void VM_Version::initialize() {
Tier3MinInvocationThreshold = 500;
}
UNSUPPORTED_OPTION(TypeProfileLevel);
UNSUPPORTED_OPTION(CriticalJNINatives);
FLAG_SET_DEFAULT(TypeProfileLevel, 0); // unsupported
// This machine does not allow unaligned memory accesses

View File

@ -397,6 +397,7 @@ class Assembler : public AbstractAssembler {
LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM
CNTLZW_OPCODE = (31u << OPCODE_SHIFT | 26u << XO_21_30_SHIFT), // X-FORM
CNTTZW_OPCODE = (31u << OPCODE_SHIFT | 538u << XO_21_30_SHIFT), // X-FORM
// 64 bit opcode encodings
@ -428,6 +429,7 @@ class Assembler : public AbstractAssembler {
DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM
CNTLZD_OPCODE = (31u << OPCODE_SHIFT | 58u << XO_21_30_SHIFT), // X-FORM
CNTTZD_OPCODE = (31u << OPCODE_SHIFT | 570u << XO_21_30_SHIFT), // X-FORM
NAND_OPCODE = (31u << OPCODE_SHIFT | 476u << XO_21_30_SHIFT), // X-FORM
NOR_OPCODE = (31u << OPCODE_SHIFT | 124u << XO_21_30_SHIFT), // X-FORM
@ -1500,6 +1502,10 @@ class Assembler : public AbstractAssembler {
inline void cntlzw_( Register a, Register s);
inline void cntlzd( Register a, Register s);
inline void cntlzd_( Register a, Register s);
inline void cnttzw( Register a, Register s);
inline void cnttzw_( Register a, Register s);
inline void cnttzd( Register a, Register s);
inline void cnttzd_( Register a, Register s);
// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions
inline void sld( Register a, Register s, Register b);

View File

@ -235,6 +235,10 @@ inline void Assembler::cntlzw( Register a, Register s) { emit_int3
inline void Assembler::cntlzw_( Register a, Register s) { emit_int32(CNTLZW_OPCODE | rta(a) | rs(s) | rc(1)); }
inline void Assembler::cntlzd( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(0)); }
inline void Assembler::cntlzd_( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(1)); }
inline void Assembler::cnttzw( Register a, Register s) { emit_int32(CNTTZW_OPCODE | rta(a) | rs(s) | rc(0)); }
inline void Assembler::cnttzw_( Register a, Register s) { emit_int32(CNTTZW_OPCODE | rta(a) | rs(s) | rc(1)); }
inline void Assembler::cnttzd( Register a, Register s) { emit_int32(CNTTZD_OPCODE | rta(a) | rs(s) | rc(0)); }
inline void Assembler::cnttzd_( Register a, Register s) { emit_int32(CNTTZD_OPCODE | rta(a) | rs(s) | rc(1)); }
// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions
inline void Assembler::sld( Register a, Register s, Register b) { emit_int32(SLD_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); }

View File

@ -292,11 +292,11 @@ void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr bas
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
assert(left != result, "should be different registers");
if (is_power_of_2(c + 1)) {
__ shift_left(left, log2_intptr(c + 1), result);
__ shift_left(left, log2_int(c + 1), result);
__ sub(result, left, result);
return true;
} else if (is_power_of_2(c - 1)) {
__ shift_left(left, log2_intptr(c - 1), result);
__ shift_left(left, log2_int(c - 1), result);
__ add(result, left, result);
return true;
}

View File

@ -126,6 +126,9 @@ define_pd_global(bool, ThreadLocalHandshakes, true);
product(bool, UseCountLeadingZerosInstructionsPPC64, true, \
"Use count leading zeros instructions.") \
\
product(bool, UseCountTrailingZerosInstructionsPPC64, false, \
"Use count trailing zeros instructions.") \
\
product(bool, UseExtendedLoadAndReserveInstructionsPPC64, false, \
"Use extended versions of load-and-reserve instructions.") \
\

View File

@ -1,6 +1,6 @@
//
// Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
// Copyright (c) 2012, 2017 SAP SE. All rights reserved.
// Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
// Copyright (c) 2012, 2018 SAP SE. 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
@ -2209,9 +2209,13 @@ const bool Matcher::match_rule_supported(int opcode) {
return VM_Version::has_fsqrt();
case Op_CountLeadingZerosI:
case Op_CountLeadingZerosL:
if (!UseCountLeadingZerosInstructionsPPC64)
return false;
break;
case Op_CountTrailingZerosI:
case Op_CountTrailingZerosL:
if (!UseCountLeadingZerosInstructionsPPC64)
if (!UseCountLeadingZerosInstructionsPPC64 &&
!UseCountTrailingZerosInstructionsPPC64)
return false;
break;
@ -13425,7 +13429,7 @@ instruct countLeadingZerosP(iRegIdst dst, iRegPsrc src) %{
instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{
match(Set dst (CountTrailingZerosI src));
predicate(UseCountLeadingZerosInstructionsPPC64);
predicate(UseCountLeadingZerosInstructionsPPC64 && !UseCountTrailingZerosInstructionsPPC64);
ins_cost(DEFAULT_COST);
expand %{
@ -13442,9 +13446,22 @@ instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{
%}
%}
instruct countTrailingZerosI_cnttzw(iRegIdst dst, iRegIsrc src) %{
match(Set dst (CountTrailingZerosI src));
predicate(UseCountTrailingZerosInstructionsPPC64);
ins_cost(DEFAULT_COST);
format %{ "CNTTZW $dst, $src" %}
size(4);
ins_encode %{
__ cnttzw($dst$$Register, $src$$Register);
%}
ins_pipe(pipe_class_default);
%}
instruct countTrailingZerosL_Ex(iRegIdst dst, iRegLsrc src) %{
match(Set dst (CountTrailingZerosL src));
predicate(UseCountLeadingZerosInstructionsPPC64);
predicate(UseCountLeadingZerosInstructionsPPC64 && !UseCountTrailingZerosInstructionsPPC64);
ins_cost(DEFAULT_COST);
expand %{
@ -13460,6 +13477,19 @@ instruct countTrailingZerosL_Ex(iRegIdst dst, iRegLsrc src) %{
%}
%}
instruct countTrailingZerosL_cnttzd(iRegIdst dst, iRegLsrc src) %{
match(Set dst (CountTrailingZerosL src));
predicate(UseCountTrailingZerosInstructionsPPC64);
ins_cost(DEFAULT_COST);
format %{ "CNTTZD $dst, $src" %}
size(4);
ins_encode %{
__ cnttzd($dst$$Register, $src$$Register);
%}
ins_pipe(pipe_class_default);
%}
// Expand nodes for byte_reverse_int.
instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{
effect(DEF dst, USE src, USE pos, USE shift);

View File

@ -129,6 +129,17 @@ void VM_Version::initialize() {
}
}
MaxVectorSize = SuperwordUseVSX ? 16 : 8;
if (PowerArchitecturePPC64 >= 9) {
if (FLAG_IS_DEFAULT(UseCountTrailingZerosInstructionsPPC64)) {
FLAG_SET_ERGO(bool, UseCountTrailingZerosInstructionsPPC64, true);
}
} else {
if (UseCountTrailingZerosInstructionsPPC64) {
warning("UseCountTrailingZerosInstructionsPPC64 specified, but needs at least Power9.");
FLAG_SET_DEFAULT(UseCountTrailingZerosInstructionsPPC64, false);
}
}
#endif
// Create and print feature-string.

View File

@ -227,12 +227,12 @@ bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result,
if (tmp->is_valid()) {
if (is_power_of_2(c + 1)) {
__ move(left, tmp);
__ shift_left(left, log2_intptr(c + 1), left);
__ shift_left(left, log2_int(c + 1), left);
__ sub(left, tmp, result);
return true;
} else if (is_power_of_2(c - 1)) {
__ move(left, tmp);
__ shift_left(left, log2_intptr(c - 1), left);
__ shift_left(left, log2_int(c - 1), left);
__ add(left, tmp, result);
return true;
}

View File

@ -502,7 +502,7 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) {
__ and3(Rscratch, divisor - 1, Rscratch);
}
__ add(Rdividend, Rscratch, Rscratch);
__ sra(Rscratch, log2_intptr(divisor), Rresult);
__ sra(Rscratch, log2_int(divisor), Rresult);
return;
} else {
if (divisor == 2) {

View File

@ -284,11 +284,11 @@ void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr bas
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
assert(left != result, "should be different registers");
if (is_power_of_2(c + 1)) {
__ shift_left(left, log2_intptr(c + 1), result);
__ shift_left(left, log2_int(c + 1), result);
__ sub(result, left, result);
return true;
} else if (is_power_of_2(c - 1)) {
__ shift_left(left, log2_intptr(c - 1), result);
__ shift_left(left, log2_int(c - 1), result);
__ add(result, left, result);
return true;
}

View File

@ -2555,7 +2555,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
Register dreg = result->as_register();
if (right->is_constant()) {
int divisor = right->as_constant_ptr()->as_jint();
jint divisor = right->as_constant_ptr()->as_jint();
assert(divisor > 0 && is_power_of_2(divisor), "must be");
if (code == lir_idiv) {
assert(lreg == rax, "must be rax,");
@ -2567,7 +2567,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
__ andl(rdx, divisor - 1);
__ addl(lreg, rdx);
}
__ sarl(lreg, log2_intptr(divisor));
__ sarl(lreg, log2_jint(divisor));
move_regs(lreg, dreg);
} else if (code == lir_irem) {
Label done;

View File

@ -244,12 +244,12 @@ bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, jint c, LIR_Opr result
if (tmp->is_valid() && c > 0 && c < max_jint) {
if (is_power_of_2(c + 1)) {
__ move(left, tmp);
__ shift_left(left, log2_intptr(c + 1), left);
__ shift_left(left, log2_jint(c + 1), left);
__ sub(left, tmp, result);
return true;
} else if (is_power_of_2(c - 1)) {
__ move(left, tmp);
__ shift_left(left, log2_intptr(c - 1), left);
__ shift_left(left, log2_jint(c - 1), left);
__ add(left, tmp, result);
return true;
}

View File

@ -984,44 +984,50 @@ void VM_Version::get_processor_features() {
}
}
#endif
#if COMPILER2_OR_JVMCI
if (MaxVectorSize > 0) {
int max_vector_size = 0;
if (UseSSE < 2) {
// Vectors (in XMM) are only supported with SSE2+
// SSE is always 2 on x64.
max_vector_size = 0;
} else if (UseAVX == 0 || !os_supports_avx_vectors()) {
// 16 byte vectors (in XMM) are supported with SSE2+
max_vector_size = 16;
} else if (UseAVX == 1 || UseAVX == 2) {
// 32 bytes vectors (in YMM) are only supported with AVX+
max_vector_size = 32;
} else if (UseAVX > 2 ) {
// 64 bytes vectors (in ZMM) are only supported with AVX 3
max_vector_size = 64;
}
#ifdef _LP64
int min_vector_size = 4; // We require MaxVectorSize to be at least 4 on 64bit
#else
int min_vector_size = 0;
#endif
if (!FLAG_IS_DEFAULT(MaxVectorSize)) {
if (MaxVectorSize < min_vector_size) {
warning("MaxVectorSize must be at least %i on this platform", min_vector_size);
FLAG_SET_DEFAULT(MaxVectorSize, min_vector_size);
}
if (MaxVectorSize > max_vector_size) {
warning("MaxVectorSize must be at most %i on this platform", max_vector_size);
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
}
if (!is_power_of_2(MaxVectorSize)) {
warning("MaxVectorSize must be a power of 2");
FLAG_SET_DEFAULT(MaxVectorSize, 64);
}
if (UseSSE < 2) {
// Vectors (in XMM) are only supported with SSE2+
if (MaxVectorSize > 0) {
if (!FLAG_IS_DEFAULT(MaxVectorSize))
warning("MaxVectorSize must be 0");
FLAG_SET_DEFAULT(MaxVectorSize, 0);
}
}
else if (UseAVX == 0 || !os_supports_avx_vectors()) {
// 32 bytes vectors (in YMM) are only supported with AVX+
if (MaxVectorSize > 16) {
if (!FLAG_IS_DEFAULT(MaxVectorSize))
warning("MaxVectorSize must be <= 16");
FLAG_SET_DEFAULT(MaxVectorSize, 16);
}
}
else if (UseAVX == 1 || UseAVX == 2) {
// 64 bytes vectors (in ZMM) are only supported with AVX 3
if (MaxVectorSize > 32) {
if (!FLAG_IS_DEFAULT(MaxVectorSize))
warning("MaxVectorSize must be <= 32");
FLAG_SET_DEFAULT(MaxVectorSize, 32);
}
}
else if (UseAVX > 2 ) {
if (MaxVectorSize > 64) {
if (!FLAG_IS_DEFAULT(MaxVectorSize))
warning("MaxVectorSize must be <= 64");
FLAG_SET_DEFAULT(MaxVectorSize, 64);
}
warning("MaxVectorSize must be a power of 2, setting to default: %i", max_vector_size);
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
}
} else {
// If default, use highest supported configuration
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
}
#if defined(COMPILER2) && defined(ASSERT)
if (MaxVectorSize > 0) {
if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) {
tty->print_cr("State of YMM registers after signal handle:");
int nreg = 2 LP64_ONLY(+2);
@ -1034,11 +1040,9 @@ void VM_Version::get_processor_features() {
tty->cr();
}
}
#endif // COMPILER2 && ASSERT
}
#endif // COMPILER2_OR_JVMCI
#endif // COMPILER2 && ASSERT
#ifdef COMPILER2
#ifdef _LP64
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
UseMultiplyToLenIntrinsic = true;
@ -1086,8 +1090,8 @@ void VM_Version::get_processor_features() {
}
FLAG_SET_DEFAULT(UseMulAddIntrinsic, false);
}
#endif
#endif // COMPILER2
#endif // _LP64
#endif // COMPILER2_OR_JVMCI
// On new cpus instructions which update whole XMM register should be used
// to prevent partial register stall due to dependencies on high half.

View File

@ -11930,7 +11930,17 @@ instruct testUB_mem_imm(rFlagsReg cr, memory mem, immU8 imm, immI0 zero)
match(Set cr (CmpI (AndI (LoadUB mem) imm) zero));
ins_cost(125);
format %{ "testb $mem, $imm" %}
format %{ "testb $mem, $imm\t# ubyte" %}
ins_encode %{ __ testb($mem$$Address, $imm$$constant); %}
ins_pipe(ialu_cr_reg_mem);
%}
instruct testB_mem_imm(rFlagsReg cr, memory mem, immI8 imm, immI0 zero)
%{
match(Set cr (CmpI (AndI (LoadB mem) imm) zero));
ins_cost(125);
format %{ "testb $mem, $imm\t# byte" %}
ins_encode %{ __ testb($mem$$Address, $imm$$constant); %}
ins_pipe(ialu_cr_reg_mem);
%}

View File

@ -3532,6 +3532,10 @@ void os::init(void) {
// This is called _after_ the global arguments have been parsed.
jint os::init_2(void) {
// This could be set after os::Posix::init() but all platforms
// have to set it the same so we have to mirror Solaris.
DEBUG_ONLY(os::set_mutex_init_done();)
os::Posix::init_2();
if (os::Aix::on_pase()) {

View File

@ -3167,6 +3167,10 @@ extern "C" {
// this is called _after_ the global arguments have been parsed
jint os::init_2(void) {
// This could be set after os::Posix::init() but all platforms
// have to set it the same so we have to mirror Solaris.
DEBUG_ONLY(os::set_mutex_init_done();)
os::Posix::init_2();
// initialize suspend/resume support - must do this before signal_sets_init()

View File

@ -4957,6 +4957,10 @@ void os::pd_init_container_support() {
// this is called _after_ the global arguments have been parsed
jint os::init_2(void) {
// This could be set after os::Posix::init() but all platforms
// have to set it the same so we have to mirror Solaris.
DEBUG_ONLY(os::set_mutex_init_done();)
os::Posix::init_2();
Linux::fast_thread_clock_init();

View File

@ -37,6 +37,8 @@
#include <dirent.h>
#include <dlfcn.h>
#include <grp.h>
#include <pwd.h>
#include <pthread.h>
#include <signal.h>
#include <sys/mman.h>
@ -441,6 +443,38 @@ void os::Posix::print_uname_info(outputStream* st) {
st->cr();
}
void os::Posix::print_umask(outputStream* st, mode_t umsk) {
st->print((umsk & S_IRUSR) ? "r" : "-");
st->print((umsk & S_IWUSR) ? "w" : "-");
st->print((umsk & S_IXUSR) ? "x" : "-");
st->print((umsk & S_IRGRP) ? "r" : "-");
st->print((umsk & S_IWGRP) ? "w" : "-");
st->print((umsk & S_IXGRP) ? "x" : "-");
st->print((umsk & S_IROTH) ? "r" : "-");
st->print((umsk & S_IWOTH) ? "w" : "-");
st->print((umsk & S_IXOTH) ? "x" : "-");
}
void os::Posix::print_user_info(outputStream* st) {
unsigned id = (unsigned) ::getuid();
st->print("uid : %u ", id);
id = (unsigned) ::geteuid();
st->print("euid : %u ", id);
id = (unsigned) ::getgid();
st->print("gid : %u ", id);
id = (unsigned) ::getegid();
st->print_cr("egid : %u", id);
st->cr();
mode_t umsk = ::umask(0);
::umask(umsk);
st->print("umask: %04o (", (unsigned) umsk);
print_umask(st, umsk);
st->print_cr(")");
st->cr();
}
bool os::get_host_name(char* buf, size_t buflen) {
struct utsname name;
uname(&name);

View File

@ -117,6 +117,10 @@ public:
// effective gid, or if given uid is root.
static bool matches_effective_uid_and_gid_or_root(uid_t uid, gid_t gid);
static void print_umask(outputStream* st, mode_t umsk);
static void print_user_info(outputStream* st);
#ifdef SUPPORTS_CLOCK_MONOTONIC
static bool supports_monotonic_clock();

View File

@ -4199,6 +4199,7 @@ jint os::init_2(void) {
// initialize synchronization primitives to use either thread or
// lwp synchronization (controlled by UseLWPSynchronization)
Solaris::synchronization_init();
DEBUG_ONLY(os::set_mutex_init_done();)
if (MaxFDLimit) {
// set the number of file descriptors to max. print out error

View File

@ -1688,7 +1688,13 @@ void os::win32::print_windows_version(outputStream* st) {
if (is_workstation) {
st->print("10");
} else {
st->print("Server 2016");
// distinguish Windows Server 2016 and 2019 by build number
// Windows server 2019 GA 10/2018 build number is 17763
if (build_number > 17762) {
st->print("Server 2019");
} else {
st->print("Server 2016");
}
}
break;
@ -4030,6 +4036,11 @@ static jint initSock();
// this is called _after_ the global arguments have been parsed
jint os::init_2(void) {
// This could be set any time but all platforms
// have to set it the same so we have to mirror Solaris.
DEBUG_ONLY(os::set_mutex_init_done();)
// Setup Windows Exceptions
// for debugging float code generation bugs

View File

@ -210,7 +210,7 @@ void ADLParser::instr_parse(void) {
return;
}
assert(match_rules_cnt < 100," too many match rule clones");
char* buf = (char*) malloc(strlen(instr->_ident) + 4);
char* buf = (char*) AllocateHeap(strlen(instr->_ident) + 4);
sprintf(buf, "%s_%d", instr->_ident, match_rules_cnt++);
rule->_result = buf;
// Check for commutative operations with tree operands.
@ -2858,7 +2858,7 @@ void ADLParser::ins_encode_parse_block(InstructForm& inst) {
// Create a new encoding name based on the name of the instruction
// definition, which should be unique.
const char* prefix = "__ins_encode_";
char* ec_name = (char*) malloc(strlen(inst._ident) + strlen(prefix) + 1);
char* ec_name = (char*) AllocateHeap(strlen(inst._ident) + strlen(prefix) + 1);
sprintf(ec_name, "%s%s", prefix, inst._ident);
assert(_AD._encode->encClass(ec_name) == NULL, "shouldn't already exist");
@ -3328,7 +3328,7 @@ void ADLParser::constant_parse(InstructForm& inst) {
// Create a new encoding name based on the name of the instruction
// definition, which should be unique.
const char* prefix = "__constant_";
char* ec_name = (char*) malloc(strlen(inst._ident) + strlen(prefix) + 1);
char* ec_name = (char*) AllocateHeap(strlen(inst._ident) + strlen(prefix) + 1);
sprintf(ec_name, "%s%s", prefix, inst._ident);
assert(_AD._encode->encClass(ec_name) == NULL, "shouldn't already exist");
@ -4460,7 +4460,7 @@ char* ADLParser::find_cpp_block(const char* description) {
if (_AD._adlocation_debug) {
char* location = get_line_string(line);
char* end_loc = end_line_marker();
char* result = (char *)malloc(strlen(location) + strlen(cppBlock) + strlen(end_loc) + 1);
char* result = (char *)AllocateHeap(strlen(location) + strlen(cppBlock) + strlen(end_loc) + 1);
strcpy(result, location);
strcat(result, cppBlock);
strcat(result, end_loc);
@ -4549,7 +4549,7 @@ char *ADLParser::get_paren_expr(const char *description, bool include_location)
// Prepend location descriptor, for debugging.
char* location = get_line_string(line);
char* end_loc = end_line_marker();
char* result = (char *)malloc(strlen(location) + strlen(token2) + strlen(end_loc) + 1);
char* result = (char *)AllocateHeap(strlen(location) + strlen(token2) + strlen(end_loc) + 1);
strcpy(result, location);
strcat(result, token2);
strcat(result, end_loc);
@ -4647,7 +4647,7 @@ char *ADLParser::get_ident_or_literal_constant(const char* description) {
// Grab a constant expression.
param = get_paren_expr(description);
if (param[0] != '(') {
char* buf = (char*) malloc(strlen(param) + 3);
char* buf = (char*) AllocateHeap(strlen(param) + 3);
sprintf(buf, "(%s)", param);
param = buf;
}
@ -5255,7 +5255,7 @@ void ADLParser::next_line() {
char* ADLParser::get_line_string(int linenum) {
const char* file = _AD._ADL_file._name;
int line = linenum ? linenum : this->linenum();
char* location = (char *)malloc(strlen(file) + 100);
char* location = (char *)AllocateHeap(strlen(file) + 100);
sprintf(location, "\n#line %d \"%s\"\n", line, file);
return location;
}

View File

@ -24,6 +24,16 @@
#include "adlc.hpp"
void* AllocateHeap(size_t size) {
unsigned char* ptr = (unsigned char*) malloc(size);
if (ptr == NULL && size != 0) {
fprintf(stderr, "Error: Out of memory in ADLC\n"); // logging can cause crash!
fflush(stderr);
exit(1);
}
return ptr;
}
void* Chunk::operator new(size_t requested_size, size_t length) throw() {
return CHeapObj::operator new(requested_size + length);
}
@ -164,7 +174,7 @@ bool Arena::contains( const void *ptr ) const {
// CHeapObj
void* CHeapObj::operator new(size_t size) throw() {
return (void *) malloc(size);
return (void *) AllocateHeap(size);
}
void CHeapObj::operator delete(void* p){

View File

@ -25,6 +25,8 @@
#ifndef SHARE_VM_ADLC_ARENA_HPP
#define SHARE_VM_ADLC_ARENA_HPP
void* AllocateHeap(size_t size);
// All classes in adlc may be derived
// from one of the following allocation classes:
//
@ -42,7 +44,6 @@ class CHeapObj {
void* new_array(size_t size);
};
// Base class for classes that constitute name spaces.
class AllStatic {

View File

@ -40,7 +40,7 @@ const char *NameList::_signal3 = "$$SIGNAL3$$";
// Constructor and Destructor
NameList::NameList() : _cur(0), _max(4), _iter(0), _justReset(true) {
_names = (const char**)malloc(_max*sizeof(char*));
_names = (const char**) AllocateHeap(_max*sizeof(char*));
}
NameList::~NameList() {
// The following free is a double-free, and crashes the program:

View File

@ -1354,7 +1354,7 @@ void InstructForm::set_unique_opnds() {
// component back to an index and any DEF always goes at 0 so the
// length of the array has to be the number of components + 1.
_uniq_idx_length = _components.count() + 1;
uniq_idx = (uint*) malloc(sizeof(uint) * _uniq_idx_length);
uniq_idx = (uint*) AllocateHeap(sizeof(uint) * _uniq_idx_length);
for (i = 0; i < _uniq_idx_length; i++) {
uniq_idx[i] = i;
}
@ -3449,7 +3449,7 @@ void MatchNode::build_internalop( ) {
rstr = (_rChild) ? ((_rChild->_internalop) ?
_rChild->_internalop : _rChild->_opType) : "";
len += (int)strlen(lstr) + (int)strlen(rstr);
subtree = (char *)malloc(len);
subtree = (char *)AllocateHeap(len);
sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
// Hash the subtree string in _internalOps; if a name exists, use it
iop = (char *)_AD._internalOps[subtree];
@ -3863,7 +3863,7 @@ void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count
MatchRule* clone = new MatchRule(_AD, this);
// Swap operands of commutative operation
((MatchNode*)clone)->swap_commutative_op(true, count);
char* buf = (char*) malloc(strlen(instr_ident) + 4);
char* buf = (char*) AllocateHeap(strlen(instr_ident) + 4);
sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++);
clone->_result = buf;

View File

@ -176,6 +176,8 @@ private:
virtual bool is_alive() const { return _is_alive(); }
virtual bool is_in_use() const { return state() == in_use; }
virtual bool is_unloading() { return false; }
address exception_begin() const { return (address) _code + _meta->exception_handler_offset(); }
virtual const char* name() const { return _name; }

View File

@ -333,6 +333,17 @@ bool MacroAssembler::uses_implicit_null_check(void* address) {
}
bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
// The offset -1 is used (hardcoded) in a number of places in C1 and MacroAssembler
// to indicate an unknown offset. For example, TemplateTable::pop_and_check_object(Register r)
// calls MacroAssembler::null_check(Register reg, int offset = -1) which gets here
// with -1. Another example is GraphBuilder::access_field(...) which uses -1 as placeholder
// for offsets to be patched in later. The -1 there means the offset is not yet known
// and may lie outside of the zero-trapping page, and thus we need to ensure we're forcing
// an explicit null check for -1, even if it may otherwise be in the range
// [-cell_header_size, os::vm_page_size).
// TODO: Find and replace all relevant uses of -1 with a reasonably named constant.
if (offset == -1) return true;
// Check if offset is outside of [-cell_header_size, os::vm_page_size)
return offset < -Universe::heap()->cell_header_size() ||
offset >= os::vm_page_size();

View File

@ -389,8 +389,8 @@ Klass* ClassListParser::load_current_class(TRAPS) {
InstanceKlass* ik = InstanceKlass::cast(klass);
int id = this->id();
SystemDictionaryShared::update_shared_entry(ik, id);
InstanceKlass* old = table()->lookup(id);
if (old != NULL && old != ik) {
InstanceKlass** old_ptr = table()->lookup(id);
if (old_ptr != NULL) {
error("Duplicated ID %d for class %s", id, _class_name);
}
table()->add(id, ik);
@ -404,11 +404,12 @@ bool ClassListParser::is_loading_from_source() {
}
InstanceKlass* ClassListParser::lookup_class_by_id(int id) {
InstanceKlass* klass = table()->lookup(id);
if (klass == NULL) {
InstanceKlass** klass_ptr = table()->lookup(id);
if (klass_ptr == NULL) {
error("Class ID %d has not been defined", id);
}
return klass;
assert(*klass_ptr != NULL, "must be");
return *klass_ptr;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2018, 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
@ -27,30 +27,12 @@
#include "utilities/exceptions.hpp"
#include "utilities/globalDefinitions.hpp"
#include "utilities/hashtable.hpp"
#include "utilities/growableArray.hpp"
#include "utilities/hashtable.inline.hpp"
class CDSClassInfo;
// Look up from ID -> InstanceKlass*
class ID2KlassTable : public Hashtable<InstanceKlass*, mtClass> {
class ID2KlassTable : public KVHashtable<int, InstanceKlass*, mtInternal> {
public:
ID2KlassTable() : Hashtable<InstanceKlass*, mtClass>(1987, sizeof(HashtableEntry<InstanceKlass*, mtClass>)) { }
void add(int id, InstanceKlass* klass) {
unsigned int hash = (unsigned int)id;
HashtableEntry<InstanceKlass*, mtClass>* entry = new_entry(hash, klass);
add_entry(hash_to_index(hash), entry);
}
InstanceKlass* lookup(int id) {
unsigned int hash = (unsigned int)id;
int index = hash_to_index(id);
for (HashtableEntry<InstanceKlass*, mtClass>* e = bucket(index); e != NULL; e = e->next()) {
if (e->hash() == hash) {
return e->literal();
}
}
return NULL;
}
ID2KlassTable() : KVHashtable<int, InstanceKlass*, mtInternal>(1987) {}
};
class ClassListParser : public StackObj {

View File

@ -484,7 +484,7 @@ void ClassLoaderData::initialize_holder(Handle loader_or_mirror) {
// Remove a klass from the _klasses list for scratch_class during redefinition
// or parsed class in the case of an error.
void ClassLoaderData::remove_class(Klass* scratch_class) {
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
// Adjust global class iterator.
ClassLoaderDataGraph::adjust_saved_class(scratch_class);
@ -804,7 +804,8 @@ void ClassLoaderData::add_to_deallocate_list(Metadata* m) {
// Deallocate free metadata on the free list. How useful the PermGen was!
void ClassLoaderData::free_deallocate_list() {
// Don't need lock, at safepoint
// This must be called at a safepoint because it depends on metadata walking at
// safepoint cleanup time.
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
assert(!is_unloading(), "only called for ClassLoaderData that are not unloading");
if (_deallocate_list == NULL) {
@ -844,8 +845,7 @@ void ClassLoaderData::free_deallocate_list() {
// classes. The metadata is removed with the unloading metaspace.
// There isn't C heap memory allocated for methods, so nothing is done for them.
void ClassLoaderData::free_deallocate_list_C_heap_structures() {
// Don't need lock, at safepoint
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
assert(is_unloading(), "only called for ClassLoaderData that are unloading");
if (_deallocate_list == NULL) {
return;

View File

@ -230,13 +230,6 @@ ClassLoaderData* ClassLoaderDataGraph::add(Handle loader, bool is_unsafe_anonymo
return loader_data;
}
void ClassLoaderDataGraph::cld_do(CLDClosure* cl) {
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
cl->do_cld(cld);
}
}
void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
// Only walk the head until any clds not purged from prior unloading
@ -247,6 +240,15 @@ void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
}
}
// These are functions called by the GC, which require all of the CLDs, including the
// unloading ones.
void ClassLoaderDataGraph::cld_do(CLDClosure* cl) {
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
cl->do_cld(cld);
}
}
void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
@ -286,9 +288,12 @@ class ClassLoaderDataGraphIterator : public StackObj {
HandleMark _hm; // clean up handles when this is done.
Handle _holder;
Thread* _thread;
NoSafepointVerifier _nsv; // No safepoints allowed in this scope
// unless verifying at a safepoint.
public:
ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head) {
ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head),
_nsv(true, !SafepointSynchronize::is_at_safepoint()) {
_thread = Thread::current();
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
}
@ -308,10 +313,15 @@ public:
}
return cld;
}
};
void ClassLoaderDataGraph::loaded_cld_do(CLDClosure* cl) {
ClassLoaderDataGraphIterator iter;
while (ClassLoaderData* cld = iter.get_next()) {
cl->do_cld(cld);
}
}
// These functions assume that the caller has locked the ClassLoaderDataGraph_lock
// if they are not calling the function from a safepoint.
void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
@ -572,7 +582,7 @@ void ClassLoaderDataGraph::clean_module_and_package_info() {
}
void ClassLoaderDataGraph::purge() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
ClassLoaderData* list = _unloading;
_unloading = NULL;
ClassLoaderData* next = list;

View File

@ -73,6 +73,8 @@ class ClassLoaderDataGraph : public AllStatic {
static void cld_unloading_do(CLDClosure* cl);
static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
static void always_strong_cld_do(CLDClosure* cl);
// Iteration through CLDG not by GC.
static void loaded_cld_do(CLDClosure* cl);
// klass do
// Walking classes through the ClassLoaderDataGraph include array classes. It also includes
// classes that are allocated but not loaded, classes that have errors, and scratch classes

View File

@ -25,7 +25,6 @@
#include "precompiled.hpp"
#include "classfile/classFileParser.hpp"
#include "classfile/classFileStream.hpp"
#include "classfile/classListParser.hpp"
#include "classfile/classLoader.inline.hpp"
#include "classfile/classLoaderExt.hpp"
#include "classfile/classLoaderData.inline.hpp"
@ -257,7 +256,6 @@ void ClassLoaderExt::finalize_shared_paths_misc_info() {
// the "source:" in the class list file (see classListParser.cpp), and can be a directory or
// a JAR file.
InstanceKlass* ClassLoaderExt::load_class(Symbol* name, const char* path, TRAPS) {
assert(name != NULL, "invariant");
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
ResourceMark rm(THREAD);

View File

@ -515,7 +515,7 @@ public:
assert(SafepointSynchronize::is_at_safepoint(), "must be a safepoint");
ResourceMark rm;
LoaderInfoScanClosure cl (_show_classes, _verbose);
ClassLoaderDataGraph::cld_do(&cl);
ClassLoaderDataGraph::loaded_cld_do(&cl);
// In non-verbose and non-show-classes mode, attempt to fold the tree.
if (_fold) {
if (!_verbose && !_show_classes) {

View File

@ -159,7 +159,7 @@ void ClassLoaderStatsClosure::addEmptyParents(oop cl) {
void ClassLoaderStatsVMOperation::doit() {
ClassLoaderStatsClosure clsc (_out);
ClassLoaderDataGraph::cld_do(&clsc);
ClassLoaderDataGraph::loaded_cld_do(&clsc);
clsc.print();
}

View File

@ -27,7 +27,7 @@
#include "oops/array.hpp"
#include "oops/symbol.hpp"
#include "utilities/hashtable.hpp"
#include "utilities/growableArray.hpp"
template <
@ -330,7 +330,7 @@ public:
// offset from the CDS base address.
template <typename V>
V read_value_from_compact_hashtable(address base_address, u4 offset) {
inline V read_value_from_compact_hashtable(address base_address, u4 offset) {
return (V)(base_address + offset);
}

View File

@ -67,7 +67,6 @@ Dictionary::~Dictionary() {
}
assert(number_of_entries() == 0, "should have removed all entries");
assert(new_entry_free_list() == NULL, "entry present on Dictionary's free list");
free_buckets();
}
DictionaryEntry* Dictionary::new_entry(unsigned int hash, InstanceKlass* klass) {

View File

@ -204,7 +204,7 @@ bool ModuleEntry::has_reads_list() const {
// Purge dead module entries out of reads list.
void ModuleEntry::purge_reads() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
assert_locked_or_safepoint(Module_lock);
if (_must_walk_reads && has_reads_list()) {
// This module's _must_walk_reads flag will be reset based
@ -245,7 +245,6 @@ void ModuleEntry::module_reads_do(ModuleClosure* f) {
}
void ModuleEntry::delete_reads() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
delete _reads;
_reads = NULL;
}
@ -319,8 +318,6 @@ ModuleEntryTable::ModuleEntryTable(int table_size)
}
ModuleEntryTable::~ModuleEntryTable() {
assert_locked_or_safepoint(Module_lock);
// Walk through all buckets and all entries in each bucket,
// freeing each entry.
for (int i = 0; i < table_size(); ++i) {
@ -355,7 +352,6 @@ ModuleEntryTable::~ModuleEntryTable() {
}
assert(number_of_entries() == 0, "should have removed all entries");
assert(new_entry_free_list() == NULL, "entry present on ModuleEntryTable's free list");
free_buckets();
}
ModuleEntry* ModuleEntryTable::new_entry(unsigned int hash, Handle module_handle,

View File

@ -125,7 +125,7 @@ void PackageEntry::set_is_exported_allUnnamed() {
// get deleted. This prevents the package from illegally transitioning from
// exported to non-exported.
void PackageEntry::purge_qualified_exports() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
assert_locked_or_safepoint(Module_lock);
if (_must_walk_exports &&
_qualified_exports != NULL &&
!_qualified_exports->is_empty()) {
@ -160,7 +160,6 @@ void PackageEntry::purge_qualified_exports() {
}
void PackageEntry::delete_qualified_exports() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
if (_qualified_exports != NULL) {
delete _qualified_exports;
}
@ -192,7 +191,6 @@ PackageEntryTable::~PackageEntryTable() {
}
assert(number_of_entries() == 0, "should have removed all entries");
assert(new_entry_free_list() == NULL, "entry present on PackageEntryTable's free list");
free_buckets();
}
PackageEntry* PackageEntryTable::new_entry(unsigned int hash, Symbol* name, ModuleEntry* module) {
@ -228,29 +226,20 @@ PackageEntry* PackageEntryTable::locked_create_entry_or_null(Symbol* name, Modul
}
PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
MutexLocker ml(Module_lock);
PackageEntry* p = lookup_only(name);
if (p != NULL) {
return p;
} else {
// If not found, add to table. Grab the PackageEntryTable lock first.
MutexLocker ml(Module_lock);
// Since look-up was done lock-free, we need to check if another thread beat
// us in the race to insert the package.
PackageEntry* test = lookup_only(name);
if (test != NULL) {
// A race occurred and another thread introduced the package.
return test;
} else {
assert(module != NULL, "module should never be null");
PackageEntry* entry = new_entry(compute_hash(name), name, module);
add_entry(index_for(name), entry);
return entry;
}
assert(module != NULL, "module should never be null");
PackageEntry* entry = new_entry(compute_hash(name), name, module);
add_entry(index_for(name), entry);
return entry;
}
}
PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
MutexLockerEx ml(Module_lock->owned_by_self() ? NULL : Module_lock);
int index = index_for(name);
for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
if (p->name()->fast_compare(name) == 0) {
@ -296,7 +285,7 @@ void PackageEntry::package_exports_do(ModuleClosure* f) {
}
bool PackageEntry::exported_pending_delete() const {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
assert_locked_or_safepoint(Module_lock);
return (is_unqual_exported() && _qualified_exports != NULL);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2016, 2018, 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
@ -253,7 +253,7 @@ public:
// lookup Package with loader's package entry table, if not found add
PackageEntry* lookup(Symbol* name, ModuleEntry* module);
// Only lookup Package within loader's package entry table. The table read is lock-free.
// Only lookup Package within loader's package entry table.
PackageEntry* lookup_only(Symbol* Package);
void verify_javabase_packages(GrowableArray<Symbol*> *pkg_list);

View File

@ -1807,18 +1807,26 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
bool SystemDictionary::do_unloading(GCTimer* gc_timer) {
bool unloading_occurred;
bool is_concurrent = !SafepointSynchronize::is_at_safepoint();
{
GCTraceTime(Debug, gc, phases) t("ClassLoaderData", gc_timer);
assert_locked_or_safepoint(ClassLoaderDataGraph_lock); // caller locks.
// First, mark for unload all ClassLoaderData referencing a dead class loader.
unloading_occurred = ClassLoaderDataGraph::do_unloading();
if (unloading_occurred) {
MutexLockerEx ml2(is_concurrent ? Module_lock : NULL);
JFR_ONLY(Jfr::on_unloading_classes();)
MutexLockerEx ml1(is_concurrent ? SystemDictionary_lock : NULL);
ClassLoaderDataGraph::clean_module_and_package_info();
}
}
// TODO: just return if !unloading_occurred.
// Cleanup ResolvedMethodTable even if no unloading occurred.
{
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
ResolvedMethodTable::trigger_cleanup();
}
if (unloading_occurred) {
{
GCTraceTime(Debug, gc, phases) t("SymbolTable", gc_timer);
@ -1827,23 +1835,21 @@ bool SystemDictionary::do_unloading(GCTimer* gc_timer) {
}
{
MutexLockerEx ml(is_concurrent ? SystemDictionary_lock : NULL);
GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer);
constraints()->purge_loader_constraints();
resolution_errors()->purge_resolution_errors();
}
}
{
GCTraceTime(Debug, gc, phases) t("ProtectionDomainCacheTable", gc_timer);
// Oops referenced by the protection domain cache table may get unreachable independently
// of the class loader (eg. cached protection domain oops). So we need to
// explicitly unlink them here.
_pd_cache_table->trigger_cleanup();
}
{
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
ResolvedMethodTable::trigger_cleanup();
{
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
// Oops referenced by the protection domain cache table may get unreachable independently
// of the class loader (eg. cached protection domain oops). So we need to
// explicitly unlink them here.
// All protection domain oops are linked to the caller class, so if nothing
// unloads, this is not needed.
_pd_cache_table->trigger_cleanup();
}
}
return unloading_occurred;

View File

@ -657,7 +657,7 @@ void CodeCache::blobs_do(void f(CodeBlob* nm)) {
void CodeCache::nmethods_do(void f(nmethod* nm)) {
assert_locked_or_safepoint(CodeCache_lock);
NMethodIterator iter;
NMethodIterator iter(NMethodIterator::all_blobs);
while(iter.next()) {
f(iter.method());
}
@ -665,8 +665,8 @@ void CodeCache::nmethods_do(void f(nmethod* nm)) {
void CodeCache::metadata_do(void f(Metadata* m)) {
assert_locked_or_safepoint(CodeCache_lock);
NMethodIterator iter;
while(iter.next_alive()) {
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
iter.method()->metadata_do(f);
}
AOTLoader::metadata_do(f);
@ -684,8 +684,8 @@ int CodeCache::alignment_offset() {
void CodeCache::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred) {
assert_locked_or_safepoint(CodeCache_lock);
UnloadingScope scope(is_alive);
CompiledMethodIterator iter;
while(iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive);
while(iter.next()) {
iter.method()->do_unloading(unloading_occurred);
}
}
@ -842,8 +842,8 @@ void CodeCache::asserted_non_scavengable_nmethods_do(CodeBlobClosure* f) {
// Temporarily mark nmethods that are claimed to be on the scavenge list.
void CodeCache::mark_scavenge_root_nmethods() {
NMethodIterator iter;
while(iter.next_alive()) {
NMethodIterator iter(NMethodIterator::only_alive);
while(iter.next()) {
nmethod* nm = iter.method();
assert(nm->scavenge_root_not_marked(), "clean state");
if (nm->on_scavenge_root_list())
@ -854,8 +854,8 @@ void CodeCache::mark_scavenge_root_nmethods() {
// If the closure is given, run it on the unlisted nmethods.
// Also make sure that the effects of mark_scavenge_root_nmethods is gone.
void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
NMethodIterator iter;
while(iter.next_alive()) {
NMethodIterator iter(NMethodIterator::only_alive);
while(iter.next()) {
nmethod* nm = iter.method();
bool call_f = (f_or_null != NULL);
assert(nm->scavenge_root_not_marked(), "must be already processed");
@ -869,8 +869,8 @@ void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
void CodeCache::verify_clean_inline_caches() {
#ifdef ASSERT
NMethodIterator iter;
while(iter.next_alive()) {
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
nmethod* nm = iter.method();
assert(!nm->is_unloaded(), "Tautology");
nm->verify_clean_inline_caches();
@ -943,8 +943,8 @@ void CodeCache::increment_unloading_cycle() {
void CodeCache::verify_oops() {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
VerifyOopClosure voc;
NMethodIterator iter;
while(iter.next_alive()) {
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
nmethod* nm = iter.method();
nm->oops_do(&voc);
nm->verify_oop_relocations();
@ -1120,16 +1120,16 @@ int CodeCache::number_of_nmethods_with_dependencies() {
void CodeCache::clear_inline_caches() {
assert_locked_or_safepoint(CodeCache_lock);
CompiledMethodIterator iter;
while(iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
iter.method()->clear_inline_caches();
}
}
void CodeCache::cleanup_inline_caches() {
assert_locked_or_safepoint(CodeCache_lock);
NMethodIterator iter;
while(iter.next_alive()) {
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
iter.method()->cleanup_inline_caches(/*clean_all=*/true);
}
}
@ -1199,8 +1199,8 @@ int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
}
}
CompiledMethodIterator iter;
while(iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
CompiledMethod* nm = iter.method();
if (nm->is_marked_for_deoptimization()) {
// ...Already marked in the previous pass; don't count it again.
@ -1222,8 +1222,8 @@ int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
// Deoptimize all methods
void CodeCache::mark_all_nmethods_for_deoptimization() {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
CompiledMethodIterator iter;
while(iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
CompiledMethod* nm = iter.method();
if (!nm->method()->is_method_handle_intrinsic()) {
nm->mark_for_deoptimization();
@ -1235,8 +1235,8 @@ int CodeCache::mark_for_deoptimization(Method* dependee) {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
int number_of_marked_CodeBlobs = 0;
CompiledMethodIterator iter;
while(iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
CompiledMethod* nm = iter.method();
if (nm->is_dependent_on_method(dependee)) {
ResourceMark rm;
@ -1250,8 +1250,8 @@ int CodeCache::mark_for_deoptimization(Method* dependee) {
void CodeCache::make_marked_nmethods_not_entrant() {
assert_locked_or_safepoint(CodeCache_lock);
CompiledMethodIterator iter;
while(iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
CompiledMethod* nm = iter.method();
if (nm->is_marked_for_deoptimization() && !nm->is_not_entrant()) {
nm->make_not_entrant();
@ -1519,7 +1519,7 @@ void CodeCache::print_internals() {
int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit, mtCode);
memset(buckets, 0, sizeof(int) * bucketLimit);
NMethodIterator iter;
NMethodIterator iter(NMethodIterator::all_blobs);
while(iter.next()) {
nmethod* nm = iter.method();
if(nm->method() != NULL && nm->is_java_method()) {
@ -1659,8 +1659,8 @@ void CodeCache::print_summary(outputStream* st, bool detailed) {
void CodeCache::print_codelist(outputStream* st) {
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
CompiledMethodIterator iter;
while (iter.next_alive()) {
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
while (iter.next()) {
CompiledMethod* cm = iter.method();
ResourceMark rm;
char* method_name = cm->method()->name_and_sig_as_C_string();

View File

@ -334,13 +334,21 @@ class CodeCache : AllStatic {
// Iterator to iterate over nmethods in the CodeCache.
template <class T, class Filter> class CodeBlobIterator : public StackObj {
public:
enum LivenessFilter { all_blobs, only_alive, only_alive_and_not_unloading };
private:
CodeBlob* _code_blob; // Current CodeBlob
GrowableArrayIterator<CodeHeap*> _heap;
GrowableArrayIterator<CodeHeap*> _end;
bool _only_alive;
bool _only_not_unloading;
public:
CodeBlobIterator(T* nm = NULL) {
CodeBlobIterator(LivenessFilter filter, T* nm = NULL)
: _only_alive(filter == only_alive || filter == only_alive_and_not_unloading),
_only_not_unloading(filter == only_alive_and_not_unloading)
{
if (Filter::heaps() == NULL) {
return;
}
@ -360,29 +368,35 @@ template <class T, class Filter> class CodeBlobIterator : public StackObj {
bool next() {
assert_locked_or_safepoint(CodeCache_lock);
bool result = next_blob();
while (!result && _heap != _end) {
// Advance to next code heap of segmented code cache
if (++_heap == _end) {
break;
for (;;) {
// Walk through heaps as required
if (!next_blob()) {
if (_heap == _end) {
return false;
}
++_heap;
continue;
}
result = next_blob();
}
return result;
// Filter is_alive as required
if (_only_alive && !_code_blob->is_alive()) {
continue;
}
// Filter is_unloading as required
if (_only_not_unloading) {
CompiledMethod* cm = _code_blob->as_compiled_method_or_null();
if (cm != NULL && cm->is_unloading()) {
continue;
}
}
return true;
}
}
// Advance iterator to next alive blob
bool next_alive() {
bool result = next();
while(result && !_code_blob->is_alive()) {
result = next();
}
return result;
}
bool end() const { return _code_blob == NULL; }
T* method() const { return (T*)_code_blob; }
bool end() const { return _code_blob == NULL; }
T* method() const { return (T*)_code_blob; }
private:
@ -422,7 +436,6 @@ struct NMethodFilter {
static const GrowableArray<CodeHeap*>* heaps() { return CodeCache::nmethod_heaps(); }
};
typedef CodeBlobIterator<CompiledMethod, CompiledMethodFilter> CompiledMethodIterator;
typedef CodeBlobIterator<nmethod, NMethodFilter> NMethodIterator;

View File

@ -44,11 +44,10 @@ CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType ty
bool caller_must_gc_arguments)
: CodeBlob(name, type, layout, frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
_mark_for_deoptimization_status(not_marked),
_is_unloading_state(0),
_method(method)
_method(method),
_gc_data(NULL)
{
init_defaults();
clear_unloading_state();
}
CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType type, int size,
@ -57,11 +56,10 @@ CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType ty
: CodeBlob(name, type, CodeBlobLayout((address) this, size, header_size, cb), cb,
frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
_mark_for_deoptimization_status(not_marked),
_is_unloading_state(0),
_method(method)
_method(method),
_gc_data(NULL)
{
init_defaults();
clear_unloading_state();
}
void CompiledMethod::init_defaults() {
@ -546,74 +544,6 @@ void CompiledMethod::unload_nmethod_caches(bool unloading_occurred) {
DEBUG_ONLY(metadata_do(check_class));
}
// The _is_unloading_state encodes a tuple comprising the unloading cycle
// and the result of IsUnloadingBehaviour::is_unloading() fpr that cycle.
// This is the bit layout of the _is_unloading_state byte: 00000CCU
// CC refers to the cycle, which has 2 bits, and U refers to the result of
// IsUnloadingBehaviour::is_unloading() for that unloading cycle.
class IsUnloadingState: public AllStatic {
static const uint8_t _is_unloading_mask = 1;
static const uint8_t _is_unloading_shift = 0;
static const uint8_t _unloading_cycle_mask = 6;
static const uint8_t _unloading_cycle_shift = 1;
static uint8_t set_is_unloading(uint8_t state, bool value) {
state &= ~_is_unloading_mask;
if (value) {
state |= 1 << _is_unloading_shift;
}
assert(is_unloading(state) == value, "unexpected unloading cycle overflow");
return state;
}
static uint8_t set_unloading_cycle(uint8_t state, uint8_t value) {
state &= ~_unloading_cycle_mask;
state |= value << _unloading_cycle_shift;
assert(unloading_cycle(state) == value, "unexpected unloading cycle overflow");
return state;
}
public:
static bool is_unloading(uint8_t state) { return (state & _is_unloading_mask) >> _is_unloading_shift == 1; }
static uint8_t unloading_cycle(uint8_t state) { return (state & _unloading_cycle_mask) >> _unloading_cycle_shift; }
static uint8_t create(bool is_unloading, uint8_t unloading_cycle) {
uint8_t state = 0;
state = set_is_unloading(state, is_unloading);
state = set_unloading_cycle(state, unloading_cycle);
return state;
}
};
bool CompiledMethod::is_unloading() {
uint8_t state = RawAccess<MO_RELAXED>::load(&_is_unloading_state);
bool state_is_unloading = IsUnloadingState::is_unloading(state);
uint8_t state_unloading_cycle = IsUnloadingState::unloading_cycle(state);
if (state_is_unloading) {
return true;
}
if (state_unloading_cycle == CodeCache::unloading_cycle()) {
return false;
}
// The IsUnloadingBehaviour is responsible for checking if there are any dead
// oops in the CompiledMethod, by calling oops_do on it.
state_unloading_cycle = CodeCache::unloading_cycle();
state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
state = IsUnloadingState::create(state_is_unloading, state_unloading_cycle);
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
return state_is_unloading;
}
void CompiledMethod::clear_unloading_state() {
uint8_t state = IsUnloadingState::create(false, CodeCache::unloading_cycle());
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
}
// Called to clean up after class unloading for live nmethods and from the sweeper
// for all methods.
void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {

View File

@ -151,8 +151,6 @@ protected:
bool _is_far_code; // Code is far from CodeCache.
// Have to use far call instructions to call it from code in CodeCache.
volatile uint8_t _is_unloading_state; // Local state used to keep track of whether unloading is happening or not
// set during construction
unsigned int _has_unsafe_access:1; // May fault due to unsafe access.
unsigned int _has_method_handle_invokes:1; // Has this method MethodHandle invokes?
@ -171,6 +169,8 @@ protected:
PcDescContainer _pc_desc_container;
ExceptionCache * volatile _exception_cache;
void* _gc_data;
virtual void flush() = 0;
protected:
CompiledMethod(Method* method, const char* name, CompilerType type, const CodeBlobLayout& layout, int frame_complete_offset, int frame_size, ImmutableOopMapSet* oop_maps, bool caller_must_gc_arguments);
@ -179,6 +179,11 @@ protected:
public:
virtual bool is_compiled() const { return true; }
template<typename T>
T* gc_data() const { return reinterpret_cast<T*>(_gc_data); }
template<typename T>
void set_gc_data(T* gc_data) { _gc_data = reinterpret_cast<void*>(gc_data); }
bool has_unsafe_access() const { return _has_unsafe_access; }
void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
@ -390,10 +395,9 @@ public:
// GC unloading support
// Cleans unloaded klasses and unloaded nmethods in inline caches
bool is_unloading();
virtual bool is_unloading() = 0;
void unload_nmethod_caches(bool class_unloading_occurred);
void clear_unloading_state();
virtual void do_unloading(bool unloading_occurred) { }
private:

View File

@ -118,13 +118,13 @@ class DependencyContext : public StackObj {
// Safepoints are forbidden during DC lifetime. GC can invalidate
// _dependency_context_addr if it relocates the holder
// (e.g. CallSiteContext Java object).
int _safepoint_counter;
uint64_t _safepoint_counter;
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr),
_safepoint_counter(SafepointSynchronize::_safepoint_counter) {}
_safepoint_counter(SafepointSynchronize::safepoint_counter()) {}
~DependencyContext() {
assert(_safepoint_counter == SafepointSynchronize::_safepoint_counter, "safepoint happened");
assert(_safepoint_counter == SafepointSynchronize::safepoint_counter(), "safepoint happened");
}
#else
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr) {}

View File

@ -565,6 +565,7 @@ nmethod::nmethod(
ByteSize basic_lock_sp_offset,
OopMapSet* oop_maps )
: CompiledMethod(method, "native nmethod", type, nmethod_size, sizeof(nmethod), code_buffer, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps, false),
_is_unloading_state(0),
_native_receiver_sp_offset(basic_lock_owner_sp_offset),
_native_basic_lock_sp_offset(basic_lock_sp_offset)
{
@ -609,6 +610,7 @@ nmethod::nmethod(
code_buffer->copy_code_and_locs_to(this);
code_buffer->copy_values_to(this);
clear_unloading_state();
if (ScavengeRootsInCode) {
Universe::heap()->register_nmethod(this);
}
@ -672,6 +674,7 @@ nmethod::nmethod(
#endif
)
: CompiledMethod(method, "nmethod", type, nmethod_size, sizeof(nmethod), code_buffer, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps, false),
_is_unloading_state(0),
_native_receiver_sp_offset(in_ByteSize(-1)),
_native_basic_lock_sp_offset(in_ByteSize(-1))
{
@ -1016,13 +1019,20 @@ void nmethod::mark_as_seen_on_stack() {
// there are no activations on the stack, not in use by the VM,
// and not in use by the ServiceThread)
bool nmethod::can_convert_to_zombie() {
assert(is_not_entrant(), "must be a non-entrant method");
// Note that this is called when the sweeper has observed the nmethod to be
// not_entrant. However, with concurrent code cache unloading, the state
// might have moved on to unloaded if it is_unloading(), due to racing
// concurrent GC threads.
assert(is_not_entrant() || is_unloading(), "must be a non-entrant method");
// Since the nmethod sweeper only does partial sweep the sweeper's traversal
// count can be greater than the stack traversal count before it hits the
// nmethod for the second time.
return stack_traversal_mark()+1 < NMethodSweeper::traversal_count() &&
!is_locked_by_vm();
// If an is_unloading() nmethod is still not_entrant, then it is not safe to
// convert it to zombie due to GC unloading interactions. However, if it
// has become unloaded, then it is okay to convert such nmethods to zombie.
return stack_traversal_mark() + 1 < NMethodSweeper::traversal_count() &&
!is_locked_by_vm() && (!is_unloading() || is_unloaded());
}
void nmethod::inc_decompile_count() {
@ -1090,8 +1100,6 @@ void nmethod::make_unloaded() {
// Unregister must be done before the state change
Universe::heap()->unregister_nmethod(this);
_state = unloaded;
// Log the unloading.
log_state_change();
@ -1107,6 +1115,13 @@ void nmethod::make_unloaded() {
set_osr_link(NULL);
NMethodSweeper::report_state_change(this);
// The release is only needed for compile-time ordering, as accesses
// into the nmethod after the store are not safe due to the sweeper
// being allowed to free it when the store is observed, during
// concurrent nmethod unloading. Therefore, there is no need for
// acquire on the loader side.
OrderAccess::release_store(&_state, (signed char)unloaded);
}
void nmethod::invalidate_osr_method() {
@ -1505,6 +1520,74 @@ void nmethod::metadata_do(void f(Metadata*)) {
if (_method != NULL) f(_method);
}
// The _is_unloading_state encodes a tuple comprising the unloading cycle
// and the result of IsUnloadingBehaviour::is_unloading() fpr that cycle.
// This is the bit layout of the _is_unloading_state byte: 00000CCU
// CC refers to the cycle, which has 2 bits, and U refers to the result of
// IsUnloadingBehaviour::is_unloading() for that unloading cycle.
class IsUnloadingState: public AllStatic {
static const uint8_t _is_unloading_mask = 1;
static const uint8_t _is_unloading_shift = 0;
static const uint8_t _unloading_cycle_mask = 6;
static const uint8_t _unloading_cycle_shift = 1;
static uint8_t set_is_unloading(uint8_t state, bool value) {
state &= ~_is_unloading_mask;
if (value) {
state |= 1 << _is_unloading_shift;
}
assert(is_unloading(state) == value, "unexpected unloading cycle overflow");
return state;
}
static uint8_t set_unloading_cycle(uint8_t state, uint8_t value) {
state &= ~_unloading_cycle_mask;
state |= value << _unloading_cycle_shift;
assert(unloading_cycle(state) == value, "unexpected unloading cycle overflow");
return state;
}
public:
static bool is_unloading(uint8_t state) { return (state & _is_unloading_mask) >> _is_unloading_shift == 1; }
static uint8_t unloading_cycle(uint8_t state) { return (state & _unloading_cycle_mask) >> _unloading_cycle_shift; }
static uint8_t create(bool is_unloading, uint8_t unloading_cycle) {
uint8_t state = 0;
state = set_is_unloading(state, is_unloading);
state = set_unloading_cycle(state, unloading_cycle);
return state;
}
};
bool nmethod::is_unloading() {
uint8_t state = RawAccess<MO_RELAXED>::load(&_is_unloading_state);
bool state_is_unloading = IsUnloadingState::is_unloading(state);
uint8_t state_unloading_cycle = IsUnloadingState::unloading_cycle(state);
if (state_is_unloading) {
return true;
}
if (state_unloading_cycle == CodeCache::unloading_cycle()) {
return false;
}
// The IsUnloadingBehaviour is responsible for checking if there are any dead
// oops in the CompiledMethod, by calling oops_do on it.
state_unloading_cycle = CodeCache::unloading_cycle();
state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
state = IsUnloadingState::create(state_is_unloading, state_unloading_cycle);
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
return state_is_unloading;
}
void nmethod::clear_unloading_state() {
uint8_t state = IsUnloadingState::create(false, CodeCache::unloading_cycle());
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
}
// This is called at the end of the strong tracing/marking phase of a
// GC to unload an nmethod if it contains otherwise unreachable
@ -1842,11 +1925,11 @@ void nmethod::check_all_dependencies(DepChange& changes) {
// Iterate over live nmethods and check dependencies of all nmethods that are not
// marked for deoptimization. A particular dependency is only checked once.
NMethodIterator iter;
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
while(iter.next()) {
nmethod* nm = iter.method();
// Only notify for live nmethods
if (nm->is_alive() && !nm->is_marked_for_deoptimization()) {
if (!nm->is_marked_for_deoptimization()) {
for (Dependencies::DepStream deps(nm); deps.next(); ) {
// Construct abstraction of a dependency.
DependencySignature* current_sig = new DependencySignature(deps);
@ -2841,7 +2924,7 @@ void nmethod::maybe_invalidate_installed_code() {
// Update the values in the InstalledCode instance if it still refers to this nmethod
nmethod* nm = (nmethod*)InstalledCode::address(installed_code);
if (nm == this) {
if (!is_alive()) {
if (!is_alive() || is_unloading()) {
// Break the link between nmethod and InstalledCode such that the nmethod
// can subsequently be flushed safely. The link must be maintained while
// the method could have live activations since invalidateInstalledCode
@ -2856,7 +2939,7 @@ void nmethod::maybe_invalidate_installed_code() {
}
}
}
if (!is_alive()) {
if (!is_alive() || is_unloading()) {
// Clear these out after the nmethod has been unregistered and any
// updates to the InstalledCode instance have been performed.
clear_jvmci_installed_code();
@ -2880,7 +2963,7 @@ void nmethod::invalidate_installed_code(Handle installedCode, TRAPS) {
{
MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
// This relationship can only be checked safely under a lock
assert(!nm->is_alive() || nm->jvmci_installed_code() == installedCode(), "sanity check");
assert(!nm->is_alive() || nm->is_unloading() || nm->jvmci_installed_code() == installedCode(), "sanity check");
}
#endif

View File

@ -158,6 +158,9 @@ class nmethod : public CompiledMethod {
// counter is decreased (by 1) while sweeping.
int _hotness_counter;
// Local state used to keep track of whether unloading is happening or not
volatile uint8_t _is_unloading_state;
// These are used for compiled synchronized native methods to
// locate the owner and stack slot for the BasicLock so that we can
// properly revoke the bias of the owner if necessary. They are
@ -323,6 +326,8 @@ class nmethod : public CompiledMethod {
bool is_zombie() const { return _state == zombie; }
bool is_unloaded() const { return _state == unloaded; }
void clear_unloading_state();
virtual bool is_unloading();
virtual void do_unloading(bool unloading_occurred);
#if INCLUDE_RTM_OPT

View File

@ -1946,7 +1946,8 @@ static void codecache_print(outputStream* out, bool detailed) {
}
}
void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env) {
void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env,
int compilable, const char* failure_reason) {
if (success) {
task->mark_success();
if (ci_env != NULL) {
@ -1958,6 +1959,13 @@ void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool
_compilation_log->log_nmethod(thread, code);
}
}
} else if (AbortVMOnCompilationFailure) {
if (compilable == ciEnv::MethodCompilable_not_at_tier) {
fatal("Not compilable at tier %d: %s", task->comp_level(), failure_reason);
}
if (compilable == ciEnv::MethodCompilable_never) {
fatal("Never compilable: %s", failure_reason);
}
}
// simulate crash during compilation
assert(task->compile_id() != CICrashAt, "just as planned");
@ -2068,7 +2076,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
compilable = ciEnv::MethodCompilable_not_at_tier;
}
}
post_compile(thread, task, task->code() != NULL, NULL);
post_compile(thread, task, task->code() != NULL, NULL, compilable, failure_reason);
if (event.should_commit()) {
post_compilation_event(&event, task);
}
@ -2128,7 +2136,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
ci_env.report_failure(failure_reason);
}
post_compile(thread, task, !ci_env.failing(), &ci_env);
post_compile(thread, task, !ci_env.failing(), &ci_env, compilable, failure_reason);
if (event.should_commit()) {
post_compilation_event(&event, task);
}

View File

@ -252,7 +252,8 @@ class CompileBroker: AllStatic {
#endif
static void invoke_compiler_on_method(CompileTask* task);
static void post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env);
static void post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env,
int compilable, const char* failure_reason);
static void set_last_compile(CompilerThread *thread, const methodHandle& method, bool is_osr, int comp_level);
static void push_jni_handle_block();
static void pop_jni_handle_block();

View File

@ -31,6 +31,7 @@
#include "gc/g1/heapRegion.hpp"
#include "opto/arraycopynode.hpp"
#include "opto/compile.hpp"
#include "opto/escape.hpp"
#include "opto/graphKit.hpp"
#include "opto/idealKit.hpp"
#include "opto/macro.hpp"
@ -840,3 +841,32 @@ void G1BarrierSetC2::verify_gc_barriers(Compile* compile, CompilePhase phase) co
}
}
#endif
bool G1BarrierSetC2::escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const {
if (opcode == Op_StoreP) {
Node* adr = n->in(MemNode::Address);
const Type* adr_type = gvn->type(adr);
// Pointer stores in G1 barriers looks like unsafe access.
// Ignore such stores to be able scalar replace non-escaping
// allocations.
if (adr_type->isa_rawptr() && adr->is_AddP()) {
Node* base = conn_graph->get_addp_base(adr);
if (base->Opcode() == Op_LoadP &&
base->in(MemNode::Address)->is_AddP()) {
adr = base->in(MemNode::Address);
Node* tls = conn_graph->get_addp_base(adr);
if (tls->Opcode() == Op_ThreadLocal) {
int offs = (int) gvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
const int buf_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
if (offs == buf_offset) {
return true; // G1 pre barrier previous oop value store.
}
if (offs == in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset())) {
return true; // G1 post barrier card address store.
}
}
}
}
}
return false;
}

View File

@ -92,6 +92,8 @@ protected:
#ifdef ASSERT
virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
#endif
virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const;
};
#endif // SHARE_GC_SHARED_C2_G1BARRIERSETC2_HPP

View File

@ -28,6 +28,7 @@
#include "gc/g1/g1RemSet.hpp"
#include "gc/g1/g1ThreadLocalData.hpp"
#include "gc/g1/heapRegionRemSet.hpp"
#include "gc/shared/suspendibleThreadSet.hpp"
#include "gc/shared/workgroup.hpp"
#include "runtime/atomic.hpp"
#include "runtime/mutexLocker.hpp"
@ -146,18 +147,15 @@ uint DirtyCardQueueSet::num_par_ids() {
}
void DirtyCardQueueSet::initialize(Monitor* cbl_mon,
Mutex* fl_lock,
BufferNode::Allocator* allocator,
int process_completed_threshold,
int max_completed_queue,
Mutex* lock,
DirtyCardQueueSet* fl_owner,
bool init_free_ids) {
PtrQueueSet::initialize(cbl_mon,
fl_lock,
allocator,
process_completed_threshold,
max_completed_queue,
fl_owner);
set_buffer_size(G1UpdateBufferSize);
max_completed_queue);
_shared_dirty_card_queue.set_lock(lock);
if (init_free_ids) {
_free_ids = new FreeIdSet(num_par_ids(), _cbl_mon);

View File

@ -118,11 +118,10 @@ public:
DirtyCardQueueSet(bool notify_when_complete = true);
void initialize(Monitor* cbl_mon,
Mutex* fl_lock,
BufferNode::Allocator* allocator,
int process_completed_threshold,
int max_completed_queue,
Mutex* lock,
DirtyCardQueueSet* fl_owner,
bool init_free_ids = false);
// The number of parallel ids that can be claimed to allow collector or

View File

@ -262,8 +262,9 @@ public:
// Create the _archive_region_map which is used to identify archive objects.
static inline void enable_archive_object_check();
// Set the regions containing the specified address range as archive/non-archive.
// Mark regions containing the specified address range as archive/non-archive.
static inline void set_range_archive(MemRegion range, bool open);
static inline void clear_range_archive(MemRegion range, bool open);
// Check if the object is in closed archive
static inline bool is_closed_archive_object(oop object);

View File

@ -109,6 +109,10 @@ inline void G1ArchiveAllocator::enable_archive_object_check() {
// Set the regions containing the specified address range as archive.
inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
assert(_archive_check_enabled, "archive range check not enabled");
log_info(gc, cds)("Mark %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
open ? "open" : "closed",
p2i(range.start()),
p2i(range.last()));
if (open) {
_open_archive_region_map.set_by_address(range, true);
} else {
@ -116,6 +120,20 @@ inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
}
}
// Clear the archive regions map containing the specified address range.
inline void G1ArchiveAllocator::clear_range_archive(MemRegion range, bool open) {
assert(_archive_check_enabled, "archive range check not enabled");
log_info(gc, cds)("Clear %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
open ? "open" : "closed",
p2i(range.start()),
p2i(range.last()));
if (open) {
_open_archive_region_map.set_by_address(range, false);
} else {
_closed_archive_region_map.set_by_address(range, false);
}
}
// Check if an object is in a closed archive region using the _archive_region_map.
inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
// This is the out-of-line part of is_closed_archive_object test, done separately

View File

@ -55,6 +55,8 @@ G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
make_barrier_set_c2<G1BarrierSetC2>(),
card_table,
BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)),
_satb_mark_queue_buffer_allocator(G1SATBBufferSize, SATB_Q_FL_lock),
_dirty_card_queue_buffer_allocator(G1UpdateBufferSize, DirtyCardQ_FL_lock),
_satb_mark_queue_set(),
_dirty_card_queue_set()
{}
@ -202,3 +204,11 @@ void G1BarrierSet::on_thread_detach(JavaThread* thread) {
G1ThreadLocalData::satb_mark_queue(thread).flush();
G1ThreadLocalData::dirty_card_queue(thread).flush();
}
BufferNode::Allocator& G1BarrierSet::satb_mark_queue_buffer_allocator() {
return _satb_mark_queue_buffer_allocator;
}
BufferNode::Allocator& G1BarrierSet::dirty_card_queue_buffer_allocator() {
return _dirty_card_queue_buffer_allocator;
}

View File

@ -39,6 +39,8 @@ class G1CardTable;
class G1BarrierSet: public CardTableBarrierSet {
friend class VMStructs;
private:
BufferNode::Allocator _satb_mark_queue_buffer_allocator;
BufferNode::Allocator _dirty_card_queue_buffer_allocator;
G1SATBMarkQueueSet _satb_mark_queue_set;
DirtyCardQueueSet _dirty_card_queue_set;
@ -79,6 +81,9 @@ class G1BarrierSet: public CardTableBarrierSet {
virtual void on_thread_attach(JavaThread* thread);
virtual void on_thread_detach(JavaThread* thread);
BufferNode::Allocator& satb_mark_queue_buffer_allocator();
BufferNode::Allocator& dirty_card_queue_buffer_allocator();
static G1SATBMarkQueueSet& satb_mark_queue_set() {
return g1_barrier_set()->_satb_mark_queue_set;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2018, 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
@ -76,7 +76,9 @@ G1CodeRootSetTable::~G1CodeRootSetTable() {
}
}
assert(number_of_entries() == 0, "should have removed all entries");
free_buckets();
// Each of the entries in new_entry_free_list() have been allocated in
// G1CodeRootSetTable::new_entry(). We never call the block allocator
// in BasicHashtable::new_entry().
for (BasicHashtableEntry<mtGC>* e = new_entry_free_list(); e != NULL; e = new_entry_free_list()) {
FREE_C_HEAP_ARRAY(char, e);
}

View File

@ -753,7 +753,7 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t min_word_size,
return result;
}
void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count) {
void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count, bool is_open) {
assert(!is_init_completed(), "Expect to be called at JVM init time");
assert(ranges != NULL, "MemRegion array NULL");
assert(count != 0, "No MemRegions provided");
@ -815,7 +815,7 @@ void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count) {
}
// Notify mark-sweep that this is no longer an archive range.
G1ArchiveAllocator::set_range_archive(ranges[i], false);
G1ArchiveAllocator::clear_range_archive(ranges[i], is_open);
}
if (uncommitted_regions != 0) {
@ -1653,6 +1653,28 @@ jint G1CollectedHeap::initialize() {
BarrierSet::set_barrier_set(bs);
_card_table = ct;
G1BarrierSet::satb_mark_queue_set().initialize(this,
SATB_Q_CBL_mon,
&bs->satb_mark_queue_buffer_allocator(),
G1SATBProcessCompletedThreshold,
G1SATBBufferEnqueueingThresholdPercent,
Shared_SATB_Q_lock);
// process_completed_threshold and max_completed_queue are updated
// later, based on the concurrent refinement object.
G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
&bs->dirty_card_queue_buffer_allocator(),
-1, // temp. never trigger
-1, // temp. no limit
Shared_DirtyCardQ_lock,
true); // init_free_ids
dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
&bs->dirty_card_queue_buffer_allocator(),
-1, // never trigger processing
-1, // no limit on length
Shared_DirtyCardQ_lock);
// Create the hot card cache.
_hot_card_cache = new G1HotCardCache(this);
@ -1749,13 +1771,6 @@ jint G1CollectedHeap::initialize() {
// Perform any initialization actions delegated to the policy.
g1_policy()->init(this, &_collection_set);
G1BarrierSet::satb_mark_queue_set().initialize(this,
SATB_Q_CBL_mon,
SATB_Q_FL_lock,
G1SATBProcessCompletedThreshold,
G1SATBBufferEnqueueingThresholdPercent,
Shared_SATB_Q_lock);
jint ecode = initialize_concurrent_refinement();
if (ecode != JNI_OK) {
return ecode;
@ -1766,20 +1781,11 @@ jint G1CollectedHeap::initialize() {
return ecode;
}
G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
DirtyCardQ_FL_lock,
(int)concurrent_refine()->yellow_zone(),
(int)concurrent_refine()->red_zone(),
Shared_DirtyCardQ_lock,
NULL, // fl_owner
true); // init_free_ids
dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
DirtyCardQ_FL_lock,
-1, // never trigger processing
-1, // no limit on length
Shared_DirtyCardQ_lock,
&G1BarrierSet::dirty_card_queue_set());
{
DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
dcqs.set_process_completed_threshold((int)concurrent_refine()->yellow_zone());
dcqs.set_max_completed_queue((int)concurrent_refine()->red_zone());
}
// Here we allocate the dummy HeapRegion that is required by the
// G1AllocRegion class.

View File

@ -683,7 +683,7 @@ public:
// which had been allocated by alloc_archive_regions. This should be called
// rather than fill_archive_regions at JVM init time if the archive file
// mapping failed, with the same non-overlapping and sorted MemRegion array.
void dealloc_archive_regions(MemRegion* range, size_t count);
void dealloc_archive_regions(MemRegion* range, size_t count, bool is_open);
oop materialize_archived_object(oop obj);

Some files were not shown because too many files have changed in this diff Show More