Merge
This commit is contained in:
commit
01267bb7ca
2
.hgtags
2
.hgtags
@ -522,3 +522,5 @@ f8626bcc169813a4b2a15880386b952719d1d6d1 jdk-12+15
|
|||||||
eefa65e142af305923d2adcd596fab9c639723a1 jdk-12+17
|
eefa65e142af305923d2adcd596fab9c639723a1 jdk-12+17
|
||||||
e38473506688e0995e701fc7f77d5a91b438ef93 jdk-12+18
|
e38473506688e0995e701fc7f77d5a91b438ef93 jdk-12+18
|
||||||
dc1f9dec2018a37fedba47d8a2aedef99faaec64 jdk-12+19
|
dc1f9dec2018a37fedba47d8a2aedef99faaec64 jdk-12+19
|
||||||
|
40098289d5804c3b5e7074bc75501a81e70d9b0d jdk-12+20
|
||||||
|
f8fb0c86f2b3d24294d39c5685a628e1beb14ba7 jdk-12+21
|
||||||
|
@ -69,6 +69,7 @@
|
|||||||
</ul></li>
|
</ul></li>
|
||||||
<li><a href="#running-tests">Running Tests</a></li>
|
<li><a href="#running-tests">Running Tests</a></li>
|
||||||
<li><a href="#cross-compiling">Cross-compiling</a><ul>
|
<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="#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="#specifying-the-target-platform">Specifying the Target Platform</a></li>
|
||||||
<li><a href="#toolchain-considerations">Toolchain Considerations</a></li>
|
<li><a href="#toolchain-considerations">Toolchain Considerations</a></li>
|
||||||
@ -93,7 +94,7 @@
|
|||||||
<li><a href="#getting-help">Getting Help</a></li>
|
<li><a href="#getting-help">Getting Help</a></li>
|
||||||
</ul></li>
|
</ul></li>
|
||||||
<li><a href="#hints-and-suggestions-for-advanced-users">Hints and Suggestions for Advanced Users</a><ul>
|
<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="#bash-completion">Bash Completion</a></li>
|
||||||
<li><a href="#using-multiple-configurations">Using Multiple Configurations</a></li>
|
<li><a href="#using-multiple-configurations">Using Multiple Configurations</a></li>
|
||||||
<li><a href="#handling-reconfigurations">Handling Reconfigurations</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>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>
|
<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>
|
<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>
|
<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>
|
<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>
|
<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>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>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>
|
<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=<devkit-path> --openjdk-target=ppc64-linux-gnu && make</code></pre>
|
||||||
|
<p>will configure and build OpenJDK for Linux/ppc64 assuming that <code><devkit-path></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="<TARGET_TRIPLET>+" ] [ BASE_OS=<OS> ] [ BASE_OS_VERSION=<VER> ]</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 "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 <code>BASE_OS_VERSION</code> option (with "27" 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="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</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>
|
<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>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 "Build JDK", 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>
|
<p>To be able to build, we need a "Build JDK", 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;">Target</th>
|
||||||
<th style="text-align: left;"><code>CC</code></th>
|
<th style="text-align: left;"><code>CC</code></th>
|
||||||
<th style="text-align: left;"><code>CXX</code></th>
|
<th style="text-align: left;"><code>CXX</code></th>
|
||||||
<th><code>--arch=...</code></th>
|
<th style="text-align: left;"><code>--arch=...</code></th>
|
||||||
<th><code>--openjdk-target=...</code></th>
|
<th style="text-align: left;"><code>--openjdk-target=...</code></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<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;">x86</td>
|
||||||
<td style="text-align: left;">default</td>
|
<td style="text-align: left;">default</td>
|
||||||
<td style="text-align: left;">default</td>
|
<td style="text-align: left;">default</td>
|
||||||
<td>i386</td>
|
<td style="text-align: left;">i386</td>
|
||||||
<td>i386-linux-gnu</td>
|
<td style="text-align: left;">i386-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="even">
|
<tr class="even">
|
||||||
<td style="text-align: left;">armhf</td>
|
<td style="text-align: left;">armhf</td>
|
||||||
<td style="text-align: left;">gcc-arm-linux-gnueabihf</td>
|
<td style="text-align: left;">gcc-arm-linux-gnueabihf</td>
|
||||||
<td style="text-align: left;">g++-arm-linux-gnueabihf</td>
|
<td style="text-align: left;">g++-arm-linux-gnueabihf</td>
|
||||||
<td>armhf</td>
|
<td style="text-align: left;">armhf</td>
|
||||||
<td>arm-linux-gnueabihf</td>
|
<td style="text-align: left;">arm-linux-gnueabihf</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="odd">
|
<tr class="odd">
|
||||||
<td style="text-align: left;">aarch64</td>
|
<td style="text-align: left;">aarch64</td>
|
||||||
<td style="text-align: left;">gcc-aarch64-linux-gnu</td>
|
<td style="text-align: left;">gcc-aarch64-linux-gnu</td>
|
||||||
<td style="text-align: left;">g++-aarch64-linux-gnu</td>
|
<td style="text-align: left;">g++-aarch64-linux-gnu</td>
|
||||||
<td>arm64</td>
|
<td style="text-align: left;">arm64</td>
|
||||||
<td>aarch64-linux-gnu</td>
|
<td style="text-align: left;">aarch64-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="even">
|
<tr class="even">
|
||||||
<td style="text-align: left;">ppc64el</td>
|
<td style="text-align: left;">ppc64el</td>
|
||||||
<td style="text-align: left;">gcc-powerpc64le-linux-gnu</td>
|
<td style="text-align: left;">gcc-powerpc64le-linux-gnu</td>
|
||||||
<td style="text-align: left;">g++-powerpc64le-linux-gnu</td>
|
<td style="text-align: left;">g++-powerpc64le-linux-gnu</td>
|
||||||
<td>ppc64el</td>
|
<td style="text-align: left;">ppc64el</td>
|
||||||
<td>powerpc64le-linux-gnu</td>
|
<td style="text-align: left;">powerpc64le-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="odd">
|
<tr class="odd">
|
||||||
<td style="text-align: left;">s390x</td>
|
<td style="text-align: left;">s390x</td>
|
||||||
<td style="text-align: left;">gcc-s390x-linux-gnu</td>
|
<td style="text-align: left;">gcc-s390x-linux-gnu</td>
|
||||||
<td style="text-align: left;">g++-s390x-linux-gnu</td>
|
<td style="text-align: left;">g++-s390x-linux-gnu</td>
|
||||||
<td>s390x</td>
|
<td style="text-align: left;">s390x</td>
|
||||||
<td>s390x-linux-gnu</td>
|
<td style="text-align: left;">s390x-linux-gnu</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</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>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>
|
<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>
|
<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>
|
<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">
|
<ol type="1">
|
||||||
<li><p>Make sure your forest is up-to-date</p>
|
<li><p>Make sure your repository 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>
|
<p>Run <code>hg pull -u</code> to make sure you have the latest changes.</p></li>
|
||||||
<li><p>Clean build results</p>
|
<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>
|
<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>
|
<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
|
make dist-clean
|
||||||
bash configure $(cat current-configuration)
|
bash configure $(cat current-configuration)
|
||||||
make</code></pre></li>
|
make</code></pre></li>
|
||||||
<li><p>Re-clone the Mercurial forest</p>
|
<li><p>Re-clone the Mercurial repository</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 "sledgehammer approach": 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>
|
<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 "sledgehammer approach": 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>
|
</ol>
|
||||||
<h3 id="specific-build-issues">Specific Build Issues</h3>
|
<h3 id="specific-build-issues">Specific Build Issues</h3>
|
||||||
<h4 id="clock-skew">Clock Skew</h4>
|
<h4 id="clock-skew">Clock Skew</h4>
|
||||||
@ -813,10 +855,15 @@ cannot create ... Permission denied
|
|||||||
spawn failed</code></pre>
|
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>
|
<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>
|
<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='openjdk.java.net';a='@';n='build-dev';e=n+a+h;
|
||||||
|
document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'" clas'+'s="em' + 'ail">'+e+'<\/'+'a'+'>');
|
||||||
|
// -->
|
||||||
|
</script><noscript>build-dev at openjdk dot java dot net</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>
|
<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>
|
<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>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>
|
<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 ~
|
<pre><code>cd ~
|
||||||
@ -829,7 +876,6 @@ defpath=~/hg-ext/defpath/defpath.py
|
|||||||
EOT</code></pre>
|
EOT</code></pre>
|
||||||
<p>You can now setup a proper push path using:</p>
|
<p>You can now setup a proper push path using:</p>
|
||||||
<pre><code>hg defpath -d -u <your OpenJDK username></code></pre>
|
<pre><code>hg defpath -d -u <your OpenJDK username></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 <username></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>
|
<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><tab></code> or <code><tab><tab></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>The <code>configure</code> and <code>make</code> commands tries to play nice with bash command-line completion (using <code><tab></code> or <code><tab><tab></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<tab></code> will complete to <code>make jdk-image</code>.</p>
|
<p>Make completion will work out of the box, and will complete valid make targets. For instance, typing <code>make jdk-i<tab></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>
|
sudo mv /tmp/configure /usr/local/bin</code></pre>
|
||||||
<p>Now <code>configure --en<tab>-dt<tab></code> will result in <code>configure --enable-dtrace</code>.</p>
|
<p>Now <code>configure --en<tab>-dt<tab></code> will result in <code>configure --enable-dtrace</code>.</p>
|
||||||
<h3 id="using-multiple-configurations">Using Multiple Configurations</h3>
|
<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=<name></code> to create a configuration with the name <code><name></code>. Alternatively, you can create a directory under <code>build</code> and run <code>configure</code> from there, e.g. <code>mkdir build/<name> && cd build/<name> && 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=<name></code> to create a configuration with the name <code><name></code>. Alternatively, you can create a directory under <code>build</code> and run <code>configure</code> from there, e.g. <code>mkdir build/<name> && cd build/<name> && bash ../../configure</code>.</p>
|
||||||
<p>Then you can build that configuration using <code>make CONF_NAME=<name></code> or <code>make CONF=<pattern></code>, where <code><pattern></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/<name> && make</code>.</p>
|
<p>Then you can build that configuration using <code>make CONF_NAME=<name></code> or <code>make CONF=<pattern></code>, where <code><pattern></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/<name> && make</code>.</p>
|
||||||
<h3 id="handling-reconfigurations">Handling Reconfigurations</h3>
|
<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>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>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>
|
<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>
|
||||||
|
@ -48,7 +48,7 @@ JDK.
|
|||||||
Make sure you are getting the correct version. As of JDK 10, the source is no
|
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
|
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
|
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
|
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.
|
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
|
full-blown cross-compilation. (While this surely is possible, it's a lot more
|
||||||
work and will take much longer to build.)
|
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
|
### Boot JDK and Build JDK
|
||||||
|
|
||||||
When cross-compiling, make sure you use a boot JDK that runs on the *build*
|
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
|
affected parts get rebuilt. While this works great in most cases, and
|
||||||
significantly speed up the development process, from time to time complex
|
significantly speed up the development process, from time to time complex
|
||||||
interdependencies will result in an incorrect build result. This is the most
|
interdependencies will result in an incorrect build result. This is the most
|
||||||
common cause for unexpected build problems, together with inconsistencies
|
common cause for unexpected build problems.
|
||||||
between the different Mercurial repositories in the forest.
|
|
||||||
|
|
||||||
Here are a suggested list of things to try if you are having unexpected build
|
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
|
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.
|
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
|
Run `hg pull -u` to make sure you have the latest changes.
|
||||||
repositories.
|
|
||||||
|
|
||||||
2. Clean build results
|
2. Clean build results
|
||||||
|
|
||||||
@ -1336,13 +1392,13 @@ order. Most issues will be solved at step 1 or 2.
|
|||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Re-clone the Mercurial forest
|
4. Re-clone the Mercurial repository
|
||||||
|
|
||||||
Sometimes the Mercurial repositories themselves gets in a state that causes
|
Sometimes the Mercurial repository gets in a state that causes the product
|
||||||
the product to be un-buildable. In such a case, the simplest solution is
|
to be un-buildable. In such a case, the simplest solution is often the
|
||||||
often the "sledgehammer approach": delete the entire forest, and re-clone
|
"sledgehammer approach": delete the entire repository, and re-clone it.
|
||||||
it. If you have local changes, save them first to a different location
|
If you have local changes, save them first to a different location using
|
||||||
using `hg export`.
|
`hg export`.
|
||||||
|
|
||||||
### Specific Build Issues
|
### Specific Build Issues
|
||||||
|
|
||||||
@ -1393,7 +1449,7 @@ contact the Adoption Group. See the section on [Contributing to OpenJDK](
|
|||||||
|
|
||||||
## Hints and Suggestions for Advanced Users
|
## 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
|
To help you prepare a proper push path for a Mercurial repository, there exists
|
||||||
a useful tool known as [defpath](
|
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>
|
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
|
### Bash Completion
|
||||||
|
|
||||||
The `configure` and `make` commands tries to play nice with bash command-line
|
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
|
### 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
|
create a new configuration, run `configure --with-conf-name=<name>` to create a
|
||||||
configuration with the name `<name>`. Alternatively, you can create a directory
|
configuration with the name `<name>`. Alternatively, you can create a directory
|
||||||
under `build` and run `configure` from there, e.g. `mkdir build/<name> && cd
|
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
|
### 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`.
|
build system will force you to re-run `configure`.
|
||||||
|
|
||||||
Most of the time, you will be fine by running `configure` again with the same
|
Most of the time, you will be fine by running `configure` again with the same
|
||||||
|
@ -24,12 +24,14 @@
|
|||||||
<li><a href="#test-selection">Test selection</a><ul>
|
<li><a href="#test-selection">Test selection</a><ul>
|
||||||
<li><a href="#jtreg">JTReg</a></li>
|
<li><a href="#jtreg">JTReg</a></li>
|
||||||
<li><a href="#gtest">Gtest</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>
|
<li><a href="#special-tests">Special tests</a></li>
|
||||||
</ul></li>
|
</ul></li>
|
||||||
<li><a href="#test-results-and-summary">Test results and summary</a></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="#test-suite-control">Test suite control</a><ul>
|
||||||
<li><a href="#jtreg-keywords">JTReg keywords</a></li>
|
<li><a href="#jtreg-keywords">JTReg keywords</a></li>
|
||||||
<li><a href="#gtest-keywords">Gtest keywords</a></li>
|
<li><a href="#gtest-keywords">Gtest keywords</a></li>
|
||||||
|
<li><a href="#microbenchmark-keywords">Microbenchmark keywords</a></li>
|
||||||
</ul></li>
|
</ul></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
@ -44,9 +46,11 @@ $ make test TEST=jdk_lang
|
|||||||
$ make test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
|
$ 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="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="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</code></pre>
|
$ make exploded-test TEST=tier2</code></pre>
|
||||||
<h3 id="configuration">Configuration</h3>
|
<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=<path to jtreg home></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 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=<path to jtreg home></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=<path to JMH jars></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>
|
<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>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="tier1"</code>, but the latter is more tab-completion friendly. For more complex test runs, the <code>test TEST="x"</code> solution needs to be used.</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="tier1"</code>, but the latter is more tab-completion friendly. For more complex test runs, the <code>test TEST="x"</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>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>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>/<variant></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>
|
<p>For Gtest, there is a separate test suite for each JVM variant. The JVM variant is defined by adding <code>/<variant></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>
|
<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>
|
<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>
|
<ul>
|
||||||
@ -127,5 +134,22 @@ TEST FAILURE</code></pre>
|
|||||||
<h4 id="options-1">OPTIONS</h4>
|
<h4 id="options-1">OPTIONS</h4>
|
||||||
<p>Additional options to the Gtest test framework.</p>
|
<p>Additional options to the Gtest test framework.</p>
|
||||||
<p>Use <code>GTEST="OPTIONS=--help"</code> to see all available Gtest options.</p>
|
<p>Use <code>GTEST="OPTIONS=--help"</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 <num></code>.</p>
|
||||||
|
<h4 id="iter">ITER</h4>
|
||||||
|
<p>Number of measurement iterations per fork. Same as specifying <code>-i <num></code>.</p>
|
||||||
|
<h4 id="time">TIME</h4>
|
||||||
|
<p>Amount of time to spend in each measurement iteration, in seconds. Same as specifying <code>-r <num></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 <num></code>.</p>
|
||||||
|
<h4 id="warmup_time">WARMUP_TIME</h4>
|
||||||
|
<p>Amount of time to spend in each warmup iteration. Same as specifying <code>-w <num></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 <args></code></p>
|
||||||
|
<h4 id="options-2">OPTIONS</h4>
|
||||||
|
<p>Additional arguments to send to JMH.</p>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -26,6 +26,7 @@ Some example command-lines:
|
|||||||
$ make test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
|
$ 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="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="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
|
$ make exploded-test TEST=tier2
|
||||||
|
|
||||||
### Configuration
|
### 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`
|
containing `lib/jtreg.jar` etc. (An alternative is to set the `JT_HOME`
|
||||||
environment variable to point to the JTReg home before running `configure`.)
|
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
|
## Test selection
|
||||||
|
|
||||||
All functionality is available using the `test` make target. In this use case,
|
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
|
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`.
|
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
|
### Special tests
|
||||||
|
|
||||||
A handful of odd tests that are not covered by any other testing framework are
|
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.
|
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
|
# Override some definitions in the global css file that are not optimal for
|
||||||
# this document.
|
# this document.
|
||||||
|
@ -450,21 +450,17 @@ jdk.internal.vm.compiler_ADD_JAVAC_FLAGS += -parameters -XDstringConcat=inline \
|
|||||||
|
|
||||||
jdk.internal.vm.compiler_EXCLUDES += \
|
jdk.internal.vm.compiler_EXCLUDES += \
|
||||||
jdk.internal.vm.compiler.collections.test \
|
jdk.internal.vm.compiler.collections.test \
|
||||||
org.graalvm.compiler.processor \
|
jdk.tools.jaotc.test \
|
||||||
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 \
|
|
||||||
org.graalvm.compiler.api.directives.test \
|
org.graalvm.compiler.api.directives.test \
|
||||||
org.graalvm.compiler.api.test \
|
org.graalvm.compiler.api.test \
|
||||||
org.graalvm.compiler.asm.aarch64.test \
|
org.graalvm.compiler.asm.aarch64.test \
|
||||||
org.graalvm.compiler.asm.amd64.test \
|
org.graalvm.compiler.asm.amd64.test \
|
||||||
org.graalvm.compiler.asm.sparc.test \
|
org.graalvm.compiler.asm.sparc.test \
|
||||||
org.graalvm.compiler.asm.test \
|
org.graalvm.compiler.asm.test \
|
||||||
|
org.graalvm.compiler.core.aarch64.test \
|
||||||
org.graalvm.compiler.core.amd64.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.core.test \
|
||||||
org.graalvm.compiler.debug.test \
|
org.graalvm.compiler.debug.test \
|
||||||
org.graalvm.compiler.graph.test \
|
org.graalvm.compiler.graph.test \
|
||||||
@ -477,10 +473,18 @@ jdk.internal.vm.compiler_EXCLUDES += \
|
|||||||
org.graalvm.compiler.lir.test \
|
org.graalvm.compiler.lir.test \
|
||||||
org.graalvm.compiler.loop.test \
|
org.graalvm.compiler.loop.test \
|
||||||
org.graalvm.compiler.microbenchmarks \
|
org.graalvm.compiler.microbenchmarks \
|
||||||
|
org.graalvm.compiler.nodeinfo.processor \
|
||||||
org.graalvm.compiler.nodes.test \
|
org.graalvm.compiler.nodes.test \
|
||||||
|
org.graalvm.compiler.options.processor \
|
||||||
org.graalvm.compiler.options.test \
|
org.graalvm.compiler.options.test \
|
||||||
org.graalvm.compiler.phases.common.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.replacements.test \
|
||||||
|
org.graalvm.compiler.serviceprovider.processor \
|
||||||
org.graalvm.compiler.test \
|
org.graalvm.compiler.test \
|
||||||
org.graalvm.compiler.virtual.bench \
|
org.graalvm.compiler.virtual.bench \
|
||||||
org.graalvm.micro.benchmarks \
|
org.graalvm.micro.benchmarks \
|
||||||
|
@ -103,6 +103,7 @@ help:
|
|||||||
$(info $(_) # make test TEST="jdk_lang gtest:all")
|
$(info $(_) # make test TEST="jdk_lang gtest:all")
|
||||||
$(info $(_) JTREG="OPT1=x;OPT2=y" # Control the JTREG test harness)
|
$(info $(_) JTREG="OPT1=x;OPT2=y" # Control the JTREG test harness)
|
||||||
$(info $(_) GTEST="OPT1=x;OPT2=y" # Control the GTEST 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_OPTS="OPT1=x;..." # Generic control of all test harnesses)
|
||||||
$(info $(_) TEST_VM_OPTS="ARG ..." # Same as setting TEST_OPTS to VM_OPTIONS="ARG ...")
|
$(info $(_) TEST_VM_OPTS="ARG ..." # Same as setting TEST_OPTS to VM_OPTIONS="ARG ...")
|
||||||
$(info )
|
$(info )
|
||||||
|
@ -50,7 +50,7 @@ ifeq ($(HAS_SPEC),)
|
|||||||
|
|
||||||
# Make control variables, handled by Init.gmk
|
# Make control variables, handled by Init.gmk
|
||||||
INIT_CONTROL_VARIABLES += LOG CONF CONF_NAME SPEC JOBS TEST_JOBS CONF_CHECK \
|
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
|
# All known make control variables
|
||||||
MAKE_CONTROL_VARIABLES := $(INIT_CONTROL_VARIABLES) TEST JDK_FILTER
|
MAKE_CONTROL_VARIABLES := $(INIT_CONTROL_VARIABLES) TEST JDK_FILTER
|
||||||
@ -264,9 +264,13 @@ ifeq ($(HAS_SPEC),)
|
|||||||
endif
|
endif
|
||||||
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):
|
$$(main_targets_file):
|
||||||
@( cd $$(topdir) && \
|
@( 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 \
|
-I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \
|
||||||
$$(MAKE_LOG_VARS) \
|
$$(MAKE_LOG_VARS) \
|
||||||
create-main-targets-include )
|
create-main-targets-include )
|
||||||
|
@ -493,7 +493,7 @@ ALL_EXPLODED_TEST_TARGETS := $(addprefix exploded-test-, $(ALL_EXPLODED_TESTS))
|
|||||||
ALL_TARGETS += $(ALL_TEST_TARGETS) $(ALL_EXPLODED_TEST_TARGETS)
|
ALL_TARGETS += $(ALL_TEST_TARGETS) $(ALL_EXPLODED_TEST_TARGETS)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Build tests
|
# Build tests and microbenchmarks
|
||||||
#
|
#
|
||||||
|
|
||||||
prepare-test-image:
|
prepare-test-image:
|
||||||
@ -543,11 +543,15 @@ ifeq ($(BUILD_FAILURE_HANDLER), true)
|
|||||||
-f BuildFailureHandler.gmk images)
|
-f BuildFailureHandler.gmk images)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
build-microbenchmark:
|
||||||
|
+($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f test/BuildMicrobenchmark.gmk)
|
||||||
|
|
||||||
ALL_TARGETS += prepare-test-image build-test-hotspot-jtreg-native \
|
ALL_TARGETS += prepare-test-image build-test-hotspot-jtreg-native \
|
||||||
test-image-hotspot-jtreg-native build-test-jdk-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-image-jdk-jtreg-native build-test-lib build-test-failure-handler \
|
||||||
test-failure-handler test-image-failure-handler test-image-hotspot-gtest \
|
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
|
# Run tests
|
||||||
@ -789,6 +793,8 @@ else
|
|||||||
|
|
||||||
jrtfs-jar: interim-langtools
|
jrtfs-jar: interim-langtools
|
||||||
|
|
||||||
|
build-microbenchmark: interim-langtools exploded-image
|
||||||
|
|
||||||
ifeq ($(ENABLE_GENERATE_CLASSLIST), true)
|
ifeq ($(ENABLE_GENERATE_CLASSLIST), true)
|
||||||
ifeq ($(CREATE_BUILDJDK), true)
|
ifeq ($(CREATE_BUILDJDK), true)
|
||||||
# If creating a buildjdk, the interim image needs to be based on that.
|
# 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-jdk-jtreg-native test-image-failure-handler \
|
||||||
test-image-demos-jdk $(JVM_TEST_IMAGE_TARGETS)
|
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.
|
# all-images builds all our deliverables as images.
|
||||||
|
@ -203,11 +203,23 @@ TEST_JOBS_FACTOR_JDL ?= 1
|
|||||||
TEST_JOBS_FACTOR_MACHINE ?= 1
|
TEST_JOBS_FACTOR_MACHINE ?= 1
|
||||||
|
|
||||||
ifeq ($(TEST_JOBS), 0)
|
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) \
|
TEST_JOBS := $(shell $(AWK) \
|
||||||
'BEGIN { \
|
'BEGIN { \
|
||||||
c = $(NUM_CORES) / 2; \
|
c = $(NUM_CORES) / $(CORES_DIVIDER); \
|
||||||
if (c > 12) c = 12; \
|
m = $(MEMORY_SIZE) / $(MEMORY_DIVIDER); \
|
||||||
|
if (c > m) c = m; \
|
||||||
c = c * $(TEST_JOBS_FACTOR); \
|
c = c * $(TEST_JOBS_FACTOR); \
|
||||||
c = c * $(TEST_JOBS_FACTOR_JDL); \
|
c = c * $(TEST_JOBS_FACTOR_JDL); \
|
||||||
c = c * $(TEST_JOBS_FACTOR_MACHINE); \
|
c = c * $(TEST_JOBS_FACTOR_MACHINE); \
|
||||||
@ -225,13 +237,11 @@ ifneq ($(TEST_OPTS), )
|
|||||||
$(info Running tests using TEST_OPTS control variable '$(TEST_OPTS)')
|
$(info Running tests using TEST_OPTS control variable '$(TEST_OPTS)')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
### Jtreg
|
||||||
|
|
||||||
$(eval $(call SetTestOpt,VM_OPTIONS,JTREG))
|
$(eval $(call SetTestOpt,VM_OPTIONS,JTREG))
|
||||||
$(eval $(call SetTestOpt,JAVA_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,JTREG))
|
||||||
$(eval $(call SetTestOpt,AOT_MODULES,GTEST))
|
|
||||||
|
|
||||||
$(eval $(call SetTestOpt,JOBS,JTREG))
|
$(eval $(call SetTestOpt,JOBS,JTREG))
|
||||||
$(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG))
|
$(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG))
|
||||||
@ -247,6 +257,12 @@ ifneq ($(JTREG), )
|
|||||||
$(info Running tests using JTREG control variable '$(JTREG)')
|
$(info Running tests using JTREG control variable '$(JTREG)')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
### Gtest
|
||||||
|
|
||||||
|
$(eval $(call SetTestOpt,VM_OPTIONS,GTEST))
|
||||||
|
$(eval $(call SetTestOpt,JAVA_OPTIONS,GTEST))
|
||||||
|
$(eval $(call SetTestOpt,AOT_MODULES,GTEST))
|
||||||
|
|
||||||
$(eval $(call ParseKeywordVariable, GTEST, \
|
$(eval $(call ParseKeywordVariable, GTEST, \
|
||||||
SINGLE_KEYWORDS := REPEAT AOT_MODULES, \
|
SINGLE_KEYWORDS := REPEAT AOT_MODULES, \
|
||||||
STRING_KEYWORDS := OPTIONS VM_OPTIONS JAVA_OPTIONS, \
|
STRING_KEYWORDS := OPTIONS VM_OPTIONS JAVA_OPTIONS, \
|
||||||
@ -257,6 +273,21 @@ ifneq ($(GTEST), )
|
|||||||
$(info Running tests using GTEST control variable '$(GTEST)')
|
$(info Running tests using GTEST control variable '$(GTEST)')
|
||||||
endif
|
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
|
# Component-specific Jtreg settings
|
||||||
@ -313,6 +344,24 @@ define ParseGtestTestSelection
|
|||||||
)
|
)
|
||||||
endef
|
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
|
# Helper function that removes the TOPDIR part
|
||||||
CleanupJtregPath = \
|
CleanupJtregPath = \
|
||||||
$(strip $(patsubst %/, %, $(subst $(JTREG_TOPDIR)/,, $1)))
|
$(strip $(patsubst %/, %, $(subst $(JTREG_TOPDIR)/,, $1)))
|
||||||
@ -425,6 +474,9 @@ $(foreach test, $(TEST), \
|
|||||||
$(if $(strip $(PARSED_TESTS)), , \
|
$(if $(strip $(PARSED_TESTS)), , \
|
||||||
$(eval PARSED_TESTS += $(call ParseGtestTestSelection, $(test))) \
|
$(eval PARSED_TESTS += $(call ParseGtestTestSelection, $(test))) \
|
||||||
) \
|
) \
|
||||||
|
$(if $(strip $(PARSED_TESTS)), , \
|
||||||
|
$(eval PARSED_TESTS += $(call ParseMicroTestSelection, $(test))) \
|
||||||
|
) \
|
||||||
$(if $(strip $(PARSED_TESTS)), , \
|
$(if $(strip $(PARSED_TESTS)), , \
|
||||||
$(eval PARSED_TESTS += $(call ParseJtregTestSelection, $(test))) \
|
$(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
|
### Rules for Jtreg
|
||||||
|
|
||||||
# Helper function for SetupRunJtregTest. Set a JTREG_* variable from, in order:
|
# 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
|
# we may end up with a lot of JVM's
|
||||||
$1_JTREG_MAX_RAM_PERCENTAGE := $$(shell $$(EXPR) 25 / $$($1_JTREG_JOBS))
|
$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_VERBOSE ?= fail,error,summary
|
||||||
JTREG_RETAIN ?= fail,error
|
JTREG_RETAIN ?= fail,error
|
||||||
|
|
||||||
@ -832,6 +996,9 @@ endef
|
|||||||
UseGtestTestHandler = \
|
UseGtestTestHandler = \
|
||||||
$(if $(filter gtest:%, $1), true)
|
$(if $(filter gtest:%, $1), true)
|
||||||
|
|
||||||
|
UseMicroTestHandler = \
|
||||||
|
$(if $(filter micro:%, $1), true)
|
||||||
|
|
||||||
UseJtregTestHandler = \
|
UseJtregTestHandler = \
|
||||||
$(if $(filter jtreg:%, $1), true)
|
$(if $(filter jtreg:%, $1), true)
|
||||||
|
|
||||||
@ -853,6 +1020,11 @@ $(foreach test, $(TESTS_TO_RUN), \
|
|||||||
TEST := $(test), \
|
TEST := $(test), \
|
||||||
)) \
|
)) \
|
||||||
) \
|
) \
|
||||||
|
$(if $(call UseMicroTestHandler, $(test)), \
|
||||||
|
$(eval $(call SetupRunMicroTest, $(TEST_ID), \
|
||||||
|
TEST := $(test), \
|
||||||
|
)) \
|
||||||
|
) \
|
||||||
$(if $(call UseJtregTestHandler, $(test)), \
|
$(if $(call UseJtregTestHandler, $(test)), \
|
||||||
$(eval $(call SetupRunJtregTest, $(TEST_ID), \
|
$(eval $(call SetupRunJtregTest, $(TEST_ID), \
|
||||||
TEST := $(test), \
|
TEST := $(test), \
|
||||||
|
@ -95,12 +95,12 @@ endef
|
|||||||
# $1: The output file name
|
# $1: The output file name
|
||||||
# $2..$N: The lines to output to the file
|
# $2..$N: The lines to output to the file
|
||||||
define CreateNewSpec
|
define CreateNewSpec
|
||||||
$(if $(strip $(30)), \
|
$(if $(strip $(31)), \
|
||||||
$(error Internal makefile error: \
|
$(error Internal makefile error: \
|
||||||
Too many arguments to macro, please update CreateNewSpec in RunTestsPrebuilt.gmk) \
|
Too many arguments to macro, please update CreateNewSpec in RunTestsPrebuilt.gmk) \
|
||||||
) \
|
) \
|
||||||
$(shell $(RM) $1) \
|
$(shell $(RM) $1) \
|
||||||
$(foreach i, $(call sequence, 2, 29), \
|
$(foreach i, $(call sequence, 2, 30), \
|
||||||
$(if $(strip $($i)), \
|
$(if $(strip $($i)), \
|
||||||
$(call AppendFile, $(strip $($i)), $1) \
|
$(call AppendFile, $(strip $($i)), $1) \
|
||||||
) \
|
) \
|
||||||
@ -220,20 +220,35 @@ else
|
|||||||
PATH_SEP:=:
|
PATH_SEP:=:
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Check number of cores
|
# Check number of cores and memory in MB
|
||||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||||
NUM_CORES := $(shell $(CAT) /proc/cpuinfo | $(GREP) -c processor)
|
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)
|
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||||
NUM_CORES := $(shell /usr/sbin/sysctl -n hw.ncpu)
|
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)
|
else ifeq ($(OPENJDK_TARGET_OS), solaris)
|
||||||
NUM_CORES := $(shell LC_MESSAGES=C /usr/sbin/psrinfo -v | $(GREP) -c on-line)
|
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)
|
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||||
NUM_CORES := $(NUMBER_OF_PROCESSORS)
|
NUM_CORES := $(NUMBER_OF_PROCESSORS)
|
||||||
|
MEMORY_SIZE := $(shell \
|
||||||
|
$(EXPR) `wmic computersystem get totalphysicalmemory -value | $(GREP) = \
|
||||||
|
| $(CUT) -d "=" -f 2-` / 1024 / 1024 \
|
||||||
|
)
|
||||||
endif
|
endif
|
||||||
ifeq ($(NUM_CORES), )
|
ifeq ($(NUM_CORES), )
|
||||||
$(warn Could not find number of CPUs, assuming 1)
|
$(warn Could not find number of CPUs, assuming 1)
|
||||||
NUM_CORES := 1
|
NUM_CORES := 1
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(MEMORY_SIZE), )
|
||||||
|
$(warn Could not find memory size, assuming 1024 MB)
|
||||||
|
MEMORY_SIZE := 1024
|
||||||
|
endif
|
||||||
|
|
||||||
# Setup LD for AOT support
|
# Setup LD for AOT support
|
||||||
ifneq ($(DEVKIT_HOME), )
|
ifneq ($(DEVKIT_HOME), )
|
||||||
@ -298,6 +313,7 @@ $(call CreateNewSpec, $(NEW_SPEC), \
|
|||||||
OPENJDK_TARGET_CPU_BITS := $(OPENJDK_TARGET_CPU_BITS), \
|
OPENJDK_TARGET_CPU_BITS := $(OPENJDK_TARGET_CPU_BITS), \
|
||||||
OPENJDK_TARGET_CPU_ENDIAN := $(OPENJDK_TARGET_CPU_ENDIAN), \
|
OPENJDK_TARGET_CPU_ENDIAN := $(OPENJDK_TARGET_CPU_ENDIAN), \
|
||||||
NUM_CORES := $(NUM_CORES), \
|
NUM_CORES := $(NUM_CORES), \
|
||||||
|
MEMORY_SIZE := $(MEMORY_SIZE), \
|
||||||
LD := $(LD), \
|
LD := $(LD), \
|
||||||
LIBRARY_PREFIX := $(LIBRARY_PREFIX), \
|
LIBRARY_PREFIX := $(LIBRARY_PREFIX), \
|
||||||
SHARED_LIBRARY_SUFFIX := $(SHARED_LIBRARY_SUFFIX), \
|
SHARED_LIBRARY_SUFFIX := $(SHARED_LIBRARY_SUFFIX), \
|
||||||
|
@ -180,6 +180,9 @@ TOOLCHAIN_MISC_CHECKS
|
|||||||
# Setup the JTReg Regression Test Harness.
|
# Setup the JTReg Regression Test Harness.
|
||||||
TOOLCHAIN_SETUP_JTREG
|
TOOLCHAIN_SETUP_JTREG
|
||||||
|
|
||||||
|
# Setup the Java Microbenchmark Harness (JMH)
|
||||||
|
LIB_TESTS_SETUP_JMH
|
||||||
|
|
||||||
# Setup Jib dependency tool
|
# Setup Jib dependency tool
|
||||||
TOOLCHAIN_SETUP_JIB
|
TOOLCHAIN_SETUP_JIB
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ apt_help() {
|
|||||||
ffi)
|
ffi)
|
||||||
PKGHANDLER_COMMAND="sudo apt-get install libffi-dev" ;;
|
PKGHANDLER_COMMAND="sudo apt-get install libffi-dev" ;;
|
||||||
x11)
|
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)
|
ccache)
|
||||||
PKGHANDLER_COMMAND="sudo apt-get install ccache" ;;
|
PKGHANDLER_COMMAND="sudo apt-get install ccache" ;;
|
||||||
dtrace)
|
dtrace)
|
||||||
@ -125,7 +125,7 @@ yum_help() {
|
|||||||
freetype)
|
freetype)
|
||||||
PKGHANDLER_COMMAND="sudo yum install freetype-devel" ;;
|
PKGHANDLER_COMMAND="sudo yum install freetype-devel" ;;
|
||||||
x11)
|
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)
|
ccache)
|
||||||
PKGHANDLER_COMMAND="sudo yum install ccache" ;;
|
PKGHANDLER_COMMAND="sudo yum install ccache" ;;
|
||||||
esac
|
esac
|
||||||
|
@ -55,3 +55,65 @@ AC_DEFUN_ONCE([LIB_TESTS_SETUP_GRAALUNIT],
|
|||||||
AC_SUBST(GRAALUNIT_LIB)
|
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)
|
||||||
|
])
|
||||||
|
@ -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.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -99,8 +99,14 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
|||||||
OLD_CFLAGS="$CFLAGS"
|
OLD_CFLAGS="$CFLAGS"
|
||||||
CFLAGS="$CFLAGS $SYSROOT_CFLAGS $X_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
|
# 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=yes],
|
||||||
[X11_HEADERS_OK=no; break],
|
[X11_HEADERS_OK=no; break],
|
||||||
[
|
[
|
||||||
@ -111,7 +117,7 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
|||||||
|
|
||||||
if test "x$X11_HEADERS_OK" = xno; then
|
if test "x$X11_HEADERS_OK" = xno; then
|
||||||
HELP_MSG_MISSING_DEPENDENCY([x11])
|
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
|
fi
|
||||||
|
|
||||||
# If XLinearGradient isn't available in Xrender.h, signal that it needs to be
|
# If XLinearGradient isn't available in Xrender.h, signal that it needs to be
|
||||||
|
@ -355,6 +355,12 @@ ENABLE_LIBFFI_BUNDLING:=@ENABLE_LIBFFI_BUNDLING@
|
|||||||
LIBFFI_LIB_FILE:=@LIBFFI_LIB_FILE@
|
LIBFFI_LIB_FILE:=@LIBFFI_LIB_FILE@
|
||||||
GRAALUNIT_LIB := @GRAALUNIT_LIB@
|
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
|
# Source file for cacerts
|
||||||
CACERTS_FILE=@CACERTS_FILE@
|
CACERTS_FILE=@CACERTS_FILE@
|
||||||
|
|
||||||
|
@ -72,6 +72,9 @@ ALL_NAMED_TESTS += $(JTREG_TEST_GROUPS)
|
|||||||
# Add Gtest
|
# Add Gtest
|
||||||
ALL_NAMED_TESTS += gtest
|
ALL_NAMED_TESTS += gtest
|
||||||
|
|
||||||
|
# Add microbenchmarks
|
||||||
|
ALL_NAMED_TESTS += micro
|
||||||
|
|
||||||
# Find make test targets
|
# Find make test targets
|
||||||
MAKE_TEST_TARGETS := $(shell $(MAKE) -s --no-print-directory $(MAKE_ARGS) \
|
MAKE_TEST_TARGETS := $(shell $(MAKE) -s --no-print-directory $(MAKE_ARGS) \
|
||||||
SPEC=$(SPEC) -f $(TOPDIR)/test/make/TestMake.gmk print-targets)
|
SPEC=$(SPEC) -f $(TOPDIR)/test/make/TestMake.gmk print-targets)
|
||||||
|
@ -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
|
# For this to work, the source files must exist when the makefile is
|
||||||
# parsed.
|
# parsed.
|
||||||
# SRCS:=List of directories in where to find files to add to archive
|
# 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
|
# SUFFIXES:=File suffixes to include in jar
|
||||||
# INCLUDES:=List of directories/packages in SRCS that should be included
|
# INCLUDES:=List of directories/packages in SRCS that should be included
|
||||||
# EXCLUDES:=List of directories/packages in SRCS that should be excluded
|
# EXCLUDES:=List of directories/packages in SRCS that should be excluded
|
||||||
@ -62,10 +63,11 @@ define SetupJarArchiveBody
|
|||||||
|
|
||||||
$1_JARMAIN:=$(strip $$($1_JARMAIN))
|
$1_JARMAIN:=$(strip $$($1_JARMAIN))
|
||||||
$1_JARNAME:=$$(notdir $$($1_JAR))
|
$1_JARNAME:=$$(notdir $$($1_JAR))
|
||||||
$1_MANIFEST_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_manifest
|
$1_JAR_OUTPUT_DIR := $$(patsubst %/, %, $$(dir $$($1_JAR)))
|
||||||
$1_DELETESS_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletess
|
$$(call SetIfEmpty, $1_BIN, $$($1_JAR_OUTPUT_DIR))
|
||||||
$1_DELETES_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletes
|
$1_MANIFEST_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_manifest
|
||||||
$1_BIN:=$$(dir $$($1_JAR))
|
$1_DELETESS_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_deletess
|
||||||
|
$1_DELETES_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_deletes
|
||||||
$$(call SetIfEmpty, $1_JAR_CMD, $$(JAR))
|
$$(call SetIfEmpty, $1_JAR_CMD, $$(JAR))
|
||||||
|
|
||||||
ifeq (,$$($1_SUFFIXES))
|
ifeq (,$$($1_SUFFIXES))
|
||||||
@ -231,11 +233,12 @@ define SetupJarArchiveBody
|
|||||||
$1_VARDEPS := $$($1_JAR_CMD) $$($1_JAR_CREATE_OPTIONS) $$($1_MANIFEST) \
|
$1_VARDEPS := $$($1_JAR_CMD) $$($1_JAR_CREATE_OPTIONS) $$($1_MANIFEST) \
|
||||||
$$($1_JARMAIN) $$($1_EXTRA_MANIFEST_ATTR) $$($1_ORIG_DEPS) $$($1_SRCS) \
|
$$($1_JARMAIN) $$($1_EXTRA_MANIFEST_ATTR) $$($1_ORIG_DEPS) $$($1_SRCS) \
|
||||||
$$($1_INCLUDES) $$($1_EXCLUDES) $$($1_EXCLUDE_FILES) $$($1_EXTRA_FILES)
|
$$($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.
|
# Here is the rule that creates/updates the jar file.
|
||||||
$$($1_JAR) : $$($1_DEPENDENCIES) $$($1_MANIFEST) $$($1_VARDEPS_FILE)
|
$$($1_JAR) : $$($1_DEPENDENCIES) $$($1_MANIFEST) $$($1_VARDEPS_FILE)
|
||||||
$$(call MakeTargetDir)
|
$$(call MakeTargetDir)
|
||||||
|
$$(call MakeDir, $$($1_BIN))
|
||||||
$$($1_GREP_INCLUDE_OUTPUT)
|
$$($1_GREP_INCLUDE_OUTPUT)
|
||||||
$$($1_GREP_EXCLUDE_OUTPUT)
|
$$($1_GREP_EXCLUDE_OUTPUT)
|
||||||
# If the vardeps file is part of the newer prereq list, it means that
|
# If the vardeps file is part of the newer prereq list, it means that
|
||||||
|
@ -243,7 +243,7 @@ var getJibProfilesCommon = function (input, data) {
|
|||||||
|
|
||||||
// These are the base setttings for all the main build profiles.
|
// These are the base setttings for all the main build profiles.
|
||||||
common.main_profile_base = {
|
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"],
|
default_make_targets: ["product-bundles", "test-bundles"],
|
||||||
configure_args: concat(["--enable-jtreg-failure-handler"],
|
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",
|
"--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_x64: "SS12u4-Solaris11u1+1.0",
|
||||||
solaris_sparcv9: "SS12u6-Solaris11u3+1.0",
|
solaris_sparcv9: "SS12u6-Solaris11u3+1.0",
|
||||||
windows_x64: "VS2017-15.5.5+1.0",
|
windows_x64: "VS2017-15.5.5+1.0",
|
||||||
linux_aarch64: "gcc7.3.0-Fedora27+1.0",
|
linux_aarch64: "gcc7.3.0-Fedora27+1.1",
|
||||||
linux_arm: "gcc7.3.0-Fedora27+1.0"
|
linux_arm: "gcc7.3.0-Fedora27+1.1"
|
||||||
};
|
};
|
||||||
|
|
||||||
var devkit_platform = (input.target_cpu == "x86"
|
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"
|
environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
jmh: {
|
||||||
|
organization: common.organization,
|
||||||
|
ext: "tar.gz",
|
||||||
|
revision: "1.21+1.0"
|
||||||
|
},
|
||||||
|
|
||||||
gnumake: {
|
gnumake: {
|
||||||
organization: common.organization,
|
organization: common.organization,
|
||||||
ext: "tar.gz",
|
ext: "tar.gz",
|
||||||
|
@ -265,6 +265,54 @@ class CharacterData00 extends CharacterData {
|
|||||||
case 0x13ED: mapChar = 0xABBD; break;
|
case 0x13ED: mapChar = 0xABBD; break;
|
||||||
case 0x13EE: mapChar = 0xABBE; break;
|
case 0x13EE: mapChar = 0xABBE; break;
|
||||||
case 0x13EF: mapChar = 0xABBF; 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 0x1E9E: mapChar = 0x00DF; break;
|
||||||
case 0x1F88: mapChar = 0x1F80; break;
|
case 0x1F88: mapChar = 0x1F80; break;
|
||||||
case 0x1F89: mapChar = 0x1F81; break;
|
case 0x1F89: mapChar = 0x1F81; break;
|
||||||
@ -355,6 +403,52 @@ class CharacterData00 extends CharacterData {
|
|||||||
case 0x0287: mapChar = 0xA7B1; break;
|
case 0x0287: mapChar = 0xA7B1; break;
|
||||||
case 0x029D: mapChar = 0xA7B2; break;
|
case 0x029D: mapChar = 0xA7B2; break;
|
||||||
case 0x029E: mapChar = 0xA7B0; 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 0x1C80: mapChar = 0x0412; break;
|
||||||
case 0x1C81: mapChar = 0x0414; break;
|
case 0x1C81: mapChar = 0x0414; break;
|
||||||
case 0x1C82: mapChar = 0x041E; break;
|
case 0x1C82: mapChar = 0x041E; break;
|
||||||
@ -544,9 +638,16 @@ class CharacterData00 extends CharacterData {
|
|||||||
mapChar = ch + 1;
|
mapChar = ch + 1;
|
||||||
}
|
}
|
||||||
else if ((val & $$maskLowerCase) == 0) {
|
else if ((val & $$maskLowerCase) == 0) {
|
||||||
// The character does not have a lowercase equivalent, so it must
|
// For some Georgian letters, titlecase form is
|
||||||
// already be lowercase; so subtract 1 to get the titlecase form.
|
// same as this character.
|
||||||
mapChar = ch - 1;
|
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 {
|
// else {
|
||||||
// The character has both an uppercase equivalent and a lowercase
|
// The character has both an uppercase equivalent and a lowercase
|
||||||
@ -741,6 +842,52 @@ class CharacterData00 extends CharacterData {
|
|||||||
case 0x0287: mapChar = 0xA7B1; break;
|
case 0x0287: mapChar = 0xA7B1; break;
|
||||||
case 0x029D: mapChar = 0xA7B2; break;
|
case 0x029D: mapChar = 0xA7B2; break;
|
||||||
case 0x029E: mapChar = 0xA7B0; 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 0x1C80: mapChar = 0x0412; break;
|
||||||
case 0x1C81: mapChar = 0x0414; break;
|
case 0x1C81: mapChar = 0x0414; break;
|
||||||
case 0x1C82: mapChar = 0x041E; break;
|
case 0x1C82: mapChar = 0x041E; break;
|
||||||
|
@ -364,6 +364,8 @@ class CharacterData01 extends CharacterData {
|
|||||||
case 0x10E78: retval = 700; break; // RUMI NUMBER SEVEN HUNDRED
|
case 0x10E78: retval = 700; break; // RUMI NUMBER SEVEN HUNDRED
|
||||||
case 0x10E79: retval = 800; break; // RUMI NUMBER EIGHT HUNDRED
|
case 0x10E79: retval = 800; break; // RUMI NUMBER EIGHT HUNDRED
|
||||||
case 0x10E7A: retval = 900; break; // RUMI NUMBER NINE 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 0x1105E: retval = 40; break; // BRAHMI NUMBER FORTY
|
||||||
case 0x1105F: retval = 50; break; // BRAHMI NUMBER FIFTY
|
case 0x1105F: retval = 50; break; // BRAHMI NUMBER FIFTY
|
||||||
case 0x11060: retval = 60; break; // BRAHMI NUMBER SIXTY
|
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 0x1D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN
|
||||||
case 0x1D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT
|
case 0x1D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT
|
||||||
case 0x1D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE
|
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;
|
default: retval = -2; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# PropList-10.0.0.txt
|
# PropList-11.0.0.txt
|
||||||
# Date: 2017-03-10, 08:25:30 GMT
|
# Date: 2018-03-15, 04:28:35 GMT
|
||||||
# Copyright (c) 2017 Unicode, Inc.
|
# Copyright (c) 2018 Unicode, Inc.
|
||||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
# 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
|
# 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
|
05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
|
||||||
060C ; Terminal_Punctuation # Po ARABIC COMMA
|
060C ; Terminal_Punctuation # Po ARABIC COMMA
|
||||||
061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
|
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
|
06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
|
||||||
0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
|
0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
|
||||||
070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
|
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
|
2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK
|
||||||
2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP
|
2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP
|
||||||
2E41 ; Terminal_Punctuation # Po REVERSED COMMA
|
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
|
3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
|
||||||
A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION 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
|
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
|
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
|
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
|
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
|
11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
|
||||||
110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
|
110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
|
||||||
11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
|
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
|
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
|
11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR
|
||||||
11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD
|
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
|
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
|
16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA
|
||||||
16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP
|
16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP
|
||||||
16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM
|
16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM
|
||||||
16B44 ; Terminal_Punctuation # Po PAHAWH HMONG SIGN XAUS
|
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
|
1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
|
||||||
1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON
|
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
|
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
|
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
|
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
|
11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU
|
||||||
11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA
|
11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA
|
||||||
11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA
|
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
|
11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
|
||||||
1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E
|
1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E
|
||||||
1112D..11132 ; Other_Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK
|
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
|
11180..11181 ; Other_Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
|
||||||
11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA
|
11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA
|
||||||
111B3..111B5 ; Other_Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
|
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
|
11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
|
||||||
11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E
|
11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E
|
||||||
11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM
|
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
|
1182C..1182E ; Other_Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
|
||||||
11A07..11A08 ; Other_Alphabetic # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
|
1182F..11837 ; Other_Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
|
||||||
11A09..11A0A ; Other_Alphabetic # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
|
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
|
11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA
|
||||||
11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA
|
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
|
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
|
11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA
|
||||||
11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA
|
11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA
|
||||||
11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA
|
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
|
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
|
16F51..16F7E ; Other_Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
|
||||||
1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK
|
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
|
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
|
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
|
3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
|
||||||
3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
|
3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
|
||||||
3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
|
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
|
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
|
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
|
18800..18AF2 ; Ideographic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
|
||||||
1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
|
1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
|
||||||
20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
|
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
|
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
|
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
|
FFE3 ; Diacritic # Sk FULLWIDTH MACRON
|
||||||
102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK
|
102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK
|
||||||
10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
|
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
|
110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
|
||||||
11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA
|
11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA
|
||||||
11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA
|
11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA
|
||||||
@ -973,12 +991,14 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
|
|||||||
116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA
|
116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA
|
||||||
116B7 ; Diacritic # Mn TAKRI SIGN NUKTA
|
116B7 ; Diacritic # Mn TAKRI SIGN NUKTA
|
||||||
1172B ; Diacritic # Mn AHOM SIGN KILLER
|
1172B ; Diacritic # Mn AHOM SIGN KILLER
|
||||||
|
11839..1183A ; Diacritic # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
|
||||||
11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA
|
11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA
|
||||||
11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER
|
11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER
|
||||||
11A99 ; Diacritic # Mn SOYOMBO SUBJOINER
|
11A99 ; Diacritic # Mn SOYOMBO SUBJOINER
|
||||||
11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA
|
11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA
|
||||||
11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA
|
11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA
|
||||||
11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
|
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
|
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
|
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
|
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
|
1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
|
||||||
1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA
|
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
|
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
|
FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
|
||||||
FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
|
FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
|
||||||
FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
|
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
|
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
|
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
|
002E ; Sentence_Terminal # Po FULL STOP
|
||||||
003F ; Sentence_Terminal # Po QUESTION MARK
|
003F ; Sentence_Terminal # Po QUESTION MARK
|
||||||
0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP
|
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
|
06D4 ; Sentence_Terminal # Po ARABIC FULL STOP
|
||||||
0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
|
0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
|
||||||
07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK
|
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
|
0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
|
||||||
104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
|
104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
|
||||||
1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP
|
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
|
FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK
|
||||||
FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
|
FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
|
||||||
10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA
|
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
|
11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA
|
||||||
110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI 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
|
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
|
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
|
11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD
|
||||||
11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA
|
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
|
16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA
|
||||||
16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP
|
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
|
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
|
16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS
|
||||||
|
16E98 ; Sentence_Terminal # Po MEDEFAIDRIN FULL STOP
|
||||||
1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
|
1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
|
||||||
1DA88 ; Sentence_Terminal # Po SIGNWRITING 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>
|
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
|
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>
|
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
|
2B98..2BC8 ; Pattern_Syntax # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
||||||
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
|
|
||||||
2BC9 ; Pattern_Syntax # Cn <reserved-2BC9>
|
2BC9 ; Pattern_Syntax # Cn <reserved-2BC9>
|
||||||
2BCA..2BD2 ; Pattern_Syntax # So [9] TOP HALF BLACK CIRCLE..GROUP MARK
|
2BCA..2BFE ; Pattern_Syntax # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
|
||||||
2BD3..2BEB ; Pattern_Syntax # Cn [25] <reserved-2BD3>..<reserved-2BEB>
|
2BFF ; Pattern_Syntax # Cn <reserved-2BFF>
|
||||||
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>
|
|
||||||
2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
|
2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
|
||||||
2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
|
2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
|
||||||
2E03 ; Pattern_Syntax # Pf RIGHT 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
|
2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN
|
||||||
2E41 ; Pattern_Syntax # Po REVERSED COMMA
|
2E41 ; Pattern_Syntax # Po REVERSED COMMA
|
||||||
2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
|
2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
|
||||||
2E43..2E49 ; Pattern_Syntax # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
|
2E43..2E4E ; Pattern_Syntax # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
|
||||||
2E4A..2E7F ; Pattern_Syntax # Cn [54] <reserved-2E4A>..<reserved-2E7F>
|
2E4F..2E7F ; Pattern_Syntax # Cn [49] <reserved-2E4F>..<reserved-2E7F>
|
||||||
3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
|
3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
|
||||||
3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
|
3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
|
||||||
3009 ; Pattern_Syntax # Pe RIGHT 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
|
070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK
|
||||||
08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH
|
08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH
|
||||||
110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN
|
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
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Scripts-10.0.0.txt
|
# Scripts-11.0.0.txt
|
||||||
# Date: 2017-03-11, 06:40:37 GMT
|
# Date: 2018-02-21, 05:34:31 GMT
|
||||||
# Copyright (c) 2017 Unicode, Inc.
|
# Copyright (c) 2018 Unicode, Inc.
|
||||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
# 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
|
# 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
|
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
|
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
|
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
|
2B98..2BC8 ; Common # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
||||||
2BBD..2BC8 ; Common # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
2BCA..2BFE ; Common # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
|
||||||
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
|
|
||||||
2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
|
2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
|
||||||
2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET
|
2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET
|
||||||
2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET
|
2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET
|
||||||
@ -349,7 +347,7 @@
|
|||||||
2E40 ; Common # Pd DOUBLE HYPHEN
|
2E40 ; Common # Pd DOUBLE HYPHEN
|
||||||
2E41 ; Common # Po REVERSED COMMA
|
2E41 ; Common # Po REVERSED COMMA
|
||||||
2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
|
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
|
2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
|
||||||
3000 ; Common # Zs IDEOGRAPHIC SPACE
|
3000 ; Common # Zs IDEOGRAPHIC SPACE
|
||||||
3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
1F110..1F16B ; Common # So [92] PARENTHESIZED LATIN CAPITAL LETTER A..RAISED MD SIGN
|
||||||
1F130..1F16B ; Common # So [60] SQUARED LATIN CAPITAL LETTER A..RAISED MD SIGN
|
|
||||||
1F170..1F1AC ; Common # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD
|
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
|
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
|
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
|
1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
|
||||||
1F400..1F6D4 ; Common # So [725] RAT..PAGODA
|
1F400..1F6D4 ; Common # So [725] RAT..PAGODA
|
||||||
1F6E0..1F6EC ; Common # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
1F910..1F93E ; Common # So [47] ZIPPER-MOUTH FACE..HANDBALL
|
||||||
1F940..1F94C ; Common # So [13] WILTED FLOWER..CURLING STONE
|
1F940..1F970 ; Common # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS
|
||||||
1F950..1F96B ; Common # So [28] CROISSANT..CANNED FOOD
|
1F973..1F976 ; Common # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE
|
||||||
1F980..1F997 ; Common # So [24] CRAB..CRICKET
|
1F97A ; Common # So FACE WITH PLEADING EYES
|
||||||
1F9C0 ; Common # So CHEESE WEDGE
|
1F97C..1F9A2 ; Common # So [39] LAB COAT..SWAN
|
||||||
1F9D0..1F9E6 ; Common # So [23] FACE WITH MONOCLE..SOCKS
|
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
|
E0001 ; Common # Cf LANGUAGE TAG
|
||||||
E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL 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
|
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
|
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
|
A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT
|
||||||
A790..A7AE ; Latin # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I
|
A790..A7B9 ; Latin # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE
|
||||||
A7B0..A7B7 ; Latin # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA
|
|
||||||
A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I
|
A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I
|
||||||
A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
|
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
|
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
|
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
|
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
|
0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
|
||||||
0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
|
0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
|
||||||
055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
|
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
|
058A ; Armenian # Pd ARMENIAN HYPHEN
|
||||||
058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
|
058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
|
||||||
058F ; Armenian # Sc ARMENIAN DRAM SIGN
|
058F ; Armenian # Sc ARMENIAN DRAM SIGN
|
||||||
FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
|
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
|
05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA
|
||||||
05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN
|
05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN
|
||||||
05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
|
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
|
05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
|
||||||
FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ
|
FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ
|
||||||
FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
|
||||||
A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE
|
A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE
|
||||||
A8FC ; Devanagari # Po DEVANAGARI SIGN SIDDHAM
|
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
|
09FB ; Bengali # Sc BENGALI GANDA MARK
|
||||||
09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA
|
09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA
|
||||||
09FD ; Bengali # Po BENGALI ABBREVIATION SIGN
|
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
|
0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
|
||||||
0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
|
0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
|
||||||
0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH
|
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
|
0C00 ; Telugu # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
|
||||||
0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
|
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
|
0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
|
||||||
0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
|
0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
|
||||||
0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
|
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
|
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
|
0C7F ; Telugu # So TELUGU SIGN TUUMU
|
||||||
|
|
||||||
# Total code points: 96
|
# Total code points: 97
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU
|
0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU
|
||||||
0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU
|
0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU
|
||||||
0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
|
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
|
0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
|
||||||
0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
|
0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
|
||||||
0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
|
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
|
0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
|
||||||
0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
|
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
|
10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
|
||||||
10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN
|
10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN
|
||||||
10CD ; Georgian # L& GEORGIAN CAPITAL LETTER AEN
|
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
|
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
|
2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
|
||||||
2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN
|
2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN
|
||||||
2D2D ; Georgian # L& GEORGIAN SMALL LETTER AEN
|
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
|
1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
|
||||||
1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
|
1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
|
||||||
1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
|
||||||
303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
|
303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
|
||||||
3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
|
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
|
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
|
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
|
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
|
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
|
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
|
FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON BELOW
|
||||||
101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
|
101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
|
||||||
102E0 ; Inherited # Mn COPTIC EPACT THOUSANDS MARK
|
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
|
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
|
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
|
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
|
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
|
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
|
10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
|
||||||
10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
|
10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
|
||||||
10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
|
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
|
10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
|
||||||
10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA
|
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
|
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
|
07F6 ; Nko # So NKO SYMBOL OO DENNEN
|
||||||
07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
|
07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
|
||||||
07FA ; Nko # Lm NKO LAJANYALAN
|
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
|
110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
|
||||||
110BD ; Kaithi # Cf KAITHI NUMBER SIGN
|
110BD ; Kaithi # Cf KAITHI NUMBER SIGN
|
||||||
110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
|
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
|
1112D..11134 ; Chakma # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
|
||||||
11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
|
11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
|
||||||
11140..11143 ; Chakma # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK
|
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
|
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
|
111BF..111C0 ; Sharada # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
|
||||||
111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM
|
111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM
|
||||||
111C5..111C9 ; Sharada # Po [5] SHARADA DANDA..SHARADA SANDHI MARK
|
111C5..111C8 ; Sharada # Po [4] SHARADA DANDA..SHARADA SEPARATOR
|
||||||
111CA..111CC ; Sharada # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
|
111C9..111CC ; Sharada # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
|
||||||
111CD ; Sharada # Po SHARADA SUTRA MARK
|
111CD ; Sharada # Po SHARADA SUTRA MARK
|
||||||
111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
|
111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
|
||||||
111DA ; Sharada # Lo SHARADA EKAM
|
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
|
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
|
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
|
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
|
1173C..1173E ; Ahom # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI
|
||||||
1173F ; Ahom # So AHOM SYMBOL VI
|
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
|
11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE
|
||||||
1145B ; Newa # Po NEWA PLACEHOLDER MARK
|
1145B ; Newa # Po NEWA PLACEHOLDER MARK
|
||||||
1145D ; Newa # Po NEWA INSERTION SIGN
|
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
|
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
|
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
|
11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA
|
||||||
11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
|
11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
|
||||||
11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
|
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
|
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
|
11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A
|
||||||
11A01..11A06 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
|
11A01..11A0A ; Zanabazar_Square # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
|
||||||
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
|
|
||||||
11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA
|
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
|
11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
|
||||||
11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA
|
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
|
# 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
|
# EOF
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# SpecialCasing-10.0.0.txt
|
# SpecialCasing-11.0.0.txt
|
||||||
# Date: 2017-04-14, 05:40:43 GMT
|
# Date: 2018-02-22, 06:16:47 GMT
|
||||||
# Copyright (c) 2017 Unicode, Inc.
|
# Copyright (c) 2018 Unicode, Inc.
|
||||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
# 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
|
# 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.
|
# 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)
|
# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
|
||||||
# have special uppercases.
|
# have special uppercases.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
|||||||
10.0.0
|
11.0.0
|
||||||
|
@ -41,9 +41,12 @@
|
|||||||
# To build the full set of crosstools for additional platforms, use a command
|
# To build the full set of crosstools for additional platforms, use a command
|
||||||
# line looking like this:
|
# line looking like this:
|
||||||
#
|
#
|
||||||
# make cross_compile_target="aarch64-linux-gnu" BASE_OS=Fedora27
|
# make TARGETS="aarch64-linux-gnu" BASE_OS=Fedora
|
||||||
# or
|
# 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.
|
# This is the makefile which iterates over all host and target platforms.
|
||||||
#
|
#
|
||||||
@ -52,18 +55,18 @@ os := $(shell uname -o)
|
|||||||
cpu := $(shell uname -p)
|
cpu := $(shell uname -p)
|
||||||
|
|
||||||
# Figure out what platform this is building on.
|
# 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))
|
$(info Building on platform $(me))
|
||||||
|
|
||||||
#
|
#
|
||||||
# By default just build for the current platform, which is assumed to be Linux
|
# By default just build for the current platform, which is assumed to be Linux
|
||||||
#
|
#
|
||||||
ifeq ($(cross_compile_target), )
|
ifeq ($(TARGETS), )
|
||||||
platforms := $(me)
|
platforms := $(me)
|
||||||
host_platforms := $(platforms)
|
host_platforms := $(platforms)
|
||||||
else
|
else
|
||||||
platforms := $(cross_compile_target)
|
platforms := $(TARGETS)
|
||||||
host_platforms := $(me)
|
host_platforms := $(me)
|
||||||
endif
|
endif
|
||||||
target_platforms := $(platforms)
|
target_platforms := $(platforms)
|
||||||
@ -79,37 +82,37 @@ endif
|
|||||||
OUTPUT_ROOT = $(abspath ../../build/devkit)
|
OUTPUT_ROOT = $(abspath ../../build/devkit)
|
||||||
RESULT = $(OUTPUT_ROOT)/result
|
RESULT = $(OUTPUT_ROOT)/result
|
||||||
|
|
||||||
submakevars = HOST=$@ BUILD=$(me) \
|
submakevars = HOST=$@ BUILD=$(me) RESULT=$(RESULT) OUTPUT_ROOT=$(OUTPUT_ROOT)
|
||||||
RESULT=$(RESULT) PREFIX=$(RESULT)/$@ \
|
|
||||||
OUTPUT_ROOT=$(OUTPUT_ROOT)
|
|
||||||
$(host_platforms) :
|
$(host_platforms) :
|
||||||
@echo 'Building compilers for $@'
|
@echo 'Building compilers for $@'
|
||||||
@echo 'Targets: $(target_platforms)'
|
@echo 'Targets: $(target_platforms)'
|
||||||
for p in $(filter $@, $(target_platforms)) $(filter-out $@, $(target_platforms)); do \
|
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) \
|
$(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
|
done
|
||||||
@echo 'Building ccache program for $@'
|
|
||||||
$(MAKE) -f Tools.gmk ccache $(submakevars) TARGET=$@
|
|
||||||
@echo 'All done"'
|
@echo 'All done"'
|
||||||
|
|
||||||
today := $(shell date +%Y%m%d)
|
today := $(shell date +%Y%m%d)
|
||||||
|
|
||||||
define Mktar
|
define Mktar
|
||||||
$(1)_tar = $$(RESULT)/sdk-$(1)-$$(today).tar.gz
|
$(1)-to-$(2)_tar = $$(RESULT)/sdk-$(1)-to-$(2)-$$(today).tar.gz
|
||||||
$$($(1)_tar) : PLATFORM = $(1)
|
$$($(1)-to-$(2)_tar) : PLATFORM = $(1)-to-$(2)
|
||||||
TARFILES += $$($(1)_tar)
|
TARFILES += $$($(1)-to-$(2)_tar)
|
||||||
$$($(1)_tar) : $(1) $$(shell find $$(RESULT)/$(1))
|
$$($(1)-to-$(2)_tar) : $$(shell find $$(RESULT)/$(1)-to-$(2) -type f)
|
||||||
endef
|
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)
|
tars : all $(TARFILES)
|
||||||
onlytars : $(TARFILES)
|
onlytars : $(TARFILES)
|
||||||
%.tar.gz :
|
%.tar.gz :
|
||||||
@echo 'Creating compiler package $@'
|
@echo 'Creating compiler package $@'
|
||||||
cd $(RESULT)/$(PLATFORM) && tar -czf $@ *
|
cd $(RESULT) && tar -czf $@ $(PLATFORM)/*
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
clean :
|
clean :
|
||||||
|
@ -52,16 +52,25 @@ endif
|
|||||||
$(info ARCH=$(ARCH))
|
$(info ARCH=$(ARCH))
|
||||||
|
|
||||||
ifeq ($(BASE_OS), OEL6)
|
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
|
LINUX_VERSION := OEL6.4
|
||||||
else ifeq ($(BASE_OS), Fedora27)
|
else ifeq ($(BASE_OS), Fedora)
|
||||||
ifeq ($(ARCH), aarch64)
|
DEFAULT_OS_VERSION := 27
|
||||||
FEDORA_TYPE=fedora-secondary
|
ifeq ($(BASE_OS_VERSION), )
|
||||||
else
|
BASE_OS_VERSION := $(DEFAULT_OS_VERSION)
|
||||||
FEDORA_TYPE=fedora/linux
|
|
||||||
endif
|
endif
|
||||||
OEL_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/27/Everything/$(ARCH)/os/Packages/
|
ifeq ($(filter x86_64 armhfp, $(ARCH)), )
|
||||||
LINUX_VERSION := Fedora 27
|
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
|
else
|
||||||
$(error Unknown base OS $(BASE_OS))
|
$(error Unknown base OS $(BASE_OS))
|
||||||
endif
|
endif
|
||||||
@ -137,13 +146,11 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# Define directories
|
# Define directories
|
||||||
RESULT := $(OUTPUT_ROOT)/result
|
|
||||||
BUILDDIR := $(OUTPUT_ROOT)/$(HOST)/$(TARGET)
|
BUILDDIR := $(OUTPUT_ROOT)/$(HOST)/$(TARGET)
|
||||||
PREFIX := $(RESULT)/$(HOST)
|
|
||||||
TARGETDIR := $(PREFIX)/$(TARGET)
|
TARGETDIR := $(PREFIX)/$(TARGET)
|
||||||
SYSROOT := $(TARGETDIR)/sysroot
|
SYSROOT := $(TARGETDIR)/sysroot
|
||||||
DOWNLOAD := $(OUTPUT_ROOT)/download
|
DOWNLOAD := $(OUTPUT_ROOT)/download
|
||||||
DOWNLOAD_RPMS := $(DOWNLOAD)/rpms
|
DOWNLOAD_RPMS := $(DOWNLOAD)/rpms/$(TARGET)-$(LINUX_VERSION)
|
||||||
SRCDIR := $(OUTPUT_ROOT)/src
|
SRCDIR := $(OUTPUT_ROOT)/src
|
||||||
|
|
||||||
# Marker file for unpacking rpms
|
# Marker file for unpacking rpms
|
||||||
@ -159,7 +166,7 @@ download-rpms:
|
|||||||
# Only run this if rpm dir is empty.
|
# Only run this if rpm dir is empty.
|
||||||
ifeq ($(wildcard $(DOWNLOAD_RPMS)/*.rpm), )
|
ifeq ($(wildcard $(DOWNLOAD_RPMS)/*.rpm), )
|
||||||
cd $(DOWNLOAD_RPMS) && \
|
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
|
endif
|
||||||
|
|
||||||
##########################################################################################
|
##########################################################################################
|
||||||
@ -190,8 +197,8 @@ $(foreach p,GCC BINUTILS CCACHE MPFR GMP MPC GDB,$(eval $(call Download,$(p))))
|
|||||||
##########################################################################################
|
##########################################################################################
|
||||||
# Unpack RPMS
|
# Unpack RPMS
|
||||||
|
|
||||||
|
RPM_ARCHS := $(ARCH) noarch
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),x86_64)
|
||||||
RPM_ARCHS := x86_64 noarch
|
|
||||||
ifeq ($(BUILD),$(HOST))
|
ifeq ($(BUILD),$(HOST))
|
||||||
ifeq ($(TARGET),$(HOST))
|
ifeq ($(TARGET),$(HOST))
|
||||||
# When building the native compiler for x86_64, enable mixed mode.
|
# When building the native compiler for x86_64, enable mixed mode.
|
||||||
@ -199,11 +206,9 @@ ifeq ($(ARCH),x86_64)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
else ifeq ($(ARCH),i686)
|
else ifeq ($(ARCH),i686)
|
||||||
RPM_ARCHS := i386 i686 noarch
|
RPM_ARCHS += i386
|
||||||
else ifeq ($(ARCH), armhfp)
|
else ifeq ($(ARCH), armhfp)
|
||||||
RPM_ARCHS := $(ARCH) armv7hl noarch
|
RPM_ARCHS += armv7hl
|
||||||
else
|
|
||||||
RPM_ARCHS := $(ARCH) noarch
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
RPM_FILE_LIST := $(sort $(foreach a, $(RPM_ARCHS), \
|
RPM_FILE_LIST := $(sort $(foreach a, $(RPM_ARCHS), \
|
||||||
@ -277,7 +282,7 @@ CONFIG = --target=$(TARGET) \
|
|||||||
--host=$(HOST) --build=$(BUILD) \
|
--host=$(HOST) --build=$(BUILD) \
|
||||||
--prefix=$(PREFIX)
|
--prefix=$(PREFIX)
|
||||||
|
|
||||||
PATHEXT = $(RESULT)/$(BUILD)/bin:
|
PATHEXT = $(PREFIX)/bin:
|
||||||
|
|
||||||
PATHPRE = PATH=$(PATHEXT)$(PATH)
|
PATHPRE = PATH=$(PATHEXT)$(PATH)
|
||||||
NUM_CORES := $(shell cat /proc/cpuinfo | grep -c processor)
|
NUM_CORES := $(shell cat /proc/cpuinfo | grep -c processor)
|
||||||
@ -427,6 +432,11 @@ ifeq ($(ARCH), armhfp)
|
|||||||
$(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard
|
$(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq ($(filter ppc64 ppc64le s390x, $(ARCH)), )
|
||||||
|
# We only support 64-bit on these platforms anyway
|
||||||
|
CONFIG += --disable-multilib
|
||||||
|
endif
|
||||||
|
|
||||||
# Want:
|
# Want:
|
||||||
# c,c++
|
# c,c++
|
||||||
# shared libs
|
# 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'
|
@echo 'Creating devkit.info in the root of the kit'
|
||||||
rm -f $@
|
rm -f $@
|
||||||
touch $@
|
touch $@
|
||||||
@ -611,7 +621,4 @@ all : binutils gcc bfdlib $(PREFIX)/devkit.info $(missing-links) $(SYSROOT_LINKS
|
|||||||
# this is only built for host. so separate.
|
# this is only built for host. so separate.
|
||||||
ccache : $(ccache)
|
ccache : $(ccache)
|
||||||
|
|
||||||
# Force target
|
|
||||||
FRC:
|
|
||||||
|
|
||||||
.PHONY : gcc all binutils bfdlib link_libs rpms libs sysroot
|
.PHONY : gcc all binutils bfdlib link_libs rpms libs sysroot
|
||||||
|
50
make/devkit/createJMHBundle.sh
Normal file
50
make/devkit/createJMHBundle.sh
Normal 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"
|
@ -280,7 +280,7 @@ ifeq ($(findstring $(OPENJDK_TARGET_OS), windows macosx), )
|
|||||||
common/font \
|
common/font \
|
||||||
#
|
#
|
||||||
|
|
||||||
LIBAWT_XAWT_EXCLUDES := medialib
|
LIBAWT_XAWT_EXCLUDES := medialib debug
|
||||||
|
|
||||||
LIBAWT_XAWT_EXTRA_HEADER_DIRS := \
|
LIBAWT_XAWT_EXTRA_HEADER_DIRS := \
|
||||||
$(LIBAWT_DEFAULT_HEADER_DIRS) \
|
$(LIBAWT_DEFAULT_HEADER_DIRS) \
|
||||||
|
113
make/test/BuildMicrobenchmark.gmk
Normal file
113
make/test/BuildMicrobenchmark.gmk
Normal 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
|
@ -59,6 +59,7 @@ ifeq ($(INCLUDE_GRAAL), true)
|
|||||||
-Xlint:none \
|
-Xlint:none \
|
||||||
-processorpath $(BUILDTOOLS_OUTPUTDIR)/jdk.vm.compiler.replacements.verifier.jar \
|
-processorpath $(BUILDTOOLS_OUTPUTDIR)/jdk.vm.compiler.replacements.verifier.jar \
|
||||||
--add-exports jdk.unsupported/sun.misc=ALL-UNNAMED \
|
--add-exports jdk.unsupported/sun.misc=ALL-UNNAMED \
|
||||||
|
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
|
||||||
|
|
||||||
### Copy 3rd party libs
|
### Copy 3rd party libs
|
||||||
$(eval $(call SetupCopyFiles, COPY_GRAALUNIT_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.asm.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.core.amd64.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.test/src \
|
||||||
|
$(SRC_DIR)/org.graalvm.compiler.core.jdk9.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.debug.test/src \
|
$(SRC_DIR)/org.graalvm.compiler.debug.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.graph.test/src \
|
$(SRC_DIR)/org.graalvm.compiler.graph.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.hotspot.amd64.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.nodes.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.options.test/src \
|
$(SRC_DIR)/org.graalvm.compiler.options.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.phases.common.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.replacements.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.compiler.test/src \
|
$(SRC_DIR)/org.graalvm.compiler.test/src \
|
||||||
$(SRC_DIR)/org.graalvm.util.test/src \
|
$(SRC_DIR)/org.graalvm.util.test/src \
|
||||||
|
@ -317,29 +317,6 @@ namespace ext
|
|||||||
enum operation { uxtb, uxth, uxtw, uxtx, sxtb, sxth, sxtw, sxtx };
|
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
|
// Addressing modes
|
||||||
class Address {
|
class Address {
|
||||||
public:
|
public:
|
||||||
|
@ -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
|
// For ARM, the fast signature handler only needs to know whether
|
||||||
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
|
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
|
||||||
// be distinguished from each other and all other return values
|
// 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);
|
bool unbox = (ret_type == T_OBJECT) || (ret_type == T_ARRAY);
|
||||||
if (unbox) {
|
if (unbox) {
|
||||||
ret_type = T_OBJECT;
|
ret_type = T_OBJECT;
|
||||||
} else {
|
} else if (ret_type != T_BOOLEAN) {
|
||||||
ret_type = T_INT;
|
ret_type = T_INT;
|
||||||
}
|
}
|
||||||
result |= ((uint64_t) ret_type) << shift;
|
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);
|
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);
|
__ mov_slow(R0, (intptr_t)result_handler);
|
||||||
|
|
||||||
__ ret();
|
__ ret();
|
||||||
|
@ -941,6 +941,12 @@ void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* f
|
|||||||
bind(done);
|
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) {
|
void MacroAssembler::null_check(Register reg, Register tmp, int offset) {
|
||||||
if (needs_explicit_null_check(offset)) {
|
if (needs_explicit_null_check(offset)) {
|
||||||
assert_different_registers(reg, tmp);
|
assert_different_registers(reg, tmp);
|
||||||
|
@ -853,6 +853,8 @@ public:
|
|||||||
sub(dst, r1, AsmOperand(r2, lsl, shift));
|
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
|
// klass oop manipulations if compressed
|
||||||
|
|
||||||
|
@ -1211,6 +1211,11 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
|||||||
__ restore_default_fp_mode();
|
__ 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
|
// Do a safepoint check while thread is in transition state
|
||||||
InlinedAddress safepoint_state(SafepointSynchronize::address_of_state());
|
InlinedAddress safepoint_state(SafepointSynchronize::address_of_state());
|
||||||
Label call_safepoint_runtime, return_to_java;
|
Label call_safepoint_runtime, return_to_java;
|
||||||
|
@ -316,13 +316,27 @@ address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, i
|
|||||||
}
|
}
|
||||||
|
|
||||||
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
|
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
|
||||||
// Result handlers are not used on 32-bit ARM
|
address entry = __ pc();
|
||||||
// since the returned value is already in appropriate format.
|
|
||||||
__ should_not_reach_here(); // to avoid empty code block
|
|
||||||
|
|
||||||
// The result handler non-zero indicates an object is returned and this is
|
switch (type) {
|
||||||
// used in the native entry code.
|
case T_CHAR : /* Nothing to do */ break;
|
||||||
return type == T_OBJECT ? (address)(-1) : NULL;
|
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) {
|
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.
|
// Unbox oop result, e.g. JNIHandles::resolve result if it's an oop.
|
||||||
{
|
{
|
||||||
Label Lnot_oop;
|
Label Lnot_oop;
|
||||||
// For ARM32, Rresult_handler is -1 for oop result, 0 otherwise.
|
__ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT));
|
||||||
__ cbz(Rresult_handler, Lnot_oop);
|
__ cmp(Rtemp, Rresult_handler);
|
||||||
|
__ b(Lnot_oop, ne);
|
||||||
Register value = Rsaved_result_lo;
|
Register value = Rsaved_result_lo;
|
||||||
__ resolve_jobject(value, // value
|
__ resolve_jobject(value, // value
|
||||||
Rtemp, // tmp1
|
Rtemp, // tmp1
|
||||||
@ -1028,10 +1043,9 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
// not properly paired (was bug - gri 11/22/99).
|
// 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);
|
__ 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.
|
// Restore the result. Oop result is restored from the stack by the
|
||||||
__ cmp(Rresult_handler, 0);
|
// result handler.
|
||||||
__ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne);
|
__ mov(R0, Rsaved_result_lo);
|
||||||
__ mov(R0, Rsaved_result_lo, eq);
|
|
||||||
__ mov(R1, Rsaved_result_hi);
|
__ mov(R1, Rsaved_result_hi);
|
||||||
|
|
||||||
#ifdef __ABI_HARD__
|
#ifdef __ABI_HARD__
|
||||||
@ -1039,15 +1053,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
__ fcpyd(D0, D8);
|
__ fcpyd(D0, D8);
|
||||||
#endif // __ABI_HARD__
|
#endif // __ABI_HARD__
|
||||||
|
|
||||||
#ifdef ASSERT
|
__ blx(Rresult_handler);
|
||||||
if (VerifyOops) {
|
|
||||||
Label L;
|
|
||||||
__ cmp(Rresult_handler, 0);
|
|
||||||
__ b(L, eq);
|
|
||||||
__ verify_oop(R0);
|
|
||||||
__ bind(L);
|
|
||||||
}
|
|
||||||
#endif // ASSERT
|
|
||||||
|
|
||||||
// Restore FP/LR, sender_sp and return
|
// Restore FP/LR, sender_sp and return
|
||||||
__ mov(Rtemp, FP);
|
__ mov(Rtemp, FP);
|
||||||
|
@ -260,6 +260,8 @@ void VM_Version::initialize() {
|
|||||||
if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
|
if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
|
||||||
FLAG_SET_DEFAULT(UsePopCountInstruction, true);
|
FLAG_SET_DEFAULT(UsePopCountInstruction, true);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
FLAG_SET_DEFAULT(UsePopCountInstruction, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
|
if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
|
||||||
@ -294,6 +296,9 @@ void VM_Version::initialize() {
|
|||||||
Tier3MinInvocationThreshold = 500;
|
Tier3MinInvocationThreshold = 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UNSUPPORTED_OPTION(TypeProfileLevel);
|
||||||
|
UNSUPPORTED_OPTION(CriticalJNINatives);
|
||||||
|
|
||||||
FLAG_SET_DEFAULT(TypeProfileLevel, 0); // unsupported
|
FLAG_SET_DEFAULT(TypeProfileLevel, 0); // unsupported
|
||||||
|
|
||||||
// This machine does not allow unaligned memory accesses
|
// This machine does not allow unaligned memory accesses
|
||||||
|
@ -397,6 +397,7 @@ class Assembler : public AbstractAssembler {
|
|||||||
LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM
|
LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM
|
||||||
|
|
||||||
CNTLZW_OPCODE = (31u << OPCODE_SHIFT | 26u << 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
|
// 64 bit opcode encodings
|
||||||
|
|
||||||
@ -428,6 +429,7 @@ class Assembler : public AbstractAssembler {
|
|||||||
DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM
|
DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM
|
||||||
|
|
||||||
CNTLZD_OPCODE = (31u << OPCODE_SHIFT | 58u << XO_21_30_SHIFT), // X-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
|
NAND_OPCODE = (31u << OPCODE_SHIFT | 476u << XO_21_30_SHIFT), // X-FORM
|
||||||
NOR_OPCODE = (31u << OPCODE_SHIFT | 124u << 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 cntlzw_( Register a, Register s);
|
||||||
inline void cntlzd( Register a, Register s);
|
inline void cntlzd( 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
|
// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions
|
||||||
inline void sld( Register a, Register s, Register b);
|
inline void sld( Register a, Register s, Register b);
|
||||||
|
@ -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::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(0)); }
|
||||||
inline void Assembler::cntlzd_( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(1)); }
|
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
|
// 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)); }
|
inline void Assembler::sld( Register a, Register s, Register b) { emit_int32(SLD_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); }
|
||||||
|
@ -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) {
|
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
|
||||||
assert(left != result, "should be different registers");
|
assert(left != result, "should be different registers");
|
||||||
if (is_power_of_2(c + 1)) {
|
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);
|
__ sub(result, left, result);
|
||||||
return true;
|
return true;
|
||||||
} else if (is_power_of_2(c - 1)) {
|
} 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);
|
__ add(result, left, result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -126,6 +126,9 @@ define_pd_global(bool, ThreadLocalHandshakes, true);
|
|||||||
product(bool, UseCountLeadingZerosInstructionsPPC64, true, \
|
product(bool, UseCountLeadingZerosInstructionsPPC64, true, \
|
||||||
"Use count leading zeros instructions.") \
|
"Use count leading zeros instructions.") \
|
||||||
\
|
\
|
||||||
|
product(bool, UseCountTrailingZerosInstructionsPPC64, false, \
|
||||||
|
"Use count trailing zeros instructions.") \
|
||||||
|
\
|
||||||
product(bool, UseExtendedLoadAndReserveInstructionsPPC64, false, \
|
product(bool, UseExtendedLoadAndReserveInstructionsPPC64, false, \
|
||||||
"Use extended versions of load-and-reserve instructions.") \
|
"Use extended versions of load-and-reserve instructions.") \
|
||||||
\
|
\
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||||
// Copyright (c) 2012, 2017 SAP SE. All rights reserved.
|
// Copyright (c) 2012, 2018 SAP SE. All rights reserved.
|
||||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
//
|
//
|
||||||
// This code is free software; you can redistribute it and/or modify it
|
// This code is free software; you can redistribute it and/or modify it
|
||||||
@ -2209,9 +2209,13 @@ const bool Matcher::match_rule_supported(int opcode) {
|
|||||||
return VM_Version::has_fsqrt();
|
return VM_Version::has_fsqrt();
|
||||||
case Op_CountLeadingZerosI:
|
case Op_CountLeadingZerosI:
|
||||||
case Op_CountLeadingZerosL:
|
case Op_CountLeadingZerosL:
|
||||||
|
if (!UseCountLeadingZerosInstructionsPPC64)
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
case Op_CountTrailingZerosI:
|
case Op_CountTrailingZerosI:
|
||||||
case Op_CountTrailingZerosL:
|
case Op_CountTrailingZerosL:
|
||||||
if (!UseCountLeadingZerosInstructionsPPC64)
|
if (!UseCountLeadingZerosInstructionsPPC64 &&
|
||||||
|
!UseCountTrailingZerosInstructionsPPC64)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -13425,7 +13429,7 @@ instruct countLeadingZerosP(iRegIdst dst, iRegPsrc src) %{
|
|||||||
|
|
||||||
instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{
|
instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{
|
||||||
match(Set dst (CountTrailingZerosI src));
|
match(Set dst (CountTrailingZerosI src));
|
||||||
predicate(UseCountLeadingZerosInstructionsPPC64);
|
predicate(UseCountLeadingZerosInstructionsPPC64 && !UseCountTrailingZerosInstructionsPPC64);
|
||||||
ins_cost(DEFAULT_COST);
|
ins_cost(DEFAULT_COST);
|
||||||
|
|
||||||
expand %{
|
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) %{
|
instruct countTrailingZerosL_Ex(iRegIdst dst, iRegLsrc src) %{
|
||||||
match(Set dst (CountTrailingZerosL src));
|
match(Set dst (CountTrailingZerosL src));
|
||||||
predicate(UseCountLeadingZerosInstructionsPPC64);
|
predicate(UseCountLeadingZerosInstructionsPPC64 && !UseCountTrailingZerosInstructionsPPC64);
|
||||||
ins_cost(DEFAULT_COST);
|
ins_cost(DEFAULT_COST);
|
||||||
|
|
||||||
expand %{
|
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.
|
// Expand nodes for byte_reverse_int.
|
||||||
instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{
|
instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{
|
||||||
effect(DEF dst, USE src, USE pos, USE shift);
|
effect(DEF dst, USE src, USE pos, USE shift);
|
||||||
|
@ -129,6 +129,17 @@ void VM_Version::initialize() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
MaxVectorSize = SuperwordUseVSX ? 16 : 8;
|
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
|
#endif
|
||||||
|
|
||||||
// Create and print feature-string.
|
// Create and print feature-string.
|
||||||
|
@ -227,12 +227,12 @@ bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result,
|
|||||||
if (tmp->is_valid()) {
|
if (tmp->is_valid()) {
|
||||||
if (is_power_of_2(c + 1)) {
|
if (is_power_of_2(c + 1)) {
|
||||||
__ move(left, tmp);
|
__ move(left, tmp);
|
||||||
__ shift_left(left, log2_intptr(c + 1), left);
|
__ shift_left(left, log2_int(c + 1), left);
|
||||||
__ sub(left, tmp, result);
|
__ sub(left, tmp, result);
|
||||||
return true;
|
return true;
|
||||||
} else if (is_power_of_2(c - 1)) {
|
} else if (is_power_of_2(c - 1)) {
|
||||||
__ move(left, tmp);
|
__ move(left, tmp);
|
||||||
__ shift_left(left, log2_intptr(c - 1), left);
|
__ shift_left(left, log2_int(c - 1), left);
|
||||||
__ add(left, tmp, result);
|
__ add(left, tmp, result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -502,7 +502,7 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) {
|
|||||||
__ and3(Rscratch, divisor - 1, Rscratch);
|
__ and3(Rscratch, divisor - 1, Rscratch);
|
||||||
}
|
}
|
||||||
__ add(Rdividend, Rscratch, Rscratch);
|
__ add(Rdividend, Rscratch, Rscratch);
|
||||||
__ sra(Rscratch, log2_intptr(divisor), Rresult);
|
__ sra(Rscratch, log2_int(divisor), Rresult);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (divisor == 2) {
|
if (divisor == 2) {
|
||||||
|
@ -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) {
|
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
|
||||||
assert(left != result, "should be different registers");
|
assert(left != result, "should be different registers");
|
||||||
if (is_power_of_2(c + 1)) {
|
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);
|
__ sub(result, left, result);
|
||||||
return true;
|
return true;
|
||||||
} else if (is_power_of_2(c - 1)) {
|
} 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);
|
__ add(result, left, result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2555,7 +2555,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
|
|||||||
Register dreg = result->as_register();
|
Register dreg = result->as_register();
|
||||||
|
|
||||||
if (right->is_constant()) {
|
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");
|
assert(divisor > 0 && is_power_of_2(divisor), "must be");
|
||||||
if (code == lir_idiv) {
|
if (code == lir_idiv) {
|
||||||
assert(lreg == rax, "must be rax,");
|
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);
|
__ andl(rdx, divisor - 1);
|
||||||
__ addl(lreg, rdx);
|
__ addl(lreg, rdx);
|
||||||
}
|
}
|
||||||
__ sarl(lreg, log2_intptr(divisor));
|
__ sarl(lreg, log2_jint(divisor));
|
||||||
move_regs(lreg, dreg);
|
move_regs(lreg, dreg);
|
||||||
} else if (code == lir_irem) {
|
} else if (code == lir_irem) {
|
||||||
Label done;
|
Label done;
|
||||||
|
@ -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 (tmp->is_valid() && c > 0 && c < max_jint) {
|
||||||
if (is_power_of_2(c + 1)) {
|
if (is_power_of_2(c + 1)) {
|
||||||
__ move(left, tmp);
|
__ move(left, tmp);
|
||||||
__ shift_left(left, log2_intptr(c + 1), left);
|
__ shift_left(left, log2_jint(c + 1), left);
|
||||||
__ sub(left, tmp, result);
|
__ sub(left, tmp, result);
|
||||||
return true;
|
return true;
|
||||||
} else if (is_power_of_2(c - 1)) {
|
} else if (is_power_of_2(c - 1)) {
|
||||||
__ move(left, tmp);
|
__ move(left, tmp);
|
||||||
__ shift_left(left, log2_intptr(c - 1), left);
|
__ shift_left(left, log2_jint(c - 1), left);
|
||||||
__ add(left, tmp, result);
|
__ add(left, tmp, result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -984,44 +984,50 @@ void VM_Version::get_processor_features() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if COMPILER2_OR_JVMCI
|
#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)) {
|
if (!is_power_of_2(MaxVectorSize)) {
|
||||||
warning("MaxVectorSize must be a power of 2");
|
warning("MaxVectorSize must be a power of 2, setting to default: %i", max_vector_size);
|
||||||
FLAG_SET_DEFAULT(MaxVectorSize, 64);
|
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// If default, use highest supported configuration
|
||||||
|
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(COMPILER2) && defined(ASSERT)
|
#if defined(COMPILER2) && defined(ASSERT)
|
||||||
|
if (MaxVectorSize > 0) {
|
||||||
if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) {
|
if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) {
|
||||||
tty->print_cr("State of YMM registers after signal handle:");
|
tty->print_cr("State of YMM registers after signal handle:");
|
||||||
int nreg = 2 LP64_ONLY(+2);
|
int nreg = 2 LP64_ONLY(+2);
|
||||||
@ -1034,11 +1040,9 @@ void VM_Version::get_processor_features() {
|
|||||||
tty->cr();
|
tty->cr();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // COMPILER2 && ASSERT
|
|
||||||
}
|
}
|
||||||
#endif // COMPILER2_OR_JVMCI
|
#endif // COMPILER2 && ASSERT
|
||||||
|
|
||||||
#ifdef COMPILER2
|
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
|
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
|
||||||
UseMultiplyToLenIntrinsic = true;
|
UseMultiplyToLenIntrinsic = true;
|
||||||
@ -1086,8 +1090,8 @@ void VM_Version::get_processor_features() {
|
|||||||
}
|
}
|
||||||
FLAG_SET_DEFAULT(UseMulAddIntrinsic, false);
|
FLAG_SET_DEFAULT(UseMulAddIntrinsic, false);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // _LP64
|
||||||
#endif // COMPILER2
|
#endif // COMPILER2_OR_JVMCI
|
||||||
|
|
||||||
// On new cpus instructions which update whole XMM register should be used
|
// On new cpus instructions which update whole XMM register should be used
|
||||||
// to prevent partial register stall due to dependencies on high half.
|
// to prevent partial register stall due to dependencies on high half.
|
||||||
|
@ -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));
|
match(Set cr (CmpI (AndI (LoadUB mem) imm) zero));
|
||||||
|
|
||||||
ins_cost(125);
|
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_encode %{ __ testb($mem$$Address, $imm$$constant); %}
|
||||||
ins_pipe(ialu_cr_reg_mem);
|
ins_pipe(ialu_cr_reg_mem);
|
||||||
%}
|
%}
|
||||||
|
@ -3532,6 +3532,10 @@ void os::init(void) {
|
|||||||
// This is called _after_ the global arguments have been parsed.
|
// This is called _after_ the global arguments have been parsed.
|
||||||
jint os::init_2(void) {
|
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();
|
os::Posix::init_2();
|
||||||
|
|
||||||
if (os::Aix::on_pase()) {
|
if (os::Aix::on_pase()) {
|
||||||
|
@ -3167,6 +3167,10 @@ extern "C" {
|
|||||||
// this is called _after_ the global arguments have been parsed
|
// this is called _after_ the global arguments have been parsed
|
||||||
jint os::init_2(void) {
|
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();
|
os::Posix::init_2();
|
||||||
|
|
||||||
// initialize suspend/resume support - must do this before signal_sets_init()
|
// initialize suspend/resume support - must do this before signal_sets_init()
|
||||||
|
@ -4957,6 +4957,10 @@ void os::pd_init_container_support() {
|
|||||||
// this is called _after_ the global arguments have been parsed
|
// this is called _after_ the global arguments have been parsed
|
||||||
jint os::init_2(void) {
|
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();
|
os::Posix::init_2();
|
||||||
|
|
||||||
Linux::fast_thread_clock_init();
|
Linux::fast_thread_clock_init();
|
||||||
|
@ -37,6 +37,8 @@
|
|||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <pwd.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
@ -441,6 +443,38 @@ void os::Posix::print_uname_info(outputStream* st) {
|
|||||||
st->cr();
|
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) {
|
bool os::get_host_name(char* buf, size_t buflen) {
|
||||||
struct utsname name;
|
struct utsname name;
|
||||||
uname(&name);
|
uname(&name);
|
||||||
|
@ -117,6 +117,10 @@ public:
|
|||||||
// effective gid, or if given uid is root.
|
// effective gid, or if given uid is root.
|
||||||
static bool matches_effective_uid_and_gid_or_root(uid_t uid, gid_t gid);
|
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
|
#ifdef SUPPORTS_CLOCK_MONOTONIC
|
||||||
|
|
||||||
static bool supports_monotonic_clock();
|
static bool supports_monotonic_clock();
|
||||||
|
@ -4199,6 +4199,7 @@ jint os::init_2(void) {
|
|||||||
// initialize synchronization primitives to use either thread or
|
// initialize synchronization primitives to use either thread or
|
||||||
// lwp synchronization (controlled by UseLWPSynchronization)
|
// lwp synchronization (controlled by UseLWPSynchronization)
|
||||||
Solaris::synchronization_init();
|
Solaris::synchronization_init();
|
||||||
|
DEBUG_ONLY(os::set_mutex_init_done();)
|
||||||
|
|
||||||
if (MaxFDLimit) {
|
if (MaxFDLimit) {
|
||||||
// set the number of file descriptors to max. print out error
|
// set the number of file descriptors to max. print out error
|
||||||
|
@ -1688,7 +1688,13 @@ void os::win32::print_windows_version(outputStream* st) {
|
|||||||
if (is_workstation) {
|
if (is_workstation) {
|
||||||
st->print("10");
|
st->print("10");
|
||||||
} else {
|
} 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;
|
break;
|
||||||
|
|
||||||
@ -4030,6 +4036,11 @@ static jint initSock();
|
|||||||
|
|
||||||
// this is called _after_ the global arguments have been parsed
|
// this is called _after_ the global arguments have been parsed
|
||||||
jint os::init_2(void) {
|
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
|
// Setup Windows Exceptions
|
||||||
|
|
||||||
// for debugging float code generation bugs
|
// for debugging float code generation bugs
|
||||||
|
@ -210,7 +210,7 @@ void ADLParser::instr_parse(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(match_rules_cnt < 100," too many match rule clones");
|
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++);
|
sprintf(buf, "%s_%d", instr->_ident, match_rules_cnt++);
|
||||||
rule->_result = buf;
|
rule->_result = buf;
|
||||||
// Check for commutative operations with tree operands.
|
// 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
|
// Create a new encoding name based on the name of the instruction
|
||||||
// definition, which should be unique.
|
// definition, which should be unique.
|
||||||
const char* prefix = "__ins_encode_";
|
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);
|
sprintf(ec_name, "%s%s", prefix, inst._ident);
|
||||||
|
|
||||||
assert(_AD._encode->encClass(ec_name) == NULL, "shouldn't already exist");
|
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
|
// Create a new encoding name based on the name of the instruction
|
||||||
// definition, which should be unique.
|
// definition, which should be unique.
|
||||||
const char* prefix = "__constant_";
|
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);
|
sprintf(ec_name, "%s%s", prefix, inst._ident);
|
||||||
|
|
||||||
assert(_AD._encode->encClass(ec_name) == NULL, "shouldn't already exist");
|
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) {
|
if (_AD._adlocation_debug) {
|
||||||
char* location = get_line_string(line);
|
char* location = get_line_string(line);
|
||||||
char* end_loc = end_line_marker();
|
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);
|
strcpy(result, location);
|
||||||
strcat(result, cppBlock);
|
strcat(result, cppBlock);
|
||||||
strcat(result, end_loc);
|
strcat(result, end_loc);
|
||||||
@ -4549,7 +4549,7 @@ char *ADLParser::get_paren_expr(const char *description, bool include_location)
|
|||||||
// Prepend location descriptor, for debugging.
|
// Prepend location descriptor, for debugging.
|
||||||
char* location = get_line_string(line);
|
char* location = get_line_string(line);
|
||||||
char* end_loc = end_line_marker();
|
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);
|
strcpy(result, location);
|
||||||
strcat(result, token2);
|
strcat(result, token2);
|
||||||
strcat(result, end_loc);
|
strcat(result, end_loc);
|
||||||
@ -4647,7 +4647,7 @@ char *ADLParser::get_ident_or_literal_constant(const char* description) {
|
|||||||
// Grab a constant expression.
|
// Grab a constant expression.
|
||||||
param = get_paren_expr(description);
|
param = get_paren_expr(description);
|
||||||
if (param[0] != '(') {
|
if (param[0] != '(') {
|
||||||
char* buf = (char*) malloc(strlen(param) + 3);
|
char* buf = (char*) AllocateHeap(strlen(param) + 3);
|
||||||
sprintf(buf, "(%s)", param);
|
sprintf(buf, "(%s)", param);
|
||||||
param = buf;
|
param = buf;
|
||||||
}
|
}
|
||||||
@ -5255,7 +5255,7 @@ void ADLParser::next_line() {
|
|||||||
char* ADLParser::get_line_string(int linenum) {
|
char* ADLParser::get_line_string(int linenum) {
|
||||||
const char* file = _AD._ADL_file._name;
|
const char* file = _AD._ADL_file._name;
|
||||||
int line = linenum ? linenum : this->linenum();
|
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);
|
sprintf(location, "\n#line %d \"%s\"\n", line, file);
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,16 @@
|
|||||||
|
|
||||||
#include "adlc.hpp"
|
#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() {
|
void* Chunk::operator new(size_t requested_size, size_t length) throw() {
|
||||||
return CHeapObj::operator new(requested_size + length);
|
return CHeapObj::operator new(requested_size + length);
|
||||||
}
|
}
|
||||||
@ -164,7 +174,7 @@ bool Arena::contains( const void *ptr ) const {
|
|||||||
// CHeapObj
|
// CHeapObj
|
||||||
|
|
||||||
void* CHeapObj::operator new(size_t size) throw() {
|
void* CHeapObj::operator new(size_t size) throw() {
|
||||||
return (void *) malloc(size);
|
return (void *) AllocateHeap(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHeapObj::operator delete(void* p){
|
void CHeapObj::operator delete(void* p){
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
#ifndef SHARE_VM_ADLC_ARENA_HPP
|
#ifndef SHARE_VM_ADLC_ARENA_HPP
|
||||||
#define SHARE_VM_ADLC_ARENA_HPP
|
#define SHARE_VM_ADLC_ARENA_HPP
|
||||||
|
|
||||||
|
void* AllocateHeap(size_t size);
|
||||||
|
|
||||||
// All classes in adlc may be derived
|
// All classes in adlc may be derived
|
||||||
// from one of the following allocation classes:
|
// from one of the following allocation classes:
|
||||||
//
|
//
|
||||||
@ -42,7 +44,6 @@ class CHeapObj {
|
|||||||
void* new_array(size_t size);
|
void* new_array(size_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Base class for classes that constitute name spaces.
|
// Base class for classes that constitute name spaces.
|
||||||
|
|
||||||
class AllStatic {
|
class AllStatic {
|
||||||
|
@ -40,7 +40,7 @@ const char *NameList::_signal3 = "$$SIGNAL3$$";
|
|||||||
|
|
||||||
// Constructor and Destructor
|
// Constructor and Destructor
|
||||||
NameList::NameList() : _cur(0), _max(4), _iter(0), _justReset(true) {
|
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() {
|
NameList::~NameList() {
|
||||||
// The following free is a double-free, and crashes the program:
|
// The following free is a double-free, and crashes the program:
|
||||||
|
@ -1354,7 +1354,7 @@ void InstructForm::set_unique_opnds() {
|
|||||||
// component back to an index and any DEF always goes at 0 so the
|
// 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.
|
// length of the array has to be the number of components + 1.
|
||||||
_uniq_idx_length = _components.count() + 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++) {
|
for (i = 0; i < _uniq_idx_length; i++) {
|
||||||
uniq_idx[i] = i;
|
uniq_idx[i] = i;
|
||||||
}
|
}
|
||||||
@ -3449,7 +3449,7 @@ void MatchNode::build_internalop( ) {
|
|||||||
rstr = (_rChild) ? ((_rChild->_internalop) ?
|
rstr = (_rChild) ? ((_rChild->_internalop) ?
|
||||||
_rChild->_internalop : _rChild->_opType) : "";
|
_rChild->_internalop : _rChild->_opType) : "";
|
||||||
len += (int)strlen(lstr) + (int)strlen(rstr);
|
len += (int)strlen(lstr) + (int)strlen(rstr);
|
||||||
subtree = (char *)malloc(len);
|
subtree = (char *)AllocateHeap(len);
|
||||||
sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
|
sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
|
||||||
// Hash the subtree string in _internalOps; if a name exists, use it
|
// Hash the subtree string in _internalOps; if a name exists, use it
|
||||||
iop = (char *)_AD._internalOps[subtree];
|
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);
|
MatchRule* clone = new MatchRule(_AD, this);
|
||||||
// Swap operands of commutative operation
|
// Swap operands of commutative operation
|
||||||
((MatchNode*)clone)->swap_commutative_op(true, count);
|
((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++);
|
sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++);
|
||||||
clone->_result = buf;
|
clone->_result = buf;
|
||||||
|
|
||||||
|
@ -176,6 +176,8 @@ private:
|
|||||||
virtual bool is_alive() const { return _is_alive(); }
|
virtual bool is_alive() const { return _is_alive(); }
|
||||||
virtual bool is_in_use() const { return state() == in_use; }
|
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(); }
|
address exception_begin() const { return (address) _code + _meta->exception_handler_offset(); }
|
||||||
|
|
||||||
virtual const char* name() const { return _name; }
|
virtual const char* name() const { return _name; }
|
||||||
|
@ -333,6 +333,17 @@ bool MacroAssembler::uses_implicit_null_check(void* address) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
|
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)
|
// Check if offset is outside of [-cell_header_size, os::vm_page_size)
|
||||||
return offset < -Universe::heap()->cell_header_size() ||
|
return offset < -Universe::heap()->cell_header_size() ||
|
||||||
offset >= os::vm_page_size();
|
offset >= os::vm_page_size();
|
||||||
|
@ -389,8 +389,8 @@ Klass* ClassListParser::load_current_class(TRAPS) {
|
|||||||
InstanceKlass* ik = InstanceKlass::cast(klass);
|
InstanceKlass* ik = InstanceKlass::cast(klass);
|
||||||
int id = this->id();
|
int id = this->id();
|
||||||
SystemDictionaryShared::update_shared_entry(ik, id);
|
SystemDictionaryShared::update_shared_entry(ik, id);
|
||||||
InstanceKlass* old = table()->lookup(id);
|
InstanceKlass** old_ptr = table()->lookup(id);
|
||||||
if (old != NULL && old != ik) {
|
if (old_ptr != NULL) {
|
||||||
error("Duplicated ID %d for class %s", id, _class_name);
|
error("Duplicated ID %d for class %s", id, _class_name);
|
||||||
}
|
}
|
||||||
table()->add(id, ik);
|
table()->add(id, ik);
|
||||||
@ -404,11 +404,12 @@ bool ClassListParser::is_loading_from_source() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
InstanceKlass* ClassListParser::lookup_class_by_id(int id) {
|
InstanceKlass* ClassListParser::lookup_class_by_id(int id) {
|
||||||
InstanceKlass* klass = table()->lookup(id);
|
InstanceKlass** klass_ptr = table()->lookup(id);
|
||||||
if (klass == NULL) {
|
if (klass_ptr == NULL) {
|
||||||
error("Class ID %d has not been defined", id);
|
error("Class ID %d has not been defined", id);
|
||||||
}
|
}
|
||||||
return klass;
|
assert(*klass_ptr != NULL, "must be");
|
||||||
|
return *klass_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -27,30 +27,12 @@
|
|||||||
|
|
||||||
#include "utilities/exceptions.hpp"
|
#include "utilities/exceptions.hpp"
|
||||||
#include "utilities/globalDefinitions.hpp"
|
#include "utilities/globalDefinitions.hpp"
|
||||||
#include "utilities/hashtable.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
|
#include "utilities/hashtable.inline.hpp"
|
||||||
|
|
||||||
class CDSClassInfo;
|
class ID2KlassTable : public KVHashtable<int, InstanceKlass*, mtInternal> {
|
||||||
|
|
||||||
// Look up from ID -> InstanceKlass*
|
|
||||||
class ID2KlassTable : public Hashtable<InstanceKlass*, mtClass> {
|
|
||||||
public:
|
public:
|
||||||
ID2KlassTable() : Hashtable<InstanceKlass*, mtClass>(1987, sizeof(HashtableEntry<InstanceKlass*, mtClass>)) { }
|
ID2KlassTable() : KVHashtable<int, InstanceKlass*, mtInternal>(1987) {}
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class ClassListParser : public StackObj {
|
class ClassListParser : public StackObj {
|
||||||
|
@ -484,7 +484,7 @@ void ClassLoaderData::initialize_holder(Handle loader_or_mirror) {
|
|||||||
// Remove a klass from the _klasses list for scratch_class during redefinition
|
// Remove a klass from the _klasses list for scratch_class during redefinition
|
||||||
// or parsed class in the case of an error.
|
// or parsed class in the case of an error.
|
||||||
void ClassLoaderData::remove_class(Klass* scratch_class) {
|
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.
|
// Adjust global class iterator.
|
||||||
ClassLoaderDataGraph::adjust_saved_class(scratch_class);
|
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!
|
// Deallocate free metadata on the free list. How useful the PermGen was!
|
||||||
void ClassLoaderData::free_deallocate_list() {
|
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(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
||||||
assert(!is_unloading(), "only called for ClassLoaderData that are not unloading");
|
assert(!is_unloading(), "only called for ClassLoaderData that are not unloading");
|
||||||
if (_deallocate_list == NULL) {
|
if (_deallocate_list == NULL) {
|
||||||
@ -844,8 +845,7 @@ void ClassLoaderData::free_deallocate_list() {
|
|||||||
// classes. The metadata is removed with the unloading metaspace.
|
// classes. The metadata is removed with the unloading metaspace.
|
||||||
// There isn't C heap memory allocated for methods, so nothing is done for them.
|
// There isn't C heap memory allocated for methods, so nothing is done for them.
|
||||||
void ClassLoaderData::free_deallocate_list_C_heap_structures() {
|
void ClassLoaderData::free_deallocate_list_C_heap_structures() {
|
||||||
// Don't need lock, at safepoint
|
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
|
||||||
assert(is_unloading(), "only called for ClassLoaderData that are unloading");
|
assert(is_unloading(), "only called for ClassLoaderData that are unloading");
|
||||||
if (_deallocate_list == NULL) {
|
if (_deallocate_list == NULL) {
|
||||||
return;
|
return;
|
||||||
|
@ -230,13 +230,6 @@ ClassLoaderData* ClassLoaderDataGraph::add(Handle loader, bool is_unsafe_anonymo
|
|||||||
return loader_data;
|
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) {
|
void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
|
||||||
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
||||||
// Only walk the head until any clds not purged from prior unloading
|
// 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) {
|
void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
|
||||||
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
||||||
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
|
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.
|
HandleMark _hm; // clean up handles when this is done.
|
||||||
Handle _holder;
|
Handle _holder;
|
||||||
Thread* _thread;
|
Thread* _thread;
|
||||||
|
NoSafepointVerifier _nsv; // No safepoints allowed in this scope
|
||||||
|
// unless verifying at a safepoint.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head) {
|
ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head),
|
||||||
|
_nsv(true, !SafepointSynchronize::is_at_safepoint()) {
|
||||||
_thread = Thread::current();
|
_thread = Thread::current();
|
||||||
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||||
}
|
}
|
||||||
@ -308,10 +313,15 @@ public:
|
|||||||
}
|
}
|
||||||
return cld;
|
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
|
// These functions assume that the caller has locked the ClassLoaderDataGraph_lock
|
||||||
// if they are not calling the function from a safepoint.
|
// if they are not calling the function from a safepoint.
|
||||||
void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
|
void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
|
||||||
@ -572,7 +582,7 @@ void ClassLoaderDataGraph::clean_module_and_package_info() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClassLoaderDataGraph::purge() {
|
void ClassLoaderDataGraph::purge() {
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
|
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||||
ClassLoaderData* list = _unloading;
|
ClassLoaderData* list = _unloading;
|
||||||
_unloading = NULL;
|
_unloading = NULL;
|
||||||
ClassLoaderData* next = list;
|
ClassLoaderData* next = list;
|
||||||
|
@ -73,6 +73,8 @@ class ClassLoaderDataGraph : public AllStatic {
|
|||||||
static void cld_unloading_do(CLDClosure* cl);
|
static void cld_unloading_do(CLDClosure* cl);
|
||||||
static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
|
static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
|
||||||
static void always_strong_cld_do(CLDClosure* cl);
|
static void always_strong_cld_do(CLDClosure* cl);
|
||||||
|
// Iteration through CLDG not by GC.
|
||||||
|
static void loaded_cld_do(CLDClosure* cl);
|
||||||
// klass do
|
// klass do
|
||||||
// Walking classes through the ClassLoaderDataGraph include array classes. It also includes
|
// 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
|
// classes that are allocated but not loaded, classes that have errors, and scratch classes
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "classfile/classFileParser.hpp"
|
#include "classfile/classFileParser.hpp"
|
||||||
#include "classfile/classFileStream.hpp"
|
#include "classfile/classFileStream.hpp"
|
||||||
#include "classfile/classListParser.hpp"
|
|
||||||
#include "classfile/classLoader.inline.hpp"
|
#include "classfile/classLoader.inline.hpp"
|
||||||
#include "classfile/classLoaderExt.hpp"
|
#include "classfile/classLoaderExt.hpp"
|
||||||
#include "classfile/classLoaderData.inline.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
|
// the "source:" in the class list file (see classListParser.cpp), and can be a directory or
|
||||||
// a JAR file.
|
// a JAR file.
|
||||||
InstanceKlass* ClassLoaderExt::load_class(Symbol* name, const char* path, TRAPS) {
|
InstanceKlass* ClassLoaderExt::load_class(Symbol* name, const char* path, TRAPS) {
|
||||||
|
|
||||||
assert(name != NULL, "invariant");
|
assert(name != NULL, "invariant");
|
||||||
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
|
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
|
||||||
ResourceMark rm(THREAD);
|
ResourceMark rm(THREAD);
|
||||||
|
@ -515,7 +515,7 @@ public:
|
|||||||
assert(SafepointSynchronize::is_at_safepoint(), "must be a safepoint");
|
assert(SafepointSynchronize::is_at_safepoint(), "must be a safepoint");
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
LoaderInfoScanClosure cl (_show_classes, _verbose);
|
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.
|
// In non-verbose and non-show-classes mode, attempt to fold the tree.
|
||||||
if (_fold) {
|
if (_fold) {
|
||||||
if (!_verbose && !_show_classes) {
|
if (!_verbose && !_show_classes) {
|
||||||
|
@ -159,7 +159,7 @@ void ClassLoaderStatsClosure::addEmptyParents(oop cl) {
|
|||||||
|
|
||||||
void ClassLoaderStatsVMOperation::doit() {
|
void ClassLoaderStatsVMOperation::doit() {
|
||||||
ClassLoaderStatsClosure clsc (_out);
|
ClassLoaderStatsClosure clsc (_out);
|
||||||
ClassLoaderDataGraph::cld_do(&clsc);
|
ClassLoaderDataGraph::loaded_cld_do(&clsc);
|
||||||
clsc.print();
|
clsc.print();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include "oops/array.hpp"
|
#include "oops/array.hpp"
|
||||||
#include "oops/symbol.hpp"
|
#include "oops/symbol.hpp"
|
||||||
#include "utilities/hashtable.hpp"
|
#include "utilities/growableArray.hpp"
|
||||||
|
|
||||||
|
|
||||||
template <
|
template <
|
||||||
@ -330,7 +330,7 @@ public:
|
|||||||
// offset from the CDS base address.
|
// offset from the CDS base address.
|
||||||
|
|
||||||
template <typename V>
|
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);
|
return (V)(base_address + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +67,6 @@ Dictionary::~Dictionary() {
|
|||||||
}
|
}
|
||||||
assert(number_of_entries() == 0, "should have removed all entries");
|
assert(number_of_entries() == 0, "should have removed all entries");
|
||||||
assert(new_entry_free_list() == NULL, "entry present on Dictionary's free list");
|
assert(new_entry_free_list() == NULL, "entry present on Dictionary's free list");
|
||||||
free_buckets();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DictionaryEntry* Dictionary::new_entry(unsigned int hash, InstanceKlass* klass) {
|
DictionaryEntry* Dictionary::new_entry(unsigned int hash, InstanceKlass* klass) {
|
||||||
|
@ -204,7 +204,7 @@ bool ModuleEntry::has_reads_list() const {
|
|||||||
|
|
||||||
// Purge dead module entries out of reads list.
|
// Purge dead module entries out of reads list.
|
||||||
void ModuleEntry::purge_reads() {
|
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()) {
|
if (_must_walk_reads && has_reads_list()) {
|
||||||
// This module's _must_walk_reads flag will be reset based
|
// 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() {
|
void ModuleEntry::delete_reads() {
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
|
||||||
delete _reads;
|
delete _reads;
|
||||||
_reads = NULL;
|
_reads = NULL;
|
||||||
}
|
}
|
||||||
@ -319,8 +318,6 @@ ModuleEntryTable::ModuleEntryTable(int table_size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ModuleEntryTable::~ModuleEntryTable() {
|
ModuleEntryTable::~ModuleEntryTable() {
|
||||||
assert_locked_or_safepoint(Module_lock);
|
|
||||||
|
|
||||||
// Walk through all buckets and all entries in each bucket,
|
// Walk through all buckets and all entries in each bucket,
|
||||||
// freeing each entry.
|
// freeing each entry.
|
||||||
for (int i = 0; i < table_size(); ++i) {
|
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(number_of_entries() == 0, "should have removed all entries");
|
||||||
assert(new_entry_free_list() == NULL, "entry present on ModuleEntryTable's free list");
|
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,
|
ModuleEntry* ModuleEntryTable::new_entry(unsigned int hash, Handle module_handle,
|
||||||
|
@ -125,7 +125,7 @@ void PackageEntry::set_is_exported_allUnnamed() {
|
|||||||
// get deleted. This prevents the package from illegally transitioning from
|
// get deleted. This prevents the package from illegally transitioning from
|
||||||
// exported to non-exported.
|
// exported to non-exported.
|
||||||
void PackageEntry::purge_qualified_exports() {
|
void PackageEntry::purge_qualified_exports() {
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
assert_locked_or_safepoint(Module_lock);
|
||||||
if (_must_walk_exports &&
|
if (_must_walk_exports &&
|
||||||
_qualified_exports != NULL &&
|
_qualified_exports != NULL &&
|
||||||
!_qualified_exports->is_empty()) {
|
!_qualified_exports->is_empty()) {
|
||||||
@ -160,7 +160,6 @@ void PackageEntry::purge_qualified_exports() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PackageEntry::delete_qualified_exports() {
|
void PackageEntry::delete_qualified_exports() {
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
|
||||||
if (_qualified_exports != NULL) {
|
if (_qualified_exports != NULL) {
|
||||||
delete _qualified_exports;
|
delete _qualified_exports;
|
||||||
}
|
}
|
||||||
@ -192,7 +191,6 @@ PackageEntryTable::~PackageEntryTable() {
|
|||||||
}
|
}
|
||||||
assert(number_of_entries() == 0, "should have removed all entries");
|
assert(number_of_entries() == 0, "should have removed all entries");
|
||||||
assert(new_entry_free_list() == NULL, "entry present on PackageEntryTable's free list");
|
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) {
|
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) {
|
PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
|
||||||
|
MutexLocker ml(Module_lock);
|
||||||
PackageEntry* p = lookup_only(name);
|
PackageEntry* p = lookup_only(name);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
return p;
|
return p;
|
||||||
} else {
|
} else {
|
||||||
// If not found, add to table. Grab the PackageEntryTable lock first.
|
assert(module != NULL, "module should never be null");
|
||||||
MutexLocker ml(Module_lock);
|
PackageEntry* entry = new_entry(compute_hash(name), name, module);
|
||||||
|
add_entry(index_for(name), entry);
|
||||||
// Since look-up was done lock-free, we need to check if another thread beat
|
return entry;
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
|
PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
|
||||||
|
MutexLockerEx ml(Module_lock->owned_by_self() ? NULL : Module_lock);
|
||||||
int index = index_for(name);
|
int index = index_for(name);
|
||||||
for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
|
for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
|
||||||
if (p->name()->fast_compare(name) == 0) {
|
if (p->name()->fast_compare(name) == 0) {
|
||||||
@ -296,7 +285,7 @@ void PackageEntry::package_exports_do(ModuleClosure* f) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool PackageEntry::exported_pending_delete() const {
|
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);
|
return (is_unqual_exported() && _qualified_exports != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -253,7 +253,7 @@ public:
|
|||||||
// lookup Package with loader's package entry table, if not found add
|
// lookup Package with loader's package entry table, if not found add
|
||||||
PackageEntry* lookup(Symbol* name, ModuleEntry* module);
|
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);
|
PackageEntry* lookup_only(Symbol* Package);
|
||||||
|
|
||||||
void verify_javabase_packages(GrowableArray<Symbol*> *pkg_list);
|
void verify_javabase_packages(GrowableArray<Symbol*> *pkg_list);
|
||||||
|
@ -1807,18 +1807,26 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
|
|||||||
bool SystemDictionary::do_unloading(GCTimer* gc_timer) {
|
bool SystemDictionary::do_unloading(GCTimer* gc_timer) {
|
||||||
|
|
||||||
bool unloading_occurred;
|
bool unloading_occurred;
|
||||||
|
bool is_concurrent = !SafepointSynchronize::is_at_safepoint();
|
||||||
{
|
{
|
||||||
GCTraceTime(Debug, gc, phases) t("ClassLoaderData", gc_timer);
|
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.
|
// First, mark for unload all ClassLoaderData referencing a dead class loader.
|
||||||
unloading_occurred = ClassLoaderDataGraph::do_unloading();
|
unloading_occurred = ClassLoaderDataGraph::do_unloading();
|
||||||
if (unloading_occurred) {
|
if (unloading_occurred) {
|
||||||
|
MutexLockerEx ml2(is_concurrent ? Module_lock : NULL);
|
||||||
JFR_ONLY(Jfr::on_unloading_classes();)
|
JFR_ONLY(Jfr::on_unloading_classes();)
|
||||||
|
MutexLockerEx ml1(is_concurrent ? SystemDictionary_lock : NULL);
|
||||||
ClassLoaderDataGraph::clean_module_and_package_info();
|
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) {
|
if (unloading_occurred) {
|
||||||
{
|
{
|
||||||
GCTraceTime(Debug, gc, phases) t("SymbolTable", gc_timer);
|
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);
|
GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer);
|
||||||
constraints()->purge_loader_constraints();
|
constraints()->purge_loader_constraints();
|
||||||
resolution_errors()->purge_resolution_errors();
|
resolution_errors()->purge_resolution_errors();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
GCTraceTime(Debug, gc, phases) t("ProtectionDomainCacheTable", gc_timer);
|
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
|
||||||
// Oops referenced by the protection domain cache table may get unreachable independently
|
// 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
|
// of the class loader (eg. cached protection domain oops). So we need to
|
||||||
// explicitly unlink them here.
|
// explicitly unlink them here.
|
||||||
_pd_cache_table->trigger_cleanup();
|
// All protection domain oops are linked to the caller class, so if nothing
|
||||||
}
|
// unloads, this is not needed.
|
||||||
|
_pd_cache_table->trigger_cleanup();
|
||||||
{
|
}
|
||||||
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
|
|
||||||
ResolvedMethodTable::trigger_cleanup();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return unloading_occurred;
|
return unloading_occurred;
|
||||||
|
@ -657,7 +657,7 @@ void CodeCache::blobs_do(void f(CodeBlob* nm)) {
|
|||||||
|
|
||||||
void CodeCache::nmethods_do(void f(nmethod* nm)) {
|
void CodeCache::nmethods_do(void f(nmethod* nm)) {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::all_blobs);
|
||||||
while(iter.next()) {
|
while(iter.next()) {
|
||||||
f(iter.method());
|
f(iter.method());
|
||||||
}
|
}
|
||||||
@ -665,8 +665,8 @@ void CodeCache::nmethods_do(void f(nmethod* nm)) {
|
|||||||
|
|
||||||
void CodeCache::metadata_do(void f(Metadata* m)) {
|
void CodeCache::metadata_do(void f(Metadata* m)) {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
iter.method()->metadata_do(f);
|
iter.method()->metadata_do(f);
|
||||||
}
|
}
|
||||||
AOTLoader::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) {
|
void CodeCache::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred) {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
UnloadingScope scope(is_alive);
|
UnloadingScope scope(is_alive);
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
iter.method()->do_unloading(unloading_occurred);
|
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.
|
// Temporarily mark nmethods that are claimed to be on the scavenge list.
|
||||||
void CodeCache::mark_scavenge_root_nmethods() {
|
void CodeCache::mark_scavenge_root_nmethods() {
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
nmethod* nm = iter.method();
|
nmethod* nm = iter.method();
|
||||||
assert(nm->scavenge_root_not_marked(), "clean state");
|
assert(nm->scavenge_root_not_marked(), "clean state");
|
||||||
if (nm->on_scavenge_root_list())
|
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.
|
// If the closure is given, run it on the unlisted nmethods.
|
||||||
// Also make sure that the effects of mark_scavenge_root_nmethods is gone.
|
// Also make sure that the effects of mark_scavenge_root_nmethods is gone.
|
||||||
void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
|
void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
nmethod* nm = iter.method();
|
nmethod* nm = iter.method();
|
||||||
bool call_f = (f_or_null != NULL);
|
bool call_f = (f_or_null != NULL);
|
||||||
assert(nm->scavenge_root_not_marked(), "must be already processed");
|
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() {
|
void CodeCache::verify_clean_inline_caches() {
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
nmethod* nm = iter.method();
|
nmethod* nm = iter.method();
|
||||||
assert(!nm->is_unloaded(), "Tautology");
|
assert(!nm->is_unloaded(), "Tautology");
|
||||||
nm->verify_clean_inline_caches();
|
nm->verify_clean_inline_caches();
|
||||||
@ -943,8 +943,8 @@ void CodeCache::increment_unloading_cycle() {
|
|||||||
void CodeCache::verify_oops() {
|
void CodeCache::verify_oops() {
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
VerifyOopClosure voc;
|
VerifyOopClosure voc;
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
nmethod* nm = iter.method();
|
nmethod* nm = iter.method();
|
||||||
nm->oops_do(&voc);
|
nm->oops_do(&voc);
|
||||||
nm->verify_oop_relocations();
|
nm->verify_oop_relocations();
|
||||||
@ -1120,16 +1120,16 @@ int CodeCache::number_of_nmethods_with_dependencies() {
|
|||||||
|
|
||||||
void CodeCache::clear_inline_caches() {
|
void CodeCache::clear_inline_caches() {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
iter.method()->clear_inline_caches();
|
iter.method()->clear_inline_caches();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeCache::cleanup_inline_caches() {
|
void CodeCache::cleanup_inline_caches() {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
iter.method()->cleanup_inline_caches(/*clean_all=*/true);
|
iter.method()->cleanup_inline_caches(/*clean_all=*/true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1199,8 +1199,8 @@ int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
CompiledMethod* nm = iter.method();
|
CompiledMethod* nm = iter.method();
|
||||||
if (nm->is_marked_for_deoptimization()) {
|
if (nm->is_marked_for_deoptimization()) {
|
||||||
// ...Already marked in the previous pass; don't count it again.
|
// ...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
|
// Deoptimize all methods
|
||||||
void CodeCache::mark_all_nmethods_for_deoptimization() {
|
void CodeCache::mark_all_nmethods_for_deoptimization() {
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
CompiledMethod* nm = iter.method();
|
CompiledMethod* nm = iter.method();
|
||||||
if (!nm->method()->is_method_handle_intrinsic()) {
|
if (!nm->method()->is_method_handle_intrinsic()) {
|
||||||
nm->mark_for_deoptimization();
|
nm->mark_for_deoptimization();
|
||||||
@ -1235,8 +1235,8 @@ int CodeCache::mark_for_deoptimization(Method* dependee) {
|
|||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
int number_of_marked_CodeBlobs = 0;
|
int number_of_marked_CodeBlobs = 0;
|
||||||
|
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
CompiledMethod* nm = iter.method();
|
CompiledMethod* nm = iter.method();
|
||||||
if (nm->is_dependent_on_method(dependee)) {
|
if (nm->is_dependent_on_method(dependee)) {
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
@ -1250,8 +1250,8 @@ int CodeCache::mark_for_deoptimization(Method* dependee) {
|
|||||||
|
|
||||||
void CodeCache::make_marked_nmethods_not_entrant() {
|
void CodeCache::make_marked_nmethods_not_entrant() {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next_alive()) {
|
while(iter.next()) {
|
||||||
CompiledMethod* nm = iter.method();
|
CompiledMethod* nm = iter.method();
|
||||||
if (nm->is_marked_for_deoptimization() && !nm->is_not_entrant()) {
|
if (nm->is_marked_for_deoptimization() && !nm->is_not_entrant()) {
|
||||||
nm->make_not_entrant();
|
nm->make_not_entrant();
|
||||||
@ -1519,7 +1519,7 @@ void CodeCache::print_internals() {
|
|||||||
int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit, mtCode);
|
int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit, mtCode);
|
||||||
memset(buckets, 0, sizeof(int) * bucketLimit);
|
memset(buckets, 0, sizeof(int) * bucketLimit);
|
||||||
|
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::all_blobs);
|
||||||
while(iter.next()) {
|
while(iter.next()) {
|
||||||
nmethod* nm = iter.method();
|
nmethod* nm = iter.method();
|
||||||
if(nm->method() != NULL && nm->is_java_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) {
|
void CodeCache::print_codelist(outputStream* st) {
|
||||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||||
|
|
||||||
CompiledMethodIterator iter;
|
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||||
while (iter.next_alive()) {
|
while (iter.next()) {
|
||||||
CompiledMethod* cm = iter.method();
|
CompiledMethod* cm = iter.method();
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
char* method_name = cm->method()->name_and_sig_as_C_string();
|
char* method_name = cm->method()->name_and_sig_as_C_string();
|
||||||
|
@ -334,13 +334,21 @@ class CodeCache : AllStatic {
|
|||||||
|
|
||||||
// Iterator to iterate over nmethods in the CodeCache.
|
// Iterator to iterate over nmethods in the CodeCache.
|
||||||
template <class T, class Filter> class CodeBlobIterator : public StackObj {
|
template <class T, class Filter> class CodeBlobIterator : public StackObj {
|
||||||
|
public:
|
||||||
|
enum LivenessFilter { all_blobs, only_alive, only_alive_and_not_unloading };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CodeBlob* _code_blob; // Current CodeBlob
|
CodeBlob* _code_blob; // Current CodeBlob
|
||||||
GrowableArrayIterator<CodeHeap*> _heap;
|
GrowableArrayIterator<CodeHeap*> _heap;
|
||||||
GrowableArrayIterator<CodeHeap*> _end;
|
GrowableArrayIterator<CodeHeap*> _end;
|
||||||
|
bool _only_alive;
|
||||||
|
bool _only_not_unloading;
|
||||||
|
|
||||||
public:
|
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) {
|
if (Filter::heaps() == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -360,29 +368,35 @@ template <class T, class Filter> class CodeBlobIterator : public StackObj {
|
|||||||
bool next() {
|
bool next() {
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
|
|
||||||
bool result = next_blob();
|
for (;;) {
|
||||||
while (!result && _heap != _end) {
|
// Walk through heaps as required
|
||||||
// Advance to next code heap of segmented code cache
|
if (!next_blob()) {
|
||||||
if (++_heap == _end) {
|
if (_heap == _end) {
|
||||||
break;
|
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 end() const { return _code_blob == NULL; }
|
||||||
bool next_alive() {
|
T* method() const { return (T*)_code_blob; }
|
||||||
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; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -422,7 +436,6 @@ struct NMethodFilter {
|
|||||||
static const GrowableArray<CodeHeap*>* heaps() { return CodeCache::nmethod_heaps(); }
|
static const GrowableArray<CodeHeap*>* heaps() { return CodeCache::nmethod_heaps(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef CodeBlobIterator<CompiledMethod, CompiledMethodFilter> CompiledMethodIterator;
|
typedef CodeBlobIterator<CompiledMethod, CompiledMethodFilter> CompiledMethodIterator;
|
||||||
typedef CodeBlobIterator<nmethod, NMethodFilter> NMethodIterator;
|
typedef CodeBlobIterator<nmethod, NMethodFilter> NMethodIterator;
|
||||||
|
|
||||||
|
@ -44,11 +44,10 @@ CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType ty
|
|||||||
bool caller_must_gc_arguments)
|
bool caller_must_gc_arguments)
|
||||||
: CodeBlob(name, type, layout, frame_complete_offset, frame_size, oop_maps, 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),
|
_mark_for_deoptimization_status(not_marked),
|
||||||
_is_unloading_state(0),
|
_method(method),
|
||||||
_method(method)
|
_gc_data(NULL)
|
||||||
{
|
{
|
||||||
init_defaults();
|
init_defaults();
|
||||||
clear_unloading_state();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType type, int size,
|
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,
|
: CodeBlob(name, type, CodeBlobLayout((address) this, size, header_size, cb), cb,
|
||||||
frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
|
frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
|
||||||
_mark_for_deoptimization_status(not_marked),
|
_mark_for_deoptimization_status(not_marked),
|
||||||
_is_unloading_state(0),
|
_method(method),
|
||||||
_method(method)
|
_gc_data(NULL)
|
||||||
{
|
{
|
||||||
init_defaults();
|
init_defaults();
|
||||||
clear_unloading_state();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompiledMethod::init_defaults() {
|
void CompiledMethod::init_defaults() {
|
||||||
@ -546,74 +544,6 @@ void CompiledMethod::unload_nmethod_caches(bool unloading_occurred) {
|
|||||||
DEBUG_ONLY(metadata_do(check_class));
|
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
|
// Called to clean up after class unloading for live nmethods and from the sweeper
|
||||||
// for all methods.
|
// for all methods.
|
||||||
void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {
|
void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {
|
||||||
|
@ -151,8 +151,6 @@ protected:
|
|||||||
bool _is_far_code; // Code is far from CodeCache.
|
bool _is_far_code; // Code is far from CodeCache.
|
||||||
// Have to use far call instructions to call it from code in 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
|
// set during construction
|
||||||
unsigned int _has_unsafe_access:1; // May fault due to unsafe access.
|
unsigned int _has_unsafe_access:1; // May fault due to unsafe access.
|
||||||
unsigned int _has_method_handle_invokes:1; // Has this method MethodHandle invokes?
|
unsigned int _has_method_handle_invokes:1; // Has this method MethodHandle invokes?
|
||||||
@ -171,6 +169,8 @@ protected:
|
|||||||
PcDescContainer _pc_desc_container;
|
PcDescContainer _pc_desc_container;
|
||||||
ExceptionCache * volatile _exception_cache;
|
ExceptionCache * volatile _exception_cache;
|
||||||
|
|
||||||
|
void* _gc_data;
|
||||||
|
|
||||||
virtual void flush() = 0;
|
virtual void flush() = 0;
|
||||||
protected:
|
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);
|
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:
|
public:
|
||||||
virtual bool is_compiled() const { return true; }
|
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; }
|
bool has_unsafe_access() const { return _has_unsafe_access; }
|
||||||
void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
|
void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
|
||||||
|
|
||||||
@ -390,10 +395,9 @@ public:
|
|||||||
// GC unloading support
|
// GC unloading support
|
||||||
// Cleans unloaded klasses and unloaded nmethods in inline caches
|
// 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 unload_nmethod_caches(bool class_unloading_occurred);
|
||||||
void clear_unloading_state();
|
|
||||||
virtual void do_unloading(bool unloading_occurred) { }
|
virtual void do_unloading(bool unloading_occurred) { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -118,13 +118,13 @@ class DependencyContext : public StackObj {
|
|||||||
// Safepoints are forbidden during DC lifetime. GC can invalidate
|
// Safepoints are forbidden during DC lifetime. GC can invalidate
|
||||||
// _dependency_context_addr if it relocates the holder
|
// _dependency_context_addr if it relocates the holder
|
||||||
// (e.g. CallSiteContext Java object).
|
// (e.g. CallSiteContext Java object).
|
||||||
int _safepoint_counter;
|
uint64_t _safepoint_counter;
|
||||||
|
|
||||||
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr),
|
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr),
|
||||||
_safepoint_counter(SafepointSynchronize::_safepoint_counter) {}
|
_safepoint_counter(SafepointSynchronize::safepoint_counter()) {}
|
||||||
|
|
||||||
~DependencyContext() {
|
~DependencyContext() {
|
||||||
assert(_safepoint_counter == SafepointSynchronize::_safepoint_counter, "safepoint happened");
|
assert(_safepoint_counter == SafepointSynchronize::safepoint_counter(), "safepoint happened");
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr) {}
|
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr) {}
|
||||||
|
@ -565,6 +565,7 @@ nmethod::nmethod(
|
|||||||
ByteSize basic_lock_sp_offset,
|
ByteSize basic_lock_sp_offset,
|
||||||
OopMapSet* oop_maps )
|
OopMapSet* oop_maps )
|
||||||
: CompiledMethod(method, "native nmethod", type, nmethod_size, sizeof(nmethod), code_buffer, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps, false),
|
: 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_receiver_sp_offset(basic_lock_owner_sp_offset),
|
||||||
_native_basic_lock_sp_offset(basic_lock_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_code_and_locs_to(this);
|
||||||
code_buffer->copy_values_to(this);
|
code_buffer->copy_values_to(this);
|
||||||
|
|
||||||
|
clear_unloading_state();
|
||||||
if (ScavengeRootsInCode) {
|
if (ScavengeRootsInCode) {
|
||||||
Universe::heap()->register_nmethod(this);
|
Universe::heap()->register_nmethod(this);
|
||||||
}
|
}
|
||||||
@ -672,6 +674,7 @@ nmethod::nmethod(
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
: CompiledMethod(method, "nmethod", type, nmethod_size, sizeof(nmethod), code_buffer, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps, false),
|
: 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_receiver_sp_offset(in_ByteSize(-1)),
|
||||||
_native_basic_lock_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,
|
// there are no activations on the stack, not in use by the VM,
|
||||||
// and not in use by the ServiceThread)
|
// and not in use by the ServiceThread)
|
||||||
bool nmethod::can_convert_to_zombie() {
|
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
|
// 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
|
// count can be greater than the stack traversal count before it hits the
|
||||||
// nmethod for the second time.
|
// nmethod for the second time.
|
||||||
return stack_traversal_mark()+1 < NMethodSweeper::traversal_count() &&
|
// If an is_unloading() nmethod is still not_entrant, then it is not safe to
|
||||||
!is_locked_by_vm();
|
// 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() {
|
void nmethod::inc_decompile_count() {
|
||||||
@ -1090,8 +1100,6 @@ void nmethod::make_unloaded() {
|
|||||||
// Unregister must be done before the state change
|
// Unregister must be done before the state change
|
||||||
Universe::heap()->unregister_nmethod(this);
|
Universe::heap()->unregister_nmethod(this);
|
||||||
|
|
||||||
_state = unloaded;
|
|
||||||
|
|
||||||
// Log the unloading.
|
// Log the unloading.
|
||||||
log_state_change();
|
log_state_change();
|
||||||
|
|
||||||
@ -1107,6 +1115,13 @@ void nmethod::make_unloaded() {
|
|||||||
|
|
||||||
set_osr_link(NULL);
|
set_osr_link(NULL);
|
||||||
NMethodSweeper::report_state_change(this);
|
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() {
|
void nmethod::invalidate_osr_method() {
|
||||||
@ -1505,6 +1520,74 @@ void nmethod::metadata_do(void f(Metadata*)) {
|
|||||||
if (_method != NULL) f(_method);
|
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
|
// This is called at the end of the strong tracing/marking phase of a
|
||||||
// GC to unload an nmethod if it contains otherwise unreachable
|
// 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
|
// Iterate over live nmethods and check dependencies of all nmethods that are not
|
||||||
// marked for deoptimization. A particular dependency is only checked once.
|
// marked for deoptimization. A particular dependency is only checked once.
|
||||||
NMethodIterator iter;
|
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||||
while(iter.next()) {
|
while(iter.next()) {
|
||||||
nmethod* nm = iter.method();
|
nmethod* nm = iter.method();
|
||||||
// Only notify for live nmethods
|
// 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(); ) {
|
for (Dependencies::DepStream deps(nm); deps.next(); ) {
|
||||||
// Construct abstraction of a dependency.
|
// Construct abstraction of a dependency.
|
||||||
DependencySignature* current_sig = new DependencySignature(deps);
|
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
|
// Update the values in the InstalledCode instance if it still refers to this nmethod
|
||||||
nmethod* nm = (nmethod*)InstalledCode::address(installed_code);
|
nmethod* nm = (nmethod*)InstalledCode::address(installed_code);
|
||||||
if (nm == this) {
|
if (nm == this) {
|
||||||
if (!is_alive()) {
|
if (!is_alive() || is_unloading()) {
|
||||||
// Break the link between nmethod and InstalledCode such that the nmethod
|
// Break the link between nmethod and InstalledCode such that the nmethod
|
||||||
// can subsequently be flushed safely. The link must be maintained while
|
// can subsequently be flushed safely. The link must be maintained while
|
||||||
// the method could have live activations since invalidateInstalledCode
|
// 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
|
// Clear these out after the nmethod has been unregistered and any
|
||||||
// updates to the InstalledCode instance have been performed.
|
// updates to the InstalledCode instance have been performed.
|
||||||
clear_jvmci_installed_code();
|
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);
|
MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
|
||||||
// This relationship can only be checked safely under a lock
|
// 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
|
#endif
|
||||||
|
|
||||||
|
@ -158,6 +158,9 @@ class nmethod : public CompiledMethod {
|
|||||||
// counter is decreased (by 1) while sweeping.
|
// counter is decreased (by 1) while sweeping.
|
||||||
int _hotness_counter;
|
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
|
// These are used for compiled synchronized native methods to
|
||||||
// locate the owner and stack slot for the BasicLock so that we can
|
// locate the owner and stack slot for the BasicLock so that we can
|
||||||
// properly revoke the bias of the owner if necessary. They are
|
// 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_zombie() const { return _state == zombie; }
|
||||||
bool is_unloaded() const { return _state == unloaded; }
|
bool is_unloaded() const { return _state == unloaded; }
|
||||||
|
|
||||||
|
void clear_unloading_state();
|
||||||
|
virtual bool is_unloading();
|
||||||
virtual void do_unloading(bool unloading_occurred);
|
virtual void do_unloading(bool unloading_occurred);
|
||||||
|
|
||||||
#if INCLUDE_RTM_OPT
|
#if INCLUDE_RTM_OPT
|
||||||
|
@ -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) {
|
if (success) {
|
||||||
task->mark_success();
|
task->mark_success();
|
||||||
if (ci_env != NULL) {
|
if (ci_env != NULL) {
|
||||||
@ -1958,6 +1959,13 @@ void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool
|
|||||||
_compilation_log->log_nmethod(thread, code);
|
_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
|
// simulate crash during compilation
|
||||||
assert(task->compile_id() != CICrashAt, "just as planned");
|
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;
|
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()) {
|
if (event.should_commit()) {
|
||||||
post_compilation_event(&event, task);
|
post_compilation_event(&event, task);
|
||||||
}
|
}
|
||||||
@ -2128,7 +2136,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
|||||||
ci_env.report_failure(failure_reason);
|
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()) {
|
if (event.should_commit()) {
|
||||||
post_compilation_event(&event, task);
|
post_compilation_event(&event, task);
|
||||||
}
|
}
|
||||||
|
@ -252,7 +252,8 @@ class CompileBroker: AllStatic {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void invoke_compiler_on_method(CompileTask* task);
|
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 set_last_compile(CompilerThread *thread, const methodHandle& method, bool is_osr, int comp_level);
|
||||||
static void push_jni_handle_block();
|
static void push_jni_handle_block();
|
||||||
static void pop_jni_handle_block();
|
static void pop_jni_handle_block();
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "gc/g1/heapRegion.hpp"
|
#include "gc/g1/heapRegion.hpp"
|
||||||
#include "opto/arraycopynode.hpp"
|
#include "opto/arraycopynode.hpp"
|
||||||
#include "opto/compile.hpp"
|
#include "opto/compile.hpp"
|
||||||
|
#include "opto/escape.hpp"
|
||||||
#include "opto/graphKit.hpp"
|
#include "opto/graphKit.hpp"
|
||||||
#include "opto/idealKit.hpp"
|
#include "opto/idealKit.hpp"
|
||||||
#include "opto/macro.hpp"
|
#include "opto/macro.hpp"
|
||||||
@ -840,3 +841,32 @@ void G1BarrierSetC2::verify_gc_barriers(Compile* compile, CompilePhase phase) co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#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;
|
||||||
|
}
|
||||||
|
@ -92,6 +92,8 @@ protected:
|
|||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
|
virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
|
||||||
#endif
|
#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
|
#endif // SHARE_GC_SHARED_C2_G1BARRIERSETC2_HPP
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "gc/g1/g1RemSet.hpp"
|
#include "gc/g1/g1RemSet.hpp"
|
||||||
#include "gc/g1/g1ThreadLocalData.hpp"
|
#include "gc/g1/g1ThreadLocalData.hpp"
|
||||||
#include "gc/g1/heapRegionRemSet.hpp"
|
#include "gc/g1/heapRegionRemSet.hpp"
|
||||||
|
#include "gc/shared/suspendibleThreadSet.hpp"
|
||||||
#include "gc/shared/workgroup.hpp"
|
#include "gc/shared/workgroup.hpp"
|
||||||
#include "runtime/atomic.hpp"
|
#include "runtime/atomic.hpp"
|
||||||
#include "runtime/mutexLocker.hpp"
|
#include "runtime/mutexLocker.hpp"
|
||||||
@ -146,18 +147,15 @@ uint DirtyCardQueueSet::num_par_ids() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DirtyCardQueueSet::initialize(Monitor* cbl_mon,
|
void DirtyCardQueueSet::initialize(Monitor* cbl_mon,
|
||||||
Mutex* fl_lock,
|
BufferNode::Allocator* allocator,
|
||||||
int process_completed_threshold,
|
int process_completed_threshold,
|
||||||
int max_completed_queue,
|
int max_completed_queue,
|
||||||
Mutex* lock,
|
Mutex* lock,
|
||||||
DirtyCardQueueSet* fl_owner,
|
|
||||||
bool init_free_ids) {
|
bool init_free_ids) {
|
||||||
PtrQueueSet::initialize(cbl_mon,
|
PtrQueueSet::initialize(cbl_mon,
|
||||||
fl_lock,
|
allocator,
|
||||||
process_completed_threshold,
|
process_completed_threshold,
|
||||||
max_completed_queue,
|
max_completed_queue);
|
||||||
fl_owner);
|
|
||||||
set_buffer_size(G1UpdateBufferSize);
|
|
||||||
_shared_dirty_card_queue.set_lock(lock);
|
_shared_dirty_card_queue.set_lock(lock);
|
||||||
if (init_free_ids) {
|
if (init_free_ids) {
|
||||||
_free_ids = new FreeIdSet(num_par_ids(), _cbl_mon);
|
_free_ids = new FreeIdSet(num_par_ids(), _cbl_mon);
|
||||||
|
@ -118,11 +118,10 @@ public:
|
|||||||
DirtyCardQueueSet(bool notify_when_complete = true);
|
DirtyCardQueueSet(bool notify_when_complete = true);
|
||||||
|
|
||||||
void initialize(Monitor* cbl_mon,
|
void initialize(Monitor* cbl_mon,
|
||||||
Mutex* fl_lock,
|
BufferNode::Allocator* allocator,
|
||||||
int process_completed_threshold,
|
int process_completed_threshold,
|
||||||
int max_completed_queue,
|
int max_completed_queue,
|
||||||
Mutex* lock,
|
Mutex* lock,
|
||||||
DirtyCardQueueSet* fl_owner,
|
|
||||||
bool init_free_ids = false);
|
bool init_free_ids = false);
|
||||||
|
|
||||||
// The number of parallel ids that can be claimed to allow collector or
|
// The number of parallel ids that can be claimed to allow collector or
|
||||||
|
@ -262,8 +262,9 @@ public:
|
|||||||
// Create the _archive_region_map which is used to identify archive objects.
|
// Create the _archive_region_map which is used to identify archive objects.
|
||||||
static inline void enable_archive_object_check();
|
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 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
|
// Check if the object is in closed archive
|
||||||
static inline bool is_closed_archive_object(oop object);
|
static inline bool is_closed_archive_object(oop object);
|
||||||
|
@ -109,6 +109,10 @@ inline void G1ArchiveAllocator::enable_archive_object_check() {
|
|||||||
// Set the regions containing the specified address range as archive.
|
// Set the regions containing the specified address range as archive.
|
||||||
inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
|
inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
|
||||||
assert(_archive_check_enabled, "archive range check not enabled");
|
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) {
|
if (open) {
|
||||||
_open_archive_region_map.set_by_address(range, true);
|
_open_archive_region_map.set_by_address(range, true);
|
||||||
} else {
|
} 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.
|
// Check if an object is in a closed archive region using the _archive_region_map.
|
||||||
inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
|
inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
|
||||||
// This is the out-of-line part of is_closed_archive_object test, done separately
|
// This is the out-of-line part of is_closed_archive_object test, done separately
|
||||||
|
@ -55,6 +55,8 @@ G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
|
|||||||
make_barrier_set_c2<G1BarrierSetC2>(),
|
make_barrier_set_c2<G1BarrierSetC2>(),
|
||||||
card_table,
|
card_table,
|
||||||
BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)),
|
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(),
|
_satb_mark_queue_set(),
|
||||||
_dirty_card_queue_set()
|
_dirty_card_queue_set()
|
||||||
{}
|
{}
|
||||||
@ -202,3 +204,11 @@ void G1BarrierSet::on_thread_detach(JavaThread* thread) {
|
|||||||
G1ThreadLocalData::satb_mark_queue(thread).flush();
|
G1ThreadLocalData::satb_mark_queue(thread).flush();
|
||||||
G1ThreadLocalData::dirty_card_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;
|
||||||
|
}
|
||||||
|
@ -39,6 +39,8 @@ class G1CardTable;
|
|||||||
class G1BarrierSet: public CardTableBarrierSet {
|
class G1BarrierSet: public CardTableBarrierSet {
|
||||||
friend class VMStructs;
|
friend class VMStructs;
|
||||||
private:
|
private:
|
||||||
|
BufferNode::Allocator _satb_mark_queue_buffer_allocator;
|
||||||
|
BufferNode::Allocator _dirty_card_queue_buffer_allocator;
|
||||||
G1SATBMarkQueueSet _satb_mark_queue_set;
|
G1SATBMarkQueueSet _satb_mark_queue_set;
|
||||||
DirtyCardQueueSet _dirty_card_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_attach(JavaThread* thread);
|
||||||
virtual void on_thread_detach(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() {
|
static G1SATBMarkQueueSet& satb_mark_queue_set() {
|
||||||
return g1_barrier_set()->_satb_mark_queue_set;
|
return g1_barrier_set()->_satb_mark_queue_set;
|
||||||
}
|
}
|
||||||
|
@ -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.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -76,7 +76,9 @@ G1CodeRootSetTable::~G1CodeRootSetTable() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(number_of_entries() == 0, "should have removed all entries");
|
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()) {
|
for (BasicHashtableEntry<mtGC>* e = new_entry_free_list(); e != NULL; e = new_entry_free_list()) {
|
||||||
FREE_C_HEAP_ARRAY(char, e);
|
FREE_C_HEAP_ARRAY(char, e);
|
||||||
}
|
}
|
||||||
|
@ -753,7 +753,7 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t min_word_size,
|
|||||||
return result;
|
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(!is_init_completed(), "Expect to be called at JVM init time");
|
||||||
assert(ranges != NULL, "MemRegion array NULL");
|
assert(ranges != NULL, "MemRegion array NULL");
|
||||||
assert(count != 0, "No MemRegions provided");
|
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.
|
// 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) {
|
if (uncommitted_regions != 0) {
|
||||||
@ -1653,6 +1653,28 @@ jint G1CollectedHeap::initialize() {
|
|||||||
BarrierSet::set_barrier_set(bs);
|
BarrierSet::set_barrier_set(bs);
|
||||||
_card_table = ct;
|
_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.
|
// Create the hot card cache.
|
||||||
_hot_card_cache = new G1HotCardCache(this);
|
_hot_card_cache = new G1HotCardCache(this);
|
||||||
|
|
||||||
@ -1749,13 +1771,6 @@ jint G1CollectedHeap::initialize() {
|
|||||||
// Perform any initialization actions delegated to the policy.
|
// Perform any initialization actions delegated to the policy.
|
||||||
g1_policy()->init(this, &_collection_set);
|
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();
|
jint ecode = initialize_concurrent_refinement();
|
||||||
if (ecode != JNI_OK) {
|
if (ecode != JNI_OK) {
|
||||||
return ecode;
|
return ecode;
|
||||||
@ -1766,20 +1781,11 @@ jint G1CollectedHeap::initialize() {
|
|||||||
return ecode;
|
return ecode;
|
||||||
}
|
}
|
||||||
|
|
||||||
G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
{
|
||||||
DirtyCardQ_FL_lock,
|
DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
|
||||||
(int)concurrent_refine()->yellow_zone(),
|
dcqs.set_process_completed_threshold((int)concurrent_refine()->yellow_zone());
|
||||||
(int)concurrent_refine()->red_zone(),
|
dcqs.set_max_completed_queue((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());
|
|
||||||
|
|
||||||
// Here we allocate the dummy HeapRegion that is required by the
|
// Here we allocate the dummy HeapRegion that is required by the
|
||||||
// G1AllocRegion class.
|
// G1AllocRegion class.
|
||||||
|
@ -683,7 +683,7 @@ public:
|
|||||||
// which had been allocated by alloc_archive_regions. This should be called
|
// 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
|
// rather than fill_archive_regions at JVM init time if the archive file
|
||||||
// mapping failed, with the same non-overlapping and sorted MemRegion array.
|
// 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);
|
oop materialize_archived_object(oop obj);
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user