Merge
This commit is contained in:
commit
01267bb7ca
2
.hgtags
2
.hgtags
@ -522,3 +522,5 @@ f8626bcc169813a4b2a15880386b952719d1d6d1 jdk-12+15
|
||||
eefa65e142af305923d2adcd596fab9c639723a1 jdk-12+17
|
||||
e38473506688e0995e701fc7f77d5a91b438ef93 jdk-12+18
|
||||
dc1f9dec2018a37fedba47d8a2aedef99faaec64 jdk-12+19
|
||||
40098289d5804c3b5e7074bc75501a81e70d9b0d jdk-12+20
|
||||
f8fb0c86f2b3d24294d39c5685a628e1beb14ba7 jdk-12+21
|
||||
|
@ -69,6 +69,7 @@
|
||||
</ul></li>
|
||||
<li><a href="#running-tests">Running Tests</a></li>
|
||||
<li><a href="#cross-compiling">Cross-compiling</a><ul>
|
||||
<li><a href="#cross-compiling-the-easy-way-with-openjdk-devkits">Cross compiling the easy way with OpenJDK devkits</a></li>
|
||||
<li><a href="#boot-jdk-and-build-jdk">Boot JDK and Build JDK</a></li>
|
||||
<li><a href="#specifying-the-target-platform">Specifying the Target Platform</a></li>
|
||||
<li><a href="#toolchain-considerations">Toolchain Considerations</a></li>
|
||||
@ -93,7 +94,7 @@
|
||||
<li><a href="#getting-help">Getting Help</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#hints-and-suggestions-for-advanced-users">Hints and Suggestions for Advanced Users</a><ul>
|
||||
<li><a href="#setting-up-a-forest-for-pushing-changes-defpath">Setting Up a Forest for Pushing Changes (defpath)</a></li>
|
||||
<li><a href="#setting-up-a-repository-for-pushing-changes-defpath">Setting Up a Repository for Pushing Changes (defpath)</a></li>
|
||||
<li><a href="#bash-completion">Bash Completion</a></li>
|
||||
<li><a href="#using-multiple-configurations">Using Multiple Configurations</a></li>
|
||||
<li><a href="#handling-reconfigurations">Handling Reconfigurations</a></li>
|
||||
@ -131,7 +132,7 @@
|
||||
<p>The JDK is a complex software project. Building it requires a certain amount of technical expertise, a fair number of dependencies on external software, and reasonably powerful hardware.</p>
|
||||
<p>If you just want to use the JDK and not build it yourself, this document is not for you. See for instance <a href="http://openjdk.java.net/install">OpenJDK installation</a> for some methods of installing a prebuilt JDK.</p>
|
||||
<h2 id="getting-the-source-code">Getting the Source Code</h2>
|
||||
<p>Make sure you are getting the correct version. As of JDK 10, the source is no longer split into separate repositories so you only need to clone one single repository. At the <a href="http://hg.openjdk.java.net/">OpenJDK Mercurial server</a> you can see a list of all available forests. If you want to build an older version, e.g. JDK 8, it is recommended that you get the <code>jdk8u</code> forest, which contains incremental updates, instead of the <code>jdk8</code> forest, which was frozen at JDK 8 GA.</p>
|
||||
<p>Make sure you are getting the correct version. As of JDK 10, the source is no longer split into separate repositories so you only need to clone one single repository. At the <a href="http://hg.openjdk.java.net/">OpenJDK Mercurial server</a> you can see a list of all available repositories. If you want to build an older version, e.g. JDK 8, it is recommended that you get the <code>jdk8u</code> forest, which contains incremental updates, instead of the <code>jdk8</code> forest, which was frozen at JDK 8 GA.</p>
|
||||
<p>If you are new to Mercurial, a good place to start is the <a href="http://www.mercurial-scm.org/guide">Mercurial Beginner's Guide</a>. The rest of this document assumes a working knowledge of Mercurial.</p>
|
||||
<h3 id="special-considerations">Special Considerations</h3>
|
||||
<p>For a smooth building experience, it is recommended that you follow these rules on where and how to check out the source code.</p>
|
||||
@ -570,6 +571,47 @@ CC: Sun C++ 5.13 SunOS_i386 151846-10 2015/10/30</code></pre>
|
||||
<p>This requires a more complex setup and build procedure. This section assumes you are familiar with cross-compiling in general, and will only deal with the particularities of cross-compiling the JDK. If you are new to cross-compiling, please see the <a href="https://en.wikipedia.org/wiki/Cross_compiler#External_links">external links at Wikipedia</a> for a good start on reading materials.</p>
|
||||
<p>Cross-compiling the JDK requires you to be able to build both for the build platform and for the target platform. The reason for the former is that we need to build and execute tools during the build process, both native tools and Java tools.</p>
|
||||
<p>If all you want to do is to compile a 32-bit version, for the same OS, on a 64-bit machine, consider using <code>--with-target-bits=32</code> instead of doing a full-blown cross-compilation. (While this surely is possible, it's a lot more work and will take much longer to build.)</p>
|
||||
<h3 id="cross-compiling-the-easy-way-with-openjdk-devkits">Cross compiling the easy way with OpenJDK devkits</h3>
|
||||
<p>The OpenJDK build system provides out-of-the box support for creating and using so called devkits. A <code>devkit</code> is basically a collection of a cross-compiling toolchain and a sysroot environment which can easily be used together with the <code>--with-devkit</code> configure option to cross compile the OpenJDK. On Linux/x86_64, the following command:</p>
|
||||
<pre><code>bash configure --with-devkit=<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>
|
||||
<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>
|
||||
@ -662,8 +704,8 @@ ls build/linux-aarch64-normal-server-release/</code></pre></li>
|
||||
<th style="text-align: left;">Target</th>
|
||||
<th style="text-align: left;"><code>CC</code></th>
|
||||
<th style="text-align: left;"><code>CXX</code></th>
|
||||
<th><code>--arch=...</code></th>
|
||||
<th><code>--openjdk-target=...</code></th>
|
||||
<th style="text-align: left;"><code>--arch=...</code></th>
|
||||
<th style="text-align: left;"><code>--openjdk-target=...</code></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@ -671,36 +713,36 @@ ls build/linux-aarch64-normal-server-release/</code></pre></li>
|
||||
<td style="text-align: left;">x86</td>
|
||||
<td style="text-align: left;">default</td>
|
||||
<td style="text-align: left;">default</td>
|
||||
<td>i386</td>
|
||||
<td>i386-linux-gnu</td>
|
||||
<td style="text-align: left;">i386</td>
|
||||
<td style="text-align: left;">i386-linux-gnu</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td style="text-align: left;">armhf</td>
|
||||
<td style="text-align: left;">gcc-arm-linux-gnueabihf</td>
|
||||
<td style="text-align: left;">g++-arm-linux-gnueabihf</td>
|
||||
<td>armhf</td>
|
||||
<td>arm-linux-gnueabihf</td>
|
||||
<td style="text-align: left;">armhf</td>
|
||||
<td style="text-align: left;">arm-linux-gnueabihf</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td style="text-align: left;">aarch64</td>
|
||||
<td style="text-align: left;">gcc-aarch64-linux-gnu</td>
|
||||
<td style="text-align: left;">g++-aarch64-linux-gnu</td>
|
||||
<td>arm64</td>
|
||||
<td>aarch64-linux-gnu</td>
|
||||
<td style="text-align: left;">arm64</td>
|
||||
<td style="text-align: left;">aarch64-linux-gnu</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td style="text-align: left;">ppc64el</td>
|
||||
<td style="text-align: left;">gcc-powerpc64le-linux-gnu</td>
|
||||
<td style="text-align: left;">g++-powerpc64le-linux-gnu</td>
|
||||
<td>ppc64el</td>
|
||||
<td>powerpc64le-linux-gnu</td>
|
||||
<td style="text-align: left;">ppc64el</td>
|
||||
<td style="text-align: left;">powerpc64le-linux-gnu</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td style="text-align: left;">s390x</td>
|
||||
<td style="text-align: left;">gcc-s390x-linux-gnu</td>
|
||||
<td style="text-align: left;">g++-s390x-linux-gnu</td>
|
||||
<td>s390x</td>
|
||||
<td>s390x-linux-gnu</td>
|
||||
<td style="text-align: left;">s390x</td>
|
||||
<td style="text-align: left;">s390x-linux-gnu</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@ -780,11 +822,11 @@ Hint: If caused by a warning, try configure --disable-warnings-as-errors.</code>
|
||||
<p>Verify that the summary at the end looks correct. Are you indeed using the Boot JDK and native toolchain that you expect?</p>
|
||||
<p>By default, the JDK has a strict approach where warnings from the compiler is considered errors which fail the build. For very new or very old compiler versions, this can trigger new classes of warnings, which thus fails the build. Run <code>configure</code> with <code>--disable-warnings-as-errors</code> to turn of this behavior. (The warnings will still show, but not make the build fail.)</p>
|
||||
<h4 id="problems-with-incremental-rebuilds">Problems with Incremental Rebuilds</h4>
|
||||
<p>Incremental rebuilds mean that when you modify part of the product, only the affected parts get rebuilt. While this works great in most cases, and significantly speed up the development process, from time to time complex interdependencies will result in an incorrect build result. This is the most common cause for unexpected build problems, together with inconsistencies between the different Mercurial repositories in the forest.</p>
|
||||
<p>Incremental rebuilds mean that when you modify part of the product, only the affected parts get rebuilt. While this works great in most cases, and significantly speed up the development process, from time to time complex interdependencies will result in an incorrect build result. This is the most common cause for unexpected build problems.</p>
|
||||
<p>Here are a suggested list of things to try if you are having unexpected build problems. Each step requires more time than the one before, so try them in order. Most issues will be solved at step 1 or 2.</p>
|
||||
<ol type="1">
|
||||
<li><p>Make sure your forest is up-to-date</p>
|
||||
<p>Run <code>bash get_source.sh</code> to make sure you have the latest version of all repositories.</p></li>
|
||||
<li><p>Make sure your repository is up-to-date</p>
|
||||
<p>Run <code>hg pull -u</code> to make sure you have the latest changes.</p></li>
|
||||
<li><p>Clean build results</p>
|
||||
<p>The simplest way to fix incremental rebuild issues is to run <code>make clean</code>. This will remove all build results, but not the configuration or any build system support artifacts. In most cases, this will solve build errors resulting from incremental build mismatches.</p></li>
|
||||
<li><p>Completely clean the build directory.</p>
|
||||
@ -793,8 +835,8 @@ Hint: If caused by a warning, try configure --disable-warnings-as-errors.</code>
|
||||
make dist-clean
|
||||
bash configure $(cat current-configuration)
|
||||
make</code></pre></li>
|
||||
<li><p>Re-clone the Mercurial forest</p>
|
||||
<p>Sometimes the Mercurial repositories themselves gets in a state that causes the product to be un-buildable. In such a case, the simplest solution is often the "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>
|
||||
<li><p>Re-clone the Mercurial repository</p>
|
||||
<p>Sometimes the Mercurial repository gets in a state that causes the product to be un-buildable. In such a case, the simplest solution is often the "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>
|
||||
<h3 id="specific-build-issues">Specific Build Issues</h3>
|
||||
<h4 id="clock-skew">Clock Skew</h4>
|
||||
@ -813,10 +855,15 @@ cannot create ... Permission denied
|
||||
spawn failed</code></pre>
|
||||
<p>This can be a sign of a Cygwin problem. See the information about solving problems in the <a href="#cygwin">Cygwin</a> section. Rebooting the computer might help temporarily.</p>
|
||||
<h3 id="getting-help">Getting Help</h3>
|
||||
<p>If none of the suggestions in this document helps you, or if you find what you believe is a bug in the build system, please contact the Build Group by sending a mail to <a href="mailto:build-dev@openjdk.java.net">build-dev@openjdk.java.net</a>. Please include the relevant parts of the configure and/or build log.</p>
|
||||
<p>If none of the suggestions in this document helps you, or if you find what you believe is a bug in the build system, please contact the Build Group by sending a mail to <script type="text/javascript">
|
||||
<!--
|
||||
h='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>
|
||||
<h2 id="hints-and-suggestions-for-advanced-users">Hints and Suggestions for Advanced Users</h2>
|
||||
<h3 id="setting-up-a-forest-for-pushing-changes-defpath">Setting Up a Forest for Pushing Changes (defpath)</h3>
|
||||
<h3 id="setting-up-a-repository-for-pushing-changes-defpath">Setting Up a Repository for Pushing Changes (defpath)</h3>
|
||||
<p>To help you prepare a proper push path for a Mercurial repository, there exists a useful tool known as <a href="http://openjdk.java.net/projects/code-tools/defpath">defpath</a>. It will help you setup a proper push path for pushing changes to the JDK.</p>
|
||||
<p>Install the extension by cloning <code>http://hg.openjdk.java.net/code-tools/defpath</code> and updating your <code>.hgrc</code> file. Here's one way to do this:</p>
|
||||
<pre><code>cd ~
|
||||
@ -829,7 +876,6 @@ defpath=~/hg-ext/defpath/defpath.py
|
||||
EOT</code></pre>
|
||||
<p>You can now setup a proper push path using:</p>
|
||||
<pre><code>hg defpath -d -u <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>
|
||||
<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>
|
||||
@ -847,10 +893,10 @@ chmod +x /tmp/configure
|
||||
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>
|
||||
<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>
|
||||
<h3 id="handling-reconfigurations">Handling Reconfigurations</h3>
|
||||
<p>If you update the forest and part of the configure script has changed, the build system will force you to re-run <code>configure</code>.</p>
|
||||
<p>If you update the repository and part of the configure script has changed, the build system will force you to re-run <code>configure</code>.</p>
|
||||
<p>Most of the time, you will be fine by running <code>configure</code> again with the same arguments as the last time, which can easily be performed by <code>make reconfigure</code>. To simplify this, you can use the <code>CONF_CHECK</code> make control variable, either as <code>make CONF_CHECK=auto</code>, or by setting an environment variable. For instance, if you add <code>export CONF_CHECK=auto</code> to your <code>.bashrc</code> file, <code>make</code> will always run <code>reconfigure</code> automatically whenever the configure script has changed.</p>
|
||||
<p>You can also use <code>CONF_CHECK=ignore</code> to skip the check for a needed configure update. This might speed up the build, but comes at the risk of an incorrect build result. This is only recommended if you know what you're doing.</p>
|
||||
<p>From time to time, you will also need to modify the command line to <code>configure</code> due to changes. Use <code>make print-configure</code> to show the command line used for your current configuration.</p>
|
||||
|
@ -48,7 +48,7 @@ JDK.
|
||||
Make sure you are getting the correct version. As of JDK 10, the source is no
|
||||
longer split into separate repositories so you only need to clone one single
|
||||
repository. At the [OpenJDK Mercurial server](http://hg.openjdk.java.net/) you
|
||||
can see a list of all available forests. If you want to build an older version,
|
||||
can see a list of all available repositories. If you want to build an older version,
|
||||
e.g. JDK 8, it is recommended that you get the `jdk8u` forest, which contains
|
||||
incremental updates, instead of the `jdk8` forest, which was frozen at JDK 8 GA.
|
||||
|
||||
@ -884,6 +884,64 @@ If all you want to do is to compile a 32-bit version, for the same OS, on a
|
||||
full-blown cross-compilation. (While this surely is possible, it's a lot more
|
||||
work and will take much longer to build.)
|
||||
|
||||
### Cross compiling the easy way with OpenJDK devkits
|
||||
|
||||
The OpenJDK build system provides out-of-the box support for creating and using
|
||||
so called devkits. A `devkit` is basically a collection of a cross-compiling
|
||||
toolchain and a sysroot environment which can easily be used together with the
|
||||
`--with-devkit` configure option to cross compile the OpenJDK. On Linux/x86_64,
|
||||
the following command:
|
||||
```
|
||||
bash configure --with-devkit=<devkit-path> --openjdk-target=ppc64-linux-gnu && make
|
||||
```
|
||||
|
||||
will configure and build OpenJDK for Linux/ppc64 assuming that `<devkit-path>`
|
||||
points to a Linux/x86_64 to Linux/ppc64 devkit.
|
||||
|
||||
Devkits can be created from the `make/devkit` directory by executing:
|
||||
```
|
||||
make [ TARGETS="<TARGET_TRIPLET>+" ] [ BASE_OS=<OS> ] [ BASE_OS_VERSION=<VER> ]
|
||||
```
|
||||
|
||||
where `TARGETS` contains one or more `TARGET_TRIPLET`s of the form
|
||||
described in [section 3.4 of the GNU Autobook](
|
||||
https://sourceware.org/autobook/autobook/autobook_17.html). If no
|
||||
targets are given, a native toolchain for the current platform will be
|
||||
created. Currently, at least the following targets are known to work:
|
||||
|
||||
Supported devkit targets
|
||||
------------------------
|
||||
x86_64-linux-gnu
|
||||
aarch64-linux-gnu
|
||||
arm-linux-gnueabihf
|
||||
ppc64-linux-gnu
|
||||
ppc64le-linux-gnu
|
||||
s390x-linux-gnu
|
||||
|
||||
`BASE_OS` must be one of "OEL6" for Oracle Enterprise Linux 6 or
|
||||
"Fedora" (if not specified "OEL6" will be the default). If the base OS
|
||||
is "Fedora" the corresponding Fedora release can be specified with the
|
||||
help of the `BASE_OS_VERSION` option (with "27" as default version).
|
||||
If the build is successful, the new devkits can be found in the
|
||||
`build/devkit/result` subdirectory:
|
||||
```
|
||||
cd make/devkit
|
||||
make TARGETS="ppc64le-linux-gnu aarch64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=21
|
||||
ls -1 ../../build/devkit/result/
|
||||
x86_64-linux-gnu-to-aarch64-linux-gnu
|
||||
x86_64-linux-gnu-to-ppc64le-linux-gnu
|
||||
```
|
||||
|
||||
Notice that devkits are not only useful for targeting different build
|
||||
platforms. Because they contain the full build dependencies for a
|
||||
system (i.e. compiler and root file system), they can easily be used
|
||||
to build well-known, reliable and reproducible build environments. You
|
||||
can for example create and use a devkit with GCC 7.3 and a Fedora 12
|
||||
sysroot environment (with glibc 2.11) on Ubuntu 14.04 (which doesn't
|
||||
have GCC 7.3 by default) to produce OpenJDK binaries which will run on
|
||||
all Linux systems with runtime libraries newer than the ones from
|
||||
Fedora 12 (e.g. Ubuntu 16.04, SLES 11 or RHEL 6).
|
||||
|
||||
### Boot JDK and Build JDK
|
||||
|
||||
When cross-compiling, make sure you use a boot JDK that runs on the *build*
|
||||
@ -1301,17 +1359,15 @@ Incremental rebuilds mean that when you modify part of the product, only the
|
||||
affected parts get rebuilt. While this works great in most cases, and
|
||||
significantly speed up the development process, from time to time complex
|
||||
interdependencies will result in an incorrect build result. This is the most
|
||||
common cause for unexpected build problems, together with inconsistencies
|
||||
between the different Mercurial repositories in the forest.
|
||||
common cause for unexpected build problems.
|
||||
|
||||
Here are a suggested list of things to try if you are having unexpected build
|
||||
problems. Each step requires more time than the one before, so try them in
|
||||
order. Most issues will be solved at step 1 or 2.
|
||||
|
||||
1. Make sure your forest is up-to-date
|
||||
1. Make sure your repository is up-to-date
|
||||
|
||||
Run `bash get_source.sh` to make sure you have the latest version of all
|
||||
repositories.
|
||||
Run `hg pull -u` to make sure you have the latest changes.
|
||||
|
||||
2. Clean build results
|
||||
|
||||
@ -1336,13 +1392,13 @@ order. Most issues will be solved at step 1 or 2.
|
||||
make
|
||||
```
|
||||
|
||||
4. Re-clone the Mercurial forest
|
||||
4. Re-clone the Mercurial repository
|
||||
|
||||
Sometimes the Mercurial repositories themselves gets in a state that causes
|
||||
the product to be un-buildable. In such a case, the simplest solution is
|
||||
often the "sledgehammer approach": delete the entire forest, and re-clone
|
||||
it. If you have local changes, save them first to a different location
|
||||
using `hg export`.
|
||||
Sometimes the Mercurial repository gets in a state that causes the product
|
||||
to be un-buildable. In such a case, the simplest solution is often the
|
||||
"sledgehammer approach": delete the entire repository, and re-clone it.
|
||||
If you have local changes, save them first to a different location using
|
||||
`hg export`.
|
||||
|
||||
### Specific Build Issues
|
||||
|
||||
@ -1393,7 +1449,7 @@ contact the Adoption Group. See the section on [Contributing to OpenJDK](
|
||||
|
||||
## Hints and Suggestions for Advanced Users
|
||||
|
||||
### Setting Up a Forest for Pushing Changes (defpath)
|
||||
### Setting Up a Repository for Pushing Changes (defpath)
|
||||
|
||||
To help you prepare a proper push path for a Mercurial repository, there exists
|
||||
a useful tool known as [defpath](
|
||||
@ -1420,11 +1476,6 @@ You can now setup a proper push path using:
|
||||
hg defpath -d -u <your OpenJDK username>
|
||||
```
|
||||
|
||||
If you also have the `trees` extension installed in Mercurial, you will
|
||||
automatically get a `tdefpath` command, which is even more useful. By running
|
||||
`hg tdefpath -du <username>` in the top repository of your forest, all repos
|
||||
will get setup automatically. This is the recommended usage.
|
||||
|
||||
### Bash Completion
|
||||
|
||||
The `configure` and `make` commands tries to play nice with bash command-line
|
||||
@ -1459,7 +1510,7 @@ Now `configure --en<tab>-dt<tab>` will result in `configure --enable-dtrace`.
|
||||
|
||||
### Using Multiple Configurations
|
||||
|
||||
You can have multiple configurations for a single source forest. When you
|
||||
You can have multiple configurations for a single source repository. When you
|
||||
create a new configuration, run `configure --with-conf-name=<name>` to create a
|
||||
configuration with the name `<name>`. Alternatively, you can create a directory
|
||||
under `build` and run `configure` from there, e.g. `mkdir build/<name> && cd
|
||||
@ -1474,7 +1525,7 @@ in the configuration directory, e.g. `cd build/<name> && make`.
|
||||
|
||||
### Handling Reconfigurations
|
||||
|
||||
If you update the forest and part of the configure script has changed, the
|
||||
If you update the repository and part of the configure script has changed, the
|
||||
build system will force you to re-run `configure`.
|
||||
|
||||
Most of the time, you will be fine by running `configure` again with the same
|
||||
|
@ -24,12 +24,14 @@
|
||||
<li><a href="#test-selection">Test selection</a><ul>
|
||||
<li><a href="#jtreg">JTReg</a></li>
|
||||
<li><a href="#gtest">Gtest</a></li>
|
||||
<li><a href="#microbenchmarks">Microbenchmarks</a></li>
|
||||
<li><a href="#special-tests">Special tests</a></li>
|
||||
</ul></li>
|
||||
<li><a href="#test-results-and-summary">Test results and summary</a></li>
|
||||
<li><a href="#test-suite-control">Test suite control</a><ul>
|
||||
<li><a href="#jtreg-keywords">JTReg keywords</a></li>
|
||||
<li><a href="#gtest-keywords">Gtest keywords</a></li>
|
||||
<li><a href="#microbenchmark-keywords">Microbenchmark keywords</a></li>
|
||||
</ul></li>
|
||||
</ul>
|
||||
</nav>
|
||||
@ -44,9 +46,11 @@ $ make test TEST=jdk_lang
|
||||
$ make test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
|
||||
$ make test TEST="hotspot:hotspot_gc" JTREG="JOBS=1;TIMEOUT=8;VM_OPTIONS=-XshowSettings -Xlog:gc+ref=debug"
|
||||
$ make test TEST="jtreg:test/hotspot:hotspot_gc test/hotspot/jtreg/native_sanity/JniVersion.java"
|
||||
$ make test TEST="micro:java.lang.reflect" MICRO="FORK=1;WARMUP_ITER=2"
|
||||
$ make exploded-test TEST=tier2</code></pre>
|
||||
<h3 id="configuration">Configuration</h3>
|
||||
<p>To be able to run JTReg tests, <code>configure</code> needs to know where to find the JTReg test framework. If it is not picked up automatically by configure, use the <code>--with-jtreg=<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>
|
||||
<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>
|
||||
@ -61,6 +65,9 @@ $ make exploded-test TEST=tier2</code></pre>
|
||||
<p>Since the Hotspot Gtest suite is so quick, the default is to run all tests. This is specified by just <code>gtest</code>, or as a fully qualified test descriptor <code>gtest:all</code>.</p>
|
||||
<p>If you want, you can single out an individual test or a group of tests, for instance <code>gtest:LogDecorations</code> or <code>gtest:LogDecorations.level_test_vm</code>. This can be particularly useful if you want to run a shaky test repeatedly.</p>
|
||||
<p>For Gtest, there is a separate test suite for each JVM variant. The JVM variant is defined by adding <code>/<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>
|
||||
<p>A handful of odd tests that are not covered by any other testing framework are accessible using the <code>special:</code> test descriptor. Currently, this includes <code>failure-handler</code> and <code>make</code>.</p>
|
||||
<ul>
|
||||
@ -127,5 +134,22 @@ TEST FAILURE</code></pre>
|
||||
<h4 id="options-1">OPTIONS</h4>
|
||||
<p>Additional options to the Gtest test framework.</p>
|
||||
<p>Use <code>GTEST="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>
|
||||
</html>
|
||||
|
@ -26,6 +26,7 @@ Some example command-lines:
|
||||
$ make test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
|
||||
$ make test TEST="hotspot:hotspot_gc" JTREG="JOBS=1;TIMEOUT=8;VM_OPTIONS=-XshowSettings -Xlog:gc+ref=debug"
|
||||
$ make test TEST="jtreg:test/hotspot:hotspot_gc test/hotspot/jtreg/native_sanity/JniVersion.java"
|
||||
$ make test TEST="micro:java.lang.reflect" MICRO="FORK=1;WARMUP_ITER=2"
|
||||
$ make exploded-test TEST=tier2
|
||||
|
||||
### Configuration
|
||||
@ -37,6 +38,12 @@ Note that this option should point to the JTReg home, i.e. the top directory,
|
||||
containing `lib/jtreg.jar` etc. (An alternative is to set the `JT_HOME`
|
||||
environment variable to point to the JTReg home before running `configure`.)
|
||||
|
||||
To be able to run microbenchmarks, `configure` needs to know where to find
|
||||
the JMH dependency. Use `--with-jmh=<path to JMH jars>` to point to a directory
|
||||
containing the core JMH and transitive dependencies. The recommended dependencies
|
||||
can be retrieved by running `sh make/devkit/createJMHBundle.sh`, after which
|
||||
`--with-jmh=build/jmh/jars` should work.
|
||||
|
||||
## Test selection
|
||||
|
||||
All functionality is available using the `test` make target. In this use case,
|
||||
@ -104,6 +111,16 @@ is defined by adding `/<variant>` to the test descriptor, e.g.
|
||||
variant present (e.g. server, client). So if you only have the server JVM
|
||||
present, then `gtest:all` will be equivalent to `gtest:all/server`.
|
||||
|
||||
### Microbenchmarks
|
||||
|
||||
Which microbenchmarks to run is selected using a regular expression
|
||||
following the `micro:` test descriptor, e.g., `micro:java.lang.reflect`. This
|
||||
delegates the test selection to JMH, meaning package name, class name and even
|
||||
benchmark method names can be used to select tests.
|
||||
|
||||
Using special characters like `|` in the regular expression is possible, but
|
||||
needs to be escaped multiple times: `micro:ArrayCopy\\\\\|reflect`.
|
||||
|
||||
### Special tests
|
||||
|
||||
A handful of odd tests that are not covered by any other testing framework are
|
||||
@ -253,6 +270,35 @@ Additional options to the Gtest test framework.
|
||||
|
||||
Use `GTEST="OPTIONS=--help"` to see all available Gtest options.
|
||||
|
||||
### Microbenchmark keywords
|
||||
|
||||
#### FORK
|
||||
Override the number of benchmark forks to spawn. Same as specifying `-f <num>`.
|
||||
|
||||
#### ITER
|
||||
Number of measurement iterations per fork. Same as specifying `-i <num>`.
|
||||
|
||||
#### TIME
|
||||
Amount of time to spend in each measurement iteration, in seconds. Same as
|
||||
specifying `-r <num>`
|
||||
|
||||
#### WARMUP_ITER
|
||||
Number of warmup iterations to run before the measurement phase in each fork.
|
||||
Same as specifying `-wi <num>`.
|
||||
|
||||
#### WARMUP_TIME
|
||||
Amount of time to spend in each warmup iteration. Same as specifying `-w <num>`.
|
||||
|
||||
#### RESULTS_FORMAT
|
||||
Specify to have the test run save a log of the values. Accepts the same values
|
||||
as `-rff`, i.e., `text`, `csv`, `scsv`, `json`, or `latex`.
|
||||
|
||||
#### VM_OPTIONS
|
||||
Additional VM arguments to provide to forked off VMs. Same as `-jvmArgs <args>`
|
||||
|
||||
#### OPTIONS
|
||||
Additional arguments to send to JMH.
|
||||
|
||||
---
|
||||
# Override some definitions in the global css file that are not optimal for
|
||||
# this document.
|
||||
|
@ -450,21 +450,17 @@ jdk.internal.vm.compiler_ADD_JAVAC_FLAGS += -parameters -XDstringConcat=inline \
|
||||
|
||||
jdk.internal.vm.compiler_EXCLUDES += \
|
||||
jdk.internal.vm.compiler.collections.test \
|
||||
org.graalvm.compiler.processor \
|
||||
org.graalvm.compiler.core.match.processor \
|
||||
org.graalvm.compiler.nodeinfo.processor \
|
||||
org.graalvm.compiler.options.processor \
|
||||
org.graalvm.compiler.serviceprovider.processor \
|
||||
org.graalvm.compiler.replacements.processor \
|
||||
org.graalvm.compiler.replacements.jdk9.test \
|
||||
jdk.tools.jaotc.test \
|
||||
org.graalvm.compiler.api.directives.test \
|
||||
org.graalvm.compiler.api.test \
|
||||
org.graalvm.compiler.asm.aarch64.test \
|
||||
org.graalvm.compiler.asm.amd64.test \
|
||||
org.graalvm.compiler.asm.sparc.test \
|
||||
org.graalvm.compiler.asm.test \
|
||||
org.graalvm.compiler.core.aarch64.test \
|
||||
org.graalvm.compiler.core.amd64.test \
|
||||
org.graalvm.compiler.core.sparc.test \
|
||||
org.graalvm.compiler.core.jdk9.test \
|
||||
org.graalvm.compiler.core.match.processor \
|
||||
org.graalvm.compiler.core.test \
|
||||
org.graalvm.compiler.debug.test \
|
||||
org.graalvm.compiler.graph.test \
|
||||
@ -477,10 +473,18 @@ jdk.internal.vm.compiler_EXCLUDES += \
|
||||
org.graalvm.compiler.lir.test \
|
||||
org.graalvm.compiler.loop.test \
|
||||
org.graalvm.compiler.microbenchmarks \
|
||||
org.graalvm.compiler.nodeinfo.processor \
|
||||
org.graalvm.compiler.nodes.test \
|
||||
org.graalvm.compiler.options.processor \
|
||||
org.graalvm.compiler.options.test \
|
||||
org.graalvm.compiler.phases.common.test \
|
||||
org.graalvm.compiler.processor \
|
||||
org.graalvm.compiler.replacements.jdk12.test \
|
||||
org.graalvm.compiler.replacements.jdk9.test \
|
||||
org.graalvm.compiler.replacements.jdk9_11.test \
|
||||
org.graalvm.compiler.replacements.processor \
|
||||
org.graalvm.compiler.replacements.test \
|
||||
org.graalvm.compiler.serviceprovider.processor \
|
||||
org.graalvm.compiler.test \
|
||||
org.graalvm.compiler.virtual.bench \
|
||||
org.graalvm.micro.benchmarks \
|
||||
|
@ -103,6 +103,7 @@ help:
|
||||
$(info $(_) # make test TEST="jdk_lang gtest:all")
|
||||
$(info $(_) JTREG="OPT1=x;OPT2=y" # Control the JTREG test harness)
|
||||
$(info $(_) GTEST="OPT1=x;OPT2=y" # Control the GTEST test harness)
|
||||
$(info $(_) MICRO="OPT1=x;OPT2=y" # Control the MICRO test harness)
|
||||
$(info $(_) TEST_OPTS="OPT1=x;..." # Generic control of all test harnesses)
|
||||
$(info $(_) TEST_VM_OPTS="ARG ..." # Same as setting TEST_OPTS to VM_OPTIONS="ARG ...")
|
||||
$(info )
|
||||
|
@ -50,7 +50,7 @@ ifeq ($(HAS_SPEC),)
|
||||
|
||||
# Make control variables, handled by Init.gmk
|
||||
INIT_CONTROL_VARIABLES += LOG CONF CONF_NAME SPEC JOBS TEST_JOBS CONF_CHECK \
|
||||
COMPARE_BUILD JTREG GTEST TEST_OPTS TEST_VM_OPTS
|
||||
COMPARE_BUILD JTREG GTEST MICRO TEST_OPTS TEST_VM_OPTS
|
||||
|
||||
# All known make control variables
|
||||
MAKE_CONTROL_VARIABLES := $(INIT_CONTROL_VARIABLES) TEST JDK_FILTER
|
||||
@ -264,9 +264,13 @@ ifeq ($(HAS_SPEC),)
|
||||
endif
|
||||
endif
|
||||
|
||||
# The --no-print-directory is needed to make the call from
|
||||
# FindTest.gmk to Test.gmk work with LOG=debug/trace. See
|
||||
# JDK-8213736
|
||||
$$(main_targets_file):
|
||||
@( cd $$(topdir) && \
|
||||
$$(MAKE) $$(MAKE_LOG_FLAGS) -r -R -f $$(topdir)/make/Main.gmk \
|
||||
$$(MAKE) $$(MAKE_LOG_FLAGS) -r -R --no-print-directory \
|
||||
-f $$(topdir)/make/Main.gmk \
|
||||
-I $$(topdir)/make/common SPEC=$(strip $2) NO_RECIPES=true \
|
||||
$$(MAKE_LOG_VARS) \
|
||||
create-main-targets-include )
|
||||
|
@ -493,7 +493,7 @@ ALL_EXPLODED_TEST_TARGETS := $(addprefix exploded-test-, $(ALL_EXPLODED_TESTS))
|
||||
ALL_TARGETS += $(ALL_TEST_TARGETS) $(ALL_EXPLODED_TEST_TARGETS)
|
||||
|
||||
################################################################################
|
||||
# Build tests
|
||||
# Build tests and microbenchmarks
|
||||
#
|
||||
|
||||
prepare-test-image:
|
||||
@ -543,11 +543,15 @@ ifeq ($(BUILD_FAILURE_HANDLER), true)
|
||||
-f BuildFailureHandler.gmk images)
|
||||
endif
|
||||
|
||||
build-microbenchmark:
|
||||
+($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f test/BuildMicrobenchmark.gmk)
|
||||
|
||||
ALL_TARGETS += prepare-test-image build-test-hotspot-jtreg-native \
|
||||
test-image-hotspot-jtreg-native build-test-jdk-jtreg-native \
|
||||
test-image-jdk-jtreg-native build-test-lib build-test-failure-handler \
|
||||
test-failure-handler test-image-failure-handler test-image-hotspot-gtest \
|
||||
test-image-hotspot-jtreg-graal build-test-hotspot-jtreg-graal
|
||||
test-image-hotspot-jtreg-graal build-test-hotspot-jtreg-graal \
|
||||
build-microbenchmark
|
||||
|
||||
################################################################################
|
||||
# Run tests
|
||||
@ -789,6 +793,8 @@ else
|
||||
|
||||
jrtfs-jar: interim-langtools
|
||||
|
||||
build-microbenchmark: interim-langtools exploded-image
|
||||
|
||||
ifeq ($(ENABLE_GENERATE_CLASSLIST), true)
|
||||
ifeq ($(CREATE_BUILDJDK), true)
|
||||
# If creating a buildjdk, the interim image needs to be based on that.
|
||||
@ -1023,6 +1029,10 @@ test-image: prepare-test-image \
|
||||
test-image-jdk-jtreg-native test-image-failure-handler \
|
||||
test-image-demos-jdk $(JVM_TEST_IMAGE_TARGETS)
|
||||
|
||||
ifneq ($(JMH_CORE_JAR), )
|
||||
test-image: build-microbenchmark
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
|
||||
# all-images builds all our deliverables as images.
|
||||
|
@ -203,11 +203,23 @@ TEST_JOBS_FACTOR_JDL ?= 1
|
||||
TEST_JOBS_FACTOR_MACHINE ?= 1
|
||||
|
||||
ifeq ($(TEST_JOBS), 0)
|
||||
# Concurrency based on min(cores / 2, 12) * TEST_JOBS_FACTOR
|
||||
CORES_DIVIDER := 2
|
||||
ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
|
||||
# For smaller SPARC machines we see reasonable scaling of throughput up to
|
||||
# cpus/4 without affecting test reliability. On the bigger machines, cpus/4
|
||||
# causes intermittent timeouts.
|
||||
ifeq ($(shell $(EXPR) $(NUM_CORES) \> 16), 1)
|
||||
CORES_DIVIDER := 5
|
||||
else
|
||||
CORES_DIVIDER := 4
|
||||
endif
|
||||
endif
|
||||
MEMORY_DIVIDER := 2048
|
||||
TEST_JOBS := $(shell $(AWK) \
|
||||
'BEGIN { \
|
||||
c = $(NUM_CORES) / 2; \
|
||||
if (c > 12) c = 12; \
|
||||
c = $(NUM_CORES) / $(CORES_DIVIDER); \
|
||||
m = $(MEMORY_SIZE) / $(MEMORY_DIVIDER); \
|
||||
if (c > m) c = m; \
|
||||
c = c * $(TEST_JOBS_FACTOR); \
|
||||
c = c * $(TEST_JOBS_FACTOR_JDL); \
|
||||
c = c * $(TEST_JOBS_FACTOR_MACHINE); \
|
||||
@ -225,13 +237,11 @@ ifneq ($(TEST_OPTS), )
|
||||
$(info Running tests using TEST_OPTS control variable '$(TEST_OPTS)')
|
||||
endif
|
||||
|
||||
### Jtreg
|
||||
|
||||
$(eval $(call SetTestOpt,VM_OPTIONS,JTREG))
|
||||
$(eval $(call SetTestOpt,JAVA_OPTIONS,JTREG))
|
||||
$(eval $(call SetTestOpt,VM_OPTIONS,GTEST))
|
||||
$(eval $(call SetTestOpt,JAVA_OPTIONS,GTEST))
|
||||
|
||||
$(eval $(call SetTestOpt,AOT_MODULES,JTREG))
|
||||
$(eval $(call SetTestOpt,AOT_MODULES,GTEST))
|
||||
|
||||
$(eval $(call SetTestOpt,JOBS,JTREG))
|
||||
$(eval $(call SetTestOpt,TIMEOUT_FACTOR,JTREG))
|
||||
@ -247,6 +257,12 @@ ifneq ($(JTREG), )
|
||||
$(info Running tests using JTREG control variable '$(JTREG)')
|
||||
endif
|
||||
|
||||
### Gtest
|
||||
|
||||
$(eval $(call SetTestOpt,VM_OPTIONS,GTEST))
|
||||
$(eval $(call SetTestOpt,JAVA_OPTIONS,GTEST))
|
||||
$(eval $(call SetTestOpt,AOT_MODULES,GTEST))
|
||||
|
||||
$(eval $(call ParseKeywordVariable, GTEST, \
|
||||
SINGLE_KEYWORDS := REPEAT AOT_MODULES, \
|
||||
STRING_KEYWORDS := OPTIONS VM_OPTIONS JAVA_OPTIONS, \
|
||||
@ -257,6 +273,21 @@ ifneq ($(GTEST), )
|
||||
$(info Running tests using GTEST control variable '$(GTEST)')
|
||||
endif
|
||||
|
||||
### Microbenchmarks
|
||||
|
||||
$(eval $(call SetTestOpt,VM_OPTIONS,MICRO))
|
||||
$(eval $(call SetTestOpt,JAVA_OPTIONS,MICRO))
|
||||
|
||||
$(eval $(call ParseKeywordVariable, MICRO, \
|
||||
SINGLE_KEYWORDS := ITER FORK TIME WARMUP_ITER WARMUP_TIME, \
|
||||
STRING_KEYWORDS := OPTIONS JAVA_OPTIONS VM_OPTIONS RESULTS_FORMAT TEST_JDK BENCHMARKS_JAR, \
|
||||
))
|
||||
|
||||
ifneq ($(MICRO), )
|
||||
# Inform the user
|
||||
$(info Running tests using MICRO control variable '$(MICRO)')
|
||||
endif
|
||||
|
||||
|
||||
################################################################################
|
||||
# Component-specific Jtreg settings
|
||||
@ -313,6 +344,24 @@ define ParseGtestTestSelection
|
||||
)
|
||||
endef
|
||||
|
||||
# Helper function to determine if a test specification is a microbenchmark test
|
||||
#
|
||||
# It is a microbenchmark test if it is either "micro", or "micro:" followed by an optional
|
||||
# test filter string.
|
||||
define ParseMicroTestSelection
|
||||
$(if $(filter micro%, $1), \
|
||||
$(if $(filter micro, $1), \
|
||||
micro:all \
|
||||
, \
|
||||
$(if $(filter micro:, $1), \
|
||||
micro:all \
|
||||
, \
|
||||
$1 \
|
||||
) \
|
||||
) \
|
||||
)
|
||||
endef
|
||||
|
||||
# Helper function that removes the TOPDIR part
|
||||
CleanupJtregPath = \
|
||||
$(strip $(patsubst %/, %, $(subst $(JTREG_TOPDIR)/,, $1)))
|
||||
@ -425,6 +474,9 @@ $(foreach test, $(TEST), \
|
||||
$(if $(strip $(PARSED_TESTS)), , \
|
||||
$(eval PARSED_TESTS += $(call ParseGtestTestSelection, $(test))) \
|
||||
) \
|
||||
$(if $(strip $(PARSED_TESTS)), , \
|
||||
$(eval PARSED_TESTS += $(call ParseMicroTestSelection, $(test))) \
|
||||
) \
|
||||
$(if $(strip $(PARSED_TESTS)), , \
|
||||
$(eval PARSED_TESTS += $(call ParseJtregTestSelection, $(test))) \
|
||||
) \
|
||||
@ -548,6 +600,113 @@ endef
|
||||
|
||||
################################################################################
|
||||
|
||||
### Rules for Microbenchmarks
|
||||
|
||||
# Helper function for SetupRunMicroTest. Set a MICRO_* variable from, in order:
|
||||
# 1) Specified by user on command line
|
||||
# 2) Generic default
|
||||
#
|
||||
# Note: No spaces are allowed around the arguments.
|
||||
# Arg $1 The test ID (i.e. $1 in SetupRunMicroTest)
|
||||
# Arg $2 Base variable, e.g. MICRO_TEST_JDK
|
||||
# Arg $3 The default value (optional)
|
||||
define SetMicroValue
|
||||
ifneq ($$($2), )
|
||||
$1_$2 := $$($2)
|
||||
else
|
||||
ifneq ($3, )
|
||||
$1_$2 := $3
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
SetupRunMicroTest = $(NamedParamsMacroTemplate)
|
||||
define SetupRunMicroTestBody
|
||||
$1_TEST_RESULTS_DIR := $$(TEST_RESULTS_DIR)/$1
|
||||
$1_TEST_SUPPORT_DIR := $$(TEST_SUPPORT_DIR)/$1
|
||||
$1_EXITCODE := $$($1_TEST_RESULTS_DIR)/exitcode.txt
|
||||
|
||||
$1_TEST_NAME := $$(strip $$(patsubst micro:%, %, $$($1_TEST)))
|
||||
|
||||
$$(eval $$(call SetMicroValue,$1,MICRO_BENCHMARKS_JAR,$$(TEST_IMAGE_DIR)/micro/benchmarks.jar))
|
||||
$$(eval $$(call SetMicroValue,$1,MICRO_TEST_JDK,$$(JDK_IMAGE_DIR)))
|
||||
$$(eval $$(call SetMicroValue,$1,MICRO_JAVA_OPTIONS))
|
||||
|
||||
# Current tests needs to open java.io
|
||||
$1_MICRO_JAVA_OPTIONS += --add-opens=java.base/java.io=ALL-UNNAMED
|
||||
|
||||
# Save output as JSON or CSV file
|
||||
ifneq ($$(MICRO_RESULTS_FORMAT), )
|
||||
$1_MICRO_BASIC_OPTIONS += -rf $$(MICRO_RESULTS_FORMAT) -rff $$($1_TEST_RESULTS_DIR)/jmh-result.$(MICRO_RESULTS_FORMAT)
|
||||
endif
|
||||
|
||||
ifneq ($$(MICRO_VM_OPTIONS)$$(MICRO_JAVA_OPTIONS), )
|
||||
$1_MICRO_VM_OPTIONS := -jvmArgs $$(MICRO_VM_OPTIONS) $$(MICRO_JAVA_OPTIONS)
|
||||
endif
|
||||
|
||||
ifneq ($$(MICRO_ITER), )
|
||||
$1_MICRO_ITER := -i $$(MICRO_ITER)
|
||||
endif
|
||||
ifneq ($$(MICRO_FORK), )
|
||||
$1_MICRO_FORK := -f $$(MICRO_FORK)
|
||||
endif
|
||||
ifneq ($$(MICRO_TIME), )
|
||||
$1_MICRO_TIME := -r $$(MICRO_TIME)
|
||||
endif
|
||||
ifneq ($$(MICRO_WARMUP_ITER), )
|
||||
$1_MICRO_WARMUP_ITER := -wi $$(MICRO_WARMUP_ITER)
|
||||
endif
|
||||
ifneq ($$(MICRO_WARMUP_TIME), )
|
||||
$1_MICRO_WARMUP_TIME := -w $$(MICRO_WARMUP_TIME)
|
||||
endif
|
||||
|
||||
run-test-$1:
|
||||
$$(call LogWarn)
|
||||
$$(call LogWarn, Running test '$$($1_TEST)')
|
||||
$$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR))
|
||||
$$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/micro, \
|
||||
$$($1_MICRO_TEST_JDK)/bin/java $$($1_MICRO_JAVA_OPTIONS) -jar $$($1_MICRO_BENCHMARKS_JAR) \
|
||||
$$($1_MICRO_ITER) $$($1_MICRO_FORK) $$($1_MICRO_TIME) \
|
||||
$$($1_MICRO_WARMUP_ITER) $$($1_MICRO_WARMUP_TIME) \
|
||||
$$($1_MICRO_VM_OPTIONS) $$($1_MICRO_BASIC_OPTIONS) $$(MICRO_OPTIONS) \
|
||||
$$($1_TEST_NAME) \
|
||||
> >($(TEE) $$($1_TEST_RESULTS_DIR)/micro.txt) \
|
||||
&& $$(ECHO) $$$$? > $$($1_EXITCODE) \
|
||||
|| $$(ECHO) $$$$? > $$($1_EXITCODE) \
|
||||
)
|
||||
|
||||
$1_RESULT_FILE := $$($1_TEST_RESULTS_DIR)/micro.txt
|
||||
|
||||
parse-test-$1: run-test-$1
|
||||
$$(call LogWarn, Finished running test '$$($1_TEST)')
|
||||
$$(call LogWarn, Test report is stored in $$(strip \
|
||||
$$(subst $$(TOPDIR)/, , $$($1_TEST_RESULTS_DIR))))
|
||||
$$(if $$(wildcard $$($1_EXITCODE)), \
|
||||
$$(eval $1_EXIT_CODE := $$(shell $$(CAT) $$($1_EXITCODE))) \
|
||||
$$(if $$(filter 0, $$($1_EXIT_CODE)), \
|
||||
$$(eval $1_PASSED := 1) \
|
||||
$$(eval $1_ERROR := 0) \
|
||||
, \
|
||||
$$(eval $1_PASSED := 0) \
|
||||
$$(eval $1_ERROR := 1) \
|
||||
) \
|
||||
$$(eval $1_FAILED := 0) \
|
||||
$$(eval $1_TOTAL := $$(shell \
|
||||
$$(EXPR) $$($1_PASSED) + $$($1_ERROR))) \
|
||||
, \
|
||||
$$(eval $1_PASSED := 0) \
|
||||
$$(eval $1_FAILED := 0) \
|
||||
$$(eval $1_ERROR := 1) \
|
||||
$$(eval $1_TOTAL := 1) \
|
||||
)
|
||||
|
||||
$1: run-test-$1 parse-test-$1
|
||||
|
||||
TARGETS += $1
|
||||
endef
|
||||
|
||||
################################################################################
|
||||
|
||||
### Rules for Jtreg
|
||||
|
||||
# Helper function for SetupRunJtregTest. Set a JTREG_* variable from, in order:
|
||||
@ -621,7 +780,12 @@ define SetupRunJtregTestBody
|
||||
# we may end up with a lot of JVM's
|
||||
$1_JTREG_MAX_RAM_PERCENTAGE := $$(shell $$(EXPR) 25 / $$($1_JTREG_JOBS))
|
||||
|
||||
JTREG_TIMEOUT_FACTOR ?= 4
|
||||
# SPARC is in general slower per core so need to scale up timeouts a bit.
|
||||
ifeq ($(OPENJDK_TARGET_CPU_ARCH), sparc)
|
||||
JTREG_TIMEOUT_FACTOR ?= 8
|
||||
else
|
||||
JTREG_TIMEOUT_FACTOR ?= 4
|
||||
endif
|
||||
JTREG_VERBOSE ?= fail,error,summary
|
||||
JTREG_RETAIN ?= fail,error
|
||||
|
||||
@ -832,6 +996,9 @@ endef
|
||||
UseGtestTestHandler = \
|
||||
$(if $(filter gtest:%, $1), true)
|
||||
|
||||
UseMicroTestHandler = \
|
||||
$(if $(filter micro:%, $1), true)
|
||||
|
||||
UseJtregTestHandler = \
|
||||
$(if $(filter jtreg:%, $1), true)
|
||||
|
||||
@ -853,6 +1020,11 @@ $(foreach test, $(TESTS_TO_RUN), \
|
||||
TEST := $(test), \
|
||||
)) \
|
||||
) \
|
||||
$(if $(call UseMicroTestHandler, $(test)), \
|
||||
$(eval $(call SetupRunMicroTest, $(TEST_ID), \
|
||||
TEST := $(test), \
|
||||
)) \
|
||||
) \
|
||||
$(if $(call UseJtregTestHandler, $(test)), \
|
||||
$(eval $(call SetupRunJtregTest, $(TEST_ID), \
|
||||
TEST := $(test), \
|
||||
|
@ -95,12 +95,12 @@ endef
|
||||
# $1: The output file name
|
||||
# $2..$N: The lines to output to the file
|
||||
define CreateNewSpec
|
||||
$(if $(strip $(30)), \
|
||||
$(if $(strip $(31)), \
|
||||
$(error Internal makefile error: \
|
||||
Too many arguments to macro, please update CreateNewSpec in RunTestsPrebuilt.gmk) \
|
||||
) \
|
||||
$(shell $(RM) $1) \
|
||||
$(foreach i, $(call sequence, 2, 29), \
|
||||
$(foreach i, $(call sequence, 2, 30), \
|
||||
$(if $(strip $($i)), \
|
||||
$(call AppendFile, $(strip $($i)), $1) \
|
||||
) \
|
||||
@ -220,20 +220,35 @@ else
|
||||
PATH_SEP:=:
|
||||
endif
|
||||
|
||||
# Check number of cores
|
||||
# Check number of cores and memory in MB
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
NUM_CORES := $(shell $(CAT) /proc/cpuinfo | $(GREP) -c processor)
|
||||
MEMORY_SIZE := $(shell \
|
||||
$(EXPR) `$(CAT) /proc/meminfo | $(GREP) MemTotal | $(AWK) '{print $$2}'` / 1024 \
|
||||
)
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
NUM_CORES := $(shell /usr/sbin/sysctl -n hw.ncpu)
|
||||
MEMORY_SIZE := $(shell $(EXPR) `/usr/sbin/sysctl -n hw.memsize` / 1024 / 1024)
|
||||
else ifeq ($(OPENJDK_TARGET_OS), solaris)
|
||||
NUM_CORES := $(shell LC_MESSAGES=C /usr/sbin/psrinfo -v | $(GREP) -c on-line)
|
||||
MEMORY_SIZE := $(shell \
|
||||
/usr/sbin/prtconf 2> /dev/null | $(GREP) "^Memory [Ss]ize" | $(AWK) '{print $$3}' \
|
||||
)
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
NUM_CORES := $(NUMBER_OF_PROCESSORS)
|
||||
MEMORY_SIZE := $(shell \
|
||||
$(EXPR) `wmic computersystem get totalphysicalmemory -value | $(GREP) = \
|
||||
| $(CUT) -d "=" -f 2-` / 1024 / 1024 \
|
||||
)
|
||||
endif
|
||||
ifeq ($(NUM_CORES), )
|
||||
$(warn Could not find number of CPUs, assuming 1)
|
||||
NUM_CORES := 1
|
||||
endif
|
||||
ifeq ($(MEMORY_SIZE), )
|
||||
$(warn Could not find memory size, assuming 1024 MB)
|
||||
MEMORY_SIZE := 1024
|
||||
endif
|
||||
|
||||
# Setup LD for AOT support
|
||||
ifneq ($(DEVKIT_HOME), )
|
||||
@ -298,6 +313,7 @@ $(call CreateNewSpec, $(NEW_SPEC), \
|
||||
OPENJDK_TARGET_CPU_BITS := $(OPENJDK_TARGET_CPU_BITS), \
|
||||
OPENJDK_TARGET_CPU_ENDIAN := $(OPENJDK_TARGET_CPU_ENDIAN), \
|
||||
NUM_CORES := $(NUM_CORES), \
|
||||
MEMORY_SIZE := $(MEMORY_SIZE), \
|
||||
LD := $(LD), \
|
||||
LIBRARY_PREFIX := $(LIBRARY_PREFIX), \
|
||||
SHARED_LIBRARY_SUFFIX := $(SHARED_LIBRARY_SUFFIX), \
|
||||
|
@ -180,6 +180,9 @@ TOOLCHAIN_MISC_CHECKS
|
||||
# Setup the JTReg Regression Test Harness.
|
||||
TOOLCHAIN_SETUP_JTREG
|
||||
|
||||
# Setup the Java Microbenchmark Harness (JMH)
|
||||
LIB_TESTS_SETUP_JMH
|
||||
|
||||
# Setup Jib dependency tool
|
||||
TOOLCHAIN_SETUP_JIB
|
||||
|
||||
|
@ -102,7 +102,7 @@ apt_help() {
|
||||
ffi)
|
||||
PKGHANDLER_COMMAND="sudo apt-get install libffi-dev" ;;
|
||||
x11)
|
||||
PKGHANDLER_COMMAND="sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev" ;;
|
||||
PKGHANDLER_COMMAND="sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev" ;;
|
||||
ccache)
|
||||
PKGHANDLER_COMMAND="sudo apt-get install ccache" ;;
|
||||
dtrace)
|
||||
@ -125,7 +125,7 @@ yum_help() {
|
||||
freetype)
|
||||
PKGHANDLER_COMMAND="sudo yum install freetype-devel" ;;
|
||||
x11)
|
||||
PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel libXi-devel" ;;
|
||||
PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel" ;;
|
||||
ccache)
|
||||
PKGHANDLER_COMMAND="sudo yum install ccache" ;;
|
||||
esac
|
||||
|
@ -55,3 +55,65 @@ AC_DEFUN_ONCE([LIB_TESTS_SETUP_GRAALUNIT],
|
||||
AC_SUBST(GRAALUNIT_LIB)
|
||||
])
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Setup and check the Java Microbenchmark Harness
|
||||
#
|
||||
AC_DEFUN_ONCE([LIB_TESTS_SETUP_JMH],
|
||||
[
|
||||
AC_ARG_WITH(jmh, [AS_HELP_STRING([--with-jmh],
|
||||
[Java Microbenchmark Harness for building the OpenJDK Microbenchmark Suite])])
|
||||
|
||||
AC_MSG_CHECKING([for jmh (Java Microbenchmark Harness)])
|
||||
if test "x$with_jmh" = xno || test "x$with_jmh" = x; then
|
||||
AC_MSG_RESULT([no, disabled])
|
||||
elif test "x$with_jmh" = xyes; then
|
||||
AC_MSG_RESULT([no, error])
|
||||
AC_MSG_ERROR([--with-jmh requires a directory containing all jars needed by JMH])
|
||||
else
|
||||
# Path specified
|
||||
JMH_HOME="$with_jmh"
|
||||
if test ! -d [$JMH_HOME]; then
|
||||
AC_MSG_RESULT([no, error])
|
||||
AC_MSG_ERROR([$JMH_HOME does not exist or is not a directory])
|
||||
fi
|
||||
BASIC_FIXUP_PATH([JMH_HOME])
|
||||
|
||||
jar_names="jmh-core jmh-generator-annprocess jopt-simple commons-math3"
|
||||
for jar in $jar_names; do
|
||||
found_jar_files=$($ECHO $(ls $JMH_HOME/$jar-*.jar 2> /dev/null))
|
||||
|
||||
if test "x$found_jar_files" = x; then
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([--with-jmh does not contain $jar-*.jar])
|
||||
elif ! test -e "$found_jar_files"; then
|
||||
AC_MSG_RESULT([no])
|
||||
AC_MSG_ERROR([--with-jmh contain multiple $jar-*.jar: $found_jar_files])
|
||||
fi
|
||||
|
||||
found_jar_var_name=found_${jar//-/_}
|
||||
eval $found_jar_var_name='"'$found_jar_files'"'
|
||||
done
|
||||
AC_MSG_RESULT([yes])
|
||||
|
||||
JMH_CORE_JAR=$found_jmh_core
|
||||
JMH_GENERATOR_JAR=$found_jmh_generator_annprocess
|
||||
JMH_JOPT_SIMPLE_JAR=$found_jopt_simple
|
||||
JMH_COMMONS_MATH_JAR=$found_commons_math3
|
||||
|
||||
|
||||
if [ [[ "$JMH_CORE_JAR" =~ jmh-core-(.*)\.jar$ ]] ] ; then
|
||||
JMH_VERSION=${BASH_REMATCH[[1]]}
|
||||
else
|
||||
JMH_VERSION=unknown
|
||||
fi
|
||||
|
||||
AC_MSG_NOTICE([JMH core version: $JMH_VERSION])
|
||||
fi
|
||||
|
||||
AC_SUBST(JMH_CORE_JAR)
|
||||
AC_SUBST(JMH_GENERATOR_JAR)
|
||||
AC_SUBST(JMH_JOPT_SIMPLE_JAR)
|
||||
AC_SUBST(JMH_COMMONS_MATH_JAR)
|
||||
AC_SUBST(JMH_VERSION)
|
||||
])
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -99,8 +99,14 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
||||
OLD_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS $SYSROOT_CFLAGS $X_CFLAGS"
|
||||
|
||||
HEADERS_TO_CHECK="X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h"
|
||||
# There is no Xrandr extension on AIX
|
||||
if test "x$OPENJDK_TARGET_OS" != xaix; then
|
||||
HEADERS_TO_CHECK="$HEADERS_TO_CHECK X11/extensions/Xrandr.h"
|
||||
fi
|
||||
|
||||
# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10
|
||||
AC_CHECK_HEADERS([X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h],
|
||||
AC_CHECK_HEADERS([$HEADERS_TO_CHECK],
|
||||
[X11_HEADERS_OK=yes],
|
||||
[X11_HEADERS_OK=no; break],
|
||||
[
|
||||
@ -111,7 +117,7 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
|
||||
|
||||
if test "x$X11_HEADERS_OK" = xno; then
|
||||
HELP_MSG_MISSING_DEPENDENCY([x11])
|
||||
AC_MSG_ERROR([Could not find all X11 headers (shape.h Xrender.h XTest.h Intrinsic.h). $HELP_MSG])
|
||||
AC_MSG_ERROR([Could not find all X11 headers (shape.h Xrender.h Xrander.h XTest.h Intrinsic.h). $HELP_MSG])
|
||||
fi
|
||||
|
||||
# If XLinearGradient isn't available in Xrender.h, signal that it needs to be
|
||||
|
@ -355,6 +355,12 @@ ENABLE_LIBFFI_BUNDLING:=@ENABLE_LIBFFI_BUNDLING@
|
||||
LIBFFI_LIB_FILE:=@LIBFFI_LIB_FILE@
|
||||
GRAALUNIT_LIB := @GRAALUNIT_LIB@
|
||||
|
||||
JMH_CORE_JAR := @JMH_CORE_JAR@
|
||||
JMH_GENERATOR_JAR := @JMH_GENERATOR_JAR@
|
||||
JMH_JOPT_SIMPLE_JAR := @JMH_JOPT_SIMPLE_JAR@
|
||||
JMH_COMMONS_MATH_JAR := @JMH_COMMONS_MATH_JAR@
|
||||
JMH_VERSION := @JMH_VERSION@
|
||||
|
||||
# Source file for cacerts
|
||||
CACERTS_FILE=@CACERTS_FILE@
|
||||
|
||||
|
@ -72,6 +72,9 @@ ALL_NAMED_TESTS += $(JTREG_TEST_GROUPS)
|
||||
# Add Gtest
|
||||
ALL_NAMED_TESTS += gtest
|
||||
|
||||
# Add microbenchmarks
|
||||
ALL_NAMED_TESTS += micro
|
||||
|
||||
# Find make test targets
|
||||
MAKE_TEST_TARGETS := $(shell $(MAKE) -s --no-print-directory $(MAKE_ARGS) \
|
||||
SPEC=$(SPEC) -f $(TOPDIR)/test/make/TestMake.gmk print-targets)
|
||||
|
@ -43,6 +43,7 @@ FALSE_FIND_PATTERN:=-name FILE_NAME_THAT_DOESNT_EXIST
|
||||
# For this to work, the source files must exist when the makefile is
|
||||
# parsed.
|
||||
# SRCS:=List of directories in where to find files to add to archive
|
||||
# BIN:=Directory where to store build control files
|
||||
# SUFFIXES:=File suffixes to include in jar
|
||||
# INCLUDES:=List of directories/packages in SRCS that should be included
|
||||
# EXCLUDES:=List of directories/packages in SRCS that should be excluded
|
||||
@ -62,10 +63,11 @@ define SetupJarArchiveBody
|
||||
|
||||
$1_JARMAIN:=$(strip $$($1_JARMAIN))
|
||||
$1_JARNAME:=$$(notdir $$($1_JAR))
|
||||
$1_MANIFEST_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_manifest
|
||||
$1_DELETESS_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletess
|
||||
$1_DELETES_FILE:=$$(dir $$($1_JAR))_the.$$($1_JARNAME)_deletes
|
||||
$1_BIN:=$$(dir $$($1_JAR))
|
||||
$1_JAR_OUTPUT_DIR := $$(patsubst %/, %, $$(dir $$($1_JAR)))
|
||||
$$(call SetIfEmpty, $1_BIN, $$($1_JAR_OUTPUT_DIR))
|
||||
$1_MANIFEST_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_manifest
|
||||
$1_DELETESS_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_deletess
|
||||
$1_DELETES_FILE:=$$($1_BIN)/_the.$$($1_JARNAME)_deletes
|
||||
$$(call SetIfEmpty, $1_JAR_CMD, $$(JAR))
|
||||
|
||||
ifeq (,$$($1_SUFFIXES))
|
||||
@ -231,11 +233,12 @@ define SetupJarArchiveBody
|
||||
$1_VARDEPS := $$($1_JAR_CMD) $$($1_JAR_CREATE_OPTIONS) $$($1_MANIFEST) \
|
||||
$$($1_JARMAIN) $$($1_EXTRA_MANIFEST_ATTR) $$($1_ORIG_DEPS) $$($1_SRCS) \
|
||||
$$($1_INCLUDES) $$($1_EXCLUDES) $$($1_EXCLUDE_FILES) $$($1_EXTRA_FILES)
|
||||
$1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, $$(dir $$($1_JAR))_the.$$($1_JARNAME).vardeps)
|
||||
$1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, $$($1_BIN)/_the.$$($1_JARNAME).vardeps)
|
||||
|
||||
# Here is the rule that creates/updates the jar file.
|
||||
$$($1_JAR) : $$($1_DEPENDENCIES) $$($1_MANIFEST) $$($1_VARDEPS_FILE)
|
||||
$$(call MakeTargetDir)
|
||||
$$(call MakeDir, $$($1_BIN))
|
||||
$$($1_GREP_INCLUDE_OUTPUT)
|
||||
$$($1_GREP_EXCLUDE_OUTPUT)
|
||||
# If the vardeps file is part of the newer prereq list, it means that
|
||||
|
@ -243,7 +243,7 @@ var getJibProfilesCommon = function (input, data) {
|
||||
|
||||
// These are the base setttings for all the main build profiles.
|
||||
common.main_profile_base = {
|
||||
dependencies: ["boot_jdk", "gnumake", "jtreg", "jib", "autoconf"],
|
||||
dependencies: ["boot_jdk", "gnumake", "jtreg", "jib", "autoconf", "jmh"],
|
||||
default_make_targets: ["product-bundles", "test-bundles"],
|
||||
configure_args: concat(["--enable-jtreg-failure-handler"],
|
||||
"--with-exclude-translations=de,es,fr,it,ko,pt_BR,sv,ca,tr,cs,sk,ja_JP_A,ja_JP_HA,ja_JP_HI,ja_JP_I,zh_TW,zh_HK",
|
||||
@ -830,8 +830,8 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
solaris_x64: "SS12u4-Solaris11u1+1.0",
|
||||
solaris_sparcv9: "SS12u6-Solaris11u3+1.0",
|
||||
windows_x64: "VS2017-15.5.5+1.0",
|
||||
linux_aarch64: "gcc7.3.0-Fedora27+1.0",
|
||||
linux_arm: "gcc7.3.0-Fedora27+1.0"
|
||||
linux_aarch64: "gcc7.3.0-Fedora27+1.1",
|
||||
linux_arm: "gcc7.3.0-Fedora27+1.1"
|
||||
};
|
||||
|
||||
var devkit_platform = (input.target_cpu == "x86"
|
||||
@ -892,6 +892,12 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
environment_path: input.get("jtreg", "install_path") + "/jtreg/bin"
|
||||
},
|
||||
|
||||
jmh: {
|
||||
organization: common.organization,
|
||||
ext: "tar.gz",
|
||||
revision: "1.21+1.0"
|
||||
},
|
||||
|
||||
gnumake: {
|
||||
organization: common.organization,
|
||||
ext: "tar.gz",
|
||||
|
@ -265,6 +265,54 @@ class CharacterData00 extends CharacterData {
|
||||
case 0x13ED: mapChar = 0xABBD; break;
|
||||
case 0x13EE: mapChar = 0xABBE; break;
|
||||
case 0x13EF: mapChar = 0xABBF; break;
|
||||
case 0x1C90: mapChar = 0x10D0; break;
|
||||
case 0x1C91: mapChar = 0x10D1; break;
|
||||
case 0x1C92: mapChar = 0x10D2; break;
|
||||
case 0x1C93: mapChar = 0x10D3; break;
|
||||
case 0x1C94: mapChar = 0x10D4; break;
|
||||
case 0x1C95: mapChar = 0x10D5; break;
|
||||
case 0x1C96: mapChar = 0x10D6; break;
|
||||
case 0x1C97: mapChar = 0x10D7; break;
|
||||
case 0x1C98: mapChar = 0x10D8; break;
|
||||
case 0x1C99: mapChar = 0x10D9; break;
|
||||
case 0x1C9A: mapChar = 0x10DA; break;
|
||||
case 0x1C9B: mapChar = 0x10DB; break;
|
||||
case 0x1C9C: mapChar = 0x10DC; break;
|
||||
case 0x1C9D: mapChar = 0x10DD; break;
|
||||
case 0x1C9E: mapChar = 0x10DE; break;
|
||||
case 0x1C9F: mapChar = 0x10DF; break;
|
||||
case 0x1CA0: mapChar = 0x10E0; break;
|
||||
case 0x1CA1: mapChar = 0x10E1; break;
|
||||
case 0x1CA2: mapChar = 0x10E2; break;
|
||||
case 0x1CA3: mapChar = 0x10E3; break;
|
||||
case 0x1CA4: mapChar = 0x10E4; break;
|
||||
case 0x1CA5: mapChar = 0x10E5; break;
|
||||
case 0x1CA6: mapChar = 0x10E6; break;
|
||||
case 0x1CA7: mapChar = 0x10E7; break;
|
||||
case 0x1CA8: mapChar = 0x10E8; break;
|
||||
case 0x1CA9: mapChar = 0x10E9; break;
|
||||
case 0x1CAA: mapChar = 0x10EA; break;
|
||||
case 0x1CAB: mapChar = 0x10EB; break;
|
||||
case 0x1CAC: mapChar = 0x10EC; break;
|
||||
case 0x1CAD: mapChar = 0x10ED; break;
|
||||
case 0x1CAE: mapChar = 0x10EE; break;
|
||||
case 0x1CAF: mapChar = 0x10EF; break;
|
||||
case 0x1CB0: mapChar = 0x10F0; break;
|
||||
case 0x1CB1: mapChar = 0x10F1; break;
|
||||
case 0x1CB2: mapChar = 0x10F2; break;
|
||||
case 0x1CB3: mapChar = 0x10F3; break;
|
||||
case 0x1CB4: mapChar = 0x10F4; break;
|
||||
case 0x1CB5: mapChar = 0x10F5; break;
|
||||
case 0x1CB6: mapChar = 0x10F6; break;
|
||||
case 0x1CB7: mapChar = 0x10F7; break;
|
||||
case 0x1CB8: mapChar = 0x10F8; break;
|
||||
case 0x1CB9: mapChar = 0x10F9; break;
|
||||
case 0x1CBA: mapChar = 0x10FA; break;
|
||||
case 0x1CBB: mapChar = 0x10FB; break;
|
||||
case 0x1CBC: mapChar = 0x10FC; break;
|
||||
case 0x1CBD: mapChar = 0x10FD; break;
|
||||
case 0x1CBE: mapChar = 0x10FE; break;
|
||||
case 0x1CBF: mapChar = 0x10FF; break;
|
||||
case 0x1E9E: mapChar = 0x00DF; break;
|
||||
case 0x1F88: mapChar = 0x1F80; break;
|
||||
case 0x1F89: mapChar = 0x1F81; break;
|
||||
@ -355,6 +403,52 @@ class CharacterData00 extends CharacterData {
|
||||
case 0x0287: mapChar = 0xA7B1; break;
|
||||
case 0x029D: mapChar = 0xA7B2; break;
|
||||
case 0x029E: mapChar = 0xA7B0; break;
|
||||
case 0x10D0: mapChar = 0x1C90; break;
|
||||
case 0x10D1: mapChar = 0x1C91; break;
|
||||
case 0x10D2: mapChar = 0x1C92; break;
|
||||
case 0x10D3: mapChar = 0x1C93; break;
|
||||
case 0x10D4: mapChar = 0x1C94; break;
|
||||
case 0x10D5: mapChar = 0x1C95; break;
|
||||
case 0x10D6: mapChar = 0x1C96; break;
|
||||
case 0x10D7: mapChar = 0x1C97; break;
|
||||
case 0x10D8: mapChar = 0x1C98; break;
|
||||
case 0x10D9: mapChar = 0x1C99; break;
|
||||
case 0x10DA: mapChar = 0x1C9A; break;
|
||||
case 0x10DB: mapChar = 0x1C9B; break;
|
||||
case 0x10DC: mapChar = 0x1C9C; break;
|
||||
case 0x10DD: mapChar = 0x1C9D; break;
|
||||
case 0x10DE: mapChar = 0x1C9E; break;
|
||||
case 0x10DF: mapChar = 0x1C9F; break;
|
||||
case 0x10E0: mapChar = 0x1CA0; break;
|
||||
case 0x10E1: mapChar = 0x1CA1; break;
|
||||
case 0x10E2: mapChar = 0x1CA2; break;
|
||||
case 0x10E3: mapChar = 0x1CA3; break;
|
||||
case 0x10E4: mapChar = 0x1CA4; break;
|
||||
case 0x10E5: mapChar = 0x1CA5; break;
|
||||
case 0x10E6: mapChar = 0x1CA6; break;
|
||||
case 0x10E7: mapChar = 0x1CA7; break;
|
||||
case 0x10E8: mapChar = 0x1CA8; break;
|
||||
case 0x10E9: mapChar = 0x1CA9; break;
|
||||
case 0x10EA: mapChar = 0x1CAA; break;
|
||||
case 0x10EB: mapChar = 0x1CAB; break;
|
||||
case 0x10EC: mapChar = 0x1CAC; break;
|
||||
case 0x10ED: mapChar = 0x1CAD; break;
|
||||
case 0x10EE: mapChar = 0x1CAE; break;
|
||||
case 0x10EF: mapChar = 0x1CAF; break;
|
||||
case 0x10F0: mapChar = 0x1CB0; break;
|
||||
case 0x10F1: mapChar = 0x1CB1; break;
|
||||
case 0x10F2: mapChar = 0x1CB2; break;
|
||||
case 0x10F3: mapChar = 0x1CB3; break;
|
||||
case 0x10F4: mapChar = 0x1CB4; break;
|
||||
case 0x10F5: mapChar = 0x1CB5; break;
|
||||
case 0x10F6: mapChar = 0x1CB6; break;
|
||||
case 0x10F7: mapChar = 0x1CB7; break;
|
||||
case 0x10F8: mapChar = 0x1CB8; break;
|
||||
case 0x10F9: mapChar = 0x1CB9; break;
|
||||
case 0x10FA: mapChar = 0x1CBA; break;
|
||||
case 0x10FD: mapChar = 0x1CBD; break;
|
||||
case 0x10FE: mapChar = 0x1CBE; break;
|
||||
case 0x10FF: mapChar = 0x1CBF; break;
|
||||
case 0x1C80: mapChar = 0x0412; break;
|
||||
case 0x1C81: mapChar = 0x0414; break;
|
||||
case 0x1C82: mapChar = 0x041E; break;
|
||||
@ -544,9 +638,16 @@ class CharacterData00 extends CharacterData {
|
||||
mapChar = ch + 1;
|
||||
}
|
||||
else if ((val & $$maskLowerCase) == 0) {
|
||||
// The character does not have a lowercase equivalent, so it must
|
||||
// already be lowercase; so subtract 1 to get the titlecase form.
|
||||
mapChar = ch - 1;
|
||||
// For some Georgian letters, titlecase form is
|
||||
// same as this character.
|
||||
if(ch >= 0x10D0 && ch <= 0x10FF) {
|
||||
mapChar = ch;
|
||||
}
|
||||
else {
|
||||
// The character does not have a lowercase equivalent, so it must
|
||||
// already be lowercase; so subtract 1 to get the titlecase form.
|
||||
mapChar = ch - 1;
|
||||
}
|
||||
}
|
||||
// else {
|
||||
// The character has both an uppercase equivalent and a lowercase
|
||||
@ -741,6 +842,52 @@ class CharacterData00 extends CharacterData {
|
||||
case 0x0287: mapChar = 0xA7B1; break;
|
||||
case 0x029D: mapChar = 0xA7B2; break;
|
||||
case 0x029E: mapChar = 0xA7B0; break;
|
||||
case 0x10D0: mapChar = 0x1C90; break;
|
||||
case 0x10D1: mapChar = 0x1C91; break;
|
||||
case 0x10D2: mapChar = 0x1C92; break;
|
||||
case 0x10D3: mapChar = 0x1C93; break;
|
||||
case 0x10D4: mapChar = 0x1C94; break;
|
||||
case 0x10D5: mapChar = 0x1C95; break;
|
||||
case 0x10D6: mapChar = 0x1C96; break;
|
||||
case 0x10D7: mapChar = 0x1C97; break;
|
||||
case 0x10D8: mapChar = 0x1C98; break;
|
||||
case 0x10D9: mapChar = 0x1C99; break;
|
||||
case 0x10DA: mapChar = 0x1C9A; break;
|
||||
case 0x10DB: mapChar = 0x1C9B; break;
|
||||
case 0x10DC: mapChar = 0x1C9C; break;
|
||||
case 0x10DD: mapChar = 0x1C9D; break;
|
||||
case 0x10DE: mapChar = 0x1C9E; break;
|
||||
case 0x10DF: mapChar = 0x1C9F; break;
|
||||
case 0x10E0: mapChar = 0x1CA0; break;
|
||||
case 0x10E1: mapChar = 0x1CA1; break;
|
||||
case 0x10E2: mapChar = 0x1CA2; break;
|
||||
case 0x10E3: mapChar = 0x1CA3; break;
|
||||
case 0x10E4: mapChar = 0x1CA4; break;
|
||||
case 0x10E5: mapChar = 0x1CA5; break;
|
||||
case 0x10E6: mapChar = 0x1CA6; break;
|
||||
case 0x10E7: mapChar = 0x1CA7; break;
|
||||
case 0x10E8: mapChar = 0x1CA8; break;
|
||||
case 0x10E9: mapChar = 0x1CA9; break;
|
||||
case 0x10EA: mapChar = 0x1CAA; break;
|
||||
case 0x10EB: mapChar = 0x1CAB; break;
|
||||
case 0x10EC: mapChar = 0x1CAC; break;
|
||||
case 0x10ED: mapChar = 0x1CAD; break;
|
||||
case 0x10EE: mapChar = 0x1CAE; break;
|
||||
case 0x10EF: mapChar = 0x1CAF; break;
|
||||
case 0x10F0: mapChar = 0x1CB0; break;
|
||||
case 0x10F1: mapChar = 0x1CB1; break;
|
||||
case 0x10F2: mapChar = 0x1CB2; break;
|
||||
case 0x10F3: mapChar = 0x1CB3; break;
|
||||
case 0x10F4: mapChar = 0x1CB4; break;
|
||||
case 0x10F5: mapChar = 0x1CB5; break;
|
||||
case 0x10F6: mapChar = 0x1CB6; break;
|
||||
case 0x10F7: mapChar = 0x1CB7; break;
|
||||
case 0x10F8: mapChar = 0x1CB8; break;
|
||||
case 0x10F9: mapChar = 0x1CB9; break;
|
||||
case 0x10FA: mapChar = 0x1CBA; break;
|
||||
case 0x10FD: mapChar = 0x1CBD; break;
|
||||
case 0x10FE: mapChar = 0x1CBE; break;
|
||||
case 0x10FF: mapChar = 0x1CBF; break;
|
||||
case 0x1C80: mapChar = 0x0412; break;
|
||||
case 0x1C81: mapChar = 0x0414; break;
|
||||
case 0x1C82: mapChar = 0x041E; break;
|
||||
|
@ -364,6 +364,8 @@ class CharacterData01 extends CharacterData {
|
||||
case 0x10E78: retval = 700; break; // RUMI NUMBER SEVEN HUNDRED
|
||||
case 0x10E79: retval = 800; break; // RUMI NUMBER EIGHT HUNDRED
|
||||
case 0x10E7A: retval = 900; break; // RUMI NUMBER NINE HUNDRED
|
||||
case 0x10F25: retval = 100; break; // OLD SOGDIAN NUMBER ONE HUNDRED
|
||||
case 0x10F54: retval = 100; break; // SOGDIAN NUMBER ONE HUNDRED
|
||||
case 0x1105E: retval = 40; break; // BRAHMI NUMBER FORTY
|
||||
case 0x1105F: retval = 50; break; // BRAHMI NUMBER FIFTY
|
||||
case 0x11060: retval = 60; break; // BRAHMI NUMBER SIXTY
|
||||
@ -407,6 +409,46 @@ class CharacterData01 extends CharacterData {
|
||||
case 0x1D36F: retval = 70; break; // COUNTING ROD TENS DIGIT SEVEN
|
||||
case 0x1D370: retval = 80; break; // COUNTING ROD TENS DIGIT EIGHT
|
||||
case 0x1D371: retval = 90; break; // COUNTING ROD TENS DIGIT NINE
|
||||
case 0x1EC7D: retval = 40; break; // INDIC SIYAQ NUMBER FORTY
|
||||
case 0x1EC7E: retval = 50; break; // INDIC SIYAQ NUMBER FIFTY
|
||||
case 0x1EC7F: retval = 60; break; // INDIC SIYAQ NUMBER SIXTY
|
||||
case 0X1EC80: retval = 70; break; // INDIC SIYAQ NUMBER SEVENTY
|
||||
case 0X1EC81: retval = 80; break; // INDIC SIYAQ NUMBER EIGHTY
|
||||
case 0X1EC82: retval = 90; break; // INDIC SIYAQ NUMBER NINETY
|
||||
case 0X1EC83: retval = 100; break; // INDIC SIYAQ NUMBER ONE HUNDRED
|
||||
case 0X1EC84: retval = 200; break; // INDIC SIYAQ NUMBER TWO HUNDRED
|
||||
case 0X1EC85: retval = 300; break; // INDIC SIYAQ NUMBER THREE HUNDRED
|
||||
case 0X1EC86: retval = 400; break; // INDIC SIYAQ NUMBER FOUR HUNDRED
|
||||
case 0X1EC87: retval = 500; break; // INDIC SIYAQ NUMBER FIVE HUNDRED
|
||||
case 0X1EC88: retval = 600; break; // INDIC SIYAQ NUMBER SIX HUNDRED
|
||||
case 0X1EC89: retval = 700; break; // INDIC SIYAQ NUMBER SEVEN HUNDRED
|
||||
case 0X1EC8A: retval = 800; break; // INDIC SIYAQ NUMBER EIGHT HUNDRED
|
||||
case 0X1EC8B: retval = 900; break; // INDIC SIYAQ NUMBER NINE HUNDRED
|
||||
case 0X1EC8C: retval = 1000; break; // INDIC SIYAQ NUMBER ONE THOUSAND
|
||||
case 0X1EC8D: retval = 2000; break; // INDIC SIYAQ NUMBER TWO THOUSAND
|
||||
case 0X1EC8E: retval = 3000; break; // INDIC SIYAQ NUMBER THREE THOUSAND
|
||||
case 0X1EC8F: retval = 4000; break; // INDIC SIYAQ NUMBER FOUR THOUSAND
|
||||
case 0X1EC90: retval = 5000; break; // INDIC SIYAQ NUMBER FIVE THOUSAND
|
||||
case 0X1EC91: retval = 6000; break; // INDIC SIYAQ NUMBER SIX THOUSAND
|
||||
case 0X1EC92: retval = 7000; break; // INDIC SIYAQ NUMBER SEVEN THOUSAND
|
||||
case 0X1EC93: retval = 8000; break; // INDIC SIYAQ NUMBER EIGHT THOUSAND
|
||||
case 0X1EC94: retval = 9000; break; // INDIC SIYAQ NUMBER NINE THOUSAND
|
||||
case 0X1EC95: retval = 10000; break; // INDIC SIYAQ NUMBER TEN THOUSAND
|
||||
case 0X1EC96: retval = 20000; break; // INDIC SIYAQ NUMBER TWENTY THOUSAND
|
||||
case 0X1EC97: retval = 30000; break; // INDIC SIYAQ NUMBER THIRTY THOUSAND
|
||||
case 0X1EC98: retval = 40000; break; // INDIC SIYAQ NUMBER FORTY THOUSAND
|
||||
case 0X1EC99: retval = 50000; break; // INDIC SIYAQ NUMBER FIFTY THOUSAND
|
||||
case 0X1EC9A: retval = 60000; break; // INDIC SIYAQ NUMBER SIXTY THOUSAND
|
||||
case 0X1EC9B: retval = 70000; break; // INDIC SIYAQ NUMBER SEVENTY THOUSAND
|
||||
case 0X1EC9C: retval = 80000; break; // INDIC SIYAQ NUMBER EIGHTY THOUSAND
|
||||
case 0X1EC9D: retval = 90000; break; // INDIC SIYAQ NUMBER NINETY THOUSAND
|
||||
case 0X1EC9E: retval = 100000; break; // INDIC SIYAQ NUMBER LAKH
|
||||
case 0X1EC9F: retval = 200000; break; // INDIC SIYAQ NUMBER LAKHAN
|
||||
case 0X1ECA0: retval = 100000; break; // INDIC SIYAQ LAKH MARK
|
||||
case 0X1ECA1: retval = 10000000; break; // INDIC SIYAQ NUMBER KAROR
|
||||
case 0X1ECA2: retval = 20000000; break; // INDIC SIYAQ NUMBER KARORAN
|
||||
case 0X1ECB3: retval = 10000; break; // INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND
|
||||
case 0X1ECB4: retval = 100000; break; // INDIC SIYAQ NUMBER ALTERNATE LAKH MARK
|
||||
default: retval = -2; break;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# PropList-10.0.0.txt
|
||||
# Date: 2017-03-10, 08:25:30 GMT
|
||||
# Copyright (c) 2017 Unicode, Inc.
|
||||
# PropList-11.0.0.txt
|
||||
# Date: 2018-03-15, 04:28:35 GMT
|
||||
# Copyright (c) 2018 Unicode, Inc.
|
||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
||||
# For terms of use, see http://www.unicode.org/terms_of_use.html
|
||||
#
|
||||
@ -125,7 +125,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
|
||||
05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
|
||||
060C ; Terminal_Punctuation # Po ARABIC COMMA
|
||||
061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
|
||||
061F ; Terminal_Punctuation # Po ARABIC QUESTION MARK
|
||||
061E..061F ; Terminal_Punctuation # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
|
||||
06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
|
||||
0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
|
||||
070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
|
||||
@ -156,6 +156,8 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
|
||||
2E2E ; Terminal_Punctuation # Po REVERSED QUESTION MARK
|
||||
2E3C ; Terminal_Punctuation # Po STENOGRAPHIC FULL STOP
|
||||
2E41 ; Terminal_Punctuation # Po REVERSED COMMA
|
||||
2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA
|
||||
2E4E ; Terminal_Punctuation # Po PUNCTUS ELEVATUS MARK
|
||||
3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
|
||||
A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
|
||||
A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK
|
||||
@ -185,6 +187,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
|
||||
10AF0..10AF5 ; Terminal_Punctuation # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS
|
||||
10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION
|
||||
10B99..10B9C ; Terminal_Punctuation # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
|
||||
10F55..10F59 ; Terminal_Punctuation # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
|
||||
11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
|
||||
110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
|
||||
11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
|
||||
@ -204,15 +207,17 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
|
||||
11AA1..11AA2 ; Terminal_Punctuation # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2
|
||||
11C41..11C43 ; Terminal_Punctuation # Po [3] BHAIKSUKI DANDA..BHAIKSUKI WORD SEPARATOR
|
||||
11C71 ; Terminal_Punctuation # Po MARCHEN MARK SHAD
|
||||
11EF7..11EF8 ; Terminal_Punctuation # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
|
||||
12470..12474 ; Terminal_Punctuation # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
|
||||
16A6E..16A6F ; Terminal_Punctuation # Po [2] MRO DANDA..MRO DOUBLE DANDA
|
||||
16AF5 ; Terminal_Punctuation # Po BASSA VAH FULL STOP
|
||||
16B37..16B39 ; Terminal_Punctuation # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM
|
||||
16B44 ; Terminal_Punctuation # Po PAHAWH HMONG SIGN XAUS
|
||||
16E97..16E98 ; Terminal_Punctuation # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP
|
||||
1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
|
||||
1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON
|
||||
|
||||
# Total code points: 252
|
||||
# Total code points: 264
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -661,6 +666,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
10A01..10A03 ; Other_Alphabetic # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
|
||||
10A05..10A06 ; Other_Alphabetic # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
|
||||
10A0C..10A0F ; Other_Alphabetic # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
|
||||
10D24..10D27 ; Other_Alphabetic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
|
||||
11000 ; Other_Alphabetic # Mc BRAHMI SIGN CANDRABINDU
|
||||
11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA
|
||||
11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA
|
||||
@ -673,6 +679,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
|
||||
1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E
|
||||
1112D..11132 ; Other_Alphabetic # Mn [6] CHAKMA VOWEL SIGN AI..CHAKMA AU MARK
|
||||
11145..11146 ; Other_Alphabetic # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
|
||||
11180..11181 ; Other_Alphabetic # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA
|
||||
11182 ; Other_Alphabetic # Mc SHARADA SIGN VISARGA
|
||||
111B3..111B5 ; Other_Alphabetic # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II
|
||||
@ -730,9 +737,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
11722..11725 ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
|
||||
11726 ; Other_Alphabetic # Mc AHOM VOWEL SIGN E
|
||||
11727..1172A ; Other_Alphabetic # Mn [4] AHOM VOWEL SIGN AW..AHOM VOWEL SIGN AM
|
||||
11A01..11A06 ; Other_Alphabetic # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
|
||||
11A07..11A08 ; Other_Alphabetic # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
|
||||
11A09..11A0A ; Other_Alphabetic # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
|
||||
1182C..1182E ; Other_Alphabetic # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
|
||||
1182F..11837 ; Other_Alphabetic # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
|
||||
11838 ; Other_Alphabetic # Mc DOGRA SIGN VISARGA
|
||||
11A01..11A0A ; Other_Alphabetic # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
|
||||
11A35..11A38 ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE SIGN CANDRABINDU..ZANABAZAR SQUARE SIGN ANUSVARA
|
||||
11A39 ; Other_Alphabetic # Mc ZANABAZAR SQUARE SIGN VISARGA
|
||||
11A3B..11A3E ; Other_Alphabetic # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA
|
||||
@ -758,6 +766,13 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
11D3F..11D41 ; Other_Alphabetic # Mn [3] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI SIGN VISARGA
|
||||
11D43 ; Other_Alphabetic # Mn MASARAM GONDI SIGN CANDRA
|
||||
11D47 ; Other_Alphabetic # Mn MASARAM GONDI RA-KARA
|
||||
11D8A..11D8E ; Other_Alphabetic # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
|
||||
11D90..11D91 ; Other_Alphabetic # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
|
||||
11D93..11D94 ; Other_Alphabetic # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
|
||||
11D95 ; Other_Alphabetic # Mn GUNJALA GONDI SIGN ANUSVARA
|
||||
11D96 ; Other_Alphabetic # Mc GUNJALA GONDI SIGN VISARGA
|
||||
11EF3..11EF4 ; Other_Alphabetic # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
|
||||
11EF5..11EF6 ; Other_Alphabetic # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
|
||||
16B30..16B36 ; Other_Alphabetic # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM
|
||||
16F51..16F7E ; Other_Alphabetic # Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG
|
||||
1BC9E ; Other_Alphabetic # Mn DUPLOYAN DOUBLE MARK
|
||||
@ -771,7 +786,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
|
||||
1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
|
||||
|
||||
# Total code points: 1300
|
||||
# Total code points: 1334
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -780,10 +795,10 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
|
||||
3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
|
||||
3400..4DB5 ; Ideographic # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
|
||||
4E00..9FEA ; Ideographic # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
|
||||
4E00..9FEF ; Ideographic # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
|
||||
F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
|
||||
FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
|
||||
17000..187EC ; Ideographic # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
|
||||
17000..187F1 ; Ideographic # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1
|
||||
18800..18AF2 ; Ideographic # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
|
||||
1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
|
||||
20000..2A6D6 ; Ideographic # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
|
||||
@ -793,7 +808,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
|
||||
2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
|
||||
2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
|
||||
|
||||
# Total code points: 96174
|
||||
# Total code points: 96184
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -953,6 +968,9 @@ FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFW
|
||||
FFE3 ; Diacritic # Sk FULLWIDTH MACRON
|
||||
102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK
|
||||
10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
|
||||
10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA
|
||||
10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
|
||||
10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
|
||||
110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
|
||||
11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA
|
||||
11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA
|
||||
@ -973,12 +991,14 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
|
||||
116B6 ; Diacritic # Mc TAKRI SIGN VIRAMA
|
||||
116B7 ; Diacritic # Mn TAKRI SIGN NUKTA
|
||||
1172B ; Diacritic # Mn AHOM SIGN KILLER
|
||||
11839..1183A ; Diacritic # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
|
||||
11A34 ; Diacritic # Mn ZANABAZAR SQUARE SIGN VIRAMA
|
||||
11A47 ; Diacritic # Mn ZANABAZAR SQUARE SUBJOINER
|
||||
11A99 ; Diacritic # Mn SOYOMBO SUBJOINER
|
||||
11C3F ; Diacritic # Mn BHAIKSUKI SIGN VIRAMA
|
||||
11D42 ; Diacritic # Mn MASARAM GONDI SIGN NUKTA
|
||||
11D44..11D45 ; Diacritic # Mn [2] MASARAM GONDI SIGN HALANTA..MASARAM GONDI VIRAMA
|
||||
11D97 ; Diacritic # Mn GUNJALA GONDI VIRAMA
|
||||
16AF0..16AF4 ; Diacritic # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE
|
||||
16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
|
||||
16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8
|
||||
@ -991,7 +1011,7 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
|
||||
1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
|
||||
1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA
|
||||
|
||||
# Total code points: 798
|
||||
# Total code points: 818
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1137,7 +1157,7 @@ E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG
|
||||
# ================================================
|
||||
|
||||
3400..4DB5 ; Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
|
||||
4E00..9FEA ; Unified_Ideograph # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
|
||||
4E00..9FEF ; Unified_Ideograph # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
|
||||
FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
|
||||
FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
|
||||
FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
|
||||
@ -1151,7 +1171,7 @@ FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..C
|
||||
2B820..2CEA1 ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
|
||||
2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
|
||||
|
||||
# Total code points: 87882
|
||||
# Total code points: 87887
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1255,10 +1275,13 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET
|
||||
002E ; Sentence_Terminal # Po FULL STOP
|
||||
003F ; Sentence_Terminal # Po QUESTION MARK
|
||||
0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP
|
||||
061F ; Sentence_Terminal # Po ARABIC QUESTION MARK
|
||||
061E..061F ; Sentence_Terminal # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
|
||||
06D4 ; Sentence_Terminal # Po ARABIC FULL STOP
|
||||
0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
|
||||
07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK
|
||||
0837 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION MELODIC QITSA
|
||||
0839 ; Sentence_Terminal # Po SAMARITAN PUNCTUATION QITSA
|
||||
083D..083E ; Sentence_Terminal # Po [2] SAMARITAN PUNCTUATION SOF MASHFAAT..SAMARITAN PUNCTUATION ANNAAU
|
||||
0964..0965 ; Sentence_Terminal # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
|
||||
104A..104B ; Sentence_Terminal # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION
|
||||
1362 ; Sentence_Terminal # Po ETHIOPIC FULL STOP
|
||||
@ -1296,6 +1319,7 @@ FF0E ; Sentence_Terminal # Po FULLWIDTH FULL STOP
|
||||
FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK
|
||||
FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
|
||||
10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA
|
||||
10F55..10F59 ; Sentence_Terminal # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
|
||||
11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA
|
||||
110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
|
||||
11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
|
||||
@ -1313,14 +1337,16 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
|
||||
11A42..11A43 ; Sentence_Terminal # Po [2] ZANABAZAR SQUARE MARK SHAD..ZANABAZAR SQUARE MARK DOUBLE SHAD
|
||||
11A9B..11A9C ; Sentence_Terminal # Po [2] SOYOMBO MARK SHAD..SOYOMBO MARK DOUBLE SHAD
|
||||
11C41..11C42 ; Sentence_Terminal # Po [2] BHAIKSUKI DANDA..BHAIKSUKI DOUBLE DANDA
|
||||
11EF7..11EF8 ; Sentence_Terminal # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
|
||||
16A6E..16A6F ; Sentence_Terminal # Po [2] MRO DANDA..MRO DOUBLE DANDA
|
||||
16AF5 ; Sentence_Terminal # Po BASSA VAH FULL STOP
|
||||
16B37..16B38 ; Sentence_Terminal # Po [2] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS TSHAB CEEB
|
||||
16B44 ; Sentence_Terminal # Po PAHAWH HMONG SIGN XAUS
|
||||
16E98 ; Sentence_Terminal # Po MEDEFAIDRIN FULL STOP
|
||||
1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
|
||||
1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP
|
||||
|
||||
# Total code points: 128
|
||||
# Total code points: 141
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1521,14 +1547,10 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
|
||||
2B74..2B75 ; Pattern_Syntax # Cn [2] <reserved-2B74>..<reserved-2B75>
|
||||
2B76..2B95 ; Pattern_Syntax # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
|
||||
2B96..2B97 ; Pattern_Syntax # Cn [2] <reserved-2B96>..<reserved-2B97>
|
||||
2B98..2BB9 ; Pattern_Syntax # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
|
||||
2BBA..2BBC ; Pattern_Syntax # Cn [3] <reserved-2BBA>..<reserved-2BBC>
|
||||
2BBD..2BC8 ; Pattern_Syntax # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
||||
2B98..2BC8 ; Pattern_Syntax # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
||||
2BC9 ; Pattern_Syntax # Cn <reserved-2BC9>
|
||||
2BCA..2BD2 ; Pattern_Syntax # So [9] TOP HALF BLACK CIRCLE..GROUP MARK
|
||||
2BD3..2BEB ; Pattern_Syntax # Cn [25] <reserved-2BD3>..<reserved-2BEB>
|
||||
2BEC..2BEF ; Pattern_Syntax # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
|
||||
2BF0..2BFF ; Pattern_Syntax # Cn [16] <reserved-2BF0>..<reserved-2BFF>
|
||||
2BCA..2BFE ; Pattern_Syntax # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
|
||||
2BFF ; Pattern_Syntax # Cn <reserved-2BFF>
|
||||
2E00..2E01 ; Pattern_Syntax # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
|
||||
2E02 ; Pattern_Syntax # Pi LEFT SUBSTITUTION BRACKET
|
||||
2E03 ; Pattern_Syntax # Pf RIGHT SUBSTITUTION BRACKET
|
||||
@ -1566,8 +1588,8 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
|
||||
2E40 ; Pattern_Syntax # Pd DOUBLE HYPHEN
|
||||
2E41 ; Pattern_Syntax # Po REVERSED COMMA
|
||||
2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
|
||||
2E43..2E49 ; Pattern_Syntax # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
|
||||
2E4A..2E7F ; Pattern_Syntax # Cn [54] <reserved-2E4A>..<reserved-2E7F>
|
||||
2E43..2E4E ; Pattern_Syntax # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
|
||||
2E4F..2E7F ; Pattern_Syntax # Cn [49] <reserved-2E4F>..<reserved-2E7F>
|
||||
3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
|
||||
3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
|
||||
3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET
|
||||
@ -1606,8 +1628,9 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT
|
||||
070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK
|
||||
08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH
|
||||
110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN
|
||||
110CD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN ABOVE
|
||||
|
||||
# Total code points: 10
|
||||
# Total code points: 11
|
||||
|
||||
# ================================================
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Scripts-10.0.0.txt
|
||||
# Date: 2017-03-11, 06:40:37 GMT
|
||||
# Copyright (c) 2017 Unicode, Inc.
|
||||
# Scripts-11.0.0.txt
|
||||
# Date: 2018-02-21, 05:34:31 GMT
|
||||
# Copyright (c) 2018 Unicode, Inc.
|
||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
||||
# For terms of use, see http://www.unicode.org/terms_of_use.html
|
||||
#
|
||||
@ -308,10 +308,8 @@
|
||||
2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
|
||||
2B4D..2B73 ; Common # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR
|
||||
2B76..2B95 ; Common # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW
|
||||
2B98..2BB9 ; Common # So [34] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX
|
||||
2BBD..2BC8 ; Common # So [12] BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
||||
2BCA..2BD2 ; Common # So [9] TOP HALF BLACK CIRCLE..GROUP MARK
|
||||
2BEC..2BEF ; Common # So [4] LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS
|
||||
2B98..2BC8 ; Common # So [49] THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED
|
||||
2BCA..2BFE ; Common # So [53] TOP HALF BLACK CIRCLE..REVERSED RIGHT ANGLE
|
||||
2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
|
||||
2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET
|
||||
2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET
|
||||
@ -349,7 +347,7 @@
|
||||
2E40 ; Common # Pd DOUBLE HYPHEN
|
||||
2E41 ; Common # Po REVERSED COMMA
|
||||
2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
|
||||
2E43..2E49 ; Common # Po [7] DASH WITH LEFT UPTURN..DOUBLE STACKED COMMA
|
||||
2E43..2E4E ; Common # Po [12] DASH WITH LEFT UPTURN..PUNCTUS ELEVATUS MARK
|
||||
2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
|
||||
3000 ; Common # Zs IDEOGRAPHIC SPACE
|
||||
3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
|
||||
@ -522,8 +520,9 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
|
||||
1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
|
||||
1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
|
||||
1D1AE..1D1E8 ; Common # So [59] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KIEVAN FLAT SIGN
|
||||
1D2E0..1D2F3 ; Common # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN
|
||||
1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
|
||||
1D360..1D371 ; Common # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
|
||||
1D360..1D378 ; Common # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE
|
||||
1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
|
||||
1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
|
||||
1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
|
||||
@ -565,6 +564,11 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
|
||||
1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
|
||||
1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
|
||||
1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
|
||||
1EC71..1ECAB ; Common # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE
|
||||
1ECAC ; Common # So INDIC SIYAQ PLACEHOLDER
|
||||
1ECAD..1ECAF ; Common # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS
|
||||
1ECB0 ; Common # Sc INDIC SIYAQ RUPEE MARK
|
||||
1ECB1..1ECB4 ; Common # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK
|
||||
1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
|
||||
1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
|
||||
1F0A0..1F0AE ; Common # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES
|
||||
@ -572,8 +576,7 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
|
||||
1F0C1..1F0CF ; Common # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER
|
||||
1F0D1..1F0F5 ; Common # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21
|
||||
1F100..1F10C ; Common # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO
|
||||
1F110..1F12E ; Common # So [31] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED WZ
|
||||
1F130..1F16B ; Common # So [60] SQUARED LATIN CAPITAL LETTER A..RAISED MD SIGN
|
||||
1F110..1F16B ; Common # So [92] PARENTHESIZED LATIN CAPITAL LETTER A..RAISED MD SIGN
|
||||
1F170..1F1AC ; Common # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD
|
||||
1F1E6..1F1FF ; Common # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z
|
||||
1F201..1F202 ; Common # So [2] SQUARED KATAKANA KOKO..SQUARED KATAKANA SA
|
||||
@ -585,9 +588,9 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
|
||||
1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6
|
||||
1F400..1F6D4 ; Common # So [725] RAT..PAGODA
|
||||
1F6E0..1F6EC ; Common # So [13] HAMMER AND WRENCH..AIRPLANE ARRIVING
|
||||
1F6F0..1F6F8 ; Common # So [9] SATELLITE..FLYING SAUCER
|
||||
1F6F0..1F6F9 ; Common # So [10] SATELLITE..SKATEBOARD
|
||||
1F700..1F773 ; Common # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE
|
||||
1F780..1F7D4 ; Common # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR
|
||||
1F780..1F7D8 ; Common # So [89] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NEGATIVE CIRCLED SQUARE
|
||||
1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
|
||||
1F810..1F847 ; Common # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW
|
||||
1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW
|
||||
@ -595,15 +598,18 @@ FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHAR
|
||||
1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS
|
||||
1F900..1F90B ; Common # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT
|
||||
1F910..1F93E ; Common # So [47] ZIPPER-MOUTH FACE..HANDBALL
|
||||
1F940..1F94C ; Common # So [13] WILTED FLOWER..CURLING STONE
|
||||
1F950..1F96B ; Common # So [28] CROISSANT..CANNED FOOD
|
||||
1F980..1F997 ; Common # So [24] CRAB..CRICKET
|
||||
1F9C0 ; Common # So CHEESE WEDGE
|
||||
1F9D0..1F9E6 ; Common # So [23] FACE WITH MONOCLE..SOCKS
|
||||
1F940..1F970 ; Common # So [49] WILTED FLOWER..SMILING FACE WITH SMILING EYES AND THREE HEARTS
|
||||
1F973..1F976 ; Common # So [4] FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE
|
||||
1F97A ; Common # So FACE WITH PLEADING EYES
|
||||
1F97C..1F9A2 ; Common # So [39] LAB COAT..SWAN
|
||||
1F9B0..1F9B9 ; Common # So [10] EMOJI COMPONENT RED HAIR..SUPERVILLAIN
|
||||
1F9C0..1F9C2 ; Common # So [3] CHEESE WEDGE..SALT SHAKER
|
||||
1F9D0..1F9FF ; Common # So [48] FACE WITH MONOCLE..NAZAR AMULET
|
||||
1FA60..1FA6D ; Common # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER
|
||||
E0001 ; Common # Cf LANGUAGE TAG
|
||||
E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG
|
||||
|
||||
# Total code points: 7363
|
||||
# Total code points: 7591
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -646,8 +652,7 @@ A770 ; Latin # Lm MODIFIER LETTER US
|
||||
A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
|
||||
A78B..A78E ; Latin # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT
|
||||
A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT
|
||||
A790..A7AE ; Latin # L& [31] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN CAPITAL LETTER SMALL CAPITAL I
|
||||
A7B0..A7B7 ; Latin # L& [8] LATIN CAPITAL LETTER TURNED K..LATIN SMALL LETTER OMEGA
|
||||
A790..A7B9 ; Latin # L& [42] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER U WITH STROKE
|
||||
A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I
|
||||
A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
|
||||
A7FA ; Latin # L& LATIN LETTER SMALL CAPITAL TURNED M
|
||||
@ -659,7 +664,7 @@ FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE S
|
||||
FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
|
||||
FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
|
||||
|
||||
# Total code points: 1350
|
||||
# Total code points: 1353
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -753,13 +758,13 @@ FE2E..FE2F ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBININ
|
||||
0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
|
||||
0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING
|
||||
055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
|
||||
0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
|
||||
0560..0588 ; Armenian # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE
|
||||
058A ; Armenian # Pd ARMENIAN HYPHEN
|
||||
058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN
|
||||
058F ; Armenian # Sc ARMENIAN DRAM SIGN
|
||||
FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
|
||||
|
||||
# Total code points: 93
|
||||
# Total code points: 95
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -773,7 +778,7 @@ FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SM
|
||||
05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA
|
||||
05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN
|
||||
05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
|
||||
05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
|
||||
05EF..05F2 ; Hebrew # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD
|
||||
05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
|
||||
FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ
|
||||
FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA
|
||||
@ -786,7 +791,7 @@ FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER S
|
||||
FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
|
||||
FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
|
||||
|
||||
# Total code points: 133
|
||||
# Total code points: 134
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -823,7 +828,7 @@ FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATU
|
||||
0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
|
||||
08A0..08B4 ; Arabic # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW
|
||||
08B6..08BD ; Arabic # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON
|
||||
08D4..08E1 ; Arabic # Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA
|
||||
08D3..08E1 ; Arabic # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA
|
||||
08E3..08FF ; Arabic # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA
|
||||
FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
|
||||
FBB2..FBC1 ; Arabic # Sk [16] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL SMALL TAH BELOW
|
||||
@ -871,7 +876,7 @@ FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LA
|
||||
1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN
|
||||
1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL
|
||||
|
||||
# Total code points: 1280
|
||||
# Total code points: 1281
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -921,9 +926,10 @@ A8F2..A8F7 ; Devanagari # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVAN
|
||||
A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET
|
||||
A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE
|
||||
A8FC ; Devanagari # Po DEVANAGARI SIGN SIDDHAM
|
||||
A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
|
||||
A8FD..A8FE ; Devanagari # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY
|
||||
A8FF ; Devanagari # Mn DEVANAGARI VOWEL SIGN AY
|
||||
|
||||
# Total code points: 154
|
||||
# Total code points: 156
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -956,8 +962,9 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
|
||||
09FB ; Bengali # Sc BENGALI GANDA MARK
|
||||
09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA
|
||||
09FD ; Bengali # Po BENGALI ABBREVIATION SIGN
|
||||
09FE ; Bengali # Mn BENGALI SANDHI MARK
|
||||
|
||||
# Total code points: 95
|
||||
# Total code points: 96
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -982,8 +989,9 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
|
||||
0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK
|
||||
0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR
|
||||
0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH
|
||||
0A76 ; Gurmukhi # Po GURMUKHI ABBREVIATION SIGN
|
||||
|
||||
# Total code points: 79
|
||||
# Total code points: 80
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1078,6 +1086,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
|
||||
|
||||
0C00 ; Telugu # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
|
||||
0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
|
||||
0C04 ; Telugu # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE
|
||||
0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
|
||||
0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI
|
||||
0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA
|
||||
@ -1095,13 +1104,14 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
|
||||
0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
|
||||
0C7F ; Telugu # So TELUGU SIGN TUUMU
|
||||
|
||||
# Total code points: 96
|
||||
# Total code points: 97
|
||||
|
||||
# ================================================
|
||||
|
||||
0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU
|
||||
0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU
|
||||
0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
|
||||
0C84 ; Kannada # Po KANNADA SIGN SIDDHAM
|
||||
0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
|
||||
0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI
|
||||
0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA
|
||||
@ -1123,7 +1133,7 @@ A8FD ; Devanagari # Lo DEVANAGARI JAIN OM
|
||||
0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
|
||||
0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
|
||||
|
||||
# Total code points: 88
|
||||
# Total code points: 89
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1317,14 +1327,16 @@ AA7E..AA7F ; Myanmar # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETT
|
||||
10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
|
||||
10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN
|
||||
10CD ; Georgian # L& GEORGIAN CAPITAL LETTER AEN
|
||||
10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
|
||||
10D0..10FA ; Georgian # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
|
||||
10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR
|
||||
10FD..10FF ; Georgian # Lo [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
|
||||
10FD..10FF ; Georgian # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN
|
||||
1C90..1CBA ; Georgian # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN
|
||||
1CBD..1CBF ; Georgian # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
|
||||
2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
|
||||
2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN
|
||||
2D2D ; Georgian # L& GEORGIAN SMALL LETTER AEN
|
||||
|
||||
# Total code points: 127
|
||||
# Total code points: 173
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1453,7 +1465,7 @@ AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT
|
||||
1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
|
||||
1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
|
||||
1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN
|
||||
1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
|
||||
1844..1878 ; Mongolian # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS
|
||||
1880..1884 ; Mongolian # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA
|
||||
1885..1886 ; Mongolian # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
|
||||
1887..18A8 ; Mongolian # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA
|
||||
@ -1461,7 +1473,7 @@ AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETT
|
||||
18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA
|
||||
11660..1166C ; Mongolian # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT
|
||||
|
||||
# Total code points: 166
|
||||
# Total code points: 167
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1490,10 +1502,10 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK
|
||||
# ================================================
|
||||
|
||||
02EA..02EB ; Bopomofo # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK
|
||||
3105..312E ; Bopomofo # Lo [42] BOPOMOFO LETTER B..BOPOMOFO LETTER O WITH DOT ABOVE
|
||||
3105..312F ; Bopomofo # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN
|
||||
31A0..31BA ; Bopomofo # Lo [27] BOPOMOFO LETTER BU..BOPOMOFO LETTER ZY
|
||||
|
||||
# Total code points: 71
|
||||
# Total code points: 72
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1506,7 +1518,7 @@ FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAK
|
||||
3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
|
||||
303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK
|
||||
3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
|
||||
4E00..9FEA ; Han # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA
|
||||
4E00..9FEF ; Han # Lo [20976] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEF
|
||||
F900..FA6D ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
|
||||
FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
|
||||
20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
|
||||
@ -1516,7 +1528,7 @@ FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILI
|
||||
2CEB0..2EBE0 ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
|
||||
2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
|
||||
|
||||
# Total code points: 89228
|
||||
# Total code points: 89233
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1579,13 +1591,14 @@ FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
|
||||
FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON BELOW
|
||||
101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
|
||||
102E0 ; Inherited # Mn COPTIC EPACT THOUSANDS MARK
|
||||
1133B ; Inherited # Mn COMBINING BINDU BELOW
|
||||
1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
|
||||
1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
|
||||
1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
|
||||
1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
|
||||
E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
|
||||
|
||||
# Total code points: 568
|
||||
# Total code points: 569
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1778,13 +1791,13 @@ A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI
|
||||
10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
|
||||
10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
|
||||
10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
|
||||
10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
|
||||
10A19..10A35 ; Kharoshthi # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA
|
||||
10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
|
||||
10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA
|
||||
10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
|
||||
10A40..10A48 ; Kharoshthi # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF
|
||||
10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
|
||||
|
||||
# Total code points: 65
|
||||
# Total code points: 68
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -1841,8 +1854,10 @@ A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOU
|
||||
07F6 ; Nko # So NKO SYMBOL OO DENNEN
|
||||
07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
|
||||
07FA ; Nko # Lm NKO LAJANYALAN
|
||||
07FD ; Nko # Mn NKO DANTAYALAN
|
||||
07FE..07FF ; Nko # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN
|
||||
|
||||
# Total code points: 59
|
||||
# Total code points: 62
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -2137,8 +2152,9 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN
|
||||
110BD ; Kaithi # Cf KAITHI NUMBER SIGN
|
||||
110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
|
||||
110CD ; Kaithi # Cf KAITHI NUMBER SIGN ABOVE
|
||||
|
||||
# Total code points: 66
|
||||
# Total code points: 67
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -2186,8 +2202,10 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
1112D..11134 ; Chakma # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
|
||||
11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE
|
||||
11140..11143 ; Chakma # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK
|
||||
11144 ; Chakma # Lo CHAKMA LETTER LHAA
|
||||
11145..11146 ; Chakma # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI
|
||||
|
||||
# Total code points: 67
|
||||
# Total code points: 70
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -2224,8 +2242,8 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
111B6..111BE ; Sharada # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O
|
||||
111BF..111C0 ; Sharada # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA
|
||||
111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM
|
||||
111C5..111C9 ; Sharada # Po [5] SHARADA DANDA..SHARADA SANDHI MARK
|
||||
111CA..111CC ; Sharada # Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK
|
||||
111C5..111C8 ; Sharada # Po [4] SHARADA DANDA..SHARADA SEPARATOR
|
||||
111C9..111CC ; Sharada # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK
|
||||
111CD ; Sharada # Po SHARADA SUTRA MARK
|
||||
111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE
|
||||
111DA ; Sharada # Lo SHARADA EKAM
|
||||
@ -2502,7 +2520,7 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
|
||||
# ================================================
|
||||
|
||||
11700..11719 ; Ahom # Lo [26] AHOM LETTER KA..AHOM LETTER JHA
|
||||
11700..1171A ; Ahom # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA
|
||||
1171D..1171F ; Ahom # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA
|
||||
11720..11721 ; Ahom # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
|
||||
11722..11725 ; Ahom # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU
|
||||
@ -2513,7 +2531,7 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
1173C..1173E ; Ahom # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI
|
||||
1173F ; Ahom # So AHOM SYMBOL VI
|
||||
|
||||
# Total code points: 57
|
||||
# Total code points: 58
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -2618,8 +2636,9 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE
|
||||
1145B ; Newa # Po NEWA PLACEHOLDER MARK
|
||||
1145D ; Newa # Po NEWA INSERTION SIGN
|
||||
1145E ; Newa # Mn NEWA SANDHI MARK
|
||||
|
||||
# Total code points: 92
|
||||
# Total code points: 93
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -2631,10 +2650,10 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
# ================================================
|
||||
|
||||
16FE0 ; Tangut # Lm TANGUT ITERATION MARK
|
||||
17000..187EC ; Tangut # Lo [6125] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC
|
||||
17000..187F1 ; Tangut # Lo [6130] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F1
|
||||
18800..18AF2 ; Tangut # Lo [755] TANGUT COMPONENT-001..TANGUT COMPONENT-755
|
||||
|
||||
# Total code points: 6881
|
||||
# Total code points: 6886
|
||||
|
||||
# ================================================
|
||||
|
||||
@ -2670,16 +2689,15 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA
|
||||
11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER
|
||||
11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD
|
||||
11A9D ; Soyombo # Lo SOYOMBO MARK PLUTA
|
||||
11A9E..11AA2 ; Soyombo # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2
|
||||
|
||||
# Total code points: 80
|
||||
# Total code points: 81
|
||||
|
||||
# ================================================
|
||||
|
||||
11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A
|
||||
11A01..11A06 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O
|
||||
11A07..11A08 ; Zanabazar_Square # Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU
|
||||
11A09..11A0A ; Zanabazar_Square # Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK
|
||||
11A01..11A0A ; Zanabazar_Square # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK
|
||||
11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA
|
||||
11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA
|
||||
11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA
|
||||
@ -2690,4 +2708,73 @@ ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DI
|
||||
|
||||
# Total code points: 72
|
||||
|
||||
# ================================================
|
||||
|
||||
11800..1182B ; Dogra # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA
|
||||
1182C..1182E ; Dogra # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
|
||||
1182F..11837 ; Dogra # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA
|
||||
11838 ; Dogra # Mc DOGRA SIGN VISARGA
|
||||
11839..1183A ; Dogra # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA
|
||||
1183B ; Dogra # Po DOGRA ABBREVIATION SIGN
|
||||
|
||||
# Total code points: 60
|
||||
|
||||
# ================================================
|
||||
|
||||
11D60..11D65 ; Gunjala_Gondi # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU
|
||||
11D67..11D68 ; Gunjala_Gondi # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI
|
||||
11D6A..11D89 ; Gunjala_Gondi # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA
|
||||
11D8A..11D8E ; Gunjala_Gondi # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU
|
||||
11D90..11D91 ; Gunjala_Gondi # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI
|
||||
11D93..11D94 ; Gunjala_Gondi # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU
|
||||
11D95 ; Gunjala_Gondi # Mn GUNJALA GONDI SIGN ANUSVARA
|
||||
11D96 ; Gunjala_Gondi # Mc GUNJALA GONDI SIGN VISARGA
|
||||
11D97 ; Gunjala_Gondi # Mn GUNJALA GONDI VIRAMA
|
||||
11D98 ; Gunjala_Gondi # Lo GUNJALA GONDI OM
|
||||
11DA0..11DA9 ; Gunjala_Gondi # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE
|
||||
|
||||
# Total code points: 63
|
||||
|
||||
# ================================================
|
||||
|
||||
11EE0..11EF2 ; Makasar # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA
|
||||
11EF3..11EF4 ; Makasar # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U
|
||||
11EF5..11EF6 ; Makasar # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O
|
||||
11EF7..11EF8 ; Makasar # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION
|
||||
|
||||
# Total code points: 25
|
||||
|
||||
# ================================================
|
||||
|
||||
16E40..16E7F ; Medefaidrin # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y
|
||||
16E80..16E96 ; Medefaidrin # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM
|
||||
16E97..16E9A ; Medefaidrin # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH
|
||||
|
||||
# Total code points: 91
|
||||
|
||||
# ================================================
|
||||
|
||||
10D00..10D23 ; Hanifi_Rohingya # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA
|
||||
10D24..10D27 ; Hanifi_Rohingya # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
|
||||
10D30..10D39 ; Hanifi_Rohingya # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE
|
||||
|
||||
# Total code points: 50
|
||||
|
||||
# ================================================
|
||||
|
||||
10F30..10F45 ; Sogdian # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN
|
||||
10F46..10F50 ; Sogdian # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
|
||||
10F51..10F54 ; Sogdian # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED
|
||||
10F55..10F59 ; Sogdian # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
|
||||
|
||||
# Total code points: 42
|
||||
|
||||
# ================================================
|
||||
|
||||
10F00..10F1C ; Old_Sogdian # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL
|
||||
10F1D..10F26 ; Old_Sogdian # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF
|
||||
10F27 ; Old_Sogdian # Lo OLD SOGDIAN LIGATURE AYIN-DALETH
|
||||
|
||||
# Total code points: 40
|
||||
|
||||
# EOF
|
||||
|
@ -1,6 +1,6 @@
|
||||
# SpecialCasing-10.0.0.txt
|
||||
# Date: 2017-04-14, 05:40:43 GMT
|
||||
# Copyright (c) 2017 Unicode, Inc.
|
||||
# SpecialCasing-11.0.0.txt
|
||||
# Date: 2018-02-22, 06:16:47 GMT
|
||||
# Copyright (c) 2018 Unicode, Inc.
|
||||
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
|
||||
# For terms of use, see http://www.unicode.org/terms_of_use.html
|
||||
#
|
||||
@ -121,7 +121,7 @@ FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH
|
||||
|
||||
# The following cases are already in the UnicodeData.txt file, so are only commented here.
|
||||
|
||||
# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI
|
||||
# 0345; 0345; 0399; 0399; # COMBINING GREEK YPOGEGRAMMENI
|
||||
|
||||
# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript)
|
||||
# have special uppercases.
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
# line looking like this:
|
||||
#
|
||||
# make cross_compile_target="aarch64-linux-gnu" BASE_OS=Fedora27
|
||||
# make TARGETS="aarch64-linux-gnu" BASE_OS=Fedora
|
||||
# or
|
||||
# make cross_compile_target="arm-linux-gnueabihf" BASE_OS=Fedora27
|
||||
# make TARGETS="arm-linux-gnueabihf ppc64-linux-gnu" BASE_OS=Fedora BASE_OS_VERSION=17
|
||||
#
|
||||
# to build several devkits for a specific OS version at once.
|
||||
# You can find the final results under ../../build/devkit/result/<host>-to-<target>
|
||||
#
|
||||
# This is the makefile which iterates over all host and target platforms.
|
||||
#
|
||||
@ -52,18 +55,18 @@ os := $(shell uname -o)
|
||||
cpu := $(shell uname -p)
|
||||
|
||||
# Figure out what platform this is building on.
|
||||
me := $(cpu)-$(if $(findstring Linux,$(os)),unknown-linux-gnu)
|
||||
me := $(cpu)-$(if $(findstring Linux,$(os)),linux-gnu)
|
||||
|
||||
$(info Building on platform $(me))
|
||||
|
||||
#
|
||||
# By default just build for the current platform, which is assumed to be Linux
|
||||
#
|
||||
ifeq ($(cross_compile_target), )
|
||||
ifeq ($(TARGETS), )
|
||||
platforms := $(me)
|
||||
host_platforms := $(platforms)
|
||||
else
|
||||
platforms := $(cross_compile_target)
|
||||
platforms := $(TARGETS)
|
||||
host_platforms := $(me)
|
||||
endif
|
||||
target_platforms := $(platforms)
|
||||
@ -79,37 +82,37 @@ endif
|
||||
OUTPUT_ROOT = $(abspath ../../build/devkit)
|
||||
RESULT = $(OUTPUT_ROOT)/result
|
||||
|
||||
submakevars = HOST=$@ BUILD=$(me) \
|
||||
RESULT=$(RESULT) PREFIX=$(RESULT)/$@ \
|
||||
OUTPUT_ROOT=$(OUTPUT_ROOT)
|
||||
submakevars = HOST=$@ BUILD=$(me) RESULT=$(RESULT) OUTPUT_ROOT=$(OUTPUT_ROOT)
|
||||
|
||||
$(host_platforms) :
|
||||
@echo 'Building compilers for $@'
|
||||
@echo 'Targets: $(target_platforms)'
|
||||
for p in $(filter $@, $(target_platforms)) $(filter-out $@, $(target_platforms)); do \
|
||||
$(MAKE) -f Tools.gmk download-rpms $(submakevars) TARGET=$$p && \
|
||||
$(MAKE) -f Tools.gmk download-rpms $(submakevars) \
|
||||
TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \
|
||||
$(MAKE) -f Tools.gmk all $(submakevars) \
|
||||
TARGET=$$p || exit 1 ; \
|
||||
TARGET=$$p PREFIX=$(RESULT)/$@-to-$$p && \
|
||||
$(MAKE) -f Tools.gmk ccache $(submakevars) \
|
||||
TARGET=$@ PREFIX=$(RESULT)/$@-to-$$p BUILDDIR=$(OUTPUT_ROOT)/$@/$$p || exit 1 ; \
|
||||
done
|
||||
@echo 'Building ccache program for $@'
|
||||
$(MAKE) -f Tools.gmk ccache $(submakevars) TARGET=$@
|
||||
@echo 'All done"'
|
||||
|
||||
today := $(shell date +%Y%m%d)
|
||||
|
||||
define Mktar
|
||||
$(1)_tar = $$(RESULT)/sdk-$(1)-$$(today).tar.gz
|
||||
$$($(1)_tar) : PLATFORM = $(1)
|
||||
TARFILES += $$($(1)_tar)
|
||||
$$($(1)_tar) : $(1) $$(shell find $$(RESULT)/$(1))
|
||||
$(1)-to-$(2)_tar = $$(RESULT)/sdk-$(1)-to-$(2)-$$(today).tar.gz
|
||||
$$($(1)-to-$(2)_tar) : PLATFORM = $(1)-to-$(2)
|
||||
TARFILES += $$($(1)-to-$(2)_tar)
|
||||
$$($(1)-to-$(2)_tar) : $$(shell find $$(RESULT)/$(1)-to-$(2) -type f)
|
||||
endef
|
||||
|
||||
$(foreach p,$(host_platforms),$(eval $(call Mktar,$(p))))
|
||||
$(foreach p,$(host_platforms),$(foreach t,$(target_platforms),$(eval $(call Mktar,$(p),$(t)))))
|
||||
|
||||
tars : all $(TARFILES)
|
||||
onlytars : $(TARFILES)
|
||||
%.tar.gz :
|
||||
@echo 'Creating compiler package $@'
|
||||
cd $(RESULT)/$(PLATFORM) && tar -czf $@ *
|
||||
cd $(RESULT) && tar -czf $@ $(PLATFORM)/*
|
||||
touch $@
|
||||
|
||||
clean :
|
||||
|
@ -52,16 +52,25 @@ endif
|
||||
$(info ARCH=$(ARCH))
|
||||
|
||||
ifeq ($(BASE_OS), OEL6)
|
||||
OEL_URL := http://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/
|
||||
BASE_URL := http://yum.oracle.com/repo/OracleLinux/OL6/4/base/$(ARCH)/
|
||||
LINUX_VERSION := OEL6.4
|
||||
else ifeq ($(BASE_OS), Fedora27)
|
||||
ifeq ($(ARCH), aarch64)
|
||||
FEDORA_TYPE=fedora-secondary
|
||||
else
|
||||
FEDORA_TYPE=fedora/linux
|
||||
else ifeq ($(BASE_OS), Fedora)
|
||||
DEFAULT_OS_VERSION := 27
|
||||
ifeq ($(BASE_OS_VERSION), )
|
||||
BASE_OS_VERSION := $(DEFAULT_OS_VERSION)
|
||||
endif
|
||||
OEL_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/27/Everything/$(ARCH)/os/Packages/
|
||||
LINUX_VERSION := Fedora 27
|
||||
ifeq ($(filter x86_64 armhfp, $(ARCH)), )
|
||||
FEDORA_TYPE := fedora-secondary
|
||||
else
|
||||
FEDORA_TYPE := fedora/linux
|
||||
endif
|
||||
ARCHIVED := $(shell [ $(BASE_OS_VERSION) -lt $(DEFAULT_OS_VERSION) ] && echo true)
|
||||
ifeq ($(ARCHIVED),true)
|
||||
BASE_URL := https://archives.fedoraproject.org/pub/archive/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/
|
||||
else
|
||||
BASE_URL := https://dl.fedoraproject.org/pub/$(FEDORA_TYPE)/releases/$(BASE_OS_VERSION)/Everything/$(ARCH)/os/Packages/
|
||||
endif
|
||||
LINUX_VERSION := Fedora_$(BASE_OS_VERSION)
|
||||
else
|
||||
$(error Unknown base OS $(BASE_OS))
|
||||
endif
|
||||
@ -137,13 +146,11 @@ else
|
||||
endif
|
||||
|
||||
# Define directories
|
||||
RESULT := $(OUTPUT_ROOT)/result
|
||||
BUILDDIR := $(OUTPUT_ROOT)/$(HOST)/$(TARGET)
|
||||
PREFIX := $(RESULT)/$(HOST)
|
||||
TARGETDIR := $(PREFIX)/$(TARGET)
|
||||
SYSROOT := $(TARGETDIR)/sysroot
|
||||
DOWNLOAD := $(OUTPUT_ROOT)/download
|
||||
DOWNLOAD_RPMS := $(DOWNLOAD)/rpms
|
||||
DOWNLOAD_RPMS := $(DOWNLOAD)/rpms/$(TARGET)-$(LINUX_VERSION)
|
||||
SRCDIR := $(OUTPUT_ROOT)/src
|
||||
|
||||
# Marker file for unpacking rpms
|
||||
@ -159,7 +166,7 @@ download-rpms:
|
||||
# Only run this if rpm dir is empty.
|
||||
ifeq ($(wildcard $(DOWNLOAD_RPMS)/*.rpm), )
|
||||
cd $(DOWNLOAD_RPMS) && \
|
||||
wget -r -np -nd $(patsubst %, -A "*%*.rpm", $(RPM_LIST)) $(OEL_URL)
|
||||
wget -r -np -nd $(patsubst %, -A "*%*.rpm", $(RPM_LIST)) $(BASE_URL)
|
||||
endif
|
||||
|
||||
##########################################################################################
|
||||
@ -190,8 +197,8 @@ $(foreach p,GCC BINUTILS CCACHE MPFR GMP MPC GDB,$(eval $(call Download,$(p))))
|
||||
##########################################################################################
|
||||
# Unpack RPMS
|
||||
|
||||
RPM_ARCHS := $(ARCH) noarch
|
||||
ifeq ($(ARCH),x86_64)
|
||||
RPM_ARCHS := x86_64 noarch
|
||||
ifeq ($(BUILD),$(HOST))
|
||||
ifeq ($(TARGET),$(HOST))
|
||||
# When building the native compiler for x86_64, enable mixed mode.
|
||||
@ -199,11 +206,9 @@ ifeq ($(ARCH),x86_64)
|
||||
endif
|
||||
endif
|
||||
else ifeq ($(ARCH),i686)
|
||||
RPM_ARCHS := i386 i686 noarch
|
||||
RPM_ARCHS += i386
|
||||
else ifeq ($(ARCH), armhfp)
|
||||
RPM_ARCHS := $(ARCH) armv7hl noarch
|
||||
else
|
||||
RPM_ARCHS := $(ARCH) noarch
|
||||
RPM_ARCHS += armv7hl
|
||||
endif
|
||||
|
||||
RPM_FILE_LIST := $(sort $(foreach a, $(RPM_ARCHS), \
|
||||
@ -277,7 +282,7 @@ CONFIG = --target=$(TARGET) \
|
||||
--host=$(HOST) --build=$(BUILD) \
|
||||
--prefix=$(PREFIX)
|
||||
|
||||
PATHEXT = $(RESULT)/$(BUILD)/bin:
|
||||
PATHEXT = $(PREFIX)/bin:
|
||||
|
||||
PATHPRE = PATH=$(PATHEXT)$(PATH)
|
||||
NUM_CORES := $(shell cat /proc/cpuinfo | grep -c processor)
|
||||
@ -427,6 +432,11 @@ ifeq ($(ARCH), armhfp)
|
||||
$(BUILDDIR)/$(gcc_ver)/Makefile : CONFIG += --with-float=hard
|
||||
endif
|
||||
|
||||
ifneq ($(filter ppc64 ppc64le s390x, $(ARCH)), )
|
||||
# We only support 64-bit on these platforms anyway
|
||||
CONFIG += --disable-multilib
|
||||
endif
|
||||
|
||||
# Want:
|
||||
# c,c++
|
||||
# shared libs
|
||||
@ -552,7 +562,7 @@ $(TARGETDIR)/%.done : $(BUILDDIR)/%/Makefile
|
||||
|
||||
##########################################################################################
|
||||
|
||||
$(PREFIX)/devkit.info: FRC
|
||||
$(PREFIX)/devkit.info:
|
||||
@echo 'Creating devkit.info in the root of the kit'
|
||||
rm -f $@
|
||||
touch $@
|
||||
@ -611,7 +621,4 @@ all : binutils gcc bfdlib $(PREFIX)/devkit.info $(missing-links) $(SYSROOT_LINKS
|
||||
# this is only built for host. so separate.
|
||||
ccache : $(ccache)
|
||||
|
||||
# Force target
|
||||
FRC:
|
||||
|
||||
.PHONY : gcc all binutils bfdlib link_libs rpms libs sysroot
|
||||
|
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 \
|
||||
#
|
||||
|
||||
LIBAWT_XAWT_EXCLUDES := medialib
|
||||
LIBAWT_XAWT_EXCLUDES := medialib debug
|
||||
|
||||
LIBAWT_XAWT_EXTRA_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 \
|
||||
-processorpath $(BUILDTOOLS_OUTPUTDIR)/jdk.vm.compiler.replacements.verifier.jar \
|
||||
--add-exports jdk.unsupported/sun.misc=ALL-UNNAMED \
|
||||
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED \
|
||||
|
||||
### Copy 3rd party libs
|
||||
$(eval $(call SetupCopyFiles, COPY_GRAALUNIT_LIBS, \
|
||||
@ -81,6 +82,7 @@ ifeq ($(INCLUDE_GRAAL), true)
|
||||
$(SRC_DIR)/org.graalvm.compiler.asm.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.core.amd64.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.core.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.core.jdk9.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.debug.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.graph.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.hotspot.amd64.test/src \
|
||||
@ -92,6 +94,9 @@ ifeq ($(INCLUDE_GRAAL), true)
|
||||
$(SRC_DIR)/org.graalvm.compiler.nodes.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.options.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.phases.common.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.replacements.jdk12.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.replacements.jdk9.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.replacements.jdk9_11.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.replacements.test/src \
|
||||
$(SRC_DIR)/org.graalvm.compiler.test/src \
|
||||
$(SRC_DIR)/org.graalvm.util.test/src \
|
||||
|
@ -317,29 +317,6 @@ namespace ext
|
||||
enum operation { uxtb, uxth, uxtw, uxtx, sxtb, sxth, sxtw, sxtx };
|
||||
};
|
||||
|
||||
// abs methods which cannot overflow and so are well-defined across
|
||||
// the entire domain of integer types.
|
||||
static inline unsigned int uabs(unsigned int n) {
|
||||
union {
|
||||
unsigned int result;
|
||||
int value;
|
||||
};
|
||||
result = n;
|
||||
if (value < 0) result = -result;
|
||||
return result;
|
||||
}
|
||||
static inline unsigned long uabs(unsigned long n) {
|
||||
union {
|
||||
unsigned long result;
|
||||
long value;
|
||||
};
|
||||
result = n;
|
||||
if (value < 0) result = -result;
|
||||
return result;
|
||||
}
|
||||
static inline unsigned long uabs(long n) { return uabs((unsigned long)n); }
|
||||
static inline unsigned long uabs(int n) { return uabs((unsigned int)n); }
|
||||
|
||||
// Addressing modes
|
||||
class Address {
|
||||
public:
|
||||
|
@ -82,11 +82,12 @@ uint64_t InterpreterRuntime::normalize_fast_native_fingerprint(uint64_t fingerpr
|
||||
// For ARM, the fast signature handler only needs to know whether
|
||||
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
|
||||
// be distinguished from each other and all other return values
|
||||
// behave like integers with respect to the handler.
|
||||
// behave like integers with respect to the handler except T_BOOLEAN
|
||||
// which must be mapped to the range 0..1.
|
||||
bool unbox = (ret_type == T_OBJECT) || (ret_type == T_ARRAY);
|
||||
if (unbox) {
|
||||
ret_type = T_OBJECT;
|
||||
} else {
|
||||
} else if (ret_type != T_BOOLEAN) {
|
||||
ret_type = T_INT;
|
||||
}
|
||||
result |= ((uint64_t) ret_type) << shift;
|
||||
@ -226,9 +227,6 @@ void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprin
|
||||
|
||||
address result_handler = Interpreter::result_handler(result_type);
|
||||
|
||||
// Check that result handlers are not real handler on ARM (0 or -1).
|
||||
// This ensures the signature handlers do not need symbolic information.
|
||||
assert((result_handler == NULL)||(result_handler==(address)0xffffffff),"");
|
||||
__ mov_slow(R0, (intptr_t)result_handler);
|
||||
|
||||
__ ret();
|
||||
|
@ -941,6 +941,12 @@ void MacroAssembler::_verify_oop_addr(Address addr, const char* s, const char* f
|
||||
bind(done);
|
||||
}
|
||||
|
||||
void MacroAssembler::c2bool(Register x)
|
||||
{
|
||||
tst(x, 0xff); // Only look at the lowest byte
|
||||
mov(x, 1, ne);
|
||||
}
|
||||
|
||||
void MacroAssembler::null_check(Register reg, Register tmp, int offset) {
|
||||
if (needs_explicit_null_check(offset)) {
|
||||
assert_different_registers(reg, tmp);
|
||||
|
@ -853,6 +853,8 @@ public:
|
||||
sub(dst, r1, AsmOperand(r2, lsl, shift));
|
||||
}
|
||||
|
||||
// C 'boolean' to Java boolean: x == 0 ? 0 : 1
|
||||
void c2bool(Register x);
|
||||
|
||||
// klass oop manipulations if compressed
|
||||
|
||||
|
@ -1211,6 +1211,11 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
__ restore_default_fp_mode();
|
||||
}
|
||||
|
||||
// Ensure a Boolean result is mapped to 0..1
|
||||
if (ret_type == T_BOOLEAN) {
|
||||
__ c2bool(R0);
|
||||
}
|
||||
|
||||
// Do a safepoint check while thread is in transition state
|
||||
InlinedAddress safepoint_state(SafepointSynchronize::address_of_state());
|
||||
Label call_safepoint_runtime, return_to_java;
|
||||
|
@ -316,13 +316,27 @@ address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, i
|
||||
}
|
||||
|
||||
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
|
||||
// Result handlers are not used on 32-bit ARM
|
||||
// since the returned value is already in appropriate format.
|
||||
__ should_not_reach_here(); // to avoid empty code block
|
||||
address entry = __ pc();
|
||||
|
||||
// The result handler non-zero indicates an object is returned and this is
|
||||
// used in the native entry code.
|
||||
return type == T_OBJECT ? (address)(-1) : NULL;
|
||||
switch (type) {
|
||||
case T_CHAR : /* Nothing to do */ break;
|
||||
case T_BYTE : /* Nothing to do */ break;
|
||||
case T_SHORT : /* Nothing to do */ break;
|
||||
case T_INT : /* Nothing to do */ break;
|
||||
case T_LONG : /* Nothing to do */ break;
|
||||
case T_VOID : /* Nothing to do */ break;
|
||||
case T_DOUBLE : /* Nothing to do */ break;
|
||||
case T_FLOAT : /* Nothing to do */ break;
|
||||
case T_BOOLEAN : __ c2bool(R0); break;
|
||||
case T_OBJECT :
|
||||
__ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize));
|
||||
__ verify_oop(R0);
|
||||
break;
|
||||
default : __ should_not_reach_here(); break;
|
||||
}
|
||||
|
||||
__ ret();
|
||||
return entry;
|
||||
}
|
||||
|
||||
address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
|
||||
@ -985,8 +999,9 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
// Unbox oop result, e.g. JNIHandles::resolve result if it's an oop.
|
||||
{
|
||||
Label Lnot_oop;
|
||||
// For ARM32, Rresult_handler is -1 for oop result, 0 otherwise.
|
||||
__ cbz(Rresult_handler, Lnot_oop);
|
||||
__ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT));
|
||||
__ cmp(Rtemp, Rresult_handler);
|
||||
__ b(Lnot_oop, ne);
|
||||
Register value = Rsaved_result_lo;
|
||||
__ resolve_jobject(value, // value
|
||||
Rtemp, // tmp1
|
||||
@ -1028,10 +1043,9 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
// not properly paired (was bug - gri 11/22/99).
|
||||
__ notify_method_exit(vtos, InterpreterMacroAssembler::NotifyJVMTI, true, Rsaved_result_lo, Rsaved_result_hi, saved_result_fp);
|
||||
|
||||
// Restore the result. Oop result is restored from the stack.
|
||||
__ cmp(Rresult_handler, 0);
|
||||
__ ldr(R0, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne);
|
||||
__ mov(R0, Rsaved_result_lo, eq);
|
||||
// Restore the result. Oop result is restored from the stack by the
|
||||
// result handler.
|
||||
__ mov(R0, Rsaved_result_lo);
|
||||
__ mov(R1, Rsaved_result_hi);
|
||||
|
||||
#ifdef __ABI_HARD__
|
||||
@ -1039,15 +1053,7 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
__ fcpyd(D0, D8);
|
||||
#endif // __ABI_HARD__
|
||||
|
||||
#ifdef ASSERT
|
||||
if (VerifyOops) {
|
||||
Label L;
|
||||
__ cmp(Rresult_handler, 0);
|
||||
__ b(L, eq);
|
||||
__ verify_oop(R0);
|
||||
__ bind(L);
|
||||
}
|
||||
#endif // ASSERT
|
||||
__ blx(Rresult_handler);
|
||||
|
||||
// Restore FP/LR, sender_sp and return
|
||||
__ mov(Rtemp, FP);
|
||||
|
@ -260,6 +260,8 @@ void VM_Version::initialize() {
|
||||
if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {
|
||||
FLAG_SET_DEFAULT(UsePopCountInstruction, true);
|
||||
}
|
||||
} else {
|
||||
FLAG_SET_DEFAULT(UsePopCountInstruction, false);
|
||||
}
|
||||
|
||||
if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
|
||||
@ -294,6 +296,9 @@ void VM_Version::initialize() {
|
||||
Tier3MinInvocationThreshold = 500;
|
||||
}
|
||||
|
||||
UNSUPPORTED_OPTION(TypeProfileLevel);
|
||||
UNSUPPORTED_OPTION(CriticalJNINatives);
|
||||
|
||||
FLAG_SET_DEFAULT(TypeProfileLevel, 0); // unsupported
|
||||
|
||||
// This machine does not allow unaligned memory accesses
|
||||
|
@ -397,6 +397,7 @@ class Assembler : public AbstractAssembler {
|
||||
LWAX_OPCODE = (31u << OPCODE_SHIFT | 341u << XO_21_30_SHIFT), // X-FORM
|
||||
|
||||
CNTLZW_OPCODE = (31u << OPCODE_SHIFT | 26u << XO_21_30_SHIFT), // X-FORM
|
||||
CNTTZW_OPCODE = (31u << OPCODE_SHIFT | 538u << XO_21_30_SHIFT), // X-FORM
|
||||
|
||||
// 64 bit opcode encodings
|
||||
|
||||
@ -428,6 +429,7 @@ class Assembler : public AbstractAssembler {
|
||||
DIVD_OPCODE = (31u << OPCODE_SHIFT | 489u << 1), // XO-FORM
|
||||
|
||||
CNTLZD_OPCODE = (31u << OPCODE_SHIFT | 58u << XO_21_30_SHIFT), // X-FORM
|
||||
CNTTZD_OPCODE = (31u << OPCODE_SHIFT | 570u << XO_21_30_SHIFT), // X-FORM
|
||||
NAND_OPCODE = (31u << OPCODE_SHIFT | 476u << XO_21_30_SHIFT), // X-FORM
|
||||
NOR_OPCODE = (31u << OPCODE_SHIFT | 124u << XO_21_30_SHIFT), // X-FORM
|
||||
|
||||
@ -1500,6 +1502,10 @@ class Assembler : public AbstractAssembler {
|
||||
inline void cntlzw_( Register a, Register s);
|
||||
inline void cntlzd( Register a, Register s);
|
||||
inline void cntlzd_( Register a, Register s);
|
||||
inline void cnttzw( Register a, Register s);
|
||||
inline void cnttzw_( Register a, Register s);
|
||||
inline void cnttzd( Register a, Register s);
|
||||
inline void cnttzd_( Register a, Register s);
|
||||
|
||||
// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions
|
||||
inline void sld( Register a, Register s, Register b);
|
||||
|
@ -235,6 +235,10 @@ inline void Assembler::cntlzw( Register a, Register s) { emit_int3
|
||||
inline void Assembler::cntlzw_( Register a, Register s) { emit_int32(CNTLZW_OPCODE | rta(a) | rs(s) | rc(1)); }
|
||||
inline void Assembler::cntlzd( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(0)); }
|
||||
inline void Assembler::cntlzd_( Register a, Register s) { emit_int32(CNTLZD_OPCODE | rta(a) | rs(s) | rc(1)); }
|
||||
inline void Assembler::cnttzw( Register a, Register s) { emit_int32(CNTTZW_OPCODE | rta(a) | rs(s) | rc(0)); }
|
||||
inline void Assembler::cnttzw_( Register a, Register s) { emit_int32(CNTTZW_OPCODE | rta(a) | rs(s) | rc(1)); }
|
||||
inline void Assembler::cnttzd( Register a, Register s) { emit_int32(CNTTZD_OPCODE | rta(a) | rs(s) | rc(0)); }
|
||||
inline void Assembler::cnttzd_( Register a, Register s) { emit_int32(CNTTZD_OPCODE | rta(a) | rs(s) | rc(1)); }
|
||||
|
||||
// PPC 1, section 3.3.12, Fixed-Point Rotate and Shift Instructions
|
||||
inline void Assembler::sld( Register a, Register s, Register b) { emit_int32(SLD_OPCODE | rta(a) | rs(s) | rb(b) | rc(0)); }
|
||||
|
@ -292,11 +292,11 @@ void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr bas
|
||||
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
|
||||
assert(left != result, "should be different registers");
|
||||
if (is_power_of_2(c + 1)) {
|
||||
__ shift_left(left, log2_intptr(c + 1), result);
|
||||
__ shift_left(left, log2_int(c + 1), result);
|
||||
__ sub(result, left, result);
|
||||
return true;
|
||||
} else if (is_power_of_2(c - 1)) {
|
||||
__ shift_left(left, log2_intptr(c - 1), result);
|
||||
__ shift_left(left, log2_int(c - 1), result);
|
||||
__ add(result, left, result);
|
||||
return true;
|
||||
}
|
||||
|
@ -126,6 +126,9 @@ define_pd_global(bool, ThreadLocalHandshakes, true);
|
||||
product(bool, UseCountLeadingZerosInstructionsPPC64, true, \
|
||||
"Use count leading zeros instructions.") \
|
||||
\
|
||||
product(bool, UseCountTrailingZerosInstructionsPPC64, false, \
|
||||
"Use count trailing zeros instructions.") \
|
||||
\
|
||||
product(bool, UseExtendedLoadAndReserveInstructionsPPC64, false, \
|
||||
"Use extended versions of load-and-reserve instructions.") \
|
||||
\
|
||||
|
@ -1,6 +1,6 @@
|
||||
//
|
||||
// Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2012, 2017 SAP SE. All rights reserved.
|
||||
// Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2012, 2018 SAP SE. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
// This code is free software; you can redistribute it and/or modify it
|
||||
@ -2209,9 +2209,13 @@ const bool Matcher::match_rule_supported(int opcode) {
|
||||
return VM_Version::has_fsqrt();
|
||||
case Op_CountLeadingZerosI:
|
||||
case Op_CountLeadingZerosL:
|
||||
if (!UseCountLeadingZerosInstructionsPPC64)
|
||||
return false;
|
||||
break;
|
||||
case Op_CountTrailingZerosI:
|
||||
case Op_CountTrailingZerosL:
|
||||
if (!UseCountLeadingZerosInstructionsPPC64)
|
||||
if (!UseCountLeadingZerosInstructionsPPC64 &&
|
||||
!UseCountTrailingZerosInstructionsPPC64)
|
||||
return false;
|
||||
break;
|
||||
|
||||
@ -13425,7 +13429,7 @@ instruct countLeadingZerosP(iRegIdst dst, iRegPsrc src) %{
|
||||
|
||||
instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{
|
||||
match(Set dst (CountTrailingZerosI src));
|
||||
predicate(UseCountLeadingZerosInstructionsPPC64);
|
||||
predicate(UseCountLeadingZerosInstructionsPPC64 && !UseCountTrailingZerosInstructionsPPC64);
|
||||
ins_cost(DEFAULT_COST);
|
||||
|
||||
expand %{
|
||||
@ -13442,9 +13446,22 @@ instruct countTrailingZerosI_Ex(iRegIdst dst, iRegIsrc src) %{
|
||||
%}
|
||||
%}
|
||||
|
||||
instruct countTrailingZerosI_cnttzw(iRegIdst dst, iRegIsrc src) %{
|
||||
match(Set dst (CountTrailingZerosI src));
|
||||
predicate(UseCountTrailingZerosInstructionsPPC64);
|
||||
ins_cost(DEFAULT_COST);
|
||||
|
||||
format %{ "CNTTZW $dst, $src" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ cnttzw($dst$$Register, $src$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct countTrailingZerosL_Ex(iRegIdst dst, iRegLsrc src) %{
|
||||
match(Set dst (CountTrailingZerosL src));
|
||||
predicate(UseCountLeadingZerosInstructionsPPC64);
|
||||
predicate(UseCountLeadingZerosInstructionsPPC64 && !UseCountTrailingZerosInstructionsPPC64);
|
||||
ins_cost(DEFAULT_COST);
|
||||
|
||||
expand %{
|
||||
@ -13460,6 +13477,19 @@ instruct countTrailingZerosL_Ex(iRegIdst dst, iRegLsrc src) %{
|
||||
%}
|
||||
%}
|
||||
|
||||
instruct countTrailingZerosL_cnttzd(iRegIdst dst, iRegLsrc src) %{
|
||||
match(Set dst (CountTrailingZerosL src));
|
||||
predicate(UseCountTrailingZerosInstructionsPPC64);
|
||||
ins_cost(DEFAULT_COST);
|
||||
|
||||
format %{ "CNTTZD $dst, $src" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ cnttzd($dst$$Register, $src$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
// Expand nodes for byte_reverse_int.
|
||||
instruct insrwi_a(iRegIdst dst, iRegIsrc src, immI16 pos, immI16 shift) %{
|
||||
effect(DEF dst, USE src, USE pos, USE shift);
|
||||
|
@ -129,6 +129,17 @@ void VM_Version::initialize() {
|
||||
}
|
||||
}
|
||||
MaxVectorSize = SuperwordUseVSX ? 16 : 8;
|
||||
|
||||
if (PowerArchitecturePPC64 >= 9) {
|
||||
if (FLAG_IS_DEFAULT(UseCountTrailingZerosInstructionsPPC64)) {
|
||||
FLAG_SET_ERGO(bool, UseCountTrailingZerosInstructionsPPC64, true);
|
||||
}
|
||||
} else {
|
||||
if (UseCountTrailingZerosInstructionsPPC64) {
|
||||
warning("UseCountTrailingZerosInstructionsPPC64 specified, but needs at least Power9.");
|
||||
FLAG_SET_DEFAULT(UseCountTrailingZerosInstructionsPPC64, false);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Create and print feature-string.
|
||||
|
@ -227,12 +227,12 @@ bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result,
|
||||
if (tmp->is_valid()) {
|
||||
if (is_power_of_2(c + 1)) {
|
||||
__ move(left, tmp);
|
||||
__ shift_left(left, log2_intptr(c + 1), left);
|
||||
__ shift_left(left, log2_int(c + 1), left);
|
||||
__ sub(left, tmp, result);
|
||||
return true;
|
||||
} else if (is_power_of_2(c - 1)) {
|
||||
__ move(left, tmp);
|
||||
__ shift_left(left, log2_intptr(c - 1), left);
|
||||
__ shift_left(left, log2_int(c - 1), left);
|
||||
__ add(left, tmp, result);
|
||||
return true;
|
||||
}
|
||||
|
@ -502,7 +502,7 @@ void LIR_Assembler::emit_op3(LIR_Op3* op) {
|
||||
__ and3(Rscratch, divisor - 1, Rscratch);
|
||||
}
|
||||
__ add(Rdividend, Rscratch, Rscratch);
|
||||
__ sra(Rscratch, log2_intptr(divisor), Rresult);
|
||||
__ sra(Rscratch, log2_int(divisor), Rresult);
|
||||
return;
|
||||
} else {
|
||||
if (divisor == 2) {
|
||||
|
@ -284,11 +284,11 @@ void LIRGenerator::cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Opr bas
|
||||
bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, int c, LIR_Opr result, LIR_Opr tmp) {
|
||||
assert(left != result, "should be different registers");
|
||||
if (is_power_of_2(c + 1)) {
|
||||
__ shift_left(left, log2_intptr(c + 1), result);
|
||||
__ shift_left(left, log2_int(c + 1), result);
|
||||
__ sub(result, left, result);
|
||||
return true;
|
||||
} else if (is_power_of_2(c - 1)) {
|
||||
__ shift_left(left, log2_intptr(c - 1), result);
|
||||
__ shift_left(left, log2_int(c - 1), result);
|
||||
__ add(result, left, result);
|
||||
return true;
|
||||
}
|
||||
|
@ -2555,7 +2555,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
|
||||
Register dreg = result->as_register();
|
||||
|
||||
if (right->is_constant()) {
|
||||
int divisor = right->as_constant_ptr()->as_jint();
|
||||
jint divisor = right->as_constant_ptr()->as_jint();
|
||||
assert(divisor > 0 && is_power_of_2(divisor), "must be");
|
||||
if (code == lir_idiv) {
|
||||
assert(lreg == rax, "must be rax,");
|
||||
@ -2567,7 +2567,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
|
||||
__ andl(rdx, divisor - 1);
|
||||
__ addl(lreg, rdx);
|
||||
}
|
||||
__ sarl(lreg, log2_intptr(divisor));
|
||||
__ sarl(lreg, log2_jint(divisor));
|
||||
move_regs(lreg, dreg);
|
||||
} else if (code == lir_irem) {
|
||||
Label done;
|
||||
|
@ -244,12 +244,12 @@ bool LIRGenerator::strength_reduce_multiply(LIR_Opr left, jint c, LIR_Opr result
|
||||
if (tmp->is_valid() && c > 0 && c < max_jint) {
|
||||
if (is_power_of_2(c + 1)) {
|
||||
__ move(left, tmp);
|
||||
__ shift_left(left, log2_intptr(c + 1), left);
|
||||
__ shift_left(left, log2_jint(c + 1), left);
|
||||
__ sub(left, tmp, result);
|
||||
return true;
|
||||
} else if (is_power_of_2(c - 1)) {
|
||||
__ move(left, tmp);
|
||||
__ shift_left(left, log2_intptr(c - 1), left);
|
||||
__ shift_left(left, log2_jint(c - 1), left);
|
||||
__ add(left, tmp, result);
|
||||
return true;
|
||||
}
|
||||
|
@ -984,44 +984,50 @@ void VM_Version::get_processor_features() {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if COMPILER2_OR_JVMCI
|
||||
if (MaxVectorSize > 0) {
|
||||
int max_vector_size = 0;
|
||||
if (UseSSE < 2) {
|
||||
// Vectors (in XMM) are only supported with SSE2+
|
||||
// SSE is always 2 on x64.
|
||||
max_vector_size = 0;
|
||||
} else if (UseAVX == 0 || !os_supports_avx_vectors()) {
|
||||
// 16 byte vectors (in XMM) are supported with SSE2+
|
||||
max_vector_size = 16;
|
||||
} else if (UseAVX == 1 || UseAVX == 2) {
|
||||
// 32 bytes vectors (in YMM) are only supported with AVX+
|
||||
max_vector_size = 32;
|
||||
} else if (UseAVX > 2 ) {
|
||||
// 64 bytes vectors (in ZMM) are only supported with AVX 3
|
||||
max_vector_size = 64;
|
||||
}
|
||||
|
||||
#ifdef _LP64
|
||||
int min_vector_size = 4; // We require MaxVectorSize to be at least 4 on 64bit
|
||||
#else
|
||||
int min_vector_size = 0;
|
||||
#endif
|
||||
|
||||
if (!FLAG_IS_DEFAULT(MaxVectorSize)) {
|
||||
if (MaxVectorSize < min_vector_size) {
|
||||
warning("MaxVectorSize must be at least %i on this platform", min_vector_size);
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, min_vector_size);
|
||||
}
|
||||
if (MaxVectorSize > max_vector_size) {
|
||||
warning("MaxVectorSize must be at most %i on this platform", max_vector_size);
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
|
||||
}
|
||||
if (!is_power_of_2(MaxVectorSize)) {
|
||||
warning("MaxVectorSize must be a power of 2");
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, 64);
|
||||
}
|
||||
if (UseSSE < 2) {
|
||||
// Vectors (in XMM) are only supported with SSE2+
|
||||
if (MaxVectorSize > 0) {
|
||||
if (!FLAG_IS_DEFAULT(MaxVectorSize))
|
||||
warning("MaxVectorSize must be 0");
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, 0);
|
||||
}
|
||||
}
|
||||
else if (UseAVX == 0 || !os_supports_avx_vectors()) {
|
||||
// 32 bytes vectors (in YMM) are only supported with AVX+
|
||||
if (MaxVectorSize > 16) {
|
||||
if (!FLAG_IS_DEFAULT(MaxVectorSize))
|
||||
warning("MaxVectorSize must be <= 16");
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, 16);
|
||||
}
|
||||
}
|
||||
else if (UseAVX == 1 || UseAVX == 2) {
|
||||
// 64 bytes vectors (in ZMM) are only supported with AVX 3
|
||||
if (MaxVectorSize > 32) {
|
||||
if (!FLAG_IS_DEFAULT(MaxVectorSize))
|
||||
warning("MaxVectorSize must be <= 32");
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, 32);
|
||||
}
|
||||
}
|
||||
else if (UseAVX > 2 ) {
|
||||
if (MaxVectorSize > 64) {
|
||||
if (!FLAG_IS_DEFAULT(MaxVectorSize))
|
||||
warning("MaxVectorSize must be <= 64");
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, 64);
|
||||
}
|
||||
warning("MaxVectorSize must be a power of 2, setting to default: %i", max_vector_size);
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
|
||||
}
|
||||
} else {
|
||||
// If default, use highest supported configuration
|
||||
FLAG_SET_DEFAULT(MaxVectorSize, max_vector_size);
|
||||
}
|
||||
|
||||
#if defined(COMPILER2) && defined(ASSERT)
|
||||
if (MaxVectorSize > 0) {
|
||||
if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) {
|
||||
tty->print_cr("State of YMM registers after signal handle:");
|
||||
int nreg = 2 LP64_ONLY(+2);
|
||||
@ -1034,11 +1040,9 @@ void VM_Version::get_processor_features() {
|
||||
tty->cr();
|
||||
}
|
||||
}
|
||||
#endif // COMPILER2 && ASSERT
|
||||
}
|
||||
#endif // COMPILER2_OR_JVMCI
|
||||
#endif // COMPILER2 && ASSERT
|
||||
|
||||
#ifdef COMPILER2
|
||||
#ifdef _LP64
|
||||
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
|
||||
UseMultiplyToLenIntrinsic = true;
|
||||
@ -1086,8 +1090,8 @@ void VM_Version::get_processor_features() {
|
||||
}
|
||||
FLAG_SET_DEFAULT(UseMulAddIntrinsic, false);
|
||||
}
|
||||
#endif
|
||||
#endif // COMPILER2
|
||||
#endif // _LP64
|
||||
#endif // COMPILER2_OR_JVMCI
|
||||
|
||||
// On new cpus instructions which update whole XMM register should be used
|
||||
// to prevent partial register stall due to dependencies on high half.
|
||||
|
@ -11930,7 +11930,17 @@ instruct testUB_mem_imm(rFlagsReg cr, memory mem, immU8 imm, immI0 zero)
|
||||
match(Set cr (CmpI (AndI (LoadUB mem) imm) zero));
|
||||
|
||||
ins_cost(125);
|
||||
format %{ "testb $mem, $imm" %}
|
||||
format %{ "testb $mem, $imm\t# ubyte" %}
|
||||
ins_encode %{ __ testb($mem$$Address, $imm$$constant); %}
|
||||
ins_pipe(ialu_cr_reg_mem);
|
||||
%}
|
||||
|
||||
instruct testB_mem_imm(rFlagsReg cr, memory mem, immI8 imm, immI0 zero)
|
||||
%{
|
||||
match(Set cr (CmpI (AndI (LoadB mem) imm) zero));
|
||||
|
||||
ins_cost(125);
|
||||
format %{ "testb $mem, $imm\t# byte" %}
|
||||
ins_encode %{ __ testb($mem$$Address, $imm$$constant); %}
|
||||
ins_pipe(ialu_cr_reg_mem);
|
||||
%}
|
||||
|
@ -3532,6 +3532,10 @@ void os::init(void) {
|
||||
// This is called _after_ the global arguments have been parsed.
|
||||
jint os::init_2(void) {
|
||||
|
||||
// This could be set after os::Posix::init() but all platforms
|
||||
// have to set it the same so we have to mirror Solaris.
|
||||
DEBUG_ONLY(os::set_mutex_init_done();)
|
||||
|
||||
os::Posix::init_2();
|
||||
|
||||
if (os::Aix::on_pase()) {
|
||||
|
@ -3167,6 +3167,10 @@ extern "C" {
|
||||
// this is called _after_ the global arguments have been parsed
|
||||
jint os::init_2(void) {
|
||||
|
||||
// This could be set after os::Posix::init() but all platforms
|
||||
// have to set it the same so we have to mirror Solaris.
|
||||
DEBUG_ONLY(os::set_mutex_init_done();)
|
||||
|
||||
os::Posix::init_2();
|
||||
|
||||
// initialize suspend/resume support - must do this before signal_sets_init()
|
||||
|
@ -4957,6 +4957,10 @@ void os::pd_init_container_support() {
|
||||
// this is called _after_ the global arguments have been parsed
|
||||
jint os::init_2(void) {
|
||||
|
||||
// This could be set after os::Posix::init() but all platforms
|
||||
// have to set it the same so we have to mirror Solaris.
|
||||
DEBUG_ONLY(os::set_mutex_init_done();)
|
||||
|
||||
os::Posix::init_2();
|
||||
|
||||
Linux::fast_thread_clock_init();
|
||||
|
@ -37,6 +37,8 @@
|
||||
|
||||
#include <dirent.h>
|
||||
#include <dlfcn.h>
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#include <sys/mman.h>
|
||||
@ -441,6 +443,38 @@ void os::Posix::print_uname_info(outputStream* st) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::Posix::print_umask(outputStream* st, mode_t umsk) {
|
||||
st->print((umsk & S_IRUSR) ? "r" : "-");
|
||||
st->print((umsk & S_IWUSR) ? "w" : "-");
|
||||
st->print((umsk & S_IXUSR) ? "x" : "-");
|
||||
st->print((umsk & S_IRGRP) ? "r" : "-");
|
||||
st->print((umsk & S_IWGRP) ? "w" : "-");
|
||||
st->print((umsk & S_IXGRP) ? "x" : "-");
|
||||
st->print((umsk & S_IROTH) ? "r" : "-");
|
||||
st->print((umsk & S_IWOTH) ? "w" : "-");
|
||||
st->print((umsk & S_IXOTH) ? "x" : "-");
|
||||
}
|
||||
|
||||
void os::Posix::print_user_info(outputStream* st) {
|
||||
unsigned id = (unsigned) ::getuid();
|
||||
st->print("uid : %u ", id);
|
||||
id = (unsigned) ::geteuid();
|
||||
st->print("euid : %u ", id);
|
||||
id = (unsigned) ::getgid();
|
||||
st->print("gid : %u ", id);
|
||||
id = (unsigned) ::getegid();
|
||||
st->print_cr("egid : %u", id);
|
||||
st->cr();
|
||||
|
||||
mode_t umsk = ::umask(0);
|
||||
::umask(umsk);
|
||||
st->print("umask: %04o (", (unsigned) umsk);
|
||||
print_umask(st, umsk);
|
||||
st->print_cr(")");
|
||||
st->cr();
|
||||
}
|
||||
|
||||
|
||||
bool os::get_host_name(char* buf, size_t buflen) {
|
||||
struct utsname name;
|
||||
uname(&name);
|
||||
|
@ -117,6 +117,10 @@ public:
|
||||
// effective gid, or if given uid is root.
|
||||
static bool matches_effective_uid_and_gid_or_root(uid_t uid, gid_t gid);
|
||||
|
||||
static void print_umask(outputStream* st, mode_t umsk);
|
||||
|
||||
static void print_user_info(outputStream* st);
|
||||
|
||||
#ifdef SUPPORTS_CLOCK_MONOTONIC
|
||||
|
||||
static bool supports_monotonic_clock();
|
||||
|
@ -4199,6 +4199,7 @@ jint os::init_2(void) {
|
||||
// initialize synchronization primitives to use either thread or
|
||||
// lwp synchronization (controlled by UseLWPSynchronization)
|
||||
Solaris::synchronization_init();
|
||||
DEBUG_ONLY(os::set_mutex_init_done();)
|
||||
|
||||
if (MaxFDLimit) {
|
||||
// set the number of file descriptors to max. print out error
|
||||
|
@ -1688,7 +1688,13 @@ void os::win32::print_windows_version(outputStream* st) {
|
||||
if (is_workstation) {
|
||||
st->print("10");
|
||||
} else {
|
||||
st->print("Server 2016");
|
||||
// distinguish Windows Server 2016 and 2019 by build number
|
||||
// Windows server 2019 GA 10/2018 build number is 17763
|
||||
if (build_number > 17762) {
|
||||
st->print("Server 2019");
|
||||
} else {
|
||||
st->print("Server 2016");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -4030,6 +4036,11 @@ static jint initSock();
|
||||
|
||||
// this is called _after_ the global arguments have been parsed
|
||||
jint os::init_2(void) {
|
||||
|
||||
// This could be set any time but all platforms
|
||||
// have to set it the same so we have to mirror Solaris.
|
||||
DEBUG_ONLY(os::set_mutex_init_done();)
|
||||
|
||||
// Setup Windows Exceptions
|
||||
|
||||
// for debugging float code generation bugs
|
||||
|
@ -210,7 +210,7 @@ void ADLParser::instr_parse(void) {
|
||||
return;
|
||||
}
|
||||
assert(match_rules_cnt < 100," too many match rule clones");
|
||||
char* buf = (char*) malloc(strlen(instr->_ident) + 4);
|
||||
char* buf = (char*) AllocateHeap(strlen(instr->_ident) + 4);
|
||||
sprintf(buf, "%s_%d", instr->_ident, match_rules_cnt++);
|
||||
rule->_result = buf;
|
||||
// Check for commutative operations with tree operands.
|
||||
@ -2858,7 +2858,7 @@ void ADLParser::ins_encode_parse_block(InstructForm& inst) {
|
||||
// Create a new encoding name based on the name of the instruction
|
||||
// definition, which should be unique.
|
||||
const char* prefix = "__ins_encode_";
|
||||
char* ec_name = (char*) malloc(strlen(inst._ident) + strlen(prefix) + 1);
|
||||
char* ec_name = (char*) AllocateHeap(strlen(inst._ident) + strlen(prefix) + 1);
|
||||
sprintf(ec_name, "%s%s", prefix, inst._ident);
|
||||
|
||||
assert(_AD._encode->encClass(ec_name) == NULL, "shouldn't already exist");
|
||||
@ -3328,7 +3328,7 @@ void ADLParser::constant_parse(InstructForm& inst) {
|
||||
// Create a new encoding name based on the name of the instruction
|
||||
// definition, which should be unique.
|
||||
const char* prefix = "__constant_";
|
||||
char* ec_name = (char*) malloc(strlen(inst._ident) + strlen(prefix) + 1);
|
||||
char* ec_name = (char*) AllocateHeap(strlen(inst._ident) + strlen(prefix) + 1);
|
||||
sprintf(ec_name, "%s%s", prefix, inst._ident);
|
||||
|
||||
assert(_AD._encode->encClass(ec_name) == NULL, "shouldn't already exist");
|
||||
@ -4460,7 +4460,7 @@ char* ADLParser::find_cpp_block(const char* description) {
|
||||
if (_AD._adlocation_debug) {
|
||||
char* location = get_line_string(line);
|
||||
char* end_loc = end_line_marker();
|
||||
char* result = (char *)malloc(strlen(location) + strlen(cppBlock) + strlen(end_loc) + 1);
|
||||
char* result = (char *)AllocateHeap(strlen(location) + strlen(cppBlock) + strlen(end_loc) + 1);
|
||||
strcpy(result, location);
|
||||
strcat(result, cppBlock);
|
||||
strcat(result, end_loc);
|
||||
@ -4549,7 +4549,7 @@ char *ADLParser::get_paren_expr(const char *description, bool include_location)
|
||||
// Prepend location descriptor, for debugging.
|
||||
char* location = get_line_string(line);
|
||||
char* end_loc = end_line_marker();
|
||||
char* result = (char *)malloc(strlen(location) + strlen(token2) + strlen(end_loc) + 1);
|
||||
char* result = (char *)AllocateHeap(strlen(location) + strlen(token2) + strlen(end_loc) + 1);
|
||||
strcpy(result, location);
|
||||
strcat(result, token2);
|
||||
strcat(result, end_loc);
|
||||
@ -4647,7 +4647,7 @@ char *ADLParser::get_ident_or_literal_constant(const char* description) {
|
||||
// Grab a constant expression.
|
||||
param = get_paren_expr(description);
|
||||
if (param[0] != '(') {
|
||||
char* buf = (char*) malloc(strlen(param) + 3);
|
||||
char* buf = (char*) AllocateHeap(strlen(param) + 3);
|
||||
sprintf(buf, "(%s)", param);
|
||||
param = buf;
|
||||
}
|
||||
@ -5255,7 +5255,7 @@ void ADLParser::next_line() {
|
||||
char* ADLParser::get_line_string(int linenum) {
|
||||
const char* file = _AD._ADL_file._name;
|
||||
int line = linenum ? linenum : this->linenum();
|
||||
char* location = (char *)malloc(strlen(file) + 100);
|
||||
char* location = (char *)AllocateHeap(strlen(file) + 100);
|
||||
sprintf(location, "\n#line %d \"%s\"\n", line, file);
|
||||
return location;
|
||||
}
|
||||
|
@ -24,6 +24,16 @@
|
||||
|
||||
#include "adlc.hpp"
|
||||
|
||||
void* AllocateHeap(size_t size) {
|
||||
unsigned char* ptr = (unsigned char*) malloc(size);
|
||||
if (ptr == NULL && size != 0) {
|
||||
fprintf(stderr, "Error: Out of memory in ADLC\n"); // logging can cause crash!
|
||||
fflush(stderr);
|
||||
exit(1);
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void* Chunk::operator new(size_t requested_size, size_t length) throw() {
|
||||
return CHeapObj::operator new(requested_size + length);
|
||||
}
|
||||
@ -164,7 +174,7 @@ bool Arena::contains( const void *ptr ) const {
|
||||
// CHeapObj
|
||||
|
||||
void* CHeapObj::operator new(size_t size) throw() {
|
||||
return (void *) malloc(size);
|
||||
return (void *) AllocateHeap(size);
|
||||
}
|
||||
|
||||
void CHeapObj::operator delete(void* p){
|
||||
|
@ -25,6 +25,8 @@
|
||||
#ifndef SHARE_VM_ADLC_ARENA_HPP
|
||||
#define SHARE_VM_ADLC_ARENA_HPP
|
||||
|
||||
void* AllocateHeap(size_t size);
|
||||
|
||||
// All classes in adlc may be derived
|
||||
// from one of the following allocation classes:
|
||||
//
|
||||
@ -42,7 +44,6 @@ class CHeapObj {
|
||||
void* new_array(size_t size);
|
||||
};
|
||||
|
||||
|
||||
// Base class for classes that constitute name spaces.
|
||||
|
||||
class AllStatic {
|
||||
|
@ -40,7 +40,7 @@ const char *NameList::_signal3 = "$$SIGNAL3$$";
|
||||
|
||||
// Constructor and Destructor
|
||||
NameList::NameList() : _cur(0), _max(4), _iter(0), _justReset(true) {
|
||||
_names = (const char**)malloc(_max*sizeof(char*));
|
||||
_names = (const char**) AllocateHeap(_max*sizeof(char*));
|
||||
}
|
||||
NameList::~NameList() {
|
||||
// The following free is a double-free, and crashes the program:
|
||||
|
@ -1354,7 +1354,7 @@ void InstructForm::set_unique_opnds() {
|
||||
// component back to an index and any DEF always goes at 0 so the
|
||||
// length of the array has to be the number of components + 1.
|
||||
_uniq_idx_length = _components.count() + 1;
|
||||
uniq_idx = (uint*) malloc(sizeof(uint) * _uniq_idx_length);
|
||||
uniq_idx = (uint*) AllocateHeap(sizeof(uint) * _uniq_idx_length);
|
||||
for (i = 0; i < _uniq_idx_length; i++) {
|
||||
uniq_idx[i] = i;
|
||||
}
|
||||
@ -3449,7 +3449,7 @@ void MatchNode::build_internalop( ) {
|
||||
rstr = (_rChild) ? ((_rChild->_internalop) ?
|
||||
_rChild->_internalop : _rChild->_opType) : "";
|
||||
len += (int)strlen(lstr) + (int)strlen(rstr);
|
||||
subtree = (char *)malloc(len);
|
||||
subtree = (char *)AllocateHeap(len);
|
||||
sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr);
|
||||
// Hash the subtree string in _internalOps; if a name exists, use it
|
||||
iop = (char *)_AD._internalOps[subtree];
|
||||
@ -3863,7 +3863,7 @@ void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count
|
||||
MatchRule* clone = new MatchRule(_AD, this);
|
||||
// Swap operands of commutative operation
|
||||
((MatchNode*)clone)->swap_commutative_op(true, count);
|
||||
char* buf = (char*) malloc(strlen(instr_ident) + 4);
|
||||
char* buf = (char*) AllocateHeap(strlen(instr_ident) + 4);
|
||||
sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++);
|
||||
clone->_result = buf;
|
||||
|
||||
|
@ -176,6 +176,8 @@ private:
|
||||
virtual bool is_alive() const { return _is_alive(); }
|
||||
virtual bool is_in_use() const { return state() == in_use; }
|
||||
|
||||
virtual bool is_unloading() { return false; }
|
||||
|
||||
address exception_begin() const { return (address) _code + _meta->exception_handler_offset(); }
|
||||
|
||||
virtual const char* name() const { return _name; }
|
||||
|
@ -333,6 +333,17 @@ bool MacroAssembler::uses_implicit_null_check(void* address) {
|
||||
}
|
||||
|
||||
bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
|
||||
// The offset -1 is used (hardcoded) in a number of places in C1 and MacroAssembler
|
||||
// to indicate an unknown offset. For example, TemplateTable::pop_and_check_object(Register r)
|
||||
// calls MacroAssembler::null_check(Register reg, int offset = -1) which gets here
|
||||
// with -1. Another example is GraphBuilder::access_field(...) which uses -1 as placeholder
|
||||
// for offsets to be patched in later. The -1 there means the offset is not yet known
|
||||
// and may lie outside of the zero-trapping page, and thus we need to ensure we're forcing
|
||||
// an explicit null check for -1, even if it may otherwise be in the range
|
||||
// [-cell_header_size, os::vm_page_size).
|
||||
// TODO: Find and replace all relevant uses of -1 with a reasonably named constant.
|
||||
if (offset == -1) return true;
|
||||
|
||||
// Check if offset is outside of [-cell_header_size, os::vm_page_size)
|
||||
return offset < -Universe::heap()->cell_header_size() ||
|
||||
offset >= os::vm_page_size();
|
||||
|
@ -389,8 +389,8 @@ Klass* ClassListParser::load_current_class(TRAPS) {
|
||||
InstanceKlass* ik = InstanceKlass::cast(klass);
|
||||
int id = this->id();
|
||||
SystemDictionaryShared::update_shared_entry(ik, id);
|
||||
InstanceKlass* old = table()->lookup(id);
|
||||
if (old != NULL && old != ik) {
|
||||
InstanceKlass** old_ptr = table()->lookup(id);
|
||||
if (old_ptr != NULL) {
|
||||
error("Duplicated ID %d for class %s", id, _class_name);
|
||||
}
|
||||
table()->add(id, ik);
|
||||
@ -404,11 +404,12 @@ bool ClassListParser::is_loading_from_source() {
|
||||
}
|
||||
|
||||
InstanceKlass* ClassListParser::lookup_class_by_id(int id) {
|
||||
InstanceKlass* klass = table()->lookup(id);
|
||||
if (klass == NULL) {
|
||||
InstanceKlass** klass_ptr = table()->lookup(id);
|
||||
if (klass_ptr == NULL) {
|
||||
error("Class ID %d has not been defined", id);
|
||||
}
|
||||
return klass;
|
||||
assert(*klass_ptr != NULL, "must be");
|
||||
return *klass_ptr;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,30 +27,12 @@
|
||||
|
||||
#include "utilities/exceptions.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
#include "utilities/hashtable.hpp"
|
||||
#include "utilities/growableArray.hpp"
|
||||
#include "utilities/hashtable.inline.hpp"
|
||||
|
||||
class CDSClassInfo;
|
||||
|
||||
// Look up from ID -> InstanceKlass*
|
||||
class ID2KlassTable : public Hashtable<InstanceKlass*, mtClass> {
|
||||
class ID2KlassTable : public KVHashtable<int, InstanceKlass*, mtInternal> {
|
||||
public:
|
||||
ID2KlassTable() : Hashtable<InstanceKlass*, mtClass>(1987, sizeof(HashtableEntry<InstanceKlass*, mtClass>)) { }
|
||||
void add(int id, InstanceKlass* klass) {
|
||||
unsigned int hash = (unsigned int)id;
|
||||
HashtableEntry<InstanceKlass*, mtClass>* entry = new_entry(hash, klass);
|
||||
add_entry(hash_to_index(hash), entry);
|
||||
}
|
||||
|
||||
InstanceKlass* lookup(int id) {
|
||||
unsigned int hash = (unsigned int)id;
|
||||
int index = hash_to_index(id);
|
||||
for (HashtableEntry<InstanceKlass*, mtClass>* e = bucket(index); e != NULL; e = e->next()) {
|
||||
if (e->hash() == hash) {
|
||||
return e->literal();
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
ID2KlassTable() : KVHashtable<int, InstanceKlass*, mtInternal>(1987) {}
|
||||
};
|
||||
|
||||
class ClassListParser : public StackObj {
|
||||
|
@ -484,7 +484,7 @@ void ClassLoaderData::initialize_holder(Handle loader_or_mirror) {
|
||||
// Remove a klass from the _klasses list for scratch_class during redefinition
|
||||
// or parsed class in the case of an error.
|
||||
void ClassLoaderData::remove_class(Klass* scratch_class) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
||||
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||
|
||||
// Adjust global class iterator.
|
||||
ClassLoaderDataGraph::adjust_saved_class(scratch_class);
|
||||
@ -804,7 +804,8 @@ void ClassLoaderData::add_to_deallocate_list(Metadata* m) {
|
||||
|
||||
// Deallocate free metadata on the free list. How useful the PermGen was!
|
||||
void ClassLoaderData::free_deallocate_list() {
|
||||
// Don't need lock, at safepoint
|
||||
// This must be called at a safepoint because it depends on metadata walking at
|
||||
// safepoint cleanup time.
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
||||
assert(!is_unloading(), "only called for ClassLoaderData that are not unloading");
|
||||
if (_deallocate_list == NULL) {
|
||||
@ -844,8 +845,7 @@ void ClassLoaderData::free_deallocate_list() {
|
||||
// classes. The metadata is removed with the unloading metaspace.
|
||||
// There isn't C heap memory allocated for methods, so nothing is done for them.
|
||||
void ClassLoaderData::free_deallocate_list_C_heap_structures() {
|
||||
// Don't need lock, at safepoint
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
||||
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||
assert(is_unloading(), "only called for ClassLoaderData that are unloading");
|
||||
if (_deallocate_list == NULL) {
|
||||
return;
|
||||
|
@ -230,13 +230,6 @@ ClassLoaderData* ClassLoaderDataGraph::add(Handle loader, bool is_unsafe_anonymo
|
||||
return loader_data;
|
||||
}
|
||||
|
||||
void ClassLoaderDataGraph::cld_do(CLDClosure* cl) {
|
||||
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
||||
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
|
||||
cl->do_cld(cld);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
|
||||
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
||||
// Only walk the head until any clds not purged from prior unloading
|
||||
@ -247,6 +240,15 @@ void ClassLoaderDataGraph::cld_unloading_do(CLDClosure* cl) {
|
||||
}
|
||||
}
|
||||
|
||||
// These are functions called by the GC, which require all of the CLDs, including the
|
||||
// unloading ones.
|
||||
void ClassLoaderDataGraph::cld_do(CLDClosure* cl) {
|
||||
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
||||
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
|
||||
cl->do_cld(cld);
|
||||
}
|
||||
}
|
||||
|
||||
void ClassLoaderDataGraph::roots_cld_do(CLDClosure* strong, CLDClosure* weak) {
|
||||
assert_locked_or_safepoint_weak(ClassLoaderDataGraph_lock);
|
||||
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->_next) {
|
||||
@ -286,9 +288,12 @@ class ClassLoaderDataGraphIterator : public StackObj {
|
||||
HandleMark _hm; // clean up handles when this is done.
|
||||
Handle _holder;
|
||||
Thread* _thread;
|
||||
NoSafepointVerifier _nsv; // No safepoints allowed in this scope
|
||||
// unless verifying at a safepoint.
|
||||
|
||||
public:
|
||||
ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head) {
|
||||
ClassLoaderDataGraphIterator() : _next(ClassLoaderDataGraph::_head),
|
||||
_nsv(true, !SafepointSynchronize::is_at_safepoint()) {
|
||||
_thread = Thread::current();
|
||||
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||
}
|
||||
@ -308,10 +313,15 @@ public:
|
||||
}
|
||||
return cld;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
void ClassLoaderDataGraph::loaded_cld_do(CLDClosure* cl) {
|
||||
ClassLoaderDataGraphIterator iter;
|
||||
while (ClassLoaderData* cld = iter.get_next()) {
|
||||
cl->do_cld(cld);
|
||||
}
|
||||
}
|
||||
|
||||
// These functions assume that the caller has locked the ClassLoaderDataGraph_lock
|
||||
// if they are not calling the function from a safepoint.
|
||||
void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
|
||||
@ -572,7 +582,7 @@ void ClassLoaderDataGraph::clean_module_and_package_info() {
|
||||
}
|
||||
|
||||
void ClassLoaderDataGraph::purge() {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint!");
|
||||
assert_locked_or_safepoint(ClassLoaderDataGraph_lock);
|
||||
ClassLoaderData* list = _unloading;
|
||||
_unloading = NULL;
|
||||
ClassLoaderData* next = list;
|
||||
|
@ -73,6 +73,8 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||
static void cld_unloading_do(CLDClosure* cl);
|
||||
static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
|
||||
static void always_strong_cld_do(CLDClosure* cl);
|
||||
// Iteration through CLDG not by GC.
|
||||
static void loaded_cld_do(CLDClosure* cl);
|
||||
// klass do
|
||||
// Walking classes through the ClassLoaderDataGraph include array classes. It also includes
|
||||
// classes that are allocated but not loaded, classes that have errors, and scratch classes
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "classfile/classFileParser.hpp"
|
||||
#include "classfile/classFileStream.hpp"
|
||||
#include "classfile/classListParser.hpp"
|
||||
#include "classfile/classLoader.inline.hpp"
|
||||
#include "classfile/classLoaderExt.hpp"
|
||||
#include "classfile/classLoaderData.inline.hpp"
|
||||
@ -257,7 +256,6 @@ void ClassLoaderExt::finalize_shared_paths_misc_info() {
|
||||
// the "source:" in the class list file (see classListParser.cpp), and can be a directory or
|
||||
// a JAR file.
|
||||
InstanceKlass* ClassLoaderExt::load_class(Symbol* name, const char* path, TRAPS) {
|
||||
|
||||
assert(name != NULL, "invariant");
|
||||
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
|
||||
ResourceMark rm(THREAD);
|
||||
|
@ -515,7 +515,7 @@ public:
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be a safepoint");
|
||||
ResourceMark rm;
|
||||
LoaderInfoScanClosure cl (_show_classes, _verbose);
|
||||
ClassLoaderDataGraph::cld_do(&cl);
|
||||
ClassLoaderDataGraph::loaded_cld_do(&cl);
|
||||
// In non-verbose and non-show-classes mode, attempt to fold the tree.
|
||||
if (_fold) {
|
||||
if (!_verbose && !_show_classes) {
|
||||
|
@ -159,7 +159,7 @@ void ClassLoaderStatsClosure::addEmptyParents(oop cl) {
|
||||
|
||||
void ClassLoaderStatsVMOperation::doit() {
|
||||
ClassLoaderStatsClosure clsc (_out);
|
||||
ClassLoaderDataGraph::cld_do(&clsc);
|
||||
ClassLoaderDataGraph::loaded_cld_do(&clsc);
|
||||
clsc.print();
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
#include "oops/array.hpp"
|
||||
#include "oops/symbol.hpp"
|
||||
#include "utilities/hashtable.hpp"
|
||||
#include "utilities/growableArray.hpp"
|
||||
|
||||
|
||||
template <
|
||||
@ -330,7 +330,7 @@ public:
|
||||
// offset from the CDS base address.
|
||||
|
||||
template <typename V>
|
||||
V read_value_from_compact_hashtable(address base_address, u4 offset) {
|
||||
inline V read_value_from_compact_hashtable(address base_address, u4 offset) {
|
||||
return (V)(base_address + offset);
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,6 @@ Dictionary::~Dictionary() {
|
||||
}
|
||||
assert(number_of_entries() == 0, "should have removed all entries");
|
||||
assert(new_entry_free_list() == NULL, "entry present on Dictionary's free list");
|
||||
free_buckets();
|
||||
}
|
||||
|
||||
DictionaryEntry* Dictionary::new_entry(unsigned int hash, InstanceKlass* klass) {
|
||||
|
@ -204,7 +204,7 @@ bool ModuleEntry::has_reads_list() const {
|
||||
|
||||
// Purge dead module entries out of reads list.
|
||||
void ModuleEntry::purge_reads() {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
||||
assert_locked_or_safepoint(Module_lock);
|
||||
|
||||
if (_must_walk_reads && has_reads_list()) {
|
||||
// This module's _must_walk_reads flag will be reset based
|
||||
@ -245,7 +245,6 @@ void ModuleEntry::module_reads_do(ModuleClosure* f) {
|
||||
}
|
||||
|
||||
void ModuleEntry::delete_reads() {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
||||
delete _reads;
|
||||
_reads = NULL;
|
||||
}
|
||||
@ -319,8 +318,6 @@ ModuleEntryTable::ModuleEntryTable(int table_size)
|
||||
}
|
||||
|
||||
ModuleEntryTable::~ModuleEntryTable() {
|
||||
assert_locked_or_safepoint(Module_lock);
|
||||
|
||||
// Walk through all buckets and all entries in each bucket,
|
||||
// freeing each entry.
|
||||
for (int i = 0; i < table_size(); ++i) {
|
||||
@ -355,7 +352,6 @@ ModuleEntryTable::~ModuleEntryTable() {
|
||||
}
|
||||
assert(number_of_entries() == 0, "should have removed all entries");
|
||||
assert(new_entry_free_list() == NULL, "entry present on ModuleEntryTable's free list");
|
||||
free_buckets();
|
||||
}
|
||||
|
||||
ModuleEntry* ModuleEntryTable::new_entry(unsigned int hash, Handle module_handle,
|
||||
|
@ -125,7 +125,7 @@ void PackageEntry::set_is_exported_allUnnamed() {
|
||||
// get deleted. This prevents the package from illegally transitioning from
|
||||
// exported to non-exported.
|
||||
void PackageEntry::purge_qualified_exports() {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
||||
assert_locked_or_safepoint(Module_lock);
|
||||
if (_must_walk_exports &&
|
||||
_qualified_exports != NULL &&
|
||||
!_qualified_exports->is_empty()) {
|
||||
@ -160,7 +160,6 @@ void PackageEntry::purge_qualified_exports() {
|
||||
}
|
||||
|
||||
void PackageEntry::delete_qualified_exports() {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
||||
if (_qualified_exports != NULL) {
|
||||
delete _qualified_exports;
|
||||
}
|
||||
@ -192,7 +191,6 @@ PackageEntryTable::~PackageEntryTable() {
|
||||
}
|
||||
assert(number_of_entries() == 0, "should have removed all entries");
|
||||
assert(new_entry_free_list() == NULL, "entry present on PackageEntryTable's free list");
|
||||
free_buckets();
|
||||
}
|
||||
|
||||
PackageEntry* PackageEntryTable::new_entry(unsigned int hash, Symbol* name, ModuleEntry* module) {
|
||||
@ -228,29 +226,20 @@ PackageEntry* PackageEntryTable::locked_create_entry_or_null(Symbol* name, Modul
|
||||
}
|
||||
|
||||
PackageEntry* PackageEntryTable::lookup(Symbol* name, ModuleEntry* module) {
|
||||
MutexLocker ml(Module_lock);
|
||||
PackageEntry* p = lookup_only(name);
|
||||
if (p != NULL) {
|
||||
return p;
|
||||
} else {
|
||||
// If not found, add to table. Grab the PackageEntryTable lock first.
|
||||
MutexLocker ml(Module_lock);
|
||||
|
||||
// Since look-up was done lock-free, we need to check if another thread beat
|
||||
// us in the race to insert the package.
|
||||
PackageEntry* test = lookup_only(name);
|
||||
if (test != NULL) {
|
||||
// A race occurred and another thread introduced the package.
|
||||
return test;
|
||||
} else {
|
||||
assert(module != NULL, "module should never be null");
|
||||
PackageEntry* entry = new_entry(compute_hash(name), name, module);
|
||||
add_entry(index_for(name), entry);
|
||||
return entry;
|
||||
}
|
||||
assert(module != NULL, "module should never be null");
|
||||
PackageEntry* entry = new_entry(compute_hash(name), name, module);
|
||||
add_entry(index_for(name), entry);
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
|
||||
PackageEntry* PackageEntryTable::lookup_only(Symbol* name) {
|
||||
MutexLockerEx ml(Module_lock->owned_by_self() ? NULL : Module_lock);
|
||||
int index = index_for(name);
|
||||
for (PackageEntry* p = bucket(index); p != NULL; p = p->next()) {
|
||||
if (p->name()->fast_compare(name) == 0) {
|
||||
@ -296,7 +285,7 @@ void PackageEntry::package_exports_do(ModuleClosure* f) {
|
||||
}
|
||||
|
||||
bool PackageEntry::exported_pending_delete() const {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
|
||||
assert_locked_or_safepoint(Module_lock);
|
||||
return (is_unqual_exported() && _qualified_exports != NULL);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -253,7 +253,7 @@ public:
|
||||
// lookup Package with loader's package entry table, if not found add
|
||||
PackageEntry* lookup(Symbol* name, ModuleEntry* module);
|
||||
|
||||
// Only lookup Package within loader's package entry table. The table read is lock-free.
|
||||
// Only lookup Package within loader's package entry table.
|
||||
PackageEntry* lookup_only(Symbol* Package);
|
||||
|
||||
void verify_javabase_packages(GrowableArray<Symbol*> *pkg_list);
|
||||
|
@ -1807,18 +1807,26 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
|
||||
bool SystemDictionary::do_unloading(GCTimer* gc_timer) {
|
||||
|
||||
bool unloading_occurred;
|
||||
bool is_concurrent = !SafepointSynchronize::is_at_safepoint();
|
||||
{
|
||||
GCTraceTime(Debug, gc, phases) t("ClassLoaderData", gc_timer);
|
||||
|
||||
assert_locked_or_safepoint(ClassLoaderDataGraph_lock); // caller locks.
|
||||
// First, mark for unload all ClassLoaderData referencing a dead class loader.
|
||||
unloading_occurred = ClassLoaderDataGraph::do_unloading();
|
||||
if (unloading_occurred) {
|
||||
MutexLockerEx ml2(is_concurrent ? Module_lock : NULL);
|
||||
JFR_ONLY(Jfr::on_unloading_classes();)
|
||||
MutexLockerEx ml1(is_concurrent ? SystemDictionary_lock : NULL);
|
||||
ClassLoaderDataGraph::clean_module_and_package_info();
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: just return if !unloading_occurred.
|
||||
// Cleanup ResolvedMethodTable even if no unloading occurred.
|
||||
{
|
||||
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
|
||||
ResolvedMethodTable::trigger_cleanup();
|
||||
}
|
||||
|
||||
if (unloading_occurred) {
|
||||
{
|
||||
GCTraceTime(Debug, gc, phases) t("SymbolTable", gc_timer);
|
||||
@ -1827,23 +1835,21 @@ bool SystemDictionary::do_unloading(GCTimer* gc_timer) {
|
||||
}
|
||||
|
||||
{
|
||||
MutexLockerEx ml(is_concurrent ? SystemDictionary_lock : NULL);
|
||||
GCTraceTime(Debug, gc, phases) t("Dictionary", gc_timer);
|
||||
constraints()->purge_loader_constraints();
|
||||
resolution_errors()->purge_resolution_errors();
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
GCTraceTime(Debug, gc, phases) t("ProtectionDomainCacheTable", gc_timer);
|
||||
// Oops referenced by the protection domain cache table may get unreachable independently
|
||||
// of the class loader (eg. cached protection domain oops). So we need to
|
||||
// explicitly unlink them here.
|
||||
_pd_cache_table->trigger_cleanup();
|
||||
}
|
||||
|
||||
{
|
||||
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
|
||||
ResolvedMethodTable::trigger_cleanup();
|
||||
{
|
||||
GCTraceTime(Debug, gc, phases) t("ResolvedMethodTable", gc_timer);
|
||||
// Oops referenced by the protection domain cache table may get unreachable independently
|
||||
// of the class loader (eg. cached protection domain oops). So we need to
|
||||
// explicitly unlink them here.
|
||||
// All protection domain oops are linked to the caller class, so if nothing
|
||||
// unloads, this is not needed.
|
||||
_pd_cache_table->trigger_cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
return unloading_occurred;
|
||||
|
@ -657,7 +657,7 @@ void CodeCache::blobs_do(void f(CodeBlob* nm)) {
|
||||
|
||||
void CodeCache::nmethods_do(void f(nmethod* nm)) {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
NMethodIterator iter;
|
||||
NMethodIterator iter(NMethodIterator::all_blobs);
|
||||
while(iter.next()) {
|
||||
f(iter.method());
|
||||
}
|
||||
@ -665,8 +665,8 @@ void CodeCache::nmethods_do(void f(nmethod* nm)) {
|
||||
|
||||
void CodeCache::metadata_do(void f(Metadata* m)) {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
NMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
iter.method()->metadata_do(f);
|
||||
}
|
||||
AOTLoader::metadata_do(f);
|
||||
@ -684,8 +684,8 @@ int CodeCache::alignment_offset() {
|
||||
void CodeCache::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred) {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
UnloadingScope scope(is_alive);
|
||||
CompiledMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive);
|
||||
while(iter.next()) {
|
||||
iter.method()->do_unloading(unloading_occurred);
|
||||
}
|
||||
}
|
||||
@ -842,8 +842,8 @@ void CodeCache::asserted_non_scavengable_nmethods_do(CodeBlobClosure* f) {
|
||||
|
||||
// Temporarily mark nmethods that are claimed to be on the scavenge list.
|
||||
void CodeCache::mark_scavenge_root_nmethods() {
|
||||
NMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
NMethodIterator iter(NMethodIterator::only_alive);
|
||||
while(iter.next()) {
|
||||
nmethod* nm = iter.method();
|
||||
assert(nm->scavenge_root_not_marked(), "clean state");
|
||||
if (nm->on_scavenge_root_list())
|
||||
@ -854,8 +854,8 @@ void CodeCache::mark_scavenge_root_nmethods() {
|
||||
// If the closure is given, run it on the unlisted nmethods.
|
||||
// Also make sure that the effects of mark_scavenge_root_nmethods is gone.
|
||||
void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
|
||||
NMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
NMethodIterator iter(NMethodIterator::only_alive);
|
||||
while(iter.next()) {
|
||||
nmethod* nm = iter.method();
|
||||
bool call_f = (f_or_null != NULL);
|
||||
assert(nm->scavenge_root_not_marked(), "must be already processed");
|
||||
@ -869,8 +869,8 @@ void CodeCache::verify_perm_nmethods(CodeBlobClosure* f_or_null) {
|
||||
|
||||
void CodeCache::verify_clean_inline_caches() {
|
||||
#ifdef ASSERT
|
||||
NMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
nmethod* nm = iter.method();
|
||||
assert(!nm->is_unloaded(), "Tautology");
|
||||
nm->verify_clean_inline_caches();
|
||||
@ -943,8 +943,8 @@ void CodeCache::increment_unloading_cycle() {
|
||||
void CodeCache::verify_oops() {
|
||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||
VerifyOopClosure voc;
|
||||
NMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
nmethod* nm = iter.method();
|
||||
nm->oops_do(&voc);
|
||||
nm->verify_oop_relocations();
|
||||
@ -1120,16 +1120,16 @@ int CodeCache::number_of_nmethods_with_dependencies() {
|
||||
|
||||
void CodeCache::clear_inline_caches() {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
CompiledMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
iter.method()->clear_inline_caches();
|
||||
}
|
||||
}
|
||||
|
||||
void CodeCache::cleanup_inline_caches() {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
NMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
iter.method()->cleanup_inline_caches(/*clean_all=*/true);
|
||||
}
|
||||
}
|
||||
@ -1199,8 +1199,8 @@ int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
|
||||
}
|
||||
}
|
||||
|
||||
CompiledMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
CompiledMethod* nm = iter.method();
|
||||
if (nm->is_marked_for_deoptimization()) {
|
||||
// ...Already marked in the previous pass; don't count it again.
|
||||
@ -1222,8 +1222,8 @@ int CodeCache::mark_for_evol_deoptimization(InstanceKlass* dependee) {
|
||||
// Deoptimize all methods
|
||||
void CodeCache::mark_all_nmethods_for_deoptimization() {
|
||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||
CompiledMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
CompiledMethod* nm = iter.method();
|
||||
if (!nm->method()->is_method_handle_intrinsic()) {
|
||||
nm->mark_for_deoptimization();
|
||||
@ -1235,8 +1235,8 @@ int CodeCache::mark_for_deoptimization(Method* dependee) {
|
||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||
int number_of_marked_CodeBlobs = 0;
|
||||
|
||||
CompiledMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
CompiledMethod* nm = iter.method();
|
||||
if (nm->is_dependent_on_method(dependee)) {
|
||||
ResourceMark rm;
|
||||
@ -1250,8 +1250,8 @@ int CodeCache::mark_for_deoptimization(Method* dependee) {
|
||||
|
||||
void CodeCache::make_marked_nmethods_not_entrant() {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
CompiledMethodIterator iter;
|
||||
while(iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
CompiledMethod* nm = iter.method();
|
||||
if (nm->is_marked_for_deoptimization() && !nm->is_not_entrant()) {
|
||||
nm->make_not_entrant();
|
||||
@ -1519,7 +1519,7 @@ void CodeCache::print_internals() {
|
||||
int *buckets = NEW_C_HEAP_ARRAY(int, bucketLimit, mtCode);
|
||||
memset(buckets, 0, sizeof(int) * bucketLimit);
|
||||
|
||||
NMethodIterator iter;
|
||||
NMethodIterator iter(NMethodIterator::all_blobs);
|
||||
while(iter.next()) {
|
||||
nmethod* nm = iter.method();
|
||||
if(nm->method() != NULL && nm->is_java_method()) {
|
||||
@ -1659,8 +1659,8 @@ void CodeCache::print_summary(outputStream* st, bool detailed) {
|
||||
void CodeCache::print_codelist(outputStream* st) {
|
||||
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
|
||||
|
||||
CompiledMethodIterator iter;
|
||||
while (iter.next_alive()) {
|
||||
CompiledMethodIterator iter(CompiledMethodIterator::only_alive_and_not_unloading);
|
||||
while (iter.next()) {
|
||||
CompiledMethod* cm = iter.method();
|
||||
ResourceMark rm;
|
||||
char* method_name = cm->method()->name_and_sig_as_C_string();
|
||||
|
@ -334,13 +334,21 @@ class CodeCache : AllStatic {
|
||||
|
||||
// Iterator to iterate over nmethods in the CodeCache.
|
||||
template <class T, class Filter> class CodeBlobIterator : public StackObj {
|
||||
public:
|
||||
enum LivenessFilter { all_blobs, only_alive, only_alive_and_not_unloading };
|
||||
|
||||
private:
|
||||
CodeBlob* _code_blob; // Current CodeBlob
|
||||
GrowableArrayIterator<CodeHeap*> _heap;
|
||||
GrowableArrayIterator<CodeHeap*> _end;
|
||||
bool _only_alive;
|
||||
bool _only_not_unloading;
|
||||
|
||||
public:
|
||||
CodeBlobIterator(T* nm = NULL) {
|
||||
CodeBlobIterator(LivenessFilter filter, T* nm = NULL)
|
||||
: _only_alive(filter == only_alive || filter == only_alive_and_not_unloading),
|
||||
_only_not_unloading(filter == only_alive_and_not_unloading)
|
||||
{
|
||||
if (Filter::heaps() == NULL) {
|
||||
return;
|
||||
}
|
||||
@ -360,29 +368,35 @@ template <class T, class Filter> class CodeBlobIterator : public StackObj {
|
||||
bool next() {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
|
||||
bool result = next_blob();
|
||||
while (!result && _heap != _end) {
|
||||
// Advance to next code heap of segmented code cache
|
||||
if (++_heap == _end) {
|
||||
break;
|
||||
for (;;) {
|
||||
// Walk through heaps as required
|
||||
if (!next_blob()) {
|
||||
if (_heap == _end) {
|
||||
return false;
|
||||
}
|
||||
++_heap;
|
||||
continue;
|
||||
}
|
||||
result = next_blob();
|
||||
}
|
||||
|
||||
return result;
|
||||
// Filter is_alive as required
|
||||
if (_only_alive && !_code_blob->is_alive()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Filter is_unloading as required
|
||||
if (_only_not_unloading) {
|
||||
CompiledMethod* cm = _code_blob->as_compiled_method_or_null();
|
||||
if (cm != NULL && cm->is_unloading()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Advance iterator to next alive blob
|
||||
bool next_alive() {
|
||||
bool result = next();
|
||||
while(result && !_code_blob->is_alive()) {
|
||||
result = next();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool end() const { return _code_blob == NULL; }
|
||||
T* method() const { return (T*)_code_blob; }
|
||||
bool end() const { return _code_blob == NULL; }
|
||||
T* method() const { return (T*)_code_blob; }
|
||||
|
||||
private:
|
||||
|
||||
@ -422,7 +436,6 @@ struct NMethodFilter {
|
||||
static const GrowableArray<CodeHeap*>* heaps() { return CodeCache::nmethod_heaps(); }
|
||||
};
|
||||
|
||||
|
||||
typedef CodeBlobIterator<CompiledMethod, CompiledMethodFilter> CompiledMethodIterator;
|
||||
typedef CodeBlobIterator<nmethod, NMethodFilter> NMethodIterator;
|
||||
|
||||
|
@ -44,11 +44,10 @@ CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType ty
|
||||
bool caller_must_gc_arguments)
|
||||
: CodeBlob(name, type, layout, frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
|
||||
_mark_for_deoptimization_status(not_marked),
|
||||
_is_unloading_state(0),
|
||||
_method(method)
|
||||
_method(method),
|
||||
_gc_data(NULL)
|
||||
{
|
||||
init_defaults();
|
||||
clear_unloading_state();
|
||||
}
|
||||
|
||||
CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType type, int size,
|
||||
@ -57,11 +56,10 @@ CompiledMethod::CompiledMethod(Method* method, const char* name, CompilerType ty
|
||||
: CodeBlob(name, type, CodeBlobLayout((address) this, size, header_size, cb), cb,
|
||||
frame_complete_offset, frame_size, oop_maps, caller_must_gc_arguments),
|
||||
_mark_for_deoptimization_status(not_marked),
|
||||
_is_unloading_state(0),
|
||||
_method(method)
|
||||
_method(method),
|
||||
_gc_data(NULL)
|
||||
{
|
||||
init_defaults();
|
||||
clear_unloading_state();
|
||||
}
|
||||
|
||||
void CompiledMethod::init_defaults() {
|
||||
@ -546,74 +544,6 @@ void CompiledMethod::unload_nmethod_caches(bool unloading_occurred) {
|
||||
DEBUG_ONLY(metadata_do(check_class));
|
||||
}
|
||||
|
||||
// The _is_unloading_state encodes a tuple comprising the unloading cycle
|
||||
// and the result of IsUnloadingBehaviour::is_unloading() fpr that cycle.
|
||||
// This is the bit layout of the _is_unloading_state byte: 00000CCU
|
||||
// CC refers to the cycle, which has 2 bits, and U refers to the result of
|
||||
// IsUnloadingBehaviour::is_unloading() for that unloading cycle.
|
||||
|
||||
class IsUnloadingState: public AllStatic {
|
||||
static const uint8_t _is_unloading_mask = 1;
|
||||
static const uint8_t _is_unloading_shift = 0;
|
||||
static const uint8_t _unloading_cycle_mask = 6;
|
||||
static const uint8_t _unloading_cycle_shift = 1;
|
||||
|
||||
static uint8_t set_is_unloading(uint8_t state, bool value) {
|
||||
state &= ~_is_unloading_mask;
|
||||
if (value) {
|
||||
state |= 1 << _is_unloading_shift;
|
||||
}
|
||||
assert(is_unloading(state) == value, "unexpected unloading cycle overflow");
|
||||
return state;
|
||||
}
|
||||
|
||||
static uint8_t set_unloading_cycle(uint8_t state, uint8_t value) {
|
||||
state &= ~_unloading_cycle_mask;
|
||||
state |= value << _unloading_cycle_shift;
|
||||
assert(unloading_cycle(state) == value, "unexpected unloading cycle overflow");
|
||||
return state;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool is_unloading(uint8_t state) { return (state & _is_unloading_mask) >> _is_unloading_shift == 1; }
|
||||
static uint8_t unloading_cycle(uint8_t state) { return (state & _unloading_cycle_mask) >> _unloading_cycle_shift; }
|
||||
|
||||
static uint8_t create(bool is_unloading, uint8_t unloading_cycle) {
|
||||
uint8_t state = 0;
|
||||
state = set_is_unloading(state, is_unloading);
|
||||
state = set_unloading_cycle(state, unloading_cycle);
|
||||
return state;
|
||||
}
|
||||
};
|
||||
|
||||
bool CompiledMethod::is_unloading() {
|
||||
uint8_t state = RawAccess<MO_RELAXED>::load(&_is_unloading_state);
|
||||
bool state_is_unloading = IsUnloadingState::is_unloading(state);
|
||||
uint8_t state_unloading_cycle = IsUnloadingState::unloading_cycle(state);
|
||||
if (state_is_unloading) {
|
||||
return true;
|
||||
}
|
||||
if (state_unloading_cycle == CodeCache::unloading_cycle()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// The IsUnloadingBehaviour is responsible for checking if there are any dead
|
||||
// oops in the CompiledMethod, by calling oops_do on it.
|
||||
state_unloading_cycle = CodeCache::unloading_cycle();
|
||||
state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
|
||||
|
||||
state = IsUnloadingState::create(state_is_unloading, state_unloading_cycle);
|
||||
|
||||
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
|
||||
|
||||
return state_is_unloading;
|
||||
}
|
||||
|
||||
void CompiledMethod::clear_unloading_state() {
|
||||
uint8_t state = IsUnloadingState::create(false, CodeCache::unloading_cycle());
|
||||
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
|
||||
}
|
||||
|
||||
// Called to clean up after class unloading for live nmethods and from the sweeper
|
||||
// for all methods.
|
||||
void CompiledMethod::cleanup_inline_caches_impl(bool unloading_occurred, bool clean_all) {
|
||||
|
@ -151,8 +151,6 @@ protected:
|
||||
bool _is_far_code; // Code is far from CodeCache.
|
||||
// Have to use far call instructions to call it from code in CodeCache.
|
||||
|
||||
volatile uint8_t _is_unloading_state; // Local state used to keep track of whether unloading is happening or not
|
||||
|
||||
// set during construction
|
||||
unsigned int _has_unsafe_access:1; // May fault due to unsafe access.
|
||||
unsigned int _has_method_handle_invokes:1; // Has this method MethodHandle invokes?
|
||||
@ -171,6 +169,8 @@ protected:
|
||||
PcDescContainer _pc_desc_container;
|
||||
ExceptionCache * volatile _exception_cache;
|
||||
|
||||
void* _gc_data;
|
||||
|
||||
virtual void flush() = 0;
|
||||
protected:
|
||||
CompiledMethod(Method* method, const char* name, CompilerType type, const CodeBlobLayout& layout, int frame_complete_offset, int frame_size, ImmutableOopMapSet* oop_maps, bool caller_must_gc_arguments);
|
||||
@ -179,6 +179,11 @@ protected:
|
||||
public:
|
||||
virtual bool is_compiled() const { return true; }
|
||||
|
||||
template<typename T>
|
||||
T* gc_data() const { return reinterpret_cast<T*>(_gc_data); }
|
||||
template<typename T>
|
||||
void set_gc_data(T* gc_data) { _gc_data = reinterpret_cast<void*>(gc_data); }
|
||||
|
||||
bool has_unsafe_access() const { return _has_unsafe_access; }
|
||||
void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
|
||||
|
||||
@ -390,10 +395,9 @@ public:
|
||||
// GC unloading support
|
||||
// Cleans unloaded klasses and unloaded nmethods in inline caches
|
||||
|
||||
bool is_unloading();
|
||||
virtual bool is_unloading() = 0;
|
||||
|
||||
void unload_nmethod_caches(bool class_unloading_occurred);
|
||||
void clear_unloading_state();
|
||||
virtual void do_unloading(bool unloading_occurred) { }
|
||||
|
||||
private:
|
||||
|
@ -118,13 +118,13 @@ class DependencyContext : public StackObj {
|
||||
// Safepoints are forbidden during DC lifetime. GC can invalidate
|
||||
// _dependency_context_addr if it relocates the holder
|
||||
// (e.g. CallSiteContext Java object).
|
||||
int _safepoint_counter;
|
||||
uint64_t _safepoint_counter;
|
||||
|
||||
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr),
|
||||
_safepoint_counter(SafepointSynchronize::_safepoint_counter) {}
|
||||
_safepoint_counter(SafepointSynchronize::safepoint_counter()) {}
|
||||
|
||||
~DependencyContext() {
|
||||
assert(_safepoint_counter == SafepointSynchronize::_safepoint_counter, "safepoint happened");
|
||||
assert(_safepoint_counter == SafepointSynchronize::safepoint_counter(), "safepoint happened");
|
||||
}
|
||||
#else
|
||||
DependencyContext(intptr_t* addr) : _dependency_context_addr(addr) {}
|
||||
|
@ -565,6 +565,7 @@ nmethod::nmethod(
|
||||
ByteSize basic_lock_sp_offset,
|
||||
OopMapSet* oop_maps )
|
||||
: CompiledMethod(method, "native nmethod", type, nmethod_size, sizeof(nmethod), code_buffer, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps, false),
|
||||
_is_unloading_state(0),
|
||||
_native_receiver_sp_offset(basic_lock_owner_sp_offset),
|
||||
_native_basic_lock_sp_offset(basic_lock_sp_offset)
|
||||
{
|
||||
@ -609,6 +610,7 @@ nmethod::nmethod(
|
||||
code_buffer->copy_code_and_locs_to(this);
|
||||
code_buffer->copy_values_to(this);
|
||||
|
||||
clear_unloading_state();
|
||||
if (ScavengeRootsInCode) {
|
||||
Universe::heap()->register_nmethod(this);
|
||||
}
|
||||
@ -672,6 +674,7 @@ nmethod::nmethod(
|
||||
#endif
|
||||
)
|
||||
: CompiledMethod(method, "nmethod", type, nmethod_size, sizeof(nmethod), code_buffer, offsets->value(CodeOffsets::Frame_Complete), frame_size, oop_maps, false),
|
||||
_is_unloading_state(0),
|
||||
_native_receiver_sp_offset(in_ByteSize(-1)),
|
||||
_native_basic_lock_sp_offset(in_ByteSize(-1))
|
||||
{
|
||||
@ -1016,13 +1019,20 @@ void nmethod::mark_as_seen_on_stack() {
|
||||
// there are no activations on the stack, not in use by the VM,
|
||||
// and not in use by the ServiceThread)
|
||||
bool nmethod::can_convert_to_zombie() {
|
||||
assert(is_not_entrant(), "must be a non-entrant method");
|
||||
// Note that this is called when the sweeper has observed the nmethod to be
|
||||
// not_entrant. However, with concurrent code cache unloading, the state
|
||||
// might have moved on to unloaded if it is_unloading(), due to racing
|
||||
// concurrent GC threads.
|
||||
assert(is_not_entrant() || is_unloading(), "must be a non-entrant method");
|
||||
|
||||
// Since the nmethod sweeper only does partial sweep the sweeper's traversal
|
||||
// count can be greater than the stack traversal count before it hits the
|
||||
// nmethod for the second time.
|
||||
return stack_traversal_mark()+1 < NMethodSweeper::traversal_count() &&
|
||||
!is_locked_by_vm();
|
||||
// If an is_unloading() nmethod is still not_entrant, then it is not safe to
|
||||
// convert it to zombie due to GC unloading interactions. However, if it
|
||||
// has become unloaded, then it is okay to convert such nmethods to zombie.
|
||||
return stack_traversal_mark() + 1 < NMethodSweeper::traversal_count() &&
|
||||
!is_locked_by_vm() && (!is_unloading() || is_unloaded());
|
||||
}
|
||||
|
||||
void nmethod::inc_decompile_count() {
|
||||
@ -1090,8 +1100,6 @@ void nmethod::make_unloaded() {
|
||||
// Unregister must be done before the state change
|
||||
Universe::heap()->unregister_nmethod(this);
|
||||
|
||||
_state = unloaded;
|
||||
|
||||
// Log the unloading.
|
||||
log_state_change();
|
||||
|
||||
@ -1107,6 +1115,13 @@ void nmethod::make_unloaded() {
|
||||
|
||||
set_osr_link(NULL);
|
||||
NMethodSweeper::report_state_change(this);
|
||||
|
||||
// The release is only needed for compile-time ordering, as accesses
|
||||
// into the nmethod after the store are not safe due to the sweeper
|
||||
// being allowed to free it when the store is observed, during
|
||||
// concurrent nmethod unloading. Therefore, there is no need for
|
||||
// acquire on the loader side.
|
||||
OrderAccess::release_store(&_state, (signed char)unloaded);
|
||||
}
|
||||
|
||||
void nmethod::invalidate_osr_method() {
|
||||
@ -1505,6 +1520,74 @@ void nmethod::metadata_do(void f(Metadata*)) {
|
||||
if (_method != NULL) f(_method);
|
||||
}
|
||||
|
||||
// The _is_unloading_state encodes a tuple comprising the unloading cycle
|
||||
// and the result of IsUnloadingBehaviour::is_unloading() fpr that cycle.
|
||||
// This is the bit layout of the _is_unloading_state byte: 00000CCU
|
||||
// CC refers to the cycle, which has 2 bits, and U refers to the result of
|
||||
// IsUnloadingBehaviour::is_unloading() for that unloading cycle.
|
||||
|
||||
class IsUnloadingState: public AllStatic {
|
||||
static const uint8_t _is_unloading_mask = 1;
|
||||
static const uint8_t _is_unloading_shift = 0;
|
||||
static const uint8_t _unloading_cycle_mask = 6;
|
||||
static const uint8_t _unloading_cycle_shift = 1;
|
||||
|
||||
static uint8_t set_is_unloading(uint8_t state, bool value) {
|
||||
state &= ~_is_unloading_mask;
|
||||
if (value) {
|
||||
state |= 1 << _is_unloading_shift;
|
||||
}
|
||||
assert(is_unloading(state) == value, "unexpected unloading cycle overflow");
|
||||
return state;
|
||||
}
|
||||
|
||||
static uint8_t set_unloading_cycle(uint8_t state, uint8_t value) {
|
||||
state &= ~_unloading_cycle_mask;
|
||||
state |= value << _unloading_cycle_shift;
|
||||
assert(unloading_cycle(state) == value, "unexpected unloading cycle overflow");
|
||||
return state;
|
||||
}
|
||||
|
||||
public:
|
||||
static bool is_unloading(uint8_t state) { return (state & _is_unloading_mask) >> _is_unloading_shift == 1; }
|
||||
static uint8_t unloading_cycle(uint8_t state) { return (state & _unloading_cycle_mask) >> _unloading_cycle_shift; }
|
||||
|
||||
static uint8_t create(bool is_unloading, uint8_t unloading_cycle) {
|
||||
uint8_t state = 0;
|
||||
state = set_is_unloading(state, is_unloading);
|
||||
state = set_unloading_cycle(state, unloading_cycle);
|
||||
return state;
|
||||
}
|
||||
};
|
||||
|
||||
bool nmethod::is_unloading() {
|
||||
uint8_t state = RawAccess<MO_RELAXED>::load(&_is_unloading_state);
|
||||
bool state_is_unloading = IsUnloadingState::is_unloading(state);
|
||||
uint8_t state_unloading_cycle = IsUnloadingState::unloading_cycle(state);
|
||||
if (state_is_unloading) {
|
||||
return true;
|
||||
}
|
||||
if (state_unloading_cycle == CodeCache::unloading_cycle()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// The IsUnloadingBehaviour is responsible for checking if there are any dead
|
||||
// oops in the CompiledMethod, by calling oops_do on it.
|
||||
state_unloading_cycle = CodeCache::unloading_cycle();
|
||||
state_is_unloading = IsUnloadingBehaviour::current()->is_unloading(this);
|
||||
|
||||
state = IsUnloadingState::create(state_is_unloading, state_unloading_cycle);
|
||||
|
||||
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
|
||||
|
||||
return state_is_unloading;
|
||||
}
|
||||
|
||||
void nmethod::clear_unloading_state() {
|
||||
uint8_t state = IsUnloadingState::create(false, CodeCache::unloading_cycle());
|
||||
RawAccess<MO_RELAXED>::store(&_is_unloading_state, state);
|
||||
}
|
||||
|
||||
|
||||
// This is called at the end of the strong tracing/marking phase of a
|
||||
// GC to unload an nmethod if it contains otherwise unreachable
|
||||
@ -1842,11 +1925,11 @@ void nmethod::check_all_dependencies(DepChange& changes) {
|
||||
|
||||
// Iterate over live nmethods and check dependencies of all nmethods that are not
|
||||
// marked for deoptimization. A particular dependency is only checked once.
|
||||
NMethodIterator iter;
|
||||
NMethodIterator iter(NMethodIterator::only_alive_and_not_unloading);
|
||||
while(iter.next()) {
|
||||
nmethod* nm = iter.method();
|
||||
// Only notify for live nmethods
|
||||
if (nm->is_alive() && !nm->is_marked_for_deoptimization()) {
|
||||
if (!nm->is_marked_for_deoptimization()) {
|
||||
for (Dependencies::DepStream deps(nm); deps.next(); ) {
|
||||
// Construct abstraction of a dependency.
|
||||
DependencySignature* current_sig = new DependencySignature(deps);
|
||||
@ -2841,7 +2924,7 @@ void nmethod::maybe_invalidate_installed_code() {
|
||||
// Update the values in the InstalledCode instance if it still refers to this nmethod
|
||||
nmethod* nm = (nmethod*)InstalledCode::address(installed_code);
|
||||
if (nm == this) {
|
||||
if (!is_alive()) {
|
||||
if (!is_alive() || is_unloading()) {
|
||||
// Break the link between nmethod and InstalledCode such that the nmethod
|
||||
// can subsequently be flushed safely. The link must be maintained while
|
||||
// the method could have live activations since invalidateInstalledCode
|
||||
@ -2856,7 +2939,7 @@ void nmethod::maybe_invalidate_installed_code() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!is_alive()) {
|
||||
if (!is_alive() || is_unloading()) {
|
||||
// Clear these out after the nmethod has been unregistered and any
|
||||
// updates to the InstalledCode instance have been performed.
|
||||
clear_jvmci_installed_code();
|
||||
@ -2880,7 +2963,7 @@ void nmethod::invalidate_installed_code(Handle installedCode, TRAPS) {
|
||||
{
|
||||
MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
|
||||
// This relationship can only be checked safely under a lock
|
||||
assert(!nm->is_alive() || nm->jvmci_installed_code() == installedCode(), "sanity check");
|
||||
assert(!nm->is_alive() || nm->is_unloading() || nm->jvmci_installed_code() == installedCode(), "sanity check");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -158,6 +158,9 @@ class nmethod : public CompiledMethod {
|
||||
// counter is decreased (by 1) while sweeping.
|
||||
int _hotness_counter;
|
||||
|
||||
// Local state used to keep track of whether unloading is happening or not
|
||||
volatile uint8_t _is_unloading_state;
|
||||
|
||||
// These are used for compiled synchronized native methods to
|
||||
// locate the owner and stack slot for the BasicLock so that we can
|
||||
// properly revoke the bias of the owner if necessary. They are
|
||||
@ -323,6 +326,8 @@ class nmethod : public CompiledMethod {
|
||||
bool is_zombie() const { return _state == zombie; }
|
||||
bool is_unloaded() const { return _state == unloaded; }
|
||||
|
||||
void clear_unloading_state();
|
||||
virtual bool is_unloading();
|
||||
virtual void do_unloading(bool unloading_occurred);
|
||||
|
||||
#if INCLUDE_RTM_OPT
|
||||
|
@ -1946,7 +1946,8 @@ static void codecache_print(outputStream* out, bool detailed) {
|
||||
}
|
||||
}
|
||||
|
||||
void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env) {
|
||||
void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env,
|
||||
int compilable, const char* failure_reason) {
|
||||
if (success) {
|
||||
task->mark_success();
|
||||
if (ci_env != NULL) {
|
||||
@ -1958,6 +1959,13 @@ void CompileBroker::post_compile(CompilerThread* thread, CompileTask* task, bool
|
||||
_compilation_log->log_nmethod(thread, code);
|
||||
}
|
||||
}
|
||||
} else if (AbortVMOnCompilationFailure) {
|
||||
if (compilable == ciEnv::MethodCompilable_not_at_tier) {
|
||||
fatal("Not compilable at tier %d: %s", task->comp_level(), failure_reason);
|
||||
}
|
||||
if (compilable == ciEnv::MethodCompilable_never) {
|
||||
fatal("Never compilable: %s", failure_reason);
|
||||
}
|
||||
}
|
||||
// simulate crash during compilation
|
||||
assert(task->compile_id() != CICrashAt, "just as planned");
|
||||
@ -2068,7 +2076,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||
compilable = ciEnv::MethodCompilable_not_at_tier;
|
||||
}
|
||||
}
|
||||
post_compile(thread, task, task->code() != NULL, NULL);
|
||||
post_compile(thread, task, task->code() != NULL, NULL, compilable, failure_reason);
|
||||
if (event.should_commit()) {
|
||||
post_compilation_event(&event, task);
|
||||
}
|
||||
@ -2128,7 +2136,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||
ci_env.report_failure(failure_reason);
|
||||
}
|
||||
|
||||
post_compile(thread, task, !ci_env.failing(), &ci_env);
|
||||
post_compile(thread, task, !ci_env.failing(), &ci_env, compilable, failure_reason);
|
||||
if (event.should_commit()) {
|
||||
post_compilation_event(&event, task);
|
||||
}
|
||||
|
@ -252,7 +252,8 @@ class CompileBroker: AllStatic {
|
||||
#endif
|
||||
|
||||
static void invoke_compiler_on_method(CompileTask* task);
|
||||
static void post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env);
|
||||
static void post_compile(CompilerThread* thread, CompileTask* task, bool success, ciEnv* ci_env,
|
||||
int compilable, const char* failure_reason);
|
||||
static void set_last_compile(CompilerThread *thread, const methodHandle& method, bool is_osr, int comp_level);
|
||||
static void push_jni_handle_block();
|
||||
static void pop_jni_handle_block();
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "gc/g1/heapRegion.hpp"
|
||||
#include "opto/arraycopynode.hpp"
|
||||
#include "opto/compile.hpp"
|
||||
#include "opto/escape.hpp"
|
||||
#include "opto/graphKit.hpp"
|
||||
#include "opto/idealKit.hpp"
|
||||
#include "opto/macro.hpp"
|
||||
@ -840,3 +841,32 @@ void G1BarrierSetC2::verify_gc_barriers(Compile* compile, CompilePhase phase) co
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bool G1BarrierSetC2::escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const {
|
||||
if (opcode == Op_StoreP) {
|
||||
Node* adr = n->in(MemNode::Address);
|
||||
const Type* adr_type = gvn->type(adr);
|
||||
// Pointer stores in G1 barriers looks like unsafe access.
|
||||
// Ignore such stores to be able scalar replace non-escaping
|
||||
// allocations.
|
||||
if (adr_type->isa_rawptr() && adr->is_AddP()) {
|
||||
Node* base = conn_graph->get_addp_base(adr);
|
||||
if (base->Opcode() == Op_LoadP &&
|
||||
base->in(MemNode::Address)->is_AddP()) {
|
||||
adr = base->in(MemNode::Address);
|
||||
Node* tls = conn_graph->get_addp_base(adr);
|
||||
if (tls->Opcode() == Op_ThreadLocal) {
|
||||
int offs = (int) gvn->find_intptr_t_con(adr->in(AddPNode::Offset), Type::OffsetBot);
|
||||
const int buf_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
|
||||
if (offs == buf_offset) {
|
||||
return true; // G1 pre barrier previous oop value store.
|
||||
}
|
||||
if (offs == in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset())) {
|
||||
return true; // G1 post barrier card address store.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -92,6 +92,8 @@ protected:
|
||||
#ifdef ASSERT
|
||||
virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
|
||||
#endif
|
||||
|
||||
virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const;
|
||||
};
|
||||
|
||||
#endif // SHARE_GC_SHARED_C2_G1BARRIERSETC2_HPP
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "gc/g1/g1RemSet.hpp"
|
||||
#include "gc/g1/g1ThreadLocalData.hpp"
|
||||
#include "gc/g1/heapRegionRemSet.hpp"
|
||||
#include "gc/shared/suspendibleThreadSet.hpp"
|
||||
#include "gc/shared/workgroup.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
@ -146,18 +147,15 @@ uint DirtyCardQueueSet::num_par_ids() {
|
||||
}
|
||||
|
||||
void DirtyCardQueueSet::initialize(Monitor* cbl_mon,
|
||||
Mutex* fl_lock,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
int max_completed_queue,
|
||||
Mutex* lock,
|
||||
DirtyCardQueueSet* fl_owner,
|
||||
bool init_free_ids) {
|
||||
PtrQueueSet::initialize(cbl_mon,
|
||||
fl_lock,
|
||||
allocator,
|
||||
process_completed_threshold,
|
||||
max_completed_queue,
|
||||
fl_owner);
|
||||
set_buffer_size(G1UpdateBufferSize);
|
||||
max_completed_queue);
|
||||
_shared_dirty_card_queue.set_lock(lock);
|
||||
if (init_free_ids) {
|
||||
_free_ids = new FreeIdSet(num_par_ids(), _cbl_mon);
|
||||
|
@ -118,11 +118,10 @@ public:
|
||||
DirtyCardQueueSet(bool notify_when_complete = true);
|
||||
|
||||
void initialize(Monitor* cbl_mon,
|
||||
Mutex* fl_lock,
|
||||
BufferNode::Allocator* allocator,
|
||||
int process_completed_threshold,
|
||||
int max_completed_queue,
|
||||
Mutex* lock,
|
||||
DirtyCardQueueSet* fl_owner,
|
||||
bool init_free_ids = false);
|
||||
|
||||
// The number of parallel ids that can be claimed to allow collector or
|
||||
|
@ -262,8 +262,9 @@ public:
|
||||
// Create the _archive_region_map which is used to identify archive objects.
|
||||
static inline void enable_archive_object_check();
|
||||
|
||||
// Set the regions containing the specified address range as archive/non-archive.
|
||||
// Mark regions containing the specified address range as archive/non-archive.
|
||||
static inline void set_range_archive(MemRegion range, bool open);
|
||||
static inline void clear_range_archive(MemRegion range, bool open);
|
||||
|
||||
// Check if the object is in closed archive
|
||||
static inline bool is_closed_archive_object(oop object);
|
||||
|
@ -109,6 +109,10 @@ inline void G1ArchiveAllocator::enable_archive_object_check() {
|
||||
// Set the regions containing the specified address range as archive.
|
||||
inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
|
||||
assert(_archive_check_enabled, "archive range check not enabled");
|
||||
log_info(gc, cds)("Mark %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
|
||||
open ? "open" : "closed",
|
||||
p2i(range.start()),
|
||||
p2i(range.last()));
|
||||
if (open) {
|
||||
_open_archive_region_map.set_by_address(range, true);
|
||||
} else {
|
||||
@ -116,6 +120,20 @@ inline void G1ArchiveAllocator::set_range_archive(MemRegion range, bool open) {
|
||||
}
|
||||
}
|
||||
|
||||
// Clear the archive regions map containing the specified address range.
|
||||
inline void G1ArchiveAllocator::clear_range_archive(MemRegion range, bool open) {
|
||||
assert(_archive_check_enabled, "archive range check not enabled");
|
||||
log_info(gc, cds)("Clear %s archive regions in map: [" PTR_FORMAT ", " PTR_FORMAT "]",
|
||||
open ? "open" : "closed",
|
||||
p2i(range.start()),
|
||||
p2i(range.last()));
|
||||
if (open) {
|
||||
_open_archive_region_map.set_by_address(range, false);
|
||||
} else {
|
||||
_closed_archive_region_map.set_by_address(range, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Check if an object is in a closed archive region using the _archive_region_map.
|
||||
inline bool G1ArchiveAllocator::in_closed_archive_range(oop object) {
|
||||
// This is the out-of-line part of is_closed_archive_object test, done separately
|
||||
|
@ -55,6 +55,8 @@ G1BarrierSet::G1BarrierSet(G1CardTable* card_table) :
|
||||
make_barrier_set_c2<G1BarrierSetC2>(),
|
||||
card_table,
|
||||
BarrierSet::FakeRtti(BarrierSet::G1BarrierSet)),
|
||||
_satb_mark_queue_buffer_allocator(G1SATBBufferSize, SATB_Q_FL_lock),
|
||||
_dirty_card_queue_buffer_allocator(G1UpdateBufferSize, DirtyCardQ_FL_lock),
|
||||
_satb_mark_queue_set(),
|
||||
_dirty_card_queue_set()
|
||||
{}
|
||||
@ -202,3 +204,11 @@ void G1BarrierSet::on_thread_detach(JavaThread* thread) {
|
||||
G1ThreadLocalData::satb_mark_queue(thread).flush();
|
||||
G1ThreadLocalData::dirty_card_queue(thread).flush();
|
||||
}
|
||||
|
||||
BufferNode::Allocator& G1BarrierSet::satb_mark_queue_buffer_allocator() {
|
||||
return _satb_mark_queue_buffer_allocator;
|
||||
}
|
||||
|
||||
BufferNode::Allocator& G1BarrierSet::dirty_card_queue_buffer_allocator() {
|
||||
return _dirty_card_queue_buffer_allocator;
|
||||
}
|
||||
|
@ -39,6 +39,8 @@ class G1CardTable;
|
||||
class G1BarrierSet: public CardTableBarrierSet {
|
||||
friend class VMStructs;
|
||||
private:
|
||||
BufferNode::Allocator _satb_mark_queue_buffer_allocator;
|
||||
BufferNode::Allocator _dirty_card_queue_buffer_allocator;
|
||||
G1SATBMarkQueueSet _satb_mark_queue_set;
|
||||
DirtyCardQueueSet _dirty_card_queue_set;
|
||||
|
||||
@ -79,6 +81,9 @@ class G1BarrierSet: public CardTableBarrierSet {
|
||||
virtual void on_thread_attach(JavaThread* thread);
|
||||
virtual void on_thread_detach(JavaThread* thread);
|
||||
|
||||
BufferNode::Allocator& satb_mark_queue_buffer_allocator();
|
||||
BufferNode::Allocator& dirty_card_queue_buffer_allocator();
|
||||
|
||||
static G1SATBMarkQueueSet& satb_mark_queue_set() {
|
||||
return g1_barrier_set()->_satb_mark_queue_set;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -76,7 +76,9 @@ G1CodeRootSetTable::~G1CodeRootSetTable() {
|
||||
}
|
||||
}
|
||||
assert(number_of_entries() == 0, "should have removed all entries");
|
||||
free_buckets();
|
||||
// Each of the entries in new_entry_free_list() have been allocated in
|
||||
// G1CodeRootSetTable::new_entry(). We never call the block allocator
|
||||
// in BasicHashtable::new_entry().
|
||||
for (BasicHashtableEntry<mtGC>* e = new_entry_free_list(); e != NULL; e = new_entry_free_list()) {
|
||||
FREE_C_HEAP_ARRAY(char, e);
|
||||
}
|
||||
|
@ -753,7 +753,7 @@ inline HeapWord* G1CollectedHeap::attempt_allocation(size_t min_word_size,
|
||||
return result;
|
||||
}
|
||||
|
||||
void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count) {
|
||||
void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count, bool is_open) {
|
||||
assert(!is_init_completed(), "Expect to be called at JVM init time");
|
||||
assert(ranges != NULL, "MemRegion array NULL");
|
||||
assert(count != 0, "No MemRegions provided");
|
||||
@ -815,7 +815,7 @@ void G1CollectedHeap::dealloc_archive_regions(MemRegion* ranges, size_t count) {
|
||||
}
|
||||
|
||||
// Notify mark-sweep that this is no longer an archive range.
|
||||
G1ArchiveAllocator::set_range_archive(ranges[i], false);
|
||||
G1ArchiveAllocator::clear_range_archive(ranges[i], is_open);
|
||||
}
|
||||
|
||||
if (uncommitted_regions != 0) {
|
||||
@ -1653,6 +1653,28 @@ jint G1CollectedHeap::initialize() {
|
||||
BarrierSet::set_barrier_set(bs);
|
||||
_card_table = ct;
|
||||
|
||||
G1BarrierSet::satb_mark_queue_set().initialize(this,
|
||||
SATB_Q_CBL_mon,
|
||||
&bs->satb_mark_queue_buffer_allocator(),
|
||||
G1SATBProcessCompletedThreshold,
|
||||
G1SATBBufferEnqueueingThresholdPercent,
|
||||
Shared_SATB_Q_lock);
|
||||
|
||||
// process_completed_threshold and max_completed_queue are updated
|
||||
// later, based on the concurrent refinement object.
|
||||
G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
||||
&bs->dirty_card_queue_buffer_allocator(),
|
||||
-1, // temp. never trigger
|
||||
-1, // temp. no limit
|
||||
Shared_DirtyCardQ_lock,
|
||||
true); // init_free_ids
|
||||
|
||||
dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
||||
&bs->dirty_card_queue_buffer_allocator(),
|
||||
-1, // never trigger processing
|
||||
-1, // no limit on length
|
||||
Shared_DirtyCardQ_lock);
|
||||
|
||||
// Create the hot card cache.
|
||||
_hot_card_cache = new G1HotCardCache(this);
|
||||
|
||||
@ -1749,13 +1771,6 @@ jint G1CollectedHeap::initialize() {
|
||||
// Perform any initialization actions delegated to the policy.
|
||||
g1_policy()->init(this, &_collection_set);
|
||||
|
||||
G1BarrierSet::satb_mark_queue_set().initialize(this,
|
||||
SATB_Q_CBL_mon,
|
||||
SATB_Q_FL_lock,
|
||||
G1SATBProcessCompletedThreshold,
|
||||
G1SATBBufferEnqueueingThresholdPercent,
|
||||
Shared_SATB_Q_lock);
|
||||
|
||||
jint ecode = initialize_concurrent_refinement();
|
||||
if (ecode != JNI_OK) {
|
||||
return ecode;
|
||||
@ -1766,20 +1781,11 @@ jint G1CollectedHeap::initialize() {
|
||||
return ecode;
|
||||
}
|
||||
|
||||
G1BarrierSet::dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
||||
DirtyCardQ_FL_lock,
|
||||
(int)concurrent_refine()->yellow_zone(),
|
||||
(int)concurrent_refine()->red_zone(),
|
||||
Shared_DirtyCardQ_lock,
|
||||
NULL, // fl_owner
|
||||
true); // init_free_ids
|
||||
|
||||
dirty_card_queue_set().initialize(DirtyCardQ_CBL_mon,
|
||||
DirtyCardQ_FL_lock,
|
||||
-1, // never trigger processing
|
||||
-1, // no limit on length
|
||||
Shared_DirtyCardQ_lock,
|
||||
&G1BarrierSet::dirty_card_queue_set());
|
||||
{
|
||||
DirtyCardQueueSet& dcqs = G1BarrierSet::dirty_card_queue_set();
|
||||
dcqs.set_process_completed_threshold((int)concurrent_refine()->yellow_zone());
|
||||
dcqs.set_max_completed_queue((int)concurrent_refine()->red_zone());
|
||||
}
|
||||
|
||||
// Here we allocate the dummy HeapRegion that is required by the
|
||||
// G1AllocRegion class.
|
||||
|
@ -683,7 +683,7 @@ public:
|
||||
// which had been allocated by alloc_archive_regions. This should be called
|
||||
// rather than fill_archive_regions at JVM init time if the archive file
|
||||
// mapping failed, with the same non-overlapping and sorted MemRegion array.
|
||||
void dealloc_archive_regions(MemRegion* range, size_t count);
|
||||
void dealloc_archive_regions(MemRegion* range, size_t count, bool is_open);
|
||||
|
||||
oop materialize_archived_object(oop obj);
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user